lavfi/aevalsrc: duplicate last expression for the missing channels
authorStefano Sabatini <stefasab@gmail.com>
Fri, 6 Dec 2013 09:26:11 +0000 (10:26 +0100)
committerStefano Sabatini <stefasab@gmail.com>
Fri, 6 Dec 2013 09:51:12 +0000 (10:51 +0100)
Use last expression for the missing channel expressions in case the
channel layout was specified. Enhance flexibility.

doc/filters.texi
libavfilter/asrc_aevalsrc.c
libavfilter/version.h

index 8329bf0..76394de 100644 (file)
@@ -1896,7 +1896,8 @@ This source accepts the following options:
 @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.
+depends on the number of provided expressions. Otherwise the last
+specified expression is applied to the remaining output channels.
 
 @item channel_layout, c
 Set the channel layout. The number of channels in the specified layout
index 41ad632..9bf9675 100644 (file)
@@ -85,7 +85,7 @@ static av_cold int init(AVFilterContext *ctx)
 {
     EvalContext *eval = ctx->priv;
     char *args1 = av_strdup(eval->exprs);
-    char *expr, *buf;
+    char *expr, *last_expr, *buf;
     int ret;
 
     if (!args1) {
@@ -94,27 +94,39 @@ static av_cold int init(AVFilterContext *ctx)
         goto end;
     }
 
+#define ADD_EXPRESSION(expr_) do {                                      \
+        if (!av_dynarray2_add((void **)&eval->expr, &eval->nb_channels, \
+                              sizeof(*eval->expr), NULL)) {             \
+            ret = AVERROR(ENOMEM);                                      \
+            goto end;                                                   \
+        }                                                               \
+        eval->expr[eval->nb_channels-1] = NULL;                         \
+        ret = av_expr_parse(&eval->expr[eval->nb_channels - 1], expr_,  \
+                            var_names, NULL, NULL,                      \
+                            NULL, NULL, 0, ctx);                        \
+        if (ret < 0)                                                    \
+            goto end;                                                   \
+    } while (0)
+
     /* parse expressions */
     buf = args1;
     while (expr = av_strtok(buf, "|", &buf)) {
-        if (!av_dynarray2_add((void **)&eval->expr, &eval->nb_channels, sizeof(*eval->expr), NULL)) {
-            ret = AVERROR(ENOMEM);
-            goto end;
-        }
-        eval->expr[eval->nb_channels-1] = NULL;
-        ret = av_expr_parse(&eval->expr[eval->nb_channels - 1], expr, var_names,
-                            NULL, NULL, NULL, NULL, 0, ctx);
-        if (ret < 0)
-            goto end;
+        ADD_EXPRESSION(expr);
+        last_expr = expr;
     }
 
     if (eval->chlayout_str) {
-        int n;
+        int i, n;
         ret = ff_parse_channel_layout(&eval->chlayout, NULL, eval->chlayout_str, ctx);
         if (ret < 0)
             goto end;
 
         n = av_get_channel_layout_nb_channels(eval->chlayout);
+        if (n > eval->nb_channels) {
+            for (i = eval->nb_channels; i < n; i++)
+                ADD_EXPRESSION(last_expr);
+        }
+
         if (n != eval->nb_channels) {
             av_log(ctx, AV_LOG_ERROR,
                    "Mismatch between the specified number of channels '%d' "
index bbc1208..17c6563 100644 (file)
@@ -31,7 +31,7 @@
 
 #define LIBAVFILTER_VERSION_MAJOR  3
 #define LIBAVFILTER_VERSION_MINOR  91
-#define LIBAVFILTER_VERSION_MICRO 100
+#define LIBAVFILTER_VERSION_MICRO 101
 
 #define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \
                                                LIBAVFILTER_VERSION_MINOR, \