1885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/***********************************************************************
2885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgCopyright (c) 2006-2011, Skype Limited. All rights reserved.
3885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgRedistribution and use in source and binary forms, with or without
4885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgmodification, are permitted provided that the following conditions
5885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgare met:
6885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org- Redistributions of source code must retain the above copyright notice,
7885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgthis list of conditions and the following disclaimer.
8885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org- Redistributions in binary form must reproduce the above copyright
9885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgnotice, this list of conditions and the following disclaimer in the
10885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgdocumentation and/or other materials provided with the distribution.
11e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org- Neither the name of Internet Society, IETF or IETF Trust, nor the
12885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgnames of specific contributors, may be used to endorse or promote
13885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgproducts derived from this software without specific prior written
14885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgpermission.
15e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.orgTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
19885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgPOSSIBILITY OF SUCH DAMAGE.
26885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org***********************************************************************/
27885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
28885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#ifndef SILK_MAIN_H
29885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#define SILK_MAIN_H
30885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
31885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "SigProc_FIX.h"
32885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "define.h"
33885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "structs.h"
34885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "tables.h"
35885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "PLC.h"
36885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "control.h"
37885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "debug.h"
38885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "entenc.h"
39885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "entdec.h"
40885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
41885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Convert Left/Right stereo signal to adaptive Mid/Side representation */
42885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_stereo_LR_to_MS(
43885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    stereo_enc_state            *state,                         /* I/O  State                                       */
44885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int16                  x1[],                           /* I/O  Left input signal, becomes mid signal       */
45885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int16                  x2[],                           /* I/O  Right input signal, becomes side signal     */
46885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int8                   ix[ 2 ][ 3 ],                   /* O    Quantization indices                        */
47885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int8                   *mid_only_flag,                 /* O    Flag: only mid signal coded                 */
48885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int32                  mid_side_rates_bps[],           /* O    Bitrates for mid and side signals           */
49885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int32                  total_rate_bps,                 /* I    Total bitrate                               */
50885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int                    prev_speech_act_Q8,             /* I    Speech activity level in previous frame     */
51885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int                    toMono,                         /* I    Last frame before a stereo->mono transition */
52885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int                    fs_kHz,                         /* I    Sample rate (kHz)                           */
53885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int                    frame_length                    /* I    Number of samples                           */
54885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org);
55885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
56885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Convert adaptive Mid/Side representation to Left/Right stereo signal */
57885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_stereo_MS_to_LR(
58885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    stereo_dec_state            *state,                         /* I/O  State                                       */
59885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int16                  x1[],                           /* I/O  Left input signal, becomes mid signal       */
60885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int16                  x2[],                           /* I/O  Right input signal, becomes side signal     */
61885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int32            pred_Q13[],                     /* I    Predictors                                  */
62885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int                    fs_kHz,                         /* I    Samples rate (kHz)                          */
63885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int                    frame_length                    /* I    Number of samples                           */
64885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org);
65885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
66885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Find least-squares prediction gain for one signal based on another and quantize it */
67885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgopus_int32 silk_stereo_find_predictor(                          /* O    Returns predictor in Q13                    */
68885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int32                  *ratio_Q14,                     /* O    Ratio of residual and mid energies          */
69885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int16            x[],                            /* I    Basis signal                                */
70885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int16            y[],                            /* I    Target signal                               */
71885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int32                  mid_res_amp_Q0[],               /* I/O  Smoothed mid, residual norms                */
72885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int                    length,                         /* I    Number of samples                           */
73885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int                    smooth_coef_Q16                 /* I    Smoothing coefficient                       */
74885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org);
75885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
76885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Quantize mid/side predictors */
77885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_stereo_quant_pred(
78885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int32                  pred_Q13[],                     /* I/O  Predictors (out: quantized)                 */
79885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int8                   ix[ 2 ][ 3 ]                    /* O    Quantization indices                        */
80885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org);
81885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
82885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Entropy code the mid/side quantization indices */
83885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_stereo_encode_pred(
84885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    ec_enc                      *psRangeEnc,                    /* I/O  Compressor data structure                   */
85885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int8                   ix[ 2 ][ 3 ]                    /* I    Quantization indices                        */
86885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org);
87885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
88885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Entropy code the mid-only flag */
89885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_stereo_encode_mid_only(
90885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    ec_enc                      *psRangeEnc,                    /* I/O  Compressor data structure                   */
91885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int8                   mid_only_flag
92885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org);
93885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
94885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Decode mid/side predictors */
95885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_stereo_decode_pred(
96885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    ec_dec                      *psRangeDec,                    /* I/O  Compressor data structure                   */
97885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int32                  pred_Q13[]                      /* O    Predictors                                  */
98885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org);
99885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
100885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Decode mid-only flag */
101885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_stereo_decode_mid_only(
102885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    ec_dec                      *psRangeDec,                    /* I/O  Compressor data structure                   */
103885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int                    *decode_only_mid                /* O    Flag that only mid channel has been coded   */
104885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org);
105885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
106885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Encodes signs of excitation */
107885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_encode_signs(
108885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    ec_enc                      *psRangeEnc,                        /* I/O  Compressor data structure                   */
109885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int8             pulses[],                           /* I    pulse signal                                */
110885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int                    length,                             /* I    length of input                             */
111885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int              signalType,                         /* I    Signal type                                 */
112885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int              quantOffsetType,                    /* I    Quantization offset type                    */
113885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int              sum_pulses[ MAX_NB_SHELL_BLOCKS ]   /* I    Sum of absolute pulses per block            */
114885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org);
115885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
116885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Decodes signs of excitation */
117885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_decode_signs(
118885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    ec_dec                      *psRangeDec,                        /* I/O  Compressor data structure                   */
119885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int                    pulses[],                           /* I/O  pulse signal                                */
120885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int                    length,                             /* I    length of input                             */
121885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int              signalType,                         /* I    Signal type                                 */
122885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int              quantOffsetType,                    /* I    Quantization offset type                    */
123885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int              sum_pulses[ MAX_NB_SHELL_BLOCKS ]   /* I    Sum of absolute pulses per block            */
124885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org);
125885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
126885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Check encoder control struct */
127885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgopus_int check_control_input(
128885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    silk_EncControlStruct        *encControl                    /* I    Control structure                           */
129885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org);
130885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
131885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Control internal sampling rate */
132885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgopus_int silk_control_audio_bandwidth(
133885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    silk_encoder_state          *psEncC,                        /* I/O  Pointer to Silk encoder state               */
134885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    silk_EncControlStruct       *encControl                     /* I    Control structure                           */
135885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org);
136885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
137885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Control SNR of redidual quantizer */
138885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgopus_int silk_control_SNR(
139885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    silk_encoder_state          *psEncC,                        /* I/O  Pointer to Silk encoder state               */
140885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int32                  TargetRate_bps                  /* I    Target max bitrate (bps)                    */
141885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org);
142885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
143885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/***************/
144885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Shell coder */
145885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/***************/
146885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
147885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Encode quantization indices of excitation */
148885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_encode_pulses(
149885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    ec_enc                      *psRangeEnc,                    /* I/O  compressor data structure                   */
150885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int              signalType,                     /* I    Signal type                                 */
151885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int              quantOffsetType,                /* I    quantOffsetType                             */
152885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int8                   pulses[],                       /* I    quantization indices                        */
153885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int              frame_length                    /* I    Frame length                                */
154885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org);
155885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
156885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Shell encoder, operates on one shell code frame of 16 pulses */
157885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_shell_encoder(
158885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    ec_enc                      *psRangeEnc,                    /* I/O  compressor data structure                   */
159885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int              *pulses0                        /* I    data: nonnegative pulse amplitudes          */
160885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org);
161885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
162885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Shell decoder, operates on one shell code frame of 16 pulses */
163885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_shell_decoder(
164885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int                    *pulses0,                       /* O    data: nonnegative pulse amplitudes          */
165885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    ec_dec                      *psRangeDec,                    /* I/O  Compressor data structure                   */
166885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int              pulses4                         /* I    number of pulses per pulse-subframe         */
167885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org);
168885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
169885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Gain scalar quantization with hysteresis, uniform on log scale */
170885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_gains_quant(
171885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int8                   ind[ MAX_NB_SUBFR ],            /* O    gain indices                                */
172885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int32                  gain_Q16[ MAX_NB_SUBFR ],       /* I/O  gains (quantized out)                       */
173885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int8                   *prev_ind,                      /* I/O  last index in previous frame                */
174885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int              conditional,                    /* I    first gain is delta coded if 1              */
175885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int              nb_subfr                        /* I    number of subframes                         */
176885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org);
177885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
178885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Gains scalar dequantization, uniform on log scale */
179885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_gains_dequant(
180885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int32                  gain_Q16[ MAX_NB_SUBFR ],       /* O    quantized gains                             */
181885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int8             ind[ MAX_NB_SUBFR ],            /* I    gain indices                                */
182885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int8                   *prev_ind,                      /* I/O  last index in previous frame                */
183885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int              conditional,                    /* I    first gain is delta coded if 1              */
184885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int              nb_subfr                        /* I    number of subframes                          */
185885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org);
186885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
187885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Compute unique identifier of gain indices vector */
188885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgopus_int32 silk_gains_ID(                                       /* O    returns unique identifier of gains          */
189885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int8             ind[ MAX_NB_SUBFR ],            /* I    gain indices                                */
190885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int              nb_subfr                        /* I    number of subframes                         */
191885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org);
192885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
193885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Interpolate two vectors */
194885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_interpolate(
195885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int16                  xi[ MAX_LPC_ORDER ],            /* O    interpolated vector                         */
196885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int16            x0[ MAX_LPC_ORDER ],            /* I    first vector                                */
197885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int16            x1[ MAX_LPC_ORDER ],            /* I    second vector                               */
198885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int              ifact_Q2,                       /* I    interp. factor, weight on 2nd vector        */
199885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int              d                               /* I    number of parameters                        */
200885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org);
201885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
202885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* LTP tap quantizer */
203885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_quant_LTP_gains(
204885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int16                  B_Q14[ MAX_NB_SUBFR * LTP_ORDER ],          /* I/O  (un)quantized LTP gains         */
205885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int8                   cbk_index[ MAX_NB_SUBFR ],                  /* O    Codebook Index                  */
206885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int8                   *periodicity_index,                         /* O    Periodicity Index               */
2073c3902f0ac13428394f14f78f0fab05ef3468d69tlegrand@google.com	opus_int32					*sum_gain_dB_Q7,							/* I/O  Cumulative max prediction gain  */
208885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int32            W_Q18[ MAX_NB_SUBFR*LTP_ORDER*LTP_ORDER ],  /* I    Error Weights in Q18            */
209885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int                    mu_Q9,                                      /* I    Mu value (R/D tradeoff)         */
210885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int                    lowComplexity,                              /* I    Flag for low complexity         */
211885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int              nb_subfr                                    /* I    number of subframes             */
212885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org);
213885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
214885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Entropy constrained matrix-weighted VQ, for a single input data vector */
215885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_VQ_WMat_EC(
216885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int8                   *ind,                           /* O    index of best codebook vector               */
217885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int32                  *rate_dist_Q14,                 /* O    best weighted quant error + mu * rate       */
2183c3902f0ac13428394f14f78f0fab05ef3468d69tlegrand@google.com    opus_int                    *gain_Q7,                       /* O    sum of absolute LTP coefficients            */
219885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int16            *in_Q14,                        /* I    input vector to be quantized                */
220885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int32            *W_Q18,                         /* I    weighting matrix                            */
221885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int8             *cb_Q7,                         /* I    codebook                                    */
2223c3902f0ac13428394f14f78f0fab05ef3468d69tlegrand@google.com    const opus_uint8            *cb_gain_Q7,                    /* I    codebook effective gain                     */
223885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_uint8            *cl_Q5,                         /* I    code length for each codebook vector        */
224885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int              mu_Q9,                          /* I    tradeoff betw. weighted error and rate      */
2253c3902f0ac13428394f14f78f0fab05ef3468d69tlegrand@google.com    const opus_int32            max_gain_Q7,                    /* I    maximum sum of absolute LTP coefficients    */
226885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int                    L                               /* I    number of vectors in codebook               */
227885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org);
228885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
229885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/************************************/
230885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Noise shaping quantization (NSQ) */
231885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/************************************/
232885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_NSQ(
233885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const silk_encoder_state    *psEncC,                                    /* I/O  Encoder State                   */
234885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    silk_nsq_state              *NSQ,                                       /* I/O  NSQ state                       */
235885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    SideInfoIndices             *psIndices,                                 /* I/O  Quantization Indices            */
236885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int32            x_Q3[],                                     /* I    Prefiltered input signal        */
237885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int8                   pulses[],                                   /* O    Quantized pulse signal          */
238885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int16            PredCoef_Q12[ 2 * MAX_LPC_ORDER ],          /* I    Short term prediction coefs     */
239885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int16            LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ],    /* I    Long term prediction coefs      */
240885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int16            AR2_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I Noise shaping coefs             */
241885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int              HarmShapeGain_Q14[ MAX_NB_SUBFR ],          /* I    Long term shaping coefs         */
242885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int              Tilt_Q14[ MAX_NB_SUBFR ],                   /* I    Spectral tilt                   */
243885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int32            LF_shp_Q14[ MAX_NB_SUBFR ],                 /* I    Low frequency shaping coefs     */
244885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int32            Gains_Q16[ MAX_NB_SUBFR ],                  /* I    Quantization step sizes         */
245885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int              pitchL[ MAX_NB_SUBFR ],                     /* I    Pitch lags                      */
246885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int              Lambda_Q10,                                 /* I    Rate/distortion tradeoff        */
247885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int              LTP_scale_Q14                               /* I    LTP state scaling               */
248885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org);
249885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
250885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Noise shaping using delayed decision */
251885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_NSQ_del_dec(
252885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const silk_encoder_state    *psEncC,                                    /* I/O  Encoder State                   */
253885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    silk_nsq_state              *NSQ,                                       /* I/O  NSQ state                       */
254885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    SideInfoIndices             *psIndices,                                 /* I/O  Quantization Indices            */
255885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int32            x_Q3[],                                     /* I    Prefiltered input signal        */
256885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int8                   pulses[],                                   /* O    Quantized pulse signal          */
257885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int16            PredCoef_Q12[ 2 * MAX_LPC_ORDER ],          /* I    Short term prediction coefs     */
258885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int16            LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ],    /* I    Long term prediction coefs      */
259885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int16            AR2_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I Noise shaping coefs             */
260885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int              HarmShapeGain_Q14[ MAX_NB_SUBFR ],          /* I    Long term shaping coefs         */
261885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int              Tilt_Q14[ MAX_NB_SUBFR ],                   /* I    Spectral tilt                   */
262885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int32            LF_shp_Q14[ MAX_NB_SUBFR ],                 /* I    Low frequency shaping coefs     */
263885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int32            Gains_Q16[ MAX_NB_SUBFR ],                  /* I    Quantization step sizes         */
264885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int              pitchL[ MAX_NB_SUBFR ],                     /* I    Pitch lags                      */
265885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int              Lambda_Q10,                                 /* I    Rate/distortion tradeoff        */
266885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int              LTP_scale_Q14                               /* I    LTP state scaling               */
267885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org);
268885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
269885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/************/
270885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Silk VAD */
271885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/************/
272885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Initialize the Silk VAD */
273885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgopus_int silk_VAD_Init(                                         /* O    Return value, 0 if success                  */
274885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    silk_VAD_state              *psSilk_VAD                     /* I/O  Pointer to Silk VAD state                   */
275885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org);
276885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
277885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Get speech activity level in Q8 */
278885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgopus_int silk_VAD_GetSA_Q8(                                     /* O    Return value, 0 if success                  */
279885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    silk_encoder_state          *psEncC,                        /* I/O  Encoder state                               */
280885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int16            pIn[]                           /* I    PCM input                                   */
281885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org);
282885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
283885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Low-pass filter with variable cutoff frequency based on  */
284885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* piece-wise linear interpolation between elliptic filters */
285885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Start by setting transition_frame_no = 1;                */
286885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_LP_variable_cutoff(
287885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    silk_LP_state               *psLP,                          /* I/O  LP filter state                             */
288885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int16                  *frame,                         /* I/O  Low-pass filtered output signal             */
289885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int              frame_length                    /* I    Frame length                                */
290885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org);
291885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
292885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/******************/
293885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* NLSF Quantizer */
294885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/******************/
295885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Limit, stabilize, convert and quantize NLSFs */
296885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_process_NLSFs(
297885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    silk_encoder_state          *psEncC,                            /* I/O  Encoder state                               */
298885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int16                  PredCoef_Q12[ 2 ][ MAX_LPC_ORDER ], /* O    Prediction coefficients                     */
299885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int16                  pNLSF_Q15[         MAX_LPC_ORDER ], /* I/O  Normalized LSFs (quant out) (0 - (2^15-1))  */
300885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int16            prev_NLSFq_Q15[    MAX_LPC_ORDER ]  /* I    Previous Normalized LSFs (0 - (2^15-1))     */
301885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org);
302885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
303885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgopus_int32 silk_NLSF_encode(                                    /* O    Returns RD value in Q25                     */
304885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org          opus_int8             *NLSFIndices,                   /* I    Codebook path vector [ LPC_ORDER + 1 ]      */
305885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org          opus_int16            *pNLSF_Q15,                     /* I/O  Quantized NLSF vector [ LPC_ORDER ]         */
306885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const silk_NLSF_CB_struct   *psNLSF_CB,                     /* I    Codebook object                             */
307885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int16            *pW_QW,                         /* I    NLSF weight vector [ LPC_ORDER ]            */
308885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int              NLSF_mu_Q20,                    /* I    Rate weight for the RD optimization         */
309885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int              nSurvivors,                     /* I    Max survivors after first stage             */
310885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int              signalType                      /* I    Signal type: 0/1/2                          */
311885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org);
312885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
313885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Compute quantization errors for an LPC_order element input vector for a VQ codebook */
314885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_NLSF_VQ(
315885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int32                  err_Q26[],                      /* O    Quantization errors [K]                     */
316885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int16            in_Q15[],                       /* I    Input vectors to be quantized [LPC_order]   */
317885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_uint8            pCB_Q8[],                       /* I    Codebook vectors [K*LPC_order]              */
318885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int              K,                              /* I    Number of codebook vectors                  */
319885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int              LPC_order                       /* I    Number of LPCs                              */
320885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org);
321885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
322885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Delayed-decision quantizer for NLSF residuals */
323885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgopus_int32 silk_NLSF_del_dec_quant(                             /* O    Returns RD value in Q25                     */
324885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int8                   indices[],                      /* O    Quantization indices [ order ]              */
325885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int16            x_Q10[],                        /* I    Input [ order ]                             */
326885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int16            w_Q5[],                         /* I    Weights [ order ]                           */
327885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_uint8            pred_coef_Q8[],                 /* I    Backward predictor coefs [ order ]          */
328885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int16            ec_ix[],                        /* I    Indices to entropy coding tables [ order ]  */
329885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_uint8            ec_rates_Q5[],                  /* I    Rates []                                    */
330885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int              quant_step_size_Q16,            /* I    Quantization step size                      */
331885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int16            inv_quant_step_size_Q6,         /* I    Inverse quantization step size              */
332885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int32            mu_Q20,                         /* I    R/D tradeoff                                */
333885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int16            order                           /* I    Number of input values                      */
334885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org);
335885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
336885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Unpack predictor values and indices for entropy coding tables */
337885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_NLSF_unpack(
338885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org          opus_int16            ec_ix[],                        /* O    Indices to entropy tables [ LPC_ORDER ]     */
339885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org          opus_uint8            pred_Q8[],                      /* O    LSF predictor [ LPC_ORDER ]                 */
340885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const silk_NLSF_CB_struct   *psNLSF_CB,                     /* I    Codebook object                             */
341885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int              CB1_index                       /* I    Index of vector in first LSF codebook       */
342885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org);
343885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
344885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/***********************/
345885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* NLSF vector decoder */
346885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/***********************/
347885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_NLSF_decode(
348885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org          opus_int16            *pNLSF_Q15,                     /* O    Quantized NLSF vector [ LPC_ORDER ]         */
349885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org          opus_int8             *NLSFIndices,                   /* I    Codebook path vector [ LPC_ORDER + 1 ]      */
350885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const silk_NLSF_CB_struct   *psNLSF_CB                      /* I    Codebook object                             */
351885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org);
352885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
353885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/****************************************************/
354885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Decoder Functions                                */
355885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/****************************************************/
356885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgopus_int silk_init_decoder(
357885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    silk_decoder_state          *psDec                          /* I/O  Decoder state pointer                       */
358885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org);
359885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
360885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Set decoder sampling rate */
361885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgopus_int silk_decoder_set_fs(
362885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    silk_decoder_state          *psDec,                         /* I/O  Decoder state pointer                       */
363885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int                    fs_kHz,                         /* I    Sampling frequency (kHz)                    */
364885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int32                  fs_API_Hz                       /* I    API Sampling frequency (Hz)                 */
365885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org);
366885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
367885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/****************/
368885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Decode frame */
369885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/****************/
370885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgopus_int silk_decode_frame(
371885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    silk_decoder_state          *psDec,                         /* I/O  Pointer to Silk decoder state               */
372885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    ec_dec                      *psRangeDec,                    /* I/O  Compressor data structure                   */
373885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int16                  pOut[],                         /* O    Pointer to output speech frame              */
374885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int32                  *pN,                            /* O    Pointer to size of output frame             */
375885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int                    lostFlag,                       /* I    0: no loss, 1 loss, 2 decode fec            */
376885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int                    condCoding                      /* I    The type of conditional coding to use       */
377885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org);
378885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
379885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Decode indices from bitstream */
380885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_decode_indices(
381885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    silk_decoder_state          *psDec,                         /* I/O  State                                       */
382885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    ec_dec                      *psRangeDec,                    /* I/O  Compressor data structure                   */
383885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int                    FrameIndex,                     /* I    Frame number                                */
384885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int                    decode_LBRR,                    /* I    Flag indicating LBRR data is being decoded  */
385885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int                    condCoding                      /* I    The type of conditional coding to use       */
386885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org);
387885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
388885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Decode parameters from payload */
389885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_decode_parameters(
390885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    silk_decoder_state          *psDec,                         /* I/O  State                                       */
391885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    silk_decoder_control        *psDecCtrl,                     /* I/O  Decoder control                             */
392885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int                    condCoding                      /* I    The type of conditional coding to use       */
393885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org);
394885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
395885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Core decoder. Performs inverse NSQ operation LTP + LPC */
396885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_decode_core(
397885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    silk_decoder_state          *psDec,                         /* I/O  Decoder state                               */
398885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    silk_decoder_control        *psDecCtrl,                     /* I    Decoder control                             */
399885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int16                  xq[],                           /* O    Decoded speech                              */
400885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int              pulses[ MAX_FRAME_LENGTH ]      /* I    Pulse signal                                */
401885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org);
402885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
403885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Decode quantization indices of excitation (Shell coding) */
404885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_decode_pulses(
405885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    ec_dec                      *psRangeDec,                    /* I/O  Compressor data structure                   */
406885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int                    pulses[],                       /* O    Excitation signal                           */
407885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int              signalType,                     /* I    Sigtype                                     */
408885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int              quantOffsetType,                /* I    quantOffsetType                             */
409885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int              frame_length                    /* I    Frame length                                */
410885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org);
411885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
412885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/******************/
413885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* CNG */
414885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/******************/
415885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
416885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Reset CNG */
417885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_CNG_Reset(
418885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    silk_decoder_state          *psDec                          /* I/O  Decoder state                               */
419885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org);
420885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
421885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Updates CNG estimate, and applies the CNG when packet was lost */
422885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_CNG(
423885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    silk_decoder_state          *psDec,                         /* I/O  Decoder state                               */
424885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    silk_decoder_control        *psDecCtrl,                     /* I/O  Decoder control                             */
425885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int16                  frame[],                        /* I/O  Signal                                      */
426885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int                    length                          /* I    Length of residual                          */
427885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org);
428885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
429885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Encoding of various parameters */
430885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid silk_encode_indices(
431885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    silk_encoder_state          *psEncC,                        /* I/O  Encoder state                               */
432885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    ec_enc                      *psRangeEnc,                    /* I/O  Compressor data structure                   */
433885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int                    FrameIndex,                     /* I    Frame number                                */
434885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int                    encode_LBRR,                    /* I    Flag indicating LBRR data is being encoded  */
435885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int                    condCoding                      /* I    The type of conditional coding to use       */
436885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org);
437885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
438885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#endif
439