Coverage Report

Created: 2026-01-16 07:17

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