- 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 55 56 DWORDref;57 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 80 { 81 BYTEbuf[8];82 DWORDdwRead;83 84 85 86 87 88 89 90 91 92 93 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 98 { 99 LONGlHigh = 0;100 DWORDdwRes;101 102 103 104 105 106 107 108 109 110 111 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 116 117 { 118 119 120 121 122 123 124 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 129 { 130 HRESULThr;131 FOURCCfcc;132 BYTEbuf[4];133 DWORDdwRead;134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 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 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 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 189 190 191 192 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 198 199 200 201 { 202 DWORDdwStreamIndex;203 DWORDdwIndex;204 FOURCCckid;205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 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 230 231 232 233 234 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 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 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 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 282 283 284 285 286 287 288 289 290 291 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 296 297 298 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 303 304 305 306 307 308 309 310 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 322 323 324 325 326 327 328 329 330 331 332 333 334 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 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 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 365 AVIFILEINFOWfiw;366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 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 393 394 395 396 397 398 399 400 401 402 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 408 409 410 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 416 417 418 419 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 425 426 427 428 429 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 435 436 437 438 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 444 445 446 447 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 * 452 * AVIFILE_IAVIFile_Open (internal) 452 453 */ 453 454 HRESULT AVIFILE_IAVIFile_Open( PAVIFILE paf, LPCWSTR szFile, UINT uMode ) 454 455 { 455 456 HRESULThr;457 DWORDdwAcc;458 DWORDdwShared;459 DWORDdwCreate;460 BYTEbuf[12];461 DWORDdwRead;462 FOURCCfccFileType;463 DWORDdwLen;464 DWORDdwIndex;465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 WINE_AVISTREAM_DATA*pData;562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 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 * 694 * AVIFILE_IAVIFile_GetIndexTable (internal) 694 695 */ 695 696 HRESULT AVIFILE_IAVIFile_GetIndexTable( PAVIFILE paf, DWORD dwStreamIndex, 696 697 698 { 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 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 * 719 * AVIFILE_IAVIFile_ReadMovieData (internal) 719 720 */ 720 721 HRESULT AVIFILE_IAVIFile_ReadMovieData( PAVIFILE paf, DWORD dwOffset, 721 722 { 723 724 LONGlHigh = 0;725 DWORDdwRes;726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 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 58 59 DWORDref;60 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 74 75 76 77 78 79 80 81 82 83 84 85 86 87 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 97 98 99 100 101 102 103 104 105 106 107 108 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 113 114 115 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 120 121 122 123 124 125 126 127 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 137 138 139 140 141 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 147 AVIFILE_data.dwClassObjRef --; 147 148 } 148 149 149 150 static HRESULT WINAPI IAVIStream_fnCreate(IAVIStream*iface,LPARAM lParam1,LPARAM lParam2) 150 151 { 151 152 153 154 155 156 157 158 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 164 AVISTREAMINFOWsiw;165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 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 203 HRESULThr;204 AVIINDEXENTRY*pIndexEntry;205 DWORDdwCountOfIndexEntry;206 LONGlCur, lAdd, lEnd;207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 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 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 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 324 325 326 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 331 HRESULThr;332 AVIINDEXENTRY*pIndexEntry;333 DWORDdwCountOfIndexEntry;334 DWORDdwFrameLength;335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 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 386 387 388 389 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 394 395 396 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 400 401 402 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 407 408 409 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 414 415 416 417 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 32 33 34 35 36 37 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 43 44 DWORDref;45 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 60 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 75 76 77 78 79 80 81 82 83 84 85 86 87 88 LPVOIDlpv;89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 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 148 { 149 IGetFrameImpl*This;150 HRESULThr;151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 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 176 177 178 179 180 181 182 183 184 185 186 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 192 193 194 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 200 201 202 203 204 205 206 207 208 209 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 219 LPVOIDlpv;220 LONGlKeyFrame;221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 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 254 255 256 257 258 259 260 261 262 263 264 265 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 271 272 273 274 275 276 277 278 279 280 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 286 HRESULThr;287 LONGfmtlen;288 BITMAPINFOHEADERbiTemp;289 DWORDdwSizeImage;290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 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 362 363 { 364 HRESULThr;365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 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 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 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, 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 * 24 * AVIFILE_InitProcess (internal) 24 25 */ 25 26 static BOOL AVIFILE_InitProcess( void ) 26 27 { 27 28 TRACE("()\n"); 28 29 29 30 31 30 AVIFILE_data.dwAVIFileRef = 0; 31 AVIFILE_data.dwClassObjRef = 0; 32 AVIFILE_data.hHeap = (HANDLE)NULL; 32 33 33 34 35 36 37 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 41 return TRUE; 41 42 } 42 43 43 44 /*********************************************************************** 44 * 45 * AVIFILE_UninitProcess (internal) 45 46 */ 46 47 static void AVIFILE_UninitProcess( void ) 47 48 { 48 49 TRACE("()\n"); 49 50 50 51 51 if ( AVIFILE_data.dwAVIFileRef != 0 ) 52 ERR( "you must call AVIFileExit()\n" ); 52 53 53 54 54 if ( AVIFILE_data.dwClassObjRef != 0 ) 55 ERR( "you must release some objects allocated from AVIFile.\n" ); 55 56 56 57 58 59 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 * 65 * AVIFILE_DllMain 65 66 */ 66 67 BOOL WINAPI AVIFILE_DllMain( 67 68 69 68 HINSTANCE hInstDLL, 69 DWORD fdwReason, 70 LPVOID lpvReserved ) 70 71 { 71 72 73 74 75 76 77 78 79 80 81 82 83 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 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 29 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 37 38 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 46 47 48 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 56 57 58 59 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 65 65 INT len; 66 LPWSTR lpwstr = NULL; 66 67 67 68 69 70 71 72 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 76 return lpwstr; 76 77 } 77 78 78 79 LPSTR AVIFILE_strdupWtoA( LPCWSTR lpwstr ) 79 80 { 80 81 81 INT len; 82 LPSTR lpstr = NULL; 82 83 83 84 85 86 87 88 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 92 return lpstr; 92 93 } 93 94
Note:
See TracChangeset
for help on using the changeset viewer.