summaryrefslogtreecommitdiff
path: root/libavresample/x86
diff options
context:
space:
mode:
authorJustin Ruggles <justin.ruggles@gmail.com>2012-03-23 17:42:17 -0400
committerJustin Ruggles <justin.ruggles@gmail.com>2012-04-24 21:28:27 -0400
commitc8af852b97447491823ff9b91413e32415e2babf (patch)
tree6c02f850cf954612c7077f266a75d663bb9cde57 /libavresample/x86
parentc5671aeb77abb18a5a10ace314ab49e8fd3d0cb3 (diff)
Add libavresample
This is a new library for audio sample format, channel layout, and sample rate conversion.
Diffstat (limited to 'libavresample/x86')
-rw-r--r--libavresample/x86/Makefile5
-rw-r--r--libavresample/x86/audio_convert.asm104
-rw-r--r--libavresample/x86/audio_convert_init.c42
-rw-r--r--libavresample/x86/audio_mix.asm64
-rw-r--r--libavresample/x86/audio_mix_init.c44
5 files changed, 259 insertions, 0 deletions
diff --git a/libavresample/x86/Makefile b/libavresample/x86/Makefile
new file mode 100644
index 0000000000..63697faee7
--- /dev/null
+++ b/libavresample/x86/Makefile
@@ -0,0 +1,5 @@
+OBJS += x86/audio_convert_init.o \
+ x86/audio_mix_init.o
+
+YASM-OBJS += x86/audio_convert.o \
+ x86/audio_mix.o
diff --git a/libavresample/x86/audio_convert.asm b/libavresample/x86/audio_convert.asm
new file mode 100644
index 0000000000..809c5d1378
--- /dev/null
+++ b/libavresample/x86/audio_convert.asm
@@ -0,0 +1,104 @@
+;******************************************************************************
+;* x86 optimized Format Conversion Utils
+;* Copyright (c) 2008 Loren Merritt
+;*
+;* This file is part of Libav.
+;*
+;* Libav is free software; you can redistribute it and/or
+;* modify it under the terms of the GNU Lesser General Public
+;* License as published by the Free Software Foundation; either
+;* version 2.1 of the License, or (at your option) any later version.
+;*
+;* Libav is distributed in the hope that it will be useful,
+;* but WITHOUT ANY WARRANTY; without even the implied warranty of
+;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+;* Lesser General Public License for more details.
+;*
+;* You should have received a copy of the GNU Lesser General Public
+;* License along with Libav; if not, write to the Free Software
+;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+;******************************************************************************
+
+%include "x86inc.asm"
+%include "x86util.asm"
+
+SECTION_TEXT
+
+;-----------------------------------------------------------------------------
+; void ff_conv_fltp_to_flt_6ch(float *dst, float *const *src, int len,
+; int channels);
+;-----------------------------------------------------------------------------
+
+%macro CONV_FLTP_TO_FLT_6CH 0
+cglobal conv_fltp_to_flt_6ch, 2,8,7, dst, src, src1, src2, src3, src4, src5, len
+%if ARCH_X86_64
+ mov lend, r2d
+%else
+ %define lend dword r2m
+%endif
+ mov src1q, [srcq+1*gprsize]
+ mov src2q, [srcq+2*gprsize]
+ mov src3q, [srcq+3*gprsize]
+ mov src4q, [srcq+4*gprsize]
+ mov src5q, [srcq+5*gprsize]
+ mov srcq, [srcq]
+ sub src1q, srcq
+ sub src2q, srcq
+ sub src3q, srcq
+ sub src4q, srcq
+ sub src5q, srcq
+.loop:
+ mova m0, [srcq ]
+ mova m1, [srcq+src1q]
+ mova m2, [srcq+src2q]
+ mova m3, [srcq+src3q]
+ mova m4, [srcq+src4q]
+ mova m5, [srcq+src5q]
+%if cpuflag(sse)
+ SBUTTERFLYPS 0, 1, 6
+ SBUTTERFLYPS 2, 3, 6
+ SBUTTERFLYPS 4, 5, 6
+
+ movaps m6, m4
+ shufps m4, m0, q3210
+ movlhps m0, m2
+ movhlps m6, m2
+ movaps [dstq ], m0
+ movaps [dstq+16], m4
+ movaps [dstq+32], m6
+
+ movaps m6, m5
+ shufps m5, m1, q3210
+ movlhps m1, m3
+ movhlps m6, m3
+ movaps [dstq+48], m1
+ movaps [dstq+64], m5
+ movaps [dstq+80], m6
+%else ; mmx
+ SBUTTERFLY dq, 0, 1, 6
+ SBUTTERFLY dq, 2, 3, 6
+ SBUTTERFLY dq, 4, 5, 6
+
+ movq [dstq ], m0
+ movq [dstq+ 8], m2
+ movq [dstq+16], m4
+ movq [dstq+24], m1
+ movq [dstq+32], m3
+ movq [dstq+40], m5
+%endif
+ add srcq, mmsize
+ add dstq, mmsize*6
+ sub lend, mmsize/4
+ jg .loop
+%if mmsize == 8
+ emms
+ RET
+%else
+ REP_RET
+%endif
+%endmacro
+
+INIT_MMX mmx
+CONV_FLTP_TO_FLT_6CH
+INIT_XMM sse
+CONV_FLTP_TO_FLT_6CH
diff --git a/libavresample/x86/audio_convert_init.c b/libavresample/x86/audio_convert_init.c
new file mode 100644
index 0000000000..6883f10a21
--- /dev/null
+++ b/libavresample/x86/audio_convert_init.c
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2012 Justin Ruggles <justin.ruggles@gmail.com>
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "config.h"
+#include "libavutil/cpu.h"
+#include "libavresample/audio_convert.h"
+
+extern void ff_conv_fltp_to_flt_6ch_mmx(float *dst, float *const *src, int len);
+extern void ff_conv_fltp_to_flt_6ch_sse(float *dst, float *const *src, int len);
+
+av_cold void ff_audio_convert_init_x86(AudioConvert *ac)
+{
+#if HAVE_YASM
+ int mm_flags = av_get_cpu_flags();
+
+ if (mm_flags & AV_CPU_FLAG_MMX && HAVE_MMX) {
+ ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_FLTP,
+ 6, 1, 4, "MMX", ff_conv_fltp_to_flt_6ch_mmx);
+ }
+ if (mm_flags & AV_CPU_FLAG_SSE && HAVE_SSE) {
+ ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_FLTP,
+ 6, 16, 4, "SSE", ff_conv_fltp_to_flt_6ch_sse);
+ }
+#endif
+}
diff --git a/libavresample/x86/audio_mix.asm b/libavresample/x86/audio_mix.asm
new file mode 100644
index 0000000000..ef30f02486
--- /dev/null
+++ b/libavresample/x86/audio_mix.asm
@@ -0,0 +1,64 @@
+;******************************************************************************
+;* x86 optimized channel mixing
+;* Copyright (c) 2012 Justin Ruggles <justin.ruggles@gmail.com>
+;*
+;* This file is part of Libav.
+;*
+;* Libav is free software; you can redistribute it and/or
+;* modify it under the terms of the GNU Lesser General Public
+;* License as published by the Free Software Foundation; either
+;* version 2.1 of the License, or (at your option) any later version.
+;*
+;* Libav is distributed in the hope that it will be useful,
+;* but WITHOUT ANY WARRANTY; without even the implied warranty of
+;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+;* Lesser General Public License for more details.
+;*
+;* You should have received a copy of the GNU Lesser General Public
+;* License along with Libav; if not, write to the Free Software
+;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+;******************************************************************************
+
+%include "x86inc.asm"
+%include "x86util.asm"
+
+SECTION_TEXT
+
+;-----------------------------------------------------------------------------
+; void ff_mix_2_to_1_fltp_flt(float **src, float **matrix, int len,
+; int out_ch, int in_ch);
+;-----------------------------------------------------------------------------
+
+%macro MIX_2_TO_1_FLTP_FLT 0
+cglobal mix_2_to_1_fltp_flt, 3,4,6, src, matrix, len, src1
+ mov src1q, [srcq+gprsize]
+ mov srcq, [srcq ]
+ sub src1q, srcq
+ mov matrixq, [matrixq ]
+ VBROADCASTSS m4, [matrixq ]
+ VBROADCASTSS m5, [matrixq+4]
+ ALIGN 16
+.loop:
+ mulps m0, m4, [srcq ]
+ mulps m1, m5, [srcq+src1q ]
+ mulps m2, m4, [srcq+ mmsize]
+ mulps m3, m5, [srcq+src1q+mmsize]
+ addps m0, m0, m1
+ addps m2, m2, m3
+ mova [srcq ], m0
+ mova [srcq+mmsize], m2
+ add srcq, mmsize*2
+ sub lend, mmsize*2/4
+ jg .loop
+%if mmsize == 32
+ vzeroupper
+ RET
+%else
+ REP_RET
+%endif
+%endmacro
+
+INIT_XMM sse
+MIX_2_TO_1_FLTP_FLT
+INIT_YMM avx
+MIX_2_TO_1_FLTP_FLT
diff --git a/libavresample/x86/audio_mix_init.c b/libavresample/x86/audio_mix_init.c
new file mode 100644
index 0000000000..8f8930f836
--- /dev/null
+++ b/libavresample/x86/audio_mix_init.c
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2012 Justin Ruggles <justin.ruggles@gmail.com>
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "config.h"
+#include "libavutil/cpu.h"
+#include "libavresample/audio_mix.h"
+
+extern void ff_mix_2_to_1_fltp_flt_sse(float **src, float **matrix, int len,
+ int out_ch, int in_ch);
+extern void ff_mix_2_to_1_fltp_flt_avx(float **src, float **matrix, int len,
+ int out_ch, int in_ch);
+
+av_cold void ff_audio_mix_init_x86(AudioMix *am)
+{
+#if HAVE_YASM
+ int mm_flags = av_get_cpu_flags();
+
+ if (mm_flags & AV_CPU_FLAG_SSE && HAVE_SSE) {
+ ff_audio_mix_set_func(am, AV_SAMPLE_FMT_FLTP, AV_MIX_COEFF_TYPE_FLT,
+ 2, 1, 16, 8, "SSE", ff_mix_2_to_1_fltp_flt_sse);
+ }
+ if (mm_flags & AV_CPU_FLAG_AVX && HAVE_AVX) {
+ ff_audio_mix_set_func(am, AV_SAMPLE_FMT_FLTP, AV_MIX_COEFF_TYPE_FLT,
+ 2, 1, 32, 16, "AVX", ff_mix_2_to_1_fltp_flt_avx);
+ }
+#endif
+}