diff options
author | Stefano Sabatini <stefasab@gmail.com> | 2012-05-17 13:01:50 +0200 |
---|---|---|
committer | Stefano Sabatini <stefasab@gmail.com> | 2012-05-18 00:58:41 +0200 |
commit | e1a8df70a2de1e1f2c56d93329b8d793789c179e (patch) | |
tree | 2a2274a9d7175b8920cbe3eb504d67c8abf41f9e | |
parent | cfde7395b1bf4b1b9c37b9fbee76a2e9b61fe55a (diff) | |
download | ffmpeg-e1a8df70a2de1e1f2c56d93329b8d793789c179e.tar.gz |
lavfi/aevalsrc: add option channel_layout
Allow to explicitly specify the channel layout to select.
-rw-r--r-- | doc/filters.texi | 16 | ||||
-rw-r--r-- | libavfilter/asrc_aevalsrc.c | 29 | ||||
-rw-r--r-- | libavfilter/version.h | 2 |
3 files changed, 40 insertions, 7 deletions
diff --git a/doc/filters.texi b/doc/filters.texi index bdb9fe23f9..06374fc5d5 100644 --- a/doc/filters.texi +++ b/doc/filters.texi @@ -606,8 +606,9 @@ audio signal. It accepts the syntax: @var{exprs}[::@var{options}]. @var{exprs} is a list of expressions separated by ":", one for each -separate channel. The output channel layout depends on the number of -provided expressions, up to 8 channels are supported. +separate channel. In case the @var{channel_layout} is not +specified, the selected channel layout depends on the number of +provided expressions. @var{options} is an optional sequence of @var{key}=@var{value} pairs, separated by ":". @@ -616,6 +617,10 @@ The description of the accepted options follows. @table @option +@item channel_layout, c +Set the channel layout. The number of channels in the specified layout +must be equal to the number of specified expressions. + @item duration, d Set the minimum duration of the sourced audio. See the function @code{av_parse_time()} for the accepted format. @@ -667,6 +672,13 @@ aevalsrc="sin(440*2*PI*t)::s=8000" @end example @item +Generate a two channels signal, specify the channel layout (Front +Center + Back Center) explicitly: +@example +aevalsrc="sin(420*2*PI*t):cos(430*2*PI*t)::c=FC|BC" +@end example + +@item Generate white noise: @example aevalsrc="-2+random(0)" diff --git a/libavfilter/asrc_aevalsrc.c b/libavfilter/asrc_aevalsrc.c index 41ccda98c0..e342e91b33 100644 --- a/libavfilter/asrc_aevalsrc.c +++ b/libavfilter/asrc_aevalsrc.c @@ -52,6 +52,7 @@ typedef struct { char *sample_rate_str; int sample_rate; int64_t chlayout; + char *chlayout_str; int nb_channels; int64_t pts; AVExpr *expr[8]; @@ -72,6 +73,8 @@ static const AVOption eval_options[]= { { "s", "set the sample rate", OFFSET(sample_rate_str), AV_OPT_TYPE_STRING, {.str = "44100"}, CHAR_MIN, CHAR_MAX }, { "duration", "set audio duration", OFFSET(duration_str), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0 }, { "d", "set audio duration", OFFSET(duration_str), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0 }, + { "channel_layout", "set channel layout", OFFSET(chlayout_str), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0 }, + { "c", "set channel layout", OFFSET(chlayout_str), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0 }, {NULL}, }; @@ -111,9 +114,28 @@ static int init(AVFilterContext *ctx, const char *args, void *opaque) } buf = NULL; } + eval->nb_channels = i; + + if (bufptr && (ret = av_set_options_string(eval, bufptr, "=", ":")) < 0) + goto end; + + if (eval->chlayout_str) { + int n; + ret = ff_parse_channel_layout(&eval->chlayout, eval->chlayout_str, ctx); + if (ret < 0) + goto end; + n = av_get_channel_layout_nb_channels(eval->chlayout); + if (n != eval->nb_channels) { + av_log(ctx, AV_LOG_ERROR, + "Mismatch between the specified number of channels '%d' " + "and the number of channels '%d' in the specified channel layout '%s'\n", + eval->nb_channels, n, eval->chlayout_str); + ret = AVERROR(EINVAL); + goto end; + } + } else { /* guess channel layout from nb expressions/channels */ - eval->nb_channels = i; eval->chlayout = av_get_default_channel_layout(eval->nb_channels); if (!eval->chlayout) { av_log(ctx, AV_LOG_ERROR, "Invalid number of channels '%d' provided\n", @@ -121,9 +143,7 @@ static int init(AVFilterContext *ctx, const char *args, void *opaque) ret = AVERROR(EINVAL); goto end; } - - if (bufptr && (ret = av_set_options_string(eval, bufptr, "=", ":")) < 0) - goto end; + } if ((ret = ff_parse_sample_rate(&eval->sample_rate, eval->sample_rate_str, ctx))) goto end; @@ -153,6 +173,7 @@ static void uninit(AVFilterContext *ctx) av_expr_free(eval->expr[i]); eval->expr[i] = NULL; } + av_freep(&eval->chlayout_str); av_freep(&eval->duration_str); av_freep(&eval->sample_rate_str); } diff --git a/libavfilter/version.h b/libavfilter/version.h index a47cda238f..c536baba4a 100644 --- a/libavfilter/version.h +++ b/libavfilter/version.h @@ -30,7 +30,7 @@ #define LIBAVFILTER_VERSION_MAJOR 2 #define LIBAVFILTER_VERSION_MINOR 74 -#define LIBAVFILTER_VERSION_MICRO 100 +#define LIBAVFILTER_VERSION_MICRO 101 #define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \ LIBAVFILTER_VERSION_MINOR, \ |