summaryrefslogtreecommitdiff
path: root/libavcodec
diff options
context:
space:
mode:
authorJustin Ruggles <justin.ruggles@gmail.com>2009-08-05 02:30:34 +0000
committerJustin Ruggles <justin.ruggles@gmail.com>2009-08-05 02:30:34 +0000
commit25dcd1823c6fd0be6b41a36c4909a2aa78e8096f (patch)
tree7e3fc987af94e0d8331a966d7422d5b8e16bfb09 /libavcodec
parentb972c06a8fd7b593ec9ceee74883081ebd71c070 (diff)
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. Originally committed as revision 19588 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec')
-rw-r--r--libavcodec/ac3dec.c31
1 files 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; 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;
}
}
}