[FFmpeg-cvslog] lavfi/ebur128: fix channel weights

David A. Sedacca git at videolan.org
Fri Feb 15 16:40:02 CET 2013


ffmpeg | branch: master | David A. Sedacca <sedacca at comcast.net> | Sat Jan 19 20:24:53 2013 +0000| [de21e6736e36e913e3172cd678a1cfcb291bf6bb] | committer: Clément Bœsch

lavfi/ebur128: fix channel weights

Correct the recognition of channel layouts for good channel weight
in the loudness computation.
This suggested patch is 2 of 3 for Ticket #2144 "libavfilter ebur128
loudness inaccuracy, irregular time interval, LFE interference".

Signed-off-by: David A. Sedacca <sedacca at comcast.net>

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

 libavfilter/f_ebur128.c |   24 +++++++++++++++++++-----
 1 file changed, 19 insertions(+), 5 deletions(-)

diff --git a/libavfilter/f_ebur128.c b/libavfilter/f_ebur128.c
index 85fddad..0265767 100644
--- a/libavfilter/f_ebur128.c
+++ b/libavfilter/f_ebur128.c
@@ -314,12 +314,15 @@ static int config_video_output(AVFilterLink *outlink)
 static int config_audio_output(AVFilterLink *outlink)
 {
     int i;
+    int idx_bitposn = 0;
     AVFilterContext *ctx = outlink->src;
     EBUR128Context *ebur128 = ctx->priv;
     const int nb_channels = av_get_channel_layout_nb_channels(outlink->channel_layout);
 
 #define BACK_MASK (AV_CH_BACK_LEFT    |AV_CH_BACK_CENTER    |AV_CH_BACK_RIGHT| \
-                   AV_CH_TOP_BACK_LEFT|AV_CH_TOP_BACK_CENTER|AV_CH_TOP_BACK_RIGHT)
+                   AV_CH_TOP_BACK_LEFT|AV_CH_TOP_BACK_CENTER|AV_CH_TOP_BACK_RIGHT| \
+                   AV_CH_SIDE_LEFT                          |AV_CH_SIDE_RIGHT| \
+                   AV_CH_SURROUND_DIRECT_LEFT               |AV_CH_SURROUND_DIRECT_RIGHT)
 
     ebur128->nb_channels  = nb_channels;
     ebur128->ch_weighting = av_calloc(nb_channels, sizeof(*ebur128->ch_weighting));
@@ -328,13 +331,24 @@ static int config_audio_output(AVFilterLink *outlink)
 
     for (i = 0; i < nb_channels; i++) {
 
+        /* find the next bit that is set starting from the right */
+        while ((outlink->channel_layout & 1ULL<<idx_bitposn) == 0 && idx_bitposn < 63)
+            idx_bitposn++;
+
         /* channel weighting */
-        if ((outlink->channel_layout & 1ULL<<i) == AV_CH_LOW_FREQUENCY)
-            continue;
-        if (outlink->channel_layout & 1ULL<<i & BACK_MASK)
+        if ((1ULL<<idx_bitposn & AV_CH_LOW_FREQUENCY) ||
+            (1ULL<<idx_bitposn & AV_CH_LOW_FREQUENCY_2)) {
+            ebur128->ch_weighting[i] = 0;
+        } else if (1ULL<<idx_bitposn & BACK_MASK) {
             ebur128->ch_weighting[i] = 1.41;
-        else
+        } else {
             ebur128->ch_weighting[i] = 1.0;
+        }
+
+        idx_bitposn++;
+
+        if (!ebur128->ch_weighting[i])
+            continue;
 
         /* bins buffer for the two integration window (400ms and 3s) */
         ebur128->i400.cache[i]  = av_calloc(I400_BINS,  sizeof(*ebur128->i400.cache[0]));



More information about the ffmpeg-cvslog mailing list