[FFmpeg-devel] [PATCH v1 2/2] avfilter/vf_subtitles: add force_style option for ass subtitle filter

lance.lmwang at gmail.com lance.lmwang at gmail.com
Mon Mar 30 13:52:33 EEST 2020


From: Limin Wang <lance.lmwang at gmail.com>

Signed-off-by: Limin Wang <lance.lmwang at gmail.com>
---
 doc/filters.texi           |  4 ++++
 libavfilter/vf_subtitles.c | 23 +++++++++++++++++++++++
 2 files changed, 27 insertions(+)

diff --git a/doc/filters.texi b/doc/filters.texi
index 328e984e92..d26d90d1bb 100644
--- a/doc/filters.texi
+++ b/doc/filters.texi
@@ -6399,6 +6399,10 @@ Slower shaper using OpenType for substitutions and positioning
 @end table
 
 The default is @code{auto}.
+
+ at item force_style
+Override default style or script info parameters of the subtitles. It accepts a
+string containing ASS style format @code{KEY=VALUE} couples separated by ",".
 @end table
 
 @section atadenoise
diff --git a/libavfilter/vf_subtitles.c b/libavfilter/vf_subtitles.c
index 2f312b0ba8..e3ad8b8d94 100644
--- a/libavfilter/vf_subtitles.c
+++ b/libavfilter/vf_subtitles.c
@@ -218,6 +218,7 @@ static const AVOption ass_options[] = {
         {"auto", NULL,                 0, AV_OPT_TYPE_CONST, {.i64 = -1},                  INT_MIN, INT_MAX, FLAGS, "shaping_mode"},
         {"simple",  "simple shaping",  0, AV_OPT_TYPE_CONST, {.i64 = ASS_SHAPING_SIMPLE},  INT_MIN, INT_MAX, FLAGS, "shaping_mode"},
         {"complex", "complex shaping", 0, AV_OPT_TYPE_CONST, {.i64 = ASS_SHAPING_COMPLEX}, INT_MIN, INT_MAX, FLAGS, "shaping_mode"},
+    {"force_style",  "force subtitle style",         OFFSET(force_style),  AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, FLAGS},
     {NULL},
 };
 
@@ -234,6 +235,28 @@ static av_cold int init_ass(AVFilterContext *ctx)
     /* Initialize fonts */
     ass_set_fonts(ass->renderer, NULL, NULL, 1, NULL, 1);
 
+    if (ass->force_style) {
+        char **list = NULL;
+        char *temp = NULL;
+        char *ptr = av_strtok(ass->force_style, ",", &temp);
+        int i = 0;
+        while (ptr) {
+            av_dynarray_add(&list, &i, ptr);
+            if (!list) {
+                ret = AVERROR(ENOMEM);
+                return ret;
+            }
+            ptr = av_strtok(NULL, ",", &temp);
+        }
+        av_dynarray_add(&list, &i, NULL);
+        if (!list) {
+            ret = AVERROR(ENOMEM);
+            return ret;
+        }
+        ass_set_style_overrides(ass->library, list);
+        av_free(list);
+    }
+
     ass->track = ass_read_file(ass->library, ass->filename, NULL);
     if (!ass->track) {
         av_log(ctx, AV_LOG_ERROR,
-- 
2.21.0



More information about the ffmpeg-devel mailing list