From 9f1223562e134bac6345a465870b9d56ff7d60cf Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Tue, 18 Dec 2012 21:27:35 -0500 Subject: [PATCH] lavfi: connect libavresample options to af_resample via AVFilterGraph --- doc/APIchanges | 4 ++++ libavfilter/af_resample.c | 35 +++++++++++++++++++++++++++++++++++ libavfilter/avfiltergraph.c | 8 +++++++- libavfilter/avfiltergraph.h | 1 + libavfilter/version.h | 2 +- 5 files changed, 48 insertions(+), 2 deletions(-) diff --git a/doc/APIchanges b/doc/APIchanges index 71fb0206d6..b58f4da522 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -13,6 +13,10 @@ libavutil: 2012-10-22 API changes, most recent first: +2013-xx-xx - xxxxxxx - lavfi 3.4.0 - avfiltergraph.h + Add resample_lavr_opts to AVFilterGraph for setting libavresample options + for auto-inserted resample filters. + 2013-xx-xx - xxxxxxx - lavu 52.7.0 - dict.h Add av_dict_parse_string() to set multiple key/value pairs at once from a string. diff --git a/libavfilter/af_resample.c b/libavfilter/af_resample.c index c712b46d59..84ca8f5501 100644 --- a/libavfilter/af_resample.c +++ b/libavfilter/af_resample.c @@ -25,6 +25,7 @@ #include "libavutil/avassert.h" #include "libavutil/avstring.h" #include "libavutil/common.h" +#include "libavutil/dict.h" #include "libavutil/mathematics.h" #include "libavutil/opt.h" @@ -37,6 +38,7 @@ typedef struct ResampleContext { AVAudioResampleContext *avr; + AVDictionary *options; int64_t next_pts; @@ -44,6 +46,29 @@ typedef struct ResampleContext { int got_output; } ResampleContext; +static av_cold int init(AVFilterContext *ctx, const char *args) +{ + ResampleContext *s = ctx->priv; + + if (args) { + int ret = av_dict_parse_string(&s->options, args, "=", ":", 0); + if (ret < 0) { + av_log(ctx, AV_LOG_ERROR, "error setting option string: %s\n", args); + 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); + } + + return 0; +} + static av_cold void uninit(AVFilterContext *ctx) { ResampleContext *s = ctx->priv; @@ -52,6 +77,7 @@ static av_cold void uninit(AVFilterContext *ctx) avresample_close(s->avr); avresample_free(&s->avr); } + av_dict_free(&s->options); } static int query_formats(AVFilterContext *ctx) @@ -103,6 +129,14 @@ static int config_output(AVFilterLink *outlink) if (!(s->avr = avresample_alloc_context())) return AVERROR(ENOMEM); + if (s->options) { + AVDictionaryEntry *e = NULL; + while ((e = av_dict_get(s->options, "", e, AV_DICT_IGNORE_SUFFIX))) + av_log(ctx, AV_LOG_VERBOSE, "lavr option: %s=%s\n", e->key, e->value); + + av_opt_set_dict(s->avr, &s->options); + } + av_opt_set_int(s->avr, "in_channel_layout", inlink ->channel_layout, 0); av_opt_set_int(s->avr, "out_channel_layout", outlink->channel_layout, 0); av_opt_set_int(s->avr, "in_sample_fmt", inlink ->format, 0); @@ -264,6 +298,7 @@ AVFilter avfilter_af_resample = { .description = NULL_IF_CONFIG_SMALL("Audio resampling and conversion."), .priv_size = sizeof(ResampleContext), + .init = init, .uninit = uninit, .query_formats = query_formats, diff --git a/libavfilter/avfiltergraph.c b/libavfilter/avfiltergraph.c index f5c9984b6a..97af5d0323 100644 --- a/libavfilter/avfiltergraph.c +++ b/libavfilter/avfiltergraph.c @@ -54,6 +54,7 @@ void avfilter_graph_free(AVFilterGraph **graph) for (; (*graph)->filter_count > 0; (*graph)->filter_count--) avfilter_free((*graph)->filters[(*graph)->filter_count - 1]); av_freep(&(*graph)->scale_sws_opts); + av_freep(&(*graph)->resample_lavr_opts); av_freep(&(*graph)->filters); av_freep(graph); } @@ -235,8 +236,13 @@ static int query_formats(AVFilterGraph *graph, AVClass *log_ctx) snprintf(inst_name, sizeof(inst_name), "auto-inserted resampler %d", resampler_count++); + scale_args[0] = '\0'; + if (graph->resample_lavr_opts) + snprintf(scale_args, sizeof(scale_args), "%s", + graph->resample_lavr_opts); if ((ret = avfilter_graph_create_filter(&convert, filter, - inst_name, NULL, NULL, graph)) < 0) + inst_name, scale_args, + NULL, graph)) < 0) return ret; break; default: diff --git a/libavfilter/avfiltergraph.h b/libavfilter/avfiltergraph.h index 7c4672dbc9..62308982d0 100644 --- a/libavfilter/avfiltergraph.h +++ b/libavfilter/avfiltergraph.h @@ -31,6 +31,7 @@ typedef struct AVFilterGraph { AVFilterContext **filters; char *scale_sws_opts; ///< sws options to use for the auto-inserted scale filters + char *resample_lavr_opts; ///< libavresample options to use for the auto-inserted resample filters } AVFilterGraph; /** diff --git a/libavfilter/version.h b/libavfilter/version.h index c09d44bb0e..b62f25c1d9 100644 --- a/libavfilter/version.h +++ b/libavfilter/version.h @@ -29,7 +29,7 @@ #include "libavutil/avutil.h" #define LIBAVFILTER_VERSION_MAJOR 3 -#define LIBAVFILTER_VERSION_MINOR 3 +#define LIBAVFILTER_VERSION_MINOR 4 #define LIBAVFILTER_VERSION_MICRO 0 #define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \