diff options
author | Zhou Zongyi <zhouzy@os.pku.edu.cn> | 2010-03-09 23:35:57 +0000 |
---|---|---|
committer | Carl Eugen Hoyos <cehoyos@rainbow.studorg.tuwien.ac.at> | 2010-03-09 23:35:57 +0000 |
commit | d00261a34bec5ea302e966882db6d0512373fcfa (patch) | |
tree | 745b14eccd10234c09bf3e87e0bd8a9285e24f8f /libavcodec/wmadec.c | |
parent | 6ebc7240606e8f1fccd2edbe4ffac150053a16cc (diff) | |
download | ffmpeg-d00261a34bec5ea302e966882db6d0512373fcfa.tar.gz |
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
Diffstat (limited to 'libavcodec/wmadec.c')
-rw-r--r-- | libavcodec/wmadec.c | 11 |
1 files changed, 11 insertions, 0 deletions
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); |