[FFmpeg-devel] [PATCH] libavfilter/ebur128: SIMD optimization

James Almer jamrial at gmail.com
Thu Apr 17 20:10:10 EEST 2025


On 4/17/2025 2:07 PM, Andreas Rheinhardt wrote:
> gkhayat at spectre-music.com:
>> From: Guillaume Khayat <gkhayat at spectre-music.com>
>>
>> Improve performance (+17%) of ebur_128 filter using AVX2 and FMA instruction in the body of the filter_frame function.
>>
>> ## Benchmark
>>
>> Tested with hyperfine
>>
>> hyperfine --warmup 2 "./ffmpeg_reference -i ~/test.wav -vn -af ebur128=peak=none:framelog=quiet -f null -" "./ffmpeg_avx -i ~/test.wav -vn -af ebur128=peak=none:framelog=quiet -f null -"
>> Benchmark 1: ./ffmpeg_reference -i ~/test.wav -vn -af ebur128=peak=none:framelog=quiet -f null -
>>    Time (mean ± σ):      7.118 s ±  0.037 s    [User: 9.114 s, System: 1.038 s]
>>    Range (min … max):    7.073 s …  7.177 s    10 runs
>>   
>> Benchmark 2: ./ffmpeg_avx -i ~/test.wav -vn -af ebur128=peak=none:framelog=quiet -f null -
>>    Time (mean ± σ):      6.073 s ±  0.108 s    [User: 7.903 s, System: 1.058 s]
>>    Range (min … max):    5.955 s …  6.327 s    10 runs
>>   
>> Summary
>>    ./ffmpeg_avx -i ~/test.wav -vn -af ebur128=peak=none:framelog=quiet -f null - ran
>>      1.17 ± 0.02 times faster than ./ffmpeg_reference -i ~/test.wav -vn -af ebur128=peak=none:framelog=quiet -f null -
>>
>> ## Tests
>>
>> - all FATE tests pass, tested on Darwin/arm64 and Linux/x86_64 w/ AVX2/FMA support
>> - On AVX2/FMA-capable system, all test files from the EBU yield the exact same output values (I/LRA) after and before optimization. See https://tech.ebu.ch/publications/ebu_loudness_test_set
>>
>> Disclaimer: this is my first ever patch submission to FFmpeg, and first ever time using git send-email to submit a patch anywhere.
>>
>> Signed-off-by: Cesar Matheus <cesar.matheus at telecom-paris.fr>
>> Signed-off-by: Guillaume Khayat <gkhayat at spectre-music.com>
>> ---
>>   libavfilter/f_ebur128.c | 246 ++++++++++++++++++++++++++++++++++------
>>   1 file changed, 214 insertions(+), 32 deletions(-)
>>
>> diff --git a/libavfilter/f_ebur128.c b/libavfilter/f_ebur128.c
>> index 768f062bac..e305b0a3ce 100644
>> --- a/libavfilter/f_ebur128.c
>> +++ b/libavfilter/f_ebur128.c
>> @@ -28,7 +28,7 @@
>>   
>>   #include <float.h>
>>   #include <math.h>
>> -
>> +#include "libavutil/intmath.h"
>>   #include "libavutil/avassert.h"
>>   #include "libavutil/channel_layout.h"
>>   #include "libavutil/dict.h"
>> @@ -199,7 +199,7 @@ static const AVOption ebur128_options[] = {
>>   };
>>   
>>   AVFILTER_DEFINE_CLASS(ebur128);
>> -
>> +#define MIN(a, b) ((a) < (b) ? (a) : (b))
>>   static const uint8_t graph_colors[] = {
>>       0xdd, 0x66, 0x66,   // value above 1LU non reached below -1LU (impossible)
>>       0x66, 0x66, 0xdd,   // value below 1LU non reached below -1LU
>> @@ -628,13 +628,61 @@ static int gate_update(struct integrator *integ, double power,
>>   
>>   static int filter_frame(AVFilterLink *inlink, AVFrame *insamples)
>>   {
>> -    int i, ch, idx_insample, ret;
>> +
>> +    int i, ch, idx_insample, ret,bin_id_400,bin_id_3000;
>>       AVFilterContext *ctx = inlink->dst;
>>       EBUR128Context *ebur128 = ctx->priv;
>>       const int nb_channels = ebur128->nb_channels;
>>       const int nb_samples  = insamples->nb_samples;
>>       const double *samples = (double *)insamples->data[0];
>>       AVFrame *pic;
>> +
>> +#if HAVE_AVX2_EXTERNAL && HAVE_AVX2
> 
> This is completely wrong: This only checks whether your assembler
> supports AVX2 and whether it was not disabled in configure. But this
> does not imply that the CPU where this code runs is actually capable of
> AVX2; I don't even know whether this check ensures that the compiler
> understands __m256d.
> For actual runtime support you need to check via av_get_cpu_flags(). See
> how other DSP code does it.
> 
> - Andreas

This also needs to be written in NASM syntax assembly, not Intel 
intrinsics, and it should be in a separate file in the x86/ folder, 
using function pointers like every other SIMD implementation.

-------------- next part --------------
A non-text attachment was scrubbed...
Name: OpenPGP_signature.asc
Type: application/pgp-signature
Size: 495 bytes
Desc: OpenPGP digital signature
URL: <https://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20250417/9ec79802/attachment.sig>


More information about the ffmpeg-devel mailing list