From 721da10aeb929964a21890aae0b36b2fe07b1bd2 Mon Sep 17 00:00:00 2001 From: Baptiste Coudurier Date: Thu, 20 Mar 2008 18:48:50 +0000 Subject: [PATCH] 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 --- libavformat/movenc.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/libavformat/movenc.c b/libavformat/movenc.c index 7e875bd5f0..89110210d7 100644 --- a/libavformat/movenc.c +++ b/libavformat/movenc.c @@ -616,7 +616,8 @@ static int mov_write_video_tag(ByteIOContext *pb, MOVTrack* track) mov_write_avcc_tag(pb, track); if(track->mode == MODE_IPOD) 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); return updateSize (pb, pos); @@ -1536,6 +1537,7 @@ static int mov_write_packet(AVFormatContext *s, AVPacket *pkt) AVCodecContext *enc = trk->enc; unsigned int samplesInChunk = 0; int size= pkt->size; + int dump_extradata = 0; if (url_is_streamed(s->pb)) return 0; /* Can't handle that */ 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->vosData = av_malloc(trk->vosLen); 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)) { @@ -1608,6 +1615,10 @@ static int mov_write_packet(AVFormatContext *s, AVPacket *pkt) trk->sampleCount += samplesInChunk; mov->mdat_size += size; + if (dump_extradata) { + put_buffer(pb, trk->vosData, trk->vosLen); + size -= trk->vosLen; + } put_buffer(pb, pkt->data, size); put_flush_packet(pb);