summaryrefslogtreecommitdiff
path: root/libswresample
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2013-01-09 02:05:35 +0100
committerMichael Niedermayer <michaelni@gmx.at>2013-01-09 02:05:35 +0100
commitf3c9d8d41bca254aab993d5f783297fde0c802ae (patch)
tree852dac278c48ea33b38245d9d4e7038e5b850fb7 /libswresample
parent57bdd67646cfffa2921a8b28bb5f88cfe5c0989e (diff)
swr: use SIMD for dithering
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libswresample')
-rw-r--r--libswresample/swresample.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/libswresample/swresample.c b/libswresample/swresample.c
index c4a647ce04..09ed7b1dff 100644
--- a/libswresample/swresample.c
+++ b/libswresample/swresample.c
@@ -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!