diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2013-01-09 02:05:35 +0100 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2013-01-09 02:05:35 +0100 |
commit | f3c9d8d41bca254aab993d5f783297fde0c802ae (patch) | |
tree | 852dac278c48ea33b38245d9d4e7038e5b850fb7 | |
parent | 57bdd67646cfffa2921a8b28bb5f88cfe5c0989e (diff) | |
download | ffmpeg-f3c9d8d41bca254aab993d5f783297fde0c802ae.tar.gz |
swr: use SIMD for dithering
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r-- | libswresample/swresample.c | 17 |
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! |