[FFmpeg-cvslog] r19588 - trunk/libavcodec/ac3dec.c
jbr
subversion
Wed Aug 5 04:30:35 CEST 2009
Author: jbr
Date: Wed Aug 5 04:30:34 2009
New Revision: 19588
Log:
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.
Modified:
trunk/libavcodec/ac3dec.c
Modified: trunk/libavcodec/ac3dec.c
==============================================================================
--- trunk/libavcodec/ac3dec.c Wed Aug 5 03:58:28 2009 (r19587)
+++ trunk/libavcodec/ac3dec.c Wed Aug 5 04:30:34 2009 (r19588)
@@ -452,6 +452,7 @@ static void ac3_decode_transform_coeffs_
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_
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_
}
/**
- * 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;
}
}
}
More information about the ffmpeg-cvslog
mailing list