From d00261a34bec5ea302e966882db6d0512373fcfa Mon Sep 17 00:00:00 2001
From: Zhou Zongyi <zhouzy@os.pku.edu.cn>
Date: Tue, 9 Mar 2010 23:35:57 +0000
Subject: [PATCH] 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(+)

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);