diff options
Diffstat (limited to 'complus/example.c')
| -rw-r--r-- | complus/example.c | 598 | 
1 files changed, 598 insertions, 0 deletions
| diff --git a/complus/example.c b/complus/example.c new file mode 100644 index 00000000..a7d838d5 --- /dev/null +++ b/complus/example.c @@ -0,0 +1,598 @@ +/*				    + * Copyright 1999 Marcus Meissner + */ +#include <string.h> +#include <stdio.h> +#include <assert.h> + +#include "winbase.h" +#include "winnls.h" +#include "mmsystem.h" +#include "winerror.h" +#include "debugtools.h" + +#include "initguid.h" +#include "vfw.h" + +DEFAULT_DEBUG_CHANNEL(avifile); + +static HRESULT WINAPI IAVIFile_fnQueryInterface(IAVIFile* iface,REFIID refiid,LPVOID *obj); +static ULONG WINAPI IAVIFile_fnAddRef(IAVIFile* iface); +static ULONG WINAPI IAVIFile_fnRelease(IAVIFile* iface); +static HRESULT WINAPI IAVIFile_fnInfo(IAVIFile*iface,AVIFILEINFOW*afi,LONG size); +static HRESULT WINAPI IAVIFile_fnGetStream(IAVIFile*iface,PAVISTREAM*avis,DWORD fccType,LONG lParam); +static HRESULT WINAPI IAVIFile_fnCreateStream(IAVIFile*iface,PAVISTREAM*avis,AVISTREAMINFOW*asi); +static HRESULT WINAPI IAVIFile_fnWriteData(IAVIFile*iface,DWORD ckid,LPVOID lpData,LONG size); +static HRESULT WINAPI IAVIFile_fnReadData(IAVIFile*iface,DWORD ckid,LPVOID lpData,LONG *size); +static HRESULT WINAPI IAVIFile_fnEndRecord(IAVIFile*iface); +static HRESULT WINAPI IAVIFile_fnDeleteStream(IAVIFile*iface,DWORD fccType,LONG lParam); + +struct ICOM_VTABLE(IAVIFile) iavift = { +    ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE +    IAVIFile_fnQueryInterface, +    IAVIFile_fnAddRef, +    IAVIFile_fnRelease, +    IAVIFile_fnInfo, +    IAVIFile_fnGetStream, +    IAVIFile_fnCreateStream, +    IAVIFile_fnWriteData, +    IAVIFile_fnReadData, +    IAVIFile_fnEndRecord, +    IAVIFile_fnDeleteStream +}; + +static HRESULT WINAPI IAVIStream_fnQueryInterface(IAVIStream*iface,REFIID refiid,LPVOID *obj); +static ULONG WINAPI IAVIStream_fnAddRef(IAVIStream*iface); +static ULONG WINAPI IAVIStream_fnRelease(IAVIStream* iface); +static HRESULT WINAPI IAVIStream_fnCreate(IAVIStream*iface,LPARAM lParam1,LPARAM lParam2); +static HRESULT WINAPI IAVIStream_fnInfo(IAVIStream*iface,AVISTREAMINFOW *psi,LONG size); +static LONG WINAPI IAVIStream_fnFindSample(IAVIStream*iface,LONG pos,LONG flags); +static HRESULT WINAPI IAVIStream_fnReadFormat(IAVIStream*iface,LONG pos,LPVOID format,LONG *formatsize); +static HRESULT WINAPI IAVIStream_fnSetFormat(IAVIStream*iface,LONG pos,LPVOID format,LONG formatsize); +static HRESULT WINAPI IAVIStream_fnRead(IAVIStream*iface,LONG start,LONG samples,LPVOID buffer,LONG buffersize,LONG *bytesread,LONG *samplesread); +static HRESULT WINAPI IAVIStream_fnWrite(IAVIStream*iface,LONG start,LONG samples,LPVOID buffer,LONG buffersize,DWORD flags,LONG *sampwritten,LONG *byteswritten); +static HRESULT WINAPI IAVIStream_fnDelete(IAVIStream*iface,LONG start,LONG samples); +static HRESULT WINAPI IAVIStream_fnReadData(IAVIStream*iface,DWORD fcc,LPVOID lp,LONG *lpread); +static HRESULT WINAPI IAVIStream_fnWriteData(IAVIStream*iface,DWORD fcc,LPVOID lp,LONG size); +static HRESULT WINAPI IAVIStream_fnSetInfo(IAVIStream*iface,AVISTREAMINFOW*info,LONG infolen); + +struct ICOM_VTABLE(IAVIStream) iavist = { +    ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE +    IAVIStream_fnQueryInterface, +    IAVIStream_fnAddRef, +    IAVIStream_fnRelease, +    IAVIStream_fnCreate, +    IAVIStream_fnInfo, +    IAVIStream_fnFindSample, +    IAVIStream_fnReadFormat, +    IAVIStream_fnSetFormat, +    IAVIStream_fnRead, +    IAVIStream_fnWrite, +    IAVIStream_fnDelete, +    IAVIStream_fnReadData, +    IAVIStream_fnWriteData, +    IAVIStream_fnSetInfo +}; + +typedef struct IAVIStreamImpl { +	/* IUnknown stuff */ +	ICOM_VFIELD(IAVIStream); +	DWORD		ref; +	/* IAVIStream stuff */ +	LPVOID		lpInputFormat; +	DWORD		inputformatsize; +	BOOL		iscompressing; +	DWORD		curframe; + +	    /* Compressor stuff */ +	    HIC	hic; +	    LPVOID	lpCompressFormat; +	    ICINFO	icinfo; +	    DWORD	compbufsize; +	    LPVOID	compbuffer; + +	    DWORD	decompbufsize; +	    LPVOID	decompbuffer; +	    LPVOID	decompformat; +	    AVICOMPRESSOPTIONS	aco; + +	    LPVOID	lpPrev;	/* pointer to decompressed frame later */ +	    LPVOID	lpPrevFormat; /* pointer to decompressed info later */ +} IAVIStreamImpl; + +/*********************************************************************** + *		AVIFileInit + */ +void WINAPI +AVIFileInit(void) { +	FIXME("(),stub!\n"); +} + +typedef struct IAVIFileImpl { +	/* IUnknown stuff */ +	ICOM_VFIELD(IAVIFile); +	DWORD				ref; +	/* IAVIFile stuff... */ +} IAVIFileImpl; + +static HRESULT WINAPI IAVIFile_fnQueryInterface(IAVIFile* iface,REFIID refiid,LPVOID *obj) { +	ICOM_THIS(IAVIFileImpl,iface); + +	TRACE("(%p)->QueryInterface(%s,%p)\n",This,debugstr_guid(refiid),obj); +	if (	!memcmp(&IID_IUnknown,refiid,sizeof(IID_IUnknown)) || +		!memcmp(&IID_IAVIFile,refiid,sizeof(IID_IAVIFile)) +	) { +		*obj = iface; +		return S_OK; +	} +	return OLE_E_ENUM_NOMORE; +} + +static ULONG WINAPI IAVIFile_fnAddRef(IAVIFile* iface) { +	ICOM_THIS(IAVIFileImpl,iface); +	 +	FIXME("(%p)->AddRef()\n",iface); +	return ++(This->ref); +} + +static ULONG WINAPI IAVIFile_fnRelease(IAVIFile* iface) { +	ICOM_THIS(IAVIFileImpl,iface); +	 +	FIXME("(%p)->Release()\n",iface); +	if (!--(This->ref)) { +		HeapFree(GetProcessHeap(),0,iface); +		return 0; +	} +	return This->ref; +} + +static HRESULT WINAPI IAVIFile_fnInfo(IAVIFile*iface,AVIFILEINFOW*afi,LONG size) { +	FIXME("(%p)->Info(%p,%ld)\n",iface,afi,size); + +	/* FIXME: fill out struct? */ +	return E_FAIL; +} + +static HRESULT WINAPI IAVIFile_fnGetStream(IAVIFile*iface,PAVISTREAM*avis,DWORD fccType,LONG lParam) { +	FIXME("(%p)->GetStream(%p,0x%08lx,%ld)\n",iface,avis,fccType,lParam); +	/* FIXME: create interface etc. */ +	return E_FAIL; +} + +static HRESULT WINAPI IAVIFile_fnCreateStream(IAVIFile*iface,PAVISTREAM*avis,AVISTREAMINFOW*asi) { +	ICOM_THIS(IAVIStreamImpl,iface); +	char		fcc[5]; +	IAVIStreamImpl	*istream; + +	FIXME("(%p,%p,%p)\n",This,avis,asi); +	istream = (IAVIStreamImpl*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IAVIStreamImpl)); +	istream->ref = 1; +	ICOM_VTBL(istream) = &iavist; +	fcc[4]='\0'; +	memcpy(fcc,(char*)&(asi->fccType),4); +	FIXME("\tfccType '%s'\n",fcc); +	memcpy(fcc,(char*)&(asi->fccHandler),4); +	FIXME("\tfccHandler '%s'\n",fcc); +	FIXME("\tdwFlags 0x%08lx\n",asi->dwFlags); +	FIXME("\tdwCaps 0x%08lx\n",asi->dwCaps); +	FIXME("\tname '%s'\n",debugstr_w(asi->szName)); + +	istream->curframe = 0; +	*avis = (PAVISTREAM)istream; +	return S_OK; +} + +static HRESULT WINAPI IAVIFile_fnWriteData(IAVIFile*iface,DWORD ckid,LPVOID lpData,LONG size) { +	FIXME("(%p)->WriteData(0x%08lx,%p,%ld)\n",iface,ckid,lpData,size); +	/* FIXME: write data to file */ +	return E_FAIL; +} + +static HRESULT WINAPI IAVIFile_fnReadData(IAVIFile*iface,DWORD ckid,LPVOID lpData,LONG *size) { +	FIXME("(%p)->ReadData(0x%08lx,%p,%p)\n",iface,ckid,lpData,size); +	/* FIXME: read at most size bytes from file */ +	return E_FAIL; +} + +static HRESULT WINAPI IAVIFile_fnEndRecord(IAVIFile*iface) { +	FIXME("(%p)->EndRecord()\n",iface); +	/* FIXME: end record? */ +	return E_FAIL; +} + +static HRESULT WINAPI IAVIFile_fnDeleteStream(IAVIFile*iface,DWORD fccType,LONG lParam) { +	FIXME("(%p)->DeleteStream(0x%08lx,%ld)\n",iface,fccType,lParam); +	/* FIXME: delete stream? */ +	return E_FAIL; +} + +/*********************************************************************** + *		AVIFileOpenA + */ +HRESULT WINAPI AVIFileOpenA( +	PAVIFILE * ppfile,LPCSTR szFile,UINT uMode,LPCLSID lpHandler +) { +	IAVIFileImpl	*iavi; + +	FIXME("(%p,%s,0x%08lx,%s),stub!\n",ppfile,szFile,(DWORD)uMode,debugstr_guid(lpHandler)); +	iavi = (IAVIFileImpl*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IAVIFileImpl)); +	iavi->ref = 1; +	ICOM_VTBL(iavi) = &iavift; +	*ppfile = (LPVOID)iavi; +	return S_OK; +} + +static HRESULT WINAPI IAVIStream_fnQueryInterface(IAVIStream*iface,REFIID refiid,LPVOID *obj) { +	ICOM_THIS(IAVIStreamImpl,iface); + +	TRACE("(%p)->QueryInterface(%s,%p)\n",This,debugstr_guid(refiid),obj); +	if (	!memcmp(&IID_IUnknown,refiid,sizeof(IID_IUnknown)) || +		!memcmp(&IID_IAVIStream,refiid,sizeof(IID_IAVIStream)) +	) { +		*obj = This; +		return S_OK; +	} +	/* can return IGetFrame interface too */ +	return OLE_E_ENUM_NOMORE; +} + +static ULONG WINAPI IAVIStream_fnAddRef(IAVIStream*iface) { +	ICOM_THIS(IAVIStreamImpl,iface); +	 +	FIXME("(%p)->AddRef()\n",iface); +	return ++(This->ref); +} + +static ULONG WINAPI IAVIStream_fnRelease(IAVIStream* iface) { +	ICOM_THIS(IAVIStreamImpl,iface); +	 +	FIXME("(%p)->Release()\n",iface); +	if (!--(This->ref)) { +		HeapFree(GetProcessHeap(),0,This); +		return 0; +	} +	return This->ref; +} + +static HRESULT WINAPI IAVIStream_fnCreate(IAVIStream*iface,LPARAM lParam1,LPARAM lParam2) { +	FIXME("(%p)->Create(0x%08lx,0x%08lx)\n",iface,lParam1,lParam2); +	return E_FAIL; +} + +static HRESULT WINAPI IAVIStream_fnInfo(IAVIStream*iface,AVISTREAMINFOW *psi,LONG size) { +	FIXME("(%p)->Info(%p,%ld)\n",iface,psi,size); +	return E_FAIL; +} + +static LONG WINAPI IAVIStream_fnFindSample(IAVIStream*iface,LONG pos,LONG flags) { +	FIXME("(%p)->FindSample(%ld,0x%08lx)\n",iface,pos,flags); +	return E_FAIL; +} + +static HRESULT WINAPI IAVIStream_fnReadFormat(IAVIStream*iface,LONG pos,LPVOID format,LONG *formatsize) { +	FIXME("(%p)->ReadFormat(%ld,%p,%p)\n",iface,pos,format,formatsize); +	return E_FAIL; +} + +/*********************************************************************** + *		IAVIStream::SetFormat + */ +static HRESULT WINAPI IAVIStream_fnSetFormat(IAVIStream*iface,LONG pos,LPVOID format,LONG formatsize) { +	IAVIStreamImpl	*as = (IAVIStreamImpl*)iface; + +	FIXME("(%p)->SetFormat(%ld,%p,%ld)\n",iface,pos,format,formatsize); +	if (as->lpInputFormat) HeapFree(GetProcessHeap(),0,as->lpInputFormat); +	as->inputformatsize = formatsize; +	as->lpInputFormat = HeapAlloc(GetProcessHeap(),0,formatsize); +	memcpy(as->lpInputFormat,format,formatsize); +	if (as->iscompressing) { +		int	xsize;  +		/* Set up the Compressor part */ +		xsize = ICCompressGetFormatSize(as->hic,as->lpInputFormat); +		as->lpCompressFormat = HeapAlloc(GetProcessHeap(),0,xsize); +		ICCompressGetFormat(as->hic,as->lpInputFormat,as->lpCompressFormat); +		ICCompressBegin(as->hic,as->lpInputFormat,as->lpCompressFormat); +		as->compbufsize = ICCompressGetSize(as->hic,as->lpInputFormat,as->lpCompressFormat); +		as->compbuffer = HeapAlloc(GetProcessHeap(),0,as->compbufsize); + +		/* Set up the Decompressor part (for prev frames?) */ +		xsize=ICDecompressGetFormatSize(as->hic,as->lpCompressFormat); +		as->decompformat = HeapAlloc(GetProcessHeap(),0,xsize); +		ICDecompressGetFormat(as->hic,as->lpCompressFormat,as->decompformat); +		as->decompbufsize=((LPBITMAPINFOHEADER)as->decompbuffer)->biSizeImage; +		as->decompbuffer = HeapReAlloc(GetProcessHeap(),0,as->decompbuffer,as->decompbufsize); +		memset(as->decompbuffer,0xff,as->decompbufsize); +		assert(HeapValidate(GetProcessHeap(),0,NULL)); + +		ICDecompressGetFormat(as->hic,as->lpCompressFormat,as->decompformat); +		ICDecompressBegin(as->hic,as->lpCompressFormat,as->decompformat); +		as->lpPrev = as->lpPrevFormat = NULL; +	} +	return S_OK; +} + +static HRESULT WINAPI IAVIStream_fnRead(IAVIStream*iface,LONG start,LONG samples,LPVOID buffer,LONG buffersize,LONG *bytesread,LONG *samplesread) { +	FIXME("(%p)->Read(%ld,%ld,%p,%ld,%p,%p)\n",iface,start,samples,buffer,buffersize,bytesread,samplesread); +	return E_FAIL; +} + +static HRESULT WINAPI IAVIStream_fnWrite(IAVIStream*iface,LONG start,LONG samples,LPVOID buffer,LONG buffersize,DWORD flags,LONG *sampwritten,LONG *byteswritten) { +	IAVIStreamImpl	*as = (IAVIStreamImpl*)iface; +	DWORD		ckid,xflags; + +	FIXME("(%p)->Write(%ld,%ld,%p,%ld,0x%08lx,%p,%p)\n",iface,start,samples,buffer,buffersize,flags,sampwritten,byteswritten); + +	ICCompress( +		as->hic,flags, +		as->lpCompressFormat, +		as->compbuffer, +		as->lpInputFormat,buffer, +		&ckid,&xflags, +		as->curframe,0xffffff/*framesize*/,as->aco.dwQuality, +		as->lpPrevFormat,as->lpPrev +	); +	ICDecompress( +		as->hic, +		flags,	/* FIXME: check */ +		as->lpCompressFormat, +		as->compbuffer, +		as->decompformat, +		as->decompbuffer +	); +	/* We now have a prev format for the next compress ... */ +	as->lpPrevFormat = as->decompformat; +	as->lpPrev = as->decompbuffer; +	return S_OK; +} + +static HRESULT WINAPI IAVIStream_fnDelete(IAVIStream*iface,LONG start,LONG samples) { +	FIXME("(%p)->Delete(%ld,%ld)\n",iface,start,samples); +	return E_FAIL; +} +static HRESULT WINAPI IAVIStream_fnReadData(IAVIStream*iface,DWORD fcc,LPVOID lp,LONG *lpread) { +	FIXME("(%p)->ReadData(0x%08lx,%p,%p)\n",iface,fcc,lp,lpread); +	return E_FAIL; +} + +static HRESULT WINAPI IAVIStream_fnWriteData(IAVIStream*iface,DWORD fcc,LPVOID lp,LONG size) { +	FIXME("(%p)->WriteData(0x%08lx,%p,%ld)\n",iface,fcc,lp,size); +	return E_FAIL; +} + +static HRESULT WINAPI IAVIStream_fnSetInfo(IAVIStream*iface,AVISTREAMINFOW*info,LONG infolen) { +	FIXME("(%p)->SetInfo(%p,%ld)\n",iface,info,infolen); +	return E_FAIL; +} + +/*********************************************************************** + *		AVIFileCreateStreamA + */ +HRESULT WINAPI AVIFileCreateStreamA(PAVIFILE iface,PAVISTREAM *ppavi,AVISTREAMINFOA * psi) { +	AVISTREAMINFOW	psiw; +	 +	/* Only the szName at the end is different */ +	memcpy(&psiw,psi,sizeof(*psi)-sizeof(psi->szName)); +        MultiByteToWideChar( CP_ACP, 0, psi->szName, -1, +                             psiw.szName, sizeof(psiw.szName) / sizeof(WCHAR) ); +	return IAVIFile_CreateStream(iface,ppavi,&psiw); +} + +/*********************************************************************** + *		AVIFileCreateStreamW + */ +HRESULT WINAPI AVIFileCreateStreamW(IAVIFile*iface,PAVISTREAM*avis,AVISTREAMINFOW*asi) { +	return IAVIFile_CreateStream(iface,avis,asi); +} + + +/*********************************************************************** + *		AVIFileGetStream + */ +HRESULT WINAPI AVIFileGetStream(IAVIFile*iface,PAVISTREAM*avis,DWORD fccType,LONG lParam) { +	return IAVIFile_GetStream(iface,avis,fccType,lParam); +} + +/*********************************************************************** + *		AVIFileInfoA + */ +HRESULT WINAPI AVIFileInfoA(PAVIFILE iface,LPAVIFILEINFOA afi,LONG size) { +	AVIFILEINFOW	afiw; +	HRESULT		hres; + +	if (size < sizeof(AVIFILEINFOA)) +		return AVIERR_BADSIZE; +	hres = IAVIFile_Info(iface,&afiw,sizeof(afiw)); +	memcpy(afi,&afiw,sizeof(*afi)-sizeof(afi->szFileType)); +        WideCharToMultiByte( CP_ACP, 0, afiw.szFileType, -1, +                             afi->szFileType, sizeof(afi->szFileType), NULL, NULL ); +        afi->szFileType[sizeof(afi->szFileType)-1] = 0; +	return hres; +} + +/*********************************************************************** + *		AVIStreamInfoW + */ +HRESULT WINAPI AVIStreamInfoW(PAVISTREAM iface,AVISTREAMINFOW *asi,LONG + size) { + 	return IAVIFile_Info(iface,asi,size); +} + +/*********************************************************************** + *		AVIStreamInfoA + */ +HRESULT WINAPI AVIStreamInfoA(PAVISTREAM iface,AVISTREAMINFOA *asi,LONG + size) { + 	AVISTREAMINFOW	asiw; +	HRESULT			hres; + +	if (size<sizeof(AVISTREAMINFOA)) +		return AVIERR_BADSIZE; + 	hres = IAVIFile_Info(iface,&asiw,sizeof(asiw)); +	memcpy(asi,&asiw,sizeof(asiw)-sizeof(asiw.szName)); +        WideCharToMultiByte( CP_ACP, 0, asiw.szName, -1, +                             asi->szName, sizeof(asi->szName), NULL, NULL ); +        asi->szName[sizeof(asi->szName)-1] = 0; +	return hres; +} + +/*********************************************************************** + *		AVIFileInfoW + */ +HRESULT WINAPI AVIFileInfoW(PAVIFILE iface,LPAVIFILEINFOW afi,LONG size) { +	return IAVIFile_Info(iface,afi,size); +} + +/*********************************************************************** + *		AVIMakeCompressedStream + */ +HRESULT WINAPI AVIMakeCompressedStream(PAVISTREAM *ppsCompressed,PAVISTREAM ppsSource,AVICOMPRESSOPTIONS *aco,CLSID *pclsidHandler) { +	char			fcc[5]; +	IAVIStreamImpl	*as; +	FIXME("(%p,%p,%p,%p)\n",ppsCompressed,ppsSource,aco,pclsidHandler); +	fcc[4]='\0'; +	memcpy(fcc,&(aco->fccType),4); +	FIXME("\tfccType: '%s'\n",fcc); +	memcpy(fcc,&(aco->fccHandler),4); +	FIXME("\tfccHandler: '%s'\n",fcc); +	FIXME("\tdwFlags: 0x%08lx\n",aco->dwFlags); + +	/* we just create a duplicate for now */ +	IAVIStream_AddRef(ppsSource); +	*ppsCompressed = ppsSource; +	as = (IAVIStreamImpl*)ppsSource; + +	/* this is where the fun begins. Open a compressor and prepare it. */ +	as->hic = ICOpen(aco->fccType,aco->fccHandler,ICMODE_COMPRESS); + +	/* May happen. for instance if the codec is not able to compress */ +	if (!as->hic)  +		return AVIERR_UNSUPPORTED; + +	ICGetInfo(as->hic,&(as->icinfo),sizeof(ICINFO)); +	FIXME("Opened compressor: '%s' '%s'\n",debugstr_w(as->icinfo.szName),debugstr_w(as->icinfo.szDescription)); +	as->iscompressing = TRUE; +	memcpy(&(as->aco),aco,sizeof(*aco)); +	if (as->icinfo.dwFlags & VIDCF_COMPRESSFRAMES) { +		ICCOMPRESSFRAMES	icf; + +		/* now what to fill in there ... Hmm */ +		memset(&icf,0,sizeof(icf)); +		icf.lDataRate 	= aco->dwBytesPerSecond; +		icf.lQuality 	= aco->dwQuality; +		icf.lKeyRate 	= aco->dwKeyFrameEvery; + +		icf.GetData = (void *)0xdead4242; +		icf.PutData = (void *)0xdead4243; +		ICSendMessage(as->hic,ICM_COMPRESS_FRAMES_INFO,(LPARAM)&icf,sizeof(icf)); +	} +	return S_OK; +} + +/*********************************************************************** + *		AVIStreamSetFormat + */ +HRESULT WINAPI AVIStreamSetFormat(PAVISTREAM iface,LONG pos,LPVOID format,LONG formatsize) { +	return IAVIStream_SetFormat(iface,pos,format,formatsize); +} + +/*********************************************************************** + *		AVIStreamReadFormat + */ +HRESULT WINAPI AVIStreamReadFormat(PAVISTREAM iface,LONG pos,LPVOID format,LONG *formatsize) { +	return IAVIStream_ReadFormat(iface,pos,format,formatsize); +} + +/*********************************************************************** + *		AVIStreamWrite( + */ +HRESULT WINAPI AVIStreamWrite(PAVISTREAM iface,LONG start,LONG samples,LPVOID buffer,LONG buffersize,DWORD flags,LONG *sampwritten,LONG *byteswritten) { +	return IAVIStream_Write(iface,start,samples,buffer,buffersize,flags,sampwritten,byteswritten); +} + +/*********************************************************************** + *		AVIStreamRead + */ +HRESULT WINAPI AVIStreamRead(PAVISTREAM iface,LONG start,LONG samples,LPVOID buffer,LONG buffersize,LONG *bytesread,LONG *samplesread) { +	return IAVIStream_Read(iface,start,samples,buffer,buffersize,bytesread,samplesread); +} + +/*********************************************************************** + *		AVIStreamWriteData + */ +HRESULT WINAPI AVIStreamWriteData(PAVISTREAM iface,DWORD fcc,LPVOID lp,LONG size) { +	return IAVIStream_WriteData(iface,fcc,lp,size); +} + +/*********************************************************************** + *		AVIStreamReadData + */ +HRESULT WINAPI AVIStreamReadData(PAVISTREAM iface,DWORD fcc,LPVOID lp,LONG *lpread) { +	return IAVIStream_ReadData(iface,fcc,lp,lpread); +} + +/*********************************************************************** + *		AVIStreamStart + */ +LONG WINAPI AVIStreamStart(PAVISTREAM iface) { +	AVISTREAMINFOW	si; + +	IAVIStream_Info(iface,&si,sizeof(si)); +	return si.dwStart; +} + +/*********************************************************************** + *		AVIStreamLength + */ +LONG WINAPI AVIStreamLength(PAVISTREAM iface) { +	AVISTREAMINFOW	si; +	HRESULT			ret; + +	ret = IAVIStream_Info(iface,&si,sizeof(si)); +	if (ret) /* error */ +		return 1; +	return si.dwLength; +} + +/*********************************************************************** + *		AVIStreamRelease + */ +ULONG WINAPI AVIStreamRelease(PAVISTREAM iface) { +	return IAVIStream_Release(iface); +} + +/*********************************************************************** + *		AVIStreamGetFrameOpen + */ +PGETFRAME WINAPI AVIStreamGetFrameOpen(PAVISTREAM iface,LPBITMAPINFOHEADER bmi) { +	FIXME("(%p)->(%p),stub!\n",iface,bmi); +	return NULL; +} + +/*********************************************************************** + *		AVIStreamGetFrame + */ +LPVOID WINAPI AVIStreamGetFrame(PGETFRAME pg,LONG pos) { +	return IGetFrame_GetFrame(pg,pos); +} + +/*********************************************************************** + *		AVIStreamGetFrameClose + */ +HRESULT WINAPI AVIStreamGetFrameClose(PGETFRAME pg) { +	if (pg) IGetFrame_Release(pg); +	return 0; +} + +/*********************************************************************** + *		AVIFileRelease + */ +ULONG WINAPI AVIFileRelease(PAVIFILE iface) { +	return IAVIFile_Release(iface); +} + +/*********************************************************************** + *		AVIFileExit + */ +void WINAPI AVIFileExit(void) { +	FIXME("(), stub.\n"); +} | 
