fix mpeg2 muxing, replace seq header if contained in extradata and key frame does not contain it

Originally committed as revision 12520 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
Baptiste Coudurier 2008-03-20 18:48:50 +00:00
parent 7b0f4c9aaa
commit 721da10aeb
1 changed files with 12 additions and 1 deletions

View File

@ -616,7 +616,8 @@ static int mov_write_video_tag(ByteIOContext *pb, MOVTrack* track)
mov_write_avcc_tag(pb, track); mov_write_avcc_tag(pb, track);
if(track->mode == MODE_IPOD) if(track->mode == MODE_IPOD)
mov_write_uuid_tag_ipod(pb); mov_write_uuid_tag_ipod(pb);
} else if(track->vosLen > 0) } else if(track->vosLen > 0 &&
track->enc->codec_id != CODEC_ID_MPEG2VIDEO)
mov_write_glbl_tag(pb, track); mov_write_glbl_tag(pb, track);
return updateSize (pb, pos); return updateSize (pb, pos);
@ -1536,6 +1537,7 @@ static int mov_write_packet(AVFormatContext *s, AVPacket *pkt)
AVCodecContext *enc = trk->enc; AVCodecContext *enc = trk->enc;
unsigned int samplesInChunk = 0; unsigned int samplesInChunk = 0;
int size= pkt->size; int size= pkt->size;
int dump_extradata = 0;
if (url_is_streamed(s->pb)) return 0; /* Can't handle that */ if (url_is_streamed(s->pb)) return 0; /* Can't handle that */
if (!size) return 0; /* Discard 0 sized packets */ if (!size) return 0; /* Discard 0 sized packets */
@ -1581,6 +1583,11 @@ static int mov_write_packet(AVFormatContext *s, AVPacket *pkt)
trk->vosLen = 640; trk->vosLen = 640;
trk->vosData = av_malloc(trk->vosLen); trk->vosData = av_malloc(trk->vosLen);
memcpy(trk->vosData, pkt->data, 640); memcpy(trk->vosData, pkt->data, 640);
} else if (enc->codec_id == CODEC_ID_MPEG2VIDEO && trk->vosLen > 4 &&
AV_RB32(trk->vosData) == 0x000001b3 && pkt->flags & PKT_FLAG_KEY &&
pkt->size > 4 && AV_RB32(pkt->data) != 0x000001b3) {
size += trk->vosLen;
dump_extradata = 1;
} }
if (!(trk->entry % MOV_INDEX_CLUSTER_SIZE)) { if (!(trk->entry % MOV_INDEX_CLUSTER_SIZE)) {
@ -1608,6 +1615,10 @@ static int mov_write_packet(AVFormatContext *s, AVPacket *pkt)
trk->sampleCount += samplesInChunk; trk->sampleCount += samplesInChunk;
mov->mdat_size += size; mov->mdat_size += size;
if (dump_extradata) {
put_buffer(pb, trk->vosData, trk->vosLen);
size -= trk->vosLen;
}
put_buffer(pb, pkt->data, size); put_buffer(pb, pkt->data, size);
put_flush_packet(pb); put_flush_packet(pb);