[FFmpeg-trac] #2144(avfilter:new): libavfilter ebur128 loudness inaccuracy, irregular time interval, LFE interference
FFmpeg
trac at avcodec.org
Wed Jan 16 03:15:50 CET 2013
#2144: libavfilter ebur128 loudness inaccuracy, irregular time interval, LFE
interference
-------------------------------------+-------------------------------------
Reporter: sedacca | Type: defect
Status: new | Priority: normal
Component: avfilter | Version: git-
Keywords: ebur128 EBU | master
R128 f_ebur128.c | Blocked By:
Blocking: | Reproduced by developer: 0
Analyzed by developer: 0 |
-------------------------------------+-------------------------------------
Summary of the bug:
(1) The time interval between logged data rows is often greater than the
expected 100 milliseconds.
(2) For some channel layouts the wrong weighting factors are applied to
channels, leading to incorrect reported loudness.
(3) Loudness computation is disturbed by the presence of the LFE channel,
which is not supposed to affect reported loudness.
How to reproduce the problem:
{{{
% ffmpeg -nostats -i seq-3341-6-6channels-WAVEEX-16bit.wav -filter_complex
ebur128 -f null dummyout.txt 2>f_ebur128_c_2013-01-15_bug.txt
}}}
The input WAV file is from http://tech.ebu.ch/docs/testmaterial/ebu-
loudness-test-setv03.zip.
The results in `ebur_results_before_bugfix_6ch.txt` show irregular time
increments, for instance from t: 9.98898 to t: 10.0955 (a difference of
106.5 msec instead of the expected 100 msec). They also show an integrated
loudness level of -22.6 LUFS instead of the expected -23.0 LUFS.
Version:
{{{
% ffmpeg -v 9 -loglevel 99 -i seq-3341-6-6channels-WAVEEX-16bit.wav
ffmpeg version N-48928-g918b411 Copyright (c) 2000-2013 the FFmpeg
developers
built on Jan 15 2013 15:34:46 with gcc 4.6 (Ubuntu/Linaro
4.6.3-1ubuntu5)
configuration: --enable-gpl
libavutil 52. 15.100 / 52. 15.100
libavcodec 54. 89.100 / 54. 89.100
libavformat 54. 60.100 / 54. 60.100
libavdevice 54. 3.102 / 54. 3.102
libavfilter 3. 32.100 / 3. 32.100
libswscale 2. 1.103 / 2. 1.103
libswresample 0. 17.102 / 0. 17.102
libpostproc 52. 2.100 / 52. 2.100
Splitting the commandline.
Reading option '-v' ... matched as option 'v' (set libav* logging level)
with argument '9'.
Reading option '-loglevel' ... matched as option 'loglevel' (set libav*
logging level) with argument '99'.
Reading option '-i' ... matched as input file with argument 'seq-3341-6
-6channels-WAVEEX-16bit.wav'.
Finished splitting the commandline.
Parsing a group of options: global .
Applying option v (set libav* logging level) with argument 9.
Successfully parsed a group of options.
Parsing a group of options: input file seq-3341-6-6channels-WAVEEX-
16bit.wav.
Successfully parsed a group of options.
Opening an input file: seq-3341-6-6channels-WAVEEX-16bit.wav.
[wav @ 0x2eef4c0] Format wav probed with size=2048 and score=99
[wav @ 0x2eef4c0] File position before avformat_find_stream_info() is 80
[wav @ 0x2eef4c0] parser not found for codec pcm_s16le, packets or times
may be invalid.
[wav @ 0x2eef4c0] probing stream 0 pp:4
[wav @ 0x2eef4c0] probing stream 0 pp:3
[wav @ 0x2eef4c0] probing stream 0 pp:2
[wav @ 0x2eef4c0] probing stream 0 pp:1
[wav @ 0x2eef4c0] probed stream 0
[wav @ 0x2eef4c0] parser not found for codec pcm_s16le, packets or times
may be invalid.
[wav @ 0x2eef4c0] max_analyze_duration 5000000 reached at 5001333
microseconds
[wav @ 0x2eef4c0] File position after avformat_find_stream_info() is
2893124
Input #0, wav, from 'seq-3341-6-6channels-WAVEEX-16bit.wav':
Duration: 00:00:20.00, bitrate: 4608 kb/s
Stream #0:0, 706, 1/48000: Audio: pcm_s16le ([1][0][0][0] / 0x0001),
48000 Hz, 5.1, s16, 4608 kb/s
Successfully openened the file.
At least one output file must be specified
Statistics: 2916352 bytes read, 0 seeks
}}}
Causes in file `f_ebur128.c`:
(1) For unexpected time intervals: In the function `filter_samples()`, the
`for` loop encompassing lines 449 to 638 has control variable `i` that is
incorrectly reused and altered by inner `for` loops at lines 537, 558,
566, and 577.
(2) For unexpected channel weightings: the examination of the bitmap for
channel layout does not properly scan for bits that are set and skip over
bits that are cleared.
(3) For wrong loudness indication when LFE is present: the increment
operation to `*samples` is wrongly skipped when the channel index `ch` has
the value for the LFE channel. This causes the LFE samples to
inadvertently contribute to the loudness computation when the channel
index next has the value for a non-LFE channel, and distorts the time and
weighting of samples.
Suggested fixes to file `f_ebur128.c` (a suggested patch will be posted to
the developer list):
(1) Add a new control variable `idx_insample` for the outermost `for` loop
in the function `filter_samples()`;
(2) Add new logic to scan the `channel_layout` bitmap for the next nonzero
entry, and update the macro `BACK_MASK` to include all non-front and all
non-LFE channels.
(3) Move the existing increment operation of `*samples` to precede the
`continue` operation that skips unneeded expensive computations for the
LFE channel.
--
Ticket URL: <https://ffmpeg.org/trac/ffmpeg/ticket/2144>
FFmpeg <http://ffmpeg.org>
FFmpeg issue tracker
More information about the FFmpeg-trac
mailing list