aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJustin Ruggles <justin.ruggles@gmail.com>2012-12-18 21:27:35 -0500
committerJustin Ruggles <justin.ruggles@gmail.com>2013-02-23 17:07:54 -0500
commit9f1223562e134bac6345a465870b9d56ff7d60cf (patch)
tree4ef2f17b321900ee9a608831ab252c16d9f215d4
parentd7c450436fcb9d3ecf59884a574e7684183e753d (diff)
downloadffmpeg-9f1223562e134bac6345a465870b9d56ff7d60cf.tar.gz
lavfi: connect libavresample options to af_resample via AVFilterGraph
-rw-r--r--doc/APIchanges4
-rw-r--r--libavfilter/af_resample.c35
-rw-r--r--libavfilter/avfiltergraph.c8
-rw-r--r--libavfilter/avfiltergraph.h1
-rw-r--r--libavfilter/version.h2
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, \