1/* 2 * This file is part of libswresample. 3 * 4 * libswresample is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU Lesser General Public 6 * License as published by the Free Software Foundation; either 7 * version 2.1 of the License, or (at your option) any later version. 8 * 9 * libswresample is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 * Lesser General Public License for more details. 13 * 14 * You should have received a copy of the GNU Lesser General Public 15 * License along with libswresample; if not, write to the Free Software 16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 17 */ 18 19#include <stdint.h> 20 21#include "config.h" 22#include "libavutil/attributes.h" 23#include "libavutil/cpu.h" 24#include "libavutil/arm/cpu.h" 25#include "libavutil/samplefmt.h" 26#include "libswresample/swresample_internal.h" 27#include "libswresample/audioconvert.h" 28 29void swri_oldapi_conv_flt_to_s16_neon(int16_t *dst, const float *src, int len); 30void swri_oldapi_conv_fltp_to_s16_2ch_neon(int16_t *dst, float *const *src, int len, int channels); 31void swri_oldapi_conv_fltp_to_s16_nch_neon(int16_t *dst, float *const *src, int len, int channels); 32 33static void conv_flt_to_s16_neon(uint8_t **dst, const uint8_t **src, int len){ 34 swri_oldapi_conv_flt_to_s16_neon((int16_t*)*dst, (const float*)*src, len); 35} 36 37static void conv_fltp_to_s16_2ch_neon(uint8_t **dst, const uint8_t **src, int len){ 38 swri_oldapi_conv_fltp_to_s16_2ch_neon((int16_t*)*dst, (float *const*)src, len, 2); 39} 40 41static void conv_fltp_to_s16_nch_neon(uint8_t **dst, const uint8_t **src, int len){ 42 int channels; 43 for(channels=3; channels<SWR_CH_MAX && src[channels]; channels++) 44 ; 45 swri_oldapi_conv_fltp_to_s16_nch_neon((int16_t*)*dst, (float *const*)src, len, channels); 46} 47 48av_cold void swri_audio_convert_init_arm(struct AudioConvert *ac, 49 enum AVSampleFormat out_fmt, 50 enum AVSampleFormat in_fmt, 51 int channels) 52{ 53 int cpu_flags = av_get_cpu_flags(); 54 55 ac->simd_f= NULL; 56 57 if (have_neon(cpu_flags)) { 58 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) 59 ac->simd_f = conv_flt_to_s16_neon; 60 if(out_fmt == AV_SAMPLE_FMT_S16 && in_fmt == AV_SAMPLE_FMT_FLTP && channels == 2) 61 ac->simd_f = conv_fltp_to_s16_2ch_neon; 62 if(out_fmt == AV_SAMPLE_FMT_S16 && in_fmt == AV_SAMPLE_FMT_FLTP && channels > 2) 63 ac->simd_f = conv_fltp_to_s16_nch_neon; 64 if(ac->simd_f) 65 ac->in_simd_align_mask = ac->out_simd_align_mask = 15; 66 } 67} 68