summaryrefslogtreecommitdiff
path: root/libavcodec/movtextenc.c
diff options
context:
space:
mode:
authorAndreas Rheinhardt <andreas.rheinhardt@outlook.com>2021-11-30 10:02:13 +0100
committerAndreas Rheinhardt <andreas.rheinhardt@outlook.com>2021-12-02 07:29:02 +0100
commit0bc3c070fb516319f08d7264af27e3e123f45e95 (patch)
tree98be28ae5bc7c82fd7c23f462862bd60451439ce /libavcodec/movtextenc.c
parentf8e5e1c52333e6c330fbb4fe8ec2cb07240ca8c5 (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/movtextenc.c')
-rw-r--r--libavcodec/movtextenc.c8
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);