xref: /aosp_15_r20/external/libopus/silk/arm/arm_silk_map.c (revision a58d3d2adb790c104798cd88c8a3aff4fa8b82cc)
1*a58d3d2aSXin Li /***********************************************************************
2*a58d3d2aSXin Li Copyright (C) 2014 Vidyo
3*a58d3d2aSXin Li Redistribution and use in source and binary forms, with or without
4*a58d3d2aSXin Li modification, are permitted provided that the following conditions
5*a58d3d2aSXin Li are met:
6*a58d3d2aSXin Li - Redistributions of source code must retain the above copyright notice,
7*a58d3d2aSXin Li this list of conditions and the following disclaimer.
8*a58d3d2aSXin Li - Redistributions in binary form must reproduce the above copyright
9*a58d3d2aSXin Li notice, this list of conditions and the following disclaimer in the
10*a58d3d2aSXin Li documentation and/or other materials provided with the distribution.
11*a58d3d2aSXin Li - Neither the name of Internet Society, IETF or IETF Trust, nor the
12*a58d3d2aSXin Li names of specific contributors, may be used to endorse or promote
13*a58d3d2aSXin Li products derived from this software without specific prior written
14*a58d3d2aSXin Li permission.
15*a58d3d2aSXin Li THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16*a58d3d2aSXin Li AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17*a58d3d2aSXin Li IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18*a58d3d2aSXin Li ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
19*a58d3d2aSXin Li LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20*a58d3d2aSXin Li CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21*a58d3d2aSXin Li SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22*a58d3d2aSXin Li INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23*a58d3d2aSXin Li CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24*a58d3d2aSXin Li ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25*a58d3d2aSXin Li POSSIBILITY OF SUCH DAMAGE.
26*a58d3d2aSXin Li ***********************************************************************/
27*a58d3d2aSXin Li #ifdef HAVE_CONFIG_H
28*a58d3d2aSXin Li # include "config.h"
29*a58d3d2aSXin Li #endif
30*a58d3d2aSXin Li 
31*a58d3d2aSXin Li #include "main_FIX.h"
32*a58d3d2aSXin Li #include "NSQ.h"
33*a58d3d2aSXin Li #include "SigProc_FIX.h"
34*a58d3d2aSXin Li 
35*a58d3d2aSXin Li #if defined(OPUS_HAVE_RTCD)
36*a58d3d2aSXin Li 
37*a58d3d2aSXin Li # if (defined(OPUS_ARM_MAY_HAVE_NEON_INTR) && \
38*a58d3d2aSXin Li  !defined(OPUS_ARM_PRESUME_NEON_INTR))
39*a58d3d2aSXin Li 
40*a58d3d2aSXin Li void (*const SILK_BIQUAD_ALT_STRIDE2_IMPL[OPUS_ARCHMASK + 1])(
41*a58d3d2aSXin Li         const opus_int16            *in,                /* I     input signal                                               */
42*a58d3d2aSXin Li         const opus_int32            *B_Q28,             /* I     MA coefficients [3]                                        */
43*a58d3d2aSXin Li         const opus_int32            *A_Q28,             /* I     AR coefficients [2]                                        */
44*a58d3d2aSXin Li         opus_int32                  *S,                 /* I/O   State vector [4]                                           */
45*a58d3d2aSXin Li         opus_int16                  *out,               /* O     output signal                                              */
46*a58d3d2aSXin Li         const opus_int32            len                 /* I     signal length (must be even)                               */
47*a58d3d2aSXin Li ) = {
48*a58d3d2aSXin Li       silk_biquad_alt_stride2_c,    /* ARMv4 */
49*a58d3d2aSXin Li       silk_biquad_alt_stride2_c,    /* EDSP */
50*a58d3d2aSXin Li       silk_biquad_alt_stride2_c,    /* Media */
51*a58d3d2aSXin Li       silk_biquad_alt_stride2_neon, /* Neon */
52*a58d3d2aSXin Li       silk_biquad_alt_stride2_neon, /* dotprod */
53*a58d3d2aSXin Li };
54*a58d3d2aSXin Li 
55*a58d3d2aSXin Li opus_int32 (*const SILK_LPC_INVERSE_PRED_GAIN_IMPL[OPUS_ARCHMASK + 1])( /* O   Returns inverse prediction gain in energy domain, Q30        */
56*a58d3d2aSXin Li         const opus_int16            *A_Q12,                             /* I   Prediction coefficients, Q12 [order]                         */
57*a58d3d2aSXin Li         const opus_int              order                               /* I   Prediction order                                             */
58*a58d3d2aSXin Li ) = {
59*a58d3d2aSXin Li       silk_LPC_inverse_pred_gain_c,    /* ARMv4 */
60*a58d3d2aSXin Li       silk_LPC_inverse_pred_gain_c,    /* EDSP */
61*a58d3d2aSXin Li       silk_LPC_inverse_pred_gain_c,    /* Media */
62*a58d3d2aSXin Li       silk_LPC_inverse_pred_gain_neon, /* Neon */
63*a58d3d2aSXin Li       silk_LPC_inverse_pred_gain_neon, /* dotprod */
64*a58d3d2aSXin Li };
65*a58d3d2aSXin Li 
66*a58d3d2aSXin Li void  (*const SILK_NSQ_DEL_DEC_IMPL[OPUS_ARCHMASK + 1])(
67*a58d3d2aSXin Li         const silk_encoder_state    *psEncC,                                    /* I    Encoder State                   */
68*a58d3d2aSXin Li         silk_nsq_state              *NSQ,                                       /* I/O  NSQ state                       */
69*a58d3d2aSXin Li         SideInfoIndices             *psIndices,                                 /* I/O  Quantization Indices            */
70*a58d3d2aSXin Li         const opus_int16            x16[],                                      /* I    Input                           */
71*a58d3d2aSXin Li         opus_int8                   pulses[],                                   /* O    Quantized pulse signal          */
72*a58d3d2aSXin Li         const opus_int16            *PredCoef_Q12,                              /* I    Short term prediction coefs     */
73*a58d3d2aSXin Li         const opus_int16            LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ],    /* I    Long term prediction coefs      */
74*a58d3d2aSXin Li         const opus_int16            AR_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I Noise shaping coefs              */
75*a58d3d2aSXin Li         const opus_int              HarmShapeGain_Q14[ MAX_NB_SUBFR ],          /* I    Long term shaping coefs         */
76*a58d3d2aSXin Li         const opus_int              Tilt_Q14[ MAX_NB_SUBFR ],                   /* I    Spectral tilt                   */
77*a58d3d2aSXin Li         const opus_int32            LF_shp_Q14[ MAX_NB_SUBFR ],                 /* I    Low frequency shaping coefs     */
78*a58d3d2aSXin Li         const opus_int32            Gains_Q16[ MAX_NB_SUBFR ],                  /* I    Quantization step sizes         */
79*a58d3d2aSXin Li         const opus_int              pitchL[ MAX_NB_SUBFR ],                     /* I    Pitch lags                      */
80*a58d3d2aSXin Li         const opus_int              Lambda_Q10,                                 /* I    Rate/distortion tradeoff        */
81*a58d3d2aSXin Li         const opus_int              LTP_scale_Q14                               /* I    LTP state scaling               */
82*a58d3d2aSXin Li ) = {
83*a58d3d2aSXin Li       silk_NSQ_del_dec_c,    /* ARMv4 */
84*a58d3d2aSXin Li       silk_NSQ_del_dec_c,    /* EDSP */
85*a58d3d2aSXin Li       silk_NSQ_del_dec_c,    /* Media */
86*a58d3d2aSXin Li       silk_NSQ_del_dec_neon, /* Neon */
87*a58d3d2aSXin Li       silk_NSQ_del_dec_neon, /* dotprod */
88*a58d3d2aSXin Li };
89*a58d3d2aSXin Li 
90*a58d3d2aSXin Li /*There is no table for silk_noise_shape_quantizer_short_prediction because the
91*a58d3d2aSXin Li    NEON version takes different parameters than the C version.
92*a58d3d2aSXin Li   Instead RTCD is done via if statements at the call sites.
93*a58d3d2aSXin Li   See NSQ_neon.h for details.*/
94*a58d3d2aSXin Li 
95*a58d3d2aSXin Li opus_int32
96*a58d3d2aSXin Li  (*const SILK_NSQ_NOISE_SHAPE_FEEDBACK_LOOP_IMPL[OPUS_ARCHMASK+1])(
97*a58d3d2aSXin Li  const opus_int32 *data0, opus_int32 *data1, const opus_int16 *coef,
98*a58d3d2aSXin Li  opus_int order) = {
99*a58d3d2aSXin Li   silk_NSQ_noise_shape_feedback_loop_c,    /* ARMv4 */
100*a58d3d2aSXin Li   silk_NSQ_noise_shape_feedback_loop_c,    /* EDSP */
101*a58d3d2aSXin Li   silk_NSQ_noise_shape_feedback_loop_c,    /* Media */
102*a58d3d2aSXin Li   silk_NSQ_noise_shape_feedback_loop_neon, /* NEON */
103*a58d3d2aSXin Li   silk_NSQ_noise_shape_feedback_loop_neon, /* dotprod */
104*a58d3d2aSXin Li };
105*a58d3d2aSXin Li 
106*a58d3d2aSXin Li # endif
107*a58d3d2aSXin Li 
108*a58d3d2aSXin Li # if defined(FIXED_POINT) && \
109*a58d3d2aSXin Li  defined(OPUS_ARM_MAY_HAVE_NEON_INTR) && !defined(OPUS_ARM_PRESUME_NEON_INTR)
110*a58d3d2aSXin Li 
111*a58d3d2aSXin Li void (*const SILK_WARPED_AUTOCORRELATION_FIX_IMPL[OPUS_ARCHMASK + 1])(
112*a58d3d2aSXin Li           opus_int32                *corr,                                  /* O    Result [order + 1]                                                          */
113*a58d3d2aSXin Li           opus_int                  *scale,                                 /* O    Scaling of the correlation vector                                           */
114*a58d3d2aSXin Li     const opus_int16                *input,                                 /* I    Input data to correlate                                                     */
115*a58d3d2aSXin Li     const opus_int                  warping_Q16,                            /* I    Warping coefficient                                                         */
116*a58d3d2aSXin Li     const opus_int                  length,                                 /* I    Length of input                                                             */
117*a58d3d2aSXin Li     const opus_int                  order                                   /* I    Correlation order (even)                                                    */
118*a58d3d2aSXin Li ) = {
119*a58d3d2aSXin Li       silk_warped_autocorrelation_FIX_c,    /* ARMv4 */
120*a58d3d2aSXin Li       silk_warped_autocorrelation_FIX_c,    /* EDSP */
121*a58d3d2aSXin Li       silk_warped_autocorrelation_FIX_c,    /* Media */
122*a58d3d2aSXin Li       silk_warped_autocorrelation_FIX_neon, /* Neon */
123*a58d3d2aSXin Li       silk_warped_autocorrelation_FIX_neon, /* dotprod */
124*a58d3d2aSXin Li };
125*a58d3d2aSXin Li 
126*a58d3d2aSXin Li # endif
127*a58d3d2aSXin Li 
128*a58d3d2aSXin Li #endif /* OPUS_HAVE_RTCD */
129