annotate ffmpeg/libavresample/x86/audio_mix_init.c @ 13:844d341cf643 tip

Back up before ISMIR
author Yading Song <yading.song@eecs.qmul.ac.uk>
date Thu, 31 Oct 2013 13:17:06 +0000
parents f445c3017523
children
rev   line source
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_mix.h"
yading@11 25
yading@11 26 void ff_mix_2_to_1_fltp_flt_sse(float **src, float **matrix, int len,
yading@11 27 int out_ch, int in_ch);
yading@11 28 void ff_mix_2_to_1_fltp_flt_avx(float **src, float **matrix, int len,
yading@11 29 int out_ch, int in_ch);
yading@11 30
yading@11 31 void ff_mix_2_to_1_s16p_flt_sse2(int16_t **src, float **matrix, int len,
yading@11 32 int out_ch, int in_ch);
yading@11 33 void ff_mix_2_to_1_s16p_flt_sse4(int16_t **src, float **matrix, int len,
yading@11 34 int out_ch, int in_ch);
yading@11 35
yading@11 36 void ff_mix_2_to_1_s16p_q8_sse2(int16_t **src, int16_t **matrix,
yading@11 37 int len, int out_ch, int in_ch);
yading@11 38
yading@11 39 void ff_mix_1_to_2_fltp_flt_sse(float **src, float **matrix, int len,
yading@11 40 int out_ch, int in_ch);
yading@11 41 void ff_mix_1_to_2_fltp_flt_avx(float **src, float **matrix, int len,
yading@11 42 int out_ch, int in_ch);
yading@11 43
yading@11 44 void ff_mix_1_to_2_s16p_flt_sse2(int16_t **src, float **matrix, int len,
yading@11 45 int out_ch, int in_ch);
yading@11 46 void ff_mix_1_to_2_s16p_flt_sse4(int16_t **src, float **matrix, int len,
yading@11 47 int out_ch, int in_ch);
yading@11 48 void ff_mix_1_to_2_s16p_flt_avx (int16_t **src, float **matrix, int len,
yading@11 49 int out_ch, int in_ch);
yading@11 50
yading@11 51 #define DEFINE_MIX_3_8_TO_1_2(chan) \
yading@11 52 void ff_mix_ ## chan ## _to_1_fltp_flt_sse(float **src, \
yading@11 53 float **matrix, int len, \
yading@11 54 int out_ch, int in_ch); \
yading@11 55 void ff_mix_ ## chan ## _to_2_fltp_flt_sse(float **src, \
yading@11 56 float **matrix, int len, \
yading@11 57 int out_ch, int in_ch); \
yading@11 58 \
yading@11 59 void ff_mix_ ## chan ## _to_1_s16p_flt_sse2(int16_t **src, \
yading@11 60 float **matrix, int len, \
yading@11 61 int out_ch, int in_ch); \
yading@11 62 void ff_mix_ ## chan ## _to_2_s16p_flt_sse2(int16_t **src, \
yading@11 63 float **matrix, int len, \
yading@11 64 int out_ch, int in_ch); \
yading@11 65 \
yading@11 66 void ff_mix_ ## chan ## _to_1_s16p_flt_sse4(int16_t **src, \
yading@11 67 float **matrix, int len, \
yading@11 68 int out_ch, int in_ch); \
yading@11 69 void ff_mix_ ## chan ## _to_2_s16p_flt_sse4(int16_t **src, \
yading@11 70 float **matrix, int len, \
yading@11 71 int out_ch, int in_ch); \
yading@11 72 \
yading@11 73 void ff_mix_ ## chan ## _to_1_fltp_flt_avx(float **src, \
yading@11 74 float **matrix, int len, \
yading@11 75 int out_ch, int in_ch); \
yading@11 76 void ff_mix_ ## chan ## _to_2_fltp_flt_avx(float **src, \
yading@11 77 float **matrix, int len, \
yading@11 78 int out_ch, int in_ch); \
yading@11 79 \
yading@11 80 void ff_mix_ ## chan ## _to_1_s16p_flt_avx(int16_t **src, \
yading@11 81 float **matrix, int len, \
yading@11 82 int out_ch, int in_ch); \
yading@11 83 void ff_mix_ ## chan ## _to_2_s16p_flt_avx(int16_t **src, \
yading@11 84 float **matrix, int len, \
yading@11 85 int out_ch, int in_ch); \
yading@11 86 \
yading@11 87 void ff_mix_ ## chan ## _to_1_fltp_flt_fma4(float **src, \
yading@11 88 float **matrix, int len, \
yading@11 89 int out_ch, int in_ch); \
yading@11 90 void ff_mix_ ## chan ## _to_2_fltp_flt_fma4(float **src, \
yading@11 91 float **matrix, int len, \
yading@11 92 int out_ch, int in_ch); \
yading@11 93 \
yading@11 94 void ff_mix_ ## chan ## _to_1_s16p_flt_fma4(int16_t **src, \
yading@11 95 float **matrix, int len, \
yading@11 96 int out_ch, int in_ch); \
yading@11 97 void ff_mix_ ## chan ## _to_2_s16p_flt_fma4(int16_t **src, \
yading@11 98 float **matrix, int len, \
yading@11 99 int out_ch, int in_ch);
yading@11 100
yading@11 101 DEFINE_MIX_3_8_TO_1_2(3)
yading@11 102 DEFINE_MIX_3_8_TO_1_2(4)
yading@11 103 DEFINE_MIX_3_8_TO_1_2(5)
yading@11 104 DEFINE_MIX_3_8_TO_1_2(6)
yading@11 105 DEFINE_MIX_3_8_TO_1_2(7)
yading@11 106 DEFINE_MIX_3_8_TO_1_2(8)
yading@11 107
yading@11 108 #define SET_MIX_3_8_TO_1_2(chan) \
yading@11 109 if (EXTERNAL_SSE(mm_flags)) { \
yading@11 110 ff_audio_mix_set_func(am, AV_SAMPLE_FMT_FLTP, AV_MIX_COEFF_TYPE_FLT,\
yading@11 111 chan, 1, 16, 4, "SSE", \
yading@11 112 ff_mix_ ## chan ## _to_1_fltp_flt_sse); \
yading@11 113 ff_audio_mix_set_func(am, AV_SAMPLE_FMT_FLTP, AV_MIX_COEFF_TYPE_FLT,\
yading@11 114 chan, 2, 16, 4, "SSE", \
yading@11 115 ff_mix_## chan ##_to_2_fltp_flt_sse); \
yading@11 116 } \
yading@11 117 if (EXTERNAL_SSE2(mm_flags)) { \
yading@11 118 ff_audio_mix_set_func(am, AV_SAMPLE_FMT_S16P, AV_MIX_COEFF_TYPE_FLT,\
yading@11 119 chan, 1, 16, 8, "SSE2", \
yading@11 120 ff_mix_ ## chan ## _to_1_s16p_flt_sse2); \
yading@11 121 ff_audio_mix_set_func(am, AV_SAMPLE_FMT_S16P, AV_MIX_COEFF_TYPE_FLT,\
yading@11 122 chan, 2, 16, 8, "SSE2", \
yading@11 123 ff_mix_ ## chan ## _to_2_s16p_flt_sse2); \
yading@11 124 } \
yading@11 125 if (EXTERNAL_SSE4(mm_flags)) { \
yading@11 126 ff_audio_mix_set_func(am, AV_SAMPLE_FMT_S16P, AV_MIX_COEFF_TYPE_FLT,\
yading@11 127 chan, 1, 16, 8, "SSE4", \
yading@11 128 ff_mix_ ## chan ## _to_1_s16p_flt_sse4); \
yading@11 129 ff_audio_mix_set_func(am, AV_SAMPLE_FMT_S16P, AV_MIX_COEFF_TYPE_FLT,\
yading@11 130 chan, 2, 16, 8, "SSE4", \
yading@11 131 ff_mix_ ## chan ## _to_2_s16p_flt_sse4); \
yading@11 132 } \
yading@11 133 if (EXTERNAL_AVX(mm_flags)) { \
yading@11 134 int ptr_align = 32; \
yading@11 135 int smp_align = 8; \
yading@11 136 if (ARCH_X86_32 || chan >= 6) { \
yading@11 137 ptr_align = 16; \
yading@11 138 smp_align = 4; \
yading@11 139 } \
yading@11 140 ff_audio_mix_set_func(am, AV_SAMPLE_FMT_FLTP, AV_MIX_COEFF_TYPE_FLT,\
yading@11 141 chan, 1, ptr_align, smp_align, "AVX", \
yading@11 142 ff_mix_ ## chan ## _to_1_fltp_flt_avx); \
yading@11 143 ff_audio_mix_set_func(am, AV_SAMPLE_FMT_FLTP, AV_MIX_COEFF_TYPE_FLT,\
yading@11 144 chan, 2, ptr_align, smp_align, "AVX", \
yading@11 145 ff_mix_ ## chan ## _to_2_fltp_flt_avx); \
yading@11 146 ff_audio_mix_set_func(am, AV_SAMPLE_FMT_S16P, AV_MIX_COEFF_TYPE_FLT,\
yading@11 147 chan, 1, 16, 8, "AVX", \
yading@11 148 ff_mix_ ## chan ## _to_1_s16p_flt_avx); \
yading@11 149 ff_audio_mix_set_func(am, AV_SAMPLE_FMT_S16P, AV_MIX_COEFF_TYPE_FLT,\
yading@11 150 chan, 2, 16, 8, "AVX", \
yading@11 151 ff_mix_ ## chan ## _to_2_s16p_flt_avx); \
yading@11 152 } \
yading@11 153 if (EXTERNAL_FMA4(mm_flags)) { \
yading@11 154 int ptr_align = 32; \
yading@11 155 int smp_align = 8; \
yading@11 156 if (ARCH_X86_32 || chan >= 6) { \
yading@11 157 ptr_align = 16; \
yading@11 158 smp_align = 4; \
yading@11 159 } \
yading@11 160 ff_audio_mix_set_func(am, AV_SAMPLE_FMT_FLTP, AV_MIX_COEFF_TYPE_FLT,\
yading@11 161 chan, 1, ptr_align, smp_align, "FMA4", \
yading@11 162 ff_mix_ ## chan ## _to_1_fltp_flt_fma4); \
yading@11 163 ff_audio_mix_set_func(am, AV_SAMPLE_FMT_FLTP, AV_MIX_COEFF_TYPE_FLT,\
yading@11 164 chan, 2, ptr_align, smp_align, "FMA4", \
yading@11 165 ff_mix_ ## chan ## _to_2_fltp_flt_fma4); \
yading@11 166 ff_audio_mix_set_func(am, AV_SAMPLE_FMT_S16P, AV_MIX_COEFF_TYPE_FLT,\
yading@11 167 chan, 1, 16, 8, "FMA4", \
yading@11 168 ff_mix_ ## chan ## _to_1_s16p_flt_fma4); \
yading@11 169 ff_audio_mix_set_func(am, AV_SAMPLE_FMT_S16P, AV_MIX_COEFF_TYPE_FLT,\
yading@11 170 chan, 2, 16, 8, "FMA4", \
yading@11 171 ff_mix_ ## chan ## _to_2_s16p_flt_fma4); \
yading@11 172 }
yading@11 173
yading@11 174 av_cold void ff_audio_mix_init_x86(AudioMix *am)
yading@11 175 {
yading@11 176 #if HAVE_YASM
yading@11 177 int mm_flags = av_get_cpu_flags();
yading@11 178
yading@11 179 if (EXTERNAL_SSE(mm_flags)) {
yading@11 180 ff_audio_mix_set_func(am, AV_SAMPLE_FMT_FLTP, AV_MIX_COEFF_TYPE_FLT,
yading@11 181 2, 1, 16, 8, "SSE", ff_mix_2_to_1_fltp_flt_sse);
yading@11 182 ff_audio_mix_set_func(am, AV_SAMPLE_FMT_FLTP, AV_MIX_COEFF_TYPE_FLT,
yading@11 183 1, 2, 16, 4, "SSE", ff_mix_1_to_2_fltp_flt_sse);
yading@11 184 }
yading@11 185 if (EXTERNAL_SSE2(mm_flags)) {
yading@11 186 ff_audio_mix_set_func(am, AV_SAMPLE_FMT_S16P, AV_MIX_COEFF_TYPE_FLT,
yading@11 187 2, 1, 16, 8, "SSE2", ff_mix_2_to_1_s16p_flt_sse2);
yading@11 188 ff_audio_mix_set_func(am, AV_SAMPLE_FMT_S16P, AV_MIX_COEFF_TYPE_Q8,
yading@11 189 2, 1, 16, 8, "SSE2", ff_mix_2_to_1_s16p_q8_sse2);
yading@11 190 ff_audio_mix_set_func(am, AV_SAMPLE_FMT_S16P, AV_MIX_COEFF_TYPE_FLT,
yading@11 191 1, 2, 16, 8, "SSE2", ff_mix_1_to_2_s16p_flt_sse2);
yading@11 192 }
yading@11 193 if (EXTERNAL_SSE4(mm_flags)) {
yading@11 194 ff_audio_mix_set_func(am, AV_SAMPLE_FMT_S16P, AV_MIX_COEFF_TYPE_FLT,
yading@11 195 2, 1, 16, 8, "SSE4", ff_mix_2_to_1_s16p_flt_sse4);
yading@11 196 ff_audio_mix_set_func(am, AV_SAMPLE_FMT_S16P, AV_MIX_COEFF_TYPE_FLT,
yading@11 197 1, 2, 16, 8, "SSE4", ff_mix_1_to_2_s16p_flt_sse4);
yading@11 198 }
yading@11 199 if (EXTERNAL_AVX(mm_flags)) {
yading@11 200 ff_audio_mix_set_func(am, AV_SAMPLE_FMT_FLTP, AV_MIX_COEFF_TYPE_FLT,
yading@11 201 2, 1, 32, 16, "AVX", ff_mix_2_to_1_fltp_flt_avx);
yading@11 202 ff_audio_mix_set_func(am, AV_SAMPLE_FMT_FLTP, AV_MIX_COEFF_TYPE_FLT,
yading@11 203 1, 2, 32, 8, "AVX", ff_mix_1_to_2_fltp_flt_avx);
yading@11 204 ff_audio_mix_set_func(am, AV_SAMPLE_FMT_S16P, AV_MIX_COEFF_TYPE_FLT,
yading@11 205 1, 2, 16, 8, "AVX", ff_mix_1_to_2_s16p_flt_avx);
yading@11 206 }
yading@11 207
yading@11 208 SET_MIX_3_8_TO_1_2(3)
yading@11 209 SET_MIX_3_8_TO_1_2(4)
yading@11 210 SET_MIX_3_8_TO_1_2(5)
yading@11 211 SET_MIX_3_8_TO_1_2(6)
yading@11 212 SET_MIX_3_8_TO_1_2(7)
yading@11 213 SET_MIX_3_8_TO_1_2(8)
yading@11 214 #endif /* HAVE_YASM */
yading@11 215 }