diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2013-02-24 20:10:55 +0400 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2013-02-24 20:10:55 +0400 |
commit | 71cf094e1be086bce4c535b1fe0d96a0449486ae (patch) | |
tree | c1608e1f7216f00ac1485e6ee6a911ecfbcc0a52 | |
parent | f7c4b76c488b4901133addb3f7875ef3ac4ae9c4 (diff) | |
parent | 9f1223562e134bac6345a465870b9d56ff7d60cf (diff) |
Merge commit '9f1223562e134bac6345a465870b9d56ff7d60cf'
* commit '9f1223562e134bac6345a465870b9d56ff7d60cf':
lavfi: connect libavresample options to af_resample via AVFilterGraph
Conflicts:
doc/APIchanges
libavfilter/avfiltergraph.c
libavfilter/avfiltergraph.h
libavfilter/version.h
Merged-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r-- | doc/APIchanges | 4 | ||||
-rw-r--r-- | libavfilter/af_resample.c | 35 | ||||
-rw-r--r-- | libavfilter/avfiltergraph.c | 8 | ||||
-rw-r--r-- | libavfilter/avfiltergraph.h | 1 | ||||
-rw-r--r-- | libavfilter/version.h | 4 |
5 files changed, 49 insertions, 3 deletions
diff --git a/doc/APIchanges b/doc/APIchanges index 662dc8a409..ca52aa4eef 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -138,6 +138,10 @@ API changes, most recent first: 2012-03-26 - a67d9cf - lavfi 2.66.100 Add avfilter_fill_frame_from_{audio_,}buffer_ref() functions. +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 d0b6b1687f..8b18c6f729 100644 --- a/libavfilter/avfiltergraph.c +++ b/libavfilter/avfiltergraph.c @@ -68,6 +68,7 @@ void avfilter_graph_free(AVFilterGraph **graph) av_freep(&(*graph)->sink_links); av_freep(&(*graph)->scale_sws_opts); av_freep(&(*graph)->aresample_swr_opts); + av_freep(&(*graph)->resample_lavr_opts); av_freep(&(*graph)->filters); av_freep(graph); } @@ -323,8 +324,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->aresample_swr_opts) + snprintf(scale_args, sizeof(scale_args), "%s", + graph->aresample_swr_opts); if ((ret = avfilter_graph_create_filter(&convert, filter, - inst_name, graph->aresample_swr_opts, NULL, graph)) < 0) + inst_name, graph->aresample_swr_opts, + NULL, graph)) < 0) return ret; break; default: diff --git a/libavfilter/avfiltergraph.h b/libavfilter/avfiltergraph.h index 728bbb5c15..3644aa2023 100644 --- a/libavfilter/avfiltergraph.h +++ b/libavfilter/avfiltergraph.h @@ -45,6 +45,7 @@ typedef struct AVFilterGraph { int sink_links_count; unsigned disable_auto_convert; + 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 f3fab7dc4c..a6a2024a24 100644 --- a/libavfilter/version.h +++ b/libavfilter/version.h @@ -29,8 +29,8 @@ #include "libavutil/avutil.h" #define LIBAVFILTER_VERSION_MAJOR 3 -#define LIBAVFILTER_VERSION_MINOR 39 -#define LIBAVFILTER_VERSION_MICRO 101 +#define LIBAVFILTER_VERSION_MINOR 40 +#define LIBAVFILTER_VERSION_MICRO 100 #define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \ LIBAVFILTER_VERSION_MINOR, \ |