diff options
author | Rodger Combs <rodger.combs@gmail.com> | 2015-04-04 05:31:22 -0500 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2015-04-16 21:09:32 +0200 |
commit | 55a1d75bf7855d147f420eba36e452ae401f78cb (patch) | |
tree | 09fd5c56713a8a61744766638397778df3ed08e2 /libavformat/assenc.c | |
parent | e224aa41917454e7b5c23d9f2541425743ce595a (diff) | |
download | ffmpeg-55a1d75bf7855d147f420eba36e452ae401f78cb.tar.gz |
lavf/assenc: handle extra sections after Events
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavformat/assenc.c')
-rw-r--r-- | libavformat/assenc.c | 28 |
1 files changed, 26 insertions, 2 deletions
diff --git a/libavformat/assenc.c b/libavformat/assenc.c index 3fb9384930..52226168c2 100644 --- a/libavformat/assenc.c +++ b/libavformat/assenc.c @@ -40,6 +40,8 @@ typedef struct ASSContext { int cache_size; int ssa_mode; int ignore_readorder; + uint8_t *trailer; + size_t trailer_size; } ASSContext; static int write_header(AVFormatContext *s) @@ -55,8 +57,23 @@ 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); if (avctx->extradata_size > 0) { - avio_write(s->pb, avctx->extradata, avctx->extradata_size); - if (avctx->extradata[avctx->extradata_size - 1] != '\n') + size_t header_size = avctx->extradata_size; + uint8_t *trailer = strstr(avctx->extradata, "\n[Events]"); + + if (trailer) + trailer = strstr(trailer, "Format:"); + if (trailer) + trailer = strstr(trailer, "\n"); + + if (trailer++) { + header_size = (trailer - avctx->extradata); + ass->trailer_size = avctx->extradata_size - header_size; + if (ass->trailer_size) + ass->trailer = trailer; + } + + avio_write(s->pb, avctx->extradata, header_size); + if (avctx->extradata[header_size - 1] != '\n') avio_write(s->pb, "\r\n", 2); ass->ssa_mode = !strstr(avctx->extradata, "\n[V4+ Styles]"); if (!strstr(avctx->extradata, "\n[Events]")) @@ -192,7 +209,14 @@ static int write_packet(AVFormatContext *s, AVPacket *pkt) static int write_trailer(AVFormatContext *s) { + ASSContext *ass = s->priv_data; + purge_dialogues(s, 1); + + if (ass->trailer) { + avio_write(s->pb, ass->trailer, ass->trailer_size); + } + return 0; } |