Changeset 6712 for trunk/src/avifil32
- Timestamp:
- Sep 15, 2001, 11:47:44 AM (24 years ago)
- Location:
- trunk/src/avifil32
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/avifil32/api.c
r6644 r6712 1 /* $Id: api.c,v 1.2 2001-09-05 12:00:53 bird Exp $ 2 * 1 /* 3 2 * Copyright 1999 Marcus Meissner 4 3 * Copyright 2001 Hidenori TAKESHIMA <hidenori@a2.ctktv.ne.jp> … … 23 22 24 23 /*********************************************************************** 25 * AVIFileInit (AVIFILE.100)26 * AVIFileInit (AVIFIL32.@)24 * AVIFileInit (AVIFILE.100) 25 * AVIFileInit (AVIFIL32.@) 27 26 */ 28 27 void WINAPI AVIFileInit(void) 29 28 { 30 TRACE("()\n");31 if ( AVIFILE_data.dwAVIFileRef == 0 )32 {33 if ( FAILED(CoInitialize(NULL)) )34 AVIFILE_data.fInitCOM = FALSE;35 else36 AVIFILE_data.fInitCOM = TRUE;37 }38 AVIFILE_data.dwAVIFileRef ++;39 } 40 41 /*********************************************************************** 42 * AVIFileExit (AVIFILE.101)43 * AVIFileExit (AVIFIL32.@)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.@) 44 43 */ 45 44 void WINAPI AVIFileExit(void) 46 45 { 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.@)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.@) 67 66 */ 68 67 ULONG WINAPI AVIFileAddRef(PAVIFILE pfile) 69 68 { 70 return IAVIFile_AddRef( pfile );71 } 72 73 /*********************************************************************** 74 * AVIFileRelease (AVIFILE.141)75 * AVIFileRelease (AVIFIL32.@)69 return IAVIFile_AddRef( pfile ); 70 } 71 72 /*********************************************************************** 73 * AVIFileRelease (AVIFILE.141) 74 * AVIFileRelease (AVIFIL32.@) 76 75 */ 77 76 ULONG WINAPI AVIFileRelease(PAVIFILE pfile) 78 77 { 79 return IAVIFile_Release( pfile );80 } 81 82 /*********************************************************************** 83 * AVIFileOpen (AVIFILE.102)84 * AVIFileOpenA (AVIFIL32.@)78 return IAVIFile_Release( pfile ); 79 } 80 81 /*********************************************************************** 82 * AVIFileOpen (AVIFILE.102) 83 * AVIFileOpenA (AVIFIL32.@) 85 84 */ 86 85 HRESULT WINAPI AVIFileOpenA( 87 PAVIFILE* ppfile,LPCSTR szFile,UINT uMode,LPCLSID lpHandler )88 { 89 WCHAR*pwsz;90 HRESULThr;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.@)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.@) 103 102 */ 104 103 HRESULT WINAPI AVIFileOpenW( 105 PAVIFILE* ppfile,LPCWSTR szFile,UINT uMode,LPCLSID lpHandler )106 { 107 HRESULThr;108 IClassFactory*pcf;109 CLSIDclsRIFF;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 registry117 * 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.@)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.@) 155 154 */ 156 155 HRESULT WINAPI AVIFileInfoW(PAVIFILE pfile,AVIFILEINFOW* pfi,LONG lSize) 157 156 { 158 return IAVIFile_Info( pfile, pfi, lSize );159 } 160 161 /*********************************************************************** 162 * AVIFileInfo (AVIFIL32.@)163 * AVIFileInfoA (AVIFIL32.@)157 return IAVIFile_Info( pfile, pfi, lSize ); 158 } 159 160 /*********************************************************************** 161 * AVIFileInfo (AVIFIL32.@) 162 * AVIFileInfoA (AVIFIL32.@) 164 163 */ 165 164 HRESULT WINAPI AVIFileInfoA(PAVIFILE pfile,AVIFILEINFOA* pfi,LONG lSize) 166 165 { 167 AVIFILEINFOWfiw;168 HRESULThr;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.@)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.@) 186 185 */ 187 186 HRESULT WINAPI AVIFileGetStream(PAVIFILE pfile,PAVISTREAM* pas,DWORD fccType,LONG lParam) 188 187 { 189 return IAVIFile_GetStream(pfile,pas,fccType,lParam);190 } 191 192 /*********************************************************************** 193 * AVIFileCreateStreamW (AVIFIL32.@)188 return IAVIFile_GetStream(pfile,pas,fccType,lParam); 189 } 190 191 /*********************************************************************** 192 * AVIFileCreateStreamW (AVIFIL32.@) 194 193 */ 195 194 HRESULT WINAPI AVIFileCreateStreamW(PAVIFILE pfile,PAVISTREAM* ppas,AVISTREAMINFOW* pasi) 196 195 { 197 return IAVIFile_CreateStream(pfile,ppas,pasi);198 } 199 200 /*********************************************************************** 201 * AVIFileCreateStreamA (AVIFIL32.@)196 return IAVIFile_CreateStream(pfile,ppas,pasi); 197 } 198 199 /*********************************************************************** 200 * AVIFileCreateStreamA (AVIFIL32.@) 202 201 */ 203 202 HRESULT WINAPI AVIFileCreateStreamA(PAVIFILE pfile,PAVISTREAM* ppas,AVISTREAMINFOA* pasi) 204 203 { 205 AVISTREAMINFOWsiw;206 HRESULThr;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.@)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.@) 220 219 */ 221 220 HRESULT 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.@)221 PAVIFILE pfile,DWORD dwChunkId,LPVOID lpvData,LONG cbData ) 222 { 223 return IAVIFile_WriteData( pfile,dwChunkId,lpvData,cbData ); 224 } 225 226 /*********************************************************************** 227 * AVIFileReadData (AVIFIL32.@) 229 228 */ 230 229 HRESULT 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.@)230 PAVIFILE pfile,DWORD dwChunkId,LPVOID lpvData,LPLONG pcbData ) 231 { 232 return IAVIFile_ReadData( pfile,dwChunkId,lpvData,pcbData ); 233 } 234 235 /*********************************************************************** 236 * AVIFileEndRecord (AVIFIL32.@) 238 237 */ 239 238 HRESULT WINAPI AVIFileEndRecord( PAVIFILE pfile ) 240 239 { 241 return IAVIFile_EndRecord( pfile );242 } 243 244 /*********************************************************************** 245 * AVIStreamAddRef (AVIFIL32.@)240 return IAVIFile_EndRecord( pfile ); 241 } 242 243 /*********************************************************************** 244 * AVIStreamAddRef (AVIFIL32.@) 246 245 */ 247 246 ULONG WINAPI AVIStreamAddRef(PAVISTREAM pas) 248 247 { 249 return IAVIStream_Release(pas);250 } 251 252 /*********************************************************************** 253 * AVIStreamRelease (AVIFIL32.@)248 return IAVIStream_Release(pas); 249 } 250 251 /*********************************************************************** 252 * AVIStreamRelease (AVIFIL32.@) 254 253 */ 255 254 ULONG WINAPI AVIStreamRelease(PAVISTREAM pas) 256 255 { 257 return IAVIStream_Release(pas);258 } 259 260 /*********************************************************************** 261 * AVIStreamInfoW (AVIFIL32.@)256 return IAVIStream_Release(pas); 257 } 258 259 /*********************************************************************** 260 * AVIStreamInfoW (AVIFIL32.@) 262 261 */ 263 262 HRESULT WINAPI AVIStreamInfoW(PAVISTREAM pas,AVISTREAMINFOW* psi,LONG lSize) 264 263 { 265 return IAVIStream_Info(pas,psi,lSize);266 } 267 268 /*********************************************************************** 269 * AVIStreamInfo (AVIFIL32.@)270 * AVIStreamInfoA (AVIFIL32.@)264 return IAVIStream_Info(pas,psi,lSize); 265 } 266 267 /*********************************************************************** 268 * AVIStreamInfo (AVIFIL32.@) 269 * AVIStreamInfoA (AVIFIL32.@) 271 270 */ 272 271 HRESULT WINAPI AVIStreamInfoA(PAVISTREAM pas,AVISTREAMINFOA* psi,LONG lSize) 273 272 { 274 AVISTREAMINFOWsiw;275 HRESULThr;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.@)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.@) 291 290 */ 292 291 LONG WINAPI AVIStreamFindSample(PAVISTREAM pas,LONG lPos,LONG lFlags) 293 292 { 294 return IAVIStream_FindSample(pas,lPos,lFlags);295 } 296 297 /*********************************************************************** 298 * AVIStreamReadFormat (AVIFIL32.@)293 return IAVIStream_FindSample(pas,lPos,lFlags); 294 } 295 296 /*********************************************************************** 297 * AVIStreamReadFormat (AVIFIL32.@) 299 298 */ 300 299 HRESULT WINAPI AVIStreamReadFormat(PAVISTREAM pas,LONG pos,LPVOID format,LONG *formatsize) { 301 return IAVIStream_ReadFormat(pas,pos,format,formatsize);302 } 303 304 /*********************************************************************** 305 * AVIStreamSetFormat (AVIFIL32.@)300 return IAVIStream_ReadFormat(pas,pos,format,formatsize); 301 } 302 303 /*********************************************************************** 304 * AVIStreamSetFormat (AVIFIL32.@) 306 305 */ 307 306 HRESULT WINAPI AVIStreamSetFormat(PAVISTREAM pas,LONG pos,LPVOID format,LONG formatsize) { 308 return IAVIStream_SetFormat(pas,pos,format,formatsize);309 } 310 311 /*********************************************************************** 312 * AVIStreamReadData (AVIFIL32.@)307 return IAVIStream_SetFormat(pas,pos,format,formatsize); 308 } 309 310 /*********************************************************************** 311 * AVIStreamReadData (AVIFIL32.@) 313 312 */ 314 313 HRESULT WINAPI AVIStreamReadData(PAVISTREAM pas,DWORD fcc,LPVOID lp,LONG *lpread) { 315 return IAVIStream_ReadData(pas,fcc,lp,lpread);316 } 317 318 /*********************************************************************** 319 * AVIStreamWriteData (AVIFIL32.@)314 return IAVIStream_ReadData(pas,fcc,lp,lpread); 315 } 316 317 /*********************************************************************** 318 * AVIStreamWriteData (AVIFIL32.@) 320 319 */ 321 320 HRESULT WINAPI AVIStreamWriteData(PAVISTREAM pas,DWORD fcc,LPVOID lp,LONG size) { 322 return IAVIStream_WriteData(pas,fcc,lp,size);323 } 324 325 /*********************************************************************** 326 * AVIStreamRead (AVIFIL32.@)321 return IAVIStream_WriteData(pas,fcc,lp,size); 322 } 323 324 /*********************************************************************** 325 * AVIStreamRead (AVIFIL32.@) 327 326 */ 328 327 HRESULT WINAPI AVIStreamRead(PAVISTREAM pas,LONG start,LONG samples,LPVOID buffer,LONG buffersize,LONG *bytesread,LONG *samplesread) 329 328 { 330 return IAVIStream_Read(pas,start,samples,buffer,buffersize,bytesread,samplesread);331 } 332 333 /*********************************************************************** 334 * AVIStreamWrite (AVIFIL32.@)329 return IAVIStream_Read(pas,start,samples,buffer,buffersize,bytesread,samplesread); 330 } 331 332 /*********************************************************************** 333 * AVIStreamWrite (AVIFIL32.@) 335 334 */ 336 335 HRESULT 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.@)336 return IAVIStream_Write(pas,start,samples,buffer,buffersize,flags,sampwritten,byteswritten); 337 } 338 339 340 /*********************************************************************** 341 * AVIStreamStart (AVIFIL32.@) 343 342 */ 344 343 LONG WINAPI AVIStreamStart(PAVISTREAM pas) 345 344 { 346 AVISTREAMINFOWsi;347 HRESULThr;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.@)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.@) 357 356 */ 358 357 LONG WINAPI AVIStreamLength(PAVISTREAM pas) 359 358 { 360 AVISTREAMINFOWsi;361 HRESULThr;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.@)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.@) 371 370 */ 372 371 LONG WINAPI AVIStreamTimeToSample(PAVISTREAM pas,LONG lTime) 373 372 { 374 AVISTREAMINFOWsi;375 HRESULThr;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.@)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.@) 388 387 */ 389 388 LONG WINAPI AVIStreamSampleToTime(PAVISTREAM pas,LONG lSample) 390 389 { 391 AVISTREAMINFOWsi;392 HRESULThr;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.@)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.@) 405 404 */ 406 405 HRESULT WINAPI AVIStreamBeginStreaming(PAVISTREAM pas,LONG lStart,LONG lEnd,LONG lRate) 407 406 { 408 FIXME("(%p)->(%ld,%ld,%ld),stub!\n",pas,lStart,lEnd,lRate);409 return E_FAIL;410 } 411 412 /*********************************************************************** 413 * AVIStreamEndStreaming (AVIFIL32.@)407 FIXME("(%p)->(%ld,%ld,%ld),stub!\n",pas,lStart,lEnd,lRate); 408 return E_FAIL; 409 } 410 411 /*********************************************************************** 412 * AVIStreamEndStreaming (AVIFIL32.@) 414 413 */ 415 414 HRESULT WINAPI AVIStreamEndStreaming(PAVISTREAM pas) 416 415 { 417 FIXME("(%p)->(),stub!\n",pas);418 return E_FAIL;419 } 420 421 /*********************************************************************** 422 * AVIStreamGetFrameOpen (AVIFIL32.@)416 FIXME("(%p)->(),stub!\n",pas); 417 return E_FAIL; 418 } 419 420 /*********************************************************************** 421 * AVIStreamGetFrameOpen (AVIFIL32.@) 423 422 */ 424 423 PGETFRAME WINAPI AVIStreamGetFrameOpen(PAVISTREAM pas,LPBITMAPINFOHEADER pbi) 425 424 { 426 IGetFrame*pgf;427 HRESULThr;428 AVISTREAMINFOWsi;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.@)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.@) 451 450 */ 452 451 LPVOID WINAPI AVIStreamGetFrame(PGETFRAME pgf, LONG lPos) 453 452 { 454 return IGetFrame_GetFrame(pgf,lPos);455 } 456 457 /*********************************************************************** 458 * AVIStreamGetFrameClose (AVIFIL32.@)453 return IGetFrame_GetFrame(pgf,lPos); 454 } 455 456 /*********************************************************************** 457 * AVIStreamGetFrameClose (AVIFIL32.@) 459 458 */ 460 459 HRESULT WINAPI AVIStreamGetFrameClose(PGETFRAME pgf) 461 460 { 462 return IGetFrame_End(pgf);463 } 464 465 /*********************************************************************** 466 * AVIStreamOpenFromFileA (AVIFIL32.@)461 return IGetFrame_End(pgf); 462 } 463 464 /*********************************************************************** 465 * AVIStreamOpenFromFileA (AVIFIL32.@) 467 466 */ 468 467 HRESULT WINAPI AVIStreamOpenFromFileA(PAVISTREAM* ppas, LPCSTR szFile, DWORD fccType, LONG lParam, UINT uMode, CLSID* lpHandler) 469 468 { 470 WCHAR*pwsz;471 HRESULThr;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.@)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.@) 483 482 */ 484 483 HRESULT WINAPI AVIStreamOpenFromFileW(PAVISTREAM* ppas, LPCWSTR szFile, DWORD fccType, LONG lParam, UINT uMode, CLSID* lpHandler) 485 484 { 486 HRESULThr;487 PAVIFILEpaf;488 AVIFILEINFOWfi;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.@)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.@) 505 504 */ 506 505 HRESULT WINAPI AVIStreamCreate(PAVISTREAM* ppas, LONG lParam1, LONG lParam2, CLSID* lpHandler) 507 506 { 508 HRESULThr;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 else519 {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.@)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.@) 547 546 */ 548 547 HRESULT WINAPI AVIMakeCompressedStream(PAVISTREAM *ppsCompressed,PAVISTREAM ppsSource,AVICOMPRESSOPTIONS *aco,CLSID *pclsidHandler) 549 548 { 550 FIXME("(%p,%p,%p,%p)\n",ppsCompressed,ppsSource,aco,pclsidHandler);551 return E_FAIL;552 } 553 549 FIXME("(%p,%p,%p,%p)\n",ppsCompressed,ppsSource,aco,pclsidHandler); 550 return E_FAIL; 551 } 552 -
trunk/src/avifil32/comentry.c
r6644 r6712 1 /* $Id: comentry.c,v 1.2 2001-09-05 12:00:53 bird Exp $ 2 * 1 /* 3 2 * Copyright 2001 Hidenori TAKESHIMA <hidenori@a2.ctktv.ne.jp> 4 3 */ … … 28 27 static ICOM_VTABLE(IClassFactory) iclassfact = 29 28 { 30 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE31 IClassFactory_fnQueryInterface,32 IClassFactory_fnAddRef,33 IClassFactory_fnRelease,34 IClassFactory_fnCreateInstance,35 IClassFactory_fnLockServer29 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE 30 IClassFactory_fnQueryInterface, 31 IClassFactory_fnAddRef, 32 IClassFactory_fnRelease, 33 IClassFactory_fnCreateInstance, 34 IClassFactory_fnLockServer 36 35 }; 37 36 38 37 typedef struct 39 38 { 40 /* IUnknown fields */41 ICOM_VFIELD(IClassFactory);42 DWORDref;39 /* IUnknown fields */ 40 ICOM_VFIELD(IClassFactory); 41 DWORD ref; 43 42 } IClassFactoryImpl; 44 43 … … 50 49 IClassFactory_fnQueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) 51 50 { 52 ICOM_THIS(IClassFactoryImpl,iface);51 ICOM_THIS(IClassFactoryImpl,iface); 53 52 54 TRACE("(%p)->(%p,%p)\n",This,riid,ppobj);55 if ( ( IsEqualGUID( &IID_IUnknown, riid ) ) ||56 ( IsEqualGUID( &IID_IClassFactory, riid ) ) )57 {58 *ppobj = iface;59 IClassFactory_AddRef(iface);60 return S_OK;61 }53 TRACE("(%p)->(%p,%p)\n",This,riid,ppobj); 54 if ( ( IsEqualGUID( &IID_IUnknown, riid ) ) || 55 ( IsEqualGUID( &IID_IClassFactory, riid ) ) ) 56 { 57 *ppobj = iface; 58 IClassFactory_AddRef(iface); 59 return S_OK; 60 } 62 61 63 return E_NOINTERFACE;62 return E_NOINTERFACE; 64 63 } 65 64 66 65 static ULONG WINAPI IClassFactory_fnAddRef(LPCLASSFACTORY iface) 67 66 { 68 ICOM_THIS(IClassFactoryImpl,iface);67 ICOM_THIS(IClassFactoryImpl,iface); 69 68 70 TRACE("(%p)->()\n",This);71 if ( (This->ref) == 0 )72 AVIFILE_data.dwClassObjRef ++;69 TRACE("(%p)->()\n",This); 70 if ( (This->ref) == 0 ) 71 AVIFILE_data.dwClassObjRef ++; 73 72 74 return ++(This->ref);73 return ++(This->ref); 75 74 } 76 75 77 76 static ULONG WINAPI IClassFactory_fnRelease(LPCLASSFACTORY iface) 78 77 { 79 ICOM_THIS(IClassFactoryImpl,iface);78 ICOM_THIS(IClassFactoryImpl,iface); 80 79 81 TRACE("(%p)->()\n",This);82 if ( (--(This->ref)) > 0 )83 return This->ref;80 TRACE("(%p)->()\n",This); 81 if ( (--(This->ref)) > 0 ) 82 return This->ref; 84 83 85 AVIFILE_data.dwClassObjRef --;86 return 0;84 AVIFILE_data.dwClassObjRef --; 85 return 0; 87 86 } 88 87 … … 91 90 /*ICOM_THIS(IClassFactoryImpl,iface);*/ 92 91 93 *ppobj = NULL;94 if ( pOuter != NULL )95 return E_FAIL;92 *ppobj = NULL; 93 if ( pOuter != NULL ) 94 return E_FAIL; 96 95 97 if ( IsEqualGUID( &IID_IAVIFile, riid ) )98 return AVIFILE_CreateIAVIFile(ppobj);99 if ( IsEqualGUID( &IID_IAVIStream, riid ) )100 return AVIFILE_CreateIAVIStream(ppobj);96 if ( IsEqualGUID( &IID_IAVIFile, riid ) ) 97 return AVIFILE_CreateIAVIFile(ppobj); 98 if ( IsEqualGUID( &IID_IAVIStream, riid ) ) 99 return AVIFILE_CreateIAVIStream(ppobj); 101 100 102 return E_NOINTERFACE;101 return E_NOINTERFACE; 103 102 } 104 103 105 104 static HRESULT WINAPI IClassFactory_fnLockServer(LPCLASSFACTORY iface,BOOL dolock) 106 105 { 107 ICOM_THIS(IClassFactoryImpl,iface);108 HRESULThr;106 ICOM_THIS(IClassFactoryImpl,iface); 107 HRESULT hr; 109 108 110 FIXME("(%p)->(%d),stub!\n",This,dolock);111 if (dolock)112 hr = IClassFactory_AddRef(iface);113 else114 hr = IClassFactory_Release(iface);109 FIXME("(%p)->(%d),stub!\n",This,dolock); 110 if (dolock) 111 hr = IClassFactory_AddRef(iface); 112 else 113 hr = IClassFactory_Release(iface); 115 114 116 return hr;115 return hr; 117 116 } 118 117 119 118 120 119 /*********************************************************************** 121 * DllGetClassObject (AVIFIL32.@)120 * DllGetClassObject (AVIFIL32.@) 122 121 */ 123 122 HRESULT WINAPI AVIFILE_DllGetClassObject(const CLSID* pclsid,const IID* piid,void** ppv) 124 123 { 125 *ppv = NULL;126 if ( IsEqualCLSID( &IID_IClassFactory, piid ) )127 {128 *ppv = (LPVOID)&AVIFILE_GlobalCF;129 IClassFactory_AddRef((IClassFactory*)*ppv);130 return S_OK;131 }124 *ppv = NULL; 125 if ( IsEqualCLSID( &IID_IClassFactory, piid ) ) 126 { 127 *ppv = (LPVOID)&AVIFILE_GlobalCF; 128 IClassFactory_AddRef((IClassFactory*)*ppv); 129 return S_OK; 130 } 132 131 133 return CLASS_E_CLASSNOTAVAILABLE;132 return CLASS_E_CLASSNOTAVAILABLE; 134 133 } 135 134 136 135 /***************************************************************************** 137 * DllCanUnloadNow (AVIFIL32.@)136 * DllCanUnloadNow (AVIFIL32.@) 138 137 */ 139 138 DWORD WINAPI AVIFILE_DllCanUnloadNow(void) 140 139 { 141 return ( AVIFILE_data.dwClassObjRef == 0 ) ? S_OK : S_FALSE;140 return ( AVIFILE_data.dwClassObjRef == 0 ) ? S_OK : S_FALSE; 142 141 } 143 142 -
trunk/src/avifil32/guid.c
r6652 r6712 1 /* $Id: guid.c,v 1.2 2001-09-05 14:16:44 bird Exp $ */2 1 #define INITGUID 3 2 -
trunk/src/avifil32/iafile.c
r6652 r6712 1 /* $Id: iafile.c,v 1.2 2001-09-05 14:16:44 bird Exp $ */2 1 /* 3 2 * Copyright 1999 Marcus Meissner … … 21 20 DEFAULT_DEBUG_CHANNEL(avifile); 22 21 23 #define AVIFILE_STREAMS_MAX422 #define AVIFILE_STREAMS_MAX 4 24 23 25 24 … … 53 52 typedef struct IAVIFileImpl 54 53 { 55 ICOM_VFIELD(IAVIFile);56 /* IUnknown stuff */57 DWORDref;58 /* IAVIFile stuff */59 HANDLEhf;60 DWORDdwAVIFileCaps;61 DWORDdwAVIFileScale;62 DWORDdwAVIFileRate;63 DWORDdwAVIFileLength;64 DWORDdwAVIFileEditCount;65 MainAVIHeaderhdr;66 IAVIStream*pStreams[AVIFILE_STREAMS_MAX];67 AVIStreamHeaderstrhdrs[AVIFILE_STREAMS_MAX];68 DWORDdwMoviTop;69 DWORDdwCountOfIndexEntry;70 AVIINDEXENTRY*pIndexEntry;71 AVIINDEXENTRY*pStreamIndexEntry[AVIFILE_STREAMS_MAX+1];54 ICOM_VFIELD(IAVIFile); 55 /* IUnknown stuff */ 56 DWORD ref; 57 /* IAVIFile stuff */ 58 HANDLE hf; 59 DWORD dwAVIFileCaps; 60 DWORD dwAVIFileScale; 61 DWORD dwAVIFileRate; 62 DWORD dwAVIFileLength; 63 DWORD dwAVIFileEditCount; 64 MainAVIHeader hdr; 65 IAVIStream* pStreams[AVIFILE_STREAMS_MAX]; 66 AVIStreamHeader strhdrs[AVIFILE_STREAMS_MAX]; 67 DWORD dwMoviTop; 68 DWORD dwCountOfIndexEntry; 69 AVIINDEXENTRY* pIndexEntry; 70 AVIINDEXENTRY* pStreamIndexEntry[AVIFILE_STREAMS_MAX+1]; 72 71 } IAVIFileImpl; 73 72 … … 78 77 79 78 static HRESULT AVIFILE_IAVIFile_ReadNextChunkHeader( 80 IAVIFileImpl* This, FOURCC* pfcc, DWORD* pdwSize )81 { 82 BYTEbuf[8];83 DWORDdwRead;84 85 if ( ( !ReadFile( This->hf, buf, 8, &dwRead, NULL ) ) ||86 ( 8 != dwRead ) )87 return AVIERR_FILEREAD;88 *pfcc = mmioFOURCC(buf[0],buf[1],buf[2],buf[3]);89 *pdwSize = ( ((DWORD)buf[4]) ) |90 ( ((DWORD)buf[5]) << 8 ) |91 ( ((DWORD)buf[6]) << 16 ) |92 ( ((DWORD)buf[7]) << 24 );93 94 return S_OK;79 IAVIFileImpl* This, FOURCC* pfcc, DWORD* pdwSize ) 80 { 81 BYTE buf[8]; 82 DWORD dwRead; 83 84 if ( ( !ReadFile( This->hf, buf, 8, &dwRead, NULL ) ) || 85 ( 8 != dwRead ) ) 86 return AVIERR_FILEREAD; 87 *pfcc = mmioFOURCC(buf[0],buf[1],buf[2],buf[3]); 88 *pdwSize = ( ((DWORD)buf[4]) ) | 89 ( ((DWORD)buf[5]) << 8 ) | 90 ( ((DWORD)buf[6]) << 16 ) | 91 ( ((DWORD)buf[7]) << 24 ); 92 93 return S_OK; 95 94 } 96 95 97 96 static HRESULT AVIFILE_IAVIFile_SkipChunkData( 98 IAVIFileImpl* This, DWORD dwChunkSize )99 { 100 LONGlHigh = 0;101 DWORDdwRes;102 103 if ( dwChunkSize == 0 )104 return S_OK;105 106 SetLastError(NO_ERROR);107 dwRes = SetFilePointer( This->hf, (LONG)dwChunkSize,108 &lHigh, FILE_CURRENT );109 if ( dwRes == (DWORD)0xffffffff && GetLastError() != NO_ERROR )110 return AVIERR_FILEREAD;111 112 return S_OK;97 IAVIFileImpl* This, DWORD dwChunkSize ) 98 { 99 LONG lHigh = 0; 100 DWORD dwRes; 101 102 if ( dwChunkSize == 0 ) 103 return S_OK; 104 105 SetLastError(NO_ERROR); 106 dwRes = SetFilePointer( This->hf, (LONG)dwChunkSize, 107 &lHigh, FILE_CURRENT ); 108 if ( dwRes == (DWORD)0xffffffff && GetLastError() != NO_ERROR ) 109 return AVIERR_FILEREAD; 110 111 return S_OK; 113 112 } 114 113 115 114 static HRESULT AVIFILE_IAVIFile_ReadChunkData( 116 IAVIFileImpl* This, DWORD dwChunkSize,117 LPVOID lpvBuf, DWORD dwBufSize, LPDWORD lpdwRead )118 { 119 if ( dwBufSize > dwChunkSize )120 dwBufSize = dwChunkSize;121 if ( ( !ReadFile( This->hf, lpvBuf, dwBufSize, lpdwRead, NULL ) ) ||122 ( dwBufSize != *lpdwRead ) )123 return AVIERR_FILEREAD;124 125 return AVIFILE_IAVIFile_SkipChunkData( This, dwChunkSize - dwBufSize );115 IAVIFileImpl* This, DWORD dwChunkSize, 116 LPVOID lpvBuf, DWORD dwBufSize, LPDWORD lpdwRead ) 117 { 118 if ( dwBufSize > dwChunkSize ) 119 dwBufSize = dwChunkSize; 120 if ( ( !ReadFile( This->hf, lpvBuf, dwBufSize, lpdwRead, NULL ) ) || 121 ( dwBufSize != *lpdwRead ) ) 122 return AVIERR_FILEREAD; 123 124 return AVIFILE_IAVIFile_SkipChunkData( This, dwChunkSize - dwBufSize ); 126 125 } 127 126 128 127 static HRESULT AVIFILE_IAVIFile_SeekToSpecifiedChunk( 129 IAVIFileImpl* This, FOURCC fccType, DWORD* pdwLen )130 { 131 HRESULThr;132 FOURCCfcc;133 BYTEbuf[4];134 DWORDdwRead;135 136 while ( 1 )137 {138 hr = AVIFILE_IAVIFile_ReadNextChunkHeader(139 This, &fcc, pdwLen );140 if ( hr != S_OK )141 return hr;142 if ( fcc == fccType )143 return S_OK;144 145 if ( fcc == FOURCC_LIST )146 {147 if ( ( !ReadFile( This->hf, buf, 4, &dwRead, NULL ) ) ||148 ( 4 != dwRead ) )149 return AVIERR_FILEREAD;150 }151 else152 {153 hr = AVIFILE_IAVIFile_SkipChunkData(154 This, *pdwLen );155 if ( hr != S_OK )156 return hr;157 }158 }128 IAVIFileImpl* This, FOURCC fccType, DWORD* pdwLen ) 129 { 130 HRESULT hr; 131 FOURCC fcc; 132 BYTE buf[4]; 133 DWORD dwRead; 134 135 while ( 1 ) 136 { 137 hr = AVIFILE_IAVIFile_ReadNextChunkHeader( 138 This, &fcc, pdwLen ); 139 if ( hr != S_OK ) 140 return hr; 141 if ( fcc == fccType ) 142 return S_OK; 143 144 if ( fcc == FOURCC_LIST ) 145 { 146 if ( ( !ReadFile( This->hf, buf, 4, &dwRead, NULL ) ) || 147 ( 4 != dwRead ) ) 148 return AVIERR_FILEREAD; 149 } 150 else 151 { 152 hr = AVIFILE_IAVIFile_SkipChunkData( 153 This, *pdwLen ); 154 if ( hr != S_OK ) 155 return hr; 156 } 157 } 159 158 } 160 159 … … 162 161 WINE_AVISTREAM_DATA* AVIFILE_Alloc_IAVIStreamData( DWORD dwFmtLen ) 163 162 { 164 WINE_AVISTREAM_DATA*pData;165 166 pData = (WINE_AVISTREAM_DATA*)167 HeapAlloc( AVIFILE_data.hHeap,HEAP_ZERO_MEMORY,168 sizeof(WINE_AVISTREAM_DATA) );169 if ( pData == NULL )170 return NULL;171 if ( dwFmtLen > 0 )172 {173 pData->pbFmt = (BYTE*)174 HeapAlloc( AVIFILE_data.hHeap,HEAP_ZERO_MEMORY,175 sizeof(BYTE)*dwFmtLen );176 if ( pData->pbFmt == NULL )177 {178 AVIFILE_Free_IAVIStreamData( pData );179 return NULL;180 }181 }182 pData->dwFmtLen = dwFmtLen;183 184 return pData;163 WINE_AVISTREAM_DATA* pData; 164 165 pData = (WINE_AVISTREAM_DATA*) 166 HeapAlloc( AVIFILE_data.hHeap,HEAP_ZERO_MEMORY, 167 sizeof(WINE_AVISTREAM_DATA) ); 168 if ( pData == NULL ) 169 return NULL; 170 if ( dwFmtLen > 0 ) 171 { 172 pData->pbFmt = (BYTE*) 173 HeapAlloc( AVIFILE_data.hHeap,HEAP_ZERO_MEMORY, 174 sizeof(BYTE)*dwFmtLen ); 175 if ( pData->pbFmt == NULL ) 176 { 177 AVIFILE_Free_IAVIStreamData( pData ); 178 return NULL; 179 } 180 } 181 pData->dwFmtLen = dwFmtLen; 182 183 return pData; 185 184 } 186 185 187 186 void AVIFILE_Free_IAVIStreamData( WINE_AVISTREAM_DATA* pData ) 188 187 { 189 if ( pData != NULL )190 {191 if ( pData->pbFmt != NULL )192 HeapFree( AVIFILE_data.hHeap,0,pData->pbFmt );193 HeapFree( AVIFILE_data.hHeap,0,pData );194 }188 if ( pData != NULL ) 189 { 190 if ( pData->pbFmt != NULL ) 191 HeapFree( AVIFILE_data.hHeap,0,pData->pbFmt ); 192 HeapFree( AVIFILE_data.hHeap,0,pData ); 193 } 195 194 } 196 195 197 196 static void AVIFILE_IAVIFile_InitIndexTable( 198 IAVIFileImpl* This,199 AVIINDEXENTRY* pIndexBuf,200 AVIINDEXENTRY* pIndexData,201 DWORD dwCountOfIndexEntry )202 { 203 DWORDdwStreamIndex;204 DWORDdwIndex;205 FOURCCckid;206 207 dwStreamIndex = 0;208 for ( ; dwStreamIndex < (AVIFILE_STREAMS_MAX+1); dwStreamIndex ++ )209 This->pStreamIndexEntry[dwStreamIndex] = NULL;210 211 dwStreamIndex = 0;212 for ( ; dwStreamIndex < This->hdr.dwStreams; dwStreamIndex ++ )213 {214 ckid = mmioFOURCC('0','0'+dwStreamIndex,0,0);215 TRACE( "testing ckid %c%c%c%c\n",216 (int)(ckid>> 0)&0xff,217 (int)(ckid>> 8)&0xff,218 (int)(ckid>>16)&0xff,219 (int)(ckid>>24)&0xff );220 This->pStreamIndexEntry[dwStreamIndex] = pIndexBuf;221 FIXME( "pIndexBuf = %p\n", pIndexBuf );222 for ( dwIndex = 0; dwIndex < dwCountOfIndexEntry; dwIndex++ )223 {224 TRACE( "ckid %c%c%c%c\n",225 (int)(pIndexData[dwIndex].ckid>> 0)&0xff,197 IAVIFileImpl* This, 198 AVIINDEXENTRY* pIndexBuf, 199 AVIINDEXENTRY* pIndexData, 200 DWORD dwCountOfIndexEntry ) 201 { 202 DWORD dwStreamIndex; 203 DWORD dwIndex; 204 FOURCC ckid; 205 206 dwStreamIndex = 0; 207 for ( ; dwStreamIndex < (AVIFILE_STREAMS_MAX+1); dwStreamIndex ++ ) 208 This->pStreamIndexEntry[dwStreamIndex] = NULL; 209 210 dwStreamIndex = 0; 211 for ( ; dwStreamIndex < This->hdr.dwStreams; dwStreamIndex ++ ) 212 { 213 ckid = mmioFOURCC('0','0'+dwStreamIndex,0,0); 214 TRACE( "testing ckid %c%c%c%c\n", 215 (int)(ckid>> 0)&0xff, 216 (int)(ckid>> 8)&0xff, 217 (int)(ckid>>16)&0xff, 218 (int)(ckid>>24)&0xff ); 219 This->pStreamIndexEntry[dwStreamIndex] = pIndexBuf; 220 FIXME( "pIndexBuf = %p\n", pIndexBuf ); 221 for ( dwIndex = 0; dwIndex < dwCountOfIndexEntry; dwIndex++ ) 222 { 223 TRACE( "ckid %c%c%c%c\n", 224 (int)(pIndexData[dwIndex].ckid>> 0)&0xff, 226 225 (int)(pIndexData[dwIndex].ckid>> 8)&0xff, 227 226 (int)(pIndexData[dwIndex].ckid>>16)&0xff, 228 227 (int)(pIndexData[dwIndex].ckid>>24)&0xff ); 229 230 if ( (pIndexData[dwIndex].ckid & mmioFOURCC(0xff,0xff,0,0))231 == ckid )232 {233 memcpy( pIndexBuf, &pIndexData[dwIndex],234 sizeof(AVIINDEXENTRY) );235 pIndexBuf ++;236 }237 }228 229 if ( (pIndexData[dwIndex].ckid & mmioFOURCC(0xff,0xff,0,0)) 230 == ckid ) 231 { 232 memcpy( pIndexBuf, &pIndexData[dwIndex], 233 sizeof(AVIINDEXENTRY) ); 234 pIndexBuf ++; 235 } 236 } 238 237 FIXME( "pIndexBuf = %p\n", pIndexBuf ); 239 }240 This->pStreamIndexEntry[This->hdr.dwStreams] = pIndexBuf;238 } 239 This->pStreamIndexEntry[This->hdr.dwStreams] = pIndexBuf; 241 240 } 242 241 … … 251 250 HRESULT AVIFILE_CreateIAVIFile(void** ppobj) 252 251 { 253 IAVIFileImpl*This;254 HRESULThr;255 256 TRACE("(%p)\n",ppobj);257 *ppobj = NULL;258 This = (IAVIFileImpl*)HeapAlloc(AVIFILE_data.hHeap,HEAP_ZERO_MEMORY,259 sizeof(IAVIFileImpl));260 if ( This == NULL )261 return AVIERR_MEMORY;262 This->ref = 1;263 ICOM_VTBL(This) = &iavift;264 hr = AVIFILE_IAVIFile_Construct( This );265 if ( hr != S_OK )266 {267 AVIFILE_IAVIFile_Destruct( This );268 return hr;269 }270 271 TRACE("new -> %p\n",This);272 *ppobj = (LPVOID)This;273 274 return S_OK;252 IAVIFileImpl *This; 253 HRESULT hr; 254 255 TRACE("(%p)\n",ppobj); 256 *ppobj = NULL; 257 This = (IAVIFileImpl*)HeapAlloc(AVIFILE_data.hHeap,HEAP_ZERO_MEMORY, 258 sizeof(IAVIFileImpl)); 259 if ( This == NULL ) 260 return AVIERR_MEMORY; 261 This->ref = 1; 262 ICOM_VTBL(This) = &iavift; 263 hr = AVIFILE_IAVIFile_Construct( This ); 264 if ( hr != S_OK ) 265 { 266 AVIFILE_IAVIFile_Destruct( This ); 267 return hr; 268 } 269 270 TRACE("new -> %p\n",This); 271 *ppobj = (LPVOID)This; 272 273 return S_OK; 275 274 } 276 275 … … 280 279 281 280 static HRESULT WINAPI IAVIFile_fnQueryInterface(IAVIFile* iface,REFIID refiid,LPVOID *obj) { 282 ICOM_THIS(IAVIFileImpl,iface);283 284 TRACE("(%p)->QueryInterface(%s,%p)\n",This,debugstr_guid(refiid),obj);285 if ( IsEqualGUID(&IID_IUnknown,refiid) ||286 IsEqualGUID(&IID_IAVIFile,refiid) )287 {288 *obj = iface;289 IAVIFile_AddRef(iface);290 return S_OK;291 }292 return OLE_E_ENUM_NOMORE;281 ICOM_THIS(IAVIFileImpl,iface); 282 283 TRACE("(%p)->QueryInterface(%s,%p)\n",This,debugstr_guid(refiid),obj); 284 if ( IsEqualGUID(&IID_IUnknown,refiid) || 285 IsEqualGUID(&IID_IAVIFile,refiid) ) 286 { 287 *obj = iface; 288 IAVIFile_AddRef(iface); 289 return S_OK; 290 } 291 return OLE_E_ENUM_NOMORE; 293 292 } 294 293 295 294 static ULONG WINAPI IAVIFile_fnAddRef(IAVIFile* iface) { 296 ICOM_THIS(IAVIFileImpl,iface);297 298 TRACE("(%p)->AddRef()\n",iface);299 return ++(This->ref);295 ICOM_THIS(IAVIFileImpl,iface); 296 297 TRACE("(%p)->AddRef()\n",iface); 298 return ++(This->ref); 300 299 } 301 300 302 301 static ULONG WINAPI IAVIFile_fnRelease(IAVIFile* iface) { 303 ICOM_THIS(IAVIFileImpl,iface);304 305 TRACE("(%p)->Release()\n",iface);306 if ( (--(This->ref)) > 0 )307 return This->ref;308 309 AVIFILE_IAVIFile_Destruct(This);310 HeapFree(AVIFILE_data.hHeap,0,iface);311 return 0;302 ICOM_THIS(IAVIFileImpl,iface); 303 304 TRACE("(%p)->Release()\n",iface); 305 if ( (--(This->ref)) > 0 ) 306 return This->ref; 307 308 AVIFILE_IAVIFile_Destruct(This); 309 HeapFree(AVIFILE_data.hHeap,0,iface); 310 return 0; 312 311 } 313 312 … … 318 317 static HRESULT AVIFILE_IAVIFile_Construct( IAVIFileImpl* This ) 319 318 { 320 DWORDdwIndex;321 322 This->hf = INVALID_HANDLE_VALUE;323 This->dwAVIFileCaps = 0;324 This->dwAVIFileScale = 0;325 This->dwAVIFileRate = 0;326 This->dwAVIFileLength = 0;327 This->dwAVIFileEditCount = 0;328 for ( dwIndex = 0; dwIndex < AVIFILE_STREAMS_MAX; dwIndex++ )329 This->pStreams[dwIndex] = NULL;330 This->dwCountOfIndexEntry = 0;331 This->pIndexEntry = NULL;332 333 AVIFILE_data.dwClassObjRef ++;334 335 return S_OK;319 DWORD dwIndex; 320 321 This->hf = INVALID_HANDLE_VALUE; 322 This->dwAVIFileCaps = 0; 323 This->dwAVIFileScale = 0; 324 This->dwAVIFileRate = 0; 325 This->dwAVIFileLength = 0; 326 This->dwAVIFileEditCount = 0; 327 for ( dwIndex = 0; dwIndex < AVIFILE_STREAMS_MAX; dwIndex++ ) 328 This->pStreams[dwIndex] = NULL; 329 This->dwCountOfIndexEntry = 0; 330 This->pIndexEntry = NULL; 331 332 AVIFILE_data.dwClassObjRef ++; 333 334 return S_OK; 336 335 } 337 336 338 337 static void AVIFILE_IAVIFile_Destruct( IAVIFileImpl* This ) 339 338 { 340 DWORDdwIndex;341 342 if ( This->pIndexEntry != NULL )343 {344 HeapFree(AVIFILE_data.hHeap,0,This->pIndexEntry);345 This->pIndexEntry = NULL;346 }347 348 for ( dwIndex = 0; dwIndex < AVIFILE_STREAMS_MAX; dwIndex++ )349 {350 if ( This->pStreams[dwIndex] != NULL )351 {352 IAVIStream_Release( This->pStreams[dwIndex] );353 This->pStreams[dwIndex] = NULL;354 }355 }356 357 if ( This->hf != INVALID_HANDLE_VALUE )358 CloseHandle( This->hf );359 360 AVIFILE_data.dwClassObjRef --;339 DWORD dwIndex; 340 341 if ( This->pIndexEntry != NULL ) 342 { 343 HeapFree(AVIFILE_data.hHeap,0,This->pIndexEntry); 344 This->pIndexEntry = NULL; 345 } 346 347 for ( dwIndex = 0; dwIndex < AVIFILE_STREAMS_MAX; dwIndex++ ) 348 { 349 if ( This->pStreams[dwIndex] != NULL ) 350 { 351 IAVIStream_Release( This->pStreams[dwIndex] ); 352 This->pStreams[dwIndex] = NULL; 353 } 354 } 355 356 if ( This->hf != INVALID_HANDLE_VALUE ) 357 CloseHandle( This->hf ); 358 359 AVIFILE_data.dwClassObjRef --; 361 360 } 362 361 363 362 static HRESULT WINAPI IAVIFile_fnInfo(IAVIFile*iface,AVIFILEINFOW*afi,LONG size) 364 363 { 365 ICOM_THIS(IAVIFileImpl,iface);366 AVIFILEINFOWfiw;367 368 FIXME("(%p)->Info(%p,%ld)\n",iface,afi,size);369 370 memset( &fiw, 0, sizeof(fiw) );371 fiw.dwMaxBytesPerSec = This->hdr.dwMaxBytesPerSec;372 fiw.dwFlags = This->hdr.dwFlags;373 fiw.dwCaps = This->dwAVIFileCaps;374 fiw.dwStreams = This->hdr.dwStreams;375 fiw.dwSuggestedBufferSize = This->hdr.dwSuggestedBufferSize;376 fiw.dwWidth = This->hdr.dwWidth;377 fiw.dwHeight = This->hdr.dwHeight;378 fiw.dwScale = This->dwAVIFileScale; /* FIXME */379 fiw.dwRate = This->dwAVIFileRate; /* FIXME */380 fiw.dwLength = This->dwAVIFileLength; /* FIXME */381 fiw.dwEditCount = This->dwAVIFileEditCount; /* FIXME */382 /* fiw.szFileType[64]; */383 384 if ( size > sizeof(AVIFILEINFOW) )385 size = sizeof(AVIFILEINFOW);386 memcpy( afi, &fiw, size );387 388 return S_OK;364 ICOM_THIS(IAVIFileImpl,iface); 365 AVIFILEINFOW fiw; 366 367 FIXME("(%p)->Info(%p,%ld)\n",iface,afi,size); 368 369 memset( &fiw, 0, sizeof(fiw) ); 370 fiw.dwMaxBytesPerSec = This->hdr.dwMaxBytesPerSec; 371 fiw.dwFlags = This->hdr.dwFlags; 372 fiw.dwCaps = This->dwAVIFileCaps; 373 fiw.dwStreams = This->hdr.dwStreams; 374 fiw.dwSuggestedBufferSize = This->hdr.dwSuggestedBufferSize; 375 fiw.dwWidth = This->hdr.dwWidth; 376 fiw.dwHeight = This->hdr.dwHeight; 377 fiw.dwScale = This->dwAVIFileScale; /* FIXME */ 378 fiw.dwRate = This->dwAVIFileRate; /* FIXME */ 379 fiw.dwLength = This->dwAVIFileLength; /* FIXME */ 380 fiw.dwEditCount = This->dwAVIFileEditCount; /* FIXME */ 381 /* fiw.szFileType[64]; */ 382 383 if ( size > sizeof(AVIFILEINFOW) ) 384 size = sizeof(AVIFILEINFOW); 385 memcpy( afi, &fiw, size ); 386 387 return S_OK; 389 388 } 390 389 391 390 static HRESULT WINAPI IAVIFile_fnGetStream(IAVIFile*iface,PAVISTREAM*avis,DWORD fccType,LONG lParam) 392 391 { 393 ICOM_THIS(IAVIFileImpl,iface);394 395 FIXME("(%p)->GetStream(%p,0x%08lx,%ld)\n",iface,avis,fccType,lParam);396 if ( fccType != 0 )397 return E_FAIL;398 if ( lParam < 0 || lParam >= This->hdr.dwStreams )399 return E_FAIL;400 *avis = This->pStreams[lParam];401 IAVIStream_AddRef( *avis );402 403 return S_OK;392 ICOM_THIS(IAVIFileImpl,iface); 393 394 FIXME("(%p)->GetStream(%p,0x%08lx,%ld)\n",iface,avis,fccType,lParam); 395 if ( fccType != 0 ) 396 return E_FAIL; 397 if ( lParam < 0 || lParam >= This->hdr.dwStreams ) 398 return E_FAIL; 399 *avis = This->pStreams[lParam]; 400 IAVIStream_AddRef( *avis ); 401 402 return S_OK; 404 403 } 405 404 406 405 static HRESULT WINAPI IAVIFile_fnCreateStream(IAVIFile*iface,PAVISTREAM*avis,AVISTREAMINFOW*asi) 407 406 { 408 ICOM_THIS(IAVIFileImpl,iface);409 410 FIXME("(%p,%p,%p)\n",This,avis,asi);411 return E_FAIL;407 ICOM_THIS(IAVIFileImpl,iface); 408 409 FIXME("(%p,%p,%p)\n",This,avis,asi); 410 return E_FAIL; 412 411 } 413 412 414 413 static HRESULT WINAPI IAVIFile_fnWriteData(IAVIFile*iface,DWORD ckid,LPVOID lpData,LONG size) 415 414 { 416 ICOM_THIS(IAVIFileImpl,iface);417 418 FIXME("(%p)->WriteData(0x%08lx,%p,%ld)\n",This,ckid,lpData,size);419 /* FIXME: write data to file */420 return E_FAIL;415 ICOM_THIS(IAVIFileImpl,iface); 416 417 FIXME("(%p)->WriteData(0x%08lx,%p,%ld)\n",This,ckid,lpData,size); 418 /* FIXME: write data to file */ 419 return E_FAIL; 421 420 } 422 421 423 422 static HRESULT WINAPI IAVIFile_fnReadData(IAVIFile*iface,DWORD ckid,LPVOID lpData,LONG *size) 424 423 { 425 ICOM_THIS(IAVIFileImpl,iface);426 427 FIXME("(%p)->ReadData(0x%08lx,%p,%p)\n",This,ckid,lpData,size);428 /* FIXME: read at most size bytes from file */429 430 return E_FAIL;424 ICOM_THIS(IAVIFileImpl,iface); 425 426 FIXME("(%p)->ReadData(0x%08lx,%p,%p)\n",This,ckid,lpData,size); 427 /* FIXME: read at most size bytes from file */ 428 429 return E_FAIL; 431 430 } 432 431 433 432 static HRESULT WINAPI IAVIFile_fnEndRecord(IAVIFile*iface) 434 433 { 435 ICOM_THIS(IAVIFileImpl,iface);436 437 FIXME("(%p)->EndRecord()\n",This);438 /* FIXME: end record? */439 return E_FAIL;434 ICOM_THIS(IAVIFileImpl,iface); 435 436 FIXME("(%p)->EndRecord()\n",This); 437 /* FIXME: end record? */ 438 return E_FAIL; 440 439 } 441 440 442 441 static HRESULT WINAPI IAVIFile_fnDeleteStream(IAVIFile*iface,DWORD fccType,LONG lParam) 443 442 { 444 ICOM_THIS(IAVIFileImpl,iface);445 446 FIXME("(%p)->DeleteStream(0x%08lx,%ld)\n",This,fccType,lParam);447 /* FIXME: delete stream? */448 return E_FAIL;443 ICOM_THIS(IAVIFileImpl,iface); 444 445 FIXME("(%p)->DeleteStream(0x%08lx,%ld)\n",This,fccType,lParam); 446 /* FIXME: delete stream? */ 447 return E_FAIL; 449 448 } 450 449 451 450 /***************************************************************************** 452 * AVIFILE_IAVIFile_Open (internal)451 * AVIFILE_IAVIFile_Open (internal) 453 452 */ 454 453 HRESULT AVIFILE_IAVIFile_Open( PAVIFILE paf, LPCWSTR szFile, UINT uMode ) 455 454 { 456 ICOM_THIS(IAVIFileImpl,paf);457 HRESULThr;458 DWORDdwAcc;459 DWORDdwShared;460 DWORDdwCreate;461 BYTEbuf[12];462 DWORDdwRead;463 FOURCCfccFileType;464 DWORDdwLen;465 DWORDdwIndex;466 467 FIXME("(%p)->Open(%p,%u)\n",This,szFile,uMode);468 469 if ( This->hf != INVALID_HANDLE_VALUE )470 {471 CloseHandle( This->hf );472 This->hf = INVALID_HANDLE_VALUE;473 }474 475 switch ( uMode & 0x3 )476 {477 case OF_READ: /* 0x0 */478 dwAcc = GENERIC_READ;479 dwCreate = OPEN_EXISTING;480 This->dwAVIFileCaps = AVIFILECAPS_CANREAD;481 break;482 case OF_WRITE: /* 0x1 */483 dwAcc = GENERIC_WRITE;484 dwCreate = OPEN_ALWAYS;485 This->dwAVIFileCaps = AVIFILECAPS_CANWRITE;486 break;487 case OF_READWRITE: /* 0x2 */488 dwAcc = GENERIC_READ|GENERIC_WRITE;489 dwCreate = OPEN_ALWAYS;490 This->dwAVIFileCaps = AVIFILECAPS_CANREAD|AVIFILECAPS_CANWRITE;491 break;492 default:493 return E_FAIL;494 }495 496 if ( This->dwAVIFileCaps & AVIFILECAPS_CANWRITE )497 {498 FIXME( "editing AVI is currently not supported!\n" );499 return E_FAIL;500 }501 502 switch ( uMode & 0x70 )503 {504 case OF_SHARE_COMPAT: /* 0x00 */505 dwShared = FILE_SHARE_READ|FILE_SHARE_WRITE;506 break;507 case OF_SHARE_EXCLUSIVE: /* 0x10 */508 dwShared = 0;509 break;510 case OF_SHARE_DENY_WRITE: /* 0x20 */511 dwShared = FILE_SHARE_READ;512 break;513 case OF_SHARE_DENY_READ: /* 0x30 */514 dwShared = FILE_SHARE_WRITE;515 break;516 case OF_SHARE_DENY_NONE: /* 0x40 */517 dwShared = FILE_SHARE_READ|FILE_SHARE_WRITE;518 break;519 default:520 return E_FAIL;521 }522 if ( uMode & OF_CREATE )523 dwCreate = CREATE_ALWAYS;524 525 This->hf = CreateFileW( szFile, dwAcc, dwShared, NULL,526 dwCreate, FILE_ATTRIBUTE_NORMAL,527 (HANDLE)NULL );528 if ( This->hf == INVALID_HANDLE_VALUE )529 return AVIERR_FILEOPEN;530 531 if ( dwAcc & GENERIC_READ )532 {533 if ( !ReadFile( This->hf, buf, 12, &dwRead, NULL ) )534 return AVIERR_FILEREAD;535 if ( dwRead == 12 )536 {537 if ( mmioFOURCC(buf[0],buf[1],buf[2],buf[3]) != FOURCC_RIFF )538 return AVIERR_BADFORMAT;539 540 fccFileType = mmioFOURCC(buf[8],buf[9],buf[10],buf[11]);541 if ( fccFileType != formtypeAVI )542 return AVIERR_BADFORMAT;543 544 /* get AVI main header. */545 hr = AVIFILE_IAVIFile_SeekToSpecifiedChunk(546 This, ckidAVIMAINHDR, &dwLen );547 if ( hr != S_OK )548 return hr;549 if ( dwLen < (sizeof(DWORD)*10) )550 return AVIERR_BADFORMAT;551 hr = AVIFILE_IAVIFile_ReadChunkData(552 This, dwLen,553 &(This->hdr), sizeof(MainAVIHeader), &dwLen );554 if ( This->hdr.dwStreams == 0 ||555 This->hdr.dwStreams > AVIFILE_STREAMS_MAX )556 return AVIERR_BADFORMAT;557 558 /* get stream headers. */559 dwIndex = 0;560 while ( dwIndex < This->hdr.dwStreams )561 {562 WINE_AVISTREAM_DATA*pData;563 564 hr = AVIFILE_IAVIFile_SeekToSpecifiedChunk(565 This, ckidSTREAMHEADER, &dwLen );566 if ( hr != S_OK )567 return hr;568 if ( dwLen < (sizeof(DWORD)*12) )569 return AVIERR_BADFORMAT;570 hr = AVIFILE_IAVIFile_ReadChunkData(571 This, dwLen,572 &This->strhdrs[dwIndex],573 sizeof(AVIStreamHeader), &dwLen );574 575 hr = AVIFILE_IAVIFile_SeekToSpecifiedChunk(576 This, ckidSTREAMFORMAT, &dwLen );577 if ( hr != S_OK )578 return hr;579 pData = AVIFILE_Alloc_IAVIStreamData( dwLen );580 if ( pData == NULL )581 return AVIERR_MEMORY;582 hr = AVIFILE_IAVIFile_ReadChunkData(583 This, dwLen,584 pData->pbFmt, dwLen, &dwLen );585 if ( hr != S_OK )586 {587 AVIFILE_Free_IAVIStreamData( pData );588 return hr;589 }590 pData->dwStreamIndex = dwIndex;591 pData->pstrhdr = &This->strhdrs[dwIndex];592 593 hr = AVIStreamCreate(&This->pStreams[dwIndex],594 (LONG)paf, (LONG)(pData), NULL );595 if ( hr != S_OK )596 {597 AVIFILE_Free_IAVIStreamData( pData );598 return hr;599 }600 601 if ( (This->strhdrs[dwIndex].fccType602 == mmioFOURCC('v','i','d','s')) ||603 (This->strhdrs[dwIndex].fccType604 == mmioFOURCC('V','I','D','S')) )605 {606 This->dwAVIFileScale =607 This->strhdrs[dwIndex].dwScale;608 This->dwAVIFileRate =609 This->strhdrs[dwIndex].dwRate;610 This->dwAVIFileLength =611 This->strhdrs[dwIndex].dwLength;612 }613 else614 if ( This->dwAVIFileScale == 0 )615 {616 This->dwAVIFileScale =617 This->strhdrs[dwIndex].dwScale;618 This->dwAVIFileRate =619 This->strhdrs[dwIndex].dwRate;620 This->dwAVIFileLength =621 This->strhdrs[dwIndex].dwLength;622 }623 624 dwIndex ++;625 }626 627 /* skip movi. */628 while ( 1 )629 {630 hr = AVIFILE_IAVIFile_SeekToSpecifiedChunk(631 This, FOURCC_LIST, &dwLen );632 if ( hr != S_OK )633 return hr;634 if ( dwLen < 4 )635 return AVIERR_BADFORMAT;636 637 This->dwMoviTop = SetFilePointer( This->hf,0,NULL,FILE_CURRENT );638 if ( This->dwMoviTop == 0xffffffff )639 return AVIERR_BADFORMAT;640 641 if ( ( !ReadFile(This->hf, buf, 4, &dwRead, NULL) ) ||642 ( dwRead != 4 ) )643 return AVIERR_FILEREAD;644 645 hr = AVIFILE_IAVIFile_SkipChunkData(646 This, dwLen - 4 );647 if ( hr != S_OK )648 return hr;649 if ( mmioFOURCC(buf[0],buf[1],buf[2],buf[3])650 == mmioFOURCC('m', 'o', 'v', 'i') )651 break;652 }653 654 /* get idx1. */655 hr = AVIFILE_IAVIFile_SeekToSpecifiedChunk(656 This, ckidAVINEWINDEX, &dwLen );657 if ( hr != S_OK )658 return hr;659 660 This->dwCountOfIndexEntry = dwLen / sizeof(AVIINDEXENTRY);661 This->pIndexEntry = (AVIINDEXENTRY*)662 HeapAlloc(AVIFILE_data.hHeap,HEAP_ZERO_MEMORY,663 sizeof(AVIINDEXENTRY) *664 This->dwCountOfIndexEntry * 2 );665 if ( This->pIndexEntry == NULL )666 return AVIERR_MEMORY;667 hr = AVIFILE_IAVIFile_ReadChunkData(668 This, dwLen,669 This->pIndexEntry + This->dwCountOfIndexEntry,670 sizeof(AVIINDEXENTRY) *671 This->dwCountOfIndexEntry, &dwLen );672 if ( hr != S_OK )673 return hr;674 AVIFILE_IAVIFile_InitIndexTable(675 This, This->pIndexEntry,676 This->pIndexEntry + This->dwCountOfIndexEntry,677 This->dwCountOfIndexEntry );678 }679 else680 {681 /* FIXME - create the handle has GENERIC_WRITE access. */682 return AVIERR_FILEREAD;683 }684 }685 else686 {687 return AVIERR_FILEOPEN; /* FIXME */688 }689 690 return S_OK;455 ICOM_THIS(IAVIFileImpl,paf); 456 HRESULT hr; 457 DWORD dwAcc; 458 DWORD dwShared; 459 DWORD dwCreate; 460 BYTE buf[12]; 461 DWORD dwRead; 462 FOURCC fccFileType; 463 DWORD dwLen; 464 DWORD dwIndex; 465 466 FIXME("(%p)->Open(%p,%u)\n",This,szFile,uMode); 467 468 if ( This->hf != INVALID_HANDLE_VALUE ) 469 { 470 CloseHandle( This->hf ); 471 This->hf = INVALID_HANDLE_VALUE; 472 } 473 474 switch ( uMode & 0x3 ) 475 { 476 case OF_READ: /* 0x0 */ 477 dwAcc = GENERIC_READ; 478 dwCreate = OPEN_EXISTING; 479 This->dwAVIFileCaps = AVIFILECAPS_CANREAD; 480 break; 481 case OF_WRITE: /* 0x1 */ 482 dwAcc = GENERIC_WRITE; 483 dwCreate = OPEN_ALWAYS; 484 This->dwAVIFileCaps = AVIFILECAPS_CANWRITE; 485 break; 486 case OF_READWRITE: /* 0x2 */ 487 dwAcc = GENERIC_READ|GENERIC_WRITE; 488 dwCreate = OPEN_ALWAYS; 489 This->dwAVIFileCaps = AVIFILECAPS_CANREAD|AVIFILECAPS_CANWRITE; 490 break; 491 default: 492 return E_FAIL; 493 } 494 495 if ( This->dwAVIFileCaps & AVIFILECAPS_CANWRITE ) 496 { 497 FIXME( "editing AVI is currently not supported!\n" ); 498 return E_FAIL; 499 } 500 501 switch ( uMode & 0x70 ) 502 { 503 case OF_SHARE_COMPAT: /* 0x00 */ 504 dwShared = FILE_SHARE_READ|FILE_SHARE_WRITE; 505 break; 506 case OF_SHARE_EXCLUSIVE: /* 0x10 */ 507 dwShared = 0; 508 break; 509 case OF_SHARE_DENY_WRITE: /* 0x20 */ 510 dwShared = FILE_SHARE_READ; 511 break; 512 case OF_SHARE_DENY_READ: /* 0x30 */ 513 dwShared = FILE_SHARE_WRITE; 514 break; 515 case OF_SHARE_DENY_NONE: /* 0x40 */ 516 dwShared = FILE_SHARE_READ|FILE_SHARE_WRITE; 517 break; 518 default: 519 return E_FAIL; 520 } 521 if ( uMode & OF_CREATE ) 522 dwCreate = CREATE_ALWAYS; 523 524 This->hf = CreateFileW( szFile, dwAcc, dwShared, NULL, 525 dwCreate, FILE_ATTRIBUTE_NORMAL, 526 (HANDLE)NULL ); 527 if ( This->hf == INVALID_HANDLE_VALUE ) 528 return AVIERR_FILEOPEN; 529 530 if ( dwAcc & GENERIC_READ ) 531 { 532 if ( !ReadFile( This->hf, buf, 12, &dwRead, NULL ) ) 533 return AVIERR_FILEREAD; 534 if ( dwRead == 12 ) 535 { 536 if ( mmioFOURCC(buf[0],buf[1],buf[2],buf[3]) != FOURCC_RIFF ) 537 return AVIERR_BADFORMAT; 538 539 fccFileType = mmioFOURCC(buf[8],buf[9],buf[10],buf[11]); 540 if ( fccFileType != formtypeAVI ) 541 return AVIERR_BADFORMAT; 542 543 /* get AVI main header. */ 544 hr = AVIFILE_IAVIFile_SeekToSpecifiedChunk( 545 This, ckidAVIMAINHDR, &dwLen ); 546 if ( hr != S_OK ) 547 return hr; 548 if ( dwLen < (sizeof(DWORD)*10) ) 549 return AVIERR_BADFORMAT; 550 hr = AVIFILE_IAVIFile_ReadChunkData( 551 This, dwLen, 552 &(This->hdr), sizeof(MainAVIHeader), &dwLen ); 553 if ( This->hdr.dwStreams == 0 || 554 This->hdr.dwStreams > AVIFILE_STREAMS_MAX ) 555 return AVIERR_BADFORMAT; 556 557 /* get stream headers. */ 558 dwIndex = 0; 559 while ( dwIndex < This->hdr.dwStreams ) 560 { 561 WINE_AVISTREAM_DATA* pData; 562 563 hr = AVIFILE_IAVIFile_SeekToSpecifiedChunk( 564 This, ckidSTREAMHEADER, &dwLen ); 565 if ( hr != S_OK ) 566 return hr; 567 if ( dwLen < (sizeof(DWORD)*12) ) 568 return AVIERR_BADFORMAT; 569 hr = AVIFILE_IAVIFile_ReadChunkData( 570 This, dwLen, 571 &This->strhdrs[dwIndex], 572 sizeof(AVIStreamHeader), &dwLen ); 573 574 hr = AVIFILE_IAVIFile_SeekToSpecifiedChunk( 575 This, ckidSTREAMFORMAT, &dwLen ); 576 if ( hr != S_OK ) 577 return hr; 578 pData = AVIFILE_Alloc_IAVIStreamData( dwLen ); 579 if ( pData == NULL ) 580 return AVIERR_MEMORY; 581 hr = AVIFILE_IAVIFile_ReadChunkData( 582 This, dwLen, 583 pData->pbFmt, dwLen, &dwLen ); 584 if ( hr != S_OK ) 585 { 586 AVIFILE_Free_IAVIStreamData( pData ); 587 return hr; 588 } 589 pData->dwStreamIndex = dwIndex; 590 pData->pstrhdr = &This->strhdrs[dwIndex]; 591 592 hr = AVIStreamCreate(&This->pStreams[dwIndex], 593 (LONG)paf, (LONG)(pData), NULL ); 594 if ( hr != S_OK ) 595 { 596 AVIFILE_Free_IAVIStreamData( pData ); 597 return hr; 598 } 599 600 if ( (This->strhdrs[dwIndex].fccType 601 == mmioFOURCC('v','i','d','s')) || 602 (This->strhdrs[dwIndex].fccType 603 == mmioFOURCC('V','I','D','S')) ) 604 { 605 This->dwAVIFileScale = 606 This->strhdrs[dwIndex].dwScale; 607 This->dwAVIFileRate = 608 This->strhdrs[dwIndex].dwRate; 609 This->dwAVIFileLength = 610 This->strhdrs[dwIndex].dwLength; 611 } 612 else 613 if ( This->dwAVIFileScale == 0 ) 614 { 615 This->dwAVIFileScale = 616 This->strhdrs[dwIndex].dwScale; 617 This->dwAVIFileRate = 618 This->strhdrs[dwIndex].dwRate; 619 This->dwAVIFileLength = 620 This->strhdrs[dwIndex].dwLength; 621 } 622 623 dwIndex ++; 624 } 625 626 /* skip movi. */ 627 while ( 1 ) 628 { 629 hr = AVIFILE_IAVIFile_SeekToSpecifiedChunk( 630 This, FOURCC_LIST, &dwLen ); 631 if ( hr != S_OK ) 632 return hr; 633 if ( dwLen < 4 ) 634 return AVIERR_BADFORMAT; 635 636 This->dwMoviTop = SetFilePointer( This->hf,0,NULL,FILE_CURRENT ); 637 if ( This->dwMoviTop == 0xffffffff ) 638 return AVIERR_BADFORMAT; 639 640 if ( ( !ReadFile(This->hf, buf, 4, &dwRead, NULL) ) || 641 ( dwRead != 4 ) ) 642 return AVIERR_FILEREAD; 643 644 hr = AVIFILE_IAVIFile_SkipChunkData( 645 This, dwLen - 4 ); 646 if ( hr != S_OK ) 647 return hr; 648 if ( mmioFOURCC(buf[0],buf[1],buf[2],buf[3]) 649 == mmioFOURCC('m', 'o', 'v', 'i') ) 650 break; 651 } 652 653 /* get idx1. */ 654 hr = AVIFILE_IAVIFile_SeekToSpecifiedChunk( 655 This, ckidAVINEWINDEX, &dwLen ); 656 if ( hr != S_OK ) 657 return hr; 658 659 This->dwCountOfIndexEntry = dwLen / sizeof(AVIINDEXENTRY); 660 This->pIndexEntry = (AVIINDEXENTRY*) 661 HeapAlloc(AVIFILE_data.hHeap,HEAP_ZERO_MEMORY, 662 sizeof(AVIINDEXENTRY) * 663 This->dwCountOfIndexEntry * 2 ); 664 if ( This->pIndexEntry == NULL ) 665 return AVIERR_MEMORY; 666 hr = AVIFILE_IAVIFile_ReadChunkData( 667 This, dwLen, 668 This->pIndexEntry + This->dwCountOfIndexEntry, 669 sizeof(AVIINDEXENTRY) * 670 This->dwCountOfIndexEntry, &dwLen ); 671 if ( hr != S_OK ) 672 return hr; 673 AVIFILE_IAVIFile_InitIndexTable( 674 This, This->pIndexEntry, 675 This->pIndexEntry + This->dwCountOfIndexEntry, 676 This->dwCountOfIndexEntry ); 677 } 678 else 679 { 680 /* FIXME - create the handle has GENERIC_WRITE access. */ 681 return AVIERR_FILEREAD; 682 } 683 } 684 else 685 { 686 return AVIERR_FILEOPEN; /* FIXME */ 687 } 688 689 return S_OK; 691 690 } 692 691 693 692 /***************************************************************************** 694 * AVIFILE_IAVIFile_GetIndexTable (internal)693 * AVIFILE_IAVIFile_GetIndexTable (internal) 695 694 */ 696 695 HRESULT AVIFILE_IAVIFile_GetIndexTable( PAVIFILE paf, DWORD dwStreamIndex, 697 AVIINDEXENTRY** ppIndexEntry,698 DWORD* pdwCountOfIndexEntry )699 { 700 ICOM_THIS(IAVIFileImpl,paf);701 702 if ( dwStreamIndex < 0 || dwStreamIndex >= This->hdr.dwStreams )703 {704 FIXME( "invalid stream index %lu\n", dwStreamIndex );705 return E_FAIL;706 }707 FIXME( "cur %p, next %p\n",708 This->pStreamIndexEntry[dwStreamIndex],709 This->pStreamIndexEntry[dwStreamIndex+1] );710 *ppIndexEntry = This->pStreamIndexEntry[dwStreamIndex];711 *pdwCountOfIndexEntry =712 This->pStreamIndexEntry[dwStreamIndex+1] -713 This->pStreamIndexEntry[dwStreamIndex];714 715 return S_OK;696 AVIINDEXENTRY** ppIndexEntry, 697 DWORD* pdwCountOfIndexEntry ) 698 { 699 ICOM_THIS(IAVIFileImpl,paf); 700 701 if ( dwStreamIndex < 0 || dwStreamIndex >= This->hdr.dwStreams ) 702 { 703 FIXME( "invalid stream index %lu\n", dwStreamIndex ); 704 return E_FAIL; 705 } 706 FIXME( "cur %p, next %p\n", 707 This->pStreamIndexEntry[dwStreamIndex], 708 This->pStreamIndexEntry[dwStreamIndex+1] ); 709 *ppIndexEntry = This->pStreamIndexEntry[dwStreamIndex]; 710 *pdwCountOfIndexEntry = 711 This->pStreamIndexEntry[dwStreamIndex+1] - 712 This->pStreamIndexEntry[dwStreamIndex]; 713 714 return S_OK; 716 715 } 717 716 718 717 /***************************************************************************** 719 * AVIFILE_IAVIFile_ReadMovieData (internal)718 * AVIFILE_IAVIFile_ReadMovieData (internal) 720 719 */ 721 720 HRESULT AVIFILE_IAVIFile_ReadMovieData( PAVIFILE paf, DWORD dwOffset, 722 DWORD dwLength, LPVOID lpvBuf )723 { 724 ICOM_THIS(IAVIFileImpl,paf);725 LONGlHigh = 0;726 DWORDdwRes;727 728 if ( dwLength == 0 )729 return S_OK;730 SetLastError(NO_ERROR);731 dwRes = SetFilePointer( This->hf, (LONG)(dwOffset+This->dwMoviTop),732 &lHigh, FILE_BEGIN );733 if ( dwRes == (DWORD)0xffffffff && GetLastError() != NO_ERROR )734 return AVIERR_FILEREAD;735 736 if ( ( !ReadFile(This->hf, lpvBuf, dwLength, &dwRes, NULL) ) ||737 ( dwLength != dwRes ) )738 {739 FIXME( "error in ReadFile()\n" );740 return AVIERR_FILEREAD;741 }742 743 return S_OK;744 } 745 721 DWORD dwLength, LPVOID lpvBuf ) 722 { 723 ICOM_THIS(IAVIFileImpl,paf); 724 LONG lHigh = 0; 725 DWORD dwRes; 726 727 if ( dwLength == 0 ) 728 return S_OK; 729 SetLastError(NO_ERROR); 730 dwRes = SetFilePointer( This->hf, (LONG)(dwOffset+This->dwMoviTop), 731 &lHigh, FILE_BEGIN ); 732 if ( dwRes == (DWORD)0xffffffff && GetLastError() != NO_ERROR ) 733 return AVIERR_FILEREAD; 734 735 if ( ( !ReadFile(This->hf, lpvBuf, dwLength, &dwRes, NULL) ) || 736 ( dwLength != dwRes ) ) 737 { 738 FIXME( "error in ReadFile()\n" ); 739 return AVIERR_FILEREAD; 740 } 741 742 return S_OK; 743 } 744 -
trunk/src/avifil32/iastream.c
r6652 r6712 1 /* $Id: iastream.c,v 1.2 2001-09-05 14:16:45 bird Exp $ */2 1 /* 3 2 * Copyright 2001 Hidenori TAKESHIMA <hidenori@a2.ctktv.ne.jp> … … 56 55 typedef struct IAVIStreamImpl 57 56 { 58 ICOM_VFIELD(IAVIStream);59 /* IUnknown stuff */60 DWORDref;61 /* IAVIStream stuff */62 IAVIFile*paf;63 WINE_AVISTREAM_DATA*pData;57 ICOM_VFIELD(IAVIStream); 58 /* IUnknown stuff */ 59 DWORD ref; 60 /* IAVIStream stuff */ 61 IAVIFile* paf; 62 WINE_AVISTREAM_DATA* pData; 64 63 } IAVIStreamImpl; 65 64 … … 69 68 HRESULT AVIFILE_CreateIAVIStream(void** ppobj) 70 69 { 71 IAVIStreamImpl*This;72 HRESULThr;73 74 *ppobj = NULL;75 This = (IAVIStreamImpl*)HeapAlloc(AVIFILE_data.hHeap,HEAP_ZERO_MEMORY,76 sizeof(IAVIStreamImpl));77 This->ref = 1;78 ICOM_VTBL(This) = &iavist;79 hr = IAVIStream_Construct( This );80 if ( hr != S_OK )81 {82 IAVIStream_Destruct( This );83 return hr;84 }85 86 *ppobj = (LPVOID)This;87 88 return S_OK;70 IAVIStreamImpl *This; 71 HRESULT hr; 72 73 *ppobj = NULL; 74 This = (IAVIStreamImpl*)HeapAlloc(AVIFILE_data.hHeap,HEAP_ZERO_MEMORY, 75 sizeof(IAVIStreamImpl)); 76 This->ref = 1; 77 ICOM_VTBL(This) = &iavist; 78 hr = IAVIStream_Construct( This ); 79 if ( hr != S_OK ) 80 { 81 IAVIStream_Destruct( This ); 82 return hr; 83 } 84 85 *ppobj = (LPVOID)This; 86 87 return S_OK; 89 88 } 90 89 … … 95 94 96 95 static HRESULT WINAPI IAVIStream_fnQueryInterface(IAVIStream*iface,REFIID refiid,LPVOID *obj) { 97 ICOM_THIS(IAVIStreamImpl,iface);98 99 TRACE("(%p)->QueryInterface(%s,%p)\n",This,debugstr_guid(refiid),obj);100 if ( IsEqualGUID(&IID_IUnknown,refiid) ||101 IsEqualGUID(&IID_IAVIStream,refiid) )102 {103 IAVIStream_AddRef(iface);104 *obj = iface;105 return S_OK;106 }107 /* can return IGetFrame interface too */108 109 return OLE_E_ENUM_NOMORE;96 ICOM_THIS(IAVIStreamImpl,iface); 97 98 TRACE("(%p)->QueryInterface(%s,%p)\n",This,debugstr_guid(refiid),obj); 99 if ( IsEqualGUID(&IID_IUnknown,refiid) || 100 IsEqualGUID(&IID_IAVIStream,refiid) ) 101 { 102 IAVIStream_AddRef(iface); 103 *obj = iface; 104 return S_OK; 105 } 106 /* can return IGetFrame interface too */ 107 108 return OLE_E_ENUM_NOMORE; 110 109 } 111 110 112 111 static ULONG WINAPI IAVIStream_fnAddRef(IAVIStream*iface) { 113 ICOM_THIS(IAVIStreamImpl,iface);114 115 TRACE("(%p)->AddRef()\n",iface);116 return ++(This->ref);112 ICOM_THIS(IAVIStreamImpl,iface); 113 114 TRACE("(%p)->AddRef()\n",iface); 115 return ++(This->ref); 117 116 } 118 117 119 118 static ULONG WINAPI IAVIStream_fnRelease(IAVIStream* iface) { 120 ICOM_THIS(IAVIStreamImpl,iface);121 122 TRACE("(%p)->Release()\n",iface);123 if ((--(This->ref)) > 0 )124 return This->ref;125 IAVIStream_Destruct(This);126 127 HeapFree(AVIFILE_data.hHeap,0,iface);128 return 0;119 ICOM_THIS(IAVIStreamImpl,iface); 120 121 TRACE("(%p)->Release()\n",iface); 122 if ((--(This->ref)) > 0 ) 123 return This->ref; 124 IAVIStream_Destruct(This); 125 126 HeapFree(AVIFILE_data.hHeap,0,iface); 127 return 0; 129 128 } 130 129 … … 135 134 static HRESULT IAVIStream_Construct( IAVIStreamImpl* This ) 136 135 { 137 This->paf = NULL;138 This->pData = NULL;139 140 AVIFILE_data.dwClassObjRef ++;141 142 return S_OK;136 This->paf = NULL; 137 This->pData = NULL; 138 139 AVIFILE_data.dwClassObjRef ++; 140 141 return S_OK; 143 142 } 144 143 145 144 static void IAVIStream_Destruct( IAVIStreamImpl* This ) 146 145 { 147 AVIFILE_data.dwClassObjRef --;146 AVIFILE_data.dwClassObjRef --; 148 147 } 149 148 150 149 static HRESULT WINAPI IAVIStream_fnCreate(IAVIStream*iface,LPARAM lParam1,LPARAM lParam2) 151 150 { 152 ICOM_THIS(IAVIStreamImpl,iface);153 154 FIXME("(%p)->Create(%ld,%ld)\n",iface,lParam1,lParam2);155 156 This->paf = (IAVIFile*)lParam1;157 This->pData = (WINE_AVISTREAM_DATA*)lParam2;158 159 return S_OK;151 ICOM_THIS(IAVIStreamImpl,iface); 152 153 FIXME("(%p)->Create(%ld,%ld)\n",iface,lParam1,lParam2); 154 155 This->paf = (IAVIFile*)lParam1; 156 This->pData = (WINE_AVISTREAM_DATA*)lParam2; 157 158 return S_OK; 160 159 } 161 160 162 161 static HRESULT WINAPI IAVIStream_fnInfo(IAVIStream*iface,AVISTREAMINFOW *psi,LONG size) 163 162 { 164 ICOM_THIS(IAVIStreamImpl,iface);165 AVISTREAMINFOWsiw;166 167 FIXME("(%p)->Info(%p,%ld)\n",iface,psi,size);168 if ( This->pData == NULL )169 return E_UNEXPECTED;170 171 memset( &siw, 0, sizeof(AVISTREAMINFOW) );172 siw.fccType = This->pData->pstrhdr->fccType;173 siw.fccHandler = This->pData->pstrhdr->fccHandler;174 siw.dwFlags = This->pData->pstrhdr->dwFlags;175 siw.dwCaps = 0; /* FIXME */176 siw.wPriority = This->pData->pstrhdr->wPriority;177 siw.wLanguage = This->pData->pstrhdr->wLanguage;178 siw.dwScale = This->pData->pstrhdr->dwScale;179 siw.dwRate = This->pData->pstrhdr->dwRate;180 siw.dwStart = This->pData->pstrhdr->dwStart;181 siw.dwLength = This->pData->pstrhdr->dwLength;182 siw.dwInitialFrames = This->pData->pstrhdr->dwInitialFrames;183 siw.dwSuggestedBufferSize = This->pData->pstrhdr->dwSuggestedBufferSize;184 siw.dwQuality = This->pData->pstrhdr->dwQuality;185 siw.dwSampleSize = This->pData->pstrhdr->dwSampleSize;186 siw.rcFrame.left = This->pData->pstrhdr->rcFrame.left;187 siw.rcFrame.top = This->pData->pstrhdr->rcFrame.top;188 siw.rcFrame.right = This->pData->pstrhdr->rcFrame.right;189 siw.rcFrame.bottom = This->pData->pstrhdr->rcFrame.bottom;190 siw.dwEditCount = 0; /* FIXME */191 siw.dwFormatChangeCount = 0; /* FIXME */192 /* siw.szName[64] */193 194 if ( size > sizeof(AVISTREAMINFOW) )195 size = sizeof(AVISTREAMINFOW);196 memcpy( psi, &siw, size );197 198 return S_OK;163 ICOM_THIS(IAVIStreamImpl,iface); 164 AVISTREAMINFOW siw; 165 166 FIXME("(%p)->Info(%p,%ld)\n",iface,psi,size); 167 if ( This->pData == NULL ) 168 return E_UNEXPECTED; 169 170 memset( &siw, 0, sizeof(AVISTREAMINFOW) ); 171 siw.fccType = This->pData->pstrhdr->fccType; 172 siw.fccHandler = This->pData->pstrhdr->fccHandler; 173 siw.dwFlags = This->pData->pstrhdr->dwFlags; 174 siw.dwCaps = 0; /* FIXME */ 175 siw.wPriority = This->pData->pstrhdr->wPriority; 176 siw.wLanguage = This->pData->pstrhdr->wLanguage; 177 siw.dwScale = This->pData->pstrhdr->dwScale; 178 siw.dwRate = This->pData->pstrhdr->dwRate; 179 siw.dwStart = This->pData->pstrhdr->dwStart; 180 siw.dwLength = This->pData->pstrhdr->dwLength; 181 siw.dwInitialFrames = This->pData->pstrhdr->dwInitialFrames; 182 siw.dwSuggestedBufferSize = This->pData->pstrhdr->dwSuggestedBufferSize; 183 siw.dwQuality = This->pData->pstrhdr->dwQuality; 184 siw.dwSampleSize = This->pData->pstrhdr->dwSampleSize; 185 siw.rcFrame.left = This->pData->pstrhdr->rcFrame.left; 186 siw.rcFrame.top = This->pData->pstrhdr->rcFrame.top; 187 siw.rcFrame.right = This->pData->pstrhdr->rcFrame.right; 188 siw.rcFrame.bottom = This->pData->pstrhdr->rcFrame.bottom; 189 siw.dwEditCount = 0; /* FIXME */ 190 siw.dwFormatChangeCount = 0; /* FIXME */ 191 /* siw.szName[64] */ 192 193 if ( size > sizeof(AVISTREAMINFOW) ) 194 size = sizeof(AVISTREAMINFOW); 195 memcpy( psi, &siw, size ); 196 197 return S_OK; 199 198 } 200 199 201 200 static LONG WINAPI IAVIStream_fnFindSample(IAVIStream*iface,LONG pos,LONG flags) 202 201 { 203 ICOM_THIS(IAVIStreamImpl,iface);204 HRESULThr;205 AVIINDEXENTRY*pIndexEntry;206 DWORDdwCountOfIndexEntry;207 LONGlCur, lAdd, lEnd;208 209 FIXME("(%p)->FindSample(%ld,0x%08lx)\n",This,pos,flags);210 211 hr = AVIFILE_IAVIFile_GetIndexTable(212 This->paf, This->pData->dwStreamIndex,213 &pIndexEntry, &dwCountOfIndexEntry );214 if ( hr != S_OK )215 return -1L;216 217 if ( flags & (~(FIND_DIR|FIND_TYPE|FIND_RET)) )218 {219 FIXME( "unknown flag %08lx\n", flags );220 return -1L;221 }222 223 switch ( flags & FIND_DIR )224 {225 case FIND_NEXT:226 lCur = pos;227 lAdd = 1;228 lEnd = dwCountOfIndexEntry;229 if ( lCur > dwCountOfIndexEntry )230 return -1L;231 break;232 case FIND_PREV:233 lCur = pos;234 if ( lCur > dwCountOfIndexEntry )235 lCur = dwCountOfIndexEntry;236 lAdd = -1;237 lEnd = 0;238 break;239 case FIND_FROM_START:240 lCur = 0;241 lAdd = 1;242 lEnd = dwCountOfIndexEntry;243 break;244 default:245 FIXME( "unknown direction flag %08lx\n", (flags & FIND_DIR) );246 return -1L;247 }248 249 switch ( flags & FIND_TYPE )250 {251 case FIND_KEY:252 while ( 1 )253 {254 if ( pIndexEntry[lCur].dwFlags & AVIIF_KEYFRAME )255 break;256 if ( lCur == lEnd )257 return -1L;258 lCur += lAdd;259 }260 break;261 case FIND_ANY:262 while ( 1 )263 {264 if ( !(pIndexEntry[lCur].dwFlags & AVIIF_NOTIME) )265 break;266 if ( lCur == lEnd )267 return -1L;268 lCur += lAdd;269 }270 break;271 case FIND_FORMAT:272 FIXME( "FIND_FORMAT is not implemented.\n" );273 return -1L;274 default:275 FIXME( "unknown type flag %08lx\n", (flags & FIND_TYPE) );276 return -1L;277 }278 279 switch ( flags & FIND_RET )280 {281 case FIND_POS:282 return lCur;283 case FIND_LENGTH:284 FIXME( "FIND_LENGTH is not implemented.\n" );285 return -1L;286 case FIND_OFFSET:287 return pIndexEntry[lCur].dwChunkOffset;288 case FIND_SIZE:289 return pIndexEntry[lCur].dwChunkLength;290 case FIND_INDEX:291 FIXME( "FIND_INDEX is not implemented.\n" );292 return -1L;293 default:294 FIXME( "unknown return type flag %08lx\n", (flags & FIND_RET) );295 break;296 }297 298 return -1L;202 ICOM_THIS(IAVIStreamImpl,iface); 203 HRESULT hr; 204 AVIINDEXENTRY* pIndexEntry; 205 DWORD dwCountOfIndexEntry; 206 LONG lCur, lAdd, lEnd; 207 208 FIXME("(%p)->FindSample(%ld,0x%08lx)\n",This,pos,flags); 209 210 hr = AVIFILE_IAVIFile_GetIndexTable( 211 This->paf, This->pData->dwStreamIndex, 212 &pIndexEntry, &dwCountOfIndexEntry ); 213 if ( hr != S_OK ) 214 return -1L; 215 216 if ( flags & (~(FIND_DIR|FIND_TYPE|FIND_RET)) ) 217 { 218 FIXME( "unknown flag %08lx\n", flags ); 219 return -1L; 220 } 221 222 switch ( flags & FIND_DIR ) 223 { 224 case FIND_NEXT: 225 lCur = pos; 226 lAdd = 1; 227 lEnd = dwCountOfIndexEntry; 228 if ( lCur > dwCountOfIndexEntry ) 229 return -1L; 230 break; 231 case FIND_PREV: 232 lCur = pos; 233 if ( lCur > dwCountOfIndexEntry ) 234 lCur = dwCountOfIndexEntry; 235 lAdd = -1; 236 lEnd = 0; 237 break; 238 case FIND_FROM_START: 239 lCur = 0; 240 lAdd = 1; 241 lEnd = dwCountOfIndexEntry; 242 break; 243 default: 244 FIXME( "unknown direction flag %08lx\n", (flags & FIND_DIR) ); 245 return -1L; 246 } 247 248 switch ( flags & FIND_TYPE ) 249 { 250 case FIND_KEY: 251 while ( 1 ) 252 { 253 if ( pIndexEntry[lCur].dwFlags & AVIIF_KEYFRAME ) 254 break; 255 if ( lCur == lEnd ) 256 return -1L; 257 lCur += lAdd; 258 } 259 break; 260 case FIND_ANY: 261 while ( 1 ) 262 { 263 if ( !(pIndexEntry[lCur].dwFlags & AVIIF_NOTIME) ) 264 break; 265 if ( lCur == lEnd ) 266 return -1L; 267 lCur += lAdd; 268 } 269 break; 270 case FIND_FORMAT: 271 FIXME( "FIND_FORMAT is not implemented.\n" ); 272 return -1L; 273 default: 274 FIXME( "unknown type flag %08lx\n", (flags & FIND_TYPE) ); 275 return -1L; 276 } 277 278 switch ( flags & FIND_RET ) 279 { 280 case FIND_POS: 281 return lCur; 282 case FIND_LENGTH: 283 FIXME( "FIND_LENGTH is not implemented.\n" ); 284 return -1L; 285 case FIND_OFFSET: 286 return pIndexEntry[lCur].dwChunkOffset; 287 case FIND_SIZE: 288 return pIndexEntry[lCur].dwChunkLength; 289 case FIND_INDEX: 290 FIXME( "FIND_INDEX is not implemented.\n" ); 291 return -1L; 292 default: 293 FIXME( "unknown return type flag %08lx\n", (flags & FIND_RET) ); 294 break; 295 } 296 297 return -1L; 299 298 } 300 299 301 300 static HRESULT WINAPI IAVIStream_fnReadFormat(IAVIStream*iface,LONG pos,LPVOID format,LONG *formatsize) { 302 ICOM_THIS(IAVIStreamImpl,iface);303 304 TRACE("(%p)->ReadFormat(%ld,%p,%p)\n",This,pos,format,formatsize);305 if ( This->pData == NULL )306 return E_UNEXPECTED;307 308 /* FIXME - check pos. */309 if ( format == NULL )310 {311 *formatsize = This->pData->dwFmtLen;312 return S_OK;313 }314 if ( (*formatsize) < This->pData->dwFmtLen )315 return AVIERR_BUFFERTOOSMALL;316 317 memcpy( format, This->pData->pbFmt, This->pData->dwFmtLen );318 *formatsize = This->pData->dwFmtLen;319 320 return S_OK;301 ICOM_THIS(IAVIStreamImpl,iface); 302 303 TRACE("(%p)->ReadFormat(%ld,%p,%p)\n",This,pos,format,formatsize); 304 if ( This->pData == NULL ) 305 return E_UNEXPECTED; 306 307 /* FIXME - check pos. */ 308 if ( format == NULL ) 309 { 310 *formatsize = This->pData->dwFmtLen; 311 return S_OK; 312 } 313 if ( (*formatsize) < This->pData->dwFmtLen ) 314 return AVIERR_BUFFERTOOSMALL; 315 316 memcpy( format, This->pData->pbFmt, This->pData->dwFmtLen ); 317 *formatsize = This->pData->dwFmtLen; 318 319 return S_OK; 321 320 } 322 321 323 322 static HRESULT WINAPI IAVIStream_fnSetFormat(IAVIStream*iface,LONG pos,LPVOID format,LONG formatsize) { 324 ICOM_THIS(IAVIStreamImpl,iface);325 326 FIXME("(%p)->SetFormat(%ld,%p,%ld)\n",This,pos,format,formatsize);327 return E_FAIL;323 ICOM_THIS(IAVIStreamImpl,iface); 324 325 FIXME("(%p)->SetFormat(%ld,%p,%ld)\n",This,pos,format,formatsize); 326 return E_FAIL; 328 327 } 329 328 330 329 static HRESULT WINAPI IAVIStream_fnRead(IAVIStream*iface,LONG start,LONG samples,LPVOID buffer,LONG buffersize,LONG *bytesread,LONG *samplesread) { 331 ICOM_THIS(IAVIStreamImpl,iface);332 HRESULThr;333 AVIINDEXENTRY*pIndexEntry;334 DWORDdwCountOfIndexEntry;335 DWORDdwFrameLength;336 337 FIXME("(%p)->Read(%ld,%ld,%p,%ld,%p,%p)\n",This,start,samples,buffer,buffersize,bytesread,samplesread);338 339 *bytesread = 0;340 *samplesread = 0;341 342 hr = AVIFILE_IAVIFile_GetIndexTable(343 This->paf, This->pData->dwStreamIndex,344 &pIndexEntry, &dwCountOfIndexEntry );345 if ( hr != S_OK )346 return hr;347 if ( start < 0 )348 return E_FAIL;349 if ( start >= dwCountOfIndexEntry || samples <= 0 )350 {351 FIXME("start %ld,samples %ld,total %ld\n",start,samples,dwCountOfIndexEntry);352 return S_OK;353 }354 355 /* FIXME - is this data valid??? */356 dwFrameLength = pIndexEntry[start].dwChunkLength + sizeof(DWORD)*2;357 358 if ( buffer == NULL )359 {360 *bytesread = dwFrameLength;361 *samplesread = 1;362 return S_OK;363 }364 if ( buffersize < dwFrameLength )365 {366 FIXME( "buffer is too small!\n" );367 return AVIERR_BUFFERTOOSMALL;368 }369 370 hr = AVIFILE_IAVIFile_ReadMovieData(371 This->paf,372 pIndexEntry[start].dwChunkOffset,373 dwFrameLength, buffer );374 if ( hr != S_OK )375 {376 FIXME( "ReadMovieData failed!\n");377 return hr;378 }379 *bytesread = dwFrameLength;380 *samplesread = 1;381 382 return S_OK;330 ICOM_THIS(IAVIStreamImpl,iface); 331 HRESULT hr; 332 AVIINDEXENTRY* pIndexEntry; 333 DWORD dwCountOfIndexEntry; 334 DWORD dwFrameLength; 335 336 FIXME("(%p)->Read(%ld,%ld,%p,%ld,%p,%p)\n",This,start,samples,buffer,buffersize,bytesread,samplesread); 337 338 *bytesread = 0; 339 *samplesread = 0; 340 341 hr = AVIFILE_IAVIFile_GetIndexTable( 342 This->paf, This->pData->dwStreamIndex, 343 &pIndexEntry, &dwCountOfIndexEntry ); 344 if ( hr != S_OK ) 345 return hr; 346 if ( start < 0 ) 347 return E_FAIL; 348 if ( start >= dwCountOfIndexEntry || samples <= 0 ) 349 { 350 FIXME("start %ld,samples %ld,total %ld\n",start,samples,dwCountOfIndexEntry); 351 return S_OK; 352 } 353 354 /* FIXME - is this data valid??? */ 355 dwFrameLength = pIndexEntry[start].dwChunkLength + sizeof(DWORD)*2; 356 357 if ( buffer == NULL ) 358 { 359 *bytesread = dwFrameLength; 360 *samplesread = 1; 361 return S_OK; 362 } 363 if ( buffersize < dwFrameLength ) 364 { 365 FIXME( "buffer is too small!\n" ); 366 return AVIERR_BUFFERTOOSMALL; 367 } 368 369 hr = AVIFILE_IAVIFile_ReadMovieData( 370 This->paf, 371 pIndexEntry[start].dwChunkOffset, 372 dwFrameLength, buffer ); 373 if ( hr != S_OK ) 374 { 375 FIXME( "ReadMovieData failed!\n"); 376 return hr; 377 } 378 *bytesread = dwFrameLength; 379 *samplesread = 1; 380 381 return S_OK; 383 382 } 384 383 385 384 static HRESULT WINAPI IAVIStream_fnWrite(IAVIStream*iface,LONG start,LONG samples,LPVOID buffer,LONG buffersize,DWORD flags,LONG *sampwritten,LONG *byteswritten) { 386 ICOM_THIS(IAVIStreamImpl,iface);387 388 389 FIXME("(%p)->Write(%ld,%ld,%p,%ld,0x%08lx,%p,%p)\n",This,start,samples,buffer,buffersize,flags,sampwritten,byteswritten);390 return E_FAIL;385 ICOM_THIS(IAVIStreamImpl,iface); 386 387 388 FIXME("(%p)->Write(%ld,%ld,%p,%ld,0x%08lx,%p,%p)\n",This,start,samples,buffer,buffersize,flags,sampwritten,byteswritten); 389 return E_FAIL; 391 390 } 392 391 393 392 static HRESULT WINAPI IAVIStream_fnDelete(IAVIStream*iface,LONG start,LONG samples) { 394 ICOM_THIS(IAVIStreamImpl,iface);395 396 FIXME("(%p)->Delete(%ld,%ld)\n",This,start,samples);397 return E_FAIL;393 ICOM_THIS(IAVIStreamImpl,iface); 394 395 FIXME("(%p)->Delete(%ld,%ld)\n",This,start,samples); 396 return E_FAIL; 398 397 } 399 398 static HRESULT WINAPI IAVIStream_fnReadData(IAVIStream*iface,DWORD fcc,LPVOID lp,LONG *lpread) { 400 ICOM_THIS(IAVIStreamImpl,iface);401 402 FIXME("(%p)->ReadData(0x%08lx,%p,%p)\n",This,fcc,lp,lpread);403 return E_FAIL;399 ICOM_THIS(IAVIStreamImpl,iface); 400 401 FIXME("(%p)->ReadData(0x%08lx,%p,%p)\n",This,fcc,lp,lpread); 402 return E_FAIL; 404 403 } 405 404 406 405 static HRESULT WINAPI IAVIStream_fnWriteData(IAVIStream*iface,DWORD fcc,LPVOID lp,LONG size) { 407 ICOM_THIS(IAVIStreamImpl,iface);408 409 FIXME("(%p)->WriteData(0x%08lx,%p,%ld)\n",This,fcc,lp,size);410 return E_FAIL;406 ICOM_THIS(IAVIStreamImpl,iface); 407 408 FIXME("(%p)->WriteData(0x%08lx,%p,%ld)\n",This,fcc,lp,size); 409 return E_FAIL; 411 410 } 412 411 413 412 static HRESULT WINAPI IAVIStream_fnSetInfo(IAVIStream*iface,AVISTREAMINFOW*info,LONG infolen) { 414 ICOM_THIS(IAVIStreamImpl,iface);415 416 FIXME("(%p)->SetInfo(%p,%ld)\n",This,info,infolen);417 418 return E_FAIL;419 } 420 413 ICOM_THIS(IAVIStreamImpl,iface); 414 415 FIXME("(%p)->SetInfo(%p,%ld)\n",This,info,infolen); 416 417 return E_FAIL; 418 } 419 -
trunk/src/avifil32/igframe.c
r6652 r6712 1 /* $Id: igframe.c,v 1.2 2001-09-05 14:16:45 bird Exp $ */2 1 /* 3 2 * Copyright 2001 Hidenori TAKESHIMA <hidenori@a2.ctktv.ne.jp> … … 30 29 struct ICOM_VTABLE(IGetFrame) igetfrm = { 31 30 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE 32 IGetFrame_fnQueryInterface,33 IGetFrame_fnAddRef,34 IGetFrame_fnRelease,35 IGetFrame_fnGetFrame,36 IGetFrame_fnBegin,37 IGetFrame_fnEnd,38 IGetFrame_fnSetFormat,31 IGetFrame_fnQueryInterface, 32 IGetFrame_fnAddRef, 33 IGetFrame_fnRelease, 34 IGetFrame_fnGetFrame, 35 IGetFrame_fnBegin, 36 IGetFrame_fnEnd, 37 IGetFrame_fnSetFormat, 39 38 }; 40 39 41 40 typedef struct IGetFrameImpl 42 41 { 43 ICOM_VFIELD(IGetFrame);44 /* IUnknown stuff */45 DWORDref;46 /* IGetFrame stuff */47 IAVIStream*pas;48 HIChIC;49 LONGlCachedFrame;50 BITMAPINFO*pbiICIn;51 BITMAPINFO*pbiICOut;52 LPVOIDpvICOutBits;53 LPVOIDpvICInFmtBuf;54 DWORDdwICInDataBufSize;55 LPVOIDpvICInDataBuf;56 LPVOIDpvICOutBuf;42 ICOM_VFIELD(IGetFrame); 43 /* IUnknown stuff */ 44 DWORD ref; 45 /* IGetFrame stuff */ 46 IAVIStream* pas; 47 HIC hIC; 48 LONG lCachedFrame; 49 BITMAPINFO* pbiICIn; 50 BITMAPINFO* pbiICOut; 51 LPVOID pvICOutBits; 52 LPVOID pvICInFmtBuf; 53 DWORD dwICInDataBufSize; 54 LPVOID pvICInDataBuf; 55 LPVOID pvICOutBuf; 57 56 } IGetFrameImpl; 58 57 59 58 static HRESULT IGetFrame_Construct( IGetFrameImpl* This, 60 IAVIStream* pstr,61 LPBITMAPINFOHEADER lpbi );59 IAVIStream* pstr, 60 LPBITMAPINFOHEADER lpbi ); 62 61 static void IGetFrame_Destruct( IGetFrameImpl* This ); 63 62 … … 67 66 static LPVOID AVIFILE_IGetFrame_DecodeFrame(IGetFrameImpl* This,LONG lPos) 68 67 { 69 HRESULThr;70 DWORDdwRes;71 LONGlFrameLength;72 LONGlSampleCount;73 ICDECOMPRESSicd;74 75 if ( This->hIC == (HIC)NULL )76 return NULL;77 78 hr = IAVIStream_Read(This->pas,lPos,1,NULL,0,79 &lFrameLength,&lSampleCount);80 if ( hr != S_OK || lSampleCount <= 0 )81 {82 FIXME( "IAVIStream_Read failed! res = %08lx\n", hr );83 return NULL;84 }85 TRACE( "frame length = %ld\n", lFrameLength );86 87 if ( This->dwICInDataBufSize < lFrameLength )88 {89 LPVOIDlpv;90 91 if ( This->pvICInDataBuf == NULL )92 {93 lpv = HeapAlloc(94 AVIFILE_data.hHeap,HEAP_ZERO_MEMORY,95 lFrameLength );96 }97 else98 {99 lpv = HeapReAlloc(100 AVIFILE_data.hHeap,HEAP_ZERO_MEMORY,101 This->pvICInDataBuf,lFrameLength );102 }103 if ( lpv == NULL )104 {105 ERR( "out of memory!\n" );106 return NULL;107 }108 This->pvICInDataBuf = lpv;109 This->dwICInDataBufSize = lFrameLength;110 }111 112 hr = IAVIStream_Read(This->pas,lPos,1,113 This->pvICInDataBuf,This->dwICInDataBufSize,114 &lFrameLength,&lSampleCount);115 if ( hr != S_OK || lSampleCount <= 0 )116 {117 FIXME( "IAVIStream_Read to buffer failed! res = %08lx\n", hr );118 return NULL;119 }120 121 This->pbiICIn->bmiHeader.biSizeImage = lFrameLength;122 123 TRACE( "call ICM_DECOMPRESS\n" );124 icd.dwFlags = (*(BYTE*)This->pvICInDataBuf) == 'c' ?125 ICDECOMPRESS_NOTKEYFRAME : 0;126 icd.lpbiInput = &This->pbiICIn->bmiHeader;127 icd.lpInput = (BYTE*)This->pvICInDataBuf + 8;128 icd.lpbiOutput = &This->pbiICOut->bmiHeader;129 icd.lpOutput = This->pvICOutBits;130 icd.ckid = *((DWORD*)This->pvICInDataBuf);131 dwRes = ICSendMessage(This->hIC,ICM_DECOMPRESS,132 (DWORD)(&icd),sizeof(ICDECOMPRESS) );133 TRACE( "returned from ICM_DECOMPRESS\n" );134 if ( dwRes != ICERR_OK )135 {136 ERR( "ICDecompress failed!\n" );137 return NULL;138 }139 140 This->lCachedFrame = lPos;141 142 return This->pvICOutBits;68 HRESULT hr; 69 DWORD dwRes; 70 LONG lFrameLength; 71 LONG lSampleCount; 72 ICDECOMPRESS icd; 73 74 if ( This->hIC == (HIC)NULL ) 75 return NULL; 76 77 hr = IAVIStream_Read(This->pas,lPos,1,NULL,0, 78 &lFrameLength,&lSampleCount); 79 if ( hr != S_OK || lSampleCount <= 0 ) 80 { 81 FIXME( "IAVIStream_Read failed! res = %08lx\n", hr ); 82 return NULL; 83 } 84 TRACE( "frame length = %ld\n", lFrameLength ); 85 86 if ( This->dwICInDataBufSize < lFrameLength ) 87 { 88 LPVOID lpv; 89 90 if ( This->pvICInDataBuf == NULL ) 91 { 92 lpv = HeapAlloc( 93 AVIFILE_data.hHeap,HEAP_ZERO_MEMORY, 94 lFrameLength ); 95 } 96 else 97 { 98 lpv = HeapReAlloc( 99 AVIFILE_data.hHeap,HEAP_ZERO_MEMORY, 100 This->pvICInDataBuf,lFrameLength ); 101 } 102 if ( lpv == NULL ) 103 { 104 ERR( "out of memory!\n" ); 105 return NULL; 106 } 107 This->pvICInDataBuf = lpv; 108 This->dwICInDataBufSize = lFrameLength; 109 } 110 111 hr = IAVIStream_Read(This->pas,lPos,1, 112 This->pvICInDataBuf,This->dwICInDataBufSize, 113 &lFrameLength,&lSampleCount); 114 if ( hr != S_OK || lSampleCount <= 0 ) 115 { 116 FIXME( "IAVIStream_Read to buffer failed! res = %08lx\n", hr ); 117 return NULL; 118 } 119 120 This->pbiICIn->bmiHeader.biSizeImage = lFrameLength; 121 122 TRACE( "call ICM_DECOMPRESS\n" ); 123 icd.dwFlags = (*(BYTE*)This->pvICInDataBuf) == 'c' ? 124 ICDECOMPRESS_NOTKEYFRAME : 0; 125 icd.lpbiInput = &This->pbiICIn->bmiHeader; 126 icd.lpInput = (BYTE*)This->pvICInDataBuf + 8; 127 icd.lpbiOutput = &This->pbiICOut->bmiHeader; 128 icd.lpOutput = This->pvICOutBits; 129 icd.ckid = *((DWORD*)This->pvICInDataBuf); 130 dwRes = ICSendMessage(This->hIC,ICM_DECOMPRESS, 131 (DWORD)(&icd),sizeof(ICDECOMPRESS) ); 132 TRACE( "returned from ICM_DECOMPRESS\n" ); 133 if ( dwRes != ICERR_OK ) 134 { 135 ERR( "ICDecompress failed!\n" ); 136 return NULL; 137 } 138 139 This->lCachedFrame = lPos; 140 141 return This->pvICOutBits; 143 142 } 144 143 … … 146 145 147 146 HRESULT AVIFILE_CreateIGetFrame(void** ppobj, 148 IAVIStream* pstr,LPBITMAPINFOHEADER lpbi)149 { 150 IGetFrameImpl*This;151 HRESULThr;152 153 *ppobj = NULL;154 This = (IGetFrameImpl*)HeapAlloc(AVIFILE_data.hHeap,HEAP_ZERO_MEMORY,155 sizeof(IGetFrameImpl));156 This->ref = 1;157 ICOM_VTBL(This) = &igetfrm;158 hr = IGetFrame_Construct( This, pstr, lpbi );159 if ( hr != S_OK )160 {161 IGetFrame_Destruct( This );162 return hr;163 }164 165 *ppobj = (LPVOID)This;166 167 return S_OK;147 IAVIStream* pstr,LPBITMAPINFOHEADER lpbi) 148 { 149 IGetFrameImpl *This; 150 HRESULT hr; 151 152 *ppobj = NULL; 153 This = (IGetFrameImpl*)HeapAlloc(AVIFILE_data.hHeap,HEAP_ZERO_MEMORY, 154 sizeof(IGetFrameImpl)); 155 This->ref = 1; 156 ICOM_VTBL(This) = &igetfrm; 157 hr = IGetFrame_Construct( This, pstr, lpbi ); 158 if ( hr != S_OK ) 159 { 160 IGetFrame_Destruct( This ); 161 return hr; 162 } 163 164 *ppobj = (LPVOID)This; 165 166 return S_OK; 168 167 } 169 168 … … 174 173 static HRESULT WINAPI IGetFrame_fnQueryInterface(IGetFrame* iface,REFIID refiid,LPVOID *obj) 175 174 { 176 ICOM_THIS(IGetFrameImpl,iface);177 178 TRACE("(%p)->QueryInterface(%s,%p)\n",This,debugstr_guid(refiid),obj);179 if ( IsEqualGUID(&IID_IUnknown,refiid) ||180 IsEqualGUID(&IID_IGetFrame,refiid) )181 {182 IGetFrame_AddRef(iface);183 *obj = iface;184 return S_OK;185 }186 187 return OLE_E_ENUM_NOMORE;175 ICOM_THIS(IGetFrameImpl,iface); 176 177 TRACE("(%p)->QueryInterface(%s,%p)\n",This,debugstr_guid(refiid),obj); 178 if ( IsEqualGUID(&IID_IUnknown,refiid) || 179 IsEqualGUID(&IID_IGetFrame,refiid) ) 180 { 181 IGetFrame_AddRef(iface); 182 *obj = iface; 183 return S_OK; 184 } 185 186 return OLE_E_ENUM_NOMORE; 188 187 } 189 188 190 189 static ULONG WINAPI IGetFrame_fnAddRef(IGetFrame* iface) 191 190 { 192 ICOM_THIS(IGetFrameImpl,iface);193 194 TRACE("(%p)->AddRef()\n",iface);195 return ++(This->ref);191 ICOM_THIS(IGetFrameImpl,iface); 192 193 TRACE("(%p)->AddRef()\n",iface); 194 return ++(This->ref); 196 195 } 197 196 198 197 static ULONG WINAPI IGetFrame_fnRelease(IGetFrame* iface) 199 198 { 200 ICOM_THIS(IGetFrameImpl,iface);201 202 TRACE("(%p)->Release()\n",iface);203 if ((--(This->ref)) > 0 )204 return This->ref;205 IGetFrame_Destruct(This);206 if ( This->pas != NULL )207 IAVIStream_Release( This->pas );208 209 HeapFree(AVIFILE_data.hHeap,0,iface);210 return 0;199 ICOM_THIS(IGetFrameImpl,iface); 200 201 TRACE("(%p)->Release()\n",iface); 202 if ((--(This->ref)) > 0 ) 203 return This->ref; 204 IGetFrame_Destruct(This); 205 if ( This->pas != NULL ) 206 IAVIStream_Release( This->pas ); 207 208 HeapFree(AVIFILE_data.hHeap,0,iface); 209 return 0; 211 210 } 212 211 … … 217 216 static LPVOID WINAPI IGetFrame_fnGetFrame(IGetFrame* iface,LONG lPos) 218 217 { 219 ICOM_THIS(IGetFrameImpl,iface);220 LPVOIDlpv;221 LONGlKeyFrame;222 223 TRACE( "(%p)->(%ld)\n", This, lPos );224 225 if ( lPos < 0 )226 return NULL;227 228 if ( This->lCachedFrame == lPos )229 return This->pvICOutBits;230 if ( (This->lCachedFrame+1) != lPos )231 {232 lKeyFrame = IAVIStream_FindSample( This->pas, lPos,233 FIND_KEY | FIND_PREV );234 if ( lKeyFrame < 0 || lKeyFrame > lPos )235 return NULL;236 while ( ++lKeyFrame < lPos )237 {238 lpv = AVIFILE_IGetFrame_DecodeFrame(This, lKeyFrame);239 if ( lpv == NULL )240 return NULL;241 }242 }243 244 lpv = AVIFILE_IGetFrame_DecodeFrame(This, lPos);245 TRACE( "lpv = %p\n",lpv );246 if ( lpv == NULL )247 return NULL;248 249 return lpv;218 ICOM_THIS(IGetFrameImpl,iface); 219 LPVOID lpv; 220 LONG lKeyFrame; 221 222 TRACE( "(%p)->(%ld)\n", This, lPos ); 223 224 if ( lPos < 0 ) 225 return NULL; 226 227 if ( This->lCachedFrame == lPos ) 228 return This->pvICOutBits; 229 if ( (This->lCachedFrame+1) != lPos ) 230 { 231 lKeyFrame = IAVIStream_FindSample( This->pas, lPos, 232 FIND_KEY | FIND_PREV ); 233 if ( lKeyFrame < 0 || lKeyFrame > lPos ) 234 return NULL; 235 while ( ++lKeyFrame < lPos ) 236 { 237 lpv = AVIFILE_IGetFrame_DecodeFrame(This, lKeyFrame); 238 if ( lpv == NULL ) 239 return NULL; 240 } 241 } 242 243 lpv = AVIFILE_IGetFrame_DecodeFrame(This, lPos); 244 TRACE( "lpv = %p\n",lpv ); 245 if ( lpv == NULL ) 246 return NULL; 247 248 return lpv; 250 249 } 251 250 252 251 static HRESULT WINAPI IGetFrame_fnBegin(IGetFrame* iface,LONG lStart,LONG lEnd,LONG lRate) 253 252 { 254 ICOM_THIS(IGetFrameImpl,iface);255 256 TRACE( "(%p)->(%ld,%ld,%ld)\n", This, lStart, lEnd, lRate );257 258 if ( This->hIC == (HIC)NULL )259 return E_UNEXPECTED;260 261 if ( ICDecompressBegin( This->hIC,262 This->pbiICIn,263 This->pbiICOut ) != ICERR_OK )264 return E_FAIL;265 266 return S_OK;253 ICOM_THIS(IGetFrameImpl,iface); 254 255 TRACE( "(%p)->(%ld,%ld,%ld)\n", This, lStart, lEnd, lRate ); 256 257 if ( This->hIC == (HIC)NULL ) 258 return E_UNEXPECTED; 259 260 if ( ICDecompressBegin( This->hIC, 261 This->pbiICIn, 262 This->pbiICOut ) != ICERR_OK ) 263 return E_FAIL; 264 265 return S_OK; 267 266 } 268 267 269 268 static HRESULT WINAPI IGetFrame_fnEnd(IGetFrame* iface) 270 269 { 271 ICOM_THIS(IGetFrameImpl,iface);272 273 TRACE( "(%p)->()\n", This );274 275 if ( This->hIC == (HIC)NULL )276 return E_UNEXPECTED;277 278 if ( ICDecompressEnd( This->hIC ) != ICERR_OK )279 return E_FAIL;280 281 return S_OK;270 ICOM_THIS(IGetFrameImpl,iface); 271 272 TRACE( "(%p)->()\n", This ); 273 274 if ( This->hIC == (HIC)NULL ) 275 return E_UNEXPECTED; 276 277 if ( ICDecompressEnd( This->hIC ) != ICERR_OK ) 278 return E_FAIL; 279 280 return S_OK; 282 281 } 283 282 284 283 static HRESULT WINAPI IGetFrame_fnSetFormat(IGetFrame* iface,LPBITMAPINFOHEADER lpbi,LPVOID lpBits,INT x,INT y,INT dx,INT dy) 285 284 { 286 ICOM_THIS(IGetFrameImpl,iface);287 HRESULThr;288 LONGfmtlen;289 BITMAPINFOHEADERbiTemp;290 DWORDdwSizeImage;291 292 FIXME( "(%p)->(%p,%p,%d,%d,%d,%d)\n",This,lpbi,lpBits,x,y,dx,dy );293 294 IGetFrame_Destruct(This);295 296 hr = IAVIStream_ReadFormat(This->pas,0,NULL,&fmtlen);297 if ( hr != S_OK )298 return hr;299 This->pvICInFmtBuf = HeapAlloc(300 AVIFILE_data.hHeap,HEAP_ZERO_MEMORY,fmtlen);301 if ( This->pvICInFmtBuf == NULL )302 return AVIERR_MEMORY;303 hr = IAVIStream_ReadFormat(This->pas,0,This->pvICInFmtBuf,&fmtlen);304 if ( hr != S_OK )305 return hr;306 This->pbiICIn = (LPBITMAPINFO)This->pvICInFmtBuf;307 308 This->hIC = (HIC)ICOpen( ICTYPE_VIDEO,309 This->pbiICIn->bmiHeader.biCompression,310 ICMODE_DECOMPRESS );311 if ( This->hIC == (HIC)NULL )312 {313 ERR( "no AVI decompressor for %c%c%c%c.\n",314 (int)(This->pbiICIn->bmiHeader.biCompression>> 0)&0xff,315 (int)(This->pbiICIn->bmiHeader.biCompression>> 8)&0xff,316 (int)(This->pbiICIn->bmiHeader.biCompression>>16)&0xff,317 (int)(This->pbiICIn->bmiHeader.biCompression>>24)&0xff );318 return E_FAIL;319 }320 321 if ( lpbi == NULL || lpbi == ((LPBITMAPINFOHEADER)1) )322 {323 memset( &biTemp, 0, sizeof(biTemp) );324 biTemp.biSize = sizeof(BITMAPINFOHEADER);325 biTemp.biWidth = This->pbiICIn->bmiHeader.biWidth;326 biTemp.biHeight = This->pbiICIn->bmiHeader.biHeight;327 biTemp.biPlanes = 1;328 biTemp.biBitCount = 24;329 biTemp.biCompression = 0;330 lpbi = &biTemp;331 }332 333 if ( lpbi->biPlanes != 1 || lpbi->biCompression != 0 )334 return E_FAIL;335 336 dwSizeImage =337 ((This->pbiICIn->bmiHeader.biWidth*lpbi->biBitCount+7)/8)*338 This->pbiICIn->bmiHeader.biHeight;339 This->pvICOutBuf = HeapAlloc(340 AVIFILE_data.hHeap,HEAP_ZERO_MEMORY,341 (sizeof(BITMAPINFO)+sizeof(RGBQUAD)*256)*2+342 dwSizeImage );343 if ( This->pvICOutBuf == NULL )344 return AVIERR_MEMORY;345 346 This->pbiICOut = (BITMAPINFO*)This->pvICOutBuf;347 This->pvICOutBits = (LPVOID)( (BYTE*)This->pvICOutBuf +348 sizeof(BITMAPINFO) + sizeof(RGBQUAD)*256 );349 350 This->pbiICOut->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);351 This->pbiICOut->bmiHeader.biWidth = This->pbiICIn->bmiHeader.biWidth;352 This->pbiICOut->bmiHeader.biHeight = This->pbiICIn->bmiHeader.biHeight;353 This->pbiICOut->bmiHeader.biPlanes = 1;354 This->pbiICOut->bmiHeader.biBitCount = lpbi->biBitCount;355 This->pbiICOut->bmiHeader.biSizeImage = dwSizeImage;356 memcpy( This->pvICOutBits, This->pbiICOut, sizeof(BITMAPINFOHEADER) );357 358 return S_OK;285 ICOM_THIS(IGetFrameImpl,iface); 286 HRESULT hr; 287 LONG fmtlen; 288 BITMAPINFOHEADER biTemp; 289 DWORD dwSizeImage; 290 291 FIXME( "(%p)->(%p,%p,%d,%d,%d,%d)\n",This,lpbi,lpBits,x,y,dx,dy ); 292 293 IGetFrame_Destruct(This); 294 295 hr = IAVIStream_ReadFormat(This->pas,0,NULL,&fmtlen); 296 if ( hr != S_OK ) 297 return hr; 298 This->pvICInFmtBuf = HeapAlloc( 299 AVIFILE_data.hHeap,HEAP_ZERO_MEMORY,fmtlen); 300 if ( This->pvICInFmtBuf == NULL ) 301 return AVIERR_MEMORY; 302 hr = IAVIStream_ReadFormat(This->pas,0,This->pvICInFmtBuf,&fmtlen); 303 if ( hr != S_OK ) 304 return hr; 305 This->pbiICIn = (LPBITMAPINFO)This->pvICInFmtBuf; 306 307 This->hIC = (HIC)ICOpen( ICTYPE_VIDEO, 308 This->pbiICIn->bmiHeader.biCompression, 309 ICMODE_DECOMPRESS ); 310 if ( This->hIC == (HIC)NULL ) 311 { 312 ERR( "no AVI decompressor for %c%c%c%c.\n", 313 (int)(This->pbiICIn->bmiHeader.biCompression>> 0)&0xff, 314 (int)(This->pbiICIn->bmiHeader.biCompression>> 8)&0xff, 315 (int)(This->pbiICIn->bmiHeader.biCompression>>16)&0xff, 316 (int)(This->pbiICIn->bmiHeader.biCompression>>24)&0xff ); 317 return E_FAIL; 318 } 319 320 if ( lpbi == NULL || lpbi == ((LPBITMAPINFOHEADER)1) ) 321 { 322 memset( &biTemp, 0, sizeof(biTemp) ); 323 biTemp.biSize = sizeof(BITMAPINFOHEADER); 324 biTemp.biWidth = This->pbiICIn->bmiHeader.biWidth; 325 biTemp.biHeight = This->pbiICIn->bmiHeader.biHeight; 326 biTemp.biPlanes = 1; 327 biTemp.biBitCount = 24; 328 biTemp.biCompression = 0; 329 lpbi = &biTemp; 330 } 331 332 if ( lpbi->biPlanes != 1 || lpbi->biCompression != 0 ) 333 return E_FAIL; 334 335 dwSizeImage = 336 ((This->pbiICIn->bmiHeader.biWidth*lpbi->biBitCount+7)/8)* 337 This->pbiICIn->bmiHeader.biHeight; 338 This->pvICOutBuf = HeapAlloc( 339 AVIFILE_data.hHeap,HEAP_ZERO_MEMORY, 340 (sizeof(BITMAPINFO)+sizeof(RGBQUAD)*256)*2+ 341 dwSizeImage ); 342 if ( This->pvICOutBuf == NULL ) 343 return AVIERR_MEMORY; 344 345 This->pbiICOut = (BITMAPINFO*)This->pvICOutBuf; 346 This->pvICOutBits = (LPVOID)( (BYTE*)This->pvICOutBuf + 347 sizeof(BITMAPINFO) + sizeof(RGBQUAD)*256 ); 348 349 This->pbiICOut->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 350 This->pbiICOut->bmiHeader.biWidth = This->pbiICIn->bmiHeader.biWidth; 351 This->pbiICOut->bmiHeader.biHeight = This->pbiICIn->bmiHeader.biHeight; 352 This->pbiICOut->bmiHeader.biPlanes = 1; 353 This->pbiICOut->bmiHeader.biBitCount = lpbi->biBitCount; 354 This->pbiICOut->bmiHeader.biSizeImage = dwSizeImage; 355 memcpy( This->pvICOutBits, This->pbiICOut, sizeof(BITMAPINFOHEADER) ); 356 357 return S_OK; 359 358 } 360 359 361 360 static HRESULT IGetFrame_Construct( IGetFrameImpl* This, 362 IAVIStream* pstr,363 LPBITMAPINFOHEADER lpbi )364 { 365 HRESULThr;366 367 TRACE( "(%p)->(%p,%p)\n",This,pstr,lpbi );368 369 IAVIStream_AddRef( pstr );370 This->pas = pstr;371 This->hIC = (HIC)NULL;372 This->lCachedFrame = -1L;373 This->pbiICIn = NULL;374 This->pbiICOut = NULL;375 This->pvICInFmtBuf = NULL;376 This->pvICInDataBuf = NULL;377 This->dwICInDataBufSize = 0;378 This->pvICOutBuf = NULL;379 380 hr = IGetFrame_SetFormat((IGetFrame*)This,lpbi,NULL,0,0,0,0);381 if ( hr != S_OK )382 return hr;383 384 return S_OK;361 IAVIStream* pstr, 362 LPBITMAPINFOHEADER lpbi ) 363 { 364 HRESULT hr; 365 366 TRACE( "(%p)->(%p,%p)\n",This,pstr,lpbi ); 367 368 IAVIStream_AddRef( pstr ); 369 This->pas = pstr; 370 This->hIC = (HIC)NULL; 371 This->lCachedFrame = -1L; 372 This->pbiICIn = NULL; 373 This->pbiICOut = NULL; 374 This->pvICInFmtBuf = NULL; 375 This->pvICInDataBuf = NULL; 376 This->dwICInDataBufSize = 0; 377 This->pvICOutBuf = NULL; 378 379 hr = IGetFrame_SetFormat((IGetFrame*)This,lpbi,NULL,0,0,0,0); 380 if ( hr != S_OK ) 381 return hr; 382 383 return S_OK; 385 384 } 386 385 387 386 static void IGetFrame_Destruct( IGetFrameImpl* This ) 388 387 { 389 if ( This->hIC != (HIC)NULL )390 {391 ICClose( This->hIC );392 This->hIC = (HIC)NULL;393 }394 if ( This->pvICInFmtBuf != NULL )395 {396 HeapFree( AVIFILE_data.hHeap, 0, This->pvICInFmtBuf );397 This->pvICInFmtBuf = NULL;398 }399 if ( This->pvICInDataBuf != NULL )400 {401 HeapFree( AVIFILE_data.hHeap, 0, This->pvICInDataBuf );402 This->pvICInDataBuf = NULL;403 }404 if ( This->pvICOutBuf != NULL )405 {406 HeapFree( AVIFILE_data.hHeap, 0, This->pvICOutBuf );407 This->pvICOutBuf = NULL;408 }409 410 This->lCachedFrame = -1L;411 This->pbiICIn = NULL;412 This->pbiICOut = NULL;413 This->dwICInDataBufSize = 0;414 } 388 if ( This->hIC != (HIC)NULL ) 389 { 390 ICClose( This->hIC ); 391 This->hIC = (HIC)NULL; 392 } 393 if ( This->pvICInFmtBuf != NULL ) 394 { 395 HeapFree( AVIFILE_data.hHeap, 0, This->pvICInFmtBuf ); 396 This->pvICInFmtBuf = NULL; 397 } 398 if ( This->pvICInDataBuf != NULL ) 399 { 400 HeapFree( AVIFILE_data.hHeap, 0, This->pvICInDataBuf ); 401 This->pvICInDataBuf = NULL; 402 } 403 if ( This->pvICOutBuf != NULL ) 404 { 405 HeapFree( AVIFILE_data.hHeap, 0, This->pvICOutBuf ); 406 This->pvICOutBuf = NULL; 407 } 408 409 This->lCachedFrame = -1L; 410 This->pbiICIn = NULL; 411 This->pbiICOut = NULL; 412 This->dwICInDataBufSize = 0; 413 } -
trunk/src/avifil32/main.c
r6652 r6712 1 /* $Id: main.c,v 1.2 2001-09-05 14:16:45 bird Exp $ */2 1 /* 3 2 * Copyright 2001 Hidenori TAKESHIMA <hidenori@a2.ctktv.ne.jp> … … 22 21 23 22 /*********************************************************************** 24 * AVIFILE_InitProcess (internal)23 * AVIFILE_InitProcess (internal) 25 24 */ 26 25 static BOOL AVIFILE_InitProcess( void ) 27 26 { 28 TRACE("()\n");27 TRACE("()\n"); 29 28 30 AVIFILE_data.dwAVIFileRef = 0;31 AVIFILE_data.dwClassObjRef = 0;32 AVIFILE_data.hHeap = (HANDLE)NULL;29 AVIFILE_data.dwAVIFileRef = 0; 30 AVIFILE_data.dwClassObjRef = 0; 31 AVIFILE_data.hHeap = (HANDLE)NULL; 33 32 34 AVIFILE_data.hHeap = HeapCreate( 0, 0x10000, 0 );35 if ( AVIFILE_data.hHeap == (HANDLE)NULL )36 {37 ERR( "cannot allocate heap for AVIFILE.\n" );38 return FALSE;39 }33 AVIFILE_data.hHeap = HeapCreate( 0, 0x10000, 0 ); 34 if ( AVIFILE_data.hHeap == (HANDLE)NULL ) 35 { 36 ERR( "cannot allocate heap for AVIFILE.\n" ); 37 return FALSE; 38 } 40 39 41 return TRUE;40 return TRUE; 42 41 } 43 42 44 43 /*********************************************************************** 45 * AVIFILE_UninitProcess (internal)44 * AVIFILE_UninitProcess (internal) 46 45 */ 47 46 static void AVIFILE_UninitProcess( void ) 48 47 { 49 TRACE("()\n");48 TRACE("()\n"); 50 49 51 if ( AVIFILE_data.dwAVIFileRef != 0 )52 ERR( "you must call AVIFileExit()\n" );50 if ( AVIFILE_data.dwAVIFileRef != 0 ) 51 ERR( "you must call AVIFileExit()\n" ); 53 52 54 if ( AVIFILE_data.dwClassObjRef != 0 )55 ERR( "you must release some objects allocated from AVIFile.\n" );53 if ( AVIFILE_data.dwClassObjRef != 0 ) 54 ERR( "you must release some objects allocated from AVIFile.\n" ); 56 55 57 if ( AVIFILE_data.hHeap != (HANDLE)NULL )58 {59 HeapDestroy( AVIFILE_data.hHeap );60 AVIFILE_data.hHeap = (HANDLE)NULL;61 }56 if ( AVIFILE_data.hHeap != (HANDLE)NULL ) 57 { 58 HeapDestroy( AVIFILE_data.hHeap ); 59 AVIFILE_data.hHeap = (HANDLE)NULL; 60 } 62 61 } 63 62 64 63 /*********************************************************************** 65 * AVIFILE_DllMain64 * AVIFILE_DllMain 66 65 */ 67 66 BOOL WINAPI AVIFILE_DllMain( 68 HINSTANCE hInstDLL,69 DWORD fdwReason,70 LPVOID lpvReserved )67 HINSTANCE hInstDLL, 68 DWORD fdwReason, 69 LPVOID lpvReserved ) 71 70 { 72 switch ( fdwReason )73 {74 case DLL_PROCESS_ATTACH:75 if ( !AVIFILE_InitProcess() )76 return FALSE;77 break;78 case DLL_PROCESS_DETACH:79 AVIFILE_UninitProcess();80 break;81 case DLL_THREAD_ATTACH:82 break;83 case DLL_THREAD_DETACH:84 break;85 }71 switch ( fdwReason ) 72 { 73 case DLL_PROCESS_ATTACH: 74 if ( !AVIFILE_InitProcess() ) 75 return FALSE; 76 break; 77 case DLL_PROCESS_DETACH: 78 AVIFILE_UninitProcess(); 79 break; 80 case DLL_THREAD_ATTACH: 81 break; 82 case DLL_THREAD_DETACH: 83 break; 84 } 86 85 87 return TRUE;86 return TRUE; 88 87 } 89 88 -
trunk/src/avifil32/string.c
r6652 r6712 1 /* $Id: string.c,v 1.2 2001-09-05 14:16:46 bird Exp $ */2 1 /* 3 2 * Copyright 2001 Hidenori TAKESHIMA <hidenori@a2.ctktv.ne.jp> … … 25 24 INT AVIFILE_strlenAtoW( LPCSTR lpstr ) 26 25 { 27 INTlen;26 INT len; 28 27 29 len = MultiByteToWideChar( CP_ACP, 0, lpstr, -1, NULL, 0 );30 return ( len > 0 ) ? (len-1) : 0;28 len = MultiByteToWideChar( CP_ACP, 0, lpstr, -1, NULL, 0 ); 29 return ( len > 0 ) ? (len-1) : 0; 31 30 } 32 31 33 32 INT AVIFILE_strlenWtoA( LPCWSTR lpwstr ) 34 33 { 35 INTlen;34 INT len; 36 35 37 len = WideCharToMultiByte( CP_ACP, 0, lpwstr, -1,38 NULL, 0, NULL, NULL );39 return ( len > 0 ) ? (len-1) : 0;36 len = WideCharToMultiByte( CP_ACP, 0, lpwstr, -1, 37 NULL, 0, NULL, NULL ); 38 return ( len > 0 ) ? (len-1) : 0; 40 39 } 41 40 42 41 LPWSTR AVIFILE_strncpyAtoW( LPWSTR lpwstr, LPCSTR lpstr, INT wbuflen ) 43 42 { 44 INTlen;43 INT len; 45 44 46 len = MultiByteToWideChar( CP_ACP, 0, lpstr, -1, lpwstr, wbuflen );47 if ( len == 0 )48 *lpwstr = 0;49 return lpwstr;45 len = MultiByteToWideChar( CP_ACP, 0, lpstr, -1, lpwstr, wbuflen ); 46 if ( len == 0 ) 47 *lpwstr = 0; 48 return lpwstr; 50 49 } 51 50 52 51 LPSTR AVIFILE_strncpyWtoA( LPSTR lpstr, LPCWSTR lpwstr, INT abuflen ) 53 52 { 54 INTlen;53 INT len; 55 54 56 len = WideCharToMultiByte( CP_ACP, 0, lpwstr, -1,57 lpstr, abuflen, NULL, NULL );58 if ( len == 0 )59 *lpstr = 0;60 return lpstr;55 len = WideCharToMultiByte( CP_ACP, 0, lpwstr, -1, 56 lpstr, abuflen, NULL, NULL ); 57 if ( len == 0 ) 58 *lpstr = 0; 59 return lpstr; 61 60 } 62 61 63 62 LPWSTR AVIFILE_strdupAtoW( LPCSTR lpstr ) 64 63 { 65 INT len;66 LPWSTR lpwstr = NULL;64 INT len; 65 LPWSTR lpwstr = NULL; 67 66 68 len = AVIFILE_strlenAtoW( lpstr );69 if ( len > 0 )70 {71 lpwstr = (LPWSTR)HeapAlloc( AVIFILE_data.hHeap, 0, sizeof(WCHAR)*(len+1) );72 if ( lpwstr != NULL )73 (void)AVIFILE_strncpyAtoW( lpwstr, lpstr, len+1 );74 }67 len = AVIFILE_strlenAtoW( lpstr ); 68 if ( len > 0 ) 69 { 70 lpwstr = (LPWSTR)HeapAlloc( AVIFILE_data.hHeap, 0, sizeof(WCHAR)*(len+1) ); 71 if ( lpwstr != NULL ) 72 (void)AVIFILE_strncpyAtoW( lpwstr, lpstr, len+1 ); 73 } 75 74 76 return lpwstr;75 return lpwstr; 77 76 } 78 77 79 78 LPSTR AVIFILE_strdupWtoA( LPCWSTR lpwstr ) 80 79 { 81 INT len;82 LPSTR lpstr = NULL;80 INT len; 81 LPSTR lpstr = NULL; 83 82 84 len = AVIFILE_strlenWtoA( lpwstr );85 if ( len > 0 )86 {87 lpstr = (LPSTR)HeapAlloc( AVIFILE_data.hHeap, 0, sizeof(CHAR)*(len+1) );88 if ( lpstr != NULL )89 (void)AVIFILE_strncpyWtoA( lpstr, lpwstr, len+1 );90 }83 len = AVIFILE_strlenWtoA( lpwstr ); 84 if ( len > 0 ) 85 { 86 lpstr = (LPSTR)HeapAlloc( AVIFILE_data.hHeap, 0, sizeof(CHAR)*(len+1) ); 87 if ( lpstr != NULL ) 88 (void)AVIFILE_strncpyWtoA( lpstr, lpwstr, len+1 ); 89 } 91 90 92 return lpstr;91 return lpstr; 93 92 } 94 93
Note:
See TracChangeset
for help on using the changeset viewer.
