xref: /aosp_15_r20/external/libopus/silk/main.h (revision a58d3d2adb790c104798cd88c8a3aff4fa8b82cc)
1*a58d3d2aSXin Li /***********************************************************************
2*a58d3d2aSXin Li Copyright (c) 2006-2011, Skype Limited. All rights reserved.
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 
28*a58d3d2aSXin Li #ifndef SILK_MAIN_H
29*a58d3d2aSXin Li #define SILK_MAIN_H
30*a58d3d2aSXin Li 
31*a58d3d2aSXin Li #include "SigProc_FIX.h"
32*a58d3d2aSXin Li #include "define.h"
33*a58d3d2aSXin Li #include "structs.h"
34*a58d3d2aSXin Li #include "tables.h"
35*a58d3d2aSXin Li #include "PLC.h"
36*a58d3d2aSXin Li #include "control.h"
37*a58d3d2aSXin Li #include "debug.h"
38*a58d3d2aSXin Li #include "entenc.h"
39*a58d3d2aSXin Li #include "entdec.h"
40*a58d3d2aSXin Li 
41*a58d3d2aSXin Li #if defined(OPUS_X86_MAY_HAVE_SSE4_1)
42*a58d3d2aSXin Li #include "x86/main_sse.h"
43*a58d3d2aSXin Li #endif
44*a58d3d2aSXin Li 
45*a58d3d2aSXin Li #if (defined(OPUS_ARM_ASM) || defined(OPUS_ARM_MAY_HAVE_NEON_INTR))
46*a58d3d2aSXin Li #include "arm/NSQ_del_dec_arm.h"
47*a58d3d2aSXin Li #endif
48*a58d3d2aSXin Li 
49*a58d3d2aSXin Li /* Convert Left/Right stereo signal to adaptive Mid/Side representation */
50*a58d3d2aSXin Li void silk_stereo_LR_to_MS(
51*a58d3d2aSXin Li     stereo_enc_state            *state,                         /* I/O  State                                       */
52*a58d3d2aSXin Li     opus_int16                  x1[],                           /* I/O  Left input signal, becomes mid signal       */
53*a58d3d2aSXin Li     opus_int16                  x2[],                           /* I/O  Right input signal, becomes side signal     */
54*a58d3d2aSXin Li     opus_int8                   ix[ 2 ][ 3 ],                   /* O    Quantization indices                        */
55*a58d3d2aSXin Li     opus_int8                   *mid_only_flag,                 /* O    Flag: only mid signal coded                 */
56*a58d3d2aSXin Li     opus_int32                  mid_side_rates_bps[],           /* O    Bitrates for mid and side signals           */
57*a58d3d2aSXin Li     opus_int32                  total_rate_bps,                 /* I    Total bitrate                               */
58*a58d3d2aSXin Li     opus_int                    prev_speech_act_Q8,             /* I    Speech activity level in previous frame     */
59*a58d3d2aSXin Li     opus_int                    toMono,                         /* I    Last frame before a stereo->mono transition */
60*a58d3d2aSXin Li     opus_int                    fs_kHz,                         /* I    Sample rate (kHz)                           */
61*a58d3d2aSXin Li     opus_int                    frame_length                    /* I    Number of samples                           */
62*a58d3d2aSXin Li );
63*a58d3d2aSXin Li 
64*a58d3d2aSXin Li /* Convert adaptive Mid/Side representation to Left/Right stereo signal */
65*a58d3d2aSXin Li void silk_stereo_MS_to_LR(
66*a58d3d2aSXin Li     stereo_dec_state            *state,                         /* I/O  State                                       */
67*a58d3d2aSXin Li     opus_int16                  x1[],                           /* I/O  Left input signal, becomes mid signal       */
68*a58d3d2aSXin Li     opus_int16                  x2[],                           /* I/O  Right input signal, becomes side signal     */
69*a58d3d2aSXin Li     const opus_int32            pred_Q13[],                     /* I    Predictors                                  */
70*a58d3d2aSXin Li     opus_int                    fs_kHz,                         /* I    Samples rate (kHz)                          */
71*a58d3d2aSXin Li     opus_int                    frame_length                    /* I    Number of samples                           */
72*a58d3d2aSXin Li );
73*a58d3d2aSXin Li 
74*a58d3d2aSXin Li /* Find least-squares prediction gain for one signal based on another and quantize it */
75*a58d3d2aSXin Li opus_int32 silk_stereo_find_predictor(                          /* O    Returns predictor in Q13                    */
76*a58d3d2aSXin Li     opus_int32                  *ratio_Q14,                     /* O    Ratio of residual and mid energies          */
77*a58d3d2aSXin Li     const opus_int16            x[],                            /* I    Basis signal                                */
78*a58d3d2aSXin Li     const opus_int16            y[],                            /* I    Target signal                               */
79*a58d3d2aSXin Li     opus_int32                  mid_res_amp_Q0[],               /* I/O  Smoothed mid, residual norms                */
80*a58d3d2aSXin Li     opus_int                    length,                         /* I    Number of samples                           */
81*a58d3d2aSXin Li     opus_int                    smooth_coef_Q16                 /* I    Smoothing coefficient                       */
82*a58d3d2aSXin Li );
83*a58d3d2aSXin Li 
84*a58d3d2aSXin Li /* Quantize mid/side predictors */
85*a58d3d2aSXin Li void silk_stereo_quant_pred(
86*a58d3d2aSXin Li     opus_int32                  pred_Q13[],                     /* I/O  Predictors (out: quantized)                 */
87*a58d3d2aSXin Li     opus_int8                   ix[ 2 ][ 3 ]                    /* O    Quantization indices                        */
88*a58d3d2aSXin Li );
89*a58d3d2aSXin Li 
90*a58d3d2aSXin Li /* Entropy code the mid/side quantization indices */
91*a58d3d2aSXin Li void silk_stereo_encode_pred(
92*a58d3d2aSXin Li     ec_enc                      *psRangeEnc,                    /* I/O  Compressor data structure                   */
93*a58d3d2aSXin Li     opus_int8                   ix[ 2 ][ 3 ]                    /* I    Quantization indices                        */
94*a58d3d2aSXin Li );
95*a58d3d2aSXin Li 
96*a58d3d2aSXin Li /* Entropy code the mid-only flag */
97*a58d3d2aSXin Li void silk_stereo_encode_mid_only(
98*a58d3d2aSXin Li     ec_enc                      *psRangeEnc,                    /* I/O  Compressor data structure                   */
99*a58d3d2aSXin Li     opus_int8                   mid_only_flag
100*a58d3d2aSXin Li );
101*a58d3d2aSXin Li 
102*a58d3d2aSXin Li /* Decode mid/side predictors */
103*a58d3d2aSXin Li void silk_stereo_decode_pred(
104*a58d3d2aSXin Li     ec_dec                      *psRangeDec,                    /* I/O  Compressor data structure                   */
105*a58d3d2aSXin Li     opus_int32                  pred_Q13[]                      /* O    Predictors                                  */
106*a58d3d2aSXin Li );
107*a58d3d2aSXin Li 
108*a58d3d2aSXin Li /* Decode mid-only flag */
109*a58d3d2aSXin Li void silk_stereo_decode_mid_only(
110*a58d3d2aSXin Li     ec_dec                      *psRangeDec,                    /* I/O  Compressor data structure                   */
111*a58d3d2aSXin Li     opus_int                    *decode_only_mid                /* O    Flag that only mid channel has been coded   */
112*a58d3d2aSXin Li );
113*a58d3d2aSXin Li 
114*a58d3d2aSXin Li /* Encodes signs of excitation */
115*a58d3d2aSXin Li void silk_encode_signs(
116*a58d3d2aSXin Li     ec_enc                      *psRangeEnc,                        /* I/O  Compressor data structure               */
117*a58d3d2aSXin Li     const opus_int8             pulses[],                           /* I    pulse signal                            */
118*a58d3d2aSXin Li     opus_int                    length,                             /* I    length of input                         */
119*a58d3d2aSXin Li     const opus_int              signalType,                         /* I    Signal type                             */
120*a58d3d2aSXin Li     const opus_int              quantOffsetType,                    /* I    Quantization offset type                */
121*a58d3d2aSXin Li     const opus_int              sum_pulses[ MAX_NB_SHELL_BLOCKS ]   /* I    Sum of absolute pulses per block        */
122*a58d3d2aSXin Li );
123*a58d3d2aSXin Li 
124*a58d3d2aSXin Li /* Decodes signs of excitation */
125*a58d3d2aSXin Li void silk_decode_signs(
126*a58d3d2aSXin Li     ec_dec                      *psRangeDec,                        /* I/O  Compressor data structure               */
127*a58d3d2aSXin Li     opus_int16                  pulses[],                           /* I/O  pulse signal                            */
128*a58d3d2aSXin Li     opus_int                    length,                             /* I    length of input                         */
129*a58d3d2aSXin Li     const opus_int              signalType,                         /* I    Signal type                             */
130*a58d3d2aSXin Li     const opus_int              quantOffsetType,                    /* I    Quantization offset type                */
131*a58d3d2aSXin Li     const opus_int              sum_pulses[ MAX_NB_SHELL_BLOCKS ]   /* I    Sum of absolute pulses per block        */
132*a58d3d2aSXin Li );
133*a58d3d2aSXin Li 
134*a58d3d2aSXin Li /* Check encoder control struct */
135*a58d3d2aSXin Li opus_int check_control_input(
136*a58d3d2aSXin Li     silk_EncControlStruct        *encControl                    /* I    Control structure                           */
137*a58d3d2aSXin Li );
138*a58d3d2aSXin Li 
139*a58d3d2aSXin Li /* Control internal sampling rate */
140*a58d3d2aSXin Li opus_int silk_control_audio_bandwidth(
141*a58d3d2aSXin Li     silk_encoder_state          *psEncC,                        /* I/O  Pointer to Silk encoder state               */
142*a58d3d2aSXin Li     silk_EncControlStruct       *encControl                     /* I    Control structure                           */
143*a58d3d2aSXin Li );
144*a58d3d2aSXin Li 
145*a58d3d2aSXin Li /* Control SNR of redidual quantizer */
146*a58d3d2aSXin Li opus_int silk_control_SNR(
147*a58d3d2aSXin Li     silk_encoder_state          *psEncC,                        /* I/O  Pointer to Silk encoder state               */
148*a58d3d2aSXin Li     opus_int32                  TargetRate_bps                  /* I    Target max bitrate (bps)                    */
149*a58d3d2aSXin Li );
150*a58d3d2aSXin Li 
151*a58d3d2aSXin Li /***************/
152*a58d3d2aSXin Li /* Shell coder */
153*a58d3d2aSXin Li /***************/
154*a58d3d2aSXin Li 
155*a58d3d2aSXin Li /* Encode quantization indices of excitation */
156*a58d3d2aSXin Li void silk_encode_pulses(
157*a58d3d2aSXin Li     ec_enc                      *psRangeEnc,                    /* I/O  compressor data structure                   */
158*a58d3d2aSXin Li     const opus_int              signalType,                     /* I    Signal type                                 */
159*a58d3d2aSXin Li     const opus_int              quantOffsetType,                /* I    quantOffsetType                             */
160*a58d3d2aSXin Li     opus_int8                   pulses[],                       /* I    quantization indices                        */
161*a58d3d2aSXin Li     const opus_int              frame_length                    /* I    Frame length                                */
162*a58d3d2aSXin Li );
163*a58d3d2aSXin Li 
164*a58d3d2aSXin Li /* Shell encoder, operates on one shell code frame of 16 pulses */
165*a58d3d2aSXin Li void silk_shell_encoder(
166*a58d3d2aSXin Li     ec_enc                      *psRangeEnc,                    /* I/O  compressor data structure                   */
167*a58d3d2aSXin Li     const opus_int              *pulses0                        /* I    data: nonnegative pulse amplitudes          */
168*a58d3d2aSXin Li );
169*a58d3d2aSXin Li 
170*a58d3d2aSXin Li /* Shell decoder, operates on one shell code frame of 16 pulses */
171*a58d3d2aSXin Li void silk_shell_decoder(
172*a58d3d2aSXin Li     opus_int16                  *pulses0,                       /* O    data: nonnegative pulse amplitudes          */
173*a58d3d2aSXin Li     ec_dec                      *psRangeDec,                    /* I/O  Compressor data structure                   */
174*a58d3d2aSXin Li     const opus_int              pulses4                         /* I    number of pulses per pulse-subframe         */
175*a58d3d2aSXin Li );
176*a58d3d2aSXin Li 
177*a58d3d2aSXin Li /* Gain scalar quantization with hysteresis, uniform on log scale */
178*a58d3d2aSXin Li void silk_gains_quant(
179*a58d3d2aSXin Li     opus_int8                   ind[ MAX_NB_SUBFR ],            /* O    gain indices                                */
180*a58d3d2aSXin Li     opus_int32                  gain_Q16[ MAX_NB_SUBFR ],       /* I/O  gains (quantized out)                       */
181*a58d3d2aSXin Li     opus_int8                   *prev_ind,                      /* I/O  last index in previous frame                */
182*a58d3d2aSXin Li     const opus_int              conditional,                    /* I    first gain is delta coded if 1              */
183*a58d3d2aSXin Li     const opus_int              nb_subfr                        /* I    number of subframes                         */
184*a58d3d2aSXin Li );
185*a58d3d2aSXin Li 
186*a58d3d2aSXin Li /* Gains scalar dequantization, uniform on log scale */
187*a58d3d2aSXin Li void silk_gains_dequant(
188*a58d3d2aSXin Li     opus_int32                  gain_Q16[ MAX_NB_SUBFR ],       /* O    quantized gains                             */
189*a58d3d2aSXin Li     const opus_int8             ind[ MAX_NB_SUBFR ],            /* I    gain indices                                */
190*a58d3d2aSXin Li     opus_int8                   *prev_ind,                      /* I/O  last index in previous frame                */
191*a58d3d2aSXin Li     const opus_int              conditional,                    /* I    first gain is delta coded if 1              */
192*a58d3d2aSXin Li     const opus_int              nb_subfr                        /* I    number of subframes                          */
193*a58d3d2aSXin Li );
194*a58d3d2aSXin Li 
195*a58d3d2aSXin Li /* Compute unique identifier of gain indices vector */
196*a58d3d2aSXin Li opus_int32 silk_gains_ID(                                       /* O    returns unique identifier of gains          */
197*a58d3d2aSXin Li     const opus_int8             ind[ MAX_NB_SUBFR ],            /* I    gain indices                                */
198*a58d3d2aSXin Li     const opus_int              nb_subfr                        /* I    number of subframes                         */
199*a58d3d2aSXin Li );
200*a58d3d2aSXin Li 
201*a58d3d2aSXin Li /* Interpolate two vectors */
202*a58d3d2aSXin Li void silk_interpolate(
203*a58d3d2aSXin Li     opus_int16                  xi[ MAX_LPC_ORDER ],            /* O    interpolated vector                         */
204*a58d3d2aSXin Li     const opus_int16            x0[ MAX_LPC_ORDER ],            /* I    first vector                                */
205*a58d3d2aSXin Li     const opus_int16            x1[ MAX_LPC_ORDER ],            /* I    second vector                               */
206*a58d3d2aSXin Li     const opus_int              ifact_Q2,                       /* I    interp. factor, weight on 2nd vector        */
207*a58d3d2aSXin Li     const opus_int              d                               /* I    number of parameters                        */
208*a58d3d2aSXin Li );
209*a58d3d2aSXin Li 
210*a58d3d2aSXin Li /* LTP tap quantizer */
211*a58d3d2aSXin Li void silk_quant_LTP_gains(
212*a58d3d2aSXin Li     opus_int16                  B_Q14[ MAX_NB_SUBFR * LTP_ORDER ],          /* O    Quantized LTP gains             */
213*a58d3d2aSXin Li     opus_int8                   cbk_index[ MAX_NB_SUBFR ],                  /* O    Codebook Index                  */
214*a58d3d2aSXin Li     opus_int8                   *periodicity_index,                         /* O    Periodicity Index               */
215*a58d3d2aSXin Li     opus_int32                  *sum_gain_dB_Q7,                            /* I/O  Cumulative max prediction gain  */
216*a58d3d2aSXin Li     opus_int                    *pred_gain_dB_Q7,                           /* O    LTP prediction gain             */
217*a58d3d2aSXin Li     const opus_int32            XX_Q17[ MAX_NB_SUBFR*LTP_ORDER*LTP_ORDER ], /* I    Correlation matrix in Q18       */
218*a58d3d2aSXin Li     const opus_int32            xX_Q17[ MAX_NB_SUBFR*LTP_ORDER ],           /* I    Correlation vector in Q18       */
219*a58d3d2aSXin Li     const opus_int              subfr_len,                                  /* I    Number of samples per subframe  */
220*a58d3d2aSXin Li     const opus_int              nb_subfr,                                   /* I    Number of subframes             */
221*a58d3d2aSXin Li     int                         arch                                        /* I    Run-time architecture           */
222*a58d3d2aSXin Li );
223*a58d3d2aSXin Li 
224*a58d3d2aSXin Li /* Entropy constrained matrix-weighted VQ, for a single input data vector */
225*a58d3d2aSXin Li void silk_VQ_WMat_EC_c(
226*a58d3d2aSXin Li     opus_int8                   *ind,                           /* O    index of best codebook vector               */
227*a58d3d2aSXin Li     opus_int32                  *res_nrg_Q15,                   /* O    best residual energy                        */
228*a58d3d2aSXin Li     opus_int32                  *rate_dist_Q8,                  /* O    best total bitrate                          */
229*a58d3d2aSXin Li     opus_int                    *gain_Q7,                       /* O    sum of absolute LTP coefficients            */
230*a58d3d2aSXin Li     const opus_int32            *XX_Q17,                        /* I    correlation matrix                          */
231*a58d3d2aSXin Li     const opus_int32            *xX_Q17,                        /* I    correlation vector                          */
232*a58d3d2aSXin Li     const opus_int8             *cb_Q7,                         /* I    codebook                                    */
233*a58d3d2aSXin Li     const opus_uint8            *cb_gain_Q7,                    /* I    codebook effective gain                     */
234*a58d3d2aSXin Li     const opus_uint8            *cl_Q5,                         /* I    code length for each codebook vector        */
235*a58d3d2aSXin Li     const opus_int              subfr_len,                      /* I    number of samples per subframe              */
236*a58d3d2aSXin Li     const opus_int32            max_gain_Q7,                    /* I    maximum sum of absolute LTP coefficients    */
237*a58d3d2aSXin Li     const opus_int              L                               /* I    number of vectors in codebook               */
238*a58d3d2aSXin Li );
239*a58d3d2aSXin Li 
240*a58d3d2aSXin Li #if !defined(OVERRIDE_silk_VQ_WMat_EC)
241*a58d3d2aSXin Li #define silk_VQ_WMat_EC(ind, res_nrg_Q15, rate_dist_Q8, gain_Q7, XX_Q17, xX_Q17, cb_Q7, cb_gain_Q7, cl_Q5, subfr_len, max_gain_Q7, L, arch) \
242*a58d3d2aSXin Li     ((void)(arch),silk_VQ_WMat_EC_c(ind, res_nrg_Q15, rate_dist_Q8, gain_Q7, XX_Q17, xX_Q17, cb_Q7, cb_gain_Q7, cl_Q5, subfr_len, max_gain_Q7, L))
243*a58d3d2aSXin Li #endif
244*a58d3d2aSXin Li 
245*a58d3d2aSXin Li /************************************/
246*a58d3d2aSXin Li /* Noise shaping quantization (NSQ) */
247*a58d3d2aSXin Li /************************************/
248*a58d3d2aSXin Li 
249*a58d3d2aSXin Li void silk_NSQ_c(
250*a58d3d2aSXin Li     const silk_encoder_state    *psEncC,                                      /* I    Encoder State                   */
251*a58d3d2aSXin Li     silk_nsq_state              *NSQ,                                         /* I/O  NSQ state                       */
252*a58d3d2aSXin Li     SideInfoIndices             *psIndices,                                   /* I/O  Quantization Indices            */
253*a58d3d2aSXin Li     const opus_int16            x16[],                                        /* I    Input                           */
254*a58d3d2aSXin Li     opus_int8                   pulses[],                                     /* O    Quantized pulse signal          */
255*a58d3d2aSXin Li     const opus_int16            *PredCoef_Q12,                                /* I    Short term prediction coefs     */
256*a58d3d2aSXin Li     const opus_int16            LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ],      /* I    Long term prediction coefs      */
257*a58d3d2aSXin Li     const opus_int16            AR_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I    Noise shaping coefs             */
258*a58d3d2aSXin Li     const opus_int              HarmShapeGain_Q14[ MAX_NB_SUBFR ],            /* I    Long term shaping coefs         */
259*a58d3d2aSXin Li     const opus_int              Tilt_Q14[ MAX_NB_SUBFR ],                     /* I    Spectral tilt                   */
260*a58d3d2aSXin Li     const opus_int32            LF_shp_Q14[ MAX_NB_SUBFR ],                   /* I    Low frequency shaping coefs     */
261*a58d3d2aSXin Li     const opus_int32            Gains_Q16[ MAX_NB_SUBFR ],                    /* I    Quantization step sizes         */
262*a58d3d2aSXin Li     const opus_int              pitchL[ MAX_NB_SUBFR ],                       /* I    Pitch lags                      */
263*a58d3d2aSXin Li     const opus_int              Lambda_Q10,                                   /* I    Rate/distortion tradeoff        */
264*a58d3d2aSXin Li     const opus_int              LTP_scale_Q14                                 /* I    LTP state scaling               */
265*a58d3d2aSXin Li );
266*a58d3d2aSXin Li 
267*a58d3d2aSXin Li #if !defined(OVERRIDE_silk_NSQ)
268*a58d3d2aSXin Li #define silk_NSQ(psEncC, NSQ, psIndices, x16, pulses, PredCoef_Q12, LTPCoef_Q14, AR_Q13, \
269*a58d3d2aSXin Li                    HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, pitchL, Lambda_Q10, LTP_scale_Q14, arch) \
270*a58d3d2aSXin Li     ((void)(arch),silk_NSQ_c(psEncC, NSQ, psIndices, x16, pulses, PredCoef_Q12, LTPCoef_Q14, AR_Q13, \
271*a58d3d2aSXin Li                    HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, pitchL, Lambda_Q10, LTP_scale_Q14))
272*a58d3d2aSXin Li #endif
273*a58d3d2aSXin Li 
274*a58d3d2aSXin Li /* Noise shaping using delayed decision */
275*a58d3d2aSXin Li void silk_NSQ_del_dec_c(
276*a58d3d2aSXin Li     const silk_encoder_state    *psEncC,                                      /* I    Encoder State                   */
277*a58d3d2aSXin Li     silk_nsq_state              *NSQ,                                         /* I/O  NSQ state                       */
278*a58d3d2aSXin Li     SideInfoIndices             *psIndices,                                   /* I/O  Quantization Indices            */
279*a58d3d2aSXin Li     const opus_int16            x16[],                                        /* I    Input                           */
280*a58d3d2aSXin Li     opus_int8                   pulses[],                                     /* O    Quantized pulse signal          */
281*a58d3d2aSXin Li     const opus_int16            *PredCoef_Q12,                                /* I    Short term prediction coefs     */
282*a58d3d2aSXin Li     const opus_int16            LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ],      /* I    Long term prediction coefs      */
283*a58d3d2aSXin Li     const opus_int16            AR_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I    Noise shaping coefs             */
284*a58d3d2aSXin Li     const opus_int              HarmShapeGain_Q14[ MAX_NB_SUBFR ],            /* I    Long term shaping coefs         */
285*a58d3d2aSXin Li     const opus_int              Tilt_Q14[ MAX_NB_SUBFR ],                     /* I    Spectral tilt                   */
286*a58d3d2aSXin Li     const opus_int32            LF_shp_Q14[ MAX_NB_SUBFR ],                   /* I    Low frequency shaping coefs     */
287*a58d3d2aSXin Li     const opus_int32            Gains_Q16[ MAX_NB_SUBFR ],                    /* I    Quantization step sizes         */
288*a58d3d2aSXin Li     const opus_int              pitchL[ MAX_NB_SUBFR ],                       /* I    Pitch lags                      */
289*a58d3d2aSXin Li     const opus_int              Lambda_Q10,                                   /* I    Rate/distortion tradeoff        */
290*a58d3d2aSXin Li     const opus_int              LTP_scale_Q14                                 /* I    LTP state scaling               */
291*a58d3d2aSXin Li );
292*a58d3d2aSXin Li 
293*a58d3d2aSXin Li #if !defined(OVERRIDE_silk_NSQ_del_dec)
294*a58d3d2aSXin Li #define silk_NSQ_del_dec(psEncC, NSQ, psIndices, x16, pulses, PredCoef_Q12, LTPCoef_Q14, AR_Q13, \
295*a58d3d2aSXin Li                            HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, pitchL, Lambda_Q10, LTP_scale_Q14, arch) \
296*a58d3d2aSXin Li     ((void)(arch),silk_NSQ_del_dec_c(psEncC, NSQ, psIndices, x16, pulses, PredCoef_Q12, LTPCoef_Q14, AR_Q13, \
297*a58d3d2aSXin Li                            HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, pitchL, Lambda_Q10, LTP_scale_Q14))
298*a58d3d2aSXin Li #endif
299*a58d3d2aSXin Li 
300*a58d3d2aSXin Li /************/
301*a58d3d2aSXin Li /* Silk VAD */
302*a58d3d2aSXin Li /************/
303*a58d3d2aSXin Li /* Initialize the Silk VAD */
304*a58d3d2aSXin Li opus_int silk_VAD_Init(                                         /* O    Return value, 0 if success                  */
305*a58d3d2aSXin Li     silk_VAD_state              *psSilk_VAD                     /* I/O  Pointer to Silk VAD state                   */
306*a58d3d2aSXin Li );
307*a58d3d2aSXin Li 
308*a58d3d2aSXin Li /* Get speech activity level in Q8 */
309*a58d3d2aSXin Li opus_int silk_VAD_GetSA_Q8_c(                                   /* O    Return value, 0 if success                  */
310*a58d3d2aSXin Li     silk_encoder_state          *psEncC,                        /* I/O  Encoder state                               */
311*a58d3d2aSXin Li     const opus_int16            pIn[]                           /* I    PCM input                                   */
312*a58d3d2aSXin Li );
313*a58d3d2aSXin Li 
314*a58d3d2aSXin Li #if !defined(OVERRIDE_silk_VAD_GetSA_Q8)
315*a58d3d2aSXin Li #define silk_VAD_GetSA_Q8(psEnC, pIn, arch) ((void)(arch),silk_VAD_GetSA_Q8_c(psEnC, pIn))
316*a58d3d2aSXin Li #endif
317*a58d3d2aSXin Li 
318*a58d3d2aSXin Li /* Low-pass filter with variable cutoff frequency based on  */
319*a58d3d2aSXin Li /* piece-wise linear interpolation between elliptic filters */
320*a58d3d2aSXin Li /* Start by setting transition_frame_no = 1;                */
321*a58d3d2aSXin Li void silk_LP_variable_cutoff(
322*a58d3d2aSXin Li     silk_LP_state               *psLP,                          /* I/O  LP filter state                             */
323*a58d3d2aSXin Li     opus_int16                  *frame,                         /* I/O  Low-pass filtered output signal             */
324*a58d3d2aSXin Li     const opus_int              frame_length                    /* I    Frame length                                */
325*a58d3d2aSXin Li );
326*a58d3d2aSXin Li 
327*a58d3d2aSXin Li /******************/
328*a58d3d2aSXin Li /* NLSF Quantizer */
329*a58d3d2aSXin Li /******************/
330*a58d3d2aSXin Li /* Limit, stabilize, convert and quantize NLSFs */
331*a58d3d2aSXin Li void silk_process_NLSFs(
332*a58d3d2aSXin Li     silk_encoder_state          *psEncC,                            /* I/O  Encoder state                               */
333*a58d3d2aSXin Li     opus_int16                  PredCoef_Q12[ 2 ][ MAX_LPC_ORDER ], /* O    Prediction coefficients                     */
334*a58d3d2aSXin Li     opus_int16                  pNLSF_Q15[         MAX_LPC_ORDER ], /* I/O  Normalized LSFs (quant out) (0 - (2^15-1))  */
335*a58d3d2aSXin Li     const opus_int16            prev_NLSFq_Q15[    MAX_LPC_ORDER ]  /* I    Previous Normalized LSFs (0 - (2^15-1))     */
336*a58d3d2aSXin Li );
337*a58d3d2aSXin Li 
338*a58d3d2aSXin Li opus_int32 silk_NLSF_encode(                                    /* O    Returns RD value in Q25                     */
339*a58d3d2aSXin Li           opus_int8             *NLSFIndices,                   /* I    Codebook path vector [ LPC_ORDER + 1 ]      */
340*a58d3d2aSXin Li           opus_int16            *pNLSF_Q15,                     /* I/O  Quantized NLSF vector [ LPC_ORDER ]         */
341*a58d3d2aSXin Li     const silk_NLSF_CB_struct   *psNLSF_CB,                     /* I    Codebook object                             */
342*a58d3d2aSXin Li     const opus_int16            *pW_QW,                         /* I    NLSF weight vector [ LPC_ORDER ]            */
343*a58d3d2aSXin Li     const opus_int              NLSF_mu_Q20,                    /* I    Rate weight for the RD optimization         */
344*a58d3d2aSXin Li     const opus_int              nSurvivors,                     /* I    Max survivors after first stage             */
345*a58d3d2aSXin Li     const opus_int              signalType                      /* I    Signal type: 0/1/2                          */
346*a58d3d2aSXin Li );
347*a58d3d2aSXin Li 
348*a58d3d2aSXin Li /* Compute quantization errors for an LPC_order element input vector for a VQ codebook */
349*a58d3d2aSXin Li void silk_NLSF_VQ(
350*a58d3d2aSXin Li     opus_int32                  err_Q26[],                      /* O    Quantization errors [K]                     */
351*a58d3d2aSXin Li     const opus_int16            in_Q15[],                       /* I    Input vectors to be quantized [LPC_order]   */
352*a58d3d2aSXin Li     const opus_uint8            pCB_Q8[],                       /* I    Codebook vectors [K*LPC_order]              */
353*a58d3d2aSXin Li     const opus_int16            pWght_Q9[],                     /* I    Codebook weights [K*LPC_order]              */
354*a58d3d2aSXin Li     const opus_int              K,                              /* I    Number of codebook vectors                  */
355*a58d3d2aSXin Li     const opus_int              LPC_order                       /* I    Number of LPCs                              */
356*a58d3d2aSXin Li );
357*a58d3d2aSXin Li 
358*a58d3d2aSXin Li /* Delayed-decision quantizer for NLSF residuals */
359*a58d3d2aSXin Li opus_int32 silk_NLSF_del_dec_quant(                             /* O    Returns RD value in Q25                     */
360*a58d3d2aSXin Li     opus_int8                   indices[],                      /* O    Quantization indices [ order ]              */
361*a58d3d2aSXin Li     const opus_int16            x_Q10[],                        /* I    Input [ order ]                             */
362*a58d3d2aSXin Li     const opus_int16            w_Q5[],                         /* I    Weights [ order ]                           */
363*a58d3d2aSXin Li     const opus_uint8            pred_coef_Q8[],                 /* I    Backward predictor coefs [ order ]          */
364*a58d3d2aSXin Li     const opus_int16            ec_ix[],                        /* I    Indices to entropy coding tables [ order ]  */
365*a58d3d2aSXin Li     const opus_uint8            ec_rates_Q5[],                  /* I    Rates []                                    */
366*a58d3d2aSXin Li     const opus_int              quant_step_size_Q16,            /* I    Quantization step size                      */
367*a58d3d2aSXin Li     const opus_int16            inv_quant_step_size_Q6,         /* I    Inverse quantization step size              */
368*a58d3d2aSXin Li     const opus_int32            mu_Q20,                         /* I    R/D tradeoff                                */
369*a58d3d2aSXin Li     const opus_int16            order                           /* I    Number of input values                      */
370*a58d3d2aSXin Li );
371*a58d3d2aSXin Li 
372*a58d3d2aSXin Li /* Unpack predictor values and indices for entropy coding tables */
373*a58d3d2aSXin Li void silk_NLSF_unpack(
374*a58d3d2aSXin Li           opus_int16            ec_ix[],                        /* O    Indices to entropy tables [ LPC_ORDER ]     */
375*a58d3d2aSXin Li           opus_uint8            pred_Q8[],                      /* O    LSF predictor [ LPC_ORDER ]                 */
376*a58d3d2aSXin Li     const silk_NLSF_CB_struct   *psNLSF_CB,                     /* I    Codebook object                             */
377*a58d3d2aSXin Li     const opus_int              CB1_index                       /* I    Index of vector in first LSF codebook       */
378*a58d3d2aSXin Li );
379*a58d3d2aSXin Li 
380*a58d3d2aSXin Li /***********************/
381*a58d3d2aSXin Li /* NLSF vector decoder */
382*a58d3d2aSXin Li /***********************/
383*a58d3d2aSXin Li void silk_NLSF_decode(
384*a58d3d2aSXin Li           opus_int16            *pNLSF_Q15,                     /* O    Quantized NLSF vector [ LPC_ORDER ]         */
385*a58d3d2aSXin Li           opus_int8             *NLSFIndices,                   /* I    Codebook path vector [ LPC_ORDER + 1 ]      */
386*a58d3d2aSXin Li     const silk_NLSF_CB_struct   *psNLSF_CB                      /* I    Codebook object                             */
387*a58d3d2aSXin Li );
388*a58d3d2aSXin Li 
389*a58d3d2aSXin Li /****************************************************/
390*a58d3d2aSXin Li /* Decoder Functions                                */
391*a58d3d2aSXin Li /****************************************************/
392*a58d3d2aSXin Li opus_int silk_reset_decoder(
393*a58d3d2aSXin Li     silk_decoder_state          *psDec                          /* I/O  Decoder state pointer                       */
394*a58d3d2aSXin Li );
395*a58d3d2aSXin Li 
396*a58d3d2aSXin Li opus_int silk_init_decoder(
397*a58d3d2aSXin Li     silk_decoder_state          *psDec                          /* I/O  Decoder state pointer                       */
398*a58d3d2aSXin Li );
399*a58d3d2aSXin Li 
400*a58d3d2aSXin Li /* Set decoder sampling rate */
401*a58d3d2aSXin Li opus_int silk_decoder_set_fs(
402*a58d3d2aSXin Li     silk_decoder_state          *psDec,                         /* I/O  Decoder state pointer                       */
403*a58d3d2aSXin Li     opus_int                    fs_kHz,                         /* I    Sampling frequency (kHz)                    */
404*a58d3d2aSXin Li     opus_int32                  fs_API_Hz                       /* I    API Sampling frequency (Hz)                 */
405*a58d3d2aSXin Li );
406*a58d3d2aSXin Li 
407*a58d3d2aSXin Li /****************/
408*a58d3d2aSXin Li /* Decode frame */
409*a58d3d2aSXin Li /****************/
410*a58d3d2aSXin Li opus_int silk_decode_frame(
411*a58d3d2aSXin Li     silk_decoder_state          *psDec,                         /* I/O  Pointer to Silk decoder state               */
412*a58d3d2aSXin Li     ec_dec                      *psRangeDec,                    /* I/O  Compressor data structure                   */
413*a58d3d2aSXin Li     opus_int16                  pOut[],                         /* O    Pointer to output speech frame              */
414*a58d3d2aSXin Li     opus_int32                  *pN,                            /* O    Pointer to size of output frame             */
415*a58d3d2aSXin Li     opus_int                    lostFlag,                       /* I    0: no loss, 1 loss, 2 decode fec            */
416*a58d3d2aSXin Li     opus_int                    condCoding,                     /* I    The type of conditional coding to use       */
417*a58d3d2aSXin Li #ifdef ENABLE_DEEP_PLC
418*a58d3d2aSXin Li     LPCNetPLCState              *lpcnet,
419*a58d3d2aSXin Li #endif
420*a58d3d2aSXin Li #ifdef ENABLE_OSCE
421*a58d3d2aSXin Li     OSCEModel                   *osce_model,
422*a58d3d2aSXin Li #endif
423*a58d3d2aSXin Li     int                         arch                            /* I    Run-time architecture                       */
424*a58d3d2aSXin Li );
425*a58d3d2aSXin Li 
426*a58d3d2aSXin Li /* Decode indices from bitstream */
427*a58d3d2aSXin Li void silk_decode_indices(
428*a58d3d2aSXin Li     silk_decoder_state          *psDec,                         /* I/O  State                                       */
429*a58d3d2aSXin Li     ec_dec                      *psRangeDec,                    /* I/O  Compressor data structure                   */
430*a58d3d2aSXin Li     opus_int                    FrameIndex,                     /* I    Frame number                                */
431*a58d3d2aSXin Li     opus_int                    decode_LBRR,                    /* I    Flag indicating LBRR data is being decoded  */
432*a58d3d2aSXin Li     opus_int                    condCoding                      /* I    The type of conditional coding to use       */
433*a58d3d2aSXin Li );
434*a58d3d2aSXin Li 
435*a58d3d2aSXin Li /* Decode parameters from payload */
436*a58d3d2aSXin Li void silk_decode_parameters(
437*a58d3d2aSXin Li     silk_decoder_state          *psDec,                         /* I/O  State                                       */
438*a58d3d2aSXin Li     silk_decoder_control        *psDecCtrl,                     /* I/O  Decoder control                             */
439*a58d3d2aSXin Li     opus_int                    condCoding                      /* I    The type of conditional coding to use       */
440*a58d3d2aSXin Li );
441*a58d3d2aSXin Li 
442*a58d3d2aSXin Li /* Core decoder. Performs inverse NSQ operation LTP + LPC */
443*a58d3d2aSXin Li void silk_decode_core(
444*a58d3d2aSXin Li     silk_decoder_state          *psDec,                         /* I/O  Decoder state                               */
445*a58d3d2aSXin Li     silk_decoder_control        *psDecCtrl,                     /* I    Decoder control                             */
446*a58d3d2aSXin Li     opus_int16                  xq[],                           /* O    Decoded speech                              */
447*a58d3d2aSXin Li     const opus_int16            pulses[ MAX_FRAME_LENGTH ],     /* I    Pulse signal                                */
448*a58d3d2aSXin Li     int                         arch                            /* I    Run-time architecture                       */
449*a58d3d2aSXin Li );
450*a58d3d2aSXin Li 
451*a58d3d2aSXin Li /* Decode quantization indices of excitation (Shell coding) */
452*a58d3d2aSXin Li void silk_decode_pulses(
453*a58d3d2aSXin Li     ec_dec                      *psRangeDec,                    /* I/O  Compressor data structure                   */
454*a58d3d2aSXin Li     opus_int16                  pulses[],                       /* O    Excitation signal                           */
455*a58d3d2aSXin Li     const opus_int              signalType,                     /* I    Sigtype                                     */
456*a58d3d2aSXin Li     const opus_int              quantOffsetType,                /* I    quantOffsetType                             */
457*a58d3d2aSXin Li     const opus_int              frame_length                    /* I    Frame length                                */
458*a58d3d2aSXin Li );
459*a58d3d2aSXin Li 
460*a58d3d2aSXin Li /******************/
461*a58d3d2aSXin Li /* CNG */
462*a58d3d2aSXin Li /******************/
463*a58d3d2aSXin Li 
464*a58d3d2aSXin Li /* Reset CNG */
465*a58d3d2aSXin Li void silk_CNG_Reset(
466*a58d3d2aSXin Li     silk_decoder_state          *psDec                          /* I/O  Decoder state                               */
467*a58d3d2aSXin Li );
468*a58d3d2aSXin Li 
469*a58d3d2aSXin Li /* Updates CNG estimate, and applies the CNG when packet was lost */
470*a58d3d2aSXin Li void silk_CNG(
471*a58d3d2aSXin Li     silk_decoder_state          *psDec,                         /* I/O  Decoder state                               */
472*a58d3d2aSXin Li     silk_decoder_control        *psDecCtrl,                     /* I/O  Decoder control                             */
473*a58d3d2aSXin Li     opus_int16                  frame[],                        /* I/O  Signal                                      */
474*a58d3d2aSXin Li     opus_int                    length                          /* I    Length of residual                          */
475*a58d3d2aSXin Li );
476*a58d3d2aSXin Li 
477*a58d3d2aSXin Li /* Encoding of various parameters */
478*a58d3d2aSXin Li void silk_encode_indices(
479*a58d3d2aSXin Li     silk_encoder_state          *psEncC,                        /* I/O  Encoder state                               */
480*a58d3d2aSXin Li     ec_enc                      *psRangeEnc,                    /* I/O  Compressor data structure                   */
481*a58d3d2aSXin Li     opus_int                    FrameIndex,                     /* I    Frame number                                */
482*a58d3d2aSXin Li     opus_int                    encode_LBRR,                    /* I    Flag indicating LBRR data is being encoded  */
483*a58d3d2aSXin Li     opus_int                    condCoding                      /* I    The type of conditional coding to use       */
484*a58d3d2aSXin Li );
485*a58d3d2aSXin Li 
486*a58d3d2aSXin Li #endif
487