diff options
author | Paul B Mahol <onemda@gmail.com> | 2019-10-03 10:27:56 +0200 |
---|---|---|
committer | Paul B Mahol <onemda@gmail.com> | 2019-10-03 10:27:56 +0200 |
commit | d492907e7817b9ba00c01476e61bf5fb7fae5f6a (patch) | |
tree | 5f60680f1b64228c44b9009560988f0892ecbd32 | |
parent | 2a546fb7d5722c306dd42c715137e5e493b0d5be (diff) | |
download | ffmpeg-d492907e7817b9ba00c01476e61bf5fb7fae5f6a.tar.gz |
avfilter/af_amix: fix filtering if specified weights are negative
-rw-r--r-- | libavfilter/af_amix.c | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/libavfilter/af_amix.c b/libavfilter/af_amix.c index ec2556f920..89a1b0568f 100644 --- a/libavfilter/af_amix.c +++ b/libavfilter/af_amix.c @@ -212,21 +212,21 @@ static void calculate_scales(MixContext *s, int nb_samples) for (i = 0; i < s->nb_inputs; i++) if (s->input_state[i] & INPUT_ON) - weight_sum += s->weights[i]; + weight_sum += FFABS(s->weights[i]); for (i = 0; i < s->nb_inputs; i++) { if (s->input_state[i] & INPUT_ON) { - if (s->scale_norm[i] > weight_sum / s->weights[i]) { - s->scale_norm[i] -= ((s->weight_sum / s->weights[i]) / s->nb_inputs) * + if (s->scale_norm[i] > weight_sum / FFABS(s->weights[i])) { + s->scale_norm[i] -= ((s->weight_sum / FFABS(s->weights[i])) / s->nb_inputs) * nb_samples / (s->dropout_transition * s->sample_rate); - s->scale_norm[i] = FFMAX(s->scale_norm[i], weight_sum / s->weights[i]); + s->scale_norm[i] = FFMAX(s->scale_norm[i], weight_sum / FFABS(s->weights[i])); } } } for (i = 0; i < s->nb_inputs; i++) { if (s->input_state[i] & INPUT_ON) - s->input_scale[i] = 1.0f / s->scale_norm[i]; + s->input_scale[i] = 1.0f / s->scale_norm[i] * FFSIGN(s->weights[i]); else s->input_scale[i] = 0.0f; } @@ -270,7 +270,7 @@ static int config_output(AVFilterLink *outlink) if (!s->input_scale || !s->scale_norm) return AVERROR(ENOMEM); for (i = 0; i < s->nb_inputs; i++) - s->scale_norm[i] = s->weight_sum / s->weights[i]; + s->scale_norm[i] = s->weight_sum / FFABS(s->weights[i]); calculate_scales(s, 0); av_get_channel_layout_string(buf, sizeof(buf), -1, outlink->channel_layout); @@ -540,12 +540,12 @@ static av_cold int init(AVFilterContext *ctx) p = NULL; sscanf(arg, "%f", &last_weight); s->weights[i] = last_weight; - s->weight_sum += last_weight; + s->weight_sum += FFABS(last_weight); } for (; i < s->nb_inputs; i++) { s->weights[i] = last_weight; - s->weight_sum += last_weight; + s->weight_sum += FFABS(last_weight); } return 0; |