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

Last change on this file since 6823 was 6712, checked in by sandervl, 24 years ago

restored old version

File size: 13.9 KB
Line 
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
18DEFAULT_DEBUG_CHANNEL(avifile);
19
20#include "avifile_private.h"
21
22
23/***********************************************************************
24 * AVIFileInit (AVIFILE.100)
25 * AVIFileInit (AVIFIL32.@)
26 */
27void 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 */
44void 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 */
67ULONG WINAPI AVIFileAddRef(PAVIFILE pfile)
68{
69 return IAVIFile_AddRef( pfile );
70}
71
72/***********************************************************************
73 * AVIFileRelease (AVIFILE.141)
74 * AVIFileRelease (AVIFIL32.@)
75 */
76ULONG WINAPI AVIFileRelease(PAVIFILE pfile)
77{
78 return IAVIFile_Release( pfile );
79}
80
81/***********************************************************************
82 * AVIFileOpen (AVIFILE.102)
83 * AVIFileOpenA (AVIFIL32.@)
84 */
85HRESULT 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 */
103HRESULT 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 */
155HRESULT 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 */
164HRESULT 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 */
186HRESULT 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 */
194HRESULT WINAPI AVIFileCreateStreamW(PAVIFILE pfile,PAVISTREAM* ppas,AVISTREAMINFOW* pasi)
195{
196 return IAVIFile_CreateStream(pfile,ppas,pasi);
197}
198
199/***********************************************************************
200 * AVIFileCreateStreamA (AVIFIL32.@)
201 */
202HRESULT 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 */
220HRESULT 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 */
229HRESULT 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 */
238HRESULT WINAPI AVIFileEndRecord( PAVIFILE pfile )
239{
240 return IAVIFile_EndRecord( pfile );
241}
242
243/***********************************************************************
244 * AVIStreamAddRef (AVIFIL32.@)
245 */
246ULONG WINAPI AVIStreamAddRef(PAVISTREAM pas)
247{
248 return IAVIStream_Release(pas);
249}
250
251/***********************************************************************
252 * AVIStreamRelease (AVIFIL32.@)
253 */
254ULONG WINAPI AVIStreamRelease(PAVISTREAM pas)
255{
256 return IAVIStream_Release(pas);
257}
258
259/***********************************************************************
260 * AVIStreamInfoW (AVIFIL32.@)
261 */
262HRESULT 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 */
271HRESULT 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 */
291LONG WINAPI AVIStreamFindSample(PAVISTREAM pas,LONG lPos,LONG lFlags)
292{
293 return IAVIStream_FindSample(pas,lPos,lFlags);
294}
295
296/***********************************************************************
297 * AVIStreamReadFormat (AVIFIL32.@)
298 */
299HRESULT 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 */
306HRESULT 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 */
313HRESULT 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 */
320HRESULT 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 */
327HRESULT 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 */
335HRESULT 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 */
343LONG 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 */
357LONG 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 */
371LONG 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 */
388LONG 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 */
405HRESULT 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 */
414HRESULT WINAPI AVIStreamEndStreaming(PAVISTREAM pas)
415{
416 FIXME("(%p)->(),stub!\n",pas);
417 return E_FAIL;
418}
419
420/***********************************************************************
421 * AVIStreamGetFrameOpen (AVIFIL32.@)
422 */
423PGETFRAME 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 */
451LPVOID WINAPI AVIStreamGetFrame(PGETFRAME pgf, LONG lPos)
452{
453 return IGetFrame_GetFrame(pgf,lPos);
454}
455
456/***********************************************************************
457 * AVIStreamGetFrameClose (AVIFIL32.@)
458 */
459HRESULT WINAPI AVIStreamGetFrameClose(PGETFRAME pgf)
460{
461 return IGetFrame_End(pgf);
462}
463
464/***********************************************************************
465 * AVIStreamOpenFromFileA (AVIFIL32.@)
466 */
467HRESULT 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 */
483HRESULT 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 */
505HRESULT 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 */
547HRESULT 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
Note: See TracBrowser for help on using the repository browser.