[FFmpeg-cvslog] avfilter/f_ebur128: lift sample peak calculation out of main loop
Niklas Haas
git at videolan.org
Sat Jun 21 18:31:23 EEST 2025
ffmpeg | branch: master | Niklas Haas <git at haasn.dev> | Fri Jun 13 17:00:50 2025 +0200| [f362bacd27c82e151b89d9914a4ceaaf14b084a5] | committer: Niklas Haas
avfilter/f_ebur128: lift sample peak calculation out of main loop
This is substantially faster (~55%) than the transposed loop, and also
avoids an unnecessary macro.
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=f362bacd27c82e151b89d9914a4ceaaf14b084a5
---
libavfilter/f_ebur128.c | 38 ++++++++++++++++++--------------------
1 file changed, 18 insertions(+), 20 deletions(-)
diff --git a/libavfilter/f_ebur128.c b/libavfilter/f_ebur128.c
index 23092b597f..4051b1ea95 100644
--- a/libavfilter/f_ebur128.c
+++ b/libavfilter/f_ebur128.c
@@ -687,6 +687,24 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *insamples)
}
#endif
+ if (ebur128->peak_mode & PEAK_MODE_SAMPLES_PEAKS) {
+ double maxpeak = 0.0;
+ for (int ch = 0; ch < nb_channels; ch++) {
+ const double *restrict samples_ch = &samples[ch];
+ double sp = ebur128->sample_peaks[ch];
+
+ for (int i = ebur128->idx_insample; i < nb_samples; i++) {
+ const double sample = fabs(samples_ch[nb_channels * i]);
+ sp = FFMAX(sp, sample);
+ }
+ maxpeak = FFMAX(maxpeak, sp);
+ ebur128->sample_peaks[ch] = sp;
+ }
+
+ ebur128->sample_peak = DBFS(maxpeak);
+ }
+
+
for (idx_insample = ebur128->idx_insample; idx_insample < nb_samples; idx_insample++) {
const int bin_id_400 = ebur128->i400.cache_pos++;
const int bin_id_3000 = ebur128->i3000.cache_pos++;
@@ -707,26 +725,6 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *insamples)
ebur128->i400.sum, ebur128->i3000.sum,
nb_channels);
-#define FIND_PEAK(global, sp, ptype) do { \
- int ch; \
- double maxpeak; \
- maxpeak = 0.0; \
- if (ebur128->peak_mode & PEAK_MODE_ ## ptype ## _PEAKS) { \
- for (ch = 0; ch < ebur128->nb_channels; ch++) \
- maxpeak = FFMAX(maxpeak, sp[ch]); \
- global = DBFS(maxpeak); \
- } \
-} while (0)
-
- if (ebur128->peak_mode & PEAK_MODE_SAMPLES_PEAKS) {
- for (ch = 0; ch < nb_channels; ch++) {
- const double sample = samples[idx_insample * nb_channels + ch];
- ebur128->sample_peaks[ch] = FFMAX(ebur128->sample_peaks[ch], fabs(sample));
- }
- }
-
- FIND_PEAK(ebur128->sample_peak, ebur128->sample_peaks, SAMPLES);
-
/* For integrated loudness, gating blocks are 400ms long with 75%
* overlap (see BS.1770-2 p5), so a re-computation is needed each 100ms
* (4800 samples at 48kHz). */
More information about the ffmpeg-cvslog
mailing list