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