mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
avfilter/af_pan: reject expressions referencing the same channel multiple times
Fixes parsing of expressions like c0=c0+c0 or c0=c0|c0=c1. Previously no error was thrown and for input channels, only the last gain factor was used, for output channels the source channel gains were combined. Signed-off-by: Marton Balint <cus@passwd.hu>
This commit is contained in:
parent
0031eab61c
commit
084ef7d7d5
@ -104,6 +104,7 @@ static av_cold int init(AVFilterContext *ctx)
|
|||||||
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, sign = 1;
|
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
|
||||||
|
int used_out_ch[MAX_CHANNELS] = {0};
|
||||||
double gain;
|
double gain;
|
||||||
|
|
||||||
if (!pan->args) {
|
if (!pan->args) {
|
||||||
@ -127,6 +128,7 @@ static av_cold int init(AVFilterContext *ctx)
|
|||||||
|
|
||||||
/* parse channel specifications */
|
/* parse channel specifications */
|
||||||
while ((arg = arg0 = av_strtok(NULL, "|", &tokenizer))) {
|
while ((arg = arg0 = av_strtok(NULL, "|", &tokenizer))) {
|
||||||
|
int used_in_ch[MAX_CHANNELS] = {0};
|
||||||
/* channel name */
|
/* channel name */
|
||||||
if (parse_channel_name(&arg, &out_ch_id, &named)) {
|
if (parse_channel_name(&arg, &out_ch_id, &named)) {
|
||||||
av_log(ctx, AV_LOG_ERROR,
|
av_log(ctx, AV_LOG_ERROR,
|
||||||
@ -153,6 +155,13 @@ static av_cold int init(AVFilterContext *ctx)
|
|||||||
ret = AVERROR(EINVAL);
|
ret = AVERROR(EINVAL);
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
if (used_out_ch[out_ch_id]) {
|
||||||
|
av_log(ctx, AV_LOG_ERROR,
|
||||||
|
"Can not reference out channel %d twice\n", out_ch_id);
|
||||||
|
ret = AVERROR(EINVAL);
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
used_out_ch[out_ch_id] = 1;
|
||||||
skip_spaces(&arg);
|
skip_spaces(&arg);
|
||||||
if (*arg == '=') {
|
if (*arg == '=') {
|
||||||
arg++;
|
arg++;
|
||||||
@ -184,6 +193,13 @@ static av_cold int init(AVFilterContext *ctx)
|
|||||||
ret = AVERROR(EINVAL);
|
ret = AVERROR(EINVAL);
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
if (used_in_ch[in_ch_id]) {
|
||||||
|
av_log(ctx, AV_LOG_ERROR,
|
||||||
|
"Can not reference in channel %d twice\n", in_ch_id);
|
||||||
|
ret = AVERROR(EINVAL);
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
used_in_ch[in_ch_id] = 1;
|
||||||
pan->gain[out_ch_id][in_ch_id] = sign * gain;
|
pan->gain[out_ch_id][in_ch_id] = sign * gain;
|
||||||
skip_spaces(&arg);
|
skip_spaces(&arg);
|
||||||
if (!*arg)
|
if (!*arg)
|
||||||
|
Loading…
Reference in New Issue
Block a user