[FFmpeg-devel] lavfi/pan: allow negative gain parameters also for other inputs than the first named

Submitted by Moritz Barsnick on Oct. 11, 2016, 10:10 a.m.

Details

Message ID 1476180612-3933-1-git-send-email-barsnick@gmx.net
State Superseded
Headers show

Commit Message

Moritz Barsnick Oct. 11, 2016, 10:10 a.m.
Expands the parser to also accept the separator '-' in addition to
'+', and take the negative sign into consideration.

Signed-off-by: Moritz Barsnick <barsnick@gmx.net>
---
 doc/filters.texi     |  2 +-
 libavfilter/af_pan.c | 11 ++++++++---
 2 files changed, 9 insertions(+), 4 deletions(-)

Comments

Nicolas George Oct. 13, 2016, 9:31 a.m.
Le decadi 20 vendémiaire, an CCXXV, Moritz Barsnick a écrit :
> Expands the parser to also accept the separator '-' in addition to
> '+', and take the negative sign into consideration.
> 
> Signed-off-by: Moritz Barsnick <barsnick@gmx.net>
> ---
>  doc/filters.texi     |  2 +-
>  libavfilter/af_pan.c | 11 ++++++++---
>  2 files changed, 9 insertions(+), 4 deletions(-)
> 
> diff --git a/doc/filters.texi b/doc/filters.texi
> index 4b2f7bf..fb4756e 100644
> --- a/doc/filters.texi
> +++ b/doc/filters.texi
> @@ -3001,7 +3001,7 @@ output channel layout or number of channels
>  
>  @item outdef
>  output channel specification, of the form:
> -"@var{out_name}=[@var{gain}*]@var{in_name}[+[@var{gain}*]@var{in_name}...]"
> +"@var{out_name}=[@var{gain}*]@var{in_name}[(+-)[@var{gain}*]@var{in_name}...]"
>  
>  @item out_name
>  output channel to define, either a channel name (FL, FR, etc.) or a channel
> diff --git a/libavfilter/af_pan.c b/libavfilter/af_pan.c
> index fbd79a5..161097a 100644
> --- a/libavfilter/af_pan.c
> +++ b/libavfilter/af_pan.c
> @@ -102,7 +102,7 @@ static av_cold int init(AVFilterContext *ctx)
>  {
>      PanContext *const pan = ctx->priv;
>      char *arg, *arg0, *tokenizer, *args = av_strdup(pan->args);
> -    int out_ch_id, in_ch_id, len, named, ret;
> +    int out_ch_id, in_ch_id, len, named, ret, sign = 1;
>      int nb_in_channels[2] = { 0, 0 }; // number of unnamed and named input channels
>      double gain;
>  
> @@ -178,15 +178,20 @@ static av_cold int init(AVFilterContext *ctx)
>                  ret = AVERROR(EINVAL);
>                  goto fail;
>              }
> -            pan->gain[out_ch_id][in_ch_id] = gain;
> +            pan->gain[out_ch_id][in_ch_id] = sign * gain;
>              skip_spaces(&arg);
>              if (!*arg)
>                  break;
> -            if (*arg != '+') {
> +            if (*arg == '-') {
> +                sign = -1;
> +            } else if (*arg != '+') {
>                  av_log(ctx, AV_LOG_ERROR, "Syntax error near \"%.8s\"\n", arg);
>                  ret = AVERROR(EINVAL);
>                  goto fail;

>              }
> +            else {

Nit: inconsistent placement of the else clause. Not blocking.

> +                sign = 1;
> +            }
>              arg++;
>          }
>      }

I would have put the "sign = 1" unconditionally before the test for the
delimiter, but this version works too, so LGTM.

Regards,
Moritz Barsnick Oct. 28, 2016, 12:20 p.m.
On Thu, Oct 13, 2016 at 11:31:22 +0200, Nicolas George wrote:
> Nit: inconsistent placement of the else clause. Not blocking.

Fixed, and ping.

Thanks,
Moritz

Patch hide | download patch | download mbox

diff --git a/doc/filters.texi b/doc/filters.texi
index 4b2f7bf..fb4756e 100644
--- a/doc/filters.texi
+++ b/doc/filters.texi
@@ -3001,7 +3001,7 @@  output channel layout or number of channels
 
 @item outdef
 output channel specification, of the form:
-"@var{out_name}=[@var{gain}*]@var{in_name}[+[@var{gain}*]@var{in_name}...]"
+"@var{out_name}=[@var{gain}*]@var{in_name}[(+-)[@var{gain}*]@var{in_name}...]"
 
 @item out_name
 output channel to define, either a channel name (FL, FR, etc.) or a channel
diff --git a/libavfilter/af_pan.c b/libavfilter/af_pan.c
index fbd79a5..161097a 100644
--- a/libavfilter/af_pan.c
+++ b/libavfilter/af_pan.c
@@ -102,7 +102,7 @@  static av_cold int init(AVFilterContext *ctx)
 {
     PanContext *const pan = ctx->priv;
     char *arg, *arg0, *tokenizer, *args = av_strdup(pan->args);
-    int out_ch_id, in_ch_id, len, named, ret;
+    int out_ch_id, in_ch_id, len, named, ret, sign = 1;
     int nb_in_channels[2] = { 0, 0 }; // number of unnamed and named input channels
     double gain;
 
@@ -178,15 +178,20 @@  static av_cold int init(AVFilterContext *ctx)
                 ret = AVERROR(EINVAL);
                 goto fail;
             }
-            pan->gain[out_ch_id][in_ch_id] = gain;
+            pan->gain[out_ch_id][in_ch_id] = sign * gain;
             skip_spaces(&arg);
             if (!*arg)
                 break;
-            if (*arg != '+') {
+            if (*arg == '-') {
+                sign = -1;
+            } else if (*arg != '+') {
                 av_log(ctx, AV_LOG_ERROR, "Syntax error near \"%.8s\"\n", arg);
                 ret = AVERROR(EINVAL);
                 goto fail;
             }
+            else {
+                sign = 1;
+            }
             arg++;
         }
     }