Commit 0700d02a authored by Moritz Barsnick's avatar Moritz Barsnick Committed by Michael Niedermayer

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: 's avatarMoritz Barsnick <barsnick@gmx.net>
Reviewed-by: 's avatarNicolas George <george@nsup.org>
Signed-off-by: 's avatarMichael Niedermayer <michael@niedermayer.cc>
parent 584eea5b
...@@ -3026,7 +3026,7 @@ output channel layout or number of channels ...@@ -3026,7 +3026,7 @@ output channel layout or number of channels
@item outdef @item outdef
output channel specification, of the form: 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 @item out_name
output channel to define, either a channel name (FL, FR, etc.) or a channel 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) ...@@ -102,7 +102,7 @@ static av_cold int init(AVFilterContext *ctx)
{ {
PanContext *const pan = ctx->priv; PanContext *const pan = ctx->priv;
char *arg, *arg0, *tokenizer, *args = av_strdup(pan->args); 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 int nb_in_channels[2] = { 0, 0 }; // number of unnamed and named input channels
double gain; double gain;
...@@ -178,14 +178,18 @@ static av_cold int init(AVFilterContext *ctx) ...@@ -178,14 +178,18 @@ static av_cold int init(AVFilterContext *ctx)
ret = AVERROR(EINVAL); ret = AVERROR(EINVAL);
goto fail; goto fail;
} }
pan->gain[out_ch_id][in_ch_id] = gain; pan->gain[out_ch_id][in_ch_id] = sign * gain;
skip_spaces(&arg); skip_spaces(&arg);
if (!*arg) if (!*arg)
break; break;
if (*arg != '+') { if (*arg == '-') {
sign = -1;
} else if (*arg != '+') {
av_log(ctx, AV_LOG_ERROR, "Syntax error near \"%.8s\"\n", arg); av_log(ctx, AV_LOG_ERROR, "Syntax error near \"%.8s\"\n", arg);
ret = AVERROR(EINVAL); ret = AVERROR(EINVAL);
goto fail; goto fail;
} else {
sign = 1;
} }
arg++; arg++;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment