[PR] avfilter/f_ebur128: fix top-back channel weighting (PR #24024)

AYOUB NABIL BOUBAGRAT via ffmpeg-devel <[email protected]> Wed, 05 Aug 2026 17:43:30 -0000
Newsgroups gmane.comp.video.ffmpeg.devel
Message-ID <178595181155.59.12817067371164676243@29965ddac10e>
PR #24024 opened by AYOUB NABIL BOUBAGRAT (ayoubnabil)
URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/24024
Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/24024.patch

ITU-R BS.1770 assigns a weight of 1.0 to height channels, but the
filter included the top-back channels in the 1.41 surround mask.

remove the top-back channels from that mask and add a FATE test for
the resulting loudness measurement.

fixes #23968.


>From c0709674259bed377142a2a0013e3ab588515f99 Mon Sep 17 00:00:00 2001
From: Ayoub Nabil <[email protected]>
Date: Wed, 5 Aug 2026 19:35:50 +0200
Subject: [PATCH] avfilter/f_ebur128: fix top-back channel weighting

ITU-R BS.1770 assigns a weight of 1.0 to height channels, but the
filter included the top-back channels in the 1.41 surround mask.

remove the top-back channels from that mask and add a FATE test for
the resulting loudness measurement.

fixes #23968.

Signed-off-by: Ayoub Nabil <[email protected]>
---
 libavfilter/f_ebur128.c                       | 11 ++++++-----
 tests/fate/filter-video.mak                   |  4 ++++
 tests/ref/fate/filter-metadata-ebur128-height |  4 ++++
 3 files changed, 14 insertions(+), 5 deletions(-)
 create mode 100644 tests/ref/fate/filter-metadata-ebur128-height

diff --git a/libavfilter/f_ebur128.c b/libavfilter/f_ebur128.c
index e6c2132fca..f2744fb8e6 100644
--- a/libavfilter/f_ebur128.c
+++ b/libavfilter/f_ebur128.c
@@ -433,10 +433,11 @@ static int config_audio_output(AVFilterLink *outlink)
     EBUR128Context *ebur128 = ctx->priv;
     const int nb_channels = outlink->ch_layout.nb_channels;
 
-#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_SIDE_LEFT                          |AV_CH_SIDE_RIGHT| \
-                   AV_CH_SURROUND_DIRECT_LEFT               |AV_CH_SURROUND_DIRECT_RIGHT)
+    /* Height channels always use a weight of 1.0 in ITU-R BS.1770. */
+#define WEIGHT_1_41_MASK (AV_CH_BACK_LEFT             |AV_CH_BACK_CENTER          | \
+                          AV_CH_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->dsp.y        = av_calloc(nb_channels, 3 * sizeof(*ebur128->dsp.y));
@@ -470,7 +471,7 @@ static int config_audio_output(AVFilterLink *outlink)
         const enum AVChannel chl = av_channel_layout_channel_from_index(&outlink->ch_layout, i);
         if (chl == AV_CHAN_LOW_FREQUENCY || chl == AV_CHAN_LOW_FREQUENCY_2) {
             ebur128->ch_weighting[i] = 0;
-        } else if (chl < 64 && (1ULL << chl) & BACK_MASK) {
+        } else if (chl < 64 && (1ULL << chl) & WEIGHT_1_41_MASK) {
             ebur128->ch_weighting[i] = 1.41;
         } else {
             ebur128->ch_weighting[i] = 1.0;
diff --git a/tests/fate/filter-video.mak b/tests/fate/filter-video.mak
index 0eb2e7076c..039c08f182 100644
--- a/tests/fate/filter-video.mak
+++ b/tests/fate/filter-video.mak
@@ -833,6 +833,10 @@ FATE_METADATA_FILTER-$(call ALLYES, $(EBUR128_METADATA_DEPS)) += fate-filter-met
 fate-filter-metadata-ebur128: SRC = $(TARGET_SAMPLES)/filter/seq-3341-7_seq-3342-5-24bit.flac
 fate-filter-metadata-ebur128: CMD = run $(FILTER_METADATA_COMMAND) "amovie='$(SRC)',ebur128=metadata=1"
 
+EBUR128_HEIGHT_DEPS = FFPROBE LAVFI_INDEV AEVALSRC_FILTER EBUR128_FILTER
+FATE_FILTER_FFPROBE-$(call ALLYES, $(EBUR128_HEIGHT_DEPS)) += fate-filter-metadata-ebur128-height
+fate-filter-metadata-ebur128-height: CMD = run $(FILTER_METADATA_COMMAND) "aevalsrc=0.12589*sin(2*PI*997*t):channel_layout=TBL:sample_rate=48000:duration=0.4,ebur128=metadata=1"
+
 READVITC_METADATA_DEPS = LAVFI_INDEV MOVIE_FILTER \
                          AVI_DEMUXER FFVHUFF_DECODER READVITC_FILTER
 FATE_METADATA_FILTER-$(call ALLYES, $(READVITC_METADATA_DEPS)) += fate-filter-metadata-readvitc-def
diff --git a/tests/ref/fate/filter-metadata-ebur128-height b/tests/ref/fate/filter-metadata-ebur128-height
new file mode 100644
index 0000000000..f182793368
--- /dev/null
+++ b/tests/ref/fate/filter-metadata-ebur128-height
@@ -0,0 +1,4 @@
+pts=0|tag:lavfi.r128.M=-120.691|tag:lavfi.r128.S=-120.691|tag:lavfi.r128.I=-70.000|tag:lavfi.r128.LRA=0.000|tag:lavfi.r128.LRA.low=0.000|tag:lavfi.r128.LRA.high=0.000
+pts=4800|tag:lavfi.r128.M=-120.691|tag:lavfi.r128.S=-120.691|tag:lavfi.r128.I=-70.000|tag:lavfi.r128.LRA=0.000|tag:lavfi.r128.LRA.low=0.000|tag:lavfi.r128.LRA.high=0.000
+pts=9600|tag:lavfi.r128.M=-120.691|tag:lavfi.r128.S=-120.691|tag:lavfi.r128.I=-70.000|tag:lavfi.r128.LRA=0.000|tag:lavfi.r128.LRA.low=0.000|tag:lavfi.r128.LRA.high=0.000
+pts=14400|tag:lavfi.r128.M=-21.010|tag:lavfi.r128.S=-120.691|tag:lavfi.r128.I=-21.010|tag:lavfi.r128.LRA=0.000|tag:lavfi.r128.LRA.low=0.000|tag:lavfi.r128.LRA.high=0.000
-- 
2.52.0

_______________________________________________
ffmpeg-devel mailing list -- [email protected]
To unsubscribe send an email to [email protected]