Originally committed as revision 19777 to svn://svn.ffmpeg.org/ffmpeg/trunk
Sascha Sommer authored on 2009/09/06 15:56:25... | ... |
@@ -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 |
} |