From f3c9d8d41bca254aab993d5f783297fde0c802ae Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Wed, 9 Jan 2013 02:05:35 +0100 Subject: [PATCH] swr: use SIMD for dithering Signed-off-by: Michael Niedermayer --- libswresample/swresample.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 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; chch_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; chch_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; chch_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; chch_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!