From 64ce15b9f433a59e11183fddc89324ca0afcb2b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20B=C5=93sch?= Date: Thu, 11 Apr 2013 16:49:33 +0200 Subject: lavfi/aevalsrc: switch to an AVOptions-based system. --- doc/filters.texi | 21 ++++++++------------- libavfilter/asrc_aevalsrc.c | 22 ++++++---------------- libavfilter/avfilter.c | 19 +++++++++++++++++-- tests/Makefile | 2 +- 4 files changed, 32 insertions(+), 32 deletions(-) diff --git a/doc/filters.texi b/doc/filters.texi index 43de9cc..d6b9ca1 100644 --- a/doc/filters.texi +++ b/doc/filters.texi @@ -1496,18 +1496,13 @@ This source accepts in input one or more expressions (one for each channel), which are evaluated and used to generate a corresponding audio signal. -It accepts the syntax: @var{exprs}[::@var{options}]. -@var{exprs} is a list of expressions separated by ":", one for each -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 ":". - -The description of the accepted options follows. +This source accepts the following options: @table @option +@item exprs +Set the '|'-separated expressions list for each separate channel. In case the +@option{channel_layout} option is not specified, the selected channel layout +depends on the number of provided expressions. @item channel_layout, c Set the channel layout. The number of channels in the specified layout @@ -1558,14 +1553,14 @@ aevalsrc=0 Generate a sin signal with frequency of 440 Hz, set sample rate to 8000 Hz: @example -aevalsrc="sin(440*2*PI*t)::s=8000" +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" +aevalsrc="sin(420*2*PI*t)|cos(430*2*PI*t):c=FC|BC" @end example @item @@ -1583,7 +1578,7 @@ aevalsrc="sin(10*2*PI*t)*sin(880*2*PI*t)" @item Generate 2.5 Hz binaural beats on a 360 Hz carrier: @example -aevalsrc="0.1*sin(2*PI*(360-2.5/2)*t) : 0.1*sin(2*PI*(360+2.5/2)*t)" +aevalsrc="0.1*sin(2*PI*(360-2.5/2)*t) | 0.1*sin(2*PI*(360+2.5/2)*t)" @end example @end itemize diff --git a/libavfilter/asrc_aevalsrc.c b/libavfilter/asrc_aevalsrc.c index 0dbfdd2..86e29cc 100644 --- a/libavfilter/asrc_aevalsrc.c +++ b/libavfilter/asrc_aevalsrc.c @@ -56,7 +56,7 @@ typedef struct { int nb_channels; int64_t pts; AVExpr *expr[8]; - char *expr_str[8]; + char *exprs; int nb_samples; ///< number of samples per requested frame char *duration_str; ///< total duration of the generated audio double duration; @@ -68,6 +68,7 @@ typedef struct { #define FLAGS AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_FILTERING_PARAM static const AVOption aevalsrc_options[]= { + { "exprs", "set the '|'-separated list of channels expressions", OFFSET(exprs), AV_OPT_TYPE_STRING, {.str = NULL}, .flags = FLAGS }, { "nb_samples", "set the number of samples per requested frame", OFFSET(nb_samples), AV_OPT_TYPE_INT, {.i64 = 1024}, 0, INT_MAX, FLAGS }, { "n", "set the number of samples per requested frame", OFFSET(nb_samples), AV_OPT_TYPE_INT, {.i64 = 1024}, 0, INT_MAX, FLAGS }, { "sample_rate", "set the sample rate", OFFSET(sample_rate_str), AV_OPT_TYPE_STRING, {.str = "44100"}, CHAR_MIN, CHAR_MAX, FLAGS }, @@ -84,15 +85,12 @@ AVFILTER_DEFINE_CLASS(aevalsrc); static int init(AVFilterContext *ctx, const char *args) { EvalContext *eval = ctx->priv; - char *args1 = av_strdup(args); - char *expr, *buf, *bufptr; + char *args1 = av_strdup(eval->exprs); + char *expr, *buf; int ret, i; - eval->class = &aevalsrc_class; - av_opt_set_defaults(eval); - if (!args1) { - av_log(ctx, AV_LOG_ERROR, "Argument is empty\n"); + av_log(ctx, AV_LOG_ERROR, "Channels expressions list is empty\n"); ret = args ? AVERROR(ENOMEM) : AVERROR(EINVAL); goto end; } @@ -100,23 +98,15 @@ static int init(AVFilterContext *ctx, const char *args) /* parse expressions */ buf = args1; i = 0; - while (expr = av_strtok(buf, ":", &bufptr)) { + while (i < FF_ARRAY_ELEMS(eval->expr) && (expr = av_strtok(buf, "|", &buf))) { ret = av_expr_parse(&eval->expr[i], expr, var_names, NULL, NULL, NULL, NULL, 0, ctx); if (ret < 0) goto end; i++; - if (bufptr && *bufptr == ':') { /* found last expression */ - bufptr++; - break; - } - 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); diff --git a/libavfilter/avfilter.c b/libavfilter/avfilter.c index 3f69836..18efe80 100644 --- a/libavfilter/avfilter.c +++ b/libavfilter/avfilter.c @@ -674,7 +674,6 @@ static int process_options(AVFilterContext *ctx, AVDictionary **options, static const char *const filters_left_to_update[] = { "abuffer", "aconvert", - "aevalsrc", "amerge", "aresample", "atempo", @@ -757,7 +756,8 @@ int avfilter_init_filter(AVFilterContext *filter, const char *args, void *opaque !strcmp(filter->filter->name, "frei0r") || !strcmp(filter->filter->name, "frei0r_src") || !strcmp(filter->filter->name, "ocv") || - !strcmp(filter->filter->name, "pp")) { + !strcmp(filter->filter->name, "pp") || + !strcmp(filter->filter->name, "aevalsrc")) { /* a hack for compatibility with the old syntax * replace colons with |s */ char *copy = av_strdup(args); @@ -789,9 +789,24 @@ int avfilter_init_filter(AVFilterContext *filter, const char *args, void *opaque "'|' to separate the list items.\n"); } + if (!strcmp(filter->filter->name, "aevalsrc")) { + while ((p = strchr(p, ':')) && p[1] != ':') { + const char *epos = strchr(p + 1, '='); + const char *spos = strchr(p + 1, ':'); + const int next_token_is_opt = epos && (!spos || epos < spos); + if (next_token_is_opt) { + p++; + break; + } + *p++ = '|'; + } + if (p && *p == ':') + memmove(p, p + 1, strlen(p)); + } else while ((p = strchr(p, ':'))) *p++ = '|'; + av_log(filter, AV_LOG_DEBUG, "compat: called with args=[%s]\n", copy); ret = process_options(filter, &options, copy); av_freep(©); diff --git a/tests/Makefile b/tests/Makefile index 08a8581..2784666 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -32,7 +32,7 @@ tests/data/vsynth2.yuv: tests/rotozoom$(HOSTEXESUF) | tests/data tests/data/ffprobe-test.nut: ffmpeg$(EXESUF) | tests/data $(M)$(TARGET_EXEC) ./$< \ - -f lavfi -i "aevalsrc=sin(400*PI*2*t)::d=0.125[out0]; testsrc=d=0.125[out1]; testsrc=s=100x100:d=0.125[out2]" \ + -f lavfi -i "aevalsrc=sin(400*PI*2*t):d=0.125[out0]; testsrc=d=0.125[out1]; testsrc=s=100x100:d=0.125[out2]" \ -f ffmetadata -i $(SRC_PATH)/tests/test.ffmeta \ -flags +bitexact -map 0:0 -map 0:1 -map 0:2 -map_metadata 1 \ -map_metadata:s:0 1:s:0 -map_metadata:s:1 1:s:1 \ -- cgit v1.1