[FFmpeg-devel] [PATCH] avfilter/af_amix: add sum option
Paul B Mahol
onemda at gmail.com
Wed Feb 3 21:40:25 EET 2021
Signed-off-by: Paul B Mahol <onemda at gmail.com>
---
doc/filters.texi | 6 ++++++
libavfilter/af_amix.c | 13 ++++++++++---
2 files changed, 16 insertions(+), 3 deletions(-)
diff --git a/doc/filters.texi b/doc/filters.texi
index 2d85a414ec..b4c4e330f4 100644
--- a/doc/filters.texi
+++ b/doc/filters.texi
@@ -1879,6 +1879,11 @@ stream ends. The default value is 2 seconds.
@item weights
Specify weight of each input audio stream as sequence.
Each weight is separated by space. By default all inputs have same weight.
+
+ at item sum
+Do not scale inputs but instead do only summation of samples.
+Beware of heavy clipping if inputs are not normalized prior to filtering.
+By default is disabled.
@end table
@subsection Commands
@@ -1886,6 +1891,7 @@ Each weight is separated by space. By default all inputs have same weight.
This filter supports the following commands:
@table @option
@item weights
+ at item sum
Syntax is same as option with same name.
@end table
diff --git a/libavfilter/af_amix.c b/libavfilter/af_amix.c
index c4d8916a57..beaf7bcada 100644
--- a/libavfilter/af_amix.c
+++ b/libavfilter/af_amix.c
@@ -164,6 +164,7 @@ typedef struct MixContext {
int duration_mode; /**< mode for determining duration */
float dropout_transition; /**< transition time when an input drops out */
char *weights_str; /**< string for custom weights for every input */
+ int sum; /**< inputs are not scaled, only added */
int nb_channels; /**< number of channels */
int sample_rate; /**< sample rate */
@@ -195,6 +196,8 @@ static const AVOption amix_options[] = {
OFFSET(dropout_transition), AV_OPT_TYPE_FLOAT, { .dbl = 2.0 }, 0, INT_MAX, A|F },
{ "weights", "Set weight for each input.",
OFFSET(weights_str), AV_OPT_TYPE_STRING, {.str="1 1"}, 0, 0, A|F|T },
+ { "sum", "Do not scale inputs instead do only sum",
+ OFFSET(sum), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, A|F|T },
{ NULL }
};
@@ -227,10 +230,14 @@ static void calculate_scales(MixContext *s, int nb_samples)
}
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] * FFSIGN(s->weights[i]);
- else
+ if (s->input_state[i] & INPUT_ON) {
+ if (s->sum)
+ s->input_scale[i] = 1.0f;
+ else
+ s->input_scale[i] = 1.0f / s->scale_norm[i] * FFSIGN(s->weights[i]);
+ } else {
s->input_scale[i] = 0.0f;
+ }
}
}
--
2.17.1
More information about the ffmpeg-devel
mailing list