yading@11
|
1 /*
|
yading@11
|
2 * Copyright (c) 2012 Justin Ruggles <justin.ruggles@gmail.com>
|
yading@11
|
3 *
|
yading@11
|
4 * This file is part of Libav.
|
yading@11
|
5 *
|
yading@11
|
6 * Libav is free software; you can redistribute it and/or
|
yading@11
|
7 * modify it under the terms of the GNU Lesser General Public
|
yading@11
|
8 * License as published by the Free Software Foundation; either
|
yading@11
|
9 * version 2.1 of the License, or (at your option) any later version.
|
yading@11
|
10 *
|
yading@11
|
11 * Libav is distributed in the hope that it will be useful,
|
yading@11
|
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
yading@11
|
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
yading@11
|
14 * Lesser General Public License for more details.
|
yading@11
|
15 *
|
yading@11
|
16 * You should have received a copy of the GNU Lesser General Public
|
yading@11
|
17 * License along with Libav; if not, write to the Free Software
|
yading@11
|
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
yading@11
|
19 */
|
yading@11
|
20
|
yading@11
|
21 #include "config.h"
|
yading@11
|
22 #include "libavutil/cpu.h"
|
yading@11
|
23 #include "libavutil/x86/cpu.h"
|
yading@11
|
24 #include "libavresample/audio_convert.h"
|
yading@11
|
25
|
yading@11
|
26 /* flat conversions */
|
yading@11
|
27
|
yading@11
|
28 void ff_conv_s16_to_s32_sse2(int16_t *dst, const int32_t *src, int len);
|
yading@11
|
29
|
yading@11
|
30 void ff_conv_s16_to_flt_sse2(float *dst, const int16_t *src, int len);
|
yading@11
|
31 void ff_conv_s16_to_flt_sse4(float *dst, const int16_t *src, int len);
|
yading@11
|
32
|
yading@11
|
33 void ff_conv_s32_to_s16_mmx (int16_t *dst, const int32_t *src, int len);
|
yading@11
|
34 void ff_conv_s32_to_s16_sse2(int16_t *dst, const int32_t *src, int len);
|
yading@11
|
35
|
yading@11
|
36 void ff_conv_s32_to_flt_sse2(float *dst, const int32_t *src, int len);
|
yading@11
|
37 void ff_conv_s32_to_flt_avx (float *dst, const int32_t *src, int len);
|
yading@11
|
38
|
yading@11
|
39 void ff_conv_flt_to_s16_sse2(int16_t *dst, const float *src, int len);
|
yading@11
|
40
|
yading@11
|
41 void ff_conv_flt_to_s32_sse2(int32_t *dst, const float *src, int len);
|
yading@11
|
42 void ff_conv_flt_to_s32_avx (int32_t *dst, const float *src, int len);
|
yading@11
|
43
|
yading@11
|
44 /* interleave conversions */
|
yading@11
|
45
|
yading@11
|
46 void ff_conv_s16p_to_s16_2ch_sse2(int16_t *dst, int16_t *const *src,
|
yading@11
|
47 int len, int channels);
|
yading@11
|
48 void ff_conv_s16p_to_s16_2ch_avx (int16_t *dst, int16_t *const *src,
|
yading@11
|
49 int len, int channels);
|
yading@11
|
50
|
yading@11
|
51 void ff_conv_s16p_to_s16_6ch_sse2(int16_t *dst, int16_t *const *src,
|
yading@11
|
52 int len, int channels);
|
yading@11
|
53 void ff_conv_s16p_to_s16_6ch_sse2slow(int16_t *dst, int16_t *const *src,
|
yading@11
|
54 int len, int channels);
|
yading@11
|
55 void ff_conv_s16p_to_s16_6ch_avx (int16_t *dst, int16_t *const *src,
|
yading@11
|
56 int len, int channels);
|
yading@11
|
57
|
yading@11
|
58 void ff_conv_s16p_to_flt_2ch_sse2(float *dst, int16_t *const *src,
|
yading@11
|
59 int len, int channels);
|
yading@11
|
60 void ff_conv_s16p_to_flt_2ch_avx (float *dst, int16_t *const *src,
|
yading@11
|
61 int len, int channels);
|
yading@11
|
62
|
yading@11
|
63 void ff_conv_s16p_to_flt_6ch_sse2 (float *dst, int16_t *const *src,
|
yading@11
|
64 int len, int channels);
|
yading@11
|
65 void ff_conv_s16p_to_flt_6ch_ssse3(float *dst, int16_t *const *src,
|
yading@11
|
66 int len, int channels);
|
yading@11
|
67 void ff_conv_s16p_to_flt_6ch_avx (float *dst, int16_t *const *src,
|
yading@11
|
68 int len, int channels);
|
yading@11
|
69
|
yading@11
|
70 void ff_conv_fltp_to_s16_2ch_sse2 (int16_t *dst, float *const *src,
|
yading@11
|
71 int len, int channels);
|
yading@11
|
72 void ff_conv_fltp_to_s16_2ch_ssse3(int16_t *dst, float *const *src,
|
yading@11
|
73 int len, int channels);
|
yading@11
|
74
|
yading@11
|
75 void ff_conv_fltp_to_s16_6ch_sse (int16_t *dst, float *const *src,
|
yading@11
|
76 int len, int channels);
|
yading@11
|
77 void ff_conv_fltp_to_s16_6ch_sse2(int16_t *dst, float *const *src,
|
yading@11
|
78 int len, int channels);
|
yading@11
|
79 void ff_conv_fltp_to_s16_6ch_avx (int16_t *dst, float *const *src,
|
yading@11
|
80 int len, int channels);
|
yading@11
|
81
|
yading@11
|
82 void ff_conv_fltp_to_flt_2ch_sse(float *dst, float *const *src, int len,
|
yading@11
|
83 int channels);
|
yading@11
|
84 void ff_conv_fltp_to_flt_2ch_avx(float *dst, float *const *src, int len,
|
yading@11
|
85 int channels);
|
yading@11
|
86
|
yading@11
|
87 void ff_conv_fltp_to_flt_6ch_mmx (float *dst, float *const *src, int len,
|
yading@11
|
88 int channels);
|
yading@11
|
89 void ff_conv_fltp_to_flt_6ch_sse4(float *dst, float *const *src, int len,
|
yading@11
|
90 int channels);
|
yading@11
|
91 void ff_conv_fltp_to_flt_6ch_avx (float *dst, float *const *src, int len,
|
yading@11
|
92 int channels);
|
yading@11
|
93
|
yading@11
|
94 /* deinterleave conversions */
|
yading@11
|
95
|
yading@11
|
96 void ff_conv_s16_to_s16p_2ch_sse2(int16_t *const *dst, int16_t *src,
|
yading@11
|
97 int len, int channels);
|
yading@11
|
98 void ff_conv_s16_to_s16p_2ch_ssse3(int16_t *const *dst, int16_t *src,
|
yading@11
|
99 int len, int channels);
|
yading@11
|
100 void ff_conv_s16_to_s16p_2ch_avx (int16_t *const *dst, int16_t *src,
|
yading@11
|
101 int len, int channels);
|
yading@11
|
102
|
yading@11
|
103 void ff_conv_s16_to_s16p_6ch_sse2 (int16_t *const *dst, int16_t *src,
|
yading@11
|
104 int len, int channels);
|
yading@11
|
105 void ff_conv_s16_to_s16p_6ch_ssse3(int16_t *const *dst, int16_t *src,
|
yading@11
|
106 int len, int channels);
|
yading@11
|
107 void ff_conv_s16_to_s16p_6ch_avx (int16_t *const *dst, int16_t *src,
|
yading@11
|
108 int len, int channels);
|
yading@11
|
109
|
yading@11
|
110 void ff_conv_s16_to_fltp_2ch_sse2(float *const *dst, int16_t *src,
|
yading@11
|
111 int len, int channels);
|
yading@11
|
112 void ff_conv_s16_to_fltp_2ch_avx (float *const *dst, int16_t *src,
|
yading@11
|
113 int len, int channels);
|
yading@11
|
114
|
yading@11
|
115 void ff_conv_s16_to_fltp_6ch_sse2 (float *const *dst, int16_t *src,
|
yading@11
|
116 int len, int channels);
|
yading@11
|
117 void ff_conv_s16_to_fltp_6ch_ssse3(float *const *dst, int16_t *src,
|
yading@11
|
118 int len, int channels);
|
yading@11
|
119 void ff_conv_s16_to_fltp_6ch_sse4 (float *const *dst, int16_t *src,
|
yading@11
|
120 int len, int channels);
|
yading@11
|
121 void ff_conv_s16_to_fltp_6ch_avx (float *const *dst, int16_t *src,
|
yading@11
|
122 int len, int channels);
|
yading@11
|
123
|
yading@11
|
124 void ff_conv_flt_to_s16p_2ch_sse2(int16_t *const *dst, float *src,
|
yading@11
|
125 int len, int channels);
|
yading@11
|
126 void ff_conv_flt_to_s16p_2ch_avx (int16_t *const *dst, float *src,
|
yading@11
|
127 int len, int channels);
|
yading@11
|
128
|
yading@11
|
129 void ff_conv_flt_to_s16p_6ch_sse2 (int16_t *const *dst, float *src,
|
yading@11
|
130 int len, int channels);
|
yading@11
|
131 void ff_conv_flt_to_s16p_6ch_ssse3(int16_t *const *dst, float *src,
|
yading@11
|
132 int len, int channels);
|
yading@11
|
133 void ff_conv_flt_to_s16p_6ch_avx (int16_t *const *dst, float *src,
|
yading@11
|
134 int len, int channels);
|
yading@11
|
135
|
yading@11
|
136 void ff_conv_flt_to_fltp_2ch_sse(float *const *dst, float *src, int len,
|
yading@11
|
137 int channels);
|
yading@11
|
138 void ff_conv_flt_to_fltp_2ch_avx(float *const *dst, float *src, int len,
|
yading@11
|
139 int channels);
|
yading@11
|
140
|
yading@11
|
141 void ff_conv_flt_to_fltp_6ch_sse2(float *const *dst, float *src, int len,
|
yading@11
|
142 int channels);
|
yading@11
|
143 void ff_conv_flt_to_fltp_6ch_avx (float *const *dst, float *src, int len,
|
yading@11
|
144 int channels);
|
yading@11
|
145
|
yading@11
|
146 av_cold void ff_audio_convert_init_x86(AudioConvert *ac)
|
yading@11
|
147 {
|
yading@11
|
148 int mm_flags = av_get_cpu_flags();
|
yading@11
|
149
|
yading@11
|
150 if (EXTERNAL_MMX(mm_flags)) {
|
yading@11
|
151 ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S32,
|
yading@11
|
152 0, 1, 8, "MMX", ff_conv_s32_to_s16_mmx);
|
yading@11
|
153 ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_FLTP,
|
yading@11
|
154 6, 1, 4, "MMX", ff_conv_fltp_to_flt_6ch_mmx);
|
yading@11
|
155 }
|
yading@11
|
156 if (EXTERNAL_SSE(mm_flags)) {
|
yading@11
|
157 ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_FLTP,
|
yading@11
|
158 6, 1, 2, "SSE", ff_conv_fltp_to_s16_6ch_sse);
|
yading@11
|
159 ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_FLTP,
|
yading@11
|
160 2, 16, 8, "SSE", ff_conv_fltp_to_flt_2ch_sse);
|
yading@11
|
161 ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_FLT,
|
yading@11
|
162 2, 16, 4, "SSE", ff_conv_flt_to_fltp_2ch_sse);
|
yading@11
|
163 }
|
yading@11
|
164 if (EXTERNAL_SSE2(mm_flags)) {
|
yading@11
|
165 if (!(mm_flags & AV_CPU_FLAG_SSE2SLOW)) {
|
yading@11
|
166 ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S32,
|
yading@11
|
167 0, 16, 16, "SSE2", ff_conv_s32_to_s16_sse2);
|
yading@11
|
168 ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S16P,
|
yading@11
|
169 6, 16, 8, "SSE2", ff_conv_s16p_to_s16_6ch_sse2);
|
yading@11
|
170 ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_FLTP,
|
yading@11
|
171 6, 16, 4, "SSE2", ff_conv_fltp_to_s16_6ch_sse2);
|
yading@11
|
172 } else {
|
yading@11
|
173 ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S16P,
|
yading@11
|
174 6, 1, 4, "SSE2SLOW", ff_conv_s16p_to_s16_6ch_sse2slow);
|
yading@11
|
175 }
|
yading@11
|
176 ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_S16,
|
yading@11
|
177 0, 16, 8, "SSE2", ff_conv_s16_to_s32_sse2);
|
yading@11
|
178 ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S16,
|
yading@11
|
179 0, 16, 8, "SSE2", ff_conv_s16_to_flt_sse2);
|
yading@11
|
180 ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S32,
|
yading@11
|
181 0, 16, 8, "SSE2", ff_conv_s32_to_flt_sse2);
|
yading@11
|
182 ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_FLT,
|
yading@11
|
183 0, 16, 16, "SSE2", ff_conv_flt_to_s16_sse2);
|
yading@11
|
184 ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_FLT,
|
yading@11
|
185 0, 16, 16, "SSE2", ff_conv_flt_to_s32_sse2);
|
yading@11
|
186 ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S16P,
|
yading@11
|
187 2, 16, 16, "SSE2", ff_conv_s16p_to_s16_2ch_sse2);
|
yading@11
|
188 ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S16P,
|
yading@11
|
189 2, 16, 8, "SSE2", ff_conv_s16p_to_flt_2ch_sse2);
|
yading@11
|
190 ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S16P,
|
yading@11
|
191 6, 16, 4, "SSE2", ff_conv_s16p_to_flt_6ch_sse2);
|
yading@11
|
192 ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_FLTP,
|
yading@11
|
193 2, 16, 4, "SSE2", ff_conv_fltp_to_s16_2ch_sse2);
|
yading@11
|
194 ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16P, AV_SAMPLE_FMT_S16,
|
yading@11
|
195 2, 16, 8, "SSE2", ff_conv_s16_to_s16p_2ch_sse2);
|
yading@11
|
196 ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16P, AV_SAMPLE_FMT_S16,
|
yading@11
|
197 6, 16, 4, "SSE2", ff_conv_s16_to_s16p_6ch_sse2);
|
yading@11
|
198 ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_S16,
|
yading@11
|
199 2, 16, 8, "SSE2", ff_conv_s16_to_fltp_2ch_sse2);
|
yading@11
|
200 ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_S16,
|
yading@11
|
201 6, 16, 4, "SSE2", ff_conv_s16_to_fltp_6ch_sse2);
|
yading@11
|
202 ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16P, AV_SAMPLE_FMT_FLT,
|
yading@11
|
203 2, 16, 8, "SSE2", ff_conv_flt_to_s16p_2ch_sse2);
|
yading@11
|
204 ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16P, AV_SAMPLE_FMT_FLT,
|
yading@11
|
205 6, 16, 4, "SSE2", ff_conv_flt_to_s16p_6ch_sse2);
|
yading@11
|
206 ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_FLT,
|
yading@11
|
207 6, 16, 4, "SSE2", ff_conv_flt_to_fltp_6ch_sse2);
|
yading@11
|
208 }
|
yading@11
|
209 if (EXTERNAL_SSSE3(mm_flags)) {
|
yading@11
|
210 ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S16P,
|
yading@11
|
211 6, 16, 4, "SSSE3", ff_conv_s16p_to_flt_6ch_ssse3);
|
yading@11
|
212 ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_FLTP,
|
yading@11
|
213 2, 16, 4, "SSSE3", ff_conv_fltp_to_s16_2ch_ssse3);
|
yading@11
|
214 ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16P, AV_SAMPLE_FMT_S16,
|
yading@11
|
215 2, 16, 8, "SSSE3", ff_conv_s16_to_s16p_2ch_ssse3);
|
yading@11
|
216 ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16P, AV_SAMPLE_FMT_S16,
|
yading@11
|
217 6, 16, 4, "SSSE3", ff_conv_s16_to_s16p_6ch_ssse3);
|
yading@11
|
218 ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_S16,
|
yading@11
|
219 6, 16, 4, "SSSE3", ff_conv_s16_to_fltp_6ch_ssse3);
|
yading@11
|
220 ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16P, AV_SAMPLE_FMT_FLT,
|
yading@11
|
221 6, 16, 4, "SSSE3", ff_conv_flt_to_s16p_6ch_ssse3);
|
yading@11
|
222 }
|
yading@11
|
223 if (EXTERNAL_SSE4(mm_flags)) {
|
yading@11
|
224 ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S16,
|
yading@11
|
225 0, 16, 8, "SSE4", ff_conv_s16_to_flt_sse4);
|
yading@11
|
226 ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_FLTP,
|
yading@11
|
227 6, 16, 4, "SSE4", ff_conv_fltp_to_flt_6ch_sse4);
|
yading@11
|
228 }
|
yading@11
|
229 if (EXTERNAL_AVX(mm_flags)) {
|
yading@11
|
230 ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S32,
|
yading@11
|
231 0, 32, 16, "AVX", ff_conv_s32_to_flt_avx);
|
yading@11
|
232 ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_FLT,
|
yading@11
|
233 0, 32, 32, "AVX", ff_conv_flt_to_s32_avx);
|
yading@11
|
234 ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S16P,
|
yading@11
|
235 2, 16, 16, "AVX", ff_conv_s16p_to_s16_2ch_avx);
|
yading@11
|
236 ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S16P,
|
yading@11
|
237 6, 16, 8, "AVX", ff_conv_s16p_to_s16_6ch_avx);
|
yading@11
|
238 ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S16P,
|
yading@11
|
239 2, 16, 8, "AVX", ff_conv_s16p_to_flt_2ch_avx);
|
yading@11
|
240 ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S16P,
|
yading@11
|
241 6, 16, 4, "AVX", ff_conv_s16p_to_flt_6ch_avx);
|
yading@11
|
242 ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_FLTP,
|
yading@11
|
243 6, 16, 4, "AVX", ff_conv_fltp_to_s16_6ch_avx);
|
yading@11
|
244 ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_FLTP,
|
yading@11
|
245 6, 16, 4, "AVX", ff_conv_fltp_to_flt_6ch_avx);
|
yading@11
|
246 ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16P, AV_SAMPLE_FMT_S16,
|
yading@11
|
247 2, 16, 8, "AVX", ff_conv_s16_to_s16p_2ch_avx);
|
yading@11
|
248 ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16P, AV_SAMPLE_FMT_S16,
|
yading@11
|
249 6, 16, 4, "AVX", ff_conv_s16_to_s16p_6ch_avx);
|
yading@11
|
250 ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_S16,
|
yading@11
|
251 2, 16, 8, "AVX", ff_conv_s16_to_fltp_2ch_avx);
|
yading@11
|
252 ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_S16,
|
yading@11
|
253 6, 16, 4, "AVX", ff_conv_s16_to_fltp_6ch_avx);
|
yading@11
|
254 ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16P, AV_SAMPLE_FMT_FLT,
|
yading@11
|
255 2, 16, 8, "AVX", ff_conv_flt_to_s16p_2ch_avx);
|
yading@11
|
256 ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16P, AV_SAMPLE_FMT_FLT,
|
yading@11
|
257 6, 16, 4, "AVX", ff_conv_flt_to_s16p_6ch_avx);
|
yading@11
|
258 ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_FLT,
|
yading@11
|
259 2, 16, 4, "AVX", ff_conv_flt_to_fltp_2ch_avx);
|
yading@11
|
260 ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_FLT,
|
yading@11
|
261 6, 16, 4, "AVX", ff_conv_flt_to_fltp_6ch_avx);
|
yading@11
|
262 }
|
yading@11
|
263 }
|