mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
avfilter/af_aresample: Use preinit instead of init_dict
By using preinit, the SwrContext 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; yet if the error was just caused by an unrecognized option, it should not error out at all and instead return said option. This behaviour has been inherited by avfilter_init_dict(), contradicting its documentation. This is also fixed by this commit. Reviewed-by: Nicolas George <george@nsup.org> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
This commit is contained in:
parent
6c8f96f18b
commit
0c34cf899d
@ -43,31 +43,16 @@ typedef struct AResampleContext {
|
||||
int more_data;
|
||||
} AResampleContext;
|
||||
|
||||
static av_cold int init_dict(AVFilterContext *ctx, AVDictionary **opts)
|
||||
static av_cold int preinit(AVFilterContext *ctx)
|
||||
{
|
||||
AResampleContext *aresample = ctx->priv;
|
||||
int ret = 0;
|
||||
|
||||
aresample->next_pts = AV_NOPTS_VALUE;
|
||||
aresample->swr = swr_alloc();
|
||||
if (!aresample->swr) {
|
||||
ret = AVERROR(ENOMEM);
|
||||
goto end;
|
||||
}
|
||||
if (!aresample->swr)
|
||||
return AVERROR(ENOMEM);
|
||||
|
||||
if (opts) {
|
||||
AVDictionaryEntry *e = NULL;
|
||||
|
||||
while ((e = av_dict_get(*opts, "", e, AV_DICT_IGNORE_SUFFIX))) {
|
||||
if ((ret = av_opt_set(aresample->swr, e->key, e->value, 0)) < 0)
|
||||
goto end;
|
||||
}
|
||||
av_dict_free(opts);
|
||||
}
|
||||
if (aresample->sample_rate_arg > 0)
|
||||
av_opt_set_int(aresample->swr, "osr", aresample->sample_rate_arg, 0);
|
||||
end:
|
||||
return ret;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static av_cold void uninit(AVFilterContext *ctx)
|
||||
@ -90,6 +75,8 @@ static int query_formats(AVFilterContext *ctx)
|
||||
AVFilterChannelLayouts *in_layouts, *out_layouts;
|
||||
int ret;
|
||||
|
||||
if (aresample->sample_rate_arg > 0)
|
||||
av_opt_set_int(aresample->swr, "osr", aresample->sample_rate_arg, 0);
|
||||
av_opt_get_sample_fmt(aresample->swr, "osf", 0, &out_format);
|
||||
av_opt_get_int(aresample->swr, "osr", 0, &out_rate);
|
||||
av_opt_get_int(aresample->swr, "ocl", 0, &out_layout);
|
||||
@ -343,7 +330,7 @@ static const AVFilterPad aresample_outputs[] = {
|
||||
const AVFilter ff_af_aresample = {
|
||||
.name = "aresample",
|
||||
.description = NULL_IF_CONFIG_SMALL("Resample audio data."),
|
||||
.init_dict = init_dict,
|
||||
.preinit = preinit,
|
||||
.uninit = uninit,
|
||||
.query_formats = query_formats,
|
||||
.priv_size = sizeof(AResampleContext),
|
||||
|
Loading…
Reference in New Issue
Block a user