summaryrefslogtreecommitdiff
path: root/libavformat/assenc.c
diff options
context:
space:
mode:
authorRodger Combs <rodger.combs@gmail.com>2015-04-04 05:31:22 -0500
committerMichael Niedermayer <michaelni@gmx.at>2015-04-16 21:09:32 +0200
commit55a1d75bf7855d147f420eba36e452ae401f78cb (patch)
tree09fd5c56713a8a61744766638397778df3ed08e2 /libavformat/assenc.c
parente224aa41917454e7b5c23d9f2541425743ce595a (diff)
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.c28
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;
}