Browse code

avoid extra memcpy during scale factor decoding

Originally committed as revision 19777 to svn://svn.ffmpeg.org/ffmpeg/trunk

Sascha Sommer authored on 2009/09/06 15:56:25
Showing 1 changed files
... ...
@@ -137,8 +137,9 @@ typedef struct {
137 137
     int8_t   reuse_sf;                                ///< share scale factors between subframes
138 138
     int8_t   scale_factor_step;                       ///< scaling step for the current subframe
139 139
     int      max_scale_factor;                        ///< maximum scale factor for the current subframe
140
-    int      scale_factors[MAX_BANDS];                ///< scale factor values for the current subframe
141
-    int      saved_scale_factors[MAX_BANDS];          ///< scale factors from a previous subframe
140
+    int      saved_scale_factors[2][MAX_BANDS];       ///< resampled and (previously) transmitted scale factor values
141
+    int8_t   scale_factor_idx;                        ///< index for the transmitted scale factor values (used for resampling)
142
+    int*     scale_factors;                           ///< pointer to the scale factor values used for decoding
142 143
     uint8_t  table_idx;                               ///< index in sf_offsets for the scale factor reference block
143 144
     float*   coeffs;                                  ///< pointer to the subframe decode buffer
144 145
     DECLARE_ALIGNED_16(float, out[WMAPRO_BLOCK_MAX_SIZE + WMAPRO_BLOCK_MAX_SIZE / 2]); ///< output buffer
... ...
@@ -860,7 +861,9 @@ static int decode_scale_factors(WMAProDecodeCtx* s)
860 860
     for (i = 0; i < s->channels_for_cur_subframe; i++) {
861 861
         int c = s->channel_indexes_for_cur_subframe[i];
862 862
         int* sf;
863
-        int* sf_end = s->channel[c].scale_factors + s->num_bands;
863
+        int* sf_end;
864
+        s->channel[c].scale_factors = s->channel[c].saved_scale_factors[!s->channel[c].scale_factor_idx];
865
+        sf_end = s->channel[c].scale_factors + s->num_bands;
864 866
 
865 867
         /** resample scale factors for the new block size
866 868
          *  as the scale factors might need to be resampled several times
... ...
@@ -872,7 +875,7 @@ static int decode_scale_factors(WMAProDecodeCtx* s)
872 872
             int b;
873 873
             for (b = 0; b < s->num_bands; b++)
874 874
                 s->channel[c].scale_factors[b] =
875
-                                   s->channel[c].saved_scale_factors[*sf_offsets++];
875
+                    s->channel[c].saved_scale_factors[s->channel[c].scale_factor_idx][*sf_offsets++];
876 876
         }
877 877
 
878 878
         if (!s->channel[c].cur_subframe || get_bits1(&s->gb)) {
... ...
@@ -919,12 +922,8 @@ static int decode_scale_factors(WMAProDecodeCtx* s)
919 919
                     s->channel[c].scale_factors[i] += (val ^ sign) - sign;
920 920
                 }
921 921
             }
922
-
923
-            /** save transmitted scale factors so that they can be reused for
924
-                the next subframe */
925
-            memcpy(s->channel[c].saved_scale_factors,
926
-                   s->channel[c].scale_factors, s->num_bands *
927
-                   sizeof(*s->channel[c].saved_scale_factors));
922
+            /** swap buffers */
923
+            s->channel[c].scale_factor_idx = !s->channel[c].scale_factor_idx;
928 924
             s->channel[c].table_idx = s->table_idx;
929 925
             s->channel[c].reuse_sf  = 1;
930 926
         }