Fixed some issues found by winapi_check.
[wine] / dlls / avifil32 / api.c
1 /*
2  * Copyright 1999 Marcus Meissner
3  * Copyright 2001 Hidenori TAKESHIMA <hidenori@a2.ctktv.ne.jp>
4  */
5
6 #include <string.h>
7 #include <stdio.h>
8 #include <assert.h>
9
10 #include "winbase.h"
11 #include "winnls.h"
12 #include "mmsystem.h"
13 #include "winerror.h"
14 #include "ole2.h"
15 #include "vfw.h"
16 #include "debugtools.h"
17
18 DEFAULT_DEBUG_CHANNEL(avifile);
19
20 #include "avifile_private.h"
21
22
23 /***********************************************************************
24  *              AVIFileInit (AVIFILE.100)
25  *              AVIFileInit (AVIFIL32.@)
26  */
27 void WINAPI AVIFileInit(void)
28 {
29         TRACE("()\n");
30         if ( AVIFILE_data.dwAVIFileRef == 0 )
31         {
32                 if ( FAILED(CoInitialize(NULL)) )
33                         AVIFILE_data.fInitCOM = FALSE;
34                 else
35                         AVIFILE_data.fInitCOM = TRUE;
36         }
37         AVIFILE_data.dwAVIFileRef ++;
38 }
39
40 /***********************************************************************
41  *              AVIFileExit (AVIFILE.101)
42  *              AVIFileExit (AVIFIL32.@)
43  */
44 void WINAPI AVIFileExit(void)
45 {
46         TRACE("()\n");
47         if ( AVIFILE_data.dwAVIFileRef == 0 )
48         {
49                 ERR( "unexpected AVIFileExit()\n" );
50                 return;
51         }
52
53         AVIFILE_data.dwAVIFileRef --;
54         if ( AVIFILE_data.dwAVIFileRef == 0 )
55         {
56                 if ( AVIFILE_data.fInitCOM )
57                 {
58                         CoUninitialize();
59                         AVIFILE_data.fInitCOM = FALSE;
60                 }
61         }
62 }
63
64 /***********************************************************************
65  *              AVIFileAddRef (AVIFIL32.@)
66  */
67 ULONG WINAPI AVIFileAddRef(PAVIFILE pfile)
68 {
69         return IAVIFile_AddRef( pfile );
70 }
71
72 /***********************************************************************
73  *              AVIFileRelease (AVIFILE.141)
74  *              AVIFileRelease (AVIFIL32.@)
75  */
76 ULONG WINAPI AVIFileRelease(PAVIFILE pfile)
77 {
78         return IAVIFile_Release( pfile );
79 }
80
81 /***********************************************************************
82  *              AVIFileOpenA (AVIFILE.102)
83  *              AVIFileOpenA (AVIFIL32.@)
84  */
85 HRESULT WINAPI AVIFileOpenA(
86         PAVIFILE* ppfile,LPCSTR szFile,UINT uMode,LPCLSID lpHandler )
87 {
88         WCHAR*  pwsz;
89         HRESULT hr;
90
91         TRACE("(%p,%p,%u,%p)\n",ppfile,szFile,uMode,lpHandler);
92         pwsz = AVIFILE_strdupAtoW( szFile );
93         if ( pwsz == NULL )
94                 return AVIERR_MEMORY;
95         hr = AVIFileOpenW(ppfile,pwsz,uMode,lpHandler);
96         HeapFree( AVIFILE_data.hHeap, 0, pwsz );
97         return hr;
98 }
99
100 /***********************************************************************
101  *              AVIFileOpenW (AVIFIL32.@)
102  */
103 HRESULT WINAPI AVIFileOpenW(
104         PAVIFILE* ppfile,LPCWSTR szFile,UINT uMode,LPCLSID lpHandler )
105 {
106         HRESULT hr;
107         IClassFactory*  pcf;
108         CLSID   clsRIFF;
109
110         TRACE("(%p,%p,%u,%p)\n",ppfile,szFile,uMode,lpHandler);
111         *ppfile = (PAVIFILE)NULL;
112
113         if ( lpHandler == NULL )
114         {
115                 /* FIXME - check RIFF type and get a handler from registry
116                  *         if IAVIFile::Open is worked...
117                  */
118                 memcpy( &clsRIFF, &CLSID_AVIFile, sizeof(CLSID) );
119                 lpHandler = &clsRIFF;
120         }
121
122         /*
123          * FIXME - MS says IAVIFile::Open will be called,
124          *         but no such method in vfw.h... why????
125          */
126         if ( !IsEqualGUID( lpHandler, &CLSID_AVIFile ) )
127                 return REGDB_E_CLASSNOTREG;
128
129         hr = AVIFILE_DllGetClassObject(&CLSID_AVIFile,
130                                        &IID_IClassFactory,(void**)&pcf);
131         if ( hr != S_OK )
132                 return hr;
133
134         hr = IClassFactory_CreateInstance( pcf, NULL, &IID_IAVIFile,
135                                            (void**)ppfile );
136         IClassFactory_Release( pcf );
137
138         if ( hr == S_OK )
139         {
140                 /* FIXME??? */
141                 hr = AVIFILE_IAVIFile_Open( *ppfile, szFile, uMode );
142                 if ( hr != S_OK )
143                 {
144                         IAVIFile_Release( (*ppfile) );
145                         *ppfile = NULL;
146                 }
147         }
148
149         return hr;
150 }
151
152 /***********************************************************************
153  *              AVIFileInfoW (AVIFIL32.@)
154  */
155 HRESULT WINAPI AVIFileInfoW(PAVIFILE pfile,AVIFILEINFOW* pfi,LONG lSize)
156 {
157         return IAVIFile_Info( pfile, pfi, lSize );
158 }
159
160 /***********************************************************************
161  *              AVIFileInfoA (AVIFIL32.@)
162  */
163 HRESULT WINAPI AVIFileInfoA(PAVIFILE pfile,AVIFILEINFOA* pfi,LONG lSize)
164 {
165         AVIFILEINFOW    fiw;
166         HRESULT         hr;
167
168         if ( lSize < sizeof(AVIFILEINFOA) )
169                 return AVIERR_BADSIZE;
170         hr = AVIFileInfoW( pfile, &fiw, sizeof(AVIFILEINFOW) );
171         if ( hr != S_OK )
172                 return hr;
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;
177
178         return S_OK;
179 }
180
181 /***********************************************************************
182  *              AVIFileGetStream (AVIFILE.143)
183  *              AVIFileGetStream (AVIFIL32.@)
184  */
185 HRESULT WINAPI AVIFileGetStream(PAVIFILE pfile,PAVISTREAM* pas,DWORD fccType,LONG lParam)
186 {
187         return IAVIFile_GetStream(pfile,pas,fccType,lParam);
188 }
189
190 /***********************************************************************
191  *              AVIFileCreateStreamW (AVIFIL32.@)
192  */
193 HRESULT WINAPI AVIFileCreateStreamW(PAVIFILE pfile,PAVISTREAM* ppas,AVISTREAMINFOW* pasi)
194 {
195         return IAVIFile_CreateStream(pfile,ppas,pasi);
196 }
197
198 /***********************************************************************
199  *              AVIFileCreateStreamA (AVIFIL32.@)
200  */
201 HRESULT WINAPI AVIFileCreateStreamA(PAVIFILE pfile,PAVISTREAM* ppas,AVISTREAMINFOA* pasi)
202 {
203         AVISTREAMINFOW  siw;
204         HRESULT         hr;
205
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;
210
211         hr = AVIFileCreateStreamW(pfile,ppas,&siw);
212
213         return hr;
214 }
215
216 /***********************************************************************
217  *              AVIFileWriteData (AVIFIL32.@)
218  */
219 HRESULT WINAPI AVIFileWriteData(
220         PAVIFILE pfile,DWORD dwChunkId,LPVOID lpvData,LONG cbData )
221 {
222         return IAVIFile_WriteData( pfile,dwChunkId,lpvData,cbData );
223 }
224
225 /***********************************************************************
226  *              AVIFileReadData (AVIFIL32.@)
227  */
228 HRESULT WINAPI AVIFileReadData(
229         PAVIFILE pfile,DWORD dwChunkId,LPVOID lpvData,LPLONG pcbData )
230 {
231         return IAVIFile_ReadData( pfile,dwChunkId,lpvData,pcbData );
232 }
233
234 /***********************************************************************
235  *              AVIFileEndRecord (AVIFIL32.@)
236  */
237 HRESULT WINAPI AVIFileEndRecord( PAVIFILE pfile )
238 {
239         return IAVIFile_EndRecord( pfile );
240 }
241
242 /***********************************************************************
243  *              AVIStreamAddRef (AVIFIL32.@)
244  */
245 ULONG WINAPI AVIStreamAddRef(PAVISTREAM pas)
246 {
247         return IAVIStream_Release(pas);
248 }
249
250 /***********************************************************************
251  *              AVIStreamRelease (AVIFIL32.@)
252  */
253 ULONG WINAPI AVIStreamRelease(PAVISTREAM pas)
254 {
255         return IAVIStream_Release(pas);
256 }
257
258 /***********************************************************************
259  *              AVIStreamInfoW (AVIFIL32.@)
260  */
261 HRESULT WINAPI AVIStreamInfoW(PAVISTREAM pas,AVISTREAMINFOW* psi,LONG lSize)
262 {
263         return IAVIStream_Info(pas,psi,lSize);
264 }
265
266 /***********************************************************************
267  *              AVIStreamInfoA (AVIFIL32.@)
268  */
269 HRESULT WINAPI AVIStreamInfoA(PAVISTREAM pas,AVISTREAMINFOA* psi,LONG lSize)
270 {
271         AVISTREAMINFOW  siw;
272         HRESULT         hr;
273
274         if (lSize < sizeof(AVISTREAMINFOA))
275                 return AVIERR_BADSIZE;
276         hr = AVIStreamInfoW(pas,&siw,sizeof(AVISTREAMINFOW));
277         if ( hr != S_OK )
278                 return hr;
279         memcpy( psi,&siw,sizeof(AVIFILEINFOA) );
280         AVIFILE_strncpyWtoA( psi->szName, siw.szName, sizeof(psi->szName) );
281         psi->szName[sizeof(psi->szName)-1] = 0;
282
283         return hr;
284 }
285
286 /***********************************************************************
287  *              AVIStreamFindSample (AVIFIL32.@)
288  */
289 LONG WINAPI AVIStreamFindSample(PAVISTREAM pas,LONG lPos,LONG lFlags)
290 {
291         return IAVIStream_FindSample(pas,lPos,lFlags);
292 }
293
294 /***********************************************************************
295  *              AVIStreamReadFormat (AVIFIL32.@)
296  */
297 HRESULT WINAPI AVIStreamReadFormat(PAVISTREAM pas,LONG pos,LPVOID format,LONG *formatsize) {
298         return IAVIStream_ReadFormat(pas,pos,format,formatsize);
299 }
300
301 /***********************************************************************
302  *              AVIStreamSetFormat (AVIFIL32.@)
303  */
304 HRESULT WINAPI AVIStreamSetFormat(PAVISTREAM pas,LONG pos,LPVOID format,LONG formatsize) {
305         return IAVIStream_SetFormat(pas,pos,format,formatsize);
306 }
307
308 /***********************************************************************
309  *              AVIStreamReadData (AVIFIL32.@)
310  */
311 HRESULT WINAPI AVIStreamReadData(PAVISTREAM pas,DWORD fcc,LPVOID lp,LONG *lpread) {
312         return IAVIStream_ReadData(pas,fcc,lp,lpread);
313 }
314
315 /***********************************************************************
316  *              AVIStreamWriteData (AVIFIL32.@)
317  */
318 HRESULT WINAPI AVIStreamWriteData(PAVISTREAM pas,DWORD fcc,LPVOID lp,LONG size) {
319         return IAVIStream_WriteData(pas,fcc,lp,size);
320 }
321
322 /***********************************************************************
323  *              AVIStreamRead (AVIFIL32.@)
324  */
325 HRESULT WINAPI AVIStreamRead(PAVISTREAM pas,LONG start,LONG samples,LPVOID buffer,LONG buffersize,LONG *bytesread,LONG *samplesread)
326 {
327         return IAVIStream_Read(pas,start,samples,buffer,buffersize,bytesread,samplesread);
328 }
329
330 /***********************************************************************
331  *              AVIStreamWrite (AVIFIL32.@)
332  */
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);
335 }
336
337
338 /***********************************************************************
339  *              AVIStreamStart (AVIFIL32.@)
340  */
341 LONG WINAPI AVIStreamStart(PAVISTREAM pas)
342 {
343         AVISTREAMINFOW  si;
344         HRESULT                 hr;
345
346         hr = IAVIStream_Info(pas,&si,sizeof(si));
347         if (hr != S_OK)
348                 return -1;
349         return (LONG)si.dwStart;
350 }
351
352 /***********************************************************************
353  *              AVIStreamLength (AVIFIL32.@)
354  */
355 LONG WINAPI AVIStreamLength(PAVISTREAM pas)
356 {
357         AVISTREAMINFOW  si;
358         HRESULT                 hr;
359
360         hr = IAVIStream_Info(pas,&si,sizeof(si));
361         if (hr != S_OK)
362                 return -1;
363         return (LONG)si.dwLength;
364 }
365
366 /***********************************************************************
367  *              AVIStreamTimeToSample (AVIFIL32.@)
368  */
369 LONG WINAPI AVIStreamTimeToSample(PAVISTREAM pas,LONG lTime)
370 {
371         AVISTREAMINFOW  si;
372         HRESULT                 hr;
373
374         hr = IAVIStream_Info(pas,&si,sizeof(si));
375         if (hr != S_OK)
376                 return -1;
377
378         /* I am too lazy... */
379         FIXME("(%p,%ld)",pas,lTime);
380         return (LONG)-1L;
381 }
382
383 /***********************************************************************
384  *              AVIStreamSampleToTime (AVIFIL32.@)
385  */
386 LONG WINAPI AVIStreamSampleToTime(PAVISTREAM pas,LONG lSample)
387 {
388         AVISTREAMINFOW  si;
389         HRESULT                 hr;
390
391         hr = IAVIStream_Info(pas,&si,sizeof(si));
392         if (hr != S_OK)
393                 return -1;
394
395         /* I am too lazy... */
396         FIXME("(%p,%ld)",pas,lSample);
397         return (LONG)-1L;
398 }
399
400 /***********************************************************************
401  *              AVIStreamBeginStreaming (AVIFIL32.@)
402  */
403 HRESULT WINAPI AVIStreamBeginStreaming(PAVISTREAM pas,LONG lStart,LONG lEnd,LONG lRate)
404 {
405         FIXME("(%p)->(%ld,%ld,%ld),stub!\n",pas,lStart,lEnd,lRate);
406         return E_FAIL;
407 }
408
409 /***********************************************************************
410  *              AVIStreamEndStreaming (AVIFIL32.@)
411  */
412 HRESULT WINAPI AVIStreamEndStreaming(PAVISTREAM pas)
413 {
414         FIXME("(%p)->(),stub!\n",pas);
415         return E_FAIL;
416 }
417
418 /***********************************************************************
419  *              AVIStreamGetFrameOpen (AVIFIL32.@)
420  */
421 PGETFRAME WINAPI AVIStreamGetFrameOpen(PAVISTREAM pas,LPBITMAPINFOHEADER pbi)
422 {
423         IGetFrame*      pgf;
424         HRESULT         hr;
425         AVISTREAMINFOW  si;
426
427         FIXME("(%p,%p)\n",pas,pbi);
428
429         hr = IAVIStream_Info(pas,&si,sizeof(si));
430         if (hr != S_OK)
431                 return NULL;
432
433         hr = AVIFILE_CreateIGetFrame((void**)&pgf,pas,pbi);
434         if ( hr != S_OK )
435                 return NULL;
436         hr = IGetFrame_Begin( pgf, si.dwStart, si.dwLength, 1000 );
437         if ( hr != S_OK )
438         {
439                 IGetFrame_Release( pgf );
440                 return NULL;
441         }
442
443         return pgf;
444 }
445
446 /***********************************************************************
447  *              AVIStreamGetFrame (AVIFIL32.@)
448  */
449 LPVOID WINAPI AVIStreamGetFrame(PGETFRAME pgf, LONG lPos)
450 {
451         return IGetFrame_GetFrame(pgf,lPos);
452 }
453
454 /***********************************************************************
455  *              AVIStreamGetFrameClose (AVIFIL32.@)
456  */
457 HRESULT WINAPI AVIStreamGetFrameClose(PGETFRAME pgf)
458 {
459         return IGetFrame_End(pgf);
460 }
461
462 /***********************************************************************
463  *              AVIStreamOpenFromFileA (AVIFIL32.@)
464  */
465 HRESULT WINAPI AVIStreamOpenFromFileA(PAVISTREAM* ppas, LPCSTR szFile, DWORD fccType, LONG lParam, UINT uMode, CLSID* lpHandler)
466 {
467         WCHAR*  pwsz;
468         HRESULT hr;
469
470         pwsz = AVIFILE_strdupAtoW( szFile );
471         if ( pwsz == NULL )
472                 return AVIERR_MEMORY;
473         hr = AVIStreamOpenFromFileW(ppas,pwsz,fccType,lParam,uMode,lpHandler);
474         HeapFree( AVIFILE_data.hHeap, 0, pwsz );
475         return hr;
476 }
477
478 /***********************************************************************
479  *              AVIStreamOpenFromFileW (AVIFIL32.@)
480  */
481 HRESULT WINAPI AVIStreamOpenFromFileW(PAVISTREAM* ppas, LPCWSTR szFile, DWORD fccType, LONG lParam, UINT uMode, CLSID* lpHandler)
482 {
483         HRESULT hr;
484         PAVIFILE        paf;
485         AVIFILEINFOW    fi;
486
487         *ppas = NULL;
488         hr = AVIFileOpenW(&paf,szFile,uMode,lpHandler);
489         if ( hr != S_OK )
490                 return hr;
491         hr = AVIFileInfoW(paf,&fi,sizeof(AVIFILEINFOW));
492         if ( hr == S_OK )
493                 hr = AVIFileGetStream(paf,ppas,fccType,lParam);
494
495         IAVIFile_Release(paf);
496
497         return hr;
498 }
499
500 /***********************************************************************
501  *              AVIStreamCreate (AVIFIL32.@)
502  */
503 HRESULT WINAPI AVIStreamCreate(PAVISTREAM* ppas, LONG lParam1, LONG lParam2, CLSID* lpHandler)
504 {
505         HRESULT hr;
506         IClassFactory*  pcf;
507
508         *ppas = NULL;
509
510         if ( lpHandler == NULL )
511         {
512                 hr = AVIFILE_DllGetClassObject(&CLSID_AVIFile,
513                                                &IID_IClassFactory,(void**)&pcf);
514         }
515         else
516         {
517                 if ( !AVIFILE_data.fInitCOM )
518                         return E_UNEXPECTED;
519                 hr = CoGetClassObject(lpHandler,CLSCTX_INPROC_SERVER,
520                                       NULL,&IID_IClassFactory,(void**)&pcf);
521         }
522         if ( hr != S_OK )
523                 return hr;
524
525         hr = IClassFactory_CreateInstance( pcf, NULL, &IID_IAVIStream,
526                                            (void**)ppas );
527         IClassFactory_Release( pcf );
528
529         if ( hr == S_OK )
530         {
531                 hr = IAVIStream_Create((*ppas),lParam1,lParam2);
532                 if ( hr != S_OK )
533                 {
534                         IAVIStream_Release((*ppas));
535                         *ppas = NULL;
536                 }
537         }
538
539         return hr;
540 }
541
542 /***********************************************************************
543  *              AVIMakeCompressedStream (AVIFIL32.@)
544  */
545 HRESULT WINAPI AVIMakeCompressedStream(PAVISTREAM *ppsCompressed,PAVISTREAM ppsSource,AVICOMPRESSOPTIONS *aco,CLSID *pclsidHandler)
546 {
547         FIXME("(%p,%p,%p,%p)\n",ppsCompressed,ppsSource,aco,pclsidHandler);
548         return E_FAIL;
549 }
550