[FFmpeg-devel] [PATCH] ac3dec: fix non-optimal dithering of zero bit mantissas
madshi
madshi at gmail.com
Sat Jan 5 11:37:55 CET 2013
Hey guys,
the latest revision of the (E-)AC3 spec says:
> The optimum scaling for the dither words is to take a
> uniform distribution of values between –1 and +1, and
> scale this by 0.707, resulting in a uniform distribution
> between +0.707 and –0.707
Currently the AC3 decoder applies a dithering of only +0.5 .. -0.5.
According to the spec this is "also acceptable", but it's not the "optimum
scaling". The effects of this non-optimal dithering are clearly visible in
frequency graphs. Basically high frequencies are lower in volume than they
should be. You can test this yourself by looking at the following files:
http://madshi.net/libavAc3Fix.rar
Load the WAV files into Audacity, then for each WAV in the Audacity menu
choose "analyze -> frequency analyzis". You can see that the "azid" and
"liba52" decoders have a better high frequency response than the "libav"
decoder. However, look at "libav_patched" which shows the results when
using the proper amount of dithering in the libav AC3 decoder.
Attached is a patch which modifies the AC3 decoder to apply the optimum
dithering.
(av_lfg_get() does return values in the range 0..FFFFFFFF, correct?)
Best regards, Mathias.
-------------- next part --------------
diff --git a/libavcodec/ac3dec.c b/libavcodec/ac3dec.c
index ea4a218..a30b123 100644
--- a/libavcodec/ac3dec.c
+++ b/libavcodec/ac3dec.c
@@ -442,7 +442,7 @@ static void ac3_decode_transform_coeffs_ch(AC3DecodeContext *s, int ch_index, ma
switch (bap) {
case 0:
if (dither)
- mantissa = (av_lfg_get(&s->dith_state) & 0x7FFFFF) - 0x400000;
+ mantissa = (av_lfg_get(&s->dith_state) / 362) - 5932275;
else
mantissa = 0;
break;
More information about the ffmpeg-devel
mailing list