Skip to content
Snippets Groups Projects
Commit 7dca334d authored by Sascha Sommer's avatar Sascha Sommer
Browse files

avoid extra memcpy during scale factor decoding

Originally committed as revision 19777 to svn://svn.ffmpeg.org/ffmpeg/trunk
parent d31dbec3
No related branches found
No related tags found
No related merge requests found
...@@ -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;
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment