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 * AVIFileOpen (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 * AVIFileInfo (AVIFIL32.@)
162 * AVIFileInfoA (AVIFIL32.@)
164 HRESULT WINAPI AVIFileInfoA(PAVIFILE pfile,AVIFILEINFOA* pfi,LONG lSize)
169 if ( lSize < sizeof(AVIFILEINFOA) )
170 return AVIERR_BADSIZE;
171 hr = AVIFileInfoW( pfile, &fiw, sizeof(AVIFILEINFOW) );
174 memcpy( pfi,&fiw,sizeof(AVIFILEINFOA) );
175 AVIFILE_strncpyWtoA( pfi->szFileType, fiw.szFileType,
176 sizeof(pfi->szFileType) );
177 pfi->szFileType[sizeof(pfi->szFileType)-1] = 0;
182 /***********************************************************************
183 * AVIFileGetStream (AVIFILE.143)
184 * AVIFileGetStream (AVIFIL32.@)
186 HRESULT WINAPI AVIFileGetStream(PAVIFILE pfile,PAVISTREAM* pas,DWORD fccType,LONG lParam)
188 return IAVIFile_GetStream(pfile,pas,fccType,lParam);
191 /***********************************************************************
192 * AVIFileCreateStreamW (AVIFIL32.@)
194 HRESULT WINAPI AVIFileCreateStreamW(PAVIFILE pfile,PAVISTREAM* ppas,AVISTREAMINFOW* pasi)
196 return IAVIFile_CreateStream(pfile,ppas,pasi);
199 /***********************************************************************
200 * AVIFileCreateStreamA (AVIFIL32.@)
202 HRESULT WINAPI AVIFileCreateStreamA(PAVIFILE pfile,PAVISTREAM* ppas,AVISTREAMINFOA* pasi)
207 memcpy( &siw,pasi,sizeof(AVISTREAMINFOA) );
208 AVIFILE_strncpyAtoW( siw.szName, pasi->szName,
209 sizeof(siw.szName)/sizeof(siw.szName[0]) );
210 siw.szName[sizeof(siw.szName)/sizeof(siw.szName[0])-1] = 0;
212 hr = AVIFileCreateStreamW(pfile,ppas,&siw);
217 /***********************************************************************
218 * AVIFileWriteData (AVIFIL32.@)
220 HRESULT WINAPI AVIFileWriteData(
221 PAVIFILE pfile,DWORD dwChunkId,LPVOID lpvData,LONG cbData )
223 return IAVIFile_WriteData( pfile,dwChunkId,lpvData,cbData );
226 /***********************************************************************
227 * AVIFileReadData (AVIFIL32.@)
229 HRESULT WINAPI AVIFileReadData(
230 PAVIFILE pfile,DWORD dwChunkId,LPVOID lpvData,LPLONG pcbData )
232 return IAVIFile_ReadData( pfile,dwChunkId,lpvData,pcbData );
235 /***********************************************************************
236 * AVIFileEndRecord (AVIFIL32.@)
238 HRESULT WINAPI AVIFileEndRecord( PAVIFILE pfile )
240 return IAVIFile_EndRecord( pfile );
243 /***********************************************************************
244 * AVIStreamAddRef (AVIFIL32.@)
246 ULONG WINAPI AVIStreamAddRef(PAVISTREAM pas)
248 return IAVIStream_Release(pas);
251 /***********************************************************************
252 * AVIStreamRelease (AVIFIL32.@)
254 ULONG WINAPI AVIStreamRelease(PAVISTREAM pas)
256 return IAVIStream_Release(pas);
259 /***********************************************************************
260 * AVIStreamInfoW (AVIFIL32.@)
262 HRESULT WINAPI AVIStreamInfoW(PAVISTREAM pas,AVISTREAMINFOW* psi,LONG lSize)
264 return IAVIStream_Info(pas,psi,lSize);
267 /***********************************************************************
268 * AVIStreamInfo (AVIFIL32.@)
269 * AVIStreamInfoA (AVIFIL32.@)
271 HRESULT WINAPI AVIStreamInfoA(PAVISTREAM pas,AVISTREAMINFOA* psi,LONG lSize)
276 if (lSize < sizeof(AVISTREAMINFOA))
277 return AVIERR_BADSIZE;
278 hr = AVIStreamInfoW(pas,&siw,sizeof(AVISTREAMINFOW));
281 memcpy( psi,&siw,sizeof(AVIFILEINFOA) );
282 AVIFILE_strncpyWtoA( psi->szName, siw.szName, sizeof(psi->szName) );
283 psi->szName[sizeof(psi->szName)-1] = 0;
288 /***********************************************************************
289 * AVIStreamFindSample (AVIFIL32.@)
291 LONG WINAPI AVIStreamFindSample(PAVISTREAM pas,LONG lPos,LONG lFlags)
293 return IAVIStream_FindSample(pas,lPos,lFlags);
296 /***********************************************************************
297 * AVIStreamReadFormat (AVIFIL32.@)
299 HRESULT WINAPI AVIStreamReadFormat(PAVISTREAM pas,LONG pos,LPVOID format,LONG *formatsize) {
300 return IAVIStream_ReadFormat(pas,pos,format,formatsize);
303 /***********************************************************************
304 * AVIStreamSetFormat (AVIFIL32.@)
306 HRESULT WINAPI AVIStreamSetFormat(PAVISTREAM pas,LONG pos,LPVOID format,LONG formatsize) {
307 return IAVIStream_SetFormat(pas,pos,format,formatsize);
310 /***********************************************************************
311 * AVIStreamReadData (AVIFIL32.@)
313 HRESULT WINAPI AVIStreamReadData(PAVISTREAM pas,DWORD fcc,LPVOID lp,LONG *lpread) {
314 return IAVIStream_ReadData(pas,fcc,lp,lpread);
317 /***********************************************************************
318 * AVIStreamWriteData (AVIFIL32.@)
320 HRESULT WINAPI AVIStreamWriteData(PAVISTREAM pas,DWORD fcc,LPVOID lp,LONG size) {
321 return IAVIStream_WriteData(pas,fcc,lp,size);
324 /***********************************************************************
325 * AVIStreamRead (AVIFIL32.@)
327 HRESULT WINAPI AVIStreamRead(PAVISTREAM pas,LONG start,LONG samples,LPVOID buffer,LONG buffersize,LONG *bytesread,LONG *samplesread)
329 return IAVIStream_Read(pas,start,samples,buffer,buffersize,bytesread,samplesread);
332 /***********************************************************************
333 * AVIStreamWrite (AVIFIL32.@)
335 HRESULT WINAPI AVIStreamWrite(PAVISTREAM pas,LONG start,LONG samples,LPVOID buffer,LONG buffersize,DWORD flags,LONG *sampwritten,LONG *byteswritten) {
336 return IAVIStream_Write(pas,start,samples,buffer,buffersize,flags,sampwritten,byteswritten);
340 /***********************************************************************
341 * AVIStreamStart (AVIFIL32.@)
343 LONG WINAPI AVIStreamStart(PAVISTREAM pas)
348 hr = IAVIStream_Info(pas,&si,sizeof(si));
351 return (LONG)si.dwStart;
354 /***********************************************************************
355 * AVIStreamLength (AVIFIL32.@)
357 LONG WINAPI AVIStreamLength(PAVISTREAM pas)
362 hr = IAVIStream_Info(pas,&si,sizeof(si));
365 return (LONG)si.dwLength;
368 /***********************************************************************
369 * AVIStreamTimeToSample (AVIFIL32.@)
371 LONG WINAPI AVIStreamTimeToSample(PAVISTREAM pas,LONG lTime)
376 hr = IAVIStream_Info(pas,&si,sizeof(si));
380 /* I am too lazy... */
381 FIXME("(%p,%ld)",pas,lTime);
385 /***********************************************************************
386 * AVIStreamSampleToTime (AVIFIL32.@)
388 LONG WINAPI AVIStreamSampleToTime(PAVISTREAM pas,LONG lSample)
393 hr = IAVIStream_Info(pas,&si,sizeof(si));
397 /* I am too lazy... */
398 FIXME("(%p,%ld)",pas,lSample);
402 /***********************************************************************
403 * AVIStreamBeginStreaming (AVIFIL32.@)
405 HRESULT WINAPI AVIStreamBeginStreaming(PAVISTREAM pas,LONG lStart,LONG lEnd,LONG lRate)
407 FIXME("(%p)->(%ld,%ld,%ld),stub!\n",pas,lStart,lEnd,lRate);
411 /***********************************************************************
412 * AVIStreamEndStreaming (AVIFIL32.@)
414 HRESULT WINAPI AVIStreamEndStreaming(PAVISTREAM pas)
416 FIXME("(%p)->(),stub!\n",pas);
420 /***********************************************************************
421 * AVIStreamGetFrameOpen (AVIFIL32.@)
423 PGETFRAME WINAPI AVIStreamGetFrameOpen(PAVISTREAM pas,LPBITMAPINFOHEADER pbi)
429 FIXME("(%p,%p)\n",pas,pbi);
431 hr = IAVIStream_Info(pas,&si,sizeof(si));
435 hr = AVIFILE_CreateIGetFrame((void**)&pgf,pas,pbi);
438 hr = IGetFrame_Begin( pgf, si.dwStart, si.dwLength, 1000 );
441 IGetFrame_Release( pgf );
448 /***********************************************************************
449 * AVIStreamGetFrame (AVIFIL32.@)
451 LPVOID WINAPI AVIStreamGetFrame(PGETFRAME pgf, LONG lPos)
453 return IGetFrame_GetFrame(pgf,lPos);
456 /***********************************************************************
457 * AVIStreamGetFrameClose (AVIFIL32.@)
459 HRESULT WINAPI AVIStreamGetFrameClose(PGETFRAME pgf)
461 return IGetFrame_End(pgf);
464 /***********************************************************************
465 * AVIStreamOpenFromFileA (AVIFIL32.@)
467 HRESULT WINAPI AVIStreamOpenFromFileA(PAVISTREAM* ppas, LPCSTR szFile, DWORD fccType, LONG lParam, UINT uMode, CLSID* lpHandler)
472 pwsz = AVIFILE_strdupAtoW( szFile );
474 return AVIERR_MEMORY;
475 hr = AVIStreamOpenFromFileW(ppas,pwsz,fccType,lParam,uMode,lpHandler);
476 HeapFree( AVIFILE_data.hHeap, 0, pwsz );
480 /***********************************************************************
481 * AVIStreamOpenFromFileW (AVIFIL32.@)
483 HRESULT WINAPI AVIStreamOpenFromFileW(PAVISTREAM* ppas, LPCWSTR szFile, DWORD fccType, LONG lParam, UINT uMode, CLSID* lpHandler)
490 hr = AVIFileOpenW(&paf,szFile,uMode,lpHandler);
493 hr = AVIFileInfoW(paf,&fi,sizeof(AVIFILEINFOW));
495 hr = AVIFileGetStream(paf,ppas,fccType,lParam);
497 IAVIFile_Release(paf);
502 /***********************************************************************
503 * AVIStreamCreate (AVIFIL32.@)
505 HRESULT WINAPI AVIStreamCreate(PAVISTREAM* ppas, LONG lParam1, LONG lParam2, CLSID* lpHandler)
512 if ( lpHandler == NULL )
514 hr = AVIFILE_DllGetClassObject(&CLSID_AVIFile,
515 &IID_IClassFactory,(void**)&pcf);
519 if ( !AVIFILE_data.fInitCOM )
521 hr = CoGetClassObject(lpHandler,CLSCTX_INPROC_SERVER,
522 NULL,&IID_IClassFactory,(void**)&pcf);
527 hr = IClassFactory_CreateInstance( pcf, NULL, &IID_IAVIStream,
529 IClassFactory_Release( pcf );
533 hr = IAVIStream_Create((*ppas),lParam1,lParam2);
536 IAVIStream_Release((*ppas));
544 /***********************************************************************
545 * AVIMakeCompressedStream (AVIFIL32.@)
547 HRESULT WINAPI AVIMakeCompressedStream(PAVISTREAM *ppsCompressed,PAVISTREAM ppsSource,AVICOMPRESSOPTIONS *aco,CLSID *pclsidHandler)
549 FIXME("(%p,%p,%p,%p)\n",ppsCompressed,ppsSource,aco,pclsidHandler);