summaryrefslogtreecommitdiff
path: root/libavcodec/wmadec.c
diff options
context:
space:
mode:
authorZhou Zongyi <zhouzy@os.pku.edu.cn>2010-03-09 23:35:57 +0000
committerCarl Eugen Hoyos <cehoyos@rainbow.studorg.tuwien.ac.at>2010-03-09 23:35:57 +0000
commitd00261a34bec5ea302e966882db6d0512373fcfa (patch)
tree745b14eccd10234c09bf3e87e0bd8a9285e24f8f /libavcodec/wmadec.c
parent6ebc7240606e8f1fccd2edbe4ffac150053a16cc (diff)
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.c11
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);