From a85d2de45f37aace0cbdb754881effa0c9689784 Mon Sep 17 00:00:00 2001 From: Andreas Rheinhardt Date: Mon, 13 Sep 2021 16:54:58 +0200 Subject: [PATCH] avfilter/vf_spp: Use preinit instead of init_dict By using preinit, the AVDCT already exists directly after allocating the filter, so that the filter's AVClass's child_next becomes usable for setting options with the AV_OPT_SEARCH_CHILDREN search flag. This means that it is no longer necessary to use the init_dict callback for this filter. Furthermore, the earlier code did not abide by the documentation of the init_dict callback at all: Instead of only returning the options that have not been recognized it always returned all options on any av_opt_set() error and errored out in this case, even if it is just an unrecognized option. This behaviour has been inherited by avfilter_init_dict(), contradicting its documentation. This is also fixed in this commit. Signed-off-by: Andreas Rheinhardt --- libavfilter/vf_spp.c | 26 ++++++++------------------ 1 file changed, 8 insertions(+), 18 deletions(-) diff --git a/libavfilter/vf_spp.c b/libavfilter/vf_spp.c index b3a52fc99b..6c15dbaf66 100644 --- a/libavfilter/vf_spp.c +++ b/libavfilter/vf_spp.c @@ -338,6 +338,12 @@ static int config_input(AVFilterLink *inlink) const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format); const int bps = desc->comp[0].depth; + s->store_slice = store_slice_c; + switch (s->mode) { + case MODE_HARD: s->requantize = hardthresh_c; break; + case MODE_SOFT: s->requantize = softthresh_c; break; + } + av_opt_set_int(s->dct, "bits_per_sample", bps, 0); avcodec_dct_init(s->dct); @@ -451,30 +457,14 @@ static int process_command(AVFilterContext *ctx, const char *cmd, const char *ar return AVERROR(ENOSYS); } -static av_cold int init_dict(AVFilterContext *ctx, AVDictionary **opts) +static av_cold int preinit(AVFilterContext *ctx) { SPPContext *s = ctx->priv; - int ret; s->dct = avcodec_dct_alloc(); if (!s->dct) return AVERROR(ENOMEM); - if (opts) { - AVDictionaryEntry *e = NULL; - - while ((e = av_dict_get(*opts, "", e, AV_DICT_IGNORE_SUFFIX))) { - if ((ret = av_opt_set(s->dct, e->key, e->value, 0)) < 0) - return ret; - } - av_dict_free(opts); - } - - s->store_slice = store_slice_c; - switch (s->mode) { - case MODE_HARD: s->requantize = hardthresh_c; break; - case MODE_SOFT: s->requantize = softthresh_c; break; - } return 0; } @@ -508,7 +498,7 @@ const AVFilter ff_vf_spp = { .name = "spp", .description = NULL_IF_CONFIG_SMALL("Apply a simple post processing filter."), .priv_size = sizeof(SPPContext), - .init_dict = init_dict, + .preinit = preinit, .uninit = uninit, .query_formats = query_formats, FILTER_INPUTS(spp_inputs),