[FFmpeg-devel] [PATCH] lavc/dvdsubenc: accept palette from options

Carl Eugen Hoyos ceffmpeg at gmail.com
Sat Jan 25 01:24:11 EET 2020


Am Fr., 24. Jan. 2020 um 23:49 Uhr schrieb Michael Kuron
<michael.kuron at gmail.com>:
>
> Previously, the default palette would always be used.
> Now, we can accept a custom palette, just like dvdsubdec does.
>
> Signed-off-by: Michael Kuron <michael.kuron at gmail.com>
> ---
>  doc/encoders.texi      |  8 ++++++++
>  libavcodec/dvdsubenc.c | 19 ++++++++++++++++++-
>  2 files changed, 26 insertions(+), 1 deletion(-)
>
> diff --git a/doc/encoders.texi b/doc/encoders.texi
> index eefd124751..a04f9f1b62 100644
> --- a/doc/encoders.texi
> +++ b/doc/encoders.texi
> @@ -3116,6 +3116,14 @@ and they can also be used in Matroska files.
>  @subsection Options
>
>  @table @option
> + at item palette
> +Specify the global palette used by the bitmaps.
> +
> +The format for this option is a string containing 16 24-bits hexadecimal
> +numbers (without 0x prefix) separated by commas, for example @code{0d00ee,
> +ee450d, 101010, eaeaea, 0ce60b, ec14ed, ebff0b, 0d617a, 7b7b7b, d1d1d1,
> +7b2a0e, 0d950c, 0f007b, cf0dec, cfa80c, 7c127b}.
> +
>  @item even_rows_fix
>  When set to 1, enable a work-around that makes the number of pixel rows
>  even in all subtitles.  This fixes a problem with some players that
> diff --git a/libavcodec/dvdsubenc.c b/libavcodec/dvdsubenc.c
> index ff95ed2002..674d97ab9b 100644
> --- a/libavcodec/dvdsubenc.c
> +++ b/libavcodec/dvdsubenc.c
> @@ -29,6 +29,7 @@
>  typedef struct {
>      AVClass *class;
>      uint32_t global_palette[16];
> +    char    *palette_str;
>      int even_rows_fix;
>  } DVDSubtitleContext;
>
> @@ -423,6 +424,17 @@ fail:
>      return ret;
>  }
>
> +static void parse_palette(DVDSubtitleContext *ctx, char *p)
> +{
> +    int i;
> +
> +    for (i=0; i<16; i++) {
> +        ctx->global_palette[i] = strtoul(p, &p, 16);
> +        while (*p == ',' || av_isspace(*p))
> +            p++;
> +    }
> +}
> +
>  static int dvdsub_init(AVCodecContext *avctx)
>  {
>      DVDSubtitleContext *dvdc = avctx->priv_data;
> @@ -436,7 +448,11 @@ static int dvdsub_init(AVCodecContext *avctx)
>      int i, ret;
>
>      av_assert0(sizeof(dvdc->global_palette) == sizeof(default_palette));
> -    memcpy(dvdc->global_palette, default_palette, sizeof(dvdc->global_palette));
> +    if (dvdc->palette_str) {
> +        parse_palette(dvdc, dvdc->palette_str);
> +    } else {
> +        memcpy(dvdc->global_palette, default_palette, sizeof(dvdc->global_palette));
> +    }
>
>      av_bprint_init(&extradata, 0, AV_BPRINT_SIZE_AUTOMATIC);
>      if (avctx->width && avctx->height)
> @@ -467,6 +483,7 @@ static int dvdsub_encode(AVCodecContext *avctx,
>  #define OFFSET(x) offsetof(DVDSubtitleContext, x)
>  #define SE AV_OPT_FLAG_SUBTITLE_PARAM | AV_OPT_FLAG_ENCODING_PARAM
>  static const AVOption options[] = {
> +    {"palette", "set the global palette", OFFSET(palette_str), AV_OPT_TYPE_STRING, { .str = NULL }, 0, 0, SE },

What happens if invalid values are passed as palette?

Carl Eugen


More information about the ffmpeg-devel mailing list