2 * This file is part of libswresample.
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.
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.
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
22 #include "libavutil/attributes.h"
23 #include "libavutil/cpu.h"
24 #include "libavutil/aarch64/cpu.h"
25 #include "libavutil/samplefmt.h"
26 #include "libswresample/swresample_internal.h"
27 #include "libswresample/audioconvert.h"
29 void swri_oldapi_conv_flt_to_s16_neon(int16_t *dst
, const float *src
, int len
);
30 void swri_oldapi_conv_fltp_to_s16_2ch_neon(int16_t *dst
, float *const *src
, int len
, int channels
);
31 void swri_oldapi_conv_fltp_to_s16_nch_neon(int16_t *dst
, float *const *src
, int len
, int channels
);
33 static 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
);
37 static 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);
41 static void conv_fltp_to_s16_nch_neon(uint8_t **dst
, const uint8_t **src
, int len
){
43 for(channels
=3; channels
<SWR_CH_MAX
&& src
[channels
]; channels
++)
45 swri_oldapi_conv_fltp_to_s16_nch_neon((int16_t*)*dst
, (float *const*)src
, len
, channels
);
48 av_cold
void swri_audio_convert_init_aarch64(struct AudioConvert
*ac
,
49 enum AVSampleFormat out_fmt
,
50 enum AVSampleFormat in_fmt
,
53 int cpu_flags
= av_get_cpu_flags();
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
;
65 ac
->in_simd_align_mask
= ac
->out_simd_align_mask
= 15;