diff options
author | Justin Ruggles <justin.ruggles@gmail.com> | 2012-05-02 15:32:08 -0400 |
---|---|---|
committer | Justin Ruggles <justin.ruggles@gmail.com> | 2012-08-23 20:10:56 -0400 |
commit | c0e12535aa10213f9cb4dce2ea1b63acbf679bb5 (patch) | |
tree | 3f1dfb1990e5d7d548a80e67679af47efe9dcfeb /libavresample/x86 | |
parent | 7b44061f4be1075eefbc2eec649f38dd0dbfcc82 (diff) | |
download | ffmpeg-c0e12535aa10213f9cb4dce2ea1b63acbf679bb5.tar.gz |
lavr: x86: optimized 2-channel s16p to s16 conversion
Diffstat (limited to 'libavresample/x86')
-rw-r--r-- | libavresample/x86/audio_convert.asm | 37 | ||||
-rw-r--r-- | libavresample/x86/audio_convert_init.c | 13 |
2 files changed, 50 insertions, 0 deletions
diff --git a/libavresample/x86/audio_convert.asm b/libavresample/x86/audio_convert.asm index 244c4d1b08..4a92952c3d 100644 --- a/libavresample/x86/audio_convert.asm +++ b/libavresample/x86/audio_convert.asm @@ -223,6 +223,43 @@ INIT_YMM avx CONV_FLT_TO_S32 %endif +;------------------------------------------------------------------------------ +; void ff_conv_s16p_to_s16_2ch(int16_t *dst, int16_t *const *src, int len, +; int channels); +;------------------------------------------------------------------------------ + +%macro CONV_S16P_TO_S16_2CH 0 +cglobal conv_s16p_to_s16_2ch, 3,4,5, dst, src0, len, src1 + mov src1q, [src0q+gprsize] + mov src0q, [src0q ] + lea lenq, [2*lend] + add src0q, lenq + add src1q, lenq + lea dstq, [dstq+2*lenq] + neg lenq +.loop + mova m0, [src0q+lenq ] + mova m1, [src1q+lenq ] + mova m2, [src0q+lenq+mmsize] + mova m3, [src1q+lenq+mmsize] + SBUTTERFLY2 wd, 0, 1, 4 + SBUTTERFLY2 wd, 2, 3, 4 + mova [dstq+2*lenq+0*mmsize], m0 + mova [dstq+2*lenq+1*mmsize], m1 + mova [dstq+2*lenq+2*mmsize], m2 + mova [dstq+2*lenq+3*mmsize], m3 + add lenq, 2*mmsize + jl .loop + REP_RET +%endmacro + +INIT_XMM sse2 +CONV_S16P_TO_S16_2CH +%if HAVE_AVX +INIT_XMM avx +CONV_S16P_TO_S16_2CH +%endif + ;----------------------------------------------------------------------------- ; void ff_conv_fltp_to_flt_6ch(float *dst, float *const *src, int len, ; int channels); diff --git a/libavresample/x86/audio_convert_init.c b/libavresample/x86/audio_convert_init.c index 2de49709c2..9b7bcb15e1 100644 --- a/libavresample/x86/audio_convert_init.c +++ b/libavresample/x86/audio_convert_init.c @@ -22,6 +22,8 @@ #include "libavutil/cpu.h" #include "libavresample/audio_convert.h" +/* flat conversions */ + extern void ff_conv_s16_to_s32_sse2(int16_t *dst, const int32_t *src, int len); extern void ff_conv_s16_to_flt_sse2(float *dst, const int16_t *src, int len); @@ -38,6 +40,13 @@ extern void ff_conv_flt_to_s16_sse2(int16_t *dst, const float *src, int len); extern void ff_conv_flt_to_s32_sse2(int32_t *dst, const float *src, int len); extern void ff_conv_flt_to_s32_avx (int32_t *dst, const float *src, int len); +/* interleave conversions */ + +extern void ff_conv_s16p_to_s16_2ch_sse2(int16_t *dst, int16_t *const *src, + int len, int channels); +extern void ff_conv_s16p_to_s16_2ch_avx (int16_t *dst, int16_t *const *src, + int len, int channels); + extern void ff_conv_fltp_to_flt_6ch_mmx (float *dst, float *const *src, int len, int channels); extern void ff_conv_fltp_to_flt_6ch_sse4(float *dst, float *const *src, int len, @@ -71,6 +80,8 @@ av_cold void ff_audio_convert_init_x86(AudioConvert *ac) 0, 16, 16, "SSE2", ff_conv_flt_to_s16_sse2); ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_FLT, 0, 16, 16, "SSE2", ff_conv_flt_to_s32_sse2); + ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S16P, + 2, 16, 16, "SSE2", ff_conv_s16p_to_s16_2ch_sse2); } if (mm_flags & AV_CPU_FLAG_SSE4 && HAVE_SSE) { ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S16, @@ -83,6 +94,8 @@ av_cold void ff_audio_convert_init_x86(AudioConvert *ac) 0, 32, 16, "AVX", ff_conv_s32_to_flt_avx); ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_FLT, 0, 32, 32, "AVX", ff_conv_flt_to_s32_avx); + ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S16P, + 2, 16, 16, "AVX", ff_conv_s16p_to_s16_2ch_avx); ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_FLTP, 6, 16, 4, "AVX", ff_conv_fltp_to_flt_6ch_avx); } |