Added mappings for a few messages.
[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  *              AVIFileOpen  (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  *              AVIFileInfo  (AVIFIL32.@)
162  *              AVIFileInfoA (AVIFIL32.@)
163  */
164 HRESULT WINAPI AVIFileInfoA(PAVIFILE pfile,AVIFILEINFOA* pfi,LONG lSize)
165 {
166         AVIFILEINFOW    fiw;
167         HRESULT         hr;
168
169         if ( lSize < sizeof(AVIFILEINFOA) )
170                 return AVIERR_BADSIZE;
171         hr = AVIFileInfoW( pfile, &fiw, sizeof(AVIFILEINFOW) );
172         if ( hr != S_OK )
173                 return hr;
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;
178
179         return S_OK;
180 }
181
182 /***********************************************************************
183  *              AVIFileGetStream (AVIFILE.143)
184  *              AVIFileGetStream (AVIFIL32.@)
185  */
186 HRESULT WINAPI AVIFileGetStream(PAVIFILE pfile,PAVISTREAM* pas,DWORD fccType,LONG lParam)
187 {
188         return IAVIFile_GetStream(pfile,pas,fccType,lParam);
189 }
190
191 /***********************************************************************
192  *              AVIFileCreateStreamW (AVIFIL32.@)
193  */
194 HRESULT WINAPI AVIFileCreateStreamW(PAVIFILE pfile,PAVISTREAM* ppas,AVISTREAMINFOW* pasi)
195 {
196         return IAVIFile_CreateStream(pfile,ppas,pasi);
197 }
198
199 /***********************************************************************
200  *              AVIFileCreateStreamA (AVIFIL32.@)
201  */
202 HRESULT WINAPI AVIFileCreateStreamA(PAVIFILE pfile,PAVISTREAM* ppas,AVISTREAMINFOA* pasi)
203 {
204         AVISTREAMINFOW  siw;
205         HRESULT         hr;
206
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;
211
212         hr = AVIFileCreateStreamW(pfile,ppas,&siw);
213
214         return hr;
215 }
216
217 /***********************************************************************
218  *              AVIFileWriteData (AVIFIL32.@)
219  */
220 HRESULT WINAPI AVIFileWriteData(
221         PAVIFILE pfile,DWORD dwChunkId,LPVOID lpvData,LONG cbData )
222 {
223         return IAVIFile_WriteData( pfile,dwChunkId,lpvData,cbData );
224 }
225
226 /***********************************************************************
227  *              AVIFileReadData (AVIFIL32.@)
228  */
229 HRESULT WINAPI AVIFileReadData(
230         PAVIFILE pfile,DWORD dwChunkId,LPVOID lpvData,LPLONG pcbData )
231 {
232         return IAVIFile_ReadData( pfile,dwChunkId,lpvData,pcbData );
233 }
234
235 /***********************************************************************
236  *              AVIFileEndRecord (AVIFIL32.@)
237  */
238 HRESULT WINAPI AVIFileEndRecord( PAVIFILE pfile )
239 {
240         return IAVIFile_EndRecord( pfile );
241 }
242
243 /***********************************************************************
244  *              AVIStreamAddRef (AVIFIL32.@)
245  */
246 ULONG WINAPI AVIStreamAddRef(PAVISTREAM pas)
247 {
248         return IAVIStream_Release(pas);
249 }
250
251 /***********************************************************************
252  *              AVIStreamRelease (AVIFIL32.@)
253  */
254 ULONG WINAPI AVIStreamRelease(PAVISTREAM pas)
255 {
256         return IAVIStream_Release(pas);
257 }
258
259 /***********************************************************************
260  *              AVIStreamInfoW (AVIFIL32.@)
261  */
262 HRESULT WINAPI AVIStreamInfoW(PAVISTREAM pas,AVISTREAMINFOW* psi,LONG lSize)
263 {
264         return IAVIStream_Info(pas,psi,lSize);
265 }
266
267 /***********************************************************************
268  *              AVIStreamInfo  (AVIFIL32.@)
269  *              AVIStreamInfoA (AVIFIL32.@)
270  */
271 HRESULT WINAPI AVIStreamInfoA(PAVISTREAM pas,AVISTREAMINFOA* psi,LONG lSize)
272 {
273         AVISTREAMINFOW  siw;
274         HRESULT         hr;
275
276         if (lSize < sizeof(AVISTREAMINFOA))
277                 return AVIERR_BADSIZE;
278         hr = AVIStreamInfoW(pas,&siw,sizeof(AVISTREAMINFOW));
279         if ( hr != S_OK )
280                 return hr;
281         memcpy( psi,&siw,sizeof(AVIFILEINFOA) );
282         AVIFILE_strncpyWtoA( psi->szName, siw.szName, sizeof(psi->szName) );
283         psi->szName[sizeof(psi->szName)-1] = 0;
284
285         return hr;
286 }
287
288 /***********************************************************************
289  *              AVIStreamFindSample (AVIFIL32.@)
290  */
291 LONG WINAPI AVIStreamFindSample(PAVISTREAM pas,LONG lPos,LONG lFlags)
292 {
293         return IAVIStream_FindSample(pas,lPos,lFlags);
294 }
295
296 /***********************************************************************
297  *              AVIStreamReadFormat (AVIFIL32.@)
298  */
299 HRESULT WINAPI AVIStreamReadFormat(PAVISTREAM pas,LONG pos,LPVOID format,LONG *formatsize) {
300         return IAVIStream_ReadFormat(pas,pos,format,formatsize);
301 }
302
303 /***********************************************************************
304  *              AVIStreamSetFormat (AVIFIL32.@)
305  */
306 HRESULT WINAPI AVIStreamSetFormat(PAVISTREAM pas,LONG pos,LPVOID format,LONG formatsize) {
307         return IAVIStream_SetFormat(pas,pos,format,formatsize);
308 }
309
310 /***********************************************************************
311  *              AVIStreamReadData (AVIFIL32.@)
312  */
313 HRESULT WINAPI AVIStreamReadData(PAVISTREAM pas,DWORD fcc,LPVOID lp,LONG *lpread) {
314         return IAVIStream_ReadData(pas,fcc,lp,lpread);
315 }
316
317 /***********************************************************************
318  *              AVIStreamWriteData (AVIFIL32.@)
319  */
320 HRESULT WINAPI AVIStreamWriteData(PAVISTREAM pas,DWORD fcc,LPVOID lp,LONG size) {
321         return IAVIStream_WriteData(pas,fcc,lp,size);
322 }
323
324 /***********************************************************************
325  *              AVIStreamRead (AVIFIL32.@)
326  */
327 HRESULT WINAPI AVIStreamRead(PAVISTREAM pas,LONG start,LONG samples,LPVOID buffer,LONG buffersize,LONG *bytesread,LONG *samplesread)
328 {
329         return IAVIStream_Read(pas,start,samples,buffer,buffersize,bytesread,samplesread);
330 }
331
332 /***********************************************************************
333  *              AVIStreamWrite (AVIFIL32.@)
334  */
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);
337 }
338
339
340 /***********************************************************************
341  *              AVIStreamStart (AVIFIL32.@)
342  */
343 LONG WINAPI AVIStreamStart(PAVISTREAM pas)
344 {
345         AVISTREAMINFOW  si;
346         HRESULT                 hr;
347
348         hr = IAVIStream_Info(pas,&si,sizeof(si));
349         if (hr != S_OK)
350                 return -1;
351         return (LONG)si.dwStart;
352 }
353
354 /***********************************************************************
355  *              AVIStreamLength (AVIFIL32.@)
356  */
357 LONG WINAPI AVIStreamLength(PAVISTREAM pas)
358 {
359         AVISTREAMINFOW  si;
360         HRESULT                 hr;
361
362         hr = IAVIStream_Info(pas,&si,sizeof(si));
363         if (hr != S_OK)
364                 return -1;
365         return (LONG)si.dwLength;
366 }
367
368 /***********************************************************************
369  *              AVIStreamTimeToSample (AVIFIL32.@)
370  */
371 LONG WINAPI AVIStreamTimeToSample(PAVISTREAM pas,LONG lTime)
372 {
373         AVISTREAMINFOW  si;
374         HRESULT                 hr;
375
376         hr = IAVIStream_Info(pas,&si,sizeof(si));
377         if (hr != S_OK)
378                 return -1;
379
380         /* I am too lazy... */
381         FIXME("(%p,%ld)",pas,lTime);
382         return (LONG)-1L;
383 }
384
385 /***********************************************************************
386  *              AVIStreamSampleToTime (AVIFIL32.@)
387  */
388 LONG WINAPI AVIStreamSampleToTime(PAVISTREAM pas,LONG lSample)
389 {
390         AVISTREAMINFOW  si;
391         HRESULT                 hr;
392
393         hr = IAVIStream_Info(pas,&si,sizeof(si));
394         if (hr != S_OK)
395                 return -1;
396
397         /* I am too lazy... */
398         FIXME("(%p,%ld)",pas,lSample);
399         return (LONG)-1L;
400 }
401
402 /***********************************************************************
403  *              AVIStreamBeginStreaming (AVIFIL32.@)
404  */
405 HRESULT WINAPI AVIStreamBeginStreaming(PAVISTREAM pas,LONG lStart,LONG lEnd,LONG lRate)
406 {
407         FIXME("(%p)->(%ld,%ld,%ld),stub!\n",pas,lStart,lEnd,lRate);
408         return E_FAIL;
409 }
410
411 /***********************************************************************
412  *              AVIStreamEndStreaming (AVIFIL32.@)
413  */
414 HRESULT WINAPI AVIStreamEndStreaming(PAVISTREAM pas)
415 {
416         FIXME("(%p)->(),stub!\n",pas);
417         return E_FAIL;
418 }
419
420 /***********************************************************************
421  *              AVIStreamGetFrameOpen (AVIFIL32.@)
422  */
423 PGETFRAME WINAPI AVIStreamGetFrameOpen(PAVISTREAM pas,LPBITMAPINFOHEADER pbi)
424 {
425         IGetFrame*      pgf;
426         HRESULT         hr;
427         AVISTREAMINFOW  si;
428
429         FIXME("(%p,%p)\n",pas,pbi);
430
431         hr = IAVIStream_Info(pas,&si,sizeof(si));
432         if (hr != S_OK)
433                 return NULL;
434
435         hr = AVIFILE_CreateIGetFrame((void**)&pgf,pas,pbi);
436         if ( hr != S_OK )
437                 return NULL;
438         hr = IGetFrame_Begin( pgf, si.dwStart, si.dwLength, 1000 );
439         if ( hr != S_OK )
440         {
441                 IGetFrame_Release( pgf );
442                 return NULL;
443         }
444
445         return pgf;
446 }
447
448 /***********************************************************************
449  *              AVIStreamGetFrame (AVIFIL32.@)
450  */
451 LPVOID WINAPI AVIStreamGetFrame(PGETFRAME pgf, LONG lPos)
452 {
453         return IGetFrame_GetFrame(pgf,lPos);
454 }
455
456 /***********************************************************************
457  *              AVIStreamGetFrameClose (AVIFIL32.@)
458  */
459 HRESULT WINAPI AVIStreamGetFrameClose(PGETFRAME pgf)
460 {
461         return IGetFrame_End(pgf);
462 }
463
464 /***********************************************************************
465  *              AVIStreamOpenFromFileA (AVIFIL32.@)
466  */
467 HRESULT WINAPI AVIStreamOpenFromFileA(PAVISTREAM* ppas, LPCSTR szFile, DWORD fccType, LONG lParam, UINT uMode, CLSID* lpHandler)
468 {
469         WCHAR*  pwsz;
470         HRESULT hr;
471
472         pwsz = AVIFILE_strdupAtoW( szFile );
473         if ( pwsz == NULL )
474                 return AVIERR_MEMORY;
475         hr = AVIStreamOpenFromFileW(ppas,pwsz,fccType,lParam,uMode,lpHandler);
476         HeapFree( AVIFILE_data.hHeap, 0, pwsz );
477         return hr;
478 }
479
480 /***********************************************************************
481  *              AVIStreamOpenFromFileW (AVIFIL32.@)
482  */
483 HRESULT WINAPI AVIStreamOpenFromFileW(PAVISTREAM* ppas, LPCWSTR szFile, DWORD fccType, LONG lParam, UINT uMode, CLSID* lpHandler)
484 {
485         HRESULT hr;
486         PAVIFILE        paf;
487         AVIFILEINFOW    fi;
488
489         *ppas = NULL;
490         hr = AVIFileOpenW(&paf,szFile,uMode,lpHandler);
491         if ( hr != S_OK )
492                 return hr;
493         hr = AVIFileInfoW(paf,&fi,sizeof(AVIFILEINFOW));
494         if ( hr == S_OK )
495                 hr = AVIFileGetStream(paf,ppas,fccType,lParam);
496
497         IAVIFile_Release(paf);
498
499         return hr;
500 }
501
502 /***********************************************************************
503  *              AVIStreamCreate (AVIFIL32.@)
504  */
505 HRESULT WINAPI AVIStreamCreate(PAVISTREAM* ppas, LONG lParam1, LONG lParam2, CLSID* lpHandler)
506 {
507         HRESULT hr;
508         IClassFactory*  pcf;
509
510         *ppas = NULL;
511
512         if ( lpHandler == NULL )
513         {
514                 hr = AVIFILE_DllGetClassObject(&CLSID_AVIFile,
515                                                &IID_IClassFactory,(void**)&pcf);
516         }
517         else
518         {
519                 if ( !AVIFILE_data.fInitCOM )
520                         return E_UNEXPECTED;
521                 hr = CoGetClassObject(lpHandler,CLSCTX_INPROC_SERVER,
522                                       NULL,&IID_IClassFactory,(void**)&pcf);
523         }
524         if ( hr != S_OK )
525                 return hr;
526
527         hr = IClassFactory_CreateInstance( pcf, NULL, &IID_IAVIStream,
528                                            (void**)ppas );
529         IClassFactory_Release( pcf );
530
531         if ( hr == S_OK )
532         {
533                 hr = IAVIStream_Create((*ppas),lParam1,lParam2);
534                 if ( hr != S_OK )
535                 {
536                         IAVIStream_Release((*ppas));
537                         *ppas = NULL;
538                 }
539         }
540
541         return hr;
542 }
543
544 /***********************************************************************
545  *              AVIMakeCompressedStream (AVIFIL32.@)
546  */
547 HRESULT WINAPI AVIMakeCompressedStream(PAVISTREAM *ppsCompressed,PAVISTREAM ppsSource,AVICOMPRESSOPTIONS *aco,CLSID *pclsidHandler)
548 {
549         FIXME("(%p,%p,%p,%p)\n",ppsCompressed,ppsSource,aco,pclsidHandler);
550         return E_FAIL;
551 }
552