Coverage Report

Created: 2026-01-10 07:33

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