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

Zhou Zongyi zhouzy
Tue Mar 9 13:15:23 CET 2010


> ive not reviewed the patch as iam waiting for a clean version without 
> cosmetic changes, but nothing of this size that makes a codec 10% can 
> be too hackish

Well it seems C version of float_to_int16_interleave does different job from SIMD versions,
so I have to keep the original av_clip_int16(lrintf()) method.

Here is a patch without cosmetics.

Index: libavcodec/wmadec.c 
=================================================================== 
--- libavcodec/wmadec.c (revision 22281) 
+++ libavcodec/wmadec.c (working copy) 
@@ -790,17 +790,28 @@ 
     /* 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++) { 
+            ptr = samples + ch; 
+            iptr = s->frame_out[ch]; 
  
-        for(i=0;i-            *ptr = av_clip_int16(lrintf(*iptr++)); 
-            ptr += incr; 
+            for(i=0;i+                *ptr = av_clip_int16(lrintf(*iptr++)); 
+                ptr += incr; 
+            } 
+            /* prepare for next block */ 
+            memmove(&s->frame_out[ch][0], &s->frame_out[ch][s->frame_len], 
+                    s->frame_len * sizeof(float)); 
         } 
-        /* 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


ZZ
2010-03-09 



More information about the ffmpeg-devel mailing list