[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