lavfi: add common code to handle options parsing.

This commit is contained in:
Nicolas George 2013-03-16 20:40:30 +01:00
parent cdd78a65f4
commit befbcc374d
2 changed files with 23 additions and 0 deletions

View File

@ -24,6 +24,7 @@
#include "libavutil/channel_layout.h" #include "libavutil/channel_layout.h"
#include "libavutil/common.h" #include "libavutil/common.h"
#include "libavutil/imgutils.h" #include "libavutil/imgutils.h"
#include "libavutil/opt.h"
#include "libavutil/pixdesc.h" #include "libavutil/pixdesc.h"
#include "libavutil/rational.h" #include "libavutil/rational.h"
#include "libavutil/samplefmt.h" #include "libavutil/samplefmt.h"
@ -556,6 +557,8 @@ void avfilter_free(AVFilterContext *filter)
if (filter->filter->uninit) if (filter->filter->uninit)
filter->filter->uninit(filter); filter->filter->uninit(filter);
if (filter->filter->shorthand)
av_opt_free(filter->priv);
for (i = 0; i < filter->nb_inputs; i++) { for (i = 0; i < filter->nb_inputs; i++) {
if ((link = filter->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; 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) if (filter->filter->init_opaque)
ret = filter->filter->init_opaque(filter, args, opaque); ret = filter->filter->init_opaque(filter, args, opaque);
else if (filter->filter->init) else if (filter->filter->init)

View File

@ -486,6 +486,15 @@ typedef struct AVFilter {
int (*init_opaque)(AVFilterContext *ctx, const char *args, void *opaque); int (*init_opaque)(AVFilterContext *ctx, const char *args, void *opaque);
const AVClass *priv_class; ///< private class, containing filter specific options 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; } AVFilter;
/** An instance of a filter */ /** An instance of a filter */