source: trunk/src/avifil32/api.c@ 6644

Last change on this file since 6644 was 6644, checked in by bird, 24 years ago

Added $Id:$ keyword.

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