diff options
author | Andreas Rheinhardt <andreas.rheinhardt@outlook.com> | 2021-11-30 12:02:13 +0300 |
---|---|---|
committer | Andreas Rheinhardt <andreas.rheinhardt@outlook.com> | 2021-12-02 09:29:02 +0300 |
commit | 0bc3c070fb516319f08d7264af27e3e123f45e95 (patch) | |
tree | 98be28ae5bc7c82fd7c23f462862bd60451439ce /libavcodec | |
parent | f8e5e1c52333e6c330fbb4fe8ec2cb07240ca8c5 (diff) |
avcodec/movtextenc: Fix encoding of subtitles with multiple rects
The format of a mov_text (3GPP Timed Text) sample is:
uint16_t text_length;
uint8_t text[text_length];
TextSampleModifierBox text_modifier;
Yet in case our encoder receives an AVSubtitle with multiple
ASS AVSubtitleRects, it creates something like this:
uint16_t text_length;
uint8_t text[text_length_1];
TextSampleModifierBox text_modifier_1;
uint8_t text[text_length_2];
TextSampleModifierBox text_modifier_2;
...
where text_length is the sum of all the text_length_*.
This commit fixes this by writing the TextSampleModifierBoxes only
after all the rects have been written.
Reviewed-by: Philip Langdale <philipl@overt.org>
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Diffstat (limited to 'libavcodec')
-rw-r--r-- | libavcodec/movtextenc.c | 8 |
1 files changed, 3 insertions, 5 deletions
diff --git a/libavcodec/movtextenc.c b/libavcodec/movtextenc.c index eecadaf503..52e51503d6 100644 --- a/libavcodec/movtextenc.c +++ b/libavcodec/movtextenc.c @@ -640,7 +640,6 @@ static int mov_text_encode_frame(AVCodecContext *avctx, unsigned char *buf, MovTextContext *s = avctx->priv_data; ASSDialog *dialog; int i, length; - size_t j; s->byte_count = 0; s->text_pos = 0; @@ -661,10 +660,6 @@ static int mov_text_encode_frame(AVCodecContext *avctx, unsigned char *buf, mov_text_dialog(s, dialog); ff_ass_split_override_codes(&mov_text_callbacks, s, dialog->text); ff_ass_free_dialog(&dialog); - - for (j = 0; j < box_count; j++) { - box_types[j].encode(s); - } } if (s->byte_count > UINT16_MAX) @@ -672,6 +667,9 @@ static int mov_text_encode_frame(AVCodecContext *avctx, unsigned char *buf, AV_WB16(buf, s->byte_count); buf += 2; + for (size_t j = 0; j < box_count; j++) + box_types[j].encode(s); + if (!av_bprint_is_complete(&s->buffer)) return AVERROR(ENOMEM); |