12bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian/* Copyright (c) 2010 Xiph.Org Foundation
22bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian * Copyright (c) 2013 Parrot */
32bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian/*
42bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian   Redistribution and use in source and binary forms, with or without
52bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian   modification, are permitted provided that the following conditions
62bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian   are met:
72bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian
82bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian   - Redistributions of source code must retain the above copyright
92bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian   notice, this list of conditions and the following disclaimer.
102bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian
112bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian   - Redistributions in binary form must reproduce the above copyright
122bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian   notice, this list of conditions and the following disclaimer in the
132bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian   documentation and/or other materials provided with the distribution.
142bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian
152bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
162bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian   ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
172bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
182bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
192bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian   OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
202bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
212bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
222bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
232bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
242bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
252bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
262bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian*/
272bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian
282bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#ifdef HAVE_CONFIG_H
292bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#include "config.h"
302bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#endif
312bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian
322bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#include "pitch.h"
33c91ee5b5642fcc4969150f73d5f6848f88bf1638flim#include "kiss_fft.h"
34c91ee5b5642fcc4969150f73d5f6848f88bf1638flim#include "mdct.h"
352bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian
362bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#if defined(OPUS_HAVE_RTCD)
372bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian
382bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian# if defined(FIXED_POINT)
39d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim#  if ((defined(OPUS_ARM_MAY_HAVE_NEON) && !defined(OPUS_ARM_PRESUME_NEON)) || \
40d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim    (defined(OPUS_ARM_MAY_HAVE_MEDIA) && !defined(OPUS_ARM_PRESUME_MEDIA)) || \
41d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim    (defined(OPUS_ARM_MAY_HAVE_EDSP) && !defined(OPUS_ARM_PRESUME_EDSP)))
422bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanianopus_val32 (*const CELT_PITCH_XCORR_IMPL[OPUS_ARCHMASK+1])(const opus_val16 *,
432bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian    const opus_val16 *, opus_val32 *, int , int) = {
442bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian  celt_pitch_xcorr_c,               /* ARMv4 */
452bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian  MAY_HAVE_EDSP(celt_pitch_xcorr),  /* EDSP */
462bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian  MAY_HAVE_MEDIA(celt_pitch_xcorr), /* Media */
472bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian  MAY_HAVE_NEON(celt_pitch_xcorr)   /* NEON */
482bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian};
49d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim
50d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim#  endif
51c91ee5b5642fcc4969150f73d5f6848f88bf1638flim# else /* !FIXED_POINT */
52d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim#  if defined(OPUS_ARM_MAY_HAVE_NEON_INTR) && !defined(OPUS_ARM_PRESUME_NEON_INTR)
53c91ee5b5642fcc4969150f73d5f6848f88bf1638flimvoid (*const CELT_PITCH_XCORR_IMPL[OPUS_ARCHMASK+1])(const opus_val16 *,
54c91ee5b5642fcc4969150f73d5f6848f88bf1638flim    const opus_val16 *, opus_val32 *, int, int) = {
55c91ee5b5642fcc4969150f73d5f6848f88bf1638flim  celt_pitch_xcorr_c,              /* ARMv4 */
56c91ee5b5642fcc4969150f73d5f6848f88bf1638flim  celt_pitch_xcorr_c,              /* EDSP */
57c91ee5b5642fcc4969150f73d5f6848f88bf1638flim  celt_pitch_xcorr_c,              /* Media */
58c91ee5b5642fcc4969150f73d5f6848f88bf1638flim  celt_pitch_xcorr_float_neon      /* Neon */
59c91ee5b5642fcc4969150f73d5f6848f88bf1638flim};
60c91ee5b5642fcc4969150f73d5f6848f88bf1638flim#  endif
61c91ee5b5642fcc4969150f73d5f6848f88bf1638flim# endif /* FIXED_POINT */
622bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian
63d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim#if defined(FIXED_POINT) && defined(OPUS_HAVE_RTCD) && \
64d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim defined(OPUS_ARM_MAY_HAVE_NEON_INTR) && !defined(OPUS_ARM_PRESUME_NEON_INTR)
65d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim
66d03c373974c945b4b62b59b873522387418a2a3fFelicia Limvoid (*const XCORR_KERNEL_IMPL[OPUS_ARCHMASK + 1])(
67d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim         const opus_val16 *x,
68d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim         const opus_val16 *y,
69d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim         opus_val32       sum[4],
70d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim         int              len
71d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim) = {
72d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim  xcorr_kernel_c,                /* ARMv4 */
73d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim  xcorr_kernel_c,                /* EDSP */
74d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim  xcorr_kernel_c,                /* Media */
75d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim  xcorr_kernel_neon_fixed,       /* Neon */
76d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim};
77d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim
78d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim#endif
79d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim
80c91ee5b5642fcc4969150f73d5f6848f88bf1638flim# if defined(OPUS_ARM_MAY_HAVE_NEON_INTR)
81c91ee5b5642fcc4969150f73d5f6848f88bf1638flim#  if defined(HAVE_ARM_NE10)
82c91ee5b5642fcc4969150f73d5f6848f88bf1638flim#   if defined(CUSTOM_MODES)
83c91ee5b5642fcc4969150f73d5f6848f88bf1638flimint (*const OPUS_FFT_ALLOC_ARCH_IMPL[OPUS_ARCHMASK+1])(kiss_fft_state *st) = {
84c91ee5b5642fcc4969150f73d5f6848f88bf1638flim   opus_fft_alloc_arch_c,        /* ARMv4 */
85c91ee5b5642fcc4969150f73d5f6848f88bf1638flim   opus_fft_alloc_arch_c,        /* EDSP */
86c91ee5b5642fcc4969150f73d5f6848f88bf1638flim   opus_fft_alloc_arch_c,        /* Media */
87c91ee5b5642fcc4969150f73d5f6848f88bf1638flim   opus_fft_alloc_arm_neon       /* Neon with NE10 library support */
88c91ee5b5642fcc4969150f73d5f6848f88bf1638flim};
89c91ee5b5642fcc4969150f73d5f6848f88bf1638flim
90c91ee5b5642fcc4969150f73d5f6848f88bf1638flimvoid (*const OPUS_FFT_FREE_ARCH_IMPL[OPUS_ARCHMASK+1])(kiss_fft_state *st) = {
91c91ee5b5642fcc4969150f73d5f6848f88bf1638flim   opus_fft_free_arch_c,         /* ARMv4 */
92c91ee5b5642fcc4969150f73d5f6848f88bf1638flim   opus_fft_free_arch_c,         /* EDSP */
93c91ee5b5642fcc4969150f73d5f6848f88bf1638flim   opus_fft_free_arch_c,         /* Media */
94c91ee5b5642fcc4969150f73d5f6848f88bf1638flim   opus_fft_free_arm_neon        /* Neon with NE10 */
95c91ee5b5642fcc4969150f73d5f6848f88bf1638flim};
96c91ee5b5642fcc4969150f73d5f6848f88bf1638flim#   endif /* CUSTOM_MODES */
97c91ee5b5642fcc4969150f73d5f6848f88bf1638flim
98c91ee5b5642fcc4969150f73d5f6848f88bf1638flimvoid (*const OPUS_FFT[OPUS_ARCHMASK+1])(const kiss_fft_state *cfg,
99c91ee5b5642fcc4969150f73d5f6848f88bf1638flim                                        const kiss_fft_cpx *fin,
100c91ee5b5642fcc4969150f73d5f6848f88bf1638flim                                        kiss_fft_cpx *fout) = {
101c91ee5b5642fcc4969150f73d5f6848f88bf1638flim   opus_fft_c,                   /* ARMv4 */
102c91ee5b5642fcc4969150f73d5f6848f88bf1638flim   opus_fft_c,                   /* EDSP */
103c91ee5b5642fcc4969150f73d5f6848f88bf1638flim   opus_fft_c,                   /* Media */
104c91ee5b5642fcc4969150f73d5f6848f88bf1638flim   opus_fft_neon                 /* Neon with NE10 */
105c91ee5b5642fcc4969150f73d5f6848f88bf1638flim};
106c91ee5b5642fcc4969150f73d5f6848f88bf1638flim
107c91ee5b5642fcc4969150f73d5f6848f88bf1638flimvoid (*const OPUS_IFFT[OPUS_ARCHMASK+1])(const kiss_fft_state *cfg,
108c91ee5b5642fcc4969150f73d5f6848f88bf1638flim                                         const kiss_fft_cpx *fin,
109c91ee5b5642fcc4969150f73d5f6848f88bf1638flim                                         kiss_fft_cpx *fout) = {
110c91ee5b5642fcc4969150f73d5f6848f88bf1638flim   opus_ifft_c,                   /* ARMv4 */
111c91ee5b5642fcc4969150f73d5f6848f88bf1638flim   opus_ifft_c,                   /* EDSP */
112c91ee5b5642fcc4969150f73d5f6848f88bf1638flim   opus_ifft_c,                   /* Media */
113c91ee5b5642fcc4969150f73d5f6848f88bf1638flim   opus_ifft_neon                 /* Neon with NE10 */
114c91ee5b5642fcc4969150f73d5f6848f88bf1638flim};
115c91ee5b5642fcc4969150f73d5f6848f88bf1638flim
116c91ee5b5642fcc4969150f73d5f6848f88bf1638flimvoid (*const CLT_MDCT_FORWARD_IMPL[OPUS_ARCHMASK+1])(const mdct_lookup *l,
117c91ee5b5642fcc4969150f73d5f6848f88bf1638flim                                                     kiss_fft_scalar *in,
118c91ee5b5642fcc4969150f73d5f6848f88bf1638flim                                                     kiss_fft_scalar * OPUS_RESTRICT out,
119c91ee5b5642fcc4969150f73d5f6848f88bf1638flim                                                     const opus_val16 *window,
120c91ee5b5642fcc4969150f73d5f6848f88bf1638flim                                                     int overlap, int shift,
121c91ee5b5642fcc4969150f73d5f6848f88bf1638flim                                                     int stride, int arch) = {
122c91ee5b5642fcc4969150f73d5f6848f88bf1638flim   clt_mdct_forward_c,           /* ARMv4 */
123c91ee5b5642fcc4969150f73d5f6848f88bf1638flim   clt_mdct_forward_c,           /* EDSP */
124c91ee5b5642fcc4969150f73d5f6848f88bf1638flim   clt_mdct_forward_c,           /* Media */
125c91ee5b5642fcc4969150f73d5f6848f88bf1638flim   clt_mdct_forward_neon         /* Neon with NE10 */
126c91ee5b5642fcc4969150f73d5f6848f88bf1638flim};
127c91ee5b5642fcc4969150f73d5f6848f88bf1638flim
128c91ee5b5642fcc4969150f73d5f6848f88bf1638flimvoid (*const CLT_MDCT_BACKWARD_IMPL[OPUS_ARCHMASK+1])(const mdct_lookup *l,
129c91ee5b5642fcc4969150f73d5f6848f88bf1638flim                                                      kiss_fft_scalar *in,
130c91ee5b5642fcc4969150f73d5f6848f88bf1638flim                                                      kiss_fft_scalar * OPUS_RESTRICT out,
131c91ee5b5642fcc4969150f73d5f6848f88bf1638flim                                                      const opus_val16 *window,
132c91ee5b5642fcc4969150f73d5f6848f88bf1638flim                                                      int overlap, int shift,
133c91ee5b5642fcc4969150f73d5f6848f88bf1638flim                                                      int stride, int arch) = {
134c91ee5b5642fcc4969150f73d5f6848f88bf1638flim   clt_mdct_backward_c,           /* ARMv4 */
135c91ee5b5642fcc4969150f73d5f6848f88bf1638flim   clt_mdct_backward_c,           /* EDSP */
136c91ee5b5642fcc4969150f73d5f6848f88bf1638flim   clt_mdct_backward_c,           /* Media */
137c91ee5b5642fcc4969150f73d5f6848f88bf1638flim   clt_mdct_backward_neon         /* Neon with NE10 */
138c91ee5b5642fcc4969150f73d5f6848f88bf1638flim};
139c91ee5b5642fcc4969150f73d5f6848f88bf1638flim
140c91ee5b5642fcc4969150f73d5f6848f88bf1638flim#  endif /* HAVE_ARM_NE10 */
141c91ee5b5642fcc4969150f73d5f6848f88bf1638flim# endif /* OPUS_ARM_MAY_HAVE_NEON_INTR */
142c91ee5b5642fcc4969150f73d5f6848f88bf1638flim
143c91ee5b5642fcc4969150f73d5f6848f88bf1638flim#endif /* OPUS_HAVE_RTCD */
144