Coverage Report

Created: 2026-08-31 07:11

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/opus/silk/control_codec.c
Line
Count
Source
1
/***********************************************************************
2
Copyright (c) 2006-2011, Skype Limited. All rights reserved.
3
Redistribution and use in source and binary forms, with or without
4
modification, are permitted provided that the following conditions
5
are met:
6
- Redistributions of source code must retain the above copyright notice,
7
this list of conditions and the following disclaimer.
8
- Redistributions in binary form must reproduce the above copyright
9
notice, this list of conditions and the following disclaimer in the
10
documentation and/or other materials provided with the distribution.
11
- Neither the name of Internet Society, IETF or IETF Trust, nor the
12
names of specific contributors, may be used to endorse or promote
13
products derived from this software without specific prior written
14
permission.
15
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
19
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25
POSSIBILITY OF SUCH DAMAGE.
26
***********************************************************************/
27
28
#ifdef HAVE_CONFIG_H
29
#include "config.h"
30
#endif
31
#ifdef FIXED_POINT
32
#include "main_FIX.h"
33
#define silk_encoder_state_Fxx      silk_encoder_state_FIX
34
#else
35
#include "main_FLP.h"
36
#define silk_encoder_state_Fxx      silk_encoder_state_FLP
37
#endif
38
#include "stack_alloc.h"
39
#include "tuning_parameters.h"
40
#include "pitch_est_defines.h"
41
42
static opus_int silk_setup_resamplers(
43
    silk_encoder_state_Fxx          *psEnc,             /* I/O                      */
44
    opus_int                        fs_kHz              /* I                        */
45
);
46
47
static opus_int silk_setup_fs(
48
    silk_encoder_state_Fxx          *psEnc,             /* I/O                      */
49
    opus_int                        fs_kHz,             /* I                        */
50
    opus_int                        PacketSize_ms       /* I                        */
51
);
52
53
static opus_int silk_setup_complexity(
54
    silk_encoder_state              *psEncC,            /* I/O                      */
55
    opus_int                        Complexity          /* I                        */
56
);
57
58
static OPUS_INLINE opus_int silk_setup_LBRR(
59
    silk_encoder_state              *psEncC,            /* I/O                      */
60
    const silk_EncControlStruct     *encControl         /* I                        */
61
);
62
63
64
/* Control encoder */
65
opus_int silk_control_encoder(
66
    silk_encoder_state_Fxx          *psEnc,                                 /* I/O  Pointer to Silk encoder state                                               */
67
    silk_EncControlStruct           *encControl,                            /* I    Control structure                                                           */
68
    const opus_int                  allow_bw_switch,                        /* I    Flag to allow switching audio bandwidth                                     */
69
    const opus_int                  channelNb,                              /* I    Channel number                                                              */
70
    const opus_int                  force_fs_kHz
71
)
72
303k
{
73
303k
    opus_int   fs_kHz, ret = 0;
74
75
303k
    psEnc->sCmn.useDTX                 = encControl->useDTX;
76
303k
    psEnc->sCmn.useCBR                 = encControl->useCBR;
77
303k
    psEnc->sCmn.API_fs_Hz              = encControl->API_sampleRate;
78
303k
    psEnc->sCmn.maxInternal_fs_Hz      = encControl->maxInternalSampleRate;
79
303k
    psEnc->sCmn.minInternal_fs_Hz      = encControl->minInternalSampleRate;
80
303k
    psEnc->sCmn.desiredInternal_fs_Hz  = encControl->desiredInternalSampleRate;
81
303k
    psEnc->sCmn.useInBandFEC           = encControl->useInBandFEC;
82
303k
    psEnc->sCmn.nChannelsAPI           = encControl->nChannelsAPI;
83
303k
    psEnc->sCmn.nChannelsInternal      = encControl->nChannelsInternal;
84
303k
    psEnc->sCmn.allow_bandwidth_switch = allow_bw_switch;
85
303k
    psEnc->sCmn.channelNb              = channelNb;
86
87
303k
    if( psEnc->sCmn.controlled_since_last_payload != 0 && psEnc->sCmn.prefillFlag == 0 ) {
88
0
        if( psEnc->sCmn.API_fs_Hz != psEnc->sCmn.prev_API_fs_Hz && psEnc->sCmn.fs_kHz > 0 ) {
89
            /* Change in API sampling rate in the middle of encoding a packet */
90
0
            ret += silk_setup_resamplers( psEnc, psEnc->sCmn.fs_kHz );
91
0
        }
92
0
        return ret;
93
0
    }
94
95
    /* Beyond this point we know that there are no previously coded frames in the payload buffer */
96
97
    /********************************************/
98
    /* Determine internal sampling rate         */
99
    /********************************************/
100
303k
    fs_kHz = silk_control_audio_bandwidth( &psEnc->sCmn, encControl );
101
303k
    if( force_fs_kHz ) {
102
87.7k
       fs_kHz = force_fs_kHz;
103
87.7k
    }
104
    /********************************************/
105
    /* Prepare resampler and buffered data      */
106
    /********************************************/
107
303k
    ret += silk_setup_resamplers( psEnc, fs_kHz );
108
109
    /********************************************/
110
    /* Set internal sampling frequency          */
111
    /********************************************/
112
303k
    ret += silk_setup_fs( psEnc, fs_kHz, encControl->payloadSize_ms );
113
114
    /********************************************/
115
    /* Set encoding complexity                  */
116
    /********************************************/
117
303k
    ret += silk_setup_complexity( &psEnc->sCmn, encControl->complexity  );
118
119
    /********************************************/
120
    /* Set packet loss rate measured by farend  */
121
    /********************************************/
122
303k
    psEnc->sCmn.PacketLoss_perc = encControl->packetLossPercentage;
123
124
    /********************************************/
125
    /* Set LBRR usage                           */
126
    /********************************************/
127
303k
    ret += silk_setup_LBRR( &psEnc->sCmn, encControl );
128
129
303k
    psEnc->sCmn.controlled_since_last_payload = 1;
130
131
303k
    return ret;
132
303k
}
133
134
static opus_int silk_setup_resamplers(
135
    silk_encoder_state_Fxx          *psEnc,             /* I/O                      */
136
    opus_int                         fs_kHz              /* I                        */
137
)
138
303k
{
139
303k
    opus_int   ret = SILK_NO_ERROR;
140
303k
    SAVE_STACK;
141
142
303k
    if( psEnc->sCmn.fs_kHz != fs_kHz || psEnc->sCmn.prev_API_fs_Hz != psEnc->sCmn.API_fs_Hz )
143
197k
    {
144
197k
        if( psEnc->sCmn.fs_kHz == 0 ) {
145
            /* Initialize the resampler for enc_API.c preparing resampling from API_fs_Hz to fs_kHz */
146
197k
            ret += silk_resampler_init( &psEnc->sCmn.resampler_state, psEnc->sCmn.API_fs_Hz, fs_kHz * 1000, 1 );
147
197k
        } else {
148
0
            VARDECL( opus_int16, x_buf_API_fs_Hz );
149
0
            VARDECL( silk_resampler_state_struct, temp_resampler_state );
150
#ifdef FIXED_POINT
151
            opus_int16 *x_bufFIX = psEnc->x_buf;
152
#else
153
            VARDECL( opus_int16, x_bufFIX );
154
            opus_int32 new_buf_samples;
155
#endif
156
0
            opus_int32 api_buf_samples;
157
0
            opus_int32 old_buf_samples;
158
0
            opus_int32 buf_length_ms;
159
160
0
            buf_length_ms = silk_LSHIFT( psEnc->sCmn.nb_subfr * 5, 1 ) + LA_SHAPE_MS;
161
0
            old_buf_samples = buf_length_ms * psEnc->sCmn.fs_kHz;
162
163
#ifndef FIXED_POINT
164
            new_buf_samples = buf_length_ms * fs_kHz;
165
0
            ALLOC( x_bufFIX, silk_max( old_buf_samples, new_buf_samples ),
166
                   opus_int16 );
167
            silk_float2short_array( x_bufFIX, psEnc->x_buf, old_buf_samples );
168
#endif
169
170
            /* Initialize resampler for temporary resampling of x_buf data to API_fs_Hz */
171
0
            ALLOC( temp_resampler_state, 1, silk_resampler_state_struct );
172
0
            ret += silk_resampler_init( temp_resampler_state, silk_SMULBB( psEnc->sCmn.fs_kHz, 1000 ), psEnc->sCmn.API_fs_Hz, 0 );
173
174
            /* Calculate number of samples to temporarily upsample */
175
0
            api_buf_samples = buf_length_ms * silk_DIV32_16( psEnc->sCmn.API_fs_Hz, 1000 );
176
177
            /* Temporary resampling of x_buf data to API_fs_Hz */
178
0
            ALLOC( x_buf_API_fs_Hz, api_buf_samples, opus_int16 );
179
0
            ret += silk_resampler( temp_resampler_state, x_buf_API_fs_Hz, x_bufFIX, old_buf_samples );
180
181
            /* Initialize the resampler for enc_API.c preparing resampling from API_fs_Hz to fs_kHz */
182
0
            ret += silk_resampler_init( &psEnc->sCmn.resampler_state, psEnc->sCmn.API_fs_Hz, silk_SMULBB( fs_kHz, 1000 ), 1 );
183
184
            /* Correct resampler state by resampling buffered data from API_fs_Hz to fs_kHz */
185
0
            ret += silk_resampler( &psEnc->sCmn.resampler_state, x_bufFIX, x_buf_API_fs_Hz, api_buf_samples );
186
187
#ifndef FIXED_POINT
188
            silk_short2float_array( psEnc->x_buf, x_bufFIX, new_buf_samples);
189
#endif
190
0
        }
191
197k
    }
192
193
303k
    psEnc->sCmn.prev_API_fs_Hz = psEnc->sCmn.API_fs_Hz;
194
195
303k
    RESTORE_STACK;
196
303k
    return ret;
197
303k
}
control_codec.c:silk_setup_resamplers
Line
Count
Source
138
133k
{
139
133k
    opus_int   ret = SILK_NO_ERROR;
140
133k
    SAVE_STACK;
141
142
133k
    if( psEnc->sCmn.fs_kHz != fs_kHz || psEnc->sCmn.prev_API_fs_Hz != psEnc->sCmn.API_fs_Hz )
143
84.3k
    {
144
84.3k
        if( psEnc->sCmn.fs_kHz == 0 ) {
145
            /* Initialize the resampler for enc_API.c preparing resampling from API_fs_Hz to fs_kHz */
146
84.3k
            ret += silk_resampler_init( &psEnc->sCmn.resampler_state, psEnc->sCmn.API_fs_Hz, fs_kHz * 1000, 1 );
147
84.3k
        } else {
148
0
            VARDECL( opus_int16, x_buf_API_fs_Hz );
149
0
            VARDECL( silk_resampler_state_struct, temp_resampler_state );
150
0
#ifdef FIXED_POINT
151
0
            opus_int16 *x_bufFIX = psEnc->x_buf;
152
#else
153
            VARDECL( opus_int16, x_bufFIX );
154
            opus_int32 new_buf_samples;
155
#endif
156
0
            opus_int32 api_buf_samples;
157
0
            opus_int32 old_buf_samples;
158
0
            opus_int32 buf_length_ms;
159
160
0
            buf_length_ms = silk_LSHIFT( psEnc->sCmn.nb_subfr * 5, 1 ) + LA_SHAPE_MS;
161
0
            old_buf_samples = buf_length_ms * psEnc->sCmn.fs_kHz;
162
163
#ifndef FIXED_POINT
164
            new_buf_samples = buf_length_ms * fs_kHz;
165
            ALLOC( x_bufFIX, silk_max( old_buf_samples, new_buf_samples ),
166
                   opus_int16 );
167
            silk_float2short_array( x_bufFIX, psEnc->x_buf, old_buf_samples );
168
#endif
169
170
            /* Initialize resampler for temporary resampling of x_buf data to API_fs_Hz */
171
0
            ALLOC( temp_resampler_state, 1, silk_resampler_state_struct );
172
0
            ret += silk_resampler_init( temp_resampler_state, silk_SMULBB( psEnc->sCmn.fs_kHz, 1000 ), psEnc->sCmn.API_fs_Hz, 0 );
173
174
            /* Calculate number of samples to temporarily upsample */
175
0
            api_buf_samples = buf_length_ms * silk_DIV32_16( psEnc->sCmn.API_fs_Hz, 1000 );
176
177
            /* Temporary resampling of x_buf data to API_fs_Hz */
178
0
            ALLOC( x_buf_API_fs_Hz, api_buf_samples, opus_int16 );
179
0
            ret += silk_resampler( temp_resampler_state, x_buf_API_fs_Hz, x_bufFIX, old_buf_samples );
180
181
            /* Initialize the resampler for enc_API.c preparing resampling from API_fs_Hz to fs_kHz */
182
0
            ret += silk_resampler_init( &psEnc->sCmn.resampler_state, psEnc->sCmn.API_fs_Hz, silk_SMULBB( fs_kHz, 1000 ), 1 );
183
184
            /* Correct resampler state by resampling buffered data from API_fs_Hz to fs_kHz */
185
0
            ret += silk_resampler( &psEnc->sCmn.resampler_state, x_bufFIX, x_buf_API_fs_Hz, api_buf_samples );
186
187
#ifndef FIXED_POINT
188
            silk_short2float_array( psEnc->x_buf, x_bufFIX, new_buf_samples);
189
#endif
190
0
        }
191
84.3k
    }
192
193
133k
    psEnc->sCmn.prev_API_fs_Hz = psEnc->sCmn.API_fs_Hz;
194
195
133k
    RESTORE_STACK;
196
133k
    return ret;
197
133k
}
control_codec.c:silk_setup_resamplers
Line
Count
Source
138
170k
{
139
170k
    opus_int   ret = SILK_NO_ERROR;
140
170k
    SAVE_STACK;
141
142
170k
    if( psEnc->sCmn.fs_kHz != fs_kHz || psEnc->sCmn.prev_API_fs_Hz != psEnc->sCmn.API_fs_Hz )
143
112k
    {
144
112k
        if( psEnc->sCmn.fs_kHz == 0 ) {
145
            /* Initialize the resampler for enc_API.c preparing resampling from API_fs_Hz to fs_kHz */
146
112k
            ret += silk_resampler_init( &psEnc->sCmn.resampler_state, psEnc->sCmn.API_fs_Hz, fs_kHz * 1000, 1 );
147
112k
        } else {
148
0
            VARDECL( opus_int16, x_buf_API_fs_Hz );
149
0
            VARDECL( silk_resampler_state_struct, temp_resampler_state );
150
#ifdef FIXED_POINT
151
            opus_int16 *x_bufFIX = psEnc->x_buf;
152
#else
153
0
            VARDECL( opus_int16, x_bufFIX );
154
0
            opus_int32 new_buf_samples;
155
0
#endif
156
0
            opus_int32 api_buf_samples;
157
0
            opus_int32 old_buf_samples;
158
0
            opus_int32 buf_length_ms;
159
160
0
            buf_length_ms = silk_LSHIFT( psEnc->sCmn.nb_subfr * 5, 1 ) + LA_SHAPE_MS;
161
0
            old_buf_samples = buf_length_ms * psEnc->sCmn.fs_kHz;
162
163
0
#ifndef FIXED_POINT
164
0
            new_buf_samples = buf_length_ms * fs_kHz;
165
0
            ALLOC( x_bufFIX, silk_max( old_buf_samples, new_buf_samples ),
166
0
                   opus_int16 );
167
0
            silk_float2short_array( x_bufFIX, psEnc->x_buf, old_buf_samples );
168
0
#endif
169
170
            /* Initialize resampler for temporary resampling of x_buf data to API_fs_Hz */
171
0
            ALLOC( temp_resampler_state, 1, silk_resampler_state_struct );
172
0
            ret += silk_resampler_init( temp_resampler_state, silk_SMULBB( psEnc->sCmn.fs_kHz, 1000 ), psEnc->sCmn.API_fs_Hz, 0 );
173
174
            /* Calculate number of samples to temporarily upsample */
175
0
            api_buf_samples = buf_length_ms * silk_DIV32_16( psEnc->sCmn.API_fs_Hz, 1000 );
176
177
            /* Temporary resampling of x_buf data to API_fs_Hz */
178
0
            ALLOC( x_buf_API_fs_Hz, api_buf_samples, opus_int16 );
179
0
            ret += silk_resampler( temp_resampler_state, x_buf_API_fs_Hz, x_bufFIX, old_buf_samples );
180
181
            /* Initialize the resampler for enc_API.c preparing resampling from API_fs_Hz to fs_kHz */
182
0
            ret += silk_resampler_init( &psEnc->sCmn.resampler_state, psEnc->sCmn.API_fs_Hz, silk_SMULBB( fs_kHz, 1000 ), 1 );
183
184
            /* Correct resampler state by resampling buffered data from API_fs_Hz to fs_kHz */
185
0
            ret += silk_resampler( &psEnc->sCmn.resampler_state, x_bufFIX, x_buf_API_fs_Hz, api_buf_samples );
186
187
0
#ifndef FIXED_POINT
188
0
            silk_short2float_array( psEnc->x_buf, x_bufFIX, new_buf_samples);
189
0
#endif
190
0
        }
191
112k
    }
192
193
170k
    psEnc->sCmn.prev_API_fs_Hz = psEnc->sCmn.API_fs_Hz;
194
195
170k
    RESTORE_STACK;
196
170k
    return ret;
197
170k
}
198
199
static opus_int silk_setup_fs(
200
    silk_encoder_state_Fxx          *psEnc,             /* I/O                      */
201
    opus_int                        fs_kHz,             /* I                        */
202
    opus_int                        PacketSize_ms       /* I                        */
203
)
204
303k
{
205
303k
    opus_int ret = SILK_NO_ERROR;
206
207
    /* Set packet size */
208
303k
    if( PacketSize_ms != psEnc->sCmn.PacketSize_ms ) {
209
197k
        if( ( PacketSize_ms !=  10 ) &&
210
99.9k
            ( PacketSize_ms !=  20 ) &&
211
54.4k
            ( PacketSize_ms !=  40 ) &&
212
20.5k
            ( PacketSize_ms !=  60 ) ) {
213
0
            ret = SILK_ENC_PACKET_SIZE_NOT_SUPPORTED;
214
0
        }
215
197k
        if( PacketSize_ms <= 10 ) {
216
97.1k
            psEnc->sCmn.nFramesPerPacket = 1;
217
97.1k
            psEnc->sCmn.nb_subfr = PacketSize_ms == 10 ? 2 : 1;
218
97.1k
            psEnc->sCmn.frame_length = silk_SMULBB( PacketSize_ms, fs_kHz );
219
97.1k
            psEnc->sCmn.pitch_LPC_win_length = silk_SMULBB( FIND_PITCH_LPC_WIN_MS_2_SF, fs_kHz );
220
97.1k
            if( psEnc->sCmn.fs_kHz == 8 ) {
221
0
                psEnc->sCmn.pitch_contour_iCDF = silk_pitch_contour_10_ms_NB_iCDF;
222
97.1k
            } else {
223
97.1k
                psEnc->sCmn.pitch_contour_iCDF = silk_pitch_contour_10_ms_iCDF;
224
97.1k
            }
225
99.9k
        } else {
226
99.9k
            psEnc->sCmn.nFramesPerPacket = silk_DIV32_16( PacketSize_ms, MAX_FRAME_LENGTH_MS );
227
99.9k
            psEnc->sCmn.nb_subfr = MAX_NB_SUBFR;
228
99.9k
            psEnc->sCmn.frame_length = silk_SMULBB( 20, fs_kHz );
229
99.9k
            psEnc->sCmn.pitch_LPC_win_length = silk_SMULBB( FIND_PITCH_LPC_WIN_MS, fs_kHz );
230
99.9k
            if( psEnc->sCmn.fs_kHz == 8 ) {
231
0
                psEnc->sCmn.pitch_contour_iCDF = silk_pitch_contour_NB_iCDF;
232
99.9k
            } else {
233
99.9k
                psEnc->sCmn.pitch_contour_iCDF = silk_pitch_contour_iCDF;
234
99.9k
            }
235
99.9k
        }
236
197k
        psEnc->sCmn.PacketSize_ms  = PacketSize_ms;
237
197k
        psEnc->sCmn.TargetRate_bps = 0;         /* trigger new SNR computation */
238
197k
    }
239
240
    /* Set internal sampling frequency */
241
303k
    celt_assert( fs_kHz == 8 || fs_kHz == 12 || fs_kHz == 16 );
242
303k
    celt_assert( psEnc->sCmn.nb_subfr == 2 || psEnc->sCmn.nb_subfr == 4 );
243
303k
    if( psEnc->sCmn.fs_kHz != fs_kHz ) {
244
        /* reset part of the state */
245
197k
        silk_memset( &psEnc->sShape,               0, sizeof( psEnc->sShape ) );
246
197k
        silk_memset( &psEnc->sCmn.sNSQ,            0, sizeof( psEnc->sCmn.sNSQ ) );
247
197k
        silk_memset( psEnc->sCmn.prev_NLSFq_Q15,   0, sizeof( psEnc->sCmn.prev_NLSFq_Q15 ) );
248
197k
        silk_memset( &psEnc->sCmn.sLP.In_LP_State, 0, sizeof( psEnc->sCmn.sLP.In_LP_State ) );
249
197k
        psEnc->sCmn.inputBufIx                  = 0;
250
197k
        psEnc->sCmn.nFramesEncoded              = 0;
251
197k
        psEnc->sCmn.TargetRate_bps              = 0;     /* trigger new SNR computation */
252
253
        /* Initialize non-zero parameters */
254
197k
        psEnc->sCmn.prevLag                     = 100;
255
197k
        psEnc->sCmn.first_frame_after_reset     = 1;
256
197k
        psEnc->sShape.LastGainIndex             = 10;
257
197k
        psEnc->sCmn.sNSQ.lagPrev                = 100;
258
197k
        psEnc->sCmn.sNSQ.prev_gain_Q16          = 65536;
259
197k
        psEnc->sCmn.prevSignalType              = TYPE_NO_VOICE_ACTIVITY;
260
261
197k
        psEnc->sCmn.fs_kHz = fs_kHz;
262
197k
        if( psEnc->sCmn.fs_kHz == 8 ) {
263
147k
            if( psEnc->sCmn.nb_subfr == MAX_NB_SUBFR ) {
264
71.6k
                psEnc->sCmn.pitch_contour_iCDF = silk_pitch_contour_NB_iCDF;
265
75.5k
            } else {
266
75.5k
                psEnc->sCmn.pitch_contour_iCDF = silk_pitch_contour_10_ms_NB_iCDF;
267
75.5k
            }
268
147k
        } else {
269
49.8k
            if( psEnc->sCmn.nb_subfr == MAX_NB_SUBFR ) {
270
28.3k
                psEnc->sCmn.pitch_contour_iCDF = silk_pitch_contour_iCDF;
271
28.3k
            } else {
272
21.5k
                psEnc->sCmn.pitch_contour_iCDF = silk_pitch_contour_10_ms_iCDF;
273
21.5k
            }
274
49.8k
        }
275
197k
        if( psEnc->sCmn.fs_kHz == 8 || psEnc->sCmn.fs_kHz == 12 ) {
276
164k
            psEnc->sCmn.predictLPCOrder = MIN_LPC_ORDER;
277
164k
            psEnc->sCmn.psNLSF_CB  = &silk_NLSF_CB_NB_MB;
278
164k
        } else {
279
32.4k
            psEnc->sCmn.predictLPCOrder = MAX_LPC_ORDER;
280
32.4k
            psEnc->sCmn.psNLSF_CB  = &silk_NLSF_CB_WB;
281
32.4k
        }
282
197k
        psEnc->sCmn.subfr_length   = SUB_FRAME_LENGTH_MS * fs_kHz;
283
197k
        psEnc->sCmn.frame_length   = silk_SMULBB( psEnc->sCmn.subfr_length, psEnc->sCmn.nb_subfr );
284
197k
        psEnc->sCmn.ltp_mem_length = silk_SMULBB( LTP_MEM_LENGTH_MS, fs_kHz );
285
197k
        psEnc->sCmn.la_pitch       = silk_SMULBB( LA_PITCH_MS, fs_kHz );
286
197k
        psEnc->sCmn.max_pitch_lag  = silk_SMULBB( 18, fs_kHz );
287
197k
        if( psEnc->sCmn.nb_subfr == MAX_NB_SUBFR ) {
288
99.9k
            psEnc->sCmn.pitch_LPC_win_length = silk_SMULBB( FIND_PITCH_LPC_WIN_MS, fs_kHz );
289
99.9k
        } else {
290
97.1k
            psEnc->sCmn.pitch_LPC_win_length = silk_SMULBB( FIND_PITCH_LPC_WIN_MS_2_SF, fs_kHz );
291
97.1k
        }
292
197k
        if( psEnc->sCmn.fs_kHz == 16 ) {
293
32.4k
            psEnc->sCmn.pitch_lag_low_bits_iCDF = silk_uniform8_iCDF;
294
164k
        } else if( psEnc->sCmn.fs_kHz == 12 ) {
295
17.4k
            psEnc->sCmn.pitch_lag_low_bits_iCDF = silk_uniform6_iCDF;
296
147k
        } else {
297
147k
            psEnc->sCmn.pitch_lag_low_bits_iCDF = silk_uniform4_iCDF;
298
147k
        }
299
197k
    }
300
301
    /* Check that settings are valid */
302
303k
    celt_assert( ( psEnc->sCmn.subfr_length * psEnc->sCmn.nb_subfr ) == psEnc->sCmn.frame_length );
303
304
303k
    return ret;
305
303k
}
306
307
static opus_int silk_setup_complexity(
308
    silk_encoder_state              *psEncC,            /* I/O                      */
309
    opus_int                        Complexity          /* I                        */
310
)
311
303k
{
312
303k
    opus_int ret = 0;
313
314
    /* Set encoding complexity */
315
303k
    celt_assert( Complexity >= 0 && Complexity <= 10 );
316
303k
    if( Complexity < 1 ) {
317
48.4k
        psEncC->pitchEstimationComplexity       = SILK_PE_MIN_COMPLEX;
318
48.4k
        psEncC->pitchEstimationThreshold_Q16    = SILK_FIX_CONST( 0.8, 16 );
319
48.4k
        psEncC->pitchEstimationLPCOrder         = 6;
320
48.4k
        psEncC->shapingLPCOrder                 = 12;
321
48.4k
        psEncC->la_shape                        = 3 * psEncC->fs_kHz;
322
48.4k
        psEncC->nStatesDelayedDecision          = 1;
323
48.4k
        psEncC->useInterpolatedNLSFs            = 0;
324
48.4k
        psEncC->NLSF_MSVQ_Survivors             = 2;
325
48.4k
        psEncC->warping_Q16                     = 0;
326
255k
    } else if( Complexity < 2 ) {
327
25.1k
        psEncC->pitchEstimationComplexity       = SILK_PE_MID_COMPLEX;
328
25.1k
        psEncC->pitchEstimationThreshold_Q16    = SILK_FIX_CONST( 0.76, 16 );
329
25.1k
        psEncC->pitchEstimationLPCOrder         = 8;
330
25.1k
        psEncC->shapingLPCOrder                 = 14;
331
25.1k
        psEncC->la_shape                        = 5 * psEncC->fs_kHz;
332
25.1k
        psEncC->nStatesDelayedDecision          = 1;
333
25.1k
        psEncC->useInterpolatedNLSFs            = 0;
334
25.1k
        psEncC->NLSF_MSVQ_Survivors             = 3;
335
25.1k
        psEncC->warping_Q16                     = 0;
336
229k
    } else if( Complexity < 3 ) {
337
21.7k
        psEncC->pitchEstimationComplexity       = SILK_PE_MIN_COMPLEX;
338
21.7k
        psEncC->pitchEstimationThreshold_Q16    = SILK_FIX_CONST( 0.8, 16 );
339
21.7k
        psEncC->pitchEstimationLPCOrder         = 6;
340
21.7k
        psEncC->shapingLPCOrder                 = 12;
341
21.7k
        psEncC->la_shape                        = 3 * psEncC->fs_kHz;
342
21.7k
        psEncC->nStatesDelayedDecision          = 2;
343
21.7k
        psEncC->useInterpolatedNLSFs            = 0;
344
21.7k
        psEncC->NLSF_MSVQ_Survivors             = 2;
345
21.7k
        psEncC->warping_Q16                     = 0;
346
208k
    } else if( Complexity < 4 ) {
347
12.5k
        psEncC->pitchEstimationComplexity       = SILK_PE_MID_COMPLEX;
348
12.5k
        psEncC->pitchEstimationThreshold_Q16    = SILK_FIX_CONST( 0.76, 16 );
349
12.5k
        psEncC->pitchEstimationLPCOrder         = 8;
350
12.5k
        psEncC->shapingLPCOrder                 = 14;
351
12.5k
        psEncC->la_shape                        = 5 * psEncC->fs_kHz;
352
12.5k
        psEncC->nStatesDelayedDecision          = 2;
353
12.5k
        psEncC->useInterpolatedNLSFs            = 0;
354
12.5k
        psEncC->NLSF_MSVQ_Survivors             = 4;
355
12.5k
        psEncC->warping_Q16                     = 0;
356
195k
    } else if( Complexity < 6 ) {
357
36.1k
        psEncC->pitchEstimationComplexity       = SILK_PE_MID_COMPLEX;
358
36.1k
        psEncC->pitchEstimationThreshold_Q16    = SILK_FIX_CONST( 0.74, 16 );
359
36.1k
        psEncC->pitchEstimationLPCOrder         = 10;
360
36.1k
        psEncC->shapingLPCOrder                 = 16;
361
36.1k
        psEncC->la_shape                        = 5 * psEncC->fs_kHz;
362
36.1k
        psEncC->nStatesDelayedDecision          = 2;
363
36.1k
        psEncC->useInterpolatedNLSFs            = 1;
364
36.1k
        psEncC->NLSF_MSVQ_Survivors             = 6;
365
36.1k
        psEncC->warping_Q16                     = psEncC->fs_kHz * SILK_FIX_CONST( WARPING_MULTIPLIER, 16 );
366
159k
    } else if( Complexity < 8 ) {
367
45.3k
        psEncC->pitchEstimationComplexity       = SILK_PE_MID_COMPLEX;
368
45.3k
        psEncC->pitchEstimationThreshold_Q16    = SILK_FIX_CONST( 0.72, 16 );
369
45.3k
        psEncC->pitchEstimationLPCOrder         = 12;
370
45.3k
        psEncC->shapingLPCOrder                 = 20;
371
45.3k
        psEncC->la_shape                        = 5 * psEncC->fs_kHz;
372
45.3k
        psEncC->nStatesDelayedDecision          = 3;
373
45.3k
        psEncC->useInterpolatedNLSFs            = 1;
374
45.3k
        psEncC->NLSF_MSVQ_Survivors             = 8;
375
45.3k
        psEncC->warping_Q16                     = psEncC->fs_kHz * SILK_FIX_CONST( WARPING_MULTIPLIER, 16 );
376
114k
    } else {
377
114k
        psEncC->pitchEstimationComplexity       = SILK_PE_MAX_COMPLEX;
378
114k
        psEncC->pitchEstimationThreshold_Q16    = SILK_FIX_CONST( 0.7, 16 );
379
114k
        psEncC->pitchEstimationLPCOrder         = 16;
380
114k
        psEncC->shapingLPCOrder                 = 24;
381
114k
        psEncC->la_shape                        = 5 * psEncC->fs_kHz;
382
114k
        psEncC->nStatesDelayedDecision          = MAX_DEL_DEC_STATES;
383
114k
        psEncC->useInterpolatedNLSFs            = 1;
384
114k
        psEncC->NLSF_MSVQ_Survivors             = 16;
385
114k
        psEncC->warping_Q16                     = psEncC->fs_kHz * SILK_FIX_CONST( WARPING_MULTIPLIER, 16 );
386
114k
    }
387
388
    /* Do not allow higher pitch estimation LPC order than predict LPC order */
389
303k
    psEncC->pitchEstimationLPCOrder = silk_min_int( psEncC->pitchEstimationLPCOrder, psEncC->predictLPCOrder );
390
303k
    psEncC->shapeWinLength          = SUB_FRAME_LENGTH_MS * psEncC->fs_kHz + 2 * psEncC->la_shape;
391
303k
    psEncC->Complexity              = Complexity;
392
393
303k
    celt_assert( psEncC->pitchEstimationLPCOrder <= MAX_FIND_PITCH_LPC_ORDER );
394
303k
    celt_assert( psEncC->shapingLPCOrder         <= MAX_SHAPE_LPC_ORDER      );
395
303k
    celt_assert( psEncC->nStatesDelayedDecision  <= MAX_DEL_DEC_STATES       );
396
303k
    celt_assert( psEncC->warping_Q16             <= 32767                    );
397
303k
    celt_assert( psEncC->la_shape                <= LA_SHAPE_MAX             );
398
303k
    celt_assert( psEncC->shapeWinLength          <= SHAPE_LPC_WIN_MAX        );
399
400
303k
    return ret;
401
303k
}
402
403
static OPUS_INLINE opus_int silk_setup_LBRR(
404
    silk_encoder_state          *psEncC,            /* I/O                      */
405
    const silk_EncControlStruct *encControl         /* I                        */
406
)
407
303k
{
408
303k
    opus_int   LBRR_in_previous_packet, ret = SILK_NO_ERROR;
409
410
303k
    LBRR_in_previous_packet = psEncC->LBRR_enabled;
411
303k
    psEncC->LBRR_enabled = encControl->LBRR_coded;
412
303k
    if( psEncC->LBRR_enabled ) {
413
        /* Set gain increase for coding LBRR excitation */
414
172k
        if( LBRR_in_previous_packet == 0 ) {
415
            /* Previous packet did not have LBRR, and was therefore coded at a higher bitrate */
416
107k
            psEncC->LBRR_GainIncreases = 7;
417
107k
        } else {
418
65.1k
            psEncC->LBRR_GainIncreases = silk_max_int( 7 - silk_SMULWB( (opus_int32)psEncC->PacketLoss_perc, SILK_FIX_CONST( 0.2, 16 ) ), 3 );
419
65.1k
        }
420
172k
    }
421
422
303k
    return ret;
423
303k
}