Correct usage of a scratch array in X11DRV_PolyBezier.
[wine/multimedia.git] / dlls / avifil32 / avifile.c
blob3349f07bfdf7dbd12855c676b5c7241218755a87
1 /*
2 * Copyright 1999 Marcus Meissner
3 */
4 #include <string.h>
5 #include <stdio.h>
6 #include <assert.h>
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"
17 DECLARE_DEBUG_CHANNEL(avifile)
18 DECLARE_DEBUG_CHANNEL(msvideo)
19 DECLARE_DEBUG_CHANNEL(relay)
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);
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
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);
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
79 typedef struct IAVIStreamImpl {
80 /* IUnknown stuff */
81 ICOM_VTABLE(IAVIStream)* lpvtbl;
82 DWORD ref;
83 /* IAVIStream stuff */
84 LPVOID lpInputFormat;
85 DWORD inputformatsize;
86 BOOL iscompressing;
87 DWORD curframe;
89 /* Compressor stuff */
90 HIC hic;
91 LPVOID lpCompressFormat;
92 ICINFO icinfo;
93 DWORD compbufsize;
94 LPVOID compbuffer;
96 DWORD decompbufsize;
97 LPVOID decompbuffer;
98 LPVOID decompformat;
99 AVICOMPRESSOPTIONS aco;
101 LPVOID lpPrev; /* pointer to decompressed frame later */
102 LPVOID lpPrevFormat; /* pointer to decompressed info later */
103 } IAVIStreamImpl;
105 void WINAPI
106 AVIFileInit(void) {
107 FIXME_(avifile)("(),stub!\n");
110 typedef struct IAVIFileImpl {
111 /* IUnknown stuff */
112 ICOM_VTABLE(IAVIFile)* lpvtbl;
113 DWORD ref;
114 /* IAVIFile stuff... */
115 } IAVIFileImpl;
117 static HRESULT WINAPI IAVIFile_fnQueryInterface(IAVIFile* iface,REFIID refiid,LPVOID *obj) {
118 ICOM_THIS(IAVIFileImpl,iface);
119 char xrefiid[50];
121 WINE_StringFromCLSID((LPCLSID)refiid,xrefiid);
122 TRACE_(relay)("(%p)->QueryInterface(%s,%p)\n",This,xrefiid,obj);
123 if ( !memcmp(&IID_IUnknown,refiid,sizeof(IID_IUnknown)) ||
124 !memcmp(&IID_IAVIFile,refiid,sizeof(IID_IAVIFile))
126 *obj = iface;
127 return S_OK;
129 return OLE_E_ENUM_NOMORE;
132 static ULONG WINAPI IAVIFile_fnAddRef(IAVIFile* iface) {
133 ICOM_THIS(IAVIFileImpl,iface);
135 FIXME_(relay)("(%p)->AddRef()\n",iface);
136 return ++(This->ref);
139 static ULONG WINAPI IAVIFile_fnRelease(IAVIFile* iface) {
140 ICOM_THIS(IAVIFileImpl,iface);
142 FIXME_(relay)("(%p)->Release()\n",iface);
143 if (!--(This->ref)) {
144 HeapFree(GetProcessHeap(),0,iface);
145 return 0;
147 return This->ref;
150 static HRESULT WINAPI IAVIFile_fnInfo(IAVIFile*iface,AVIFILEINFOW*afi,LONG size) {
151 FIXME_(avifile)("(%p)->Info(%p,%ld)\n",iface,afi,size);
153 /* FIXME: fill out struct? */
154 return E_FAIL;
157 static HRESULT WINAPI IAVIFile_fnGetStream(IAVIFile*iface,PAVISTREAM*avis,DWORD fccType,LONG lParam) {
158 FIXME_(avifile)("(%p)->GetStream(%p,0x%08lx,%ld)\n",iface,avis,fccType,lParam);
159 /* FIXME: create interface etc. */
160 return E_FAIL;
163 static HRESULT WINAPI IAVIFile_fnCreateStream(IAVIFile*iface,PAVISTREAM*avis,AVISTREAMINFOW*asi) {
164 ICOM_THIS(IAVIStreamImpl,iface);
165 char fcc[5];
166 IAVIStreamImpl *istream;
168 FIXME_(avifile)("(%p,%p,%p)\n",This,avis,asi);
169 istream = (IAVIStreamImpl*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IAVIStreamImpl));
170 istream->ref = 1;
171 istream->lpvtbl = &iavist;
172 fcc[4]='\0';
173 memcpy(fcc,(char*)&(asi->fccType),4);
174 FIXME_(avifile)("\tfccType '%s'\n",fcc);
175 memcpy(fcc,(char*)&(asi->fccHandler),4);
176 FIXME_(avifile)("\tfccHandler '%s'\n",fcc);
177 FIXME_(avifile)("\tdwFlags 0x%08lx\n",asi->dwFlags);
178 FIXME_(avifile)("\tdwCaps 0x%08lx\n",asi->dwCaps);
179 FIXME_(avifile)("\tname '%s'\n",debugstr_w(asi->szName));
181 istream->curframe = 0;
182 *avis = (PAVISTREAM)istream;
183 return S_OK;
186 static HRESULT WINAPI IAVIFile_fnWriteData(IAVIFile*iface,DWORD ckid,LPVOID lpData,LONG size) {
187 FIXME_(avifile)("(%p)->WriteData(0x%08lx,%p,%ld)\n",iface,ckid,lpData,size);
188 /* FIXME: write data to file */
189 return E_FAIL;
192 static HRESULT WINAPI IAVIFile_fnReadData(IAVIFile*iface,DWORD ckid,LPVOID lpData,LONG *size) {
193 FIXME_(avifile)("(%p)->ReadData(0x%08lx,%p,%p)\n",iface,ckid,lpData,size);
194 /* FIXME: read at most size bytes from file */
195 return E_FAIL;
198 static HRESULT WINAPI IAVIFile_fnEndRecord(IAVIFile*iface) {
199 FIXME_(avifile)("(%p)->EndRecord()\n",iface);
200 /* FIXME: end record? */
201 return E_FAIL;
204 static HRESULT WINAPI IAVIFile_fnDeleteStream(IAVIFile*iface,DWORD fccType,LONG lParam) {
205 FIXME_(avifile)("(%p)->DeleteStream(0x%08lx,%ld)\n",iface,fccType,lParam);
206 /* FIXME: delete stream? */
207 return E_FAIL;
210 HRESULT WINAPI AVIFileOpenA(
211 PAVIFILE * ppfile,LPCSTR szFile,UINT uMode,LPCLSID lpHandler
213 char buf[80];
214 IAVIFileImpl *iavi;
217 if (HIWORD(lpHandler))
218 WINE_StringFromCLSID(lpHandler,buf);
219 else
220 sprintf(buf,"<clsid-0x%04lx>",(DWORD)lpHandler);
222 FIXME_(avifile)("(%p,%s,0x%08lx,%s),stub!\n",ppfile,szFile,(DWORD)uMode,buf);
223 iavi = (IAVIFileImpl*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IAVIFileImpl));
224 iavi->ref = 1;
225 iavi->lpvtbl = &iavift;
226 *ppfile = (LPVOID)iavi;
227 return S_OK;
230 static HRESULT WINAPI IAVIStream_fnQueryInterface(IAVIStream*iface,REFIID refiid,LPVOID *obj) {
231 ICOM_THIS(IAVIStreamImpl,iface);
232 char xrefiid[50];
234 WINE_StringFromCLSID((LPCLSID)refiid,xrefiid);
235 TRACE_(relay)("(%p)->QueryInterface(%s,%p)\n",This,xrefiid,obj);
236 if ( !memcmp(&IID_IUnknown,refiid,sizeof(IID_IUnknown)) ||
237 !memcmp(&IID_IAVIStream,refiid,sizeof(IID_IAVIStream))
239 *obj = This;
240 return S_OK;
242 /* can return IGetFrame interface too */
243 return OLE_E_ENUM_NOMORE;
246 static ULONG WINAPI IAVIStream_fnAddRef(IAVIStream*iface) {
247 ICOM_THIS(IAVIStreamImpl,iface);
249 FIXME_(relay)("(%p)->AddRef()\n",iface);
250 return ++(This->ref);
253 static ULONG WINAPI IAVIStream_fnRelease(IAVIStream* iface) {
254 ICOM_THIS(IAVIStreamImpl,iface);
256 FIXME_(relay)("(%p)->Release()\n",iface);
257 if (!--(This->ref)) {
258 HeapFree(GetProcessHeap(),0,This);
259 return 0;
261 return This->ref;
264 static HRESULT WINAPI IAVIStream_fnCreate(IAVIStream*iface,LPARAM lParam1,LPARAM lParam2) {
265 FIXME_(avifile)("(%p)->Create(0x%08lx,0x%08lx)\n",iface,lParam1,lParam2);
266 return E_FAIL;
269 static HRESULT WINAPI IAVIStream_fnInfo(IAVIStream*iface,AVISTREAMINFOW *psi,LONG size) {
270 FIXME_(avifile)("(%p)->Info(%p,%ld)\n",iface,psi,size);
271 return E_FAIL;
274 static LONG WINAPI IAVIStream_fnFindSample(IAVIStream*iface,LONG pos,LONG flags) {
275 FIXME_(avifile)("(%p)->FindSample(%ld,0x%08lx)\n",iface,pos,flags);
276 return E_FAIL;
279 static HRESULT WINAPI IAVIStream_fnReadFormat(IAVIStream*iface,LONG pos,LPVOID format,LONG *formatsize) {
280 FIXME_(avifile)("(%p)->ReadFormat(%ld,%p,%p)\n",iface,pos,format,formatsize);
281 return E_FAIL;
284 /*****************************************************************************
285 * [IAVIStream::SetFormat]
287 static HRESULT WINAPI IAVIStream_fnSetFormat(IAVIStream*iface,LONG pos,LPVOID format,LONG formatsize) {
288 IAVIStreamImpl *as = (IAVIStreamImpl*)iface;
290 FIXME_(avifile)("(%p)->SetFormat(%ld,%p,%ld)\n",iface,pos,format,formatsize);
291 if (as->lpInputFormat) HeapFree(GetProcessHeap(),0,as->lpInputFormat);
292 as->inputformatsize = formatsize;
293 as->lpInputFormat = HeapAlloc(GetProcessHeap(),0,formatsize);
294 memcpy(as->lpInputFormat,format,formatsize);
295 if (as->iscompressing) {
296 int xsize;
297 /* Set up the Compressor part */
298 xsize = ICCompressGetFormatSize(as->hic,as->lpInputFormat);
299 as->lpCompressFormat = HeapAlloc(GetProcessHeap(),0,xsize);
300 ICCompressGetFormat(as->hic,as->lpInputFormat,as->lpCompressFormat);
301 ICCompressBegin(as->hic,as->lpInputFormat,as->lpCompressFormat);
302 as->compbufsize = ICCompressGetSize(as->hic,as->lpInputFormat,as->lpCompressFormat);
303 as->compbuffer = HeapAlloc(GetProcessHeap(),0,as->compbufsize);
305 /* Set up the Decompressor part (for prev frames?) */
306 xsize=ICDecompressGetFormatSize(as->hic,as->lpCompressFormat);
307 as->decompformat = HeapAlloc(GetProcessHeap(),0,xsize);
308 ICDecompressGetFormat(as->hic,as->lpCompressFormat,as->decompformat);
309 as->decompbufsize=((LPBITMAPINFOHEADER)as->decompbuffer)->biSizeImage;
310 as->decompbuffer = HeapReAlloc(GetProcessHeap(),0,as->decompbuffer,as->decompbufsize);
311 memset(as->decompbuffer,0xff,as->decompbufsize);
312 assert(HeapValidate(GetProcessHeap(),0,NULL));
314 ICDecompressGetFormat(as->hic,as->lpCompressFormat,as->decompformat);
315 ICDecompressBegin(as->hic,as->lpCompressFormat,as->decompformat);
316 as->lpPrev = as->lpPrevFormat = NULL;
318 return S_OK;
321 static HRESULT WINAPI IAVIStream_fnRead(IAVIStream*iface,LONG start,LONG samples,LPVOID buffer,LONG buffersize,LONG *bytesread,LONG *samplesread) {
322 FIXME_(avifile)("(%p)->Read(%ld,%ld,%p,%ld,%p,%p)\n",iface,start,samples,buffer,buffersize,bytesread,samplesread);
323 return E_FAIL;
326 static HRESULT WINAPI IAVIStream_fnWrite(IAVIStream*iface,LONG start,LONG samples,LPVOID buffer,LONG buffersize,DWORD flags,LONG *sampwritten,LONG *byteswritten) {
327 IAVIStreamImpl *as = (IAVIStreamImpl*)iface;
328 DWORD ckid,xflags;
330 FIXME_(avifile)("(%p)->Write(%ld,%ld,%p,%ld,0x%08lx,%p,%p)\n",iface,start,samples,buffer,buffersize,flags,sampwritten,byteswritten);
332 ICCompress(
333 as->hic,flags,
334 as->lpCompressFormat,
335 as->compbuffer,
336 as->lpInputFormat,buffer,
337 &ckid,&xflags,
338 as->curframe,0xffffff/*framesize*/,as->aco.dwQuality,
339 as->lpPrevFormat,as->lpPrev
341 ICDecompress(
342 as->hic,
343 flags, /* FIXME: check */
344 as->lpCompressFormat,
345 as->compbuffer,
346 as->decompformat,
347 as->decompbuffer
349 /* We now have a prev format for the next compress ... */
350 as->lpPrevFormat = as->decompformat;
351 as->lpPrev = as->decompbuffer;
352 return S_OK;
355 static HRESULT WINAPI IAVIStream_fnDelete(IAVIStream*iface,LONG start,LONG samples) {
356 FIXME_(avifile)("(%p)->Delete(%ld,%ld)\n",iface,start,samples);
357 return E_FAIL;
359 static HRESULT WINAPI IAVIStream_fnReadData(IAVIStream*iface,DWORD fcc,LPVOID lp,LONG *lpread) {
360 FIXME_(avifile)("(%p)->ReadData(0x%08lx,%p,%p)\n",iface,fcc,lp,lpread);
361 return E_FAIL;
364 static HRESULT WINAPI IAVIStream_fnWriteData(IAVIStream*iface,DWORD fcc,LPVOID lp,LONG size) {
365 FIXME_(avifile)("(%p)->WriteData(0x%08lx,%p,%ld)\n",iface,fcc,lp,size);
366 return E_FAIL;
369 static HRESULT WINAPI IAVIStream_fnSetInfo(IAVIStream*iface,AVISTREAMINFOW*info,LONG infolen) {
370 FIXME_(avifile)("(%p)->SetInfo(%p,%ld)\n",iface,info,infolen);
371 return E_FAIL;
374 HRESULT WINAPI AVIFileCreateStreamA(PAVIFILE iface,PAVISTREAM *ppavi,AVISTREAMINFOA * psi) {
375 AVISTREAMINFOW psiw;
377 /* Only the szName at the end is different */
378 memcpy(&psiw,psi,sizeof(*psi)-sizeof(psi->szName));
379 lstrcpynAtoW(psiw.szName,psi->szName,sizeof(psi->szName));
380 return iface->lpvtbl->fnCreateStream(iface,ppavi,&psiw);
383 HRESULT WINAPI AVIFileCreateStreamW(IAVIFile*iface,PAVISTREAM*avis,AVISTREAMINFOW*asi) {
384 return iface->lpvtbl->fnCreateStream(iface,avis,asi);
388 HRESULT WINAPI AVIFileGetStream(IAVIFile*iface,PAVISTREAM*avis,DWORD fccType,LONG lParam) {
389 return iface->lpvtbl->fnGetStream(iface,avis,fccType,lParam);
392 HRESULT WINAPI AVIFileInfoA(PAVIFILE iface,LPAVIFILEINFOA afi,LONG size) {
393 AVIFILEINFOW afiw;
394 HRESULT hres;
396 if (size < sizeof(AVIFILEINFOA))
397 return AVIERR_BADSIZE;
398 hres = iface->lpvtbl->fnInfo(iface,&afiw,sizeof(afiw));
399 memcpy(afi,&afiw,sizeof(*afi)-sizeof(afi->szFileType));
400 lstrcpynWtoA(afi->szFileType,afiw.szFileType,sizeof(afi->szFileType));
401 return hres;
404 HRESULT WINAPI AVIStreamInfoW(PAVISTREAM iface,AVISTREAMINFOW *asi,LONG
405 size) {
406 return iface->lpvtbl->fnInfo(iface,asi,size);
409 HRESULT WINAPI AVIStreamInfoA(PAVISTREAM iface,AVISTREAMINFOA *asi,LONG
410 size) {
411 AVISTREAMINFOW asiw;
412 HRESULT hres;
414 if (size<sizeof(AVISTREAMINFOA))
415 return AVIERR_BADSIZE;
416 hres = iface->lpvtbl->fnInfo(iface,&asiw,sizeof(asiw));
417 memcpy(asi,&asiw,sizeof(asiw)-sizeof(asiw.szName));
418 lstrcpynWtoA(asi->szName,asiw.szName,sizeof(asi->szName));
419 return hres;
422 HRESULT WINAPI AVIFileInfoW(PAVIFILE iface,LPAVIFILEINFOW afi,LONG size) {
423 return iface->lpvtbl->fnInfo(iface,afi,size);
426 HRESULT WINAPI AVIMakeCompressedStream(PAVISTREAM *ppsCompressed,PAVISTREAM ppsSource,AVICOMPRESSOPTIONS *aco,CLSID *pclsidHandler) {
427 char fcc[5];
428 IAVIStreamImpl *as;
429 FIXME_(avifile)("(%p,%p,%p,%p)\n",ppsCompressed,ppsSource,aco,pclsidHandler);
430 fcc[4]='\0';
431 memcpy(fcc,&(aco->fccType),4);
432 FIXME_(avifile)("\tfccType: '%s'\n",fcc);
433 memcpy(fcc,&(aco->fccHandler),4);
434 FIXME_(avifile)("\tfccHandler: '%s'\n",fcc);
435 FIXME_(avifile)("\tdwFlags: 0x%08lx\n",aco->dwFlags);
437 /* we just create a duplicate for now */
438 ((IUnknown*)ppsSource)->lpvtbl->fnAddRef((IUnknown*)ppsSource);
439 *ppsCompressed = ppsSource;
440 as = (IAVIStreamImpl*)ppsSource;
442 /* this is where the fun begins. Open a compressor and prepare it. */
443 as->hic = ICOpen(aco->fccType,aco->fccHandler,ICMODE_COMPRESS);
445 /* May happen. for instance if the codec is not able to compress */
446 if (!as->hic)
447 return AVIERR_UNSUPPORTED;
449 ICGetInfo(as->hic,&(as->icinfo),sizeof(ICINFO));
450 FIXME_(avifile)("Opened compressor: '%s' '%s'\n",debugstr_w(as->icinfo.szName),debugstr_w(as->icinfo.szDescription));
451 as->iscompressing = TRUE;
452 memcpy(&(as->aco),aco,sizeof(*aco));
453 if (as->icinfo.dwFlags & VIDCF_COMPRESSFRAMES) {
454 ICCOMPRESSFRAMES icf;
456 /* now what to fill in there ... Hmm */
457 memset(&icf,0,sizeof(icf));
458 icf.lDataRate = aco->dwBytesPerSecond;
459 icf.lQuality = aco->dwQuality;
460 icf.lKeyRate = aco->dwKeyFrameEvery;
462 icf.GetData = (LONG (*)(LPARAM,LONG,LPVOID,LONG)) 0xdead4242;
463 icf.PutData = (LONG (*)(LPARAM,LONG,LPVOID,LONG)) 0xdead4243;
464 ICSendMessage(as->hic,ICM_COMPRESS_FRAMES_INFO,(LPARAM)&icf,sizeof(icf));
466 return S_OK;
469 HRESULT WINAPI AVIStreamSetFormat(PAVISTREAM iface,LONG pos,LPVOID format,LONG formatsize) {
470 return iface->lpvtbl->fnSetFormat(iface,pos,format,formatsize);
473 HRESULT WINAPI AVIStreamReadFormat(PAVISTREAM iface,LONG pos,LPVOID format,LONG *formatsize) {
474 return iface->lpvtbl->fnReadFormat(iface,pos,format,formatsize);
477 HRESULT WINAPI AVIStreamWrite(PAVISTREAM iface,LONG start,LONG samples,LPVOID buffer,LONG buffersize,DWORD flags,LONG *sampwritten,LONG *byteswritten) {
478 return iface->lpvtbl->fnWrite(iface,start,samples,buffer,buffersize,flags,sampwritten,byteswritten);
481 HRESULT WINAPI AVIStreamRead(PAVISTREAM iface,LONG start,LONG samples,LPVOID buffer,LONG buffersize,LONG *bytesread,LONG *samplesread) {
482 return iface->lpvtbl->fnRead(iface,start,samples,buffer,buffersize,bytesread,samplesread);
485 HRESULT WINAPI AVIStreamWriteData(PAVISTREAM iface,DWORD fcc,LPVOID lp,LONG size) {
486 return iface->lpvtbl->fnWriteData(iface,fcc,lp,size);
489 HRESULT WINAPI AVIStreamReadData(PAVISTREAM iface,DWORD fcc,LPVOID lp,LONG *lpread) {
490 return iface->lpvtbl->fnReadData(iface,fcc,lp,lpread);
493 LONG WINAPI AVIStreamStart(PAVISTREAM iface) {
494 AVISTREAMINFOW si;
496 iface->lpvtbl->fnInfo(iface,&si,sizeof(si));
497 return si.dwStart;
500 LONG WINAPI AVIStreamLength(PAVISTREAM iface) {
501 AVISTREAMINFOW si;
502 HRESULT ret;
504 ret = iface->lpvtbl->fnInfo(iface,&si,sizeof(si));
505 if (ret) /* error */
506 return 1;
507 return si.dwLength;
510 ULONG WINAPI AVIStreamRelease(PAVISTREAM iface) {
511 return ((LPUNKNOWN)iface)->lpvtbl->fnRelease((LPUNKNOWN)iface);
514 PGETFRAME WINAPI AVIStreamGetFrameOpen(PAVISTREAM iface,LPBITMAPINFOHEADER bmi) {
515 FIXME_(msvideo)("(%p)->(%p),stub!\n",iface,bmi);
516 return NULL;
519 LPVOID WINAPI AVIStreamGetFrame(PGETFRAME pg,LONG pos) {
520 return pg->lpvtbl->fnGetFrame(pg,pos);
523 HRESULT WINAPI AVIStreamGetFrameClose(PGETFRAME pg) {
524 if (pg) ((LPUNKNOWN)pg)->lpvtbl->fnRelease((LPUNKNOWN)pg);
525 return 0;
528 ULONG WINAPI AVIFileRelease(PAVIFILE iface) {
529 return ((LPUNKNOWN)iface)->lpvtbl->fnRelease((LPUNKNOWN)iface);
532 void WINAPI AVIFileExit(void) {
533 FIXME_(avifile)("(), stub.\n");