|
@@ -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;
|
|
|
}
|
|
|
}
|
|
|
}
|