summaryrefslogtreecommitdiff
path: root/libavcodec/movtextenc.c
diff options
context:
space:
mode:
authorJohn Stebbins <jstebbins@jetheaddev.com>2020-04-05 08:34:45 -0600
committerPhilip Langdale <philipl@overt.org>2020-04-10 09:32:13 -0700
commitbb8fd046653b31ca5600d3966157a55b9bd2a089 (patch)
tree339c32d263f80c98e5af4f0d75a454982c5847e6 /libavcodec/movtextenc.c
parent848792be6045d4a2d20ff0d087eb23b796723abe (diff)
downloadffmpeg-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.c43
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,