2 * Copyright 1999 Marcus Meissner
3 * Copyright 2001 Hidenori TAKESHIMA <hidenori@a2.ctktv.ne.jp>
16 #include "debugtools.h"
18 DEFAULT_DEBUG_CHANNEL(avifile);
20 #include "avifile_private.h"
23 /***********************************************************************
24 * AVIFileInit (AVIFILE.100)
25 * AVIFileInit (AVIFIL32.@)
27 void WINAPI AVIFileInit(void)
30 if ( AVIFILE_data.dwAVIFileRef == 0 )
32 if ( FAILED(CoInitialize(NULL)) )
33 AVIFILE_data.fInitCOM = FALSE;
35 AVIFILE_data.fInitCOM = TRUE;
37 AVIFILE_data.dwAVIFileRef ++;
40 /***********************************************************************
41 * AVIFileExit (AVIFILE.101)
42 * AVIFileExit (AVIFIL32.@)
44 void WINAPI AVIFileExit(void)
47 if ( AVIFILE_data.dwAVIFileRef == 0 )
49 ERR( "unexpected AVIFileExit()\n" );
53 AVIFILE_data.dwAVIFileRef --;
54 if ( AVIFILE_data.dwAVIFileRef == 0 )
56 if ( AVIFILE_data.fInitCOM )
59 AVIFILE_data.fInitCOM = FALSE;
64 /***********************************************************************
65 * AVIFileAddRef (AVIFIL32.@)
67 ULONG WINAPI AVIFileAddRef(PAVIFILE pfile)
69 return IAVIFile_AddRef( pfile );
72 /***********************************************************************
73 * AVIFileRelease (AVIFILE.141)
74 * AVIFileRelease (AVIFIL32.@)
76 ULONG WINAPI AVIFileRelease(PAVIFILE pfile)
78 return IAVIFile_Release( pfile );
81 /***********************************************************************
82 * AVIFileOpenA (AVIFILE.102)
83 * AVIFileOpenA (AVIFIL32.@)
85 HRESULT WINAPI AVIFileOpenA(
86 PAVIFILE* ppfile,LPCSTR szFile,UINT uMode,LPCLSID lpHandler )
91 TRACE("(%p,%p,%u,%p)\n",ppfile,szFile,uMode,lpHandler);
92 pwsz = AVIFILE_strdupAtoW( szFile );
95 hr = AVIFileOpenW(ppfile,pwsz,uMode,lpHandler);
96 HeapFree( AVIFILE_data.hHeap, 0, pwsz );
100 /***********************************************************************
101 * AVIFileOpenW (AVIFIL32.@)
103 HRESULT WINAPI AVIFileOpenW(
104 PAVIFILE* ppfile,LPCWSTR szFile,UINT uMode,LPCLSID lpHandler )
110 TRACE("(%p,%p,%u,%p)\n",ppfile,szFile,uMode,lpHandler);
111 *ppfile = (PAVIFILE)NULL;
113 if ( lpHandler == NULL )
115 /* FIXME - check RIFF type and get a handler from registry
116 * if IAVIFile::Open is worked...
118 memcpy( &clsRIFF, &CLSID_AVIFile, sizeof(CLSID) );
119 lpHandler = &clsRIFF;
123 * FIXME - MS says IAVIFile::Open will be called,
124 * but no such method in vfw.h... why????
126 if ( !IsEqualGUID( lpHandler, &CLSID_AVIFile ) )
127 return REGDB_E_CLASSNOTREG;
129 hr = AVIFILE_DllGetClassObject(&CLSID_AVIFile,
130 &IID_IClassFactory,(void**)&pcf);
134 hr = IClassFactory_CreateInstance( pcf, NULL, &IID_IAVIFile,
136 IClassFactory_Release( pcf );
141 hr = AVIFILE_IAVIFile_Open( *ppfile, szFile, uMode );
144 IAVIFile_Release( (*ppfile) );
152 /***********************************************************************
153 * AVIFileInfoW (AVIFIL32.@)
155 HRESULT WINAPI AVIFileInfoW(PAVIFILE pfile,AVIFILEINFOW* pfi,LONG lSize)
157 return IAVIFile_Info( pfile, pfi, lSize );
160 /***********************************************************************
161 * AVIFileInfoA (AVIFIL32.@)
163 HRESULT WINAPI AVIFileInfoA(PAVIFILE pfile,AVIFILEINFOA* pfi,LONG lSize)
168 if ( lSize < sizeof(AVIFILEINFOA) )
169 return AVIERR_BADSIZE;
170 hr = AVIFileInfoW( pfile, &fiw, sizeof(AVIFILEINFOW) );
173 memcpy( pfi,&fiw,sizeof(AVIFILEINFOA) );
174 AVIFILE_strncpyWtoA( pfi->szFileType, fiw.szFileType,
175 sizeof(pfi->szFileType) );
176 pfi->szFileType[sizeof(pfi->szFileType)-1] = 0;
181 /***********************************************************************
182 * AVIFileGetStream (AVIFILE.143)
183 * AVIFileGetStream (AVIFIL32.@)
185 HRESULT WINAPI AVIFileGetStream(PAVIFILE pfile,PAVISTREAM* pas,DWORD fccType,LONG lParam)
187 return IAVIFile_GetStream(pfile,pas,fccType,lParam);
190 /***********************************************************************
191 * AVIFileCreateStreamW (AVIFIL32.@)
193 HRESULT WINAPI AVIFileCreateStreamW(PAVIFILE pfile,PAVISTREAM* ppas,AVISTREAMINFOW* pasi)
195 return IAVIFile_CreateStream(pfile,ppas,pasi);
198 /***********************************************************************
199 * AVIFileCreateStreamA (AVIFIL32.@)
201 HRESULT WINAPI AVIFileCreateStreamA(PAVIFILE pfile,PAVISTREAM* ppas,AVISTREAMINFOA* pasi)
206 memcpy( &siw,pasi,sizeof(AVISTREAMINFOA) );
207 AVIFILE_strncpyAtoW( siw.szName, pasi->szName,
208 sizeof(siw.szName)/sizeof(siw.szName[0]) );
209 siw.szName[sizeof(siw.szName)/sizeof(siw.szName[0])-1] = 0;
211 hr = AVIFileCreateStreamW(pfile,ppas,&siw);
216 /***********************************************************************
217 * AVIFileWriteData (AVIFIL32.@)
219 HRESULT WINAPI AVIFileWriteData(
220 PAVIFILE pfile,DWORD dwChunkId,LPVOID lpvData,LONG cbData )
222 return IAVIFile_WriteData( pfile,dwChunkId,lpvData,cbData );
225 /***********************************************************************
226 * AVIFileReadData (AVIFIL32.@)
228 HRESULT WINAPI AVIFileReadData(
229 PAVIFILE pfile,DWORD dwChunkId,LPVOID lpvData,LPLONG pcbData )
231 return IAVIFile_ReadData( pfile,dwChunkId,lpvData,pcbData );
234 /***********************************************************************
235 * AVIFileEndRecord (AVIFIL32.@)
237 HRESULT WINAPI AVIFileEndRecord( PAVIFILE pfile )
239 return IAVIFile_EndRecord( pfile );
242 /***********************************************************************
243 * AVIStreamAddRef (AVIFIL32.@)
245 ULONG WINAPI AVIStreamAddRef(PAVISTREAM pas)
247 return IAVIStream_Release(pas);
250 /***********************************************************************
251 * AVIStreamRelease (AVIFIL32.@)
253 ULONG WINAPI AVIStreamRelease(PAVISTREAM pas)
255 return IAVIStream_Release(pas);
258 /***********************************************************************
259 * AVIStreamInfoW (AVIFIL32.@)
261 HRESULT WINAPI AVIStreamInfoW(PAVISTREAM pas,AVISTREAMINFOW* psi,LONG lSize)
263 return IAVIStream_Info(pas,psi,lSize);
266 /***********************************************************************
267 * AVIStreamInfoA (AVIFIL32.@)
269 HRESULT WINAPI AVIStreamInfoA(PAVISTREAM pas,AVISTREAMINFOA* psi,LONG lSize)
274 if (lSize < sizeof(AVISTREAMINFOA))
275 return AVIERR_BADSIZE;
276 hr = AVIStreamInfoW(pas,&siw,sizeof(AVISTREAMINFOW));
279 memcpy( psi,&siw,sizeof(AVIFILEINFOA) );
280 AVIFILE_strncpyWtoA( psi->szName, siw.szName, sizeof(psi->szName) );
281 psi->szName[sizeof(psi->szName)-1] = 0;
286 /***********************************************************************
287 * AVIStreamFindSample (AVIFIL32.@)
289 LONG WINAPI AVIStreamFindSample(PAVISTREAM pas,LONG lPos,LONG lFlags)
291 return IAVIStream_FindSample(pas,lPos,lFlags);
294 /***********************************************************************
295 * AVIStreamReadFormat (AVIFIL32.@)
297 HRESULT WINAPI AVIStreamReadFormat(PAVISTREAM pas,LONG pos,LPVOID format,LONG *formatsize) {
298 return IAVIStream_ReadFormat(pas,pos,format,formatsize);
301 /***********************************************************************
302 * AVIStreamSetFormat (AVIFIL32.@)
304 HRESULT WINAPI AVIStreamSetFormat(PAVISTREAM pas,LONG pos,LPVOID format,LONG formatsize) {
305 return IAVIStream_SetFormat(pas,pos,format,formatsize);
308 /***********************************************************************
309 * AVIStreamReadData (AVIFIL32.@)
311 HRESULT WINAPI AVIStreamReadData(PAVISTREAM pas,DWORD fcc,LPVOID lp,LONG *lpread) {
312 return IAVIStream_ReadData(pas,fcc,lp,lpread);
315 /***********************************************************************
316 * AVIStreamWriteData (AVIFIL32.@)
318 HRESULT WINAPI AVIStreamWriteData(PAVISTREAM pas,DWORD fcc,LPVOID lp,LONG size) {
319 return IAVIStream_WriteData(pas,fcc,lp,size);
322 /***********************************************************************
323 * AVIStreamRead (AVIFIL32.@)
325 HRESULT WINAPI AVIStreamRead(PAVISTREAM pas,LONG start,LONG samples,LPVOID buffer,LONG buffersize,LONG *bytesread,LONG *samplesread)
327 return IAVIStream_Read(pas,start,samples,buffer,buffersize,bytesread,samplesread);
330 /***********************************************************************
331 * AVIStreamWrite (AVIFIL32.@)
333 HRESULT WINAPI AVIStreamWrite(PAVISTREAM pas,LONG start,LONG samples,LPVOID buffer,LONG buffersize,DWORD flags,LONG *sampwritten,LONG *byteswritten) {
334 return IAVIStream_Write(pas,start,samples,buffer,buffersize,flags,sampwritten,byteswritten);
338 /***********************************************************************
339 * AVIStreamStart (AVIFIL32.@)
341 LONG WINAPI AVIStreamStart(PAVISTREAM pas)
346 hr = IAVIStream_Info(pas,&si,sizeof(si));
349 return (LONG)si.dwStart;
352 /***********************************************************************
353 * AVIStreamLength (AVIFIL32.@)
355 LONG WINAPI AVIStreamLength(PAVISTREAM pas)
360 hr = IAVIStream_Info(pas,&si,sizeof(si));
363 return (LONG)si.dwLength;
366 /***********************************************************************
367 * AVIStreamTimeToSample (AVIFIL32.@)
369 LONG WINAPI AVIStreamTimeToSample(PAVISTREAM pas,LONG lTime)
374 hr = IAVIStream_Info(pas,&si,sizeof(si));
378 /* I am too lazy... */
379 FIXME("(%p,%ld)",pas,lTime);
383 /***********************************************************************
384 * AVIStreamSampleToTime (AVIFIL32.@)
386 LONG WINAPI AVIStreamSampleToTime(PAVISTREAM pas,LONG lSample)
391 hr = IAVIStream_Info(pas,&si,sizeof(si));
395 /* I am too lazy... */
396 FIXME("(%p,%ld)",pas,lSample);
400 /***********************************************************************
401 * AVIStreamBeginStreaming (AVIFIL32.@)
403 HRESULT WINAPI AVIStreamBeginStreaming(PAVISTREAM pas,LONG lStart,LONG lEnd,LONG lRate)
405 FIXME("(%p)->(%ld,%ld,%ld),stub!\n",pas,lStart,lEnd,lRate);
409 /***********************************************************************
410 * AVIStreamEndStreaming (AVIFIL32.@)
412 HRESULT WINAPI AVIStreamEndStreaming(PAVISTREAM pas)
414 FIXME("(%p)->(),stub!\n",pas);
418 /***********************************************************************
419 * AVIStreamGetFrameOpen (AVIFIL32.@)
421 PGETFRAME WINAPI AVIStreamGetFrameOpen(PAVISTREAM pas,LPBITMAPINFOHEADER pbi)
427 FIXME("(%p,%p)\n",pas,pbi);
429 hr = IAVIStream_Info(pas,&si,sizeof(si));
433 hr = AVIFILE_CreateIGetFrame((void**)&pgf,pas,pbi);
436 hr = IGetFrame_Begin( pgf, si.dwStart, si.dwLength, 1000 );
439 IGetFrame_Release( pgf );
446 /***********************************************************************
447 * AVIStreamGetFrame (AVIFIL32.@)
449 LPVOID WINAPI AVIStreamGetFrame(PGETFRAME pgf, LONG lPos)
451 return IGetFrame_GetFrame(pgf,lPos);
454 /***********************************************************************
455 * AVIStreamGetFrameClose (AVIFIL32.@)
457 HRESULT WINAPI AVIStreamGetFrameClose(PGETFRAME pgf)
459 return IGetFrame_End(pgf);
462 /***********************************************************************
463 * AVIStreamOpenFromFileA (AVIFIL32.@)
465 HRESULT WINAPI AVIStreamOpenFromFileA(PAVISTREAM* ppas, LPCSTR szFile, DWORD fccType, LONG lParam, UINT uMode, CLSID* lpHandler)
470 pwsz = AVIFILE_strdupAtoW( szFile );
472 return AVIERR_MEMORY;
473 hr = AVIStreamOpenFromFileW(ppas,pwsz,fccType,lParam,uMode,lpHandler);
474 HeapFree( AVIFILE_data.hHeap, 0, pwsz );
478 /***********************************************************************
479 * AVIStreamOpenFromFileW (AVIFIL32.@)
481 HRESULT WINAPI AVIStreamOpenFromFileW(PAVISTREAM* ppas, LPCWSTR szFile, DWORD fccType, LONG lParam, UINT uMode, CLSID* lpHandler)
488 hr = AVIFileOpenW(&paf,szFile,uMode,lpHandler);
491 hr = AVIFileInfoW(paf,&fi,sizeof(AVIFILEINFOW));
493 hr = AVIFileGetStream(paf,ppas,fccType,lParam);
495 IAVIFile_Release(paf);
500 /***********************************************************************
501 * AVIStreamCreate (AVIFIL32.@)
503 HRESULT WINAPI AVIStreamCreate(PAVISTREAM* ppas, LONG lParam1, LONG lParam2, CLSID* lpHandler)
510 if ( lpHandler == NULL )
512 hr = AVIFILE_DllGetClassObject(&CLSID_AVIFile,
513 &IID_IClassFactory,(void**)&pcf);
517 if ( !AVIFILE_data.fInitCOM )
519 hr = CoGetClassObject(lpHandler,CLSCTX_INPROC_SERVER,
520 NULL,&IID_IClassFactory,(void**)&pcf);
525 hr = IClassFactory_CreateInstance( pcf, NULL, &IID_IAVIStream,
527 IClassFactory_Release( pcf );
531 hr = IAVIStream_Create((*ppas),lParam1,lParam2);
534 IAVIStream_Release((*ppas));
542 /***********************************************************************
543 * AVIMakeCompressedStream (AVIFIL32.@)
545 HRESULT WINAPI AVIMakeCompressedStream(PAVISTREAM *ppsCompressed,PAVISTREAM ppsSource,AVICOMPRESSOPTIONS *aco,CLSID *pclsidHandler)
547 FIXME("(%p,%p,%p,%p)\n",ppsCompressed,ppsSource,aco,pclsidHandler);