Changeset 164
- Timestamp:
- 10/15/06 18:07:02 (2 years ago)
- Files:
-
- trunk/ff_private.c (modified) (6 diffs)
- trunk/ff_private.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/ff_private.c
r163 r164 512 512 AVStream *stream; 513 513 AVCodecContext *codec; 514 SampleReference64 RecordsampleRec;514 SampleReference64Ptr sampleRec; 515 515 int64_t offset,duration; 516 516 OSStatus err; 517 517 short flags; 518 518 short hadIndex = 0; 519 int sampleNum; 519 520 520 521 /* process each stream in ic */ … … 528 529 if(!ncstr->media) 529 530 continue; 531 532 sampleNum = 0; 533 ncstr->sampleTable = calloc(stream->nb_index_entries, sizeof(SampleReference64Record)); 530 534 531 535 /* now parse the index entries */ … … 542 546 flags |= mediaSampleNotSync; 543 547 548 sampleRec = &ncstr->sampleTable[sampleNum++]; 549 544 550 /* set as many fields in sampleRec as possible */ 545 memset(&sampleRec, 0, sizeof(sampleRec)); 546 sampleRec.dataOffset.hi = offset >> 32; 547 sampleRec.dataOffset.lo = (uint32_t)offset; 548 sampleRec.dataSize = stream->index_entries[k].size; 549 sampleRec.sampleFlags = flags; 551 sampleRec->dataOffset.hi = offset >> 32; 552 sampleRec->dataOffset.lo = (uint32_t)offset; 553 sampleRec->dataSize = stream->index_entries[k].size; 554 sampleRec->sampleFlags = flags; 550 555 551 556 /* some samples have a data_size of zero. if that's the case, ignore them 552 557 * they seem to be used to stretch the frame duration & are already handled 553 558 * by the previous pkt */ 554 if(sampleRec.dataSize <= 0) 559 if(sampleRec->dataSize <= 0) { 560 sampleNum--; 555 561 continue; 562 } 556 563 557 564 /* switch for the remaining fields */ … … 566 573 } 567 574 568 sampleRec .durationPerSample = map->base.num * duration;569 sampleRec .numberOfSamples = 1;575 sampleRec->durationPerSample = map->base.num * duration; 576 sampleRec->numberOfSamples = 1; 570 577 } 571 578 else if(codec->codec_type == CODEC_TYPE_AUDIO) { … … 575 582 if(codec->frame_size == ncstr->base.num || (codec->frame_size == 0 && ncstr->base.num > 1)) { 576 583 /* frame_size is set to zero for AAC and some MP3 tracks and it works this way */ 577 sampleRec .durationPerSample = ncstr->base.num;578 sampleRec .numberOfSamples = 1;584 sampleRec->durationPerSample = ncstr->base.num; 585 sampleRec->numberOfSamples = 1; 579 586 } else { 580 587 /* this logic seems to be needed even iff ncstr->base.num == 1, but I'm not entirely sure */ … … 582 589 * Perhaps the stream's timebase is adjusted to 583 590 * let that work. as the timebase has strange values...*/ 584 sampleRec .durationPerSample = sampleRec.dataSize;585 sampleRec .numberOfSamples = 1;591 sampleRec->durationPerSample = sampleRec->dataSize; 592 sampleRec->numberOfSamples = 1; 586 593 } 587 594 } else { 588 sampleRec .durationPerSample = 1;589 sampleRec .numberOfSamples = (stream->index_entries[k].size * ncstr->asbd.mFramesPerPacket) / ncstr->asbd.mBytesPerPacket;595 sampleRec->durationPerSample = 1; 596 sampleRec->numberOfSamples = (stream->index_entries[k].size * ncstr->asbd.mFramesPerPacket) / ncstr->asbd.mBytesPerPacket; 590 597 } 591 598 } 592 593 /* Add the sample to the media */594 err = AddMediaSampleReferences64(ncstr->media, ncstr->sampleHdl, 1, &sampleRec, NULL);595 599 } 600 /* Add all of the samples to the media */ 601 err = AddMediaSampleReferences64(ncstr->media, ncstr->sampleHdl, sampleNum, ncstr->sampleTable, NULL); 602 free(ncstr->sampleTable); 596 603 } 597 604 return hadIndex; trunk/ff_private.h
r92 r164 37 37 AVRational base; 38 38 int64_t lastpts; 39 SampleReference64Ptr sampleTable; 39 40 SampleReference64Record lastSample; 40 41 };
