swr: use SIMD for dithering
authorMichael Niedermayer <michaelni@gmx.at>
Wed, 9 Jan 2013 01:05:35 +0000 (02:05 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Wed, 9 Jan 2013 01:05:35 +0000 (02:05 +0100)
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
libswresample/swresample.c

index c4a647c..09ed7b1 100644 (file)
@@ -651,9 +651,20 @@ static int swr_convert_internal(struct SwrContext *s, AudioData *out, int out_co
             if(s->dither_pos + out_count > s->dither.count)
                 s->dither_pos = 0;
 
-            for(ch=0; ch<preout->ch_count; ch++)
-                s->mix_2_1_f(preout->ch[ch], preout->ch[ch], s->dither.ch[ch] + s->dither.bps * s->dither_pos, s->native_one, 0, 0, out_count);
-
+            if (s->mix_2_1_simd) {
+                int len1= out_count&~15;
+                int off = len1 * preout->bps;
+
+                if(len1)
+                    for(ch=0; ch<preout->ch_count; ch++)
+                        s->mix_2_1_simd(preout->ch[ch], preout->ch[ch], s->dither.ch[ch] + s->dither.bps * s->dither_pos, s->native_one, 0, 0, len1);
+                if(out_count != len1)
+                    for(ch=0; ch<preout->ch_count; ch++)
+                        s->mix_2_1_f(preout->ch[ch] + off, preout->ch[ch] + off, s->dither.ch[ch] + s->dither.bps * s->dither_pos + off + len1, s->native_one, 0, 0, out_count - len1);
+            } else {
+                for(ch=0; ch<preout->ch_count; ch++)
+                    s->mix_2_1_f(preout->ch[ch], preout->ch[ch], s->dither.ch[ch] + s->dither.bps * s->dither_pos, s->native_one, 0, 0, out_count);
+            }
             s->dither_pos += out_count;
         }
 //FIXME packed doesnt need more than 1 chan here!