From d00261a34bec5ea302e966882db6d0512373fcfa Mon Sep 17 00:00:00 2001 From: Zhou Zongyi Date: Tue, 9 Mar 2010 23:35:57 +0000 Subject: 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 --- libavcodec/wmadec.c | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'libavcodec/wmadec.c') diff --git a/libavcodec/wmadec.c b/libavcodec/wmadec.c index b2f8aa70d9..3a08fe386c 100644 --- a/libavcodec/wmadec.c +++ b/libavcodec/wmadec.c @@ -790,6 +790,7 @@ static int wma_decode_frame(WMACodecContext *s, int16_t *samples) /* convert frame to integer */ n = s->frame_len; 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++) { ptr = samples + ch; iptr = s->frame_out[ch]; @@ -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], 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 dump_shorts(s, "samples", samples, n * s->nb_channels); -- cgit v1.2.3