- implementation of RtlReg* (read access), RtlEvent*, RtlSemaphore*,
[wine] / dlls / avifil32 / avifile.c
1 /*                                 
2  * Copyright 1999 Marcus Meissner
3  */
4 #include <string.h>
5 #include <stdio.h>
6 #include <assert.h>
7
8 #include "winbase.h"
9 #include "vfw.h"
10 #include "wine/winestring.h"
11 #include "driver.h"
12 #include "mmsystem.h"
13 #include "winerror.h"
14 #include "debugstr.h"
15 #include "debugtools.h"
16
17 DEFAULT_DEBUG_CHANNEL(avifile)
18 DECLARE_DEBUG_CHANNEL(msvideo)
19 DECLARE_DEBUG_CHANNEL(relay)
20
21 static HRESULT WINAPI IAVIFile_fnQueryInterface(IAVIFile* iface,REFIID refiid,LPVOID *obj);
22 static ULONG WINAPI IAVIFile_fnAddRef(IAVIFile* iface);
23 static ULONG WINAPI IAVIFile_fnRelease(IAVIFile* iface);
24 static HRESULT WINAPI IAVIFile_fnInfo(IAVIFile*iface,AVIFILEINFOW*afi,LONG size);
25 static HRESULT WINAPI IAVIFile_fnGetStream(IAVIFile*iface,PAVISTREAM*avis,DWORD fccType,LONG lParam);
26 static HRESULT WINAPI IAVIFile_fnCreateStream(IAVIFile*iface,PAVISTREAM*avis,AVISTREAMINFOW*asi);
27 static HRESULT WINAPI IAVIFile_fnWriteData(IAVIFile*iface,DWORD ckid,LPVOID lpData,LONG size);
28 static HRESULT WINAPI IAVIFile_fnReadData(IAVIFile*iface,DWORD ckid,LPVOID lpData,LONG *size);
29 static HRESULT WINAPI IAVIFile_fnEndRecord(IAVIFile*iface);
30 static HRESULT WINAPI IAVIFile_fnDeleteStream(IAVIFile*iface,DWORD fccType,LONG lParam);
31
32 struct ICOM_VTABLE(IAVIFile) iavift = {
33     ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
34     IAVIFile_fnQueryInterface,
35     IAVIFile_fnAddRef,
36     IAVIFile_fnRelease,
37     IAVIFile_fnInfo,
38     IAVIFile_fnGetStream,
39     IAVIFile_fnCreateStream,
40     IAVIFile_fnWriteData,
41     IAVIFile_fnReadData,
42     IAVIFile_fnEndRecord,
43     IAVIFile_fnDeleteStream
44 };
45
46 static HRESULT WINAPI IAVIStream_fnQueryInterface(IAVIStream*iface,REFIID refiid,LPVOID *obj);
47 static ULONG WINAPI IAVIStream_fnAddRef(IAVIStream*iface);
48 static ULONG WINAPI IAVIStream_fnRelease(IAVIStream* iface);
49 static HRESULT WINAPI IAVIStream_fnCreate(IAVIStream*iface,LPARAM lParam1,LPARAM lParam2);
50 static HRESULT WINAPI IAVIStream_fnInfo(IAVIStream*iface,AVISTREAMINFOW *psi,LONG size);
51 static LONG WINAPI IAVIStream_fnFindSample(IAVIStream*iface,LONG pos,LONG flags);
52 static HRESULT WINAPI IAVIStream_fnReadFormat(IAVIStream*iface,LONG pos,LPVOID format,LONG *formatsize);
53 static HRESULT WINAPI IAVIStream_fnSetFormat(IAVIStream*iface,LONG pos,LPVOID format,LONG formatsize);
54 static HRESULT WINAPI IAVIStream_fnRead(IAVIStream*iface,LONG start,LONG samples,LPVOID buffer,LONG buffersize,LONG *bytesread,LONG *samplesread);
55 static HRESULT WINAPI IAVIStream_fnWrite(IAVIStream*iface,LONG start,LONG samples,LPVOID buffer,LONG buffersize,DWORD flags,LONG *sampwritten,LONG *byteswritten);
56 static HRESULT WINAPI IAVIStream_fnDelete(IAVIStream*iface,LONG start,LONG samples);
57 static HRESULT WINAPI IAVIStream_fnReadData(IAVIStream*iface,DWORD fcc,LPVOID lp,LONG *lpread);
58 static HRESULT WINAPI IAVIStream_fnWriteData(IAVIStream*iface,DWORD fcc,LPVOID lp,LONG size);
59 static HRESULT WINAPI IAVIStream_fnSetInfo(IAVIStream*iface,AVISTREAMINFOW*info,LONG infolen);
60
61 struct ICOM_VTABLE(IAVIStream) iavist = {
62     ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
63     IAVIStream_fnQueryInterface,
64     IAVIStream_fnAddRef,
65     IAVIStream_fnRelease,
66     IAVIStream_fnCreate,
67     IAVIStream_fnInfo,
68     IAVIStream_fnFindSample,
69     IAVIStream_fnReadFormat,
70     IAVIStream_fnSetFormat,
71     IAVIStream_fnRead,
72     IAVIStream_fnWrite,
73     IAVIStream_fnDelete,
74     IAVIStream_fnReadData,
75     IAVIStream_fnWriteData,
76     IAVIStream_fnSetInfo
77 };
78
79 typedef struct IAVIStreamImpl {
80         /* IUnknown stuff */
81         ICOM_VFIELD(IAVIStream);
82         DWORD           ref;
83         /* IAVIStream stuff */
84         LPVOID          lpInputFormat;
85         DWORD           inputformatsize;
86         BOOL            iscompressing;
87         DWORD           curframe;
88
89             /* Compressor stuff */
90             HIC hic;
91             LPVOID      lpCompressFormat;
92             ICINFO      icinfo;
93             DWORD       compbufsize;
94             LPVOID      compbuffer;
95
96             DWORD       decompbufsize;
97             LPVOID      decompbuffer;
98             LPVOID      decompformat;
99             AVICOMPRESSOPTIONS  aco;
100
101             LPVOID      lpPrev; /* pointer to decompressed frame later */
102             LPVOID      lpPrevFormat; /* pointer to decompressed info later */
103 } IAVIStreamImpl;
104
105 void WINAPI
106 AVIFileInit(void) {
107         FIXME("(),stub!\n");
108 }
109
110 typedef struct IAVIFileImpl {
111         /* IUnknown stuff */
112         ICOM_VFIELD(IAVIFile);
113         DWORD                           ref;
114         /* IAVIFile stuff... */
115 } IAVIFileImpl;
116
117 static HRESULT WINAPI IAVIFile_fnQueryInterface(IAVIFile* iface,REFIID refiid,LPVOID *obj) {
118         ICOM_THIS(IAVIFileImpl,iface);
119
120         TRACE_(relay)("(%p)->QueryInterface(%s,%p)\n",This,debugstr_guid(refiid),obj);
121         if (    !memcmp(&IID_IUnknown,refiid,sizeof(IID_IUnknown)) ||
122                 !memcmp(&IID_IAVIFile,refiid,sizeof(IID_IAVIFile))
123         ) {
124                 *obj = iface;
125                 return S_OK;
126         }
127         return OLE_E_ENUM_NOMORE;
128 }
129
130 static ULONG WINAPI IAVIFile_fnAddRef(IAVIFile* iface) {
131         ICOM_THIS(IAVIFileImpl,iface);
132         
133         FIXME_(relay)("(%p)->AddRef()\n",iface);
134         return ++(This->ref);
135 }
136
137 static ULONG WINAPI IAVIFile_fnRelease(IAVIFile* iface) {
138         ICOM_THIS(IAVIFileImpl,iface);
139         
140         FIXME_(relay)("(%p)->Release()\n",iface);
141         if (!--(This->ref)) {
142                 HeapFree(GetProcessHeap(),0,iface);
143                 return 0;
144         }
145         return This->ref;
146 }
147
148 static HRESULT WINAPI IAVIFile_fnInfo(IAVIFile*iface,AVIFILEINFOW*afi,LONG size) {
149         FIXME("(%p)->Info(%p,%ld)\n",iface,afi,size);
150
151         /* FIXME: fill out struct? */
152         return E_FAIL;
153 }
154
155 static HRESULT WINAPI IAVIFile_fnGetStream(IAVIFile*iface,PAVISTREAM*avis,DWORD fccType,LONG lParam) {
156         FIXME("(%p)->GetStream(%p,0x%08lx,%ld)\n",iface,avis,fccType,lParam);
157         /* FIXME: create interface etc. */
158         return E_FAIL;
159 }
160
161 static HRESULT WINAPI IAVIFile_fnCreateStream(IAVIFile*iface,PAVISTREAM*avis,AVISTREAMINFOW*asi) {
162         ICOM_THIS(IAVIStreamImpl,iface);
163         char            fcc[5];
164         IAVIStreamImpl  *istream;
165
166         FIXME("(%p,%p,%p)\n",This,avis,asi);
167         istream = (IAVIStreamImpl*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IAVIStreamImpl));
168         istream->ref = 1;
169         ICOM_VTBL(istream) = &iavist;
170         fcc[4]='\0';
171         memcpy(fcc,(char*)&(asi->fccType),4);
172         FIXME("\tfccType '%s'\n",fcc);
173         memcpy(fcc,(char*)&(asi->fccHandler),4);
174         FIXME("\tfccHandler '%s'\n",fcc);
175         FIXME("\tdwFlags 0x%08lx\n",asi->dwFlags);
176         FIXME("\tdwCaps 0x%08lx\n",asi->dwCaps);
177         FIXME("\tname '%s'\n",debugstr_w(asi->szName));
178
179         istream->curframe = 0;
180         *avis = (PAVISTREAM)istream;
181         return S_OK;
182 }
183
184 static HRESULT WINAPI IAVIFile_fnWriteData(IAVIFile*iface,DWORD ckid,LPVOID lpData,LONG size) {
185         FIXME("(%p)->WriteData(0x%08lx,%p,%ld)\n",iface,ckid,lpData,size);
186         /* FIXME: write data to file */
187         return E_FAIL;
188 }
189
190 static HRESULT WINAPI IAVIFile_fnReadData(IAVIFile*iface,DWORD ckid,LPVOID lpData,LONG *size) {
191         FIXME("(%p)->ReadData(0x%08lx,%p,%p)\n",iface,ckid,lpData,size);
192         /* FIXME: read at most size bytes from file */
193         return E_FAIL;
194 }
195
196 static HRESULT WINAPI IAVIFile_fnEndRecord(IAVIFile*iface) {
197         FIXME("(%p)->EndRecord()\n",iface);
198         /* FIXME: end record? */
199         return E_FAIL;
200 }
201
202 static HRESULT WINAPI IAVIFile_fnDeleteStream(IAVIFile*iface,DWORD fccType,LONG lParam) {
203         FIXME("(%p)->DeleteStream(0x%08lx,%ld)\n",iface,fccType,lParam);
204         /* FIXME: delete stream? */
205         return E_FAIL;
206 }
207
208 HRESULT WINAPI AVIFileOpenA(
209         PAVIFILE * ppfile,LPCSTR szFile,UINT uMode,LPCLSID lpHandler
210 ) {
211         IAVIFileImpl    *iavi;
212
213         FIXME("(%p,%s,0x%08lx,%s),stub!\n",ppfile,szFile,(DWORD)uMode,debugstr_guid(lpHandler));
214         iavi = (IAVIFileImpl*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IAVIFileImpl));
215         iavi->ref = 1;
216         ICOM_VTBL(iavi) = &iavift;
217         *ppfile = (LPVOID)iavi;
218         return S_OK;
219 }
220
221 static HRESULT WINAPI IAVIStream_fnQueryInterface(IAVIStream*iface,REFIID refiid,LPVOID *obj) {
222         ICOM_THIS(IAVIStreamImpl,iface);
223
224         TRACE_(relay)("(%p)->QueryInterface(%s,%p)\n",This,debugstr_guid(refiid),obj);
225         if (    !memcmp(&IID_IUnknown,refiid,sizeof(IID_IUnknown)) ||
226                 !memcmp(&IID_IAVIStream,refiid,sizeof(IID_IAVIStream))
227         ) {
228                 *obj = This;
229                 return S_OK;
230         }
231         /* can return IGetFrame interface too */
232         return OLE_E_ENUM_NOMORE;
233 }
234
235 static ULONG WINAPI IAVIStream_fnAddRef(IAVIStream*iface) {
236         ICOM_THIS(IAVIStreamImpl,iface);
237         
238         FIXME_(relay)("(%p)->AddRef()\n",iface);
239         return ++(This->ref);
240 }
241
242 static ULONG WINAPI IAVIStream_fnRelease(IAVIStream* iface) {
243         ICOM_THIS(IAVIStreamImpl,iface);
244         
245         FIXME_(relay)("(%p)->Release()\n",iface);
246         if (!--(This->ref)) {
247                 HeapFree(GetProcessHeap(),0,This);
248                 return 0;
249         }
250         return This->ref;
251 }
252
253 static HRESULT WINAPI IAVIStream_fnCreate(IAVIStream*iface,LPARAM lParam1,LPARAM lParam2) {
254         FIXME("(%p)->Create(0x%08lx,0x%08lx)\n",iface,lParam1,lParam2);
255         return E_FAIL;
256 }
257
258 static HRESULT WINAPI IAVIStream_fnInfo(IAVIStream*iface,AVISTREAMINFOW *psi,LONG size) {
259         FIXME("(%p)->Info(%p,%ld)\n",iface,psi,size);
260         return E_FAIL;
261 }
262
263 static LONG WINAPI IAVIStream_fnFindSample(IAVIStream*iface,LONG pos,LONG flags) {
264         FIXME("(%p)->FindSample(%ld,0x%08lx)\n",iface,pos,flags);
265         return E_FAIL;
266 }
267
268 static HRESULT WINAPI IAVIStream_fnReadFormat(IAVIStream*iface,LONG pos,LPVOID format,LONG *formatsize) {
269         FIXME("(%p)->ReadFormat(%ld,%p,%p)\n",iface,pos,format,formatsize);
270         return E_FAIL;
271 }
272
273 /*****************************************************************************
274  *                                              [IAVIStream::SetFormat]
275  */
276 static HRESULT WINAPI IAVIStream_fnSetFormat(IAVIStream*iface,LONG pos,LPVOID format,LONG formatsize) {
277         IAVIStreamImpl  *as = (IAVIStreamImpl*)iface;
278
279         FIXME("(%p)->SetFormat(%ld,%p,%ld)\n",iface,pos,format,formatsize);
280         if (as->lpInputFormat) HeapFree(GetProcessHeap(),0,as->lpInputFormat);
281         as->inputformatsize = formatsize;
282         as->lpInputFormat = HeapAlloc(GetProcessHeap(),0,formatsize);
283         memcpy(as->lpInputFormat,format,formatsize);
284         if (as->iscompressing) {
285                 int     xsize; 
286                 /* Set up the Compressor part */
287                 xsize = ICCompressGetFormatSize(as->hic,as->lpInputFormat);
288                 as->lpCompressFormat = HeapAlloc(GetProcessHeap(),0,xsize);
289                 ICCompressGetFormat(as->hic,as->lpInputFormat,as->lpCompressFormat);
290                 ICCompressBegin(as->hic,as->lpInputFormat,as->lpCompressFormat);
291                 as->compbufsize = ICCompressGetSize(as->hic,as->lpInputFormat,as->lpCompressFormat);
292                 as->compbuffer = HeapAlloc(GetProcessHeap(),0,as->compbufsize);
293
294                 /* Set up the Decompressor part (for prev frames?) */
295                 xsize=ICDecompressGetFormatSize(as->hic,as->lpCompressFormat);
296                 as->decompformat = HeapAlloc(GetProcessHeap(),0,xsize);
297                 ICDecompressGetFormat(as->hic,as->lpCompressFormat,as->decompformat);
298                 as->decompbufsize=((LPBITMAPINFOHEADER)as->decompbuffer)->biSizeImage;
299                 as->decompbuffer = HeapReAlloc(GetProcessHeap(),0,as->decompbuffer,as->decompbufsize);
300                 memset(as->decompbuffer,0xff,as->decompbufsize);
301                 assert(HeapValidate(GetProcessHeap(),0,NULL));
302
303                 ICDecompressGetFormat(as->hic,as->lpCompressFormat,as->decompformat);
304                 ICDecompressBegin(as->hic,as->lpCompressFormat,as->decompformat);
305                 as->lpPrev = as->lpPrevFormat = NULL;
306         }
307         return S_OK;
308 }
309
310 static HRESULT WINAPI IAVIStream_fnRead(IAVIStream*iface,LONG start,LONG samples,LPVOID buffer,LONG buffersize,LONG *bytesread,LONG *samplesread) {
311         FIXME("(%p)->Read(%ld,%ld,%p,%ld,%p,%p)\n",iface,start,samples,buffer,buffersize,bytesread,samplesread);
312         return E_FAIL;
313 }
314
315 static HRESULT WINAPI IAVIStream_fnWrite(IAVIStream*iface,LONG start,LONG samples,LPVOID buffer,LONG buffersize,DWORD flags,LONG *sampwritten,LONG *byteswritten) {
316         IAVIStreamImpl  *as = (IAVIStreamImpl*)iface;
317         DWORD           ckid,xflags;
318
319         FIXME("(%p)->Write(%ld,%ld,%p,%ld,0x%08lx,%p,%p)\n",iface,start,samples,buffer,buffersize,flags,sampwritten,byteswritten);
320
321         ICCompress(
322                 as->hic,flags,
323                 as->lpCompressFormat,
324                 as->compbuffer,
325                 as->lpInputFormat,buffer,
326                 &ckid,&xflags,
327                 as->curframe,0xffffff/*framesize*/,as->aco.dwQuality,
328                 as->lpPrevFormat,as->lpPrev
329         );
330         ICDecompress(
331                 as->hic,
332                 flags,  /* FIXME: check */
333                 as->lpCompressFormat,
334                 as->compbuffer,
335                 as->decompformat,
336                 as->decompbuffer
337         );
338         /* We now have a prev format for the next compress ... */
339         as->lpPrevFormat = as->decompformat;
340         as->lpPrev = as->decompbuffer;
341         return S_OK;
342 }
343
344 static HRESULT WINAPI IAVIStream_fnDelete(IAVIStream*iface,LONG start,LONG samples) {
345         FIXME("(%p)->Delete(%ld,%ld)\n",iface,start,samples);
346         return E_FAIL;
347 }
348 static HRESULT WINAPI IAVIStream_fnReadData(IAVIStream*iface,DWORD fcc,LPVOID lp,LONG *lpread) {
349         FIXME("(%p)->ReadData(0x%08lx,%p,%p)\n",iface,fcc,lp,lpread);
350         return E_FAIL;
351 }
352
353 static HRESULT WINAPI IAVIStream_fnWriteData(IAVIStream*iface,DWORD fcc,LPVOID lp,LONG size) {
354         FIXME("(%p)->WriteData(0x%08lx,%p,%ld)\n",iface,fcc,lp,size);
355         return E_FAIL;
356 }
357
358 static HRESULT WINAPI IAVIStream_fnSetInfo(IAVIStream*iface,AVISTREAMINFOW*info,LONG infolen) {
359         FIXME("(%p)->SetInfo(%p,%ld)\n",iface,info,infolen);
360         return E_FAIL;
361 }
362
363 HRESULT WINAPI AVIFileCreateStreamA(PAVIFILE iface,PAVISTREAM *ppavi,AVISTREAMINFOA * psi) {
364         AVISTREAMINFOW  psiw;
365         
366         /* Only the szName at the end is different */
367         memcpy(&psiw,psi,sizeof(*psi)-sizeof(psi->szName));
368         lstrcpynAtoW(psiw.szName,psi->szName,sizeof(psi->szName));
369         return IAVIFile_CreateStream(iface,ppavi,&psiw);
370 }
371
372 HRESULT WINAPI AVIFileCreateStreamW(IAVIFile*iface,PAVISTREAM*avis,AVISTREAMINFOW*asi) {
373         return IAVIFile_CreateStream(iface,avis,asi);
374 }
375
376
377 HRESULT WINAPI AVIFileGetStream(IAVIFile*iface,PAVISTREAM*avis,DWORD fccType,LONG lParam) {
378         return IAVIFile_GetStream(iface,avis,fccType,lParam);
379 }
380
381 HRESULT WINAPI AVIFileInfoA(PAVIFILE iface,LPAVIFILEINFOA afi,LONG size) {
382         AVIFILEINFOW    afiw;
383         HRESULT         hres;
384
385         if (size < sizeof(AVIFILEINFOA))
386                 return AVIERR_BADSIZE;
387         hres = IAVIFile_Info(iface,&afiw,sizeof(afiw));
388         memcpy(afi,&afiw,sizeof(*afi)-sizeof(afi->szFileType));
389         lstrcpynWtoA(afi->szFileType,afiw.szFileType,sizeof(afi->szFileType));
390         return hres;
391 }
392
393 HRESULT WINAPI AVIStreamInfoW(PAVISTREAM iface,AVISTREAMINFOW *asi,LONG
394  size) {
395         return IAVIFile_Info(iface,asi,size);
396 }
397
398 HRESULT WINAPI AVIStreamInfoA(PAVISTREAM iface,AVISTREAMINFOA *asi,LONG
399  size) {
400         AVISTREAMINFOW  asiw;
401         HRESULT                 hres;
402
403         if (size<sizeof(AVISTREAMINFOA))
404                 return AVIERR_BADSIZE;
405         hres = IAVIFile_Info(iface,&asiw,sizeof(asiw));
406         memcpy(asi,&asiw,sizeof(asiw)-sizeof(asiw.szName));
407         lstrcpynWtoA(asi->szName,asiw.szName,sizeof(asi->szName));
408         return hres;
409 }
410
411 HRESULT WINAPI AVIFileInfoW(PAVIFILE iface,LPAVIFILEINFOW afi,LONG size) {
412         return IAVIFile_Info(iface,afi,size);
413 }
414
415 HRESULT WINAPI AVIMakeCompressedStream(PAVISTREAM *ppsCompressed,PAVISTREAM ppsSource,AVICOMPRESSOPTIONS *aco,CLSID *pclsidHandler) {
416         char                    fcc[5];
417         IAVIStreamImpl  *as;
418         FIXME("(%p,%p,%p,%p)\n",ppsCompressed,ppsSource,aco,pclsidHandler);
419         fcc[4]='\0';
420         memcpy(fcc,&(aco->fccType),4);
421         FIXME("\tfccType: '%s'\n",fcc);
422         memcpy(fcc,&(aco->fccHandler),4);
423         FIXME("\tfccHandler: '%s'\n",fcc);
424         FIXME("\tdwFlags: 0x%08lx\n",aco->dwFlags);
425
426         /* we just create a duplicate for now */
427         IAVIStream_AddRef(ppsSource);
428         *ppsCompressed = ppsSource;
429         as = (IAVIStreamImpl*)ppsSource;
430
431         /* this is where the fun begins. Open a compressor and prepare it. */
432         as->hic = ICOpen(aco->fccType,aco->fccHandler,ICMODE_COMPRESS);
433
434         /* May happen. for instance if the codec is not able to compress */
435         if (!as->hic) 
436                 return AVIERR_UNSUPPORTED;
437
438         ICGetInfo(as->hic,&(as->icinfo),sizeof(ICINFO));
439         FIXME("Opened compressor: '%s' '%s'\n",debugstr_w(as->icinfo.szName),debugstr_w(as->icinfo.szDescription));
440         as->iscompressing = TRUE;
441         memcpy(&(as->aco),aco,sizeof(*aco));
442         if (as->icinfo.dwFlags & VIDCF_COMPRESSFRAMES) {
443                 ICCOMPRESSFRAMES        icf;
444
445                 /* now what to fill in there ... Hmm */
446                 memset(&icf,0,sizeof(icf));
447                 icf.lDataRate   = aco->dwBytesPerSecond;
448                 icf.lQuality    = aco->dwQuality;
449                 icf.lKeyRate    = aco->dwKeyFrameEvery;
450
451                 icf.GetData = (LONG (*)(LPARAM,LONG,LPVOID,LONG)) 0xdead4242;
452                 icf.PutData = (LONG (*)(LPARAM,LONG,LPVOID,LONG)) 0xdead4243;
453                 ICSendMessage(as->hic,ICM_COMPRESS_FRAMES_INFO,(LPARAM)&icf,sizeof(icf));
454         }
455         return S_OK;
456 }
457
458 HRESULT WINAPI AVIStreamSetFormat(PAVISTREAM iface,LONG pos,LPVOID format,LONG formatsize) {
459         return IAVIStream_SetFormat(iface,pos,format,formatsize);
460 }
461
462 HRESULT WINAPI AVIStreamReadFormat(PAVISTREAM iface,LONG pos,LPVOID format,LONG *formatsize) {
463         return IAVIStream_ReadFormat(iface,pos,format,formatsize);
464 }
465
466 HRESULT WINAPI AVIStreamWrite(PAVISTREAM iface,LONG start,LONG samples,LPVOID buffer,LONG buffersize,DWORD flags,LONG *sampwritten,LONG *byteswritten) {
467         return IAVIStream_Write(iface,start,samples,buffer,buffersize,flags,sampwritten,byteswritten);
468 }
469
470 HRESULT WINAPI AVIStreamRead(PAVISTREAM iface,LONG start,LONG samples,LPVOID buffer,LONG buffersize,LONG *bytesread,LONG *samplesread) {
471         return IAVIStream_Read(iface,start,samples,buffer,buffersize,bytesread,samplesread);
472 }
473
474 HRESULT WINAPI AVIStreamWriteData(PAVISTREAM iface,DWORD fcc,LPVOID lp,LONG size) {
475         return IAVIStream_WriteData(iface,fcc,lp,size);
476 }
477
478 HRESULT WINAPI AVIStreamReadData(PAVISTREAM iface,DWORD fcc,LPVOID lp,LONG *lpread) {
479         return IAVIStream_ReadData(iface,fcc,lp,lpread);
480 }
481
482 LONG WINAPI AVIStreamStart(PAVISTREAM iface) {
483         AVISTREAMINFOW  si;
484
485         IAVIStream_Info(iface,&si,sizeof(si));
486         return si.dwStart;
487 }
488
489 LONG WINAPI AVIStreamLength(PAVISTREAM iface) {
490         AVISTREAMINFOW  si;
491         HRESULT                 ret;
492
493         ret = IAVIStream_Info(iface,&si,sizeof(si));
494         if (ret) /* error */
495                 return 1;
496         return si.dwLength;
497 }
498
499 ULONG WINAPI AVIStreamRelease(PAVISTREAM iface) {
500         return IAVIStream_Release(iface);
501 }
502
503 PGETFRAME WINAPI AVIStreamGetFrameOpen(PAVISTREAM iface,LPBITMAPINFOHEADER bmi) {
504         FIXME_(msvideo)("(%p)->(%p),stub!\n",iface,bmi);
505         return NULL;
506 }
507
508 LPVOID WINAPI AVIStreamGetFrame(PGETFRAME pg,LONG pos) {
509         return IGetFrame_GetFrame(pg,pos);
510 }
511
512 HRESULT WINAPI AVIStreamGetFrameClose(PGETFRAME pg) {
513         if (pg) IGetFrame_Release(pg);
514         return 0;
515 }
516
517 ULONG WINAPI AVIFileRelease(PAVIFILE iface) {
518         return IAVIFile_Release(iface);
519 }
520
521 void WINAPI AVIFileExit(void) {
522         FIXME("(), stub.\n");
523 }