Commit d492907e authored by Paul B Mahol's avatar Paul B Mahol

avfilter/af_amix: fix filtering if specified weights are negative

parent 2a546fb7
...@@ -212,21 +212,21 @@ static void calculate_scales(MixContext *s, int nb_samples) ...@@ -212,21 +212,21 @@ static void calculate_scales(MixContext *s, int nb_samples)
for (i = 0; i < s->nb_inputs; i++) for (i = 0; i < s->nb_inputs; i++)
if (s->input_state[i] & INPUT_ON) 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++) { for (i = 0; i < s->nb_inputs; i++) {
if (s->input_state[i] & INPUT_ON) { if (s->input_state[i] & INPUT_ON) {
if (s->scale_norm[i] > weight_sum / s->weights[i]) { if (s->scale_norm[i] > weight_sum / FFABS(s->weights[i])) {
s->scale_norm[i] -= ((s->weight_sum / s->weights[i]) / s->nb_inputs) * s->scale_norm[i] -= ((s->weight_sum / FFABS(s->weights[i])) / s->nb_inputs) *
nb_samples / (s->dropout_transition * s->sample_rate); 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++) { for (i = 0; i < s->nb_inputs; i++) {
if (s->input_state[i] & INPUT_ON) 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 else
s->input_scale[i] = 0.0f; s->input_scale[i] = 0.0f;
} }
...@@ -270,7 +270,7 @@ static int config_output(AVFilterLink *outlink) ...@@ -270,7 +270,7 @@ static int config_output(AVFilterLink *outlink)
if (!s->input_scale || !s->scale_norm) if (!s->input_scale || !s->scale_norm)
return AVERROR(ENOMEM); return AVERROR(ENOMEM);
for (i = 0; i < s->nb_inputs; i++) 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); calculate_scales(s, 0);
av_get_channel_layout_string(buf, sizeof(buf), -1, outlink->channel_layout); av_get_channel_layout_string(buf, sizeof(buf), -1, outlink->channel_layout);
...@@ -540,12 +540,12 @@ static av_cold int init(AVFilterContext *ctx) ...@@ -540,12 +540,12 @@ static av_cold int init(AVFilterContext *ctx)
p = NULL; p = NULL;
sscanf(arg, "%f", &last_weight); sscanf(arg, "%f", &last_weight);
s->weights[i] = last_weight; s->weights[i] = last_weight;
s->weight_sum += last_weight; s->weight_sum += FFABS(last_weight);
} }
for (; i < s->nb_inputs; i++) { for (; i < s->nb_inputs; i++) {
s->weights[i] = last_weight; s->weights[i] = last_weight;
s->weight_sum += last_weight; s->weight_sum += FFABS(last_weight);
} }
return 0; return 0;
......
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