Commit 7dca334d authored by Sascha Sommer's avatar Sascha Sommer

avoid extra memcpy during scale factor decoding

Originally committed as revision 19777 to svn://svn.ffmpeg.org/ffmpeg/trunk
parent d31dbec3
...@@ -137,8 +137,9 @@ typedef struct { ...@@ -137,8 +137,9 @@ typedef struct {
int8_t reuse_sf; ///< share scale factors between subframes int8_t reuse_sf; ///< share scale factors between subframes
int8_t scale_factor_step; ///< scaling step for the current subframe int8_t scale_factor_step; ///< scaling step for the current subframe
int max_scale_factor; ///< maximum scale factor for the current subframe int max_scale_factor; ///< maximum scale factor for the current subframe
int scale_factors[MAX_BANDS]; ///< scale factor values for the current subframe int saved_scale_factors[2][MAX_BANDS]; ///< resampled and (previously) transmitted scale factor values
int saved_scale_factors[MAX_BANDS]; ///< scale factors from a previous subframe int8_t scale_factor_idx; ///< index for the transmitted scale factor values (used for resampling)
int* scale_factors; ///< pointer to the scale factor values used for decoding
uint8_t table_idx; ///< index in sf_offsets for the scale factor reference block uint8_t table_idx; ///< index in sf_offsets for the scale factor reference block
float* coeffs; ///< pointer to the subframe decode buffer float* coeffs; ///< pointer to the subframe decode buffer
DECLARE_ALIGNED_16(float, out[WMAPRO_BLOCK_MAX_SIZE + WMAPRO_BLOCK_MAX_SIZE / 2]); ///< output buffer 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,7 +861,9 @@ static int decode_scale_factors(WMAProDecodeCtx* s)
for (i = 0; i < s->channels_for_cur_subframe; i++) { for (i = 0; i < s->channels_for_cur_subframe; i++) {
int c = s->channel_indexes_for_cur_subframe[i]; int c = s->channel_indexes_for_cur_subframe[i];
int* sf; int* sf;
int* sf_end = s->channel[c].scale_factors + s->num_bands; int* sf_end;
s->channel[c].scale_factors = s->channel[c].saved_scale_factors[!s->channel[c].scale_factor_idx];
sf_end = s->channel[c].scale_factors + s->num_bands;
/** resample scale factors for the new block size /** resample scale factors for the new block size
* as the scale factors might need to be resampled several times * as the scale factors might need to be resampled several times
...@@ -872,7 +875,7 @@ static int decode_scale_factors(WMAProDecodeCtx* s) ...@@ -872,7 +875,7 @@ static int decode_scale_factors(WMAProDecodeCtx* s)
int b; int b;
for (b = 0; b < s->num_bands; b++) for (b = 0; b < s->num_bands; b++)
s->channel[c].scale_factors[b] = s->channel[c].scale_factors[b] =
s->channel[c].saved_scale_factors[*sf_offsets++]; s->channel[c].saved_scale_factors[s->channel[c].scale_factor_idx][*sf_offsets++];
} }
if (!s->channel[c].cur_subframe || get_bits1(&s->gb)) { if (!s->channel[c].cur_subframe || get_bits1(&s->gb)) {
...@@ -919,12 +922,8 @@ static int decode_scale_factors(WMAProDecodeCtx* s) ...@@ -919,12 +922,8 @@ static int decode_scale_factors(WMAProDecodeCtx* s)
s->channel[c].scale_factors[i] += (val ^ sign) - sign; s->channel[c].scale_factors[i] += (val ^ sign) - sign;
} }
} }
/** swap buffers */
/** save transmitted scale factors so that they can be reused for s->channel[c].scale_factor_idx = !s->channel[c].scale_factor_idx;
the next subframe */
memcpy(s->channel[c].saved_scale_factors,
s->channel[c].scale_factors, s->num_bands *
sizeof(*s->channel[c].saved_scale_factors));
s->channel[c].table_idx = s->table_idx; s->channel[c].table_idx = s->table_idx;
s->channel[c].reuse_sf = 1; s->channel[c].reuse_sf = 1;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment