diff options
author | John Stebbins <jstebbins@jetheaddev.com> | 2020-04-05 08:34:45 -0600 |
---|---|---|
committer | Philip Langdale <philipl@overt.org> | 2020-04-10 09:32:13 -0700 |
commit | bb8fd046653b31ca5600d3966157a55b9bd2a089 (patch) | |
tree | 339c32d263f80c98e5af4f0d75a454982c5847e6 /libavcodec/movtextenc.c | |
parent | 848792be6045d4a2d20ff0d087eb23b796723abe (diff) | |
download | ffmpeg-bb8fd046653b31ca5600d3966157a55b9bd2a089.tar.gz |
lavc/movtextenc: handle cancel overrides callback
Signed-off-by: Philip Langdale <philipl@overt.org>
Diffstat (limited to 'libavcodec/movtextenc.c')
-rw-r--r-- | libavcodec/movtextenc.c | 43 |
1 files changed, 34 insertions, 9 deletions
diff --git a/libavcodec/movtextenc.c b/libavcodec/movtextenc.c index 9e657c9635..2d3c416407 100644 --- a/libavcodec/movtextenc.c +++ b/libavcodec/movtextenc.c @@ -69,6 +69,7 @@ typedef struct { AVCodecContext *avctx; ASSSplitContext *ass_ctx; + ASSStyle *ass_dialog_style; AVBPrint buffer; StyleBox **style_attributes; StyleBox *style_attributes_temp; @@ -396,9 +397,8 @@ static void mov_text_end_cb(void *priv) mov_text_style_start((MovTextContext*)priv); } -static void mov_text_dialog(MovTextContext *s, ASSDialog *dialog) +static void mov_text_ass_style_set(MovTextContext *s, ASSStyle *style) { - ASSStyle * style = ff_ass_style_get(s->ass_ctx, dialog->style); uint8_t style_flags, alpha; uint32_t color; @@ -412,9 +412,33 @@ static void mov_text_dialog(MovTextContext *s, ASSDialog *dialog) alpha = 255 - ((uint32_t)style->primary_color >> 24); mov_text_alpha_set(s, alpha); mov_text_font_size_set(s, style->font_size); + } else { + // End current style record, go back to defaults + mov_text_style_start(s); } } +static void mov_text_dialog(MovTextContext *s, ASSDialog *dialog) +{ + ASSStyle * style = ff_ass_style_get(s->ass_ctx, dialog->style); + + s->ass_dialog_style = style; + mov_text_ass_style_set(s, style); +} + +static void mov_text_cancel_overrides_cb(void *priv, const char * style_name) +{ + MovTextContext *s = priv; + ASSStyle * style; + + if (!style_name || !*style_name) + style = s->ass_dialog_style; + else + style= ff_ass_style_get(s->ass_ctx, style_name); + + mov_text_ass_style_set(s, style); +} + static uint16_t utf8_strlen(const char *text, int len) { uint16_t i = 0, ret = 0; @@ -454,13 +478,14 @@ static void mov_text_new_line_cb(void *priv, int forced) } static const ASSCodesCallbacks mov_text_callbacks = { - .text = mov_text_text_cb, - .new_line = mov_text_new_line_cb, - .style = mov_text_style_cb, - .color = mov_text_color_cb, - .alpha = mov_text_alpha_cb, - .font_size = mov_text_font_size_cb, - .end = mov_text_end_cb, + .text = mov_text_text_cb, + .new_line = mov_text_new_line_cb, + .style = mov_text_style_cb, + .color = mov_text_color_cb, + .alpha = mov_text_alpha_cb, + .font_size = mov_text_font_size_cb, + .cancel_overrides = mov_text_cancel_overrides_cb, + .end = mov_text_end_cb, }; static int mov_text_encode_frame(AVCodecContext *avctx, unsigned char *buf, |