- Timestamp:
- Sep 5, 2001, 4:16:46 PM (24 years ago)
- Location:
- trunk/src/avifil32
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/avifil32/guid.c
r6386 r6652 1 /* $Id: guid.c,v 1.2 2001-09-05 14:16:44 bird Exp $ */ 1 2 #define INITGUID 2 3 -
trunk/src/avifil32/iafile.c
r6386 r6652 1 /* $Id: iafile.c,v 1.2 2001-09-05 14:16:44 bird Exp $ */ 1 2 /* 2 3 * Copyright 1999 Marcus Meissner … … 20 21 DEFAULT_DEBUG_CHANNEL(avifile); 21 22 22 #define AVIFILE_STREAMS_MAX423 #define AVIFILE_STREAMS_MAX 4 23 24 24 25 … … 52 53 typedef struct IAVIFileImpl 53 54 { 54 ICOM_VFIELD(IAVIFile);55 /* IUnknown stuff */56 DWORDref;57 /* IAVIFile stuff */58 HANDLEhf;59 DWORDdwAVIFileCaps;60 DWORDdwAVIFileScale;61 DWORDdwAVIFileRate;62 DWORDdwAVIFileLength;63 DWORDdwAVIFileEditCount;64 MainAVIHeaderhdr;65 IAVIStream*pStreams[AVIFILE_STREAMS_MAX];66 AVIStreamHeaderstrhdrs[AVIFILE_STREAMS_MAX];67 DWORDdwMoviTop;68 DWORDdwCountOfIndexEntry;69 AVIINDEXENTRY*pIndexEntry;70 AVIINDEXENTRY*pStreamIndexEntry[AVIFILE_STREAMS_MAX+1];55 ICOM_VFIELD(IAVIFile); 56 /* IUnknown stuff */ 57 DWORD ref; 58 /* IAVIFile stuff */ 59 HANDLE hf; 60 DWORD dwAVIFileCaps; 61 DWORD dwAVIFileScale; 62 DWORD dwAVIFileRate; 63 DWORD dwAVIFileLength; 64 DWORD dwAVIFileEditCount; 65 MainAVIHeader hdr; 66 IAVIStream* pStreams[AVIFILE_STREAMS_MAX]; 67 AVIStreamHeader strhdrs[AVIFILE_STREAMS_MAX]; 68 DWORD dwMoviTop; 69 DWORD dwCountOfIndexEntry; 70 AVIINDEXENTRY* pIndexEntry; 71 AVIINDEXENTRY* pStreamIndexEntry[AVIFILE_STREAMS_MAX+1]; 71 72 } IAVIFileImpl; 72 73 … … 77 78 78 79 static HRESULT AVIFILE_IAVIFile_ReadNextChunkHeader( 79 IAVIFileImpl* This, FOURCC* pfcc, DWORD* pdwSize )80 { 81 BYTEbuf[8];82 DWORDdwRead;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;80 IAVIFileImpl* This, FOURCC* pfcc, DWORD* pdwSize ) 81 { 82 BYTE buf[8]; 83 DWORD dwRead; 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; 94 95 } 95 96 96 97 static HRESULT AVIFILE_IAVIFile_SkipChunkData( 97 IAVIFileImpl* This, DWORD dwChunkSize )98 { 99 LONGlHigh = 0;100 DWORDdwRes;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;98 IAVIFileImpl* This, DWORD dwChunkSize ) 99 { 100 LONG lHigh = 0; 101 DWORD dwRes; 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; 112 113 } 113 114 114 115 static HRESULT AVIFILE_IAVIFile_ReadChunkData( 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 );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 ); 125 126 } 126 127 127 128 static HRESULT AVIFILE_IAVIFile_SeekToSpecifiedChunk( 128 IAVIFileImpl* This, FOURCC fccType, DWORD* pdwLen )129 { 130 HRESULThr;131 FOURCCfcc;132 BYTEbuf[4];133 DWORDdwRead;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 else151 {152 hr = AVIFILE_IAVIFile_SkipChunkData(153 This, *pdwLen );154 if ( hr != S_OK )155 return hr;156 }157 }129 IAVIFileImpl* This, FOURCC fccType, DWORD* pdwLen ) 130 { 131 HRESULT hr; 132 FOURCC fcc; 133 BYTE buf[4]; 134 DWORD dwRead; 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 else 152 { 153 hr = AVIFILE_IAVIFile_SkipChunkData( 154 This, *pdwLen ); 155 if ( hr != S_OK ) 156 return hr; 157 } 158 } 158 159 } 159 160 … … 161 162 WINE_AVISTREAM_DATA* AVIFILE_Alloc_IAVIStreamData( DWORD dwFmtLen ) 162 163 { 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;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; 184 185 } 185 186 186 187 void AVIFILE_Free_IAVIStreamData( WINE_AVISTREAM_DATA* pData ) 187 188 { 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 }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 } 194 195 } 195 196 196 197 static void AVIFILE_IAVIFile_InitIndexTable( 197 IAVIFileImpl* This,198 AVIINDEXENTRY* pIndexBuf,199 AVIINDEXENTRY* pIndexData,200 DWORD dwCountOfIndexEntry )201 { 202 DWORDdwStreamIndex;203 DWORDdwIndex;204 FOURCCckid;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,198 IAVIFileImpl* This, 199 AVIINDEXENTRY* pIndexBuf, 200 AVIINDEXENTRY* pIndexData, 201 DWORD dwCountOfIndexEntry ) 202 { 203 DWORD dwStreamIndex; 204 DWORD dwIndex; 205 FOURCC ckid; 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, 225 226 (int)(pIndexData[dwIndex].ckid>> 8)&0xff, 226 227 (int)(pIndexData[dwIndex].ckid>>16)&0xff, 227 228 (int)(pIndexData[dwIndex].ckid>>24)&0xff ); 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 }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 } 237 238 FIXME( "pIndexBuf = %p\n", pIndexBuf ); 238 }239 This->pStreamIndexEntry[This->hdr.dwStreams] = pIndexBuf;239 } 240 This->pStreamIndexEntry[This->hdr.dwStreams] = pIndexBuf; 240 241 } 241 242 … … 250 251 HRESULT AVIFILE_CreateIAVIFile(void** ppobj) 251 252 { 252 IAVIFileImpl*This;253 HRESULThr;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;253 IAVIFileImpl *This; 254 HRESULT hr; 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; 274 275 } 275 276 … … 279 280 280 281 static HRESULT WINAPI IAVIFile_fnQueryInterface(IAVIFile* iface,REFIID refiid,LPVOID *obj) { 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;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; 292 293 } 293 294 294 295 static ULONG WINAPI IAVIFile_fnAddRef(IAVIFile* iface) { 295 ICOM_THIS(IAVIFileImpl,iface);296 297 TRACE("(%p)->AddRef()\n",iface);298 return ++(This->ref);296 ICOM_THIS(IAVIFileImpl,iface); 297 298 TRACE("(%p)->AddRef()\n",iface); 299 return ++(This->ref); 299 300 } 300 301 301 302 static ULONG WINAPI IAVIFile_fnRelease(IAVIFile* iface) { 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;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; 311 312 } 312 313 … … 317 318 static HRESULT AVIFILE_IAVIFile_Construct( IAVIFileImpl* This ) 318 319 { 319 DWORDdwIndex;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;320 DWORD dwIndex; 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; 335 336 } 336 337 337 338 static void AVIFILE_IAVIFile_Destruct( IAVIFileImpl* This ) 338 339 { 339 DWORDdwIndex;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 --;340 DWORD dwIndex; 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 --; 360 361 } 361 362 362 363 static HRESULT WINAPI IAVIFile_fnInfo(IAVIFile*iface,AVIFILEINFOW*afi,LONG size) 363 364 { 364 ICOM_THIS(IAVIFileImpl,iface);365 AVIFILEINFOWfiw;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;365 ICOM_THIS(IAVIFileImpl,iface); 366 AVIFILEINFOW fiw; 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; 388 389 } 389 390 390 391 static HRESULT WINAPI IAVIFile_fnGetStream(IAVIFile*iface,PAVISTREAM*avis,DWORD fccType,LONG lParam) 391 392 { 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;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; 403 404 } 404 405 405 406 static HRESULT WINAPI IAVIFile_fnCreateStream(IAVIFile*iface,PAVISTREAM*avis,AVISTREAMINFOW*asi) 406 407 { 407 ICOM_THIS(IAVIFileImpl,iface);408 409 FIXME("(%p,%p,%p)\n",This,avis,asi);410 return E_FAIL;408 ICOM_THIS(IAVIFileImpl,iface); 409 410 FIXME("(%p,%p,%p)\n",This,avis,asi); 411 return E_FAIL; 411 412 } 412 413 413 414 static HRESULT WINAPI IAVIFile_fnWriteData(IAVIFile*iface,DWORD ckid,LPVOID lpData,LONG size) 414 415 { 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;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; 420 421 } 421 422 422 423 static HRESULT WINAPI IAVIFile_fnReadData(IAVIFile*iface,DWORD ckid,LPVOID lpData,LONG *size) 423 424 { 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;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; 430 431 } 431 432 432 433 static HRESULT WINAPI IAVIFile_fnEndRecord(IAVIFile*iface) 433 434 { 434 ICOM_THIS(IAVIFileImpl,iface);435 436 FIXME("(%p)->EndRecord()\n",This);437 /* FIXME: end record? */438 return E_FAIL;435 ICOM_THIS(IAVIFileImpl,iface); 436 437 FIXME("(%p)->EndRecord()\n",This); 438 /* FIXME: end record? */ 439 return E_FAIL; 439 440 } 440 441 441 442 static HRESULT WINAPI IAVIFile_fnDeleteStream(IAVIFile*iface,DWORD fccType,LONG lParam) 442 443 { 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;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; 448 449 } 449 450 450 451 /***************************************************************************** 451 * AVIFILE_IAVIFile_Open (internal)452 * AVIFILE_IAVIFile_Open (internal) 452 453 */ 453 454 HRESULT AVIFILE_IAVIFile_Open( PAVIFILE paf, LPCWSTR szFile, UINT uMode ) 454 455 { 455 ICOM_THIS(IAVIFileImpl,paf);456 HRESULThr;457 DWORDdwAcc;458 DWORDdwShared;459 DWORDdwCreate;460 BYTEbuf[12];461 DWORDdwRead;462 FOURCCfccFileType;463 DWORDdwLen;464 DWORDdwIndex;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].fccType601 == mmioFOURCC('v','i','d','s')) ||602 (This->strhdrs[dwIndex].fccType603 == 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 else613 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 else679 {680 /* FIXME - create the handle has GENERIC_WRITE access. */681 return AVIERR_FILEREAD;682 }683 }684 else685 {686 return AVIERR_FILEOPEN; /* FIXME */687 }688 689 return S_OK;456 ICOM_THIS(IAVIFileImpl,paf); 457 HRESULT hr; 458 DWORD dwAcc; 459 DWORD dwShared; 460 DWORD dwCreate; 461 BYTE buf[12]; 462 DWORD dwRead; 463 FOURCC fccFileType; 464 DWORD dwLen; 465 DWORD dwIndex; 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].fccType 602 == mmioFOURCC('v','i','d','s')) || 603 (This->strhdrs[dwIndex].fccType 604 == 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 else 614 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 else 680 { 681 /* FIXME - create the handle has GENERIC_WRITE access. */ 682 return AVIERR_FILEREAD; 683 } 684 } 685 else 686 { 687 return AVIERR_FILEOPEN; /* FIXME */ 688 } 689 690 return S_OK; 690 691 } 691 692 692 693 /***************************************************************************** 693 * AVIFILE_IAVIFile_GetIndexTable (internal)694 * AVIFILE_IAVIFile_GetIndexTable (internal) 694 695 */ 695 696 HRESULT AVIFILE_IAVIFile_GetIndexTable( PAVIFILE paf, DWORD dwStreamIndex, 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;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; 715 716 } 716 717 717 718 /***************************************************************************** 718 * AVIFILE_IAVIFile_ReadMovieData (internal)719 * AVIFILE_IAVIFile_ReadMovieData (internal) 719 720 */ 720 721 HRESULT AVIFILE_IAVIFile_ReadMovieData( PAVIFILE paf, DWORD dwOffset, 721 DWORD dwLength, LPVOID lpvBuf )722 { 723 ICOM_THIS(IAVIFileImpl,paf);724 LONGlHigh = 0;725 DWORDdwRes;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 722 DWORD dwLength, LPVOID lpvBuf ) 723 { 724 ICOM_THIS(IAVIFileImpl,paf); 725 LONG lHigh = 0; 726 DWORD dwRes; 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 -
trunk/src/avifil32/iastream.c
r6386 r6652 1 /* $Id: iastream.c,v 1.2 2001-09-05 14:16:45 bird Exp $ */ 1 2 /* 2 3 * Copyright 2001 Hidenori TAKESHIMA <hidenori@a2.ctktv.ne.jp> … … 55 56 typedef struct IAVIStreamImpl 56 57 { 57 ICOM_VFIELD(IAVIStream);58 /* IUnknown stuff */59 DWORDref;60 /* IAVIStream stuff */61 IAVIFile*paf;62 WINE_AVISTREAM_DATA*pData;58 ICOM_VFIELD(IAVIStream); 59 /* IUnknown stuff */ 60 DWORD ref; 61 /* IAVIStream stuff */ 62 IAVIFile* paf; 63 WINE_AVISTREAM_DATA* pData; 63 64 } IAVIStreamImpl; 64 65 … … 68 69 HRESULT AVIFILE_CreateIAVIStream(void** ppobj) 69 70 { 70 IAVIStreamImpl*This;71 HRESULThr;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;71 IAVIStreamImpl *This; 72 HRESULT hr; 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; 88 89 } 89 90 … … 94 95 95 96 static HRESULT WINAPI IAVIStream_fnQueryInterface(IAVIStream*iface,REFIID refiid,LPVOID *obj) { 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;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; 109 110 } 110 111 111 112 static ULONG WINAPI IAVIStream_fnAddRef(IAVIStream*iface) { 112 ICOM_THIS(IAVIStreamImpl,iface);113 114 TRACE("(%p)->AddRef()\n",iface);115 return ++(This->ref);113 ICOM_THIS(IAVIStreamImpl,iface); 114 115 TRACE("(%p)->AddRef()\n",iface); 116 return ++(This->ref); 116 117 } 117 118 118 119 static ULONG WINAPI IAVIStream_fnRelease(IAVIStream* iface) { 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;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; 128 129 } 129 130 … … 134 135 static HRESULT IAVIStream_Construct( IAVIStreamImpl* This ) 135 136 { 136 This->paf = NULL;137 This->pData = NULL;138 139 AVIFILE_data.dwClassObjRef ++;140 141 return S_OK;137 This->paf = NULL; 138 This->pData = NULL; 139 140 AVIFILE_data.dwClassObjRef ++; 141 142 return S_OK; 142 143 } 143 144 144 145 static void IAVIStream_Destruct( IAVIStreamImpl* This ) 145 146 { 146 AVIFILE_data.dwClassObjRef --;147 AVIFILE_data.dwClassObjRef --; 147 148 } 148 149 149 150 static HRESULT WINAPI IAVIStream_fnCreate(IAVIStream*iface,LPARAM lParam1,LPARAM lParam2) 150 151 { 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;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; 159 160 } 160 161 161 162 static HRESULT WINAPI IAVIStream_fnInfo(IAVIStream*iface,AVISTREAMINFOW *psi,LONG size) 162 163 { 163 ICOM_THIS(IAVIStreamImpl,iface);164 AVISTREAMINFOWsiw;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;164 ICOM_THIS(IAVIStreamImpl,iface); 165 AVISTREAMINFOW siw; 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; 198 199 } 199 200 200 201 static LONG WINAPI IAVIStream_fnFindSample(IAVIStream*iface,LONG pos,LONG flags) 201 202 { 202 ICOM_THIS(IAVIStreamImpl,iface);203 HRESULThr;204 AVIINDEXENTRY*pIndexEntry;205 DWORDdwCountOfIndexEntry;206 LONGlCur, 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;203 ICOM_THIS(IAVIStreamImpl,iface); 204 HRESULT hr; 205 AVIINDEXENTRY* pIndexEntry; 206 DWORD dwCountOfIndexEntry; 207 LONG lCur, 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; 298 299 } 299 300 300 301 static HRESULT WINAPI IAVIStream_fnReadFormat(IAVIStream*iface,LONG pos,LPVOID format,LONG *formatsize) { 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;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; 320 321 } 321 322 322 323 static HRESULT WINAPI IAVIStream_fnSetFormat(IAVIStream*iface,LONG pos,LPVOID format,LONG formatsize) { 323 ICOM_THIS(IAVIStreamImpl,iface);324 325 FIXME("(%p)->SetFormat(%ld,%p,%ld)\n",This,pos,format,formatsize);326 return E_FAIL;324 ICOM_THIS(IAVIStreamImpl,iface); 325 326 FIXME("(%p)->SetFormat(%ld,%p,%ld)\n",This,pos,format,formatsize); 327 return E_FAIL; 327 328 } 328 329 329 330 static HRESULT WINAPI IAVIStream_fnRead(IAVIStream*iface,LONG start,LONG samples,LPVOID buffer,LONG buffersize,LONG *bytesread,LONG *samplesread) { 330 ICOM_THIS(IAVIStreamImpl,iface);331 HRESULThr;332 AVIINDEXENTRY*pIndexEntry;333 DWORDdwCountOfIndexEntry;334 DWORDdwFrameLength;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;331 ICOM_THIS(IAVIStreamImpl,iface); 332 HRESULT hr; 333 AVIINDEXENTRY* pIndexEntry; 334 DWORD dwCountOfIndexEntry; 335 DWORD dwFrameLength; 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; 382 383 } 383 384 384 385 static HRESULT WINAPI IAVIStream_fnWrite(IAVIStream*iface,LONG start,LONG samples,LPVOID buffer,LONG buffersize,DWORD flags,LONG *sampwritten,LONG *byteswritten) { 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;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; 390 391 } 391 392 392 393 static HRESULT WINAPI IAVIStream_fnDelete(IAVIStream*iface,LONG start,LONG samples) { 393 ICOM_THIS(IAVIStreamImpl,iface);394 395 FIXME("(%p)->Delete(%ld,%ld)\n",This,start,samples);396 return E_FAIL;394 ICOM_THIS(IAVIStreamImpl,iface); 395 396 FIXME("(%p)->Delete(%ld,%ld)\n",This,start,samples); 397 return E_FAIL; 397 398 } 398 399 static HRESULT WINAPI IAVIStream_fnReadData(IAVIStream*iface,DWORD fcc,LPVOID lp,LONG *lpread) { 399 ICOM_THIS(IAVIStreamImpl,iface);400 401 FIXME("(%p)->ReadData(0x%08lx,%p,%p)\n",This,fcc,lp,lpread);402 return E_FAIL;400 ICOM_THIS(IAVIStreamImpl,iface); 401 402 FIXME("(%p)->ReadData(0x%08lx,%p,%p)\n",This,fcc,lp,lpread); 403 return E_FAIL; 403 404 } 404 405 405 406 static HRESULT WINAPI IAVIStream_fnWriteData(IAVIStream*iface,DWORD fcc,LPVOID lp,LONG size) { 406 ICOM_THIS(IAVIStreamImpl,iface);407 408 FIXME("(%p)->WriteData(0x%08lx,%p,%ld)\n",This,fcc,lp,size);409 return E_FAIL;407 ICOM_THIS(IAVIStreamImpl,iface); 408 409 FIXME("(%p)->WriteData(0x%08lx,%p,%ld)\n",This,fcc,lp,size); 410 return E_FAIL; 410 411 } 411 412 412 413 static HRESULT WINAPI IAVIStream_fnSetInfo(IAVIStream*iface,AVISTREAMINFOW*info,LONG infolen) { 413 ICOM_THIS(IAVIStreamImpl,iface);414 415 FIXME("(%p)->SetInfo(%p,%ld)\n",This,info,infolen);416 417 return E_FAIL;418 } 419 414 ICOM_THIS(IAVIStreamImpl,iface); 415 416 FIXME("(%p)->SetInfo(%p,%ld)\n",This,info,infolen); 417 418 return E_FAIL; 419 } 420 -
trunk/src/avifil32/igframe.c
r6386 r6652 1 /* $Id: igframe.c,v 1.2 2001-09-05 14:16:45 bird Exp $ */ 1 2 /* 2 3 * Copyright 2001 Hidenori TAKESHIMA <hidenori@a2.ctktv.ne.jp> … … 29 30 struct ICOM_VTABLE(IGetFrame) igetfrm = { 30 31 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE 31 IGetFrame_fnQueryInterface,32 IGetFrame_fnAddRef,33 IGetFrame_fnRelease,34 IGetFrame_fnGetFrame,35 IGetFrame_fnBegin,36 IGetFrame_fnEnd,37 IGetFrame_fnSetFormat,32 IGetFrame_fnQueryInterface, 33 IGetFrame_fnAddRef, 34 IGetFrame_fnRelease, 35 IGetFrame_fnGetFrame, 36 IGetFrame_fnBegin, 37 IGetFrame_fnEnd, 38 IGetFrame_fnSetFormat, 38 39 }; 39 40 40 41 typedef struct IGetFrameImpl 41 42 { 42 ICOM_VFIELD(IGetFrame);43 /* IUnknown stuff */44 DWORDref;45 /* IGetFrame stuff */46 IAVIStream*pas;47 HIChIC;48 LONGlCachedFrame;49 BITMAPINFO*pbiICIn;50 BITMAPINFO*pbiICOut;51 LPVOIDpvICOutBits;52 LPVOIDpvICInFmtBuf;53 DWORDdwICInDataBufSize;54 LPVOIDpvICInDataBuf;55 LPVOIDpvICOutBuf;43 ICOM_VFIELD(IGetFrame); 44 /* IUnknown stuff */ 45 DWORD ref; 46 /* IGetFrame stuff */ 47 IAVIStream* pas; 48 HIC hIC; 49 LONG lCachedFrame; 50 BITMAPINFO* pbiICIn; 51 BITMAPINFO* pbiICOut; 52 LPVOID pvICOutBits; 53 LPVOID pvICInFmtBuf; 54 DWORD dwICInDataBufSize; 55 LPVOID pvICInDataBuf; 56 LPVOID pvICOutBuf; 56 57 } IGetFrameImpl; 57 58 58 59 static HRESULT IGetFrame_Construct( IGetFrameImpl* This, 59 IAVIStream* pstr,60 LPBITMAPINFOHEADER lpbi );60 IAVIStream* pstr, 61 LPBITMAPINFOHEADER lpbi ); 61 62 static void IGetFrame_Destruct( IGetFrameImpl* This ); 62 63 … … 66 67 static LPVOID AVIFILE_IGetFrame_DecodeFrame(IGetFrameImpl* This,LONG lPos) 67 68 { 68 HRESULThr;69 DWORDdwRes;70 LONGlFrameLength;71 LONGlSampleCount;72 ICDECOMPRESSicd;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 LPVOIDlpv;89 90 if ( This->pvICInDataBuf == NULL )91 {92 lpv = HeapAlloc(93 AVIFILE_data.hHeap,HEAP_ZERO_MEMORY,94 lFrameLength );95 }96 else97 {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;69 HRESULT hr; 70 DWORD dwRes; 71 LONG lFrameLength; 72 LONG lSampleCount; 73 ICDECOMPRESS icd; 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 LPVOID lpv; 90 91 if ( This->pvICInDataBuf == NULL ) 92 { 93 lpv = HeapAlloc( 94 AVIFILE_data.hHeap,HEAP_ZERO_MEMORY, 95 lFrameLength ); 96 } 97 else 98 { 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; 142 143 } 143 144 … … 145 146 146 147 HRESULT AVIFILE_CreateIGetFrame(void** ppobj, 147 IAVIStream* pstr,LPBITMAPINFOHEADER lpbi)148 { 149 IGetFrameImpl*This;150 HRESULThr;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;148 IAVIStream* pstr,LPBITMAPINFOHEADER lpbi) 149 { 150 IGetFrameImpl *This; 151 HRESULT hr; 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; 167 168 } 168 169 … … 173 174 static HRESULT WINAPI IGetFrame_fnQueryInterface(IGetFrame* iface,REFIID refiid,LPVOID *obj) 174 175 { 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;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; 187 188 } 188 189 189 190 static ULONG WINAPI IGetFrame_fnAddRef(IGetFrame* iface) 190 191 { 191 ICOM_THIS(IGetFrameImpl,iface);192 193 TRACE("(%p)->AddRef()\n",iface);194 return ++(This->ref);192 ICOM_THIS(IGetFrameImpl,iface); 193 194 TRACE("(%p)->AddRef()\n",iface); 195 return ++(This->ref); 195 196 } 196 197 197 198 static ULONG WINAPI IGetFrame_fnRelease(IGetFrame* iface) 198 199 { 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;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; 210 211 } 211 212 … … 216 217 static LPVOID WINAPI IGetFrame_fnGetFrame(IGetFrame* iface,LONG lPos) 217 218 { 218 ICOM_THIS(IGetFrameImpl,iface);219 LPVOIDlpv;220 LONGlKeyFrame;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;219 ICOM_THIS(IGetFrameImpl,iface); 220 LPVOID lpv; 221 LONG lKeyFrame; 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; 249 250 } 250 251 251 252 static HRESULT WINAPI IGetFrame_fnBegin(IGetFrame* iface,LONG lStart,LONG lEnd,LONG lRate) 252 253 { 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;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; 266 267 } 267 268 268 269 static HRESULT WINAPI IGetFrame_fnEnd(IGetFrame* iface) 269 270 { 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;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; 281 282 } 282 283 283 284 static HRESULT WINAPI IGetFrame_fnSetFormat(IGetFrame* iface,LPBITMAPINFOHEADER lpbi,LPVOID lpBits,INT x,INT y,INT dx,INT dy) 284 285 { 285 ICOM_THIS(IGetFrameImpl,iface);286 HRESULThr;287 LONGfmtlen;288 BITMAPINFOHEADERbiTemp;289 DWORDdwSizeImage;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;286 ICOM_THIS(IGetFrameImpl,iface); 287 HRESULT hr; 288 LONG fmtlen; 289 BITMAPINFOHEADER biTemp; 290 DWORD dwSizeImage; 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; 358 359 } 359 360 360 361 static HRESULT IGetFrame_Construct( IGetFrameImpl* This, 361 IAVIStream* pstr,362 LPBITMAPINFOHEADER lpbi )363 { 364 HRESULThr;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;362 IAVIStream* pstr, 363 LPBITMAPINFOHEADER lpbi ) 364 { 365 HRESULT hr; 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; 384 385 } 385 386 386 387 static void IGetFrame_Destruct( IGetFrameImpl* This ) 387 388 { 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 } 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 } -
trunk/src/avifil32/initavifil32.cpp
r6386 r6652 1 /* $Id: initavifil32.cpp,v 1.2 2001-09-05 14:16:45 bird Exp $ */ 1 2 /* 2 3 * WINMM DLL entry point … … 45 46 static HMODULE dllHandle = 0; 46 47 47 BOOL WINAPI AVIFILE_DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpvReserved );48 BOOL WINAPI AVIFILE_DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpvReserved ); 48 49 49 50 /****************************************************************************/ -
trunk/src/avifil32/initterm.cpp
r6386 r6652 1 /* $Id: initterm.cpp,v 1.5 2001-09-05 14:16:45 bird Exp $ */ 1 2 /* 2 3 * WINMM DLL entry point -
trunk/src/avifil32/main.c
r6386 r6652 1 /* $Id: main.c,v 1.2 2001-09-05 14:16:45 bird Exp $ */ 1 2 /* 2 3 * Copyright 2001 Hidenori TAKESHIMA <hidenori@a2.ctktv.ne.jp> … … 21 22 22 23 /*********************************************************************** 23 * AVIFILE_InitProcess (internal)24 * AVIFILE_InitProcess (internal) 24 25 */ 25 26 static BOOL AVIFILE_InitProcess( void ) 26 27 { 27 TRACE("()\n");28 TRACE("()\n"); 28 29 29 AVIFILE_data.dwAVIFileRef = 0;30 AVIFILE_data.dwClassObjRef = 0;31 AVIFILE_data.hHeap = (HANDLE)NULL;30 AVIFILE_data.dwAVIFileRef = 0; 31 AVIFILE_data.dwClassObjRef = 0; 32 AVIFILE_data.hHeap = (HANDLE)NULL; 32 33 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 }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 } 39 40 40 return TRUE;41 return TRUE; 41 42 } 42 43 43 44 /*********************************************************************** 44 * AVIFILE_UninitProcess (internal)45 * AVIFILE_UninitProcess (internal) 45 46 */ 46 47 static void AVIFILE_UninitProcess( void ) 47 48 { 48 TRACE("()\n");49 TRACE("()\n"); 49 50 50 if ( AVIFILE_data.dwAVIFileRef != 0 )51 ERR( "you must call AVIFileExit()\n" );51 if ( AVIFILE_data.dwAVIFileRef != 0 ) 52 ERR( "you must call AVIFileExit()\n" ); 52 53 53 if ( AVIFILE_data.dwClassObjRef != 0 )54 ERR( "you must release some objects allocated from AVIFile.\n" );54 if ( AVIFILE_data.dwClassObjRef != 0 ) 55 ERR( "you must release some objects allocated from AVIFile.\n" ); 55 56 56 if ( AVIFILE_data.hHeap != (HANDLE)NULL )57 {58 HeapDestroy( AVIFILE_data.hHeap );59 AVIFILE_data.hHeap = (HANDLE)NULL;60 }57 if ( AVIFILE_data.hHeap != (HANDLE)NULL ) 58 { 59 HeapDestroy( AVIFILE_data.hHeap ); 60 AVIFILE_data.hHeap = (HANDLE)NULL; 61 } 61 62 } 62 63 63 64 /*********************************************************************** 64 * AVIFILE_DllMain65 * AVIFILE_DllMain 65 66 */ 66 67 BOOL WINAPI AVIFILE_DllMain( 67 HINSTANCE hInstDLL,68 DWORD fdwReason,69 LPVOID lpvReserved )68 HINSTANCE hInstDLL, 69 DWORD fdwReason, 70 LPVOID lpvReserved ) 70 71 { 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 }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 } 85 86 86 return TRUE;87 return TRUE; 87 88 } 88 89 -
trunk/src/avifil32/string.c
r6386 r6652 1 /* $Id: string.c,v 1.2 2001-09-05 14:16:46 bird Exp $ */ 1 2 /* 2 3 * Copyright 2001 Hidenori TAKESHIMA <hidenori@a2.ctktv.ne.jp> … … 24 25 INT AVIFILE_strlenAtoW( LPCSTR lpstr ) 25 26 { 26 INTlen;27 INT len; 27 28 28 len = MultiByteToWideChar( CP_ACP, 0, lpstr, -1, NULL, 0 );29 return ( len > 0 ) ? (len-1) : 0;29 len = MultiByteToWideChar( CP_ACP, 0, lpstr, -1, NULL, 0 ); 30 return ( len > 0 ) ? (len-1) : 0; 30 31 } 31 32 32 33 INT AVIFILE_strlenWtoA( LPCWSTR lpwstr ) 33 34 { 34 INTlen;35 INT len; 35 36 36 len = WideCharToMultiByte( CP_ACP, 0, lpwstr, -1,37 NULL, 0, NULL, NULL );38 return ( len > 0 ) ? (len-1) : 0;37 len = WideCharToMultiByte( CP_ACP, 0, lpwstr, -1, 38 NULL, 0, NULL, NULL ); 39 return ( len > 0 ) ? (len-1) : 0; 39 40 } 40 41 41 42 LPWSTR AVIFILE_strncpyAtoW( LPWSTR lpwstr, LPCSTR lpstr, INT wbuflen ) 42 43 { 43 INTlen;44 INT len; 44 45 45 len = MultiByteToWideChar( CP_ACP, 0, lpstr, -1, lpwstr, wbuflen );46 if ( len == 0 )47 *lpwstr = 0;48 return lpwstr;46 len = MultiByteToWideChar( CP_ACP, 0, lpstr, -1, lpwstr, wbuflen ); 47 if ( len == 0 ) 48 *lpwstr = 0; 49 return lpwstr; 49 50 } 50 51 51 52 LPSTR AVIFILE_strncpyWtoA( LPSTR lpstr, LPCWSTR lpwstr, INT abuflen ) 52 53 { 53 INTlen;54 INT len; 54 55 55 len = WideCharToMultiByte( CP_ACP, 0, lpwstr, -1,56 lpstr, abuflen, NULL, NULL );57 if ( len == 0 )58 *lpstr = 0;59 return lpstr;56 len = WideCharToMultiByte( CP_ACP, 0, lpwstr, -1, 57 lpstr, abuflen, NULL, NULL ); 58 if ( len == 0 ) 59 *lpstr = 0; 60 return lpstr; 60 61 } 61 62 62 63 LPWSTR AVIFILE_strdupAtoW( LPCSTR lpstr ) 63 64 { 64 INT len;65 LPWSTR lpwstr = NULL;65 INT len; 66 LPWSTR lpwstr = NULL; 66 67 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 }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 } 74 75 75 return lpwstr;76 return lpwstr; 76 77 } 77 78 78 79 LPSTR AVIFILE_strdupWtoA( LPCWSTR lpwstr ) 79 80 { 80 INT len;81 LPSTR lpstr = NULL;81 INT len; 82 LPSTR lpstr = NULL; 82 83 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 }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 } 90 91 91 return lpstr;92 return lpstr; 92 93 } 93 94
Note:
See TracChangeset
for help on using the changeset viewer.
