Browse Source

lavfi/aevalsrc: add option channel_layout

Allow to explicitly specify the channel layout to select.
tags/n0.11
Stefano Sabatini 13 years ago
parent
commit
e1a8df70a2
3 changed files with 40 additions and 7 deletions
  1. +14
    -2
      doc/filters.texi
  2. +25
    -4
      libavfilter/asrc_aevalsrc.c
  3. +1
    -1
      libavfilter/version.h

+ 14
- 2
doc/filters.texi View File

@@ -606,8 +606,9 @@ audio signal.


It accepts the syntax: @var{exprs}[::@var{options}]. It accepts the syntax: @var{exprs}[::@var{options}].
@var{exprs} is a list of expressions separated by ":", one for each @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, @var{options} is an optional sequence of @var{key}=@var{value} pairs,
separated by ":". separated by ":".
@@ -616,6 +617,10 @@ The description of the accepted options follows.


@table @option @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 @item duration, d
Set the minimum duration of the sourced audio. See the function Set the minimum duration of the sourced audio. See the function
@code{av_parse_time()} for the accepted format. @code{av_parse_time()} for the accepted format.
@@ -666,6 +671,13 @@ Generate a sin signal with frequency of 440 Hz, set sample rate to
aevalsrc="sin(440*2*PI*t)::s=8000" aevalsrc="sin(440*2*PI*t)::s=8000"
@end example @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 @item
Generate white noise: Generate white noise:
@example @example


+ 25
- 4
libavfilter/asrc_aevalsrc.c View File

@@ -52,6 +52,7 @@ typedef struct {
char *sample_rate_str; char *sample_rate_str;
int sample_rate; int sample_rate;
int64_t chlayout; int64_t chlayout;
char *chlayout_str;
int nb_channels; int nb_channels;
int64_t pts; int64_t pts;
AVExpr *expr[8]; 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 }, { "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 }, { "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 }, { "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}, {NULL},
}; };


@@ -111,9 +114,28 @@ static int init(AVFilterContext *ctx, const char *args, void *opaque)
} }
buf = NULL; 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 */ /* guess channel layout from nb expressions/channels */
eval->nb_channels = i;
eval->chlayout = av_get_default_channel_layout(eval->nb_channels); eval->chlayout = av_get_default_channel_layout(eval->nb_channels);
if (!eval->chlayout) { if (!eval->chlayout) {
av_log(ctx, AV_LOG_ERROR, "Invalid number of channels '%d' provided\n", 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); ret = AVERROR(EINVAL);
goto end; 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))) if ((ret = ff_parse_sample_rate(&eval->sample_rate, eval->sample_rate_str, ctx)))
goto end; goto end;
@@ -153,6 +173,7 @@ static void uninit(AVFilterContext *ctx)
av_expr_free(eval->expr[i]); av_expr_free(eval->expr[i]);
eval->expr[i] = NULL; eval->expr[i] = NULL;
} }
av_freep(&eval->chlayout_str);
av_freep(&eval->duration_str); av_freep(&eval->duration_str);
av_freep(&eval->sample_rate_str); av_freep(&eval->sample_rate_str);
} }


+ 1
- 1
libavfilter/version.h View File

@@ -30,7 +30,7 @@


#define LIBAVFILTER_VERSION_MAJOR 2 #define LIBAVFILTER_VERSION_MAJOR 2
#define LIBAVFILTER_VERSION_MINOR 74 #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, \ #define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \
LIBAVFILTER_VERSION_MINOR, \ LIBAVFILTER_VERSION_MINOR, \


Loading…
Cancel
Save