|
|
|
@ -28,10 +28,10 @@ |
|
|
|
|
#include "libswresample/resample.h" |
|
|
|
|
|
|
|
|
|
#define RESAMPLE_FUNCS(type, opt) \ |
|
|
|
|
int ff_resample_common_##type##_##opt(ResampleContext *c, uint8_t *dst, \
|
|
|
|
|
const uint8_t *src, int sz, int upd); \
|
|
|
|
|
int ff_resample_linear_##type##_##opt(ResampleContext *c, uint8_t *dst, \
|
|
|
|
|
const uint8_t *src, int sz, int upd) |
|
|
|
|
int ff_resample_common_##type##_##opt(ResampleContext *c, void *dst, \
|
|
|
|
|
const void *src, int sz, int upd); \
|
|
|
|
|
int ff_resample_linear_##type##_##opt(ResampleContext *c, void *dst, \
|
|
|
|
|
const void *src, int sz, int upd) |
|
|
|
|
|
|
|
|
|
RESAMPLE_FUNCS(int16, mmxext); |
|
|
|
|
RESAMPLE_FUNCS(int16, sse2); |
|
|
|
@ -46,36 +46,44 @@ void swri_resample_dsp_x86_init(ResampleContext *c) |
|
|
|
|
{ |
|
|
|
|
int av_unused mm_flags = av_get_cpu_flags(); |
|
|
|
|
|
|
|
|
|
#define FNIDX(fmt) (AV_SAMPLE_FMT_##fmt - AV_SAMPLE_FMT_S16P) |
|
|
|
|
if (ARCH_X86_32 && HAVE_MMXEXT_EXTERNAL && mm_flags & AV_CPU_FLAG_MMX2) { |
|
|
|
|
c->dsp.resample_common[FNIDX(S16P)] = ff_resample_common_int16_mmxext; |
|
|
|
|
c->dsp.resample_linear[FNIDX(S16P)] = ff_resample_linear_int16_mmxext; |
|
|
|
|
} |
|
|
|
|
if (HAVE_SSE_EXTERNAL && mm_flags & AV_CPU_FLAG_SSE) { |
|
|
|
|
c->dsp.resample_common[FNIDX(FLTP)] = ff_resample_common_float_sse; |
|
|
|
|
c->dsp.resample_linear[FNIDX(FLTP)] = ff_resample_linear_float_sse; |
|
|
|
|
} |
|
|
|
|
if (HAVE_SSE2_EXTERNAL && mm_flags & AV_CPU_FLAG_SSE2) { |
|
|
|
|
c->dsp.resample_common[FNIDX(S16P)] = ff_resample_common_int16_sse2; |
|
|
|
|
c->dsp.resample_linear[FNIDX(S16P)] = ff_resample_linear_int16_sse2; |
|
|
|
|
|
|
|
|
|
c->dsp.resample_common[FNIDX(DBLP)] = ff_resample_common_double_sse2; |
|
|
|
|
c->dsp.resample_linear[FNIDX(DBLP)] = ff_resample_linear_double_sse2; |
|
|
|
|
} |
|
|
|
|
if (HAVE_AVX_EXTERNAL && mm_flags & AV_CPU_FLAG_AVX) { |
|
|
|
|
c->dsp.resample_common[FNIDX(FLTP)] = ff_resample_common_float_avx; |
|
|
|
|
c->dsp.resample_linear[FNIDX(FLTP)] = ff_resample_linear_float_avx; |
|
|
|
|
} |
|
|
|
|
if (HAVE_FMA3_EXTERNAL && mm_flags & AV_CPU_FLAG_FMA3) { |
|
|
|
|
c->dsp.resample_common[FNIDX(FLTP)] = ff_resample_common_float_fma3; |
|
|
|
|
c->dsp.resample_linear[FNIDX(FLTP)] = ff_resample_linear_float_fma3; |
|
|
|
|
} |
|
|
|
|
if (HAVE_FMA4_EXTERNAL && mm_flags & AV_CPU_FLAG_FMA4) { |
|
|
|
|
c->dsp.resample_common[FNIDX(FLTP)] = ff_resample_common_float_fma4; |
|
|
|
|
c->dsp.resample_linear[FNIDX(FLTP)] = ff_resample_linear_float_fma4; |
|
|
|
|
} |
|
|
|
|
if (HAVE_XOP_EXTERNAL && mm_flags & AV_CPU_FLAG_XOP) { |
|
|
|
|
c->dsp.resample_common[FNIDX(S16P)] = ff_resample_common_int16_xop; |
|
|
|
|
c->dsp.resample_linear[FNIDX(S16P)] = ff_resample_linear_int16_xop; |
|
|
|
|
switch(c->format){ |
|
|
|
|
case AV_SAMPLE_FMT_S16P: |
|
|
|
|
if (ARCH_X86_32 && HAVE_MMXEXT_EXTERNAL && mm_flags & AV_CPU_FLAG_MMX2) { |
|
|
|
|
c->dsp.resample = c->linear ? ff_resample_linear_int16_mmxext |
|
|
|
|
: ff_resample_common_int16_mmxext; |
|
|
|
|
} |
|
|
|
|
if (HAVE_SSE2_EXTERNAL && mm_flags & AV_CPU_FLAG_SSE2) { |
|
|
|
|
c->dsp.resample = c->linear ? ff_resample_linear_int16_sse2 |
|
|
|
|
: ff_resample_common_int16_sse2; |
|
|
|
|
} |
|
|
|
|
if (HAVE_XOP_EXTERNAL && mm_flags & AV_CPU_FLAG_XOP) { |
|
|
|
|
c->dsp.resample = c->linear ? ff_resample_linear_int16_xop |
|
|
|
|
: ff_resample_common_int16_xop; |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
case AV_SAMPLE_FMT_FLTP: |
|
|
|
|
if (HAVE_SSE_EXTERNAL && mm_flags & AV_CPU_FLAG_SSE) { |
|
|
|
|
c->dsp.resample = c->linear ? ff_resample_linear_float_sse |
|
|
|
|
: ff_resample_common_float_sse; |
|
|
|
|
} |
|
|
|
|
if (HAVE_AVX_EXTERNAL && mm_flags & AV_CPU_FLAG_AVX) { |
|
|
|
|
c->dsp.resample = c->linear ? ff_resample_linear_float_avx |
|
|
|
|
: ff_resample_common_float_avx; |
|
|
|
|
} |
|
|
|
|
if (HAVE_FMA3_EXTERNAL && mm_flags & AV_CPU_FLAG_FMA3) { |
|
|
|
|
c->dsp.resample = c->linear ? ff_resample_linear_float_fma3 |
|
|
|
|
: ff_resample_common_float_fma3; |
|
|
|
|
} |
|
|
|
|
if (HAVE_FMA4_EXTERNAL && mm_flags & AV_CPU_FLAG_FMA4) { |
|
|
|
|
c->dsp.resample = c->linear ? ff_resample_linear_float_fma4 |
|
|
|
|
: ff_resample_common_float_fma4; |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
case AV_SAMPLE_FMT_DBLP: |
|
|
|
|
if (HAVE_SSE2_EXTERNAL && mm_flags & AV_CPU_FLAG_SSE2) { |
|
|
|
|
c->dsp.resample = c->linear ? ff_resample_linear_double_sse2 |
|
|
|
|
: ff_resample_common_double_sse2; |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|