[FFmpeg-devel] [PATCH] wmadec.c: SIMD optimization using float_to_int16_interleave

Zhou Zongyi zhouzy
Mon Mar 8 17:03:26 CET 2010


Hi all,

Here is my patch. I tested decoding a 160kbps 44.1kHz sample on a K8, around 10% faster in overall speed.

Index: libavcodec/wmadec.c
===================================================================
--- libavcodec/wmadec.c (revision 22281)
+++ libavcodec/wmadec.c (working copy)
@@ -769,8 +769,6 @@
 static int wma_decode_frame(WMACodecContext *s, int16_t *samples)
 {
     int ret, i, n, ch, incr;
-    int16_t *ptr;
-    float *iptr;
 
 #ifdef TRACE
     tprintf(s->avctx, "***decode_frame: %d size=%d\n", s->frame_count++, s->frame_len);
@@ -790,17 +788,29 @@
     /* convert frame to integer */
     n = s->frame_len;
     incr = s->nb_channels;
-    for(ch = 0; ch < s->nb_channels; ch++) {
-        ptr = samples + ch;
-        iptr = s->frame_out[ch];
+    if (s->dsp.float_to_int16_interleave == ff_float_to_int16_interleave_c) {
+        for(ch = 0; ch < incr; ch++) {
+            int16_t *ptr = samples + ch;
+            float *iptr = s->frame_out[ch];
 
-        for(i=0;i<n;i++) {
-            *ptr = av_clip_int16(lrintf(*iptr++));
-            ptr += incr;
+            for(i=0;i<n;i++) {
+                *ptr = av_clip_int16(lrintf(*iptr));
+                ptr += incr;
+                /* prepare for next block */
+                iptr[0] = iptr[n];
+                iptr++;
+            }
         }
-        /* prepare for next block */
-        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


Regards,

ZZ



More information about the ffmpeg-devel mailing list