lavfi/pan: allow negative gain parameters also for other inputs than the first named

Expands the parser to also accept the separator '-' in addition to
'+', and take the negative sign into consideration.

The optional sign for the first factor in the expression is already
covered by parsing for an integer.

Signed-off-by: Moritz Barsnick <barsnick@gmx.net>
Reviewed-by: Nicolas George <george@nsup.org>
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
pull/241/head
Moritz Barsnick 8 years ago committed by Michael Niedermayer
parent 584eea5bf3
commit 0700d02a69
  1. 2
      doc/filters.texi
  2. 10
      libavfilter/af_pan.c

@ -3026,7 +3026,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

@ -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,14 +178,18 @@ 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++;
}

Loading…
Cancel
Save