lavf/assenc: handle extra sections after Events
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
parent
e224aa4191
commit
55a1d75bf7
@ -40,6 +40,8 @@ typedef struct ASSContext {
|
|||||||
int cache_size;
|
int cache_size;
|
||||||
int ssa_mode;
|
int ssa_mode;
|
||||||
int ignore_readorder;
|
int ignore_readorder;
|
||||||
|
uint8_t *trailer;
|
||||||
|
size_t trailer_size;
|
||||||
} ASSContext;
|
} ASSContext;
|
||||||
|
|
||||||
static int write_header(AVFormatContext *s)
|
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;
|
ass->write_ts = avctx->codec_id == AV_CODEC_ID_ASS;
|
||||||
avpriv_set_pts_info(s->streams[0], 64, 1, 100);
|
avpriv_set_pts_info(s->streams[0], 64, 1, 100);
|
||||||
if (avctx->extradata_size > 0) {
|
if (avctx->extradata_size > 0) {
|
||||||
avio_write(s->pb, avctx->extradata, avctx->extradata_size);
|
size_t header_size = avctx->extradata_size;
|
||||||
if (avctx->extradata[avctx->extradata_size - 1] != '\n')
|
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);
|
avio_write(s->pb, "\r\n", 2);
|
||||||
ass->ssa_mode = !strstr(avctx->extradata, "\n[V4+ Styles]");
|
ass->ssa_mode = !strstr(avctx->extradata, "\n[V4+ Styles]");
|
||||||
if (!strstr(avctx->extradata, "\n[Events]"))
|
if (!strstr(avctx->extradata, "\n[Events]"))
|
||||||
@ -192,7 +209,14 @@ static int write_packet(AVFormatContext *s, AVPacket *pkt)
|
|||||||
|
|
||||||
static int write_trailer(AVFormatContext *s)
|
static int write_trailer(AVFormatContext *s)
|
||||||
{
|
{
|
||||||
|
ASSContext *ass = s->priv_data;
|
||||||
|
|
||||||
purge_dialogues(s, 1);
|
purge_dialogues(s, 1);
|
||||||
|
|
||||||
|
if (ass->trailer) {
|
||||||
|
avio_write(s->pb, ass->trailer, ass->trailer_size);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user