2 * Copyright 1999 Marcus Meissner
10 #include "wine/winestring.h"
14 #include "debugtools.h"
16 DEFAULT_DEBUG_CHANNEL(avifile
)
17 DECLARE_DEBUG_CHANNEL(msvideo
)
18 DECLARE_DEBUG_CHANNEL(relay
)
20 static HRESULT WINAPI
IAVIFile_fnQueryInterface(IAVIFile
* iface
,REFIID refiid
,LPVOID
*obj
);
21 static ULONG WINAPI
IAVIFile_fnAddRef(IAVIFile
* iface
);
22 static ULONG WINAPI
IAVIFile_fnRelease(IAVIFile
* iface
);
23 static HRESULT WINAPI
IAVIFile_fnInfo(IAVIFile
*iface
,AVIFILEINFOW
*afi
,LONG size
);
24 static HRESULT WINAPI
IAVIFile_fnGetStream(IAVIFile
*iface
,PAVISTREAM
*avis
,DWORD fccType
,LONG lParam
);
25 static HRESULT WINAPI
IAVIFile_fnCreateStream(IAVIFile
*iface
,PAVISTREAM
*avis
,AVISTREAMINFOW
*asi
);
26 static HRESULT WINAPI
IAVIFile_fnWriteData(IAVIFile
*iface
,DWORD ckid
,LPVOID lpData
,LONG size
);
27 static HRESULT WINAPI
IAVIFile_fnReadData(IAVIFile
*iface
,DWORD ckid
,LPVOID lpData
,LONG
*size
);
28 static HRESULT WINAPI
IAVIFile_fnEndRecord(IAVIFile
*iface
);
29 static HRESULT WINAPI
IAVIFile_fnDeleteStream(IAVIFile
*iface
,DWORD fccType
,LONG lParam
);
31 struct ICOM_VTABLE(IAVIFile
) iavift
= {
32 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
33 IAVIFile_fnQueryInterface
,
38 IAVIFile_fnCreateStream
,
42 IAVIFile_fnDeleteStream
45 static HRESULT WINAPI
IAVIStream_fnQueryInterface(IAVIStream
*iface
,REFIID refiid
,LPVOID
*obj
);
46 static ULONG WINAPI
IAVIStream_fnAddRef(IAVIStream
*iface
);
47 static ULONG WINAPI
IAVIStream_fnRelease(IAVIStream
* iface
);
48 static HRESULT WINAPI
IAVIStream_fnCreate(IAVIStream
*iface
,LPARAM lParam1
,LPARAM lParam2
);
49 static HRESULT WINAPI
IAVIStream_fnInfo(IAVIStream
*iface
,AVISTREAMINFOW
*psi
,LONG size
);
50 static LONG WINAPI
IAVIStream_fnFindSample(IAVIStream
*iface
,LONG pos
,LONG flags
);
51 static HRESULT WINAPI
IAVIStream_fnReadFormat(IAVIStream
*iface
,LONG pos
,LPVOID format
,LONG
*formatsize
);
52 static HRESULT WINAPI
IAVIStream_fnSetFormat(IAVIStream
*iface
,LONG pos
,LPVOID format
,LONG formatsize
);
53 static HRESULT WINAPI
IAVIStream_fnRead(IAVIStream
*iface
,LONG start
,LONG samples
,LPVOID buffer
,LONG buffersize
,LONG
*bytesread
,LONG
*samplesread
);
54 static HRESULT WINAPI
IAVIStream_fnWrite(IAVIStream
*iface
,LONG start
,LONG samples
,LPVOID buffer
,LONG buffersize
,DWORD flags
,LONG
*sampwritten
,LONG
*byteswritten
);
55 static HRESULT WINAPI
IAVIStream_fnDelete(IAVIStream
*iface
,LONG start
,LONG samples
);
56 static HRESULT WINAPI
IAVIStream_fnReadData(IAVIStream
*iface
,DWORD fcc
,LPVOID lp
,LONG
*lpread
);
57 static HRESULT WINAPI
IAVIStream_fnWriteData(IAVIStream
*iface
,DWORD fcc
,LPVOID lp
,LONG size
);
58 static HRESULT WINAPI
IAVIStream_fnSetInfo(IAVIStream
*iface
,AVISTREAMINFOW
*info
,LONG infolen
);
60 struct ICOM_VTABLE(IAVIStream
) iavist
= {
61 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
62 IAVIStream_fnQueryInterface
,
67 IAVIStream_fnFindSample
,
68 IAVIStream_fnReadFormat
,
69 IAVIStream_fnSetFormat
,
73 IAVIStream_fnReadData
,
74 IAVIStream_fnWriteData
,
78 typedef struct IAVIStreamImpl
{
80 ICOM_VFIELD(IAVIStream
);
82 /* IAVIStream stuff */
84 DWORD inputformatsize
;
88 /* Compressor stuff */
90 LPVOID lpCompressFormat
;
98 AVICOMPRESSOPTIONS aco
;
100 LPVOID lpPrev
; /* pointer to decompressed frame later */
101 LPVOID lpPrevFormat
; /* pointer to decompressed info later */
109 typedef struct IAVIFileImpl
{
111 ICOM_VFIELD(IAVIFile
);
113 /* IAVIFile stuff... */
116 static HRESULT WINAPI
IAVIFile_fnQueryInterface(IAVIFile
* iface
,REFIID refiid
,LPVOID
*obj
) {
117 ICOM_THIS(IAVIFileImpl
,iface
);
119 TRACE_(relay
)("(%p)->QueryInterface(%s,%p)\n",This
,debugstr_guid(refiid
),obj
);
120 if ( !memcmp(&IID_IUnknown
,refiid
,sizeof(IID_IUnknown
)) ||
121 !memcmp(&IID_IAVIFile
,refiid
,sizeof(IID_IAVIFile
))
126 return OLE_E_ENUM_NOMORE
;
129 static ULONG WINAPI
IAVIFile_fnAddRef(IAVIFile
* iface
) {
130 ICOM_THIS(IAVIFileImpl
,iface
);
132 FIXME_(relay
)("(%p)->AddRef()\n",iface
);
133 return ++(This
->ref
);
136 static ULONG WINAPI
IAVIFile_fnRelease(IAVIFile
* iface
) {
137 ICOM_THIS(IAVIFileImpl
,iface
);
139 FIXME_(relay
)("(%p)->Release()\n",iface
);
140 if (!--(This
->ref
)) {
141 HeapFree(GetProcessHeap(),0,iface
);
147 static HRESULT WINAPI
IAVIFile_fnInfo(IAVIFile
*iface
,AVIFILEINFOW
*afi
,LONG size
) {
148 FIXME("(%p)->Info(%p,%ld)\n",iface
,afi
,size
);
150 /* FIXME: fill out struct? */
154 static HRESULT WINAPI
IAVIFile_fnGetStream(IAVIFile
*iface
,PAVISTREAM
*avis
,DWORD fccType
,LONG lParam
) {
155 FIXME("(%p)->GetStream(%p,0x%08lx,%ld)\n",iface
,avis
,fccType
,lParam
);
156 /* FIXME: create interface etc. */
160 static HRESULT WINAPI
IAVIFile_fnCreateStream(IAVIFile
*iface
,PAVISTREAM
*avis
,AVISTREAMINFOW
*asi
) {
161 ICOM_THIS(IAVIStreamImpl
,iface
);
163 IAVIStreamImpl
*istream
;
165 FIXME("(%p,%p,%p)\n",This
,avis
,asi
);
166 istream
= (IAVIStreamImpl
*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY
,sizeof(IAVIStreamImpl
));
168 ICOM_VTBL(istream
) = &iavist
;
170 memcpy(fcc
,(char*)&(asi
->fccType
),4);
171 FIXME("\tfccType '%s'\n",fcc
);
172 memcpy(fcc
,(char*)&(asi
->fccHandler
),4);
173 FIXME("\tfccHandler '%s'\n",fcc
);
174 FIXME("\tdwFlags 0x%08lx\n",asi
->dwFlags
);
175 FIXME("\tdwCaps 0x%08lx\n",asi
->dwCaps
);
176 FIXME("\tname '%s'\n",debugstr_w(asi
->szName
));
178 istream
->curframe
= 0;
179 *avis
= (PAVISTREAM
)istream
;
183 static HRESULT WINAPI
IAVIFile_fnWriteData(IAVIFile
*iface
,DWORD ckid
,LPVOID lpData
,LONG size
) {
184 FIXME("(%p)->WriteData(0x%08lx,%p,%ld)\n",iface
,ckid
,lpData
,size
);
185 /* FIXME: write data to file */
189 static HRESULT WINAPI
IAVIFile_fnReadData(IAVIFile
*iface
,DWORD ckid
,LPVOID lpData
,LONG
*size
) {
190 FIXME("(%p)->ReadData(0x%08lx,%p,%p)\n",iface
,ckid
,lpData
,size
);
191 /* FIXME: read at most size bytes from file */
195 static HRESULT WINAPI
IAVIFile_fnEndRecord(IAVIFile
*iface
) {
196 FIXME("(%p)->EndRecord()\n",iface
);
197 /* FIXME: end record? */
201 static HRESULT WINAPI
IAVIFile_fnDeleteStream(IAVIFile
*iface
,DWORD fccType
,LONG lParam
) {
202 FIXME("(%p)->DeleteStream(0x%08lx,%ld)\n",iface
,fccType
,lParam
);
203 /* FIXME: delete stream? */
207 HRESULT WINAPI
AVIFileOpenA(
208 PAVIFILE
* ppfile
,LPCSTR szFile
,UINT uMode
,LPCLSID lpHandler
212 FIXME("(%p,%s,0x%08lx,%s),stub!\n",ppfile
,szFile
,(DWORD
)uMode
,debugstr_guid(lpHandler
));
213 iavi
= (IAVIFileImpl
*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY
,sizeof(IAVIFileImpl
));
215 ICOM_VTBL(iavi
) = &iavift
;
216 *ppfile
= (LPVOID
)iavi
;
220 static HRESULT WINAPI
IAVIStream_fnQueryInterface(IAVIStream
*iface
,REFIID refiid
,LPVOID
*obj
) {
221 ICOM_THIS(IAVIStreamImpl
,iface
);
223 TRACE_(relay
)("(%p)->QueryInterface(%s,%p)\n",This
,debugstr_guid(refiid
),obj
);
224 if ( !memcmp(&IID_IUnknown
,refiid
,sizeof(IID_IUnknown
)) ||
225 !memcmp(&IID_IAVIStream
,refiid
,sizeof(IID_IAVIStream
))
230 /* can return IGetFrame interface too */
231 return OLE_E_ENUM_NOMORE
;
234 static ULONG WINAPI
IAVIStream_fnAddRef(IAVIStream
*iface
) {
235 ICOM_THIS(IAVIStreamImpl
,iface
);
237 FIXME_(relay
)("(%p)->AddRef()\n",iface
);
238 return ++(This
->ref
);
241 static ULONG WINAPI
IAVIStream_fnRelease(IAVIStream
* iface
) {
242 ICOM_THIS(IAVIStreamImpl
,iface
);
244 FIXME_(relay
)("(%p)->Release()\n",iface
);
245 if (!--(This
->ref
)) {
246 HeapFree(GetProcessHeap(),0,This
);
252 static HRESULT WINAPI
IAVIStream_fnCreate(IAVIStream
*iface
,LPARAM lParam1
,LPARAM lParam2
) {
253 FIXME("(%p)->Create(0x%08lx,0x%08lx)\n",iface
,lParam1
,lParam2
);
257 static HRESULT WINAPI
IAVIStream_fnInfo(IAVIStream
*iface
,AVISTREAMINFOW
*psi
,LONG size
) {
258 FIXME("(%p)->Info(%p,%ld)\n",iface
,psi
,size
);
262 static LONG WINAPI
IAVIStream_fnFindSample(IAVIStream
*iface
,LONG pos
,LONG flags
) {
263 FIXME("(%p)->FindSample(%ld,0x%08lx)\n",iface
,pos
,flags
);
267 static HRESULT WINAPI
IAVIStream_fnReadFormat(IAVIStream
*iface
,LONG pos
,LPVOID format
,LONG
*formatsize
) {
268 FIXME("(%p)->ReadFormat(%ld,%p,%p)\n",iface
,pos
,format
,formatsize
);
272 /*****************************************************************************
273 * [IAVIStream::SetFormat]
275 static HRESULT WINAPI
IAVIStream_fnSetFormat(IAVIStream
*iface
,LONG pos
,LPVOID format
,LONG formatsize
) {
276 IAVIStreamImpl
*as
= (IAVIStreamImpl
*)iface
;
278 FIXME("(%p)->SetFormat(%ld,%p,%ld)\n",iface
,pos
,format
,formatsize
);
279 if (as
->lpInputFormat
) HeapFree(GetProcessHeap(),0,as
->lpInputFormat
);
280 as
->inputformatsize
= formatsize
;
281 as
->lpInputFormat
= HeapAlloc(GetProcessHeap(),0,formatsize
);
282 memcpy(as
->lpInputFormat
,format
,formatsize
);
283 if (as
->iscompressing
) {
285 /* Set up the Compressor part */
286 xsize
= ICCompressGetFormatSize(as
->hic
,as
->lpInputFormat
);
287 as
->lpCompressFormat
= HeapAlloc(GetProcessHeap(),0,xsize
);
288 ICCompressGetFormat(as
->hic
,as
->lpInputFormat
,as
->lpCompressFormat
);
289 ICCompressBegin(as
->hic
,as
->lpInputFormat
,as
->lpCompressFormat
);
290 as
->compbufsize
= ICCompressGetSize(as
->hic
,as
->lpInputFormat
,as
->lpCompressFormat
);
291 as
->compbuffer
= HeapAlloc(GetProcessHeap(),0,as
->compbufsize
);
293 /* Set up the Decompressor part (for prev frames?) */
294 xsize
=ICDecompressGetFormatSize(as
->hic
,as
->lpCompressFormat
);
295 as
->decompformat
= HeapAlloc(GetProcessHeap(),0,xsize
);
296 ICDecompressGetFormat(as
->hic
,as
->lpCompressFormat
,as
->decompformat
);
297 as
->decompbufsize
=((LPBITMAPINFOHEADER
)as
->decompbuffer
)->biSizeImage
;
298 as
->decompbuffer
= HeapReAlloc(GetProcessHeap(),0,as
->decompbuffer
,as
->decompbufsize
);
299 memset(as
->decompbuffer
,0xff,as
->decompbufsize
);
300 assert(HeapValidate(GetProcessHeap(),0,NULL
));
302 ICDecompressGetFormat(as
->hic
,as
->lpCompressFormat
,as
->decompformat
);
303 ICDecompressBegin(as
->hic
,as
->lpCompressFormat
,as
->decompformat
);
304 as
->lpPrev
= as
->lpPrevFormat
= NULL
;
309 static HRESULT WINAPI
IAVIStream_fnRead(IAVIStream
*iface
,LONG start
,LONG samples
,LPVOID buffer
,LONG buffersize
,LONG
*bytesread
,LONG
*samplesread
) {
310 FIXME("(%p)->Read(%ld,%ld,%p,%ld,%p,%p)\n",iface
,start
,samples
,buffer
,buffersize
,bytesread
,samplesread
);
314 static HRESULT WINAPI
IAVIStream_fnWrite(IAVIStream
*iface
,LONG start
,LONG samples
,LPVOID buffer
,LONG buffersize
,DWORD flags
,LONG
*sampwritten
,LONG
*byteswritten
) {
315 IAVIStreamImpl
*as
= (IAVIStreamImpl
*)iface
;
318 FIXME("(%p)->Write(%ld,%ld,%p,%ld,0x%08lx,%p,%p)\n",iface
,start
,samples
,buffer
,buffersize
,flags
,sampwritten
,byteswritten
);
322 as
->lpCompressFormat
,
324 as
->lpInputFormat
,buffer
,
326 as
->curframe
,0xffffff/*framesize*/,as
->aco
.dwQuality
,
327 as
->lpPrevFormat
,as
->lpPrev
331 flags
, /* FIXME: check */
332 as
->lpCompressFormat
,
337 /* We now have a prev format for the next compress ... */
338 as
->lpPrevFormat
= as
->decompformat
;
339 as
->lpPrev
= as
->decompbuffer
;
343 static HRESULT WINAPI
IAVIStream_fnDelete(IAVIStream
*iface
,LONG start
,LONG samples
) {
344 FIXME("(%p)->Delete(%ld,%ld)\n",iface
,start
,samples
);
347 static HRESULT WINAPI
IAVIStream_fnReadData(IAVIStream
*iface
,DWORD fcc
,LPVOID lp
,LONG
*lpread
) {
348 FIXME("(%p)->ReadData(0x%08lx,%p,%p)\n",iface
,fcc
,lp
,lpread
);
352 static HRESULT WINAPI
IAVIStream_fnWriteData(IAVIStream
*iface
,DWORD fcc
,LPVOID lp
,LONG size
) {
353 FIXME("(%p)->WriteData(0x%08lx,%p,%ld)\n",iface
,fcc
,lp
,size
);
357 static HRESULT WINAPI
IAVIStream_fnSetInfo(IAVIStream
*iface
,AVISTREAMINFOW
*info
,LONG infolen
) {
358 FIXME("(%p)->SetInfo(%p,%ld)\n",iface
,info
,infolen
);
362 HRESULT WINAPI
AVIFileCreateStreamA(PAVIFILE iface
,PAVISTREAM
*ppavi
,AVISTREAMINFOA
* psi
) {
365 /* Only the szName at the end is different */
366 memcpy(&psiw
,psi
,sizeof(*psi
)-sizeof(psi
->szName
));
367 lstrcpynAtoW(psiw
.szName
,psi
->szName
,sizeof(psi
->szName
));
368 return IAVIFile_CreateStream(iface
,ppavi
,&psiw
);
371 HRESULT WINAPI
AVIFileCreateStreamW(IAVIFile
*iface
,PAVISTREAM
*avis
,AVISTREAMINFOW
*asi
) {
372 return IAVIFile_CreateStream(iface
,avis
,asi
);
376 HRESULT WINAPI
AVIFileGetStream(IAVIFile
*iface
,PAVISTREAM
*avis
,DWORD fccType
,LONG lParam
) {
377 return IAVIFile_GetStream(iface
,avis
,fccType
,lParam
);
380 HRESULT WINAPI
AVIFileInfoA(PAVIFILE iface
,LPAVIFILEINFOA afi
,LONG size
) {
384 if (size
< sizeof(AVIFILEINFOA
))
385 return AVIERR_BADSIZE
;
386 hres
= IAVIFile_Info(iface
,&afiw
,sizeof(afiw
));
387 memcpy(afi
,&afiw
,sizeof(*afi
)-sizeof(afi
->szFileType
));
388 lstrcpynWtoA(afi
->szFileType
,afiw
.szFileType
,sizeof(afi
->szFileType
));
392 HRESULT WINAPI
AVIStreamInfoW(PAVISTREAM iface
,AVISTREAMINFOW
*asi
,LONG
394 return IAVIFile_Info(iface
,asi
,size
);
397 HRESULT WINAPI
AVIStreamInfoA(PAVISTREAM iface
,AVISTREAMINFOA
*asi
,LONG
402 if (size
<sizeof(AVISTREAMINFOA
))
403 return AVIERR_BADSIZE
;
404 hres
= IAVIFile_Info(iface
,&asiw
,sizeof(asiw
));
405 memcpy(asi
,&asiw
,sizeof(asiw
)-sizeof(asiw
.szName
));
406 lstrcpynWtoA(asi
->szName
,asiw
.szName
,sizeof(asi
->szName
));
410 HRESULT WINAPI
AVIFileInfoW(PAVIFILE iface
,LPAVIFILEINFOW afi
,LONG size
) {
411 return IAVIFile_Info(iface
,afi
,size
);
414 HRESULT WINAPI
AVIMakeCompressedStream(PAVISTREAM
*ppsCompressed
,PAVISTREAM ppsSource
,AVICOMPRESSOPTIONS
*aco
,CLSID
*pclsidHandler
) {
417 FIXME("(%p,%p,%p,%p)\n",ppsCompressed
,ppsSource
,aco
,pclsidHandler
);
419 memcpy(fcc
,&(aco
->fccType
),4);
420 FIXME("\tfccType: '%s'\n",fcc
);
421 memcpy(fcc
,&(aco
->fccHandler
),4);
422 FIXME("\tfccHandler: '%s'\n",fcc
);
423 FIXME("\tdwFlags: 0x%08lx\n",aco
->dwFlags
);
425 /* we just create a duplicate for now */
426 IAVIStream_AddRef(ppsSource
);
427 *ppsCompressed
= ppsSource
;
428 as
= (IAVIStreamImpl
*)ppsSource
;
430 /* this is where the fun begins. Open a compressor and prepare it. */
431 as
->hic
= ICOpen(aco
->fccType
,aco
->fccHandler
,ICMODE_COMPRESS
);
433 /* May happen. for instance if the codec is not able to compress */
435 return AVIERR_UNSUPPORTED
;
437 ICGetInfo(as
->hic
,&(as
->icinfo
),sizeof(ICINFO
));
438 FIXME("Opened compressor: '%s' '%s'\n",debugstr_w(as
->icinfo
.szName
),debugstr_w(as
->icinfo
.szDescription
));
439 as
->iscompressing
= TRUE
;
440 memcpy(&(as
->aco
),aco
,sizeof(*aco
));
441 if (as
->icinfo
.dwFlags
& VIDCF_COMPRESSFRAMES
) {
442 ICCOMPRESSFRAMES icf
;
444 /* now what to fill in there ... Hmm */
445 memset(&icf
,0,sizeof(icf
));
446 icf
.lDataRate
= aco
->dwBytesPerSecond
;
447 icf
.lQuality
= aco
->dwQuality
;
448 icf
.lKeyRate
= aco
->dwKeyFrameEvery
;
450 icf
.GetData
= (LONG (*)(LPARAM
,LONG
,LPVOID
,LONG
)) 0xdead4242;
451 icf
.PutData
= (LONG (*)(LPARAM
,LONG
,LPVOID
,LONG
)) 0xdead4243;
452 ICSendMessage(as
->hic
,ICM_COMPRESS_FRAMES_INFO
,(LPARAM
)&icf
,sizeof(icf
));
457 HRESULT WINAPI
AVIStreamSetFormat(PAVISTREAM iface
,LONG pos
,LPVOID format
,LONG formatsize
) {
458 return IAVIStream_SetFormat(iface
,pos
,format
,formatsize
);
461 HRESULT WINAPI
AVIStreamReadFormat(PAVISTREAM iface
,LONG pos
,LPVOID format
,LONG
*formatsize
) {
462 return IAVIStream_ReadFormat(iface
,pos
,format
,formatsize
);
465 HRESULT WINAPI
AVIStreamWrite(PAVISTREAM iface
,LONG start
,LONG samples
,LPVOID buffer
,LONG buffersize
,DWORD flags
,LONG
*sampwritten
,LONG
*byteswritten
) {
466 return IAVIStream_Write(iface
,start
,samples
,buffer
,buffersize
,flags
,sampwritten
,byteswritten
);
469 HRESULT WINAPI
AVIStreamRead(PAVISTREAM iface
,LONG start
,LONG samples
,LPVOID buffer
,LONG buffersize
,LONG
*bytesread
,LONG
*samplesread
) {
470 return IAVIStream_Read(iface
,start
,samples
,buffer
,buffersize
,bytesread
,samplesread
);
473 HRESULT WINAPI
AVIStreamWriteData(PAVISTREAM iface
,DWORD fcc
,LPVOID lp
,LONG size
) {
474 return IAVIStream_WriteData(iface
,fcc
,lp
,size
);
477 HRESULT WINAPI
AVIStreamReadData(PAVISTREAM iface
,DWORD fcc
,LPVOID lp
,LONG
*lpread
) {
478 return IAVIStream_ReadData(iface
,fcc
,lp
,lpread
);
481 LONG WINAPI
AVIStreamStart(PAVISTREAM iface
) {
484 IAVIStream_Info(iface
,&si
,sizeof(si
));
488 LONG WINAPI
AVIStreamLength(PAVISTREAM iface
) {
492 ret
= IAVIStream_Info(iface
,&si
,sizeof(si
));
498 ULONG WINAPI
AVIStreamRelease(PAVISTREAM iface
) {
499 return IAVIStream_Release(iface
);
502 PGETFRAME WINAPI
AVIStreamGetFrameOpen(PAVISTREAM iface
,LPBITMAPINFOHEADER bmi
) {
503 FIXME_(msvideo
)("(%p)->(%p),stub!\n",iface
,bmi
);
507 LPVOID WINAPI
AVIStreamGetFrame(PGETFRAME pg
,LONG pos
) {
508 return IGetFrame_GetFrame(pg
,pos
);
511 HRESULT WINAPI
AVIStreamGetFrameClose(PGETFRAME pg
) {
512 if (pg
) IGetFrame_Release(pg
);
516 ULONG WINAPI
AVIFileRelease(PAVIFILE iface
) {
517 return IAVIFile_Release(iface
);
520 void WINAPI
AVIFileExit(void) {
521 FIXME("(), stub.\n");