avformat/assenc: mux all extradata at once
authorClément Bœsch <u@pkh.me>
Sat, 20 Sep 2014 16:39:58 +0000 (18:39 +0200)
committerClément Bœsch <u@pkh.me>
Sun, 21 Sep 2014 16:55:12 +0000 (18:55 +0200)
Before this commit, the code was muxing up to the 2nd line after
"[Events]" (assuming it to be the "Format:" line). The remaining are
generally "Comment:" directives which can stay in that place. mkvextract
behaves that way so it seems there is no reason for that extra
complexity.

libavformat/assenc.c

index 24833d2..13af86e 100644 (file)
@@ -30,7 +30,6 @@ typedef struct DialogueLine {
 } DialogueLine;
 
 typedef struct ASSContext{
-    unsigned int extra_index;
     int write_ts; // 0: ssa (timing in payload), 1: ass (matroska like)
     int expected_readorder;
     DialogueLine *dialogue_cache;
@@ -42,7 +41,6 @@ static int write_header(AVFormatContext *s)
 {
     ASSContext *ass = s->priv_data;
     AVCodecContext *avctx= s->streams[0]->codec;
-    uint8_t *last= NULL;
 
     if (s->nb_streams != 1 || (avctx->codec_id != AV_CODEC_ID_SSA &&
                                avctx->codec_id != AV_CODEC_ID_ASS)) {
@@ -51,21 +49,11 @@ static int write_header(AVFormatContext *s)
     }
     ass->write_ts = avctx->codec_id == AV_CODEC_ID_ASS;
     avpriv_set_pts_info(s->streams[0], 64, 1, 100);
-
-    while(ass->extra_index < avctx->extradata_size){
-        uint8_t *p  = avctx->extradata + ass->extra_index;
-        uint8_t *end= strchr(p, '\n');
-        if(!end) end= avctx->extradata + avctx->extradata_size;
-        else     end++;
-
-        avio_write(s->pb, p, end-p);
-        ass->extra_index += end-p;
-
-        if(last && !memcmp(last, "[Events]", 8))
-            break;
-        last=p;
+    if (avctx->extradata_size > 0) {
+        avio_write(s->pb, avctx->extradata, avctx->extradata_size);
+        if (avctx->extradata[avctx->extradata_size - 1] != '\n')
+            avio_write(s->pb, "\r\n", 2);
     }
-
     avio_flush(s->pb);
 
     return 0;
@@ -191,13 +179,7 @@ static int write_packet(AVFormatContext *s, AVPacket *pkt)
 
 static int write_trailer(AVFormatContext *s)
 {
-    ASSContext *ass = s->priv_data;
-    AVCodecContext *avctx= s->streams[0]->codec;
-
     purge_dialogues(s, 1);
-    avio_write(s->pb, avctx->extradata      + ass->extra_index,
-                      avctx->extradata_size - ass->extra_index);
-
     return 0;
 }