ffmpeg | branch: master | LoRd_MuldeR <[email protected]> | Tue Aug  2 19:50:26 
2016 +0200| [8ab200fb8adedc98f935a80539f65bd62136e44f] | committer: Paul B Mahol

avfilter/af_dynaudnorm: improve pre-filling code

In order to avoid possible clipping at the very
beginning. Especially apparent when "alternative"
boundary mode is used.

Adopted from original commit by committer.

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

 libavfilter/af_dynaudnorm.c | 21 +++++++++++++++------
 1 file changed, 15 insertions(+), 6 deletions(-)

diff --git a/libavfilter/af_dynaudnorm.c b/libavfilter/af_dynaudnorm.c
index 1dd221c..6801209 100644
--- a/libavfilter/af_dynaudnorm.c
+++ b/libavfilter/af_dynaudnorm.c
@@ -439,15 +439,12 @@ static void 
update_gain_history(DynamicAudioNormalizerContext *s, int channel,
     if (cqueue_empty(s->gain_history_original[channel]) ||
         cqueue_empty(s->gain_history_minimum[channel])) {
         const int pre_fill_size = s->filter_size / 2;
+        const double initial_value = s->alt_boundary_mode ? 
current_gain_factor : 1.0;
 
-        s->prev_amplification_factor[channel] = s->alt_boundary_mode ? 
current_gain_factor : 1.0;
+        s->prev_amplification_factor[channel] = initial_value;
 
         while (cqueue_size(s->gain_history_original[channel]) < pre_fill_size) 
{
-            cqueue_enqueue(s->gain_history_original[channel], 
s->alt_boundary_mode ? current_gain_factor : 1.0);
-        }
-
-        while (cqueue_size(s->gain_history_minimum[channel]) < pre_fill_size) {
-            cqueue_enqueue(s->gain_history_minimum[channel], 
s->alt_boundary_mode ? current_gain_factor : 1.0);
+            cqueue_enqueue(s->gain_history_original[channel], initial_value);
         }
     }
 
@@ -456,6 +453,18 @@ static void 
update_gain_history(DynamicAudioNormalizerContext *s, int channel,
     while (cqueue_size(s->gain_history_original[channel]) >= s->filter_size) {
         double minimum;
         av_assert0(cqueue_size(s->gain_history_original[channel]) == 
s->filter_size);
+
+        if (cqueue_empty(s->gain_history_minimum[channel])) {
+            const int pre_fill_size = s->filter_size / 2;
+            double initial_value = s->alt_boundary_mode ? 
cqueue_peek(s->gain_history_original[channel], 0) : 1.0;
+            int input = pre_fill_size;
+
+            while (cqueue_size(s->gain_history_minimum[channel]) < 
pre_fill_size) {
+                initial_value = FFMIN(initial_value, 
cqueue_peek(s->gain_history_original[channel], ++input));
+                cqueue_enqueue(s->gain_history_minimum[channel], 
initial_value);
+            }
+        }
+
         minimum = minimum_filter(s->gain_history_original[channel]);
 
         cqueue_enqueue(s->gain_history_minimum[channel], minimum);

_______________________________________________
ffmpeg-cvslog mailing list
[email protected]
http://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog

Reply via email to