diff --git a/doc/APIchanges b/doc/APIchanges index 48d791951a..40af3655d7 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -168,6 +168,7 @@ API changes, most recent first: Add AVFilterContext.graph pointing to the AVFilterGraph that contains the filter. Add avfilter_init_str(), deprecate avfilter_init_filter(). + Add avfilter_init_dict(). 2013-xx-xx - lavfi 3.7.0 - avfilter.h Add AVFilter.priv_class for exporting filter options through the AVOptions API diff --git a/libavfilter/avfilter.c b/libavfilter/avfilter.c index 093bf56872..d912a42a55 100644 --- a/libavfilter/avfilter.c +++ b/libavfilter/avfilter.c @@ -688,6 +688,28 @@ int avfilter_init_filter(AVFilterContext *filter, const char *args, void *opaque } #endif +int avfilter_init_dict(AVFilterContext *ctx, AVDictionary **options) +{ + int ret = 0; + + if (ctx->filter->priv_class) { + ret = av_opt_set_dict(ctx->priv, options); + if (ret < 0) { + av_log(ctx, AV_LOG_ERROR, "Error applying options to the filter.\n"); + return ret; + } + } + + if (ctx->filter->init_opaque) + ret = ctx->filter->init_opaque(ctx, NULL); + else if (ctx->filter->init) + ret = ctx->filter->init(ctx); + else if (ctx->filter->init_dict) + ret = ctx->filter->init_dict(ctx, options); + + return ret; +} + int avfilter_init_str(AVFilterContext *filter, const char *args) { AVDictionary *options = NULL; @@ -794,20 +816,7 @@ int avfilter_init_str(AVFilterContext *filter, const char *args) } } - if (filter->filter->priv_class) { - ret = av_opt_set_dict(filter->priv, &options); - if (ret < 0) { - av_log(filter, AV_LOG_ERROR, "Error applying options to the filter.\n"); - goto fail; - } - } - - if (filter->filter->init_opaque) - ret = filter->filter->init_opaque(filter, NULL); - else if (filter->filter->init) - ret = filter->filter->init(filter); - else if (filter->filter->init_dict) - ret = filter->filter->init_dict(filter, &options); + ret = avfilter_init_dict(filter, &options); if (ret < 0) goto fail; diff --git a/libavfilter/avfilter.h b/libavfilter/avfilter.h index c7968dfaea..05effe47de 100644 --- a/libavfilter/avfilter.h +++ b/libavfilter/avfilter.h @@ -888,6 +888,28 @@ int avfilter_init_filter(AVFilterContext *filter, const char *args, void *opaque */ int avfilter_init_str(AVFilterContext *ctx, const char *args); +/** + * Initialize a filter with the supplied dictionary of options. + * + * @param ctx uninitialized filter context to initialize + * @param options An AVDictionary filled with options for this filter. On + * return this parameter will be destroyed and replaced with + * a dict containing options that were not found. This dictionary + * must be freed by the caller. + * May be NULL, then this function is equivalent to + * avfilter_init_str() with the second parameter set to NULL. + * @return 0 on success, a negative AVERROR on failure + * + * @note This function and avfilter_init_str() do essentially the same thing, + * the difference is in manner in which the options are passed. It is up to the + * calling code to choose whichever is more preferable. The two functions also + * behave differently when some of the provided options are not declared as + * supported by the filter. In such a case, avfilter_init_str() will fail, but + * this function will leave those extra options in the options AVDictionary and + * continue as usual. + */ +int avfilter_init_dict(AVFilterContext *ctx, AVDictionary **options); + /** * Free a filter context. This will also remove the filter from its * filtergraph's list of filters.