Adapted to swr by: Michael Niedermayer <michaelni@gmx.at> Signed-off-by: Michael Niedermayer <michaelni@gmx.at>tags/n1.0
| @@ -0,0 +1,2 @@ | |||||
| OBJS += arm/audio_convert_init.o | |||||
| NEON-OBJS += arm/audio_convert_neon.o | |||||
| @@ -0,0 +1,48 @@ | |||||
| /* | |||||
| * This file is part of libswresample. | |||||
| * | |||||
| * libswresample 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. | |||||
| * | |||||
| * libswresample 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 libswresample; if not, write to the Free Software | |||||
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |||||
| */ | |||||
| #include <stdint.h> | |||||
| #include "config.h" | |||||
| #include "libavutil/attributes.h" | |||||
| #include "libavutil/cpu.h" | |||||
| #include "libavutil/arm/cpu.h" | |||||
| #include "libavutil/samplefmt.h" | |||||
| #include "libswresample/swresample_internal.h" | |||||
| #include "libswresample/audioconvert.h" | |||||
| void swri_oldapi_conv_flt_to_s16_neon(int16_t *dst, const float *src, int len); | |||||
| static void conv_flt_to_s16_neon(uint8_t **dst, const uint8_t **src, int len){ | |||||
| swri_oldapi_conv_flt_to_s16_neon((int16_t*)*dst, (const float*)*src, len); | |||||
| } | |||||
| av_cold void swri_audio_convert_init_arm(struct AudioConvert *ac, | |||||
| enum AVSampleFormat out_fmt, | |||||
| enum AVSampleFormat in_fmt, | |||||
| int channels) | |||||
| { | |||||
| int cpu_flags = av_get_cpu_flags(); | |||||
| ac->simd_f= NULL; | |||||
| if (have_neon(cpu_flags)) { | |||||
| if(out_fmt == AV_SAMPLE_FMT_S16 && in_fmt == AV_SAMPLE_FMT_FLT || out_fmt == AV_SAMPLE_FMT_S16P && in_fmt == AV_SAMPLE_FMT_FLTP) | |||||
| ac->simd_f = conv_flt_to_s16_neon; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,66 @@ | |||||
| /* | |||||
| * Copyright (c) 2008 Mans Rullgard <mans@mansr.com> | |||||
| * | |||||
| * This file is part of libswresample. | |||||
| * | |||||
| * libswresample 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. | |||||
| * | |||||
| * libswresample 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 libswresample; if not, write to the Free Software | |||||
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |||||
| */ | |||||
| #include "config.h" | |||||
| #include "libavutil/arm/asm.S" | |||||
| function swri_oldapi_conv_flt_to_s16_neon, export=1 | |||||
| subs r2, r2, #8 | |||||
| vld1.32 {q0}, [r1,:128]! | |||||
| vcvt.s32.f32 q8, q0, #31 | |||||
| vld1.32 {q1}, [r1,:128]! | |||||
| vcvt.s32.f32 q9, q1, #31 | |||||
| beq 3f | |||||
| bics r12, r2, #15 | |||||
| beq 2f | |||||
| 1: subs r12, r12, #16 | |||||
| vqrshrn.s32 d4, q8, #16 | |||||
| vld1.32 {q0}, [r1,:128]! | |||||
| vcvt.s32.f32 q0, q0, #31 | |||||
| vqrshrn.s32 d5, q9, #16 | |||||
| vld1.32 {q1}, [r1,:128]! | |||||
| vcvt.s32.f32 q1, q1, #31 | |||||
| vqrshrn.s32 d6, q0, #16 | |||||
| vst1.16 {q2}, [r0,:128]! | |||||
| vqrshrn.s32 d7, q1, #16 | |||||
| vld1.32 {q8}, [r1,:128]! | |||||
| vcvt.s32.f32 q8, q8, #31 | |||||
| vld1.32 {q9}, [r1,:128]! | |||||
| vcvt.s32.f32 q9, q9, #31 | |||||
| vst1.16 {q3}, [r0,:128]! | |||||
| bne 1b | |||||
| ands r2, r2, #15 | |||||
| beq 3f | |||||
| 2: vld1.32 {q0}, [r1,:128]! | |||||
| vqrshrn.s32 d4, q8, #16 | |||||
| vcvt.s32.f32 q0, q0, #31 | |||||
| vld1.32 {q1}, [r1,:128]! | |||||
| vqrshrn.s32 d5, q9, #16 | |||||
| vcvt.s32.f32 q1, q1, #31 | |||||
| vqrshrn.s32 d6, q0, #16 | |||||
| vst1.16 {q2}, [r0,:128]! | |||||
| vqrshrn.s32 d7, q1, #16 | |||||
| vst1.16 {q3}, [r0,:128]! | |||||
| bx lr | |||||
| 3: vqrshrn.s32 d4, q8, #16 | |||||
| vqrshrn.s32 d5, q9, #16 | |||||
| vst1.16 {q2}, [r0,:128]! | |||||
| bx lr | |||||
| endfunc | |||||
| @@ -155,6 +155,7 @@ AudioConvert *swri_audio_convert_alloc(enum AVSampleFormat out_fmt, | |||||
| } | } | ||||
| if(HAVE_YASM && HAVE_MMX) swri_audio_convert_init_x86(ctx, out_fmt, in_fmt, channels); | if(HAVE_YASM && HAVE_MMX) swri_audio_convert_init_x86(ctx, out_fmt, in_fmt, channels); | ||||
| if(ARCH_ARM) swri_audio_convert_init_arm(ctx, out_fmt, in_fmt, channels); | |||||
| return ctx; | return ctx; | ||||
| } | } | ||||
| @@ -131,6 +131,10 @@ void swri_rematrix_init_x86(struct SwrContext *s); | |||||
| void swri_get_dither(SwrContext *s, void *dst, int len, unsigned seed, enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt); | void swri_get_dither(SwrContext *s, void *dst, int len, unsigned seed, enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt); | ||||
| void swri_audio_convert_init_arm(struct AudioConvert *ac, | |||||
| enum AVSampleFormat out_fmt, | |||||
| enum AVSampleFormat in_fmt, | |||||
| int channels); | |||||
| void swri_audio_convert_init_x86(struct AudioConvert *ac, | void swri_audio_convert_init_x86(struct AudioConvert *ac, | ||||
| enum AVSampleFormat out_fmt, | enum AVSampleFormat out_fmt, | ||||
| enum AVSampleFormat in_fmt, | enum AVSampleFormat in_fmt, | ||||