2 * Copyright 1999 Marcus Meissner
12 #include "debugtools.h"
17 DEFAULT_DEBUG_CHANNEL(avifile
);
19 static HRESULT WINAPI
IAVIFile_fnQueryInterface(IAVIFile
* iface
,REFIID refiid
,LPVOID
*obj
);
20 static ULONG WINAPI
IAVIFile_fnAddRef(IAVIFile
* iface
);
21 static ULONG WINAPI
IAVIFile_fnRelease(IAVIFile
* iface
);
22 static HRESULT WINAPI
IAVIFile_fnInfo(IAVIFile
*iface
,AVIFILEINFOW
*afi
,LONG size
);
23 static HRESULT WINAPI
IAVIFile_fnGetStream(IAVIFile
*iface
,PAVISTREAM
*avis
,DWORD fccType
,LONG lParam
);
24 static HRESULT WINAPI
IAVIFile_fnCreateStream(IAVIFile
*iface
,PAVISTREAM
*avis
,AVISTREAMINFOW
*asi
);
25 static HRESULT WINAPI
IAVIFile_fnWriteData(IAVIFile
*iface
,DWORD ckid
,LPVOID lpData
,LONG size
);
26 static HRESULT WINAPI
IAVIFile_fnReadData(IAVIFile
*iface
,DWORD ckid
,LPVOID lpData
,LONG
*size
);
27 static HRESULT WINAPI
IAVIFile_fnEndRecord(IAVIFile
*iface
);
28 static HRESULT WINAPI
IAVIFile_fnDeleteStream(IAVIFile
*iface
,DWORD fccType
,LONG lParam
);
30 struct ICOM_VTABLE(IAVIFile
) iavift
= {
31 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
32 IAVIFile_fnQueryInterface
,
37 IAVIFile_fnCreateStream
,
41 IAVIFile_fnDeleteStream
44 static HRESULT WINAPI
IAVIStream_fnQueryInterface(IAVIStream
*iface
,REFIID refiid
,LPVOID
*obj
);
45 static ULONG WINAPI
IAVIStream_fnAddRef(IAVIStream
*iface
);
46 static ULONG WINAPI
IAVIStream_fnRelease(IAVIStream
* iface
);
47 static HRESULT WINAPI
IAVIStream_fnCreate(IAVIStream
*iface
,LPARAM lParam1
,LPARAM lParam2
);
48 static HRESULT WINAPI
IAVIStream_fnInfo(IAVIStream
*iface
,AVISTREAMINFOW
*psi
,LONG size
);
49 static LONG WINAPI
IAVIStream_fnFindSample(IAVIStream
*iface
,LONG pos
,LONG flags
);
50 static HRESULT WINAPI
IAVIStream_fnReadFormat(IAVIStream
*iface
,LONG pos
,LPVOID format
,LONG
*formatsize
);
51 static HRESULT WINAPI
IAVIStream_fnSetFormat(IAVIStream
*iface
,LONG pos
,LPVOID format
,LONG formatsize
);
52 static HRESULT WINAPI
IAVIStream_fnRead(IAVIStream
*iface
,LONG start
,LONG samples
,LPVOID buffer
,LONG buffersize
,LONG
*bytesread
,LONG
*samplesread
);
53 static HRESULT WINAPI
IAVIStream_fnWrite(IAVIStream
*iface
,LONG start
,LONG samples
,LPVOID buffer
,LONG buffersize
,DWORD flags
,LONG
*sampwritten
,LONG
*byteswritten
);
54 static HRESULT WINAPI
IAVIStream_fnDelete(IAVIStream
*iface
,LONG start
,LONG samples
);
55 static HRESULT WINAPI
IAVIStream_fnReadData(IAVIStream
*iface
,DWORD fcc
,LPVOID lp
,LONG
*lpread
);
56 static HRESULT WINAPI
IAVIStream_fnWriteData(IAVIStream
*iface
,DWORD fcc
,LPVOID lp
,LONG size
);
57 static HRESULT WINAPI
IAVIStream_fnSetInfo(IAVIStream
*iface
,AVISTREAMINFOW
*info
,LONG infolen
);
59 struct ICOM_VTABLE(IAVIStream
) iavist
= {
60 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
61 IAVIStream_fnQueryInterface
,
66 IAVIStream_fnFindSample
,
67 IAVIStream_fnReadFormat
,
68 IAVIStream_fnSetFormat
,
72 IAVIStream_fnReadData
,
73 IAVIStream_fnWriteData
,
77 typedef struct IAVIStreamImpl
{
79 ICOM_VFIELD(IAVIStream
);
81 /* IAVIStream stuff */
83 DWORD inputformatsize
;
87 /* Compressor stuff */
89 LPVOID lpCompressFormat
;
97 AVICOMPRESSOPTIONS aco
;
99 LPVOID lpPrev
; /* pointer to decompressed frame later */
100 LPVOID lpPrevFormat
; /* pointer to decompressed info later */
103 /***********************************************************************
111 typedef struct IAVIFileImpl
{
113 ICOM_VFIELD(IAVIFile
);
115 /* IAVIFile stuff... */
118 static HRESULT WINAPI
IAVIFile_fnQueryInterface(IAVIFile
* iface
,REFIID refiid
,LPVOID
*obj
) {
119 ICOM_THIS(IAVIFileImpl
,iface
);
121 TRACE("(%p)->QueryInterface(%s,%p)\n",This
,debugstr_guid(refiid
),obj
);
122 if ( !memcmp(&IID_IUnknown
,refiid
,sizeof(IID_IUnknown
)) ||
123 !memcmp(&IID_IAVIFile
,refiid
,sizeof(IID_IAVIFile
))
128 return OLE_E_ENUM_NOMORE
;
131 static ULONG WINAPI
IAVIFile_fnAddRef(IAVIFile
* iface
) {
132 ICOM_THIS(IAVIFileImpl
,iface
);
134 FIXME("(%p)->AddRef()\n",iface
);
135 return ++(This
->ref
);
138 static ULONG WINAPI
IAVIFile_fnRelease(IAVIFile
* iface
) {
139 ICOM_THIS(IAVIFileImpl
,iface
);
141 FIXME("(%p)->Release()\n",iface
);
142 if (!--(This
->ref
)) {
143 HeapFree(GetProcessHeap(),0,iface
);
149 static HRESULT WINAPI
IAVIFile_fnInfo(IAVIFile
*iface
,AVIFILEINFOW
*afi
,LONG size
) {
150 FIXME("(%p)->Info(%p,%ld)\n",iface
,afi
,size
);
152 /* FIXME: fill out struct? */
156 static HRESULT WINAPI
IAVIFile_fnGetStream(IAVIFile
*iface
,PAVISTREAM
*avis
,DWORD fccType
,LONG lParam
) {
157 FIXME("(%p)->GetStream(%p,0x%08lx,%ld)\n",iface
,avis
,fccType
,lParam
);
158 /* FIXME: create interface etc. */
162 static HRESULT WINAPI
IAVIFile_fnCreateStream(IAVIFile
*iface
,PAVISTREAM
*avis
,AVISTREAMINFOW
*asi
) {
163 ICOM_THIS(IAVIStreamImpl
,iface
);
165 IAVIStreamImpl
*istream
;
167 FIXME("(%p,%p,%p)\n",This
,avis
,asi
);
168 istream
= (IAVIStreamImpl
*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY
,sizeof(IAVIStreamImpl
));
170 ICOM_VTBL(istream
) = &iavist
;
172 memcpy(fcc
,(char*)&(asi
->fccType
),4);
173 FIXME("\tfccType '%s'\n",fcc
);
174 memcpy(fcc
,(char*)&(asi
->fccHandler
),4);
175 FIXME("\tfccHandler '%s'\n",fcc
);
176 FIXME("\tdwFlags 0x%08lx\n",asi
->dwFlags
);
177 FIXME("\tdwCaps 0x%08lx\n",asi
->dwCaps
);
178 FIXME("\tname '%s'\n",debugstr_w(asi
->szName
));
180 istream
->curframe
= 0;
181 *avis
= (PAVISTREAM
)istream
;
185 static HRESULT WINAPI
IAVIFile_fnWriteData(IAVIFile
*iface
,DWORD ckid
,LPVOID lpData
,LONG size
) {
186 FIXME("(%p)->WriteData(0x%08lx,%p,%ld)\n",iface
,ckid
,lpData
,size
);
187 /* FIXME: write data to file */
191 static HRESULT WINAPI
IAVIFile_fnReadData(IAVIFile
*iface
,DWORD ckid
,LPVOID lpData
,LONG
*size
) {
192 FIXME("(%p)->ReadData(0x%08lx,%p,%p)\n",iface
,ckid
,lpData
,size
);
193 /* FIXME: read at most size bytes from file */
197 static HRESULT WINAPI
IAVIFile_fnEndRecord(IAVIFile
*iface
) {
198 FIXME("(%p)->EndRecord()\n",iface
);
199 /* FIXME: end record? */
203 static HRESULT WINAPI
IAVIFile_fnDeleteStream(IAVIFile
*iface
,DWORD fccType
,LONG lParam
) {
204 FIXME("(%p)->DeleteStream(0x%08lx,%ld)\n",iface
,fccType
,lParam
);
205 /* FIXME: delete stream? */
209 /***********************************************************************
212 HRESULT WINAPI
AVIFileOpenA(
213 PAVIFILE
* ppfile
,LPCSTR szFile
,UINT uMode
,LPCLSID lpHandler
217 FIXME("(%p,%s,0x%08lx,%s),stub!\n",ppfile
,szFile
,(DWORD
)uMode
,debugstr_guid(lpHandler
));
218 iavi
= (IAVIFileImpl
*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY
,sizeof(IAVIFileImpl
));
220 ICOM_VTBL(iavi
) = &iavift
;
221 *ppfile
= (LPVOID
)iavi
;
225 static HRESULT WINAPI
IAVIStream_fnQueryInterface(IAVIStream
*iface
,REFIID refiid
,LPVOID
*obj
) {
226 ICOM_THIS(IAVIStreamImpl
,iface
);
228 TRACE("(%p)->QueryInterface(%s,%p)\n",This
,debugstr_guid(refiid
),obj
);
229 if ( !memcmp(&IID_IUnknown
,refiid
,sizeof(IID_IUnknown
)) ||
230 !memcmp(&IID_IAVIStream
,refiid
,sizeof(IID_IAVIStream
))
235 /* can return IGetFrame interface too */
236 return OLE_E_ENUM_NOMORE
;
239 static ULONG WINAPI
IAVIStream_fnAddRef(IAVIStream
*iface
) {
240 ICOM_THIS(IAVIStreamImpl
,iface
);
242 FIXME("(%p)->AddRef()\n",iface
);
243 return ++(This
->ref
);
246 static ULONG WINAPI
IAVIStream_fnRelease(IAVIStream
* iface
) {
247 ICOM_THIS(IAVIStreamImpl
,iface
);
249 FIXME("(%p)->Release()\n",iface
);
250 if (!--(This
->ref
)) {
251 HeapFree(GetProcessHeap(),0,This
);
257 static HRESULT WINAPI
IAVIStream_fnCreate(IAVIStream
*iface
,LPARAM lParam1
,LPARAM lParam2
) {
258 FIXME("(%p)->Create(0x%08lx,0x%08lx)\n",iface
,lParam1
,lParam2
);
262 static HRESULT WINAPI
IAVIStream_fnInfo(IAVIStream
*iface
,AVISTREAMINFOW
*psi
,LONG size
) {
263 FIXME("(%p)->Info(%p,%ld)\n",iface
,psi
,size
);
267 static LONG WINAPI
IAVIStream_fnFindSample(IAVIStream
*iface
,LONG pos
,LONG flags
) {
268 FIXME("(%p)->FindSample(%ld,0x%08lx)\n",iface
,pos
,flags
);
272 static HRESULT WINAPI
IAVIStream_fnReadFormat(IAVIStream
*iface
,LONG pos
,LPVOID format
,LONG
*formatsize
) {
273 FIXME("(%p)->ReadFormat(%ld,%p,%p)\n",iface
,pos
,format
,formatsize
);
277 /***********************************************************************
278 * IAVIStream::SetFormat
280 static HRESULT WINAPI
IAVIStream_fnSetFormat(IAVIStream
*iface
,LONG pos
,LPVOID format
,LONG formatsize
) {
281 IAVIStreamImpl
*as
= (IAVIStreamImpl
*)iface
;
283 FIXME("(%p)->SetFormat(%ld,%p,%ld)\n",iface
,pos
,format
,formatsize
);
284 if (as
->lpInputFormat
) HeapFree(GetProcessHeap(),0,as
->lpInputFormat
);
285 as
->inputformatsize
= formatsize
;
286 as
->lpInputFormat
= HeapAlloc(GetProcessHeap(),0,formatsize
);
287 memcpy(as
->lpInputFormat
,format
,formatsize
);
288 if (as
->iscompressing
) {
290 /* Set up the Compressor part */
291 xsize
= ICCompressGetFormatSize(as
->hic
,as
->lpInputFormat
);
292 as
->lpCompressFormat
= HeapAlloc(GetProcessHeap(),0,xsize
);
293 ICCompressGetFormat(as
->hic
,as
->lpInputFormat
,as
->lpCompressFormat
);
294 ICCompressBegin(as
->hic
,as
->lpInputFormat
,as
->lpCompressFormat
);
295 as
->compbufsize
= ICCompressGetSize(as
->hic
,as
->lpInputFormat
,as
->lpCompressFormat
);
296 as
->compbuffer
= HeapAlloc(GetProcessHeap(),0,as
->compbufsize
);
298 /* Set up the Decompressor part (for prev frames?) */
299 xsize
=ICDecompressGetFormatSize(as
->hic
,as
->lpCompressFormat
);
300 as
->decompformat
= HeapAlloc(GetProcessHeap(),0,xsize
);
301 ICDecompressGetFormat(as
->hic
,as
->lpCompressFormat
,as
->decompformat
);
302 as
->decompbufsize
=((LPBITMAPINFOHEADER
)as
->decompbuffer
)->biSizeImage
;
303 as
->decompbuffer
= HeapReAlloc(GetProcessHeap(),0,as
->decompbuffer
,as
->decompbufsize
);
304 memset(as
->decompbuffer
,0xff,as
->decompbufsize
);
305 assert(HeapValidate(GetProcessHeap(),0,NULL
));
307 ICDecompressGetFormat(as
->hic
,as
->lpCompressFormat
,as
->decompformat
);
308 ICDecompressBegin(as
->hic
,as
->lpCompressFormat
,as
->decompformat
);
309 as
->lpPrev
= as
->lpPrevFormat
= NULL
;
314 static HRESULT WINAPI
IAVIStream_fnRead(IAVIStream
*iface
,LONG start
,LONG samples
,LPVOID buffer
,LONG buffersize
,LONG
*bytesread
,LONG
*samplesread
) {
315 FIXME("(%p)->Read(%ld,%ld,%p,%ld,%p,%p)\n",iface
,start
,samples
,buffer
,buffersize
,bytesread
,samplesread
);
319 static HRESULT WINAPI
IAVIStream_fnWrite(IAVIStream
*iface
,LONG start
,LONG samples
,LPVOID buffer
,LONG buffersize
,DWORD flags
,LONG
*sampwritten
,LONG
*byteswritten
) {
320 IAVIStreamImpl
*as
= (IAVIStreamImpl
*)iface
;
323 FIXME("(%p)->Write(%ld,%ld,%p,%ld,0x%08lx,%p,%p)\n",iface
,start
,samples
,buffer
,buffersize
,flags
,sampwritten
,byteswritten
);
327 as
->lpCompressFormat
,
329 as
->lpInputFormat
,buffer
,
331 as
->curframe
,0xffffff/*framesize*/,as
->aco
.dwQuality
,
332 as
->lpPrevFormat
,as
->lpPrev
336 flags
, /* FIXME: check */
337 as
->lpCompressFormat
,
342 /* We now have a prev format for the next compress ... */
343 as
->lpPrevFormat
= as
->decompformat
;
344 as
->lpPrev
= as
->decompbuffer
;
348 static HRESULT WINAPI
IAVIStream_fnDelete(IAVIStream
*iface
,LONG start
,LONG samples
) {
349 FIXME("(%p)->Delete(%ld,%ld)\n",iface
,start
,samples
);
352 static HRESULT WINAPI
IAVIStream_fnReadData(IAVIStream
*iface
,DWORD fcc
,LPVOID lp
,LONG
*lpread
) {
353 FIXME("(%p)->ReadData(0x%08lx,%p,%p)\n",iface
,fcc
,lp
,lpread
);
357 static HRESULT WINAPI
IAVIStream_fnWriteData(IAVIStream
*iface
,DWORD fcc
,LPVOID lp
,LONG size
) {
358 FIXME("(%p)->WriteData(0x%08lx,%p,%ld)\n",iface
,fcc
,lp
,size
);
362 static HRESULT WINAPI
IAVIStream_fnSetInfo(IAVIStream
*iface
,AVISTREAMINFOW
*info
,LONG infolen
) {
363 FIXME("(%p)->SetInfo(%p,%ld)\n",iface
,info
,infolen
);
367 /***********************************************************************
368 * AVIFileCreateStreamA
370 HRESULT WINAPI
AVIFileCreateStreamA(PAVIFILE iface
,PAVISTREAM
*ppavi
,AVISTREAMINFOA
* psi
) {
373 /* Only the szName at the end is different */
374 memcpy(&psiw
,psi
,sizeof(*psi
)-sizeof(psi
->szName
));
375 MultiByteToWideChar( CP_ACP
, 0, psi
->szName
, -1,
376 psiw
.szName
, sizeof(psiw
.szName
) / sizeof(WCHAR
) );
377 return IAVIFile_CreateStream(iface
,ppavi
,&psiw
);
380 /***********************************************************************
381 * AVIFileCreateStreamW
383 HRESULT WINAPI
AVIFileCreateStreamW(IAVIFile
*iface
,PAVISTREAM
*avis
,AVISTREAMINFOW
*asi
) {
384 return IAVIFile_CreateStream(iface
,avis
,asi
);
388 /***********************************************************************
391 HRESULT WINAPI
AVIFileGetStream(IAVIFile
*iface
,PAVISTREAM
*avis
,DWORD fccType
,LONG lParam
) {
392 return IAVIFile_GetStream(iface
,avis
,fccType
,lParam
);
395 /***********************************************************************
398 HRESULT WINAPI
AVIFileInfoA(PAVIFILE iface
,LPAVIFILEINFOA afi
,LONG size
) {
402 if (size
< sizeof(AVIFILEINFOA
))
403 return AVIERR_BADSIZE
;
404 hres
= IAVIFile_Info(iface
,&afiw
,sizeof(afiw
));
405 memcpy(afi
,&afiw
,sizeof(*afi
)-sizeof(afi
->szFileType
));
406 WideCharToMultiByte( CP_ACP
, 0, afiw
.szFileType
, -1,
407 afi
->szFileType
, sizeof(afi
->szFileType
), NULL
, NULL
);
408 afi
->szFileType
[sizeof(afi
->szFileType
)-1] = 0;
412 /***********************************************************************
415 HRESULT WINAPI
AVIStreamInfoW(PAVISTREAM iface
,AVISTREAMINFOW
*asi
,LONG
417 return IAVIFile_Info(iface
,asi
,size
);
420 /***********************************************************************
423 HRESULT WINAPI
AVIStreamInfoA(PAVISTREAM iface
,AVISTREAMINFOA
*asi
,LONG
428 if (size
<sizeof(AVISTREAMINFOA
))
429 return AVIERR_BADSIZE
;
430 hres
= IAVIFile_Info(iface
,&asiw
,sizeof(asiw
));
431 memcpy(asi
,&asiw
,sizeof(asiw
)-sizeof(asiw
.szName
));
432 WideCharToMultiByte( CP_ACP
, 0, asiw
.szName
, -1,
433 asi
->szName
, sizeof(asi
->szName
), NULL
, NULL
);
434 asi
->szName
[sizeof(asi
->szName
)-1] = 0;
438 /***********************************************************************
441 HRESULT WINAPI
AVIFileInfoW(PAVIFILE iface
,LPAVIFILEINFOW afi
,LONG size
) {
442 return IAVIFile_Info(iface
,afi
,size
);
445 /***********************************************************************
446 * AVIMakeCompressedStream
448 HRESULT WINAPI
AVIMakeCompressedStream(PAVISTREAM
*ppsCompressed
,PAVISTREAM ppsSource
,AVICOMPRESSOPTIONS
*aco
,CLSID
*pclsidHandler
) {
451 FIXME("(%p,%p,%p,%p)\n",ppsCompressed
,ppsSource
,aco
,pclsidHandler
);
453 memcpy(fcc
,&(aco
->fccType
),4);
454 FIXME("\tfccType: '%s'\n",fcc
);
455 memcpy(fcc
,&(aco
->fccHandler
),4);
456 FIXME("\tfccHandler: '%s'\n",fcc
);
457 FIXME("\tdwFlags: 0x%08lx\n",aco
->dwFlags
);
459 /* we just create a duplicate for now */
460 IAVIStream_AddRef(ppsSource
);
461 *ppsCompressed
= ppsSource
;
462 as
= (IAVIStreamImpl
*)ppsSource
;
464 /* this is where the fun begins. Open a compressor and prepare it. */
465 as
->hic
= ICOpen(aco
->fccType
,aco
->fccHandler
,ICMODE_COMPRESS
);
467 /* May happen. for instance if the codec is not able to compress */
469 return AVIERR_UNSUPPORTED
;
471 ICGetInfo(as
->hic
,&(as
->icinfo
),sizeof(ICINFO
));
472 FIXME("Opened compressor: '%s' '%s'\n",debugstr_w(as
->icinfo
.szName
),debugstr_w(as
->icinfo
.szDescription
));
473 as
->iscompressing
= TRUE
;
474 memcpy(&(as
->aco
),aco
,sizeof(*aco
));
475 if (as
->icinfo
.dwFlags
& VIDCF_COMPRESSFRAMES
) {
476 ICCOMPRESSFRAMES icf
;
478 /* now what to fill in there ... Hmm */
479 memset(&icf
,0,sizeof(icf
));
480 icf
.lDataRate
= aco
->dwBytesPerSecond
;
481 icf
.lQuality
= aco
->dwQuality
;
482 icf
.lKeyRate
= aco
->dwKeyFrameEvery
;
484 icf
.GetData
= (void *)0xdead4242;
485 icf
.PutData
= (void *)0xdead4243;
486 ICSendMessage(as
->hic
,ICM_COMPRESS_FRAMES_INFO
,(LPARAM
)&icf
,sizeof(icf
));
491 /***********************************************************************
494 HRESULT WINAPI
AVIStreamSetFormat(PAVISTREAM iface
,LONG pos
,LPVOID format
,LONG formatsize
) {
495 return IAVIStream_SetFormat(iface
,pos
,format
,formatsize
);
498 /***********************************************************************
499 * AVIStreamReadFormat
501 HRESULT WINAPI
AVIStreamReadFormat(PAVISTREAM iface
,LONG pos
,LPVOID format
,LONG
*formatsize
) {
502 return IAVIStream_ReadFormat(iface
,pos
,format
,formatsize
);
505 /***********************************************************************
508 HRESULT WINAPI
AVIStreamWrite(PAVISTREAM iface
,LONG start
,LONG samples
,LPVOID buffer
,LONG buffersize
,DWORD flags
,LONG
*sampwritten
,LONG
*byteswritten
) {
509 return IAVIStream_Write(iface
,start
,samples
,buffer
,buffersize
,flags
,sampwritten
,byteswritten
);
512 /***********************************************************************
515 HRESULT WINAPI
AVIStreamRead(PAVISTREAM iface
,LONG start
,LONG samples
,LPVOID buffer
,LONG buffersize
,LONG
*bytesread
,LONG
*samplesread
) {
516 return IAVIStream_Read(iface
,start
,samples
,buffer
,buffersize
,bytesread
,samplesread
);
519 /***********************************************************************
522 HRESULT WINAPI
AVIStreamWriteData(PAVISTREAM iface
,DWORD fcc
,LPVOID lp
,LONG size
) {
523 return IAVIStream_WriteData(iface
,fcc
,lp
,size
);
526 /***********************************************************************
529 HRESULT WINAPI
AVIStreamReadData(PAVISTREAM iface
,DWORD fcc
,LPVOID lp
,LONG
*lpread
) {
530 return IAVIStream_ReadData(iface
,fcc
,lp
,lpread
);
533 /***********************************************************************
536 LONG WINAPI
AVIStreamStart(PAVISTREAM iface
) {
539 IAVIStream_Info(iface
,&si
,sizeof(si
));
543 /***********************************************************************
546 LONG WINAPI
AVIStreamLength(PAVISTREAM iface
) {
550 ret
= IAVIStream_Info(iface
,&si
,sizeof(si
));
556 /***********************************************************************
559 ULONG WINAPI
AVIStreamRelease(PAVISTREAM iface
) {
560 return IAVIStream_Release(iface
);
563 /***********************************************************************
564 * AVIStreamGetFrameOpen
566 PGETFRAME WINAPI
AVIStreamGetFrameOpen(PAVISTREAM iface
,LPBITMAPINFOHEADER bmi
) {
567 FIXME("(%p)->(%p),stub!\n",iface
,bmi
);
571 /***********************************************************************
574 LPVOID WINAPI
AVIStreamGetFrame(PGETFRAME pg
,LONG pos
) {
575 return IGetFrame_GetFrame(pg
,pos
);
578 /***********************************************************************
579 * AVIStreamGetFrameClose
581 HRESULT WINAPI
AVIStreamGetFrameClose(PGETFRAME pg
) {
582 if (pg
) IGetFrame_Release(pg
);
586 /***********************************************************************
589 ULONG WINAPI
AVIFileRelease(PAVIFILE iface
) {
590 return IAVIFile_Release(iface
);
593 /***********************************************************************
596 void WINAPI
AVIFileExit(void) {
597 FIXME("(), stub.\n");