Commit d00261a3 authored by Zhou Zongyi's avatar Zhou Zongyi Committed by Carl Eugen Hoyos

SIMD optimization using float_to_int16_interleave.

Patch by Zhou Zongyi, zhouzy A os D pku D edu D cn

Originally committed as revision 22414 to svn://svn.ffmpeg.org/ffmpeg/trunk
parent 6ebc7240
...@@ -790,6 +790,7 @@ static int wma_decode_frame(WMACodecContext *s, int16_t *samples) ...@@ -790,6 +790,7 @@ static int wma_decode_frame(WMACodecContext *s, int16_t *samples)
/* convert frame to integer */ /* convert frame to integer */
n = s->frame_len; n = s->frame_len;
incr = s->nb_channels; incr = s->nb_channels;
if (s->dsp.float_to_int16_interleave == ff_float_to_int16_interleave_c) {
for(ch = 0; ch < s->nb_channels; ch++) { for(ch = 0; ch < s->nb_channels; ch++) {
ptr = samples + ch; ptr = samples + ch;
iptr = s->frame_out[ch]; iptr = s->frame_out[ch];
...@@ -802,6 +803,16 @@ static int wma_decode_frame(WMACodecContext *s, int16_t *samples) ...@@ -802,6 +803,16 @@ static int wma_decode_frame(WMACodecContext *s, int16_t *samples)
memmove(&s->frame_out[ch][0], &s->frame_out[ch][s->frame_len], memmove(&s->frame_out[ch][0], &s->frame_out[ch][s->frame_len],
s->frame_len * sizeof(float)); s->frame_len * sizeof(float));
} }
} else {
float *output[MAX_CHANNELS];
for (ch = 0; ch < MAX_CHANNELS; ch++)
output[ch] = s->frame_out[ch];
s->dsp.float_to_int16_interleave(samples, (const float **)output, n, incr);
for(ch = 0; ch < incr; ch++) {
/* prepare for next block */
memmove(&s->frame_out[ch][0], &s->frame_out[ch][n], n * sizeof(float));
}
}
#ifdef TRACE #ifdef TRACE
dump_shorts(s, "samples", samples, n * s->nb_channels); dump_shorts(s, "samples", samples, n * s->nb_channels);
......
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