#pragma comment(lib, "Vfw32.lib")
#include <Windows.h>
#include <time.h>
#include <stdio.h>
#include <vfw.h> 



int main(int args,char** arg)
{
	//Variablen
	char* datei;
	int fehler=0,vidfps,sltime=1000;
	int screenw,screenh,screenx,screeny;
	HDC sourcedc,destdc;
	HBITMAP hbmp;
	clock_t timer;

	AVIFileInit();

	//Parameter
	/*if (args<=6) return -1;
	datei=arg[1];
	screenx=(int)arg[2];
	screeny=(int)arg[3];
	screenw=(int)arg[4];
	screenh=(int)arg[5];
	vidfps=(int)arg[6];*/
	datei="D:\\Downloads\\avi.avi";
	screenx=0;
	screeny=0;
	screenw=1024;
	screenh=768;
	vidfps=25;


	//Vorbereiten
	sltime/=vidfps;
	sourcedc=GetDC(0);
	destdc=CreateCompatibleDC(sourcedc);
	hbmp=CreateCompatibleBitmap(sourcedc,screenw,screenh);
	SelectObject(destdc,hbmp);


	PAVIFILE pfile;
	AVIFileOpen(&pfile,datei,OF_CREATE | OF_WRITE,0);
	AVISTREAMINFO asi={streamtypeVIDEO,mmioFOURCC('M','P','G','4'),0,0,0,0,1,vidfps,0,0,0,0,-1,0,{screenx,screeny,screenx+screenw,screeny+screenh},0,0,"Video #1"};

	int stride=(((screenw*24+31)&~31)/8);
	int sizeimage=stride*screenh;
	BITMAPINFOHEADER bi={sizeof(BITMAPINFOHEADER),screenw,screenh,1,24,BI_RGB,sizeimage ,0,0,0,0};

	PAVISTREAM pstreamUC;
	AVIFileCreateStream(pfile,&pstreamUC,&asi);
	PAVISTREAM pstream;

	LPBITMAPINFOHEADER lpbi=&bi;
	HIC hic;
	ICINFO icinfo;
	int fccType = ICTYPE_VIDEO;
	for (int i=0; ICInfo(fccType, i ,&icinfo); i++)
	{
		hic=ICOpen(icinfo.fccType, icinfo.fccHandler, ICMODE_QUERY);
		if (hic)
		{
			ICGetInfo(hic, &icinfo, sizeof(icinfo));
			if (fccType==ICTYPE_VIDEO && lpbi!=NULL && ICCompressQuery(hic,lpbi,NULL)!=ICERR_OK)
			{
				ICClose(hic);
				continue;
			}
			else
			{
				if (MessageBox(NULL,"Benutzen?","",MB_YESNO)==IDYES) break;
				ICClose(hic);
				continue;
			}
			//check if it is the driver you want
			//if not ICClose(hic);
		}
	}
	if (ICQueryConfigure(hic)) ICConfigure(hic,NULL);
	//icinfo.fccHandler=mmioFOURCC('M', 'P', 'G', '4');


	AVICOMPRESSOPTIONS Coptions={asi.fccType,asi.fccHandler,0,asi.dwQuality,0,0,(LPVOID)&bi,bi.biSize,&icinfo,icinfo.dwSize/*sizeof(icinfo)*/,0}; 
	HRESULT r=AVIMakeCompressedStream(&pstream,pstreamUC,&Coptions,NULL);
	switch (r)
	{
	case AVIERR_OK:
		MessageBox(NULL,"AVIERR_OK","",MB_OK);
		break;
	case AVIERR_NOCOMPRESSOR:
		MessageBox(NULL,"AVIERR_NOCOMPRESSOR","",MB_OK);
		exit(0);
		break;
	case AVIERR_MEMORY:
		MessageBox(NULL,"AVIERR_MEMORY","",MB_OK);
		break;
	case AVIERR_UNSUPPORTED:
		MessageBox(NULL,"AVIERR_UNSUPPORTED","",MB_OK);
		break;
	default:
		MessageBox(NULL,"Other","",MB_OK);
		break;
	}

	AVIStreamSetFormat(pstream,0,(LPVOID)&bi,bi.biSize);

	long frames=0;

	//Schleife
	bool loop=true;
	int check,wtime;
	char buffer[2];
	BYTE *bits=new BYTE[sizeimage];
	timer=clock();
	while (loop)
	{
		//Bild gleich wie vorher?
		//check=BitBlt(destdc,screenx,screeny,screenw,screenh,sourcedc,0,0,SRCINVERT);
		//if (check==0) fehler=GetLastError();
		//
		//Bild kopieren
		check=BitBlt(destdc,screenx,screeny,screenw,screenh,sourcedc,0,0,SRCCOPY|CAPTUREBLT);
		if (check==0) fehler=GetLastError();
		//In Video speichern
		GetDIBits(destdc,hbmp,0,abs(bi.biHeight),bits,(LPBITMAPINFO)&bi,0);
		AVIStreamWrite(pstream,frames,1,bits,sizeimage,0x00000010,NULL,NULL);
		frames+=1;
		//Warten zum FPS regulieren
		wtime=sltime-(timer-clock());
		Sleep(wtime);
		timer=clock();
		//Prüfen ob ein Ende im StdIn steht
		fgets(buffer,1,stdin);
		if (buffer[0]=='E') loop=false;
	}
	//Bereinigen und beenden
	delete bits;
	ICClose(hic);
	AVIStreamRelease(pstream);
	AVIStreamRelease(pstreamUC);
	AVIFileRelease(pfile);
	AVIFileExit();

	ReleaseDC(0,sourcedc);
	DeleteDC(destdc);
	DeleteObject(hbmp);
	return fehler;
}
