[FFmpeg-cvslog] avfilter/af_afftdn: add way to control noise floor link for >1 channels

Paul B Mahol git at videolan.org
Sun Mar 13 18:27:34 EET 2022


ffmpeg | branch: master | Paul B Mahol <onemda at gmail.com> | Sun Mar 13 16:53:11 2022 +0100| [61224c856c9c7de598970b1aaa7b74b366f9b82a] | committer: Paul B Mahol

avfilter/af_afftdn: add way to control noise floor link for >1 channels

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=61224c856c9c7de598970b1aaa7b74b366f9b82a
---

 doc/filters.texi        | 20 ++++++++++++++++++++
 libavfilter/af_afftdn.c | 35 +++++++++++++++++++++++++++++++++++
 2 files changed, 55 insertions(+)

diff --git a/doc/filters.texi b/doc/filters.texi
index 7a7937ca6c..73081bed4c 100644
--- a/doc/filters.texi
+++ b/doc/filters.texi
@@ -1347,6 +1347,26 @@ Set the adaptivity factor, used how fast to adapt gains adjustments per
 each frequency bin. Value @var{0} enables instant adaptation, while higher values
 react much slower.
 Allowed range is from @var{0} to @var{1}. Default value is @var{0.5}.
+
+ at item noise_link, nl
+Set the noise link used for multichannel audio.
+
+It accepts the following values:
+ at table @option
+ at item none
+Use unchanged channel's noise floor.
+
+ at item min
+Use measured min noise floor of all channels.
+
+ at item max
+Use measured max noise floor of all channels.
+
+ at item average
+Use measured average noise floor of all channels.
+
+Default value is @var{min}.
+ at end table
 @end table
 
 @subsection Commands
diff --git a/libavfilter/af_afftdn.c b/libavfilter/af_afftdn.c
index 726ea4aade..7257de73d3 100644
--- a/libavfilter/af_afftdn.c
+++ b/libavfilter/af_afftdn.c
@@ -41,6 +41,14 @@ enum OutModes {
     NB_MODES
 };
 
+enum NoiseLinkType {
+    NONE_LINK,
+    MIN_LINK,
+    MAX_LINK,
+    AVERAGE_LINK,
+    NB_LINK
+};
+
 enum NoiseType {
     WHITE_NOISE,
     VINYL_NOISE,
@@ -103,6 +111,7 @@ typedef struct AudioFFTDeNoiseContext {
     int     track_noise;
     int     track_residual;
     int     output_mode;
+    int     noise_floor_link;
     float   ratio;
 
     float   last_residual_floor;
@@ -185,6 +194,12 @@ static const AVOption afftdn_options[] = {
     {  "n", "noise",                      0,                       AV_OPT_TYPE_CONST,  {.i64 = NOISE_MODE},    0,  0, AFR, "mode" },
     { "adaptivity", "set adaptivity factor",OFFSET(ratio),         AV_OPT_TYPE_FLOAT,  {.dbl = 0.5},           0,  1, AFR },
     { "ad",         "set adaptivity factor",OFFSET(ratio),         AV_OPT_TYPE_FLOAT,  {.dbl = 0.5},           0,  1, AFR },
+    { "noise_link", "set the noise floor link",OFFSET(noise_floor_link),AV_OPT_TYPE_INT,{.i64 = MIN_LINK},     0,  NB_LINK-1, AFR, "link" },
+    { "nl", "set the noise floor link",        OFFSET(noise_floor_link),AV_OPT_TYPE_INT,{.i64 = MIN_LINK},     0,  NB_LINK-1, AFR, "link" },
+    {  "none",    "none",                 0,                       AV_OPT_TYPE_CONST,  {.i64 = NONE_LINK},     0,  0, AFR, "link" },
+    {  "min",     "min",                  0,                       AV_OPT_TYPE_CONST,  {.i64 = MIN_LINK},      0,  0, AFR, "link" },
+    {  "max",     "max",                  0,                       AV_OPT_TYPE_CONST,  {.i64 = MAX_LINK},      0,  0, AFR, "link" },
+    {  "average", "average",              0,                       AV_OPT_TYPE_CONST,  {.i64 = AVERAGE_LINK},  0,  0, AFR, "link" },
     { NULL }
 };
 
@@ -1103,12 +1118,32 @@ static int output_frame(AVFilterLink *inlink, AVFrame *in)
     }
 
     if (s->track_noise) {
+        double average = 0.0, min = DBL_MAX, max = -DBL_MAX;
+
         for (int ch = 0; ch < inlink->channels; ch++) {
             DeNoiseChannel *dnch = &s->dnch[ch];
             double levels[NB_PROFILE_BANDS];
 
             get_auto_noise_levels(s, dnch, levels);
             set_noise_profile(s, dnch, levels, 0);
+            average += dnch->noise_floor;
+            max = fmax(max, dnch->noise_floor);
+            min = fmin(min, dnch->noise_floor);
+        }
+
+        average /= inlink->channels;
+
+        for (int ch = 0; ch < inlink->channels; ch++) {
+            DeNoiseChannel *dnch = &s->dnch[ch];
+
+            switch (s->noise_floor_link) {
+            case MIN_LINK:     dnch->noise_floor = min;     break;
+            case MAX_LINK:     dnch->noise_floor = max;     break;
+            case AVERAGE_LINK: dnch->noise_floor = average; break;
+            case NONE_LINK:
+            default:
+                break;
+            }
 
             if (dnch->noise_floor != dnch->last_noise_floor)
                 set_parameters(s, dnch, 1, 0);



More information about the ffmpeg-cvslog mailing list