| 624 | | AVPacket pkt; |
|---|
| 625 | | while(av_read_frame(ic, &pkt) == noErr) |
|---|
| | 639 | ncstr = &map[pkt.stream_index]; |
|---|
| | 640 | stream = ncstr->str; |
|---|
| | 641 | codec = stream->codec; |
|---|
| | 642 | |
|---|
| | 643 | flags = 0; |
|---|
| | 644 | if((pkt.flags & PKT_FLAG_KEY) == 0) |
|---|
| | 645 | flags |= mediaSampleNotSync; |
|---|
| | 646 | |
|---|
| | 647 | memset(&sampleRec, 0, sizeof(sampleRec)); |
|---|
| | 648 | sampleRec.dataOffset.hi = pkt.pos >> 32; |
|---|
| | 649 | sampleRec.dataOffset.lo = (uint32_t) pkt.pos; |
|---|
| | 650 | sampleRec.dataSize = pkt.size; |
|---|
| | 651 | sampleRec.sampleFlags = flags; |
|---|
| | 652 | |
|---|
| | 653 | if(sampleRec.dataSize <= 0) |
|---|
| | 654 | continue; |
|---|
| | 655 | |
|---|
| | 656 | if (codec->codec_type == CODEC_TYPE_AUDIO && !ncstr->vbr) |
|---|
| | 657 | sampleRec.numberOfSamples = (pkt.size * ncstr->asbd.mFramesPerPacket) / ncstr->asbd.mBytesPerPacket; |
|---|
| | 658 | else |
|---|
| | 659 | sampleRec.numberOfSamples = 1; |
|---|
| | 660 | |
|---|
| | 661 | // we have a sample waiting to be added; calculate the duration and add it |
|---|
| | 662 | if (ncstr->lastSample.numberOfSamples > 0) { |
|---|
| | 663 | ncstr->lastSample.durationPerSample = (pkt.pts - ncstr->lastpts) * ncstr->base.num; |
|---|
| | 664 | AddMediaSampleReferences64(ncstr->media, ncstr->sampleHdl, 1, &ncstr->lastSample, NULL); |
|---|
| | 665 | } |
|---|
| | 666 | |
|---|
| | 667 | if (pkt.duration == 0) { |
|---|
| | 668 | // no duration, we'll have to wait for the next packet to calculate it |
|---|
| | 669 | // keep the duration of the last sample, so we can use it if it's the last frame |
|---|
| | 670 | sampleRec.durationPerSample = ncstr->lastSample.durationPerSample; |
|---|
| | 671 | ncstr->lastSample = sampleRec; |
|---|
| | 672 | ncstr->lastpts = pkt.pts; |
|---|
| | 673 | |
|---|
| | 674 | } else { |
|---|
| | 675 | ncstr->lastSample.numberOfSamples = 0; |
|---|
| | 676 | if (codec->codec_type == CODEC_TYPE_AUDIO && !ncstr->vbr) |
|---|
| | 677 | sampleRec.durationPerSample = 1; |
|---|
| | 678 | else |
|---|
| | 679 | sampleRec.durationPerSample = pkt.duration * ncstr->base.num; |
|---|
| | 680 | AddMediaSampleReferences64(ncstr->media, ncstr->sampleHdl, 1, &sampleRec, NULL); |
|---|
| | 681 | } |
|---|
| | 682 | #if 0 |
|---|
| | 683 | if(codec->codec_type == CODEC_TYPE_VIDEO) |
|---|
| 627 | | ncstr = &map[pkt.stream_index]; |
|---|
| 628 | | stream = ncstr->str; |
|---|
| 629 | | codec = stream->codec; |
|---|
| 630 | | |
|---|
| 631 | | flags = 0; |
|---|
| 632 | | if((pkt.flags & PKT_FLAG_KEY) == 0) |
|---|
| 633 | | flags |= mediaSampleNotSync; |
|---|
| 634 | | |
|---|
| 635 | | memset(&sampleRec, 0, sizeof(sampleRec)); |
|---|
| 636 | | sampleRec.dataOffset.hi = pkt.pos >> 32; |
|---|
| 637 | | sampleRec.dataOffset.lo = (uint32_t) pkt.pos; |
|---|
| 638 | | sampleRec.dataSize = pkt.size; |
|---|
| 639 | | sampleRec.sampleFlags = flags; |
|---|
| 640 | | |
|---|
| 641 | | if(sampleRec.dataSize <= 0) |
|---|
| 642 | | continue; |
|---|
| 643 | | |
|---|
| 644 | | if (codec->codec_type == CODEC_TYPE_AUDIO && !ncstr->vbr) |
|---|
| | 685 | if(pkt.duration == 0) |
|---|
| | 686 | sampleRec.durationPerSample = map->base.num; |
|---|
| | 687 | else |
|---|
| | 688 | sampleRec.durationPerSample = map->base.num * pkt.duration; |
|---|
| | 689 | sampleRec.numberOfSamples = 1; |
|---|
| | 690 | } |
|---|
| | 691 | else if (codec->codec_type == CODEC_TYPE_AUDIO) |
|---|
| | 692 | { |
|---|
| | 693 | if(ncstr->vbr) { |
|---|
| | 694 | if(codec->frame_size == ncstr->base.num) { |
|---|
| | 695 | sampleRec.durationPerSample = codec->frame_size; |
|---|
| | 696 | sampleRec.numberOfSamples = 1; |
|---|
| | 697 | } else if (ncstr->asbd.mFormatID == kAudioFormatMPEG4AAC) { |
|---|
| | 698 | /* AVI-mux GUI, the author of which created this hack in the first place, |
|---|
| | 699 | * seems to special-case getting an AAC audio sample's duration this way */ |
|---|
| | 700 | sampleRec.durationPerSample = ic->streams[pkt.stream_index]->time_base.num; |
|---|
| | 701 | sampleRec.numberOfSamples = 1; |
|---|
| | 702 | } else { |
|---|
| | 703 | /* This seems to work. Although I have no idea why. |
|---|
| | 704 | * Perhaps the stream's timebase is adjusted to |
|---|
| | 705 | * let that work. as the timebase has strange values...*/ |
|---|
| | 706 | sampleRec.durationPerSample = sampleRec.dataSize; |
|---|
| | 707 | sampleRec.numberOfSamples = 1; |
|---|
| | 708 | } |
|---|
| | 709 | } else { |
|---|
| | 710 | sampleRec.durationPerSample = 1; |
|---|
| 654 | | |
|---|
| 655 | | if (pkt.duration == 0) { |
|---|
| 656 | | // no duration, we'll have to wait for the next packet to calculate it |
|---|
| 657 | | // keep the duration of the last sample, so we can use it if it's the last frame |
|---|
| 658 | | sampleRec.durationPerSample = ncstr->lastSample.durationPerSample; |
|---|
| 659 | | ncstr->lastSample = sampleRec; |
|---|
| 660 | | ncstr->lastpts = pkt.pts; |
|---|
| 661 | | |
|---|
| 662 | | } else { |
|---|
| 663 | | ncstr->lastSample.numberOfSamples = 0; |
|---|
| 664 | | if (codec->codec_type == CODEC_TYPE_AUDIO && !ncstr->vbr) |
|---|
| 665 | | sampleRec.durationPerSample = 1; |
|---|
| 666 | | else |
|---|
| 667 | | sampleRec.durationPerSample = pkt.duration * ncstr->base.num; |
|---|
| 668 | | AddMediaSampleReferences64(ncstr->media, ncstr->sampleHdl, 1, &sampleRec, NULL); |
|---|
| 669 | | } |
|---|
| 670 | | #if 0 |
|---|
| 671 | | if(codec->codec_type == CODEC_TYPE_VIDEO) |
|---|
| 672 | | { |
|---|
| 673 | | if(pkt.duration == 0) |
|---|
| 674 | | sampleRec.durationPerSample = map->base.num; |
|---|
| 675 | | else |
|---|
| 676 | | sampleRec.durationPerSample = map->base.num * pkt.duration; |
|---|
| 677 | | sampleRec.numberOfSamples = 1; |
|---|
| 678 | | } |
|---|
| 679 | | else if (codec->codec_type == CODEC_TYPE_AUDIO) |
|---|
| 680 | | { |
|---|
| 681 | | if(ncstr->vbr) { |
|---|
| 682 | | if(codec->frame_size == ncstr->base.num) { |
|---|
| 683 | | sampleRec.durationPerSample = codec->frame_size; |
|---|
| 684 | | sampleRec.numberOfSamples = 1; |
|---|
| 685 | | } else if (ncstr->asbd.mFormatID == kAudioFormatMPEG4AAC) { |
|---|
| 686 | | /* AVI-mux GUI, the author of which created this hack in the first place, |
|---|
| 687 | | * seems to special-case getting an AAC audio sample's duration this way */ |
|---|
| 688 | | sampleRec.durationPerSample = ic->streams[pkt.stream_index]->time_base.num; |
|---|
| 689 | | sampleRec.numberOfSamples = 1; |
|---|
| 690 | | } else { |
|---|
| 691 | | /* This seems to work. Although I have no idea why. |
|---|
| 692 | | * Perhaps the stream's timebase is adjusted to |
|---|
| 693 | | * let that work. as the timebase has strange values...*/ |
|---|
| 694 | | sampleRec.durationPerSample = sampleRec.dataSize; |
|---|
| 695 | | sampleRec.numberOfSamples = 1; |
|---|
| 696 | | } |
|---|
| 697 | | } else { |
|---|
| 698 | | sampleRec.durationPerSample = 1; |
|---|
| 699 | | sampleRec.numberOfSamples = (pkt.size * ncstr->asbd.mFramesPerPacket) / ncstr->asbd.mBytesPerPacket; |
|---|
| 700 | | } |
|---|
| 701 | | } |
|---|
| 702 | | err = AddMediaSampleReferences64(ncstr->media, ncstr->sampleHdl, 1, &sampleRec, NULL); |
|---|
| | 713 | } |
|---|
| | 714 | err = AddMediaSampleReferences64(ncstr->media, ncstr->sampleHdl, 1, &sampleRec, NULL); |
|---|
| 704 | | //Need to do something like this when the libavformat doesn't give us a position |
|---|
| 705 | | /* Handle dataIn = NewHandle(pkt.size); |
|---|
| 706 | | HLock(dataIn); |
|---|
| 707 | | memcpy(*dataIn, pkt.data, pkt.size); |
|---|
| 708 | | HUnlock(dataIn); |
|---|
| 709 | | err = AddMediaSample(ncstr->media, dataIn, 0, pkt.size, 1, ncstr->sampleHdl, pkt.duration, sampleRec.sampleFlags, NULL);*/ |
|---|
| 710 | | av_free_packet(&pkt); |
|---|
| 711 | | } |
|---|
| 712 | | // import the last frames |
|---|
| 713 | | for (j = 0; j < ic->nb_streams; j++) { |
|---|
| 714 | | ncstr = &map[j]; |
|---|
| 715 | | if (ncstr->lastSample.numberOfSamples > 0) |
|---|
| 716 | | AddMediaSampleReferences64(ncstr->media, ncstr->sampleHdl, 1, &ncstr->lastSample, NULL); |
|---|
| 717 | | } |
|---|
| 718 | | } |
|---|
| 719 | | } /* import_avi() */ |
|---|
| | 716 | //Need to do something like this when the libavformat doesn't give us a position |
|---|
| | 717 | /* Handle dataIn = NewHandle(pkt.size); |
|---|
| | 718 | HLock(dataIn); |
|---|
| | 719 | memcpy(*dataIn, pkt.data, pkt.size); |
|---|
| | 720 | HUnlock(dataIn); |
|---|
| | 721 | err = AddMediaSample(ncstr->media, dataIn, 0, pkt.size, 1, ncstr->sampleHdl, pkt.duration, sampleRec.sampleFlags, NULL);*/ |
|---|
| | 722 | av_free_packet(&pkt); |
|---|
| | 723 | } |
|---|
| | 724 | // import the last frames |
|---|
| | 725 | for (i = 0; i < ic->nb_streams; i++) { |
|---|
| | 726 | ncstr = &map[i]; |
|---|
| | 727 | if (ncstr->lastSample.numberOfSamples > 0) |
|---|
| | 728 | AddMediaSampleReferences64(ncstr->media, ncstr->sampleHdl, 1, &ncstr->lastSample, NULL); |
|---|
| | 729 | } |
|---|
| | 730 | } |
|---|