diff --git a/libavfilter/avfilter.c b/libavfilter/avfilter.c index 1d278178fe..8a907dc085 100644 --- a/libavfilter/avfilter.c +++ b/libavfilter/avfilter.c @@ -24,6 +24,7 @@ #include "libavutil/channel_layout.h" #include "libavutil/common.h" #include "libavutil/imgutils.h" +#include "libavutil/opt.h" #include "libavutil/pixdesc.h" #include "libavutil/rational.h" #include "libavutil/samplefmt.h" @@ -556,6 +557,8 @@ void avfilter_free(AVFilterContext *filter) if (filter->filter->uninit) filter->filter->uninit(filter); + if (filter->filter->shorthand) + av_opt_free(filter->priv); for (i = 0; i < filter->nb_inputs; i++) { if ((link = filter->inputs[i])) { @@ -600,6 +603,17 @@ int avfilter_init_filter(AVFilterContext *filter, const char *args, void *opaque { int ret=0; + if (filter->filter->shorthand) { + av_assert0(filter->priv); + av_assert0(filter->filter->priv_class); + *(const AVClass **)filter->priv = filter->filter->priv_class; + av_opt_set_defaults(filter->priv); + ret = av_opt_set_from_string(filter->priv, args, + filter->filter->shorthand, "=", ":"); + if (ret < 0) + return ret; + args = NULL; + } if (filter->filter->init_opaque) ret = filter->filter->init_opaque(filter, args, opaque); else if (filter->filter->init) diff --git a/libavfilter/avfilter.h b/libavfilter/avfilter.h index 45ad6f9f58..455161fa34 100644 --- a/libavfilter/avfilter.h +++ b/libavfilter/avfilter.h @@ -486,6 +486,15 @@ typedef struct AVFilter { int (*init_opaque)(AVFilterContext *ctx, const char *args, void *opaque); const AVClass *priv_class; ///< private class, containing filter specific options + + /** + * Shorthand syntax for init arguments. + * If this field is set (even to an empty list), just before init the + * private class will be set and the arguments string will be parsed + * using av_opt_set_from_string() with "=" and ":" delimiters, and + * av_opt_free() will be called just after uninit. + */ + const char *const *shorthand; } AVFilter; /** An instance of a filter */