---
 libavresample/x86/audio_convert.asm    |   28 ++++++++++++++++++++++++++++
 libavresample/x86/audio_convert_init.c |    9 +++++++++
 2 files changed, 37 insertions(+), 0 deletions(-)

diff --git a/libavresample/x86/audio_convert.asm 
b/libavresample/x86/audio_convert.asm
index 7b3cc22..c14f4ef 100644
--- a/libavresample/x86/audio_convert.asm
+++ b/libavresample/x86/audio_convert.asm
@@ -233,6 +233,34 @@ 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);
+;------------------------------------------------------------------------------
+
+INIT_XMM sse2
+cglobal conv_s16p_to_s16_2ch, 3,4,5, dst, src, len, src1
+    mov       src1q, [srcq+gprsize]
+    mov        srcq, [srcq        ]
+    sub       src1q, srcq
+    ALIGN 16
+.loop
+    mova         m0, [srcq             ]
+    mova         m1, [srcq+src1q       ]
+    mova         m2, [srcq      +mmsize]
+    mova         m3, [srcq+src1q+mmsize]
+    SBUTTERFLY2  wd, 0, 1, 4
+    SBUTTERFLY2  wd, 2, 3, 4
+    mova  [dstq         ], m0
+    mova  [dstq+1*mmsize], m1
+    mova  [dstq+2*mmsize], m2
+    mova  [dstq+3*mmsize], m3
+    add        srcq, mmsize*2
+    add        dstq, mmsize*4
+    sub        lend, mmsize
+    jg .loop
+    REP_RET
+
 ;-----------------------------------------------------------------------------
 ; 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 2de4970..8c75f74 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,11 @@ 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_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 +78,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,
-- 
1.7.1

_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to