From 12df9b9a151026c4b382df8852fad38165b49f95 Mon Sep 17 00:00:00 2001 From: Jean-Francois Thibert Date: Tue, 26 Aug 2014 19:16:06 -0400 Subject: Improved AC3 decoder level support (heavy drc, dialnorm) Added support for AC3 heavy dynamic range compression used to restrict the output range and added a setting to specify the output target level and use the dialog normalization field to apply it in the digital domain. Signed-off-by: Michael Niedermayer --- libavcodec/ac3dec_fixed.c | 99 +++++++++++++++++++++++++++++++---------------- 1 file changed, 65 insertions(+), 34 deletions(-) (limited to 'libavcodec/ac3dec_fixed.c') diff --git a/libavcodec/ac3dec_fixed.c b/libavcodec/ac3dec_fixed.c index c6cbeb9b28..f36e7b0849 100644 --- a/libavcodec/ac3dec_fixed.c +++ b/libavcodec/ac3dec_fixed.c @@ -81,40 +81,69 @@ static void scale_coefs ( int temp, temp1, temp2, temp3, temp4, temp5, temp6, temp7; mul = (dynrng & 0x1f) + 0x20; - shift = 4 - ((dynrng << 24) >> 29); - round = 1 << (shift-1); - for (i=0; i> shift; - temp3 = src[i+3] * mul; - temp2 = temp2 + round; - - dst[i+1] = temp1 >> shift; - temp4 = src[i + 4] * mul; - temp3 = temp3 + round; - dst[i+2] = temp2 >> shift; - - temp5 = src[i+5] * mul; - temp4 = temp4 + round; - dst[i+3] = temp3 >> shift; - temp6 = src[i+6] * mul; - - dst[i+4] = temp4 >> shift; - temp5 = temp5 + round; - temp7 = src[i+7] * mul; - temp6 = temp6 + round; - - dst[i+5] = temp5 >> shift; - temp7 = temp7 + round; - dst[i+6] = temp6 >> shift; - dst[i+7] = temp7 >> shift; - + shift = 4 - ((dynrng << 23) >> 28); + if (shift > 0 ) { + round = 1 << (shift-1); + for (i=0; i> shift; + temp3 = src[i+3] * mul; + temp2 = temp2 + round; + + dst[i+1] = temp1 >> shift; + temp4 = src[i + 4] * mul; + temp3 = temp3 + round; + dst[i+2] = temp2 >> shift; + + temp5 = src[i+5] * mul; + temp4 = temp4 + round; + dst[i+3] = temp3 >> shift; + temp6 = src[i+6] * mul; + + dst[i+4] = temp4 >> shift; + temp5 = temp5 + round; + temp7 = src[i+7] * mul; + temp6 = temp6 + round; + + dst[i+5] = temp5 >> shift; + temp7 = temp7 + round; + dst[i+6] = temp6 >> shift; + dst[i+7] = temp7 >> shift; + + } + } else { + shift = -shift; + for (i=0; i