changeset 3159:06e340adefb8 libavformat

fix mpeg2 muxing, replace seq header if contained in extradata and key frame does not contain it
author bcoudurier
date Thu, 20 Mar 2008 18:48:50 +0000
parents 710917feb10a
children 1306bdb603c3
files movenc.c
diffstat 1 files changed, 12 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/movenc.c	Thu Mar 20 18:42:44 2008 +0000
+++ b/movenc.c	Thu Mar 20 18:48:50 2008 +0000
@@ -616,7 +616,8 @@
         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 @@
     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 @@
         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 @@
     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);