diff options
author | Andreas Rheinhardt <andreas.rheinhardt@outlook.com> | 2021-09-13 16:54:58 +0200 |
---|---|---|
committer | Andreas Rheinhardt <andreas.rheinhardt@outlook.com> | 2021-09-19 04:45:34 +0200 |
commit | a85d2de45f37aace0cbdb754881effa0c9689784 (patch) | |
tree | 3f257065c0cca93338dcf40fdc744d6e64144505 /libavfilter/vf_spp.c | |
parent | 0c34cf899dc67febb57f5da4ec50640985e4f670 (diff) |
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 <andreas.rheinhardt@outlook.com>
Diffstat (limited to 'libavfilter/vf_spp.c')
-rw-r--r-- | libavfilter/vf_spp.c | 26 |
1 files 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), |