[FFmpeg-devel] Adding Force Style option in Subtitles Filter

Stefano Sabatini stefasab at gmail.com
Wed Feb 4 14:59:31 CET 2015


On date Wednesday 2015-02-04 01:30:09 +0530, Eejya Singh encoded:
> Hi,
> I've implemented a force_style option in the subtitles filter. Kindly find
> the patch attached.
> 
> -- 
> Eejya Singh,
> 3rd year undergraduate,
> Computer Science,
> BITS Pilani Goa Campus

> From 88014fde69b249d3b1cb8e6bd2f654156ba2b4e7 Mon Sep 17 00:00:00 2001
> From: Eejya Singh <singh.eejya at gmail.com>
> Date: Wed, 28 Jan 2015 17:41:42 +0530

> Subject: [PATCH] Adding Force Style option in Subtitles Filter

lavfi/subtitles: add force_style option

> 
> Signed-off-by: Eejya Singh <singh.eejya at gmail.com>
> ---
>  doc/filters.texi           | 14 ++++++++++++++
>  libavfilter/version.h      |  2 +-
>  libavfilter/vf_subtitles.c | 24 ++++++++++++++++++++++++
>  3 files changed, 39 insertions(+), 1 deletion(-)
> 
> diff --git a/doc/filters.texi b/doc/filters.texi
> index 261fd24..60ef7f4 100644
> --- a/doc/filters.texi
> +++ b/doc/filters.texi
> @@ -8470,6 +8470,10 @@ useful if not UTF-8.
>  
>  @item stream_index, si
>  Set subtitles stream index. @code{subtitles} filter only.
> +

> + at item force_style
> +Set desired style for the customization of subtitles.It follows ASS style format.
> +

You should describe the syntax here, otherwise the user will have to guesswork.

>  @end table
>  
>  If the first key is not specified, it is assumed that the first value
> @@ -8496,6 +8500,16 @@ To render the second subtitles stream from that file, use:
>  subtitles=video.mkv:si=1
>  @end example
>  
> +To change the font of subtitles stream from file, use:
> + at example
> +subtitles=sub.srt:force_style=FontName=Arial
> + at end example
> +
> +To change the color and formatting of subtitles stream from file, use:
> + at example
> +subtitles='sub.srt:force_style=FontName=Arial,PrimaryColour=255'
> + at end example
> +
>  @section super2xsai
>  
>  Scale the input by 2x and smooth using the Super2xSaI (Scale and
> diff --git a/libavfilter/version.h b/libavfilter/version.h
> index 50967f4..7ec374d 100644
> --- a/libavfilter/version.h
> +++ b/libavfilter/version.h
> @@ -31,7 +31,7 @@
>  
>  #define LIBAVFILTER_VERSION_MAJOR  5
>  #define LIBAVFILTER_VERSION_MINOR  6
> -#define LIBAVFILTER_VERSION_MICRO 100
> +#define LIBAVFILTER_VERSION_MICRO 101
>  
>  #define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \
>                                                 LIBAVFILTER_VERSION_MINOR, \
> diff --git a/libavfilter/vf_subtitles.c b/libavfilter/vf_subtitles.c
> index be4c6a5..0fae118 100644
> --- a/libavfilter/vf_subtitles.c
> +++ b/libavfilter/vf_subtitles.c
> @@ -51,6 +51,7 @@ typedef struct {
>      ASS_Track    *track;
>      char *filename;
>      char *charenc;
> +    char *force_style;
>      int stream_index;
>      uint8_t rgba_map[4];
>      int     pix_step[4];       ///< steps per pixel for each plane of the main output
> @@ -260,6 +261,7 @@ static const AVOption subtitles_options[] = {
>      {"charenc",      "set input character encoding", OFFSET(charenc),      AV_OPT_TYPE_STRING, {.str = NULL}, CHAR_MIN, CHAR_MAX, FLAGS},
>      {"stream_index", "set stream index",             OFFSET(stream_index), AV_OPT_TYPE_INT,    { .i64 = -1 }, -1,       INT_MAX,  FLAGS},
>      {"si",           "set stream index",             OFFSET(stream_index), AV_OPT_TYPE_INT,    { .i64 = -1 }, -1,       INT_MAX,  FLAGS},
> +    {"force_style",  "force subtitle style",         OFFSET(force_style),  AV_OPT_TYPE_STRING, {.str = NULL}, CHAR_MIN, CHAR_MAX, FLAGS},
>      {NULL},
>  };
>  
> @@ -389,6 +391,28 @@ static av_cold int init_subtitles(AVFilterContext *ctx)
>      if (ass->charenc)
>          av_dict_set(&codec_opts, "sub_charenc", ass->charenc, 0);
>      ret = avcodec_open2(dec_ctx, dec, &codec_opts);
> +

You should keep the if ret < 0 check here.

> +    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);
> +                goto end;
> +            }
> +            ptr = av_strtok(NULL, ",", &temp);
> +        }
> +        av_dynarray_add(&list, &i, NULL);
> +        if (!list) {
> +            ret = AVERROR(ENOMEM);
> +            goto end;
> +        }
> +        ass_set_style_overrides(ass->library, list);
> +        av_free(list);
> +    }

Question: in the key=value Ass property couples, can value contain the
"," special character?

LGTM otherwise.
-- 
FFmpeg = Faithful Fostering Mysterious Prodigious Eretic God


More information about the ffmpeg-devel mailing list