From bf63179350e123443deeea981580e76ecd62d75e Mon Sep 17 00:00:00 2001 From: jbr Date: Wed, 5 Aug 2009 02:30:34 +0000 Subject: [PATCH] ac3dec: simplify zero-bit mantissa dithering by calculating it conditionally during mantissa decoding, then only removing it from the coupling range for coupled channels which do not use dithering. git-svn-id: file:///var/local/repositories/ffmpeg/trunk@19588 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b --- libavcodec/ac3dec.c | 31 ++++++++++--------------------- 1 file changed, 10 insertions(+), 21 deletions(-) diff --git a/libavcodec/ac3dec.c b/libavcodec/ac3dec.c index 80b4decd45..56024bb7a0 100644 --- a/libavcodec/ac3dec.c +++ b/libavcodec/ac3dec.c @@ -452,6 +452,7 @@ static void ac3_decode_transform_coeffs_ch(AC3DecodeContext *s, int ch_index, ma uint8_t *baps = s->bap[ch_index]; int8_t *exps = s->dexps[ch_index]; int *coeffs = s->fixed_coeffs[ch_index]; + int dither = (ch_index == CPL_CH) || s->dither_flag[ch_index]; GetBitContext *gbc = &s->gbc; int freq; @@ -460,7 +461,10 @@ static void ac3_decode_transform_coeffs_ch(AC3DecodeContext *s, int ch_index, ma int mantissa; switch(bap){ case 0: + if (dither) mantissa = (av_lfg_get(&s->dith_state) & 0x7FFFFF) - 0x400000; + else + mantissa = 0; break; case 1: if(m->b1){ @@ -517,33 +521,18 @@ static void ac3_decode_transform_coeffs_ch(AC3DecodeContext *s, int ch_index, ma } /** - * Remove random dithering from coefficients with zero-bit mantissas + * Remove random dithering from coupling range coefficients with zero-bit + * mantissas for coupled channels which do not use dithering. * reference: Section 7.3.4 Dither for Zero Bit Mantissas (bap=0) */ static void remove_dithering(AC3DecodeContext *s) { int ch, i; - int end=0; - int *coeffs; - uint8_t *bap; for(ch=1; ch<=s->fbw_channels; ch++) { - if(!s->dither_flag[ch]) { - coeffs = s->fixed_coeffs[ch]; - bap = s->bap[ch]; - if(s->channel_in_cpl[ch]) - end = s->start_freq[CPL_CH]; - else - end = s->end_freq[ch]; - for(i=0; ichannel_in_cpl[ch]) { - bap = s->bap[CPL_CH]; - for(; iend_freq[CPL_CH]; i++) { - if(!bap[i]) - coeffs[i] = 0; - } + if(!s->dither_flag[ch] && s->channel_in_cpl[ch]) { + for(i = s->start_freq[CPL_CH]; iend_freq[CPL_CH]; i++) { + if(!s->bap[CPL_CH][i]) + s->fixed_coeffs[ch][i] = 0; } } } -- 2.11.4.GIT