Coverage Report

Created: 2026-09-01 07:47

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
59.0M
{
73
59.0M
    opus_int   fs_kHz, ret = 0;
74
75
59.0M
    psEnc->sCmn.useDTX                 = encControl->useDTX;
76
59.0M
    psEnc->sCmn.useCBR                 = encControl->useCBR;
77
59.0M
    psEnc->sCmn.API_fs_Hz              = encControl->API_sampleRate;
78
59.0M
    psEnc->sCmn.maxInternal_fs_Hz      = encControl->maxInternalSampleRate;
79
59.0M
    psEnc->sCmn.minInternal_fs_Hz      = encControl->minInternalSampleRate;
80
59.0M
    psEnc->sCmn.desiredInternal_fs_Hz  = encControl->desiredInternalSampleRate;
81
59.0M
    psEnc->sCmn.useInBandFEC           = encControl->useInBandFEC;
82
59.0M
    psEnc->sCmn.nChannelsAPI           = encControl->nChannelsAPI;
83
59.0M
    psEnc->sCmn.nChannelsInternal      = encControl->nChannelsInternal;
84
59.0M
    psEnc->sCmn.allow_bandwidth_switch = allow_bw_switch;
85
59.0M
    psEnc->sCmn.channelNb              = channelNb;
86
87
59.0M
    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
59.0M
    fs_kHz = silk_control_audio_bandwidth( &psEnc->sCmn, encControl );
101
59.0M
    if( force_fs_kHz ) {
102
11.0M
       fs_kHz = force_fs_kHz;
103
11.0M
    }
104
    /********************************************/
105
    /* Prepare resampler and buffered data      */
106
    /********************************************/
107
59.0M
    ret += silk_setup_resamplers( psEnc, fs_kHz );
108
109
    /********************************************/
110
    /* Set internal sampling frequency          */
111
    /********************************************/
112
59.0M
    ret += silk_setup_fs( psEnc, fs_kHz, encControl->payloadSize_ms );
113
114
    /********************************************/
115
    /* Set encoding complexity                  */
116
    /********************************************/
117
59.0M
    ret += silk_setup_complexity( &psEnc->sCmn, encControl->complexity  );
118
119
    /********************************************/
120
    /* Set packet loss rate measured by farend  */
121
    /********************************************/
122
59.0M
    psEnc->sCmn.PacketLoss_perc = encControl->packetLossPercentage;
123
124
    /********************************************/
125
    /* Set LBRR usage                           */
126
    /********************************************/
127
59.0M
    ret += silk_setup_LBRR( &psEnc->sCmn, encControl );
128
129
59.0M
    psEnc->sCmn.controlled_since_last_payload = 1;
130
131
59.0M
    return ret;
132
59.0M
}
133
134
static opus_int silk_setup_resamplers(
135
    silk_encoder_state_Fxx          *psEnc,             /* I/O                      */
136
    opus_int                         fs_kHz              /* I                        */
137
)
138
59.0M
{
139
59.0M
    opus_int   ret = SILK_NO_ERROR;
140
59.0M
    SAVE_STACK;
141
142
59.0M
    if( psEnc->sCmn.fs_kHz != fs_kHz || psEnc->sCmn.prev_API_fs_Hz != psEnc->sCmn.API_fs_Hz )
143
206k
    {
144
206k
        if( psEnc->sCmn.fs_kHz == 0 ) {
145
            /* Initialize the resampler for enc_API.c preparing resampling from API_fs_Hz to fs_kHz */
146
206k
            ret += silk_resampler_init( &psEnc->sCmn.resampler_state, psEnc->sCmn.API_fs_Hz, fs_kHz * 1000, 1 );
147
206k
        } else {
148
155
            VARDECL( opus_int16, x_buf_API_fs_Hz );
149
155
            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
155
            opus_int32 api_buf_samples;
157
155
            opus_int32 old_buf_samples;
158
155
            opus_int32 buf_length_ms;
159
160
155
            buf_length_ms = silk_LSHIFT( psEnc->sCmn.nb_subfr * 5, 1 ) + LA_SHAPE_MS;
161
155
            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
155
            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
155
            ALLOC( temp_resampler_state, 1, silk_resampler_state_struct );
172
155
            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
155
            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
155
            ALLOC( x_buf_API_fs_Hz, api_buf_samples, opus_int16 );
179
155
            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
155
            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
155
            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
155
        }
191
206k
    }
192
193
59.0M
    psEnc->sCmn.prev_API_fs_Hz = psEnc->sCmn.API_fs_Hz;
194
195
59.0M
    RESTORE_STACK;
196
59.0M
    return ret;
197
59.0M
}
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.6k
    {
144
84.6k
        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.6k
            ret += silk_resampler_init( &psEnc->sCmn.resampler_state, psEnc->sCmn.API_fs_Hz, fs_kHz * 1000, 1 );
147
84.6k
        } 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.6k
    }
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
58.8M
{
139
58.8M
    opus_int   ret = SILK_NO_ERROR;
140
58.8M
    SAVE_STACK;
141
142
58.8M
    if( psEnc->sCmn.fs_kHz != fs_kHz || psEnc->sCmn.prev_API_fs_Hz != psEnc->sCmn.API_fs_Hz )
143
122k
    {
144
122k
        if( psEnc->sCmn.fs_kHz == 0 ) {
145
            /* Initialize the resampler for enc_API.c preparing resampling from API_fs_Hz to fs_kHz */
146
122k
            ret += silk_resampler_init( &psEnc->sCmn.resampler_state, psEnc->sCmn.API_fs_Hz, fs_kHz * 1000, 1 );
147
122k
        } else {
148
155
            VARDECL( opus_int16, x_buf_API_fs_Hz );
149
155
            VARDECL( silk_resampler_state_struct, temp_resampler_state );
150
#ifdef FIXED_POINT
151
            opus_int16 *x_bufFIX = psEnc->x_buf;
152
#else
153
155
            VARDECL( opus_int16, x_bufFIX );
154
155
            opus_int32 new_buf_samples;
155
155
#endif
156
155
            opus_int32 api_buf_samples;
157
155
            opus_int32 old_buf_samples;
158
155
            opus_int32 buf_length_ms;
159
160
155
            buf_length_ms = silk_LSHIFT( psEnc->sCmn.nb_subfr * 5, 1 ) + LA_SHAPE_MS;
161
155
            old_buf_samples = buf_length_ms * psEnc->sCmn.fs_kHz;
162
163
155
#ifndef FIXED_POINT
164
155
            new_buf_samples = buf_length_ms * fs_kHz;
165
155
            ALLOC( x_bufFIX, silk_max( old_buf_samples, new_buf_samples ),
166
155
                   opus_int16 );
167
155
            silk_float2short_array( x_bufFIX, psEnc->x_buf, old_buf_samples );
168
155
#endif
169
170
            /* Initialize resampler for temporary resampling of x_buf data to API_fs_Hz */
171
155
            ALLOC( temp_resampler_state, 1, silk_resampler_state_struct );
172
155
            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
155
            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
155
            ALLOC( x_buf_API_fs_Hz, api_buf_samples, opus_int16 );
179
155
            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
155
            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
155
            ret += silk_resampler( &psEnc->sCmn.resampler_state, x_bufFIX, x_buf_API_fs_Hz, api_buf_samples );
186
187
155
#ifndef FIXED_POINT
188
155
            silk_short2float_array( psEnc->x_buf, x_bufFIX, new_buf_samples);
189
155
#endif
190
155
        }
191
122k
    }
192
193
58.8M
    psEnc->sCmn.prev_API_fs_Hz = psEnc->sCmn.API_fs_Hz;
194
195
58.8M
    RESTORE_STACK;
196
58.8M
    return ret;
197
58.8M
}
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
59.0M
{
205
59.0M
    opus_int ret = SILK_NO_ERROR;
206
207
    /* Set packet size */
208
59.0M
    if( PacketSize_ms != psEnc->sCmn.PacketSize_ms ) {
209
207k
        if( ( PacketSize_ms !=  10 ) &&
210
107k
            ( PacketSize_ms !=  20 ) &&
211
57.5k
            ( PacketSize_ms !=  40 ) &&
212
21.9k
            ( PacketSize_ms !=  60 ) ) {
213
0
            ret = SILK_ENC_PACKET_SIZE_NOT_SUPPORTED;
214
0
        }
215
207k
        if( PacketSize_ms <= 10 ) {
216
100k
            psEnc->sCmn.nFramesPerPacket = 1;
217
100k
            psEnc->sCmn.nb_subfr = PacketSize_ms == 10 ? 2 : 1;
218
100k
            psEnc->sCmn.frame_length = silk_SMULBB( PacketSize_ms, fs_kHz );
219
100k
            psEnc->sCmn.pitch_LPC_win_length = silk_SMULBB( FIND_PITCH_LPC_WIN_MS_2_SF, fs_kHz );
220
100k
            if( psEnc->sCmn.fs_kHz == 8 ) {
221
0
                psEnc->sCmn.pitch_contour_iCDF = silk_pitch_contour_10_ms_NB_iCDF;
222
100k
            } else {
223
100k
                psEnc->sCmn.pitch_contour_iCDF = silk_pitch_contour_10_ms_iCDF;
224
100k
            }
225
107k
        } else {
226
107k
            psEnc->sCmn.nFramesPerPacket = silk_DIV32_16( PacketSize_ms, MAX_FRAME_LENGTH_MS );
227
107k
            psEnc->sCmn.nb_subfr = MAX_NB_SUBFR;
228
107k
            psEnc->sCmn.frame_length = silk_SMULBB( 20, fs_kHz );
229
107k
            psEnc->sCmn.pitch_LPC_win_length = silk_SMULBB( FIND_PITCH_LPC_WIN_MS, fs_kHz );
230
107k
            if( psEnc->sCmn.fs_kHz == 8 ) {
231
209
                psEnc->sCmn.pitch_contour_iCDF = silk_pitch_contour_NB_iCDF;
232
107k
            } else {
233
107k
                psEnc->sCmn.pitch_contour_iCDF = silk_pitch_contour_iCDF;
234
107k
            }
235
107k
        }
236
207k
        psEnc->sCmn.PacketSize_ms  = PacketSize_ms;
237
207k
        psEnc->sCmn.TargetRate_bps = 0;         /* trigger new SNR computation */
238
207k
    }
239
240
    /* Set internal sampling frequency */
241
59.0M
    celt_assert( fs_kHz == 8 || fs_kHz == 12 || fs_kHz == 16 );
242
59.0M
    celt_assert( psEnc->sCmn.nb_subfr == 2 || psEnc->sCmn.nb_subfr == 4 );
243
59.0M
    if( psEnc->sCmn.fs_kHz != fs_kHz ) {
244
        /* reset part of the state */
245
206k
        silk_memset( &psEnc->sShape,               0, sizeof( psEnc->sShape ) );
246
206k
        silk_memset( &psEnc->sCmn.sNSQ,            0, sizeof( psEnc->sCmn.sNSQ ) );
247
206k
        silk_memset( psEnc->sCmn.prev_NLSFq_Q15,   0, sizeof( psEnc->sCmn.prev_NLSFq_Q15 ) );
248
206k
        silk_memset( &psEnc->sCmn.sLP.In_LP_State, 0, sizeof( psEnc->sCmn.sLP.In_LP_State ) );
249
206k
        psEnc->sCmn.inputBufIx                  = 0;
250
206k
        psEnc->sCmn.nFramesEncoded              = 0;
251
206k
        psEnc->sCmn.TargetRate_bps              = 0;     /* trigger new SNR computation */
252
253
        /* Initialize non-zero parameters */
254
206k
        psEnc->sCmn.prevLag                     = 100;
255
206k
        psEnc->sCmn.first_frame_after_reset     = 1;
256
206k
        psEnc->sShape.LastGainIndex             = 10;
257
206k
        psEnc->sCmn.sNSQ.lagPrev                = 100;
258
206k
        psEnc->sCmn.sNSQ.prev_gain_Q16          = 65536;
259
206k
        psEnc->sCmn.prevSignalType              = TYPE_NO_VOICE_ACTIVITY;
260
261
206k
        psEnc->sCmn.fs_kHz = fs_kHz;
262
206k
        if( psEnc->sCmn.fs_kHz == 8 ) {
263
152k
            if( psEnc->sCmn.nb_subfr == MAX_NB_SUBFR ) {
264
75.5k
                psEnc->sCmn.pitch_contour_iCDF = silk_pitch_contour_NB_iCDF;
265
77.3k
            } else {
266
77.3k
                psEnc->sCmn.pitch_contour_iCDF = silk_pitch_contour_10_ms_NB_iCDF;
267
77.3k
            }
268
152k
        } else {
269
53.8k
            if( psEnc->sCmn.nb_subfr == MAX_NB_SUBFR ) {
270
30.8k
                psEnc->sCmn.pitch_contour_iCDF = silk_pitch_contour_iCDF;
271
30.8k
            } else {
272
23.0k
                psEnc->sCmn.pitch_contour_iCDF = silk_pitch_contour_10_ms_iCDF;
273
23.0k
            }
274
53.8k
        }
275
206k
        if( psEnc->sCmn.fs_kHz == 8 || psEnc->sCmn.fs_kHz == 12 ) {
276
172k
            psEnc->sCmn.predictLPCOrder = MIN_LPC_ORDER;
277
172k
            psEnc->sCmn.psNLSF_CB  = &silk_NLSF_CB_NB_MB;
278
172k
        } else {
279
34.6k
            psEnc->sCmn.predictLPCOrder = MAX_LPC_ORDER;
280
34.6k
            psEnc->sCmn.psNLSF_CB  = &silk_NLSF_CB_WB;
281
34.6k
        }
282
206k
        psEnc->sCmn.subfr_length   = SUB_FRAME_LENGTH_MS * fs_kHz;
283
206k
        psEnc->sCmn.frame_length   = silk_SMULBB( psEnc->sCmn.subfr_length, psEnc->sCmn.nb_subfr );
284
206k
        psEnc->sCmn.ltp_mem_length = silk_SMULBB( LTP_MEM_LENGTH_MS, fs_kHz );
285
206k
        psEnc->sCmn.la_pitch       = silk_SMULBB( LA_PITCH_MS, fs_kHz );
286
206k
        psEnc->sCmn.max_pitch_lag  = silk_SMULBB( 18, fs_kHz );
287
206k
        if( psEnc->sCmn.nb_subfr == MAX_NB_SUBFR ) {
288
106k
            psEnc->sCmn.pitch_LPC_win_length = silk_SMULBB( FIND_PITCH_LPC_WIN_MS, fs_kHz );
289
106k
        } else {
290
100k
            psEnc->sCmn.pitch_LPC_win_length = silk_SMULBB( FIND_PITCH_LPC_WIN_MS_2_SF, fs_kHz );
291
100k
        }
292
206k
        if( psEnc->sCmn.fs_kHz == 16 ) {
293
34.6k
            psEnc->sCmn.pitch_lag_low_bits_iCDF = silk_uniform8_iCDF;
294
172k
        } else if( psEnc->sCmn.fs_kHz == 12 ) {
295
19.2k
            psEnc->sCmn.pitch_lag_low_bits_iCDF = silk_uniform6_iCDF;
296
152k
        } else {
297
152k
            psEnc->sCmn.pitch_lag_low_bits_iCDF = silk_uniform4_iCDF;
298
152k
        }
299
206k
    }
300
301
    /* Check that settings are valid */
302
59.0M
    celt_assert( ( psEnc->sCmn.subfr_length * psEnc->sCmn.nb_subfr ) == psEnc->sCmn.frame_length );
303
304
59.0M
    return ret;
305
59.0M
}
306
307
static opus_int silk_setup_complexity(
308
    silk_encoder_state              *psEncC,            /* I/O                      */
309
    opus_int                        Complexity          /* I                        */
310
)
311
59.0M
{
312
59.0M
    opus_int ret = 0;
313
314
    /* Set encoding complexity */
315
59.0M
    celt_assert( Complexity >= 0 && Complexity <= 10 );
316
59.0M
    if( Complexity < 1 ) {
317
15.7M
        psEncC->pitchEstimationComplexity       = SILK_PE_MIN_COMPLEX;
318
15.7M
        psEncC->pitchEstimationThreshold_Q16    = SILK_FIX_CONST( 0.8, 16 );
319
15.7M
        psEncC->pitchEstimationLPCOrder         = 6;
320
15.7M
        psEncC->shapingLPCOrder                 = 12;
321
15.7M
        psEncC->la_shape                        = 3 * psEncC->fs_kHz;
322
15.7M
        psEncC->nStatesDelayedDecision          = 1;
323
15.7M
        psEncC->useInterpolatedNLSFs            = 0;
324
15.7M
        psEncC->NLSF_MSVQ_Survivors             = 2;
325
15.7M
        psEncC->warping_Q16                     = 0;
326
43.2M
    } else if( Complexity < 2 ) {
327
7.29M
        psEncC->pitchEstimationComplexity       = SILK_PE_MID_COMPLEX;
328
7.29M
        psEncC->pitchEstimationThreshold_Q16    = SILK_FIX_CONST( 0.76, 16 );
329
7.29M
        psEncC->pitchEstimationLPCOrder         = 8;
330
7.29M
        psEncC->shapingLPCOrder                 = 14;
331
7.29M
        psEncC->la_shape                        = 5 * psEncC->fs_kHz;
332
7.29M
        psEncC->nStatesDelayedDecision          = 1;
333
7.29M
        psEncC->useInterpolatedNLSFs            = 0;
334
7.29M
        psEncC->NLSF_MSVQ_Survivors             = 3;
335
7.29M
        psEncC->warping_Q16                     = 0;
336
35.9M
    } else if( Complexity < 3 ) {
337
11.7M
        psEncC->pitchEstimationComplexity       = SILK_PE_MIN_COMPLEX;
338
11.7M
        psEncC->pitchEstimationThreshold_Q16    = SILK_FIX_CONST( 0.8, 16 );
339
11.7M
        psEncC->pitchEstimationLPCOrder         = 6;
340
11.7M
        psEncC->shapingLPCOrder                 = 12;
341
11.7M
        psEncC->la_shape                        = 3 * psEncC->fs_kHz;
342
11.7M
        psEncC->nStatesDelayedDecision          = 2;
343
11.7M
        psEncC->useInterpolatedNLSFs            = 0;
344
11.7M
        psEncC->NLSF_MSVQ_Survivors             = 2;
345
11.7M
        psEncC->warping_Q16                     = 0;
346
24.2M
    } else if( Complexity < 4 ) {
347
3.61M
        psEncC->pitchEstimationComplexity       = SILK_PE_MID_COMPLEX;
348
3.61M
        psEncC->pitchEstimationThreshold_Q16    = SILK_FIX_CONST( 0.76, 16 );
349
3.61M
        psEncC->pitchEstimationLPCOrder         = 8;
350
3.61M
        psEncC->shapingLPCOrder                 = 14;
351
3.61M
        psEncC->la_shape                        = 5 * psEncC->fs_kHz;
352
3.61M
        psEncC->nStatesDelayedDecision          = 2;
353
3.61M
        psEncC->useInterpolatedNLSFs            = 0;
354
3.61M
        psEncC->NLSF_MSVQ_Survivors             = 4;
355
3.61M
        psEncC->warping_Q16                     = 0;
356
20.5M
    } else if( Complexity < 6 ) {
357
6.61M
        psEncC->pitchEstimationComplexity       = SILK_PE_MID_COMPLEX;
358
6.61M
        psEncC->pitchEstimationThreshold_Q16    = SILK_FIX_CONST( 0.74, 16 );
359
6.61M
        psEncC->pitchEstimationLPCOrder         = 10;
360
6.61M
        psEncC->shapingLPCOrder                 = 16;
361
6.61M
        psEncC->la_shape                        = 5 * psEncC->fs_kHz;
362
6.61M
        psEncC->nStatesDelayedDecision          = 2;
363
6.61M
        psEncC->useInterpolatedNLSFs            = 1;
364
6.61M
        psEncC->NLSF_MSVQ_Survivors             = 6;
365
6.61M
        psEncC->warping_Q16                     = psEncC->fs_kHz * SILK_FIX_CONST( WARPING_MULTIPLIER, 16 );
366
13.9M
    } else if( Complexity < 8 ) {
367
6.95M
        psEncC->pitchEstimationComplexity       = SILK_PE_MID_COMPLEX;
368
6.95M
        psEncC->pitchEstimationThreshold_Q16    = SILK_FIX_CONST( 0.72, 16 );
369
6.95M
        psEncC->pitchEstimationLPCOrder         = 12;
370
6.95M
        psEncC->shapingLPCOrder                 = 20;
371
6.95M
        psEncC->la_shape                        = 5 * psEncC->fs_kHz;
372
6.95M
        psEncC->nStatesDelayedDecision          = 3;
373
6.95M
        psEncC->useInterpolatedNLSFs            = 1;
374
6.95M
        psEncC->NLSF_MSVQ_Survivors             = 8;
375
6.95M
        psEncC->warping_Q16                     = psEncC->fs_kHz * SILK_FIX_CONST( WARPING_MULTIPLIER, 16 );
376
7.01M
    } else {
377
7.01M
        psEncC->pitchEstimationComplexity       = SILK_PE_MAX_COMPLEX;
378
7.01M
        psEncC->pitchEstimationThreshold_Q16    = SILK_FIX_CONST( 0.7, 16 );
379
7.01M
        psEncC->pitchEstimationLPCOrder         = 16;
380
7.01M
        psEncC->shapingLPCOrder                 = 24;
381
7.01M
        psEncC->la_shape                        = 5 * psEncC->fs_kHz;
382
7.01M
        psEncC->nStatesDelayedDecision          = MAX_DEL_DEC_STATES;
383
7.01M
        psEncC->useInterpolatedNLSFs            = 1;
384
7.01M
        psEncC->NLSF_MSVQ_Survivors             = 16;
385
7.01M
        psEncC->warping_Q16                     = psEncC->fs_kHz * SILK_FIX_CONST( WARPING_MULTIPLIER, 16 );
386
7.01M
    }
387
388
    /* Do not allow higher pitch estimation LPC order than predict LPC order */
389
59.0M
    psEncC->pitchEstimationLPCOrder = silk_min_int( psEncC->pitchEstimationLPCOrder, psEncC->predictLPCOrder );
390
59.0M
    psEncC->shapeWinLength          = SUB_FRAME_LENGTH_MS * psEncC->fs_kHz + 2 * psEncC->la_shape;
391
59.0M
    psEncC->Complexity              = Complexity;
392
393
59.0M
    celt_assert( psEncC->pitchEstimationLPCOrder <= MAX_FIND_PITCH_LPC_ORDER );
394
59.0M
    celt_assert( psEncC->shapingLPCOrder         <= MAX_SHAPE_LPC_ORDER      );
395
59.0M
    celt_assert( psEncC->nStatesDelayedDecision  <= MAX_DEL_DEC_STATES       );
396
59.0M
    celt_assert( psEncC->warping_Q16             <= 32767                    );
397
59.0M
    celt_assert( psEncC->la_shape                <= LA_SHAPE_MAX             );
398
59.0M
    celt_assert( psEncC->shapeWinLength          <= SHAPE_LPC_WIN_MAX        );
399
400
59.0M
    return ret;
401
59.0M
}
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
59.0M
{
408
59.0M
    opus_int   LBRR_in_previous_packet, ret = SILK_NO_ERROR;
409
410
59.0M
    LBRR_in_previous_packet = psEncC->LBRR_enabled;
411
59.0M
    psEncC->LBRR_enabled = encControl->LBRR_coded;
412
59.0M
    if( psEncC->LBRR_enabled ) {
413
        /* Set gain increase for coding LBRR excitation */
414
23.3M
        if( LBRR_in_previous_packet == 0 ) {
415
            /* Previous packet did not have LBRR, and was therefore coded at a higher bitrate */
416
111k
            psEncC->LBRR_GainIncreases = 7;
417
23.2M
        } else {
418
23.2M
            psEncC->LBRR_GainIncreases = silk_max_int( 7 - silk_SMULWB( (opus_int32)psEncC->PacketLoss_perc, SILK_FIX_CONST( 0.2, 16 ) ), 3 );
419
23.2M
        }
420
23.3M
    }
421
422
59.0M
    return ret;
423
59.0M
}