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

Limin Wang lance.lmwang at gmail.com
Sat Apr 11 05:10:36 EEST 2020


please help to review, so that we can change the subtitle postion, color by
force_style.


On Mon, Mar 30, 2020 at 06:52:33PM +0800, lance.lmwang at gmail.com wrote:
> 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
> 

-- 
Thanks,
Limin Wang


More information about the ffmpeg-devel mailing list