Mercurial > libavcodec.hg
changeset 10025:3fccd61e69d1 libavcodec
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.
author | jbr |
---|---|
date | Wed, 05 Aug 2009 02:30:34 +0000 |
parents | 9ff48c350a32 |
children | e73210411a21 |
files | ac3dec.c |
diffstat | 1 files changed, 10 insertions(+), 21 deletions(-) [+] |
line wrap: on
line diff
--- a/ac3dec.c Wed Aug 05 01:58:28 2009 +0000 +++ b/ac3dec.c Wed Aug 05 02:30:34 2009 +0000 @@ -452,6 +452,7 @@ 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 @@ 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 @@ } /** - * 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; i<end; i++) { - if(!bap[i]) - coeffs[i] = 0; - } - if(s->channel_in_cpl[ch]) { - bap = s->bap[CPL_CH]; - for(; i<s->end_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]; i<s->end_freq[CPL_CH]; i++) { + if(!s->bap[CPL_CH][i]) + s->fixed_coeffs[ch][i] = 0; } } }