aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNicolas George <nicolas.george@normalesup.org>2012-12-26 16:50:57 +0100
committerNicolas George <nicolas.george@normalesup.org>2013-01-26 11:15:38 +0100
commitea645e90a1eaac1f1ea687c0fc034e75b24bf575 (patch)
treed1cb0f6bfc21c9fc733921baaaeac86925fee915
parent19506af788b64c509dad76f37e0a0da63ef34e44 (diff)
downloadffmpeg-ea645e90a1eaac1f1ea687c0fc034e75b24bf575.tar.gz
lavfi/buffersrc: accept unknown channel layouts.
-rw-r--r--doc/filters.texi5
-rw-r--r--libavfilter/buffersrc.c27
2 files changed, 31 insertions, 1 deletions
diff --git a/doc/filters.texi b/doc/filters.texi
index ef10f89baf..b4c57e1a8e 100644
--- a/doc/filters.texi
+++ b/doc/filters.texi
@@ -1060,6 +1060,11 @@ Either a channel layout name from channel_layout_map in
@file{libavutil/channel_layout.c} or its corresponding integer representation
from the AV_CH_LAYOUT_* macros in @file{libavutil/channel_layout.h}
+@item channels
+The number of channels of the incoming audio buffers.
+If both @var{channels} and @var{channel_layout} are specified, then they
+must be consistent.
+
@end table
For example:
diff --git a/libavfilter/buffersrc.c b/libavfilter/buffersrc.c
index 5d0fa92a4b..074d43a674 100644
--- a/libavfilter/buffersrc.c
+++ b/libavfilter/buffersrc.c
@@ -55,6 +55,7 @@ typedef struct {
int sample_rate;
enum AVSampleFormat sample_fmt;
char *sample_fmt_str;
+ int channels;
uint64_t channel_layout;
char *channel_layout_str;
@@ -240,6 +241,7 @@ static const AVOption abuffer_options[] = {
{ "time_base", NULL, OFFSET(time_base), AV_OPT_TYPE_RATIONAL, { .dbl = 0 }, 0, INT_MAX, FLAGS },
{ "sample_rate", NULL, OFFSET(sample_rate), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, FLAGS },
{ "sample_fmt", NULL, OFFSET(sample_fmt_str), AV_OPT_TYPE_STRING, .flags = FLAGS },
+ { "channels", NULL, OFFSET(channels), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, FLAGS },
{ "channel_layout", NULL, OFFSET(channel_layout_str), AV_OPT_TYPE_STRING, .flags = FLAGS },
{ NULL },
};
@@ -265,6 +267,9 @@ static av_cold int init_audio(AVFilterContext *ctx, const char *args)
goto fail;
}
+ if (s->channel_layout_str) {
+ int n;
+ /* TODO reindent */
s->channel_layout = av_get_channel_layout(s->channel_layout_str);
if (!s->channel_layout) {
av_log(ctx, AV_LOG_ERROR, "Invalid channel layout '%s'\n",
@@ -272,6 +277,24 @@ static av_cold int init_audio(AVFilterContext *ctx, const char *args)
ret = AVERROR(EINVAL);
goto fail;
}
+ n = av_get_channel_layout_nb_channels(s->channel_layout);
+ if (s->channels) {
+ if (n != s->channels) {
+ av_log(ctx, AV_LOG_ERROR,
+ "Mismatching channel count %d and layout '%s' "
+ "(%d channels)\n",
+ s->channels, s->channel_layout_str, n);
+ ret = AVERROR(EINVAL);
+ goto fail;
+ }
+ }
+ s->channels = n;
+ } else if (!s->channels) {
+ av_log(ctx, AV_LOG_ERROR, "Neither number of channels nor "
+ "channel layout specified\n");
+ ret = AVERROR(EINVAL);
+ goto fail;
+ }
if (!(s->fifo = av_fifo_alloc(sizeof(AVFilterBufferRef*)))) {
ret = AVERROR(ENOMEM);
@@ -324,7 +347,9 @@ static int query_formats(AVFilterContext *ctx)
ff_add_format(&samplerates, c->sample_rate);
ff_set_common_samplerates(ctx, samplerates);
- ff_add_channel_layout(&channel_layouts, c->channel_layout);
+ ff_add_channel_layout(&channel_layouts,
+ c->channel_layout ? c->channel_layout :
+ FF_COUNT2LAYOUT(c->channels));
ff_set_common_channel_layouts(ctx, channel_layouts);
break;
default: