Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/FFmpeg/FFmpeg.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid A. Sedacca <sedacca@comcast.net>2013-01-20 00:24:53 +0400
committerClément Bœsch <ubitux@gmail.com>2013-02-15 19:38:58 +0400
commitde21e6736e36e913e3172cd678a1cfcb291bf6bb (patch)
treed835584853dc2665fec01cf20b3dbb303782cf73 /libavfilter/f_ebur128.c
parentf98598942f7ff14b8621e6f626acd0ad03c8f610 (diff)
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>
Diffstat (limited to 'libavfilter/f_ebur128.c')
-rw-r--r--libavfilter/f_ebur128.c24
1 files changed, 19 insertions, 5 deletions
diff --git a/libavfilter/f_ebur128.c b/libavfilter/f_ebur128.c
index 85fddad277..02657673f8 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]));