Commit 828044ac authored by Michael Niedermayer's avatar Michael Niedermayer

Merge commit '4fa1f52e'

* commit '4fa1f52e':
  af_resample: switch to an AVOptions-based system.

Conflicts:
	libavfilter/avfilter.c
Merged-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parents d2752ef0 4fa1f52e
...@@ -37,6 +37,7 @@ ...@@ -37,6 +37,7 @@
#include "internal.h" #include "internal.h"
typedef struct ResampleContext { typedef struct ResampleContext {
const AVClass *class;
AVAudioResampleContext *avr; AVAudioResampleContext *avr;
AVDictionary *options; AVDictionary *options;
...@@ -46,26 +47,30 @@ typedef struct ResampleContext { ...@@ -46,26 +47,30 @@ typedef struct ResampleContext {
int got_output; int got_output;
} ResampleContext; } ResampleContext;
static av_cold int init(AVFilterContext *ctx, const char *args) static av_cold int init(AVFilterContext *ctx, AVDictionary **opts)
{ {
ResampleContext *s = ctx->priv; ResampleContext *s = ctx->priv;
const AVClass *avr_class = avresample_get_class();
AVDictionaryEntry *e = NULL;
if (args) { while ((e = av_dict_get(*opts, "", e, AV_DICT_IGNORE_SUFFIX))) {
int ret = av_dict_parse_string(&s->options, args, "=", ":", 0); if (av_opt_find(&avr_class, e->key, NULL, 0,
if (ret < 0) { AV_OPT_SEARCH_FAKE_OBJ | AV_OPT_SEARCH_CHILDREN))
av_log(ctx, AV_LOG_ERROR, "error setting option string: %s\n", args); av_dict_set(&s->options, e->key, e->value, 0);
return ret;
}
/* do not allow the user to override basic format options */
av_dict_set(&s->options, "in_channel_layout", NULL, 0);
av_dict_set(&s->options, "out_channel_layout", NULL, 0);
av_dict_set(&s->options, "in_sample_fmt", NULL, 0);
av_dict_set(&s->options, "out_sample_fmt", NULL, 0);
av_dict_set(&s->options, "in_sample_rate", NULL, 0);
av_dict_set(&s->options, "out_sample_rate", NULL, 0);
} }
e = NULL;
while ((e = av_dict_get(s->options, "", e, AV_DICT_IGNORE_SUFFIX)))
av_dict_set(opts, e->key, NULL, 0);
/* do not allow the user to override basic format options */
av_dict_set(&s->options, "in_channel_layout", NULL, 0);
av_dict_set(&s->options, "out_channel_layout", NULL, 0);
av_dict_set(&s->options, "in_sample_fmt", NULL, 0);
av_dict_set(&s->options, "out_sample_fmt", NULL, 0);
av_dict_set(&s->options, "in_sample_rate", NULL, 0);
av_dict_set(&s->options, "out_sample_rate", NULL, 0);
return 0; return 0;
} }
...@@ -272,6 +277,25 @@ fail: ...@@ -272,6 +277,25 @@ fail:
return ret; return ret;
} }
static const AVClass *resample_child_class_next(const AVClass *prev)
{
return prev ? NULL : avresample_get_class();
}
static void *resample_child_next(void *obj, void *prev)
{
ResampleContext *s = obj;
return prev ? NULL : s->avr;
}
static const AVClass resample_class = {
.class_name = "resample",
.item_name = av_default_item_name,
.version = LIBAVUTIL_VERSION_INT,
.child_class_next = resample_child_class_next,
.child_next = resample_child_next,
};
static const AVFilterPad avfilter_af_resample_inputs[] = { static const AVFilterPad avfilter_af_resample_inputs[] = {
{ {
.name = "default", .name = "default",
...@@ -295,8 +319,9 @@ AVFilter avfilter_af_resample = { ...@@ -295,8 +319,9 @@ AVFilter avfilter_af_resample = {
.name = "resample", .name = "resample",
.description = NULL_IF_CONFIG_SMALL("Audio resampling and conversion."), .description = NULL_IF_CONFIG_SMALL("Audio resampling and conversion."),
.priv_size = sizeof(ResampleContext), .priv_size = sizeof(ResampleContext),
.priv_class = &resample_class,
.init = init, .init_dict = init,
.uninit = uninit, .uninit = uninit,
.query_formats = query_formats, .query_formats = query_formats,
......
...@@ -653,7 +653,9 @@ int avfilter_init_filter(AVFilterContext *filter, const char *args, void *opaque ...@@ -653,7 +653,9 @@ int avfilter_init_filter(AVFilterContext *filter, const char *args, void *opaque
AVDictionary *options = NULL; AVDictionary *options = NULL;
AVDictionaryEntry *e; AVDictionaryEntry *e;
int ret=0; int ret=0;
int anton_options = 0; int anton_options =
!strcmp(filter->filter->name, "resample")
;
if (filter->filter->shorthand) { if (filter->filter->shorthand) {
av_assert0(filter->priv); av_assert0(filter->priv);
...@@ -688,14 +690,14 @@ int avfilter_init_filter(AVFilterContext *filter, const char *args, void *opaque ...@@ -688,14 +690,14 @@ int avfilter_init_filter(AVFilterContext *filter, const char *args, void *opaque
} }
} }
if (filter->filter->init || filter->filter->init_opaque) { 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 ret = filter->filter->init(filter, args);
ret = filter->filter->init(filter, args); else if (filter->filter->init_dict)
if (ret < 0) ret = filter->filter->init_dict(filter, &options);
goto fail; if (ret < 0)
} goto fail;
if ((e = av_dict_get(options, "", NULL, AV_DICT_IGNORE_SUFFIX))) { if ((e = av_dict_get(options, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
av_log(filter, AV_LOG_ERROR, "No such option: %s.\n", e->key); av_log(filter, AV_LOG_ERROR, "No such option: %s.\n", e->key);
......
...@@ -451,6 +451,13 @@ typedef struct AVFilter { ...@@ -451,6 +451,13 @@ typedef struct AVFilter {
*/ */
int (*init)(AVFilterContext *ctx, const char *args); int (*init)(AVFilterContext *ctx, const char *args);
/**
* Should be set instead of init by the filters that want to pass a
* dictionary of AVOptions to nested contexts that are allocated in
* init.
*/
int (*init_dict)(AVFilterContext *ctx, AVDictionary **options);
/** /**
* Filter uninitialization function. Should deallocate any memory held * Filter uninitialization function. Should deallocate any memory held
* by the filter, release any buffer references, etc. This does not need * by the filter, release any buffer references, etc. This does not need
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment