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