blob: 44b9ab3591ab4193f925fc4ec42578d7ec50eba9 [file] [log] [blame]
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +00001/***********************************************************************
2Copyright (c) 2006-2011, Skype Limited. All rights reserved.
3Redistribution and use in source and binary forms, with or without
4modification, are permitted provided that the following conditions
5are met:
6- Redistributions of source code must retain the above copyright notice,
7this list of conditions and the following disclaimer.
8- Redistributions in binary form must reproduce the above copyright
9notice, this list of conditions and the following disclaimer in the
10documentation and/or other materials provided with the distribution.
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +000011- Neither the name of Internet Society, IETF or IETF Trust, nor the
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +000012names of specific contributors, may be used to endorse or promote
13products derived from this software without specific prior written
14permission.
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +000015THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +000016AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
19LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25POSSIBILITY OF SUCH DAMAGE.
26***********************************************************************/
27
28#ifdef HAVE_CONFIG_H
29#include "config.h"
30#endif
31#include "define.h"
32#include "API.h"
33#include "control.h"
34#include "typedef.h"
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +000035#include "stack_alloc.h"
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +000036#include "structs.h"
37#include "tuning_parameters.h"
38#ifdef FIXED_POINT
39#include "main_FIX.h"
40#else
41#include "main_FLP.h"
42#endif
43
sergeyu@chromium.org6b6bee22013-02-28 21:17:26 +000044/***************************************/
45/* Read control structure from encoder */
46/***************************************/
47static opus_int silk_QueryEncoder( /* O Returns error code */
48 const void *encState, /* I State */
49 silk_EncControlStruct *encStatus /* O Encoder Status */
50);
51
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +000052/****************************************/
53/* Encoder functions */
54/****************************************/
55
56opus_int silk_Get_Encoder_Size( /* O Returns error code */
57 opus_int *encSizeBytes /* O Number of bytes in SILK encoder state */
58)
59{
60 opus_int ret = SILK_NO_ERROR;
61
62 *encSizeBytes = sizeof( silk_encoder );
63
64 return ret;
65}
66
67/*************************/
68/* Init or Reset encoder */
69/*************************/
70opus_int silk_InitEncoder( /* O Returns error code */
71 void *encState, /* I/O State */
72 silk_EncControlStruct *encStatus /* O Encoder Status */
73)
74{
75 silk_encoder *psEnc;
76 opus_int n, ret = SILK_NO_ERROR;
77
78 psEnc = (silk_encoder *)encState;
79
80 /* Reset encoder */
81 silk_memset( psEnc, 0, sizeof( silk_encoder ) );
82 for( n = 0; n < ENCODER_NUM_CHANNELS; n++ ) {
83 if( ret += silk_init_encoder( &psEnc->state_Fxx[ n ] ) ) {
84 silk_assert( 0 );
85 }
86 }
87
88 psEnc->nChannelsAPI = 1;
89 psEnc->nChannelsInternal = 1;
90
91 /* Read control structure */
92 if( ret += silk_QueryEncoder( encState, encStatus ) ) {
93 silk_assert( 0 );
94 }
95
96 return ret;
97}
98
99/***************************************/
100/* Read control structure from encoder */
101/***************************************/
sergeyu@chromium.org6b6bee22013-02-28 21:17:26 +0000102static opus_int silk_QueryEncoder( /* O Returns error code */
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +0000103 const void *encState, /* I State */
104 silk_EncControlStruct *encStatus /* O Encoder Status */
105)
106{
107 opus_int ret = SILK_NO_ERROR;
108 silk_encoder_state_Fxx *state_Fxx;
109 silk_encoder *psEnc = (silk_encoder *)encState;
110
111 state_Fxx = psEnc->state_Fxx;
112
113 encStatus->nChannelsAPI = psEnc->nChannelsAPI;
114 encStatus->nChannelsInternal = psEnc->nChannelsInternal;
115 encStatus->API_sampleRate = state_Fxx[ 0 ].sCmn.API_fs_Hz;
116 encStatus->maxInternalSampleRate = state_Fxx[ 0 ].sCmn.maxInternal_fs_Hz;
117 encStatus->minInternalSampleRate = state_Fxx[ 0 ].sCmn.minInternal_fs_Hz;
118 encStatus->desiredInternalSampleRate = state_Fxx[ 0 ].sCmn.desiredInternal_fs_Hz;
119 encStatus->payloadSize_ms = state_Fxx[ 0 ].sCmn.PacketSize_ms;
120 encStatus->bitRate = state_Fxx[ 0 ].sCmn.TargetRate_bps;
121 encStatus->packetLossPercentage = state_Fxx[ 0 ].sCmn.PacketLoss_perc;
122 encStatus->complexity = state_Fxx[ 0 ].sCmn.Complexity;
123 encStatus->useInBandFEC = state_Fxx[ 0 ].sCmn.useInBandFEC;
124 encStatus->useDTX = state_Fxx[ 0 ].sCmn.useDTX;
125 encStatus->useCBR = state_Fxx[ 0 ].sCmn.useCBR;
126 encStatus->internalSampleRate = silk_SMULBB( state_Fxx[ 0 ].sCmn.fs_kHz, 1000 );
127 encStatus->allowBandwidthSwitch = state_Fxx[ 0 ].sCmn.allow_bandwidth_switch;
128 encStatus->inWBmodeWithoutVariableLP = state_Fxx[ 0 ].sCmn.fs_kHz == 16 && state_Fxx[ 0 ].sCmn.sLP.mode == 0;
129
130 return ret;
131}
132
133
134/**************************/
135/* Encode frame with Silk */
136/**************************/
137/* Note: if prefillFlag is set, the input must contain 10 ms of audio, irrespective of what */
138/* encControl->payloadSize_ms is set to */
139opus_int silk_Encode( /* O Returns error code */
140 void *encState, /* I/O State */
141 silk_EncControlStruct *encControl, /* I Control status */
142 const opus_int16 *samplesIn, /* I Speech sample input vector */
143 opus_int nSamplesIn, /* I Number of samples in input vector */
144 ec_enc *psRangeEnc, /* I/O Compressor data structure */
145 opus_int32 *nBytesOut, /* I/O Number of bytes in payload (input: Max bytes) */
146 const opus_int prefillFlag /* I Flag to indicate prefilling buffers no coding */
147)
148{
149 opus_int n, i, nBits, flags, tmp_payloadSize_ms = 0, tmp_complexity = 0, ret = 0;
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +0000150 opus_int nSamplesToBuffer, nSamplesToBufferMax, nBlocksOf10ms;
151 opus_int nSamplesFromInput = 0, nSamplesFromInputMax;
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +0000152 opus_int speech_act_thr_for_switch_Q8;
153 opus_int32 TargetRate_bps, MStargetRates_bps[ 2 ], channelRate_bps, LBRR_symbol, sum;
154 silk_encoder *psEnc = ( silk_encoder * )encState;
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +0000155 VARDECL( opus_int16, buf );
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +0000156 opus_int transition, curr_block, tot_blocks;
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +0000157 SAVE_STACK;
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +0000158
159 psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded = psEnc->state_Fxx[ 1 ].sCmn.nFramesEncoded = 0;
160
161 /* Check values in encoder control structure */
162 if( ( ret = check_control_input( encControl ) != 0 ) ) {
163 silk_assert( 0 );
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +0000164 RESTORE_STACK;
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +0000165 return ret;
166 }
167
168 encControl->switchReady = 0;
169
170 if( encControl->nChannelsInternal > psEnc->nChannelsInternal ) {
171 /* Mono -> Stereo transition: init state of second channel and stereo state */
172 ret += silk_init_encoder( &psEnc->state_Fxx[ 1 ] );
173 silk_memset( psEnc->sStereo.pred_prev_Q13, 0, sizeof( psEnc->sStereo.pred_prev_Q13 ) );
174 silk_memset( psEnc->sStereo.sSide, 0, sizeof( psEnc->sStereo.sSide ) );
175 psEnc->sStereo.mid_side_amp_Q0[ 0 ] = 0;
176 psEnc->sStereo.mid_side_amp_Q0[ 1 ] = 1;
177 psEnc->sStereo.mid_side_amp_Q0[ 2 ] = 0;
178 psEnc->sStereo.mid_side_amp_Q0[ 3 ] = 1;
179 psEnc->sStereo.width_prev_Q14 = 0;
180 psEnc->sStereo.smth_width_Q14 = SILK_FIX_CONST( 1, 14 );
181 if( psEnc->nChannelsAPI == 2 ) {
182 silk_memcpy( &psEnc->state_Fxx[ 1 ].sCmn.resampler_state, &psEnc->state_Fxx[ 0 ].sCmn.resampler_state, sizeof( silk_resampler_state_struct ) );
183 silk_memcpy( &psEnc->state_Fxx[ 1 ].sCmn.In_HP_State, &psEnc->state_Fxx[ 0 ].sCmn.In_HP_State, sizeof( psEnc->state_Fxx[ 1 ].sCmn.In_HP_State ) );
184 }
185 }
186
187 transition = (encControl->payloadSize_ms != psEnc->state_Fxx[ 0 ].sCmn.PacketSize_ms) || (psEnc->nChannelsInternal != encControl->nChannelsInternal);
188
189 psEnc->nChannelsAPI = encControl->nChannelsAPI;
190 psEnc->nChannelsInternal = encControl->nChannelsInternal;
191
192 nBlocksOf10ms = silk_DIV32( 100 * nSamplesIn, encControl->API_sampleRate );
193 tot_blocks = ( nBlocksOf10ms > 1 ) ? nBlocksOf10ms >> 1 : 1;
194 curr_block = 0;
195 if( prefillFlag ) {
196 /* Only accept input length of 10 ms */
197 if( nBlocksOf10ms != 1 ) {
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +0000198 silk_assert( 0 );
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +0000199 RESTORE_STACK;
200 return SILK_ENC_INPUT_INVALID_NO_OF_SAMPLES;
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +0000201 }
202 /* Reset Encoder */
203 for( n = 0; n < encControl->nChannelsInternal; n++ ) {
204 if( (ret = silk_init_encoder( &psEnc->state_Fxx[ n ] ) ) != 0 ) {
205 silk_assert( 0 );
206 }
207 }
208 tmp_payloadSize_ms = encControl->payloadSize_ms;
209 encControl->payloadSize_ms = 10;
210 tmp_complexity = encControl->complexity;
211 encControl->complexity = 0;
212 for( n = 0; n < encControl->nChannelsInternal; n++ ) {
213 psEnc->state_Fxx[ n ].sCmn.controlled_since_last_payload = 0;
214 psEnc->state_Fxx[ n ].sCmn.prefillFlag = 1;
215 }
216 } else {
217 /* Only accept input lengths that are a multiple of 10 ms */
218 if( nBlocksOf10ms * encControl->API_sampleRate != 100 * nSamplesIn || nSamplesIn < 0 ) {
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +0000219 silk_assert( 0 );
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +0000220 RESTORE_STACK;
221 return SILK_ENC_INPUT_INVALID_NO_OF_SAMPLES;
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +0000222 }
223 /* Make sure no more than one packet can be produced */
224 if( 1000 * (opus_int32)nSamplesIn > encControl->payloadSize_ms * encControl->API_sampleRate ) {
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +0000225 silk_assert( 0 );
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +0000226 RESTORE_STACK;
227 return SILK_ENC_INPUT_INVALID_NO_OF_SAMPLES;
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +0000228 }
229 }
230
231 TargetRate_bps = silk_RSHIFT32( encControl->bitRate, encControl->nChannelsInternal - 1 );
232 for( n = 0; n < encControl->nChannelsInternal; n++ ) {
233 /* Force the side channel to the same rate as the mid */
234 opus_int force_fs_kHz = (n==1) ? psEnc->state_Fxx[0].sCmn.fs_kHz : 0;
235 if( ( ret = silk_control_encoder( &psEnc->state_Fxx[ n ], encControl, TargetRate_bps, psEnc->allowBandwidthSwitch, n, force_fs_kHz ) ) != 0 ) {
236 silk_assert( 0 );
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +0000237 RESTORE_STACK;
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +0000238 return ret;
239 }
240 if( psEnc->state_Fxx[n].sCmn.first_frame_after_reset || transition ) {
241 for( i = 0; i < psEnc->state_Fxx[ 0 ].sCmn.nFramesPerPacket; i++ ) {
242 psEnc->state_Fxx[ n ].sCmn.LBRR_flags[ i ] = 0;
243 }
244 }
245 psEnc->state_Fxx[ n ].sCmn.inDTX = psEnc->state_Fxx[ n ].sCmn.useDTX;
246 }
247 silk_assert( encControl->nChannelsInternal == 1 || psEnc->state_Fxx[ 0 ].sCmn.fs_kHz == psEnc->state_Fxx[ 1 ].sCmn.fs_kHz );
248
249 /* Input buffering/resampling and encoding */
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +0000250 nSamplesToBufferMax =
251 10 * nBlocksOf10ms * psEnc->state_Fxx[ 0 ].sCmn.fs_kHz;
252 nSamplesFromInputMax =
253 silk_DIV32_16( nSamplesToBufferMax *
254 psEnc->state_Fxx[ 0 ].sCmn.API_fs_Hz,
255 psEnc->state_Fxx[ 0 ].sCmn.fs_kHz * 1000 );
256 ALLOC( buf, nSamplesFromInputMax, opus_int16 );
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +0000257 while( 1 ) {
258 nSamplesToBuffer = psEnc->state_Fxx[ 0 ].sCmn.frame_length - psEnc->state_Fxx[ 0 ].sCmn.inputBufIx;
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +0000259 nSamplesToBuffer = silk_min( nSamplesToBuffer, nSamplesToBufferMax );
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +0000260 nSamplesFromInput = silk_DIV32_16( nSamplesToBuffer * psEnc->state_Fxx[ 0 ].sCmn.API_fs_Hz, psEnc->state_Fxx[ 0 ].sCmn.fs_kHz * 1000 );
261 /* Resample and write to buffer */
262 if( encControl->nChannelsAPI == 2 && encControl->nChannelsInternal == 2 ) {
263 opus_int id = psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded;
264 for( n = 0; n < nSamplesFromInput; n++ ) {
265 buf[ n ] = samplesIn[ 2 * n ];
266 }
267 /* Making sure to start both resamplers from the same state when switching from mono to stereo */
268 if( psEnc->nPrevChannelsInternal == 1 && id==0 ) {
269 silk_memcpy( &psEnc->state_Fxx[ 1 ].sCmn.resampler_state, &psEnc->state_Fxx[ 0 ].sCmn.resampler_state, sizeof(psEnc->state_Fxx[ 1 ].sCmn.resampler_state));
270 }
271
272 ret += silk_resampler( &psEnc->state_Fxx[ 0 ].sCmn.resampler_state,
273 &psEnc->state_Fxx[ 0 ].sCmn.inputBuf[ psEnc->state_Fxx[ 0 ].sCmn.inputBufIx + 2 ], buf, nSamplesFromInput );
274 psEnc->state_Fxx[ 0 ].sCmn.inputBufIx += nSamplesToBuffer;
275
276 nSamplesToBuffer = psEnc->state_Fxx[ 1 ].sCmn.frame_length - psEnc->state_Fxx[ 1 ].sCmn.inputBufIx;
277 nSamplesToBuffer = silk_min( nSamplesToBuffer, 10 * nBlocksOf10ms * psEnc->state_Fxx[ 1 ].sCmn.fs_kHz );
278 for( n = 0; n < nSamplesFromInput; n++ ) {
279 buf[ n ] = samplesIn[ 2 * n + 1 ];
280 }
281 ret += silk_resampler( &psEnc->state_Fxx[ 1 ].sCmn.resampler_state,
282 &psEnc->state_Fxx[ 1 ].sCmn.inputBuf[ psEnc->state_Fxx[ 1 ].sCmn.inputBufIx + 2 ], buf, nSamplesFromInput );
283
284 psEnc->state_Fxx[ 1 ].sCmn.inputBufIx += nSamplesToBuffer;
285 } else if( encControl->nChannelsAPI == 2 && encControl->nChannelsInternal == 1 ) {
286 /* Combine left and right channels before resampling */
287 for( n = 0; n < nSamplesFromInput; n++ ) {
288 sum = samplesIn[ 2 * n ] + samplesIn[ 2 * n + 1 ];
289 buf[ n ] = (opus_int16)silk_RSHIFT_ROUND( sum, 1 );
290 }
291 ret += silk_resampler( &psEnc->state_Fxx[ 0 ].sCmn.resampler_state,
292 &psEnc->state_Fxx[ 0 ].sCmn.inputBuf[ psEnc->state_Fxx[ 0 ].sCmn.inputBufIx + 2 ], buf, nSamplesFromInput );
293 /* On the first mono frame, average the results for the two resampler states */
294 if( psEnc->nPrevChannelsInternal == 2 && psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded == 0 ) {
295 ret += silk_resampler( &psEnc->state_Fxx[ 1 ].sCmn.resampler_state,
296 &psEnc->state_Fxx[ 1 ].sCmn.inputBuf[ psEnc->state_Fxx[ 1 ].sCmn.inputBufIx + 2 ], buf, nSamplesFromInput );
297 for( n = 0; n < psEnc->state_Fxx[ 0 ].sCmn.frame_length; n++ ) {
298 psEnc->state_Fxx[ 0 ].sCmn.inputBuf[ psEnc->state_Fxx[ 0 ].sCmn.inputBufIx+n+2 ] =
299 silk_RSHIFT(psEnc->state_Fxx[ 0 ].sCmn.inputBuf[ psEnc->state_Fxx[ 0 ].sCmn.inputBufIx+n+2 ]
300 + psEnc->state_Fxx[ 1 ].sCmn.inputBuf[ psEnc->state_Fxx[ 1 ].sCmn.inputBufIx+n+2 ], 1);
301 }
302 }
303 psEnc->state_Fxx[ 0 ].sCmn.inputBufIx += nSamplesToBuffer;
304 } else {
305 silk_assert( encControl->nChannelsAPI == 1 && encControl->nChannelsInternal == 1 );
306 silk_memcpy(buf, samplesIn, nSamplesFromInput*sizeof(opus_int16));
307 ret += silk_resampler( &psEnc->state_Fxx[ 0 ].sCmn.resampler_state,
308 &psEnc->state_Fxx[ 0 ].sCmn.inputBuf[ psEnc->state_Fxx[ 0 ].sCmn.inputBufIx + 2 ], buf, nSamplesFromInput );
309 psEnc->state_Fxx[ 0 ].sCmn.inputBufIx += nSamplesToBuffer;
310 }
311
312 samplesIn += nSamplesFromInput * encControl->nChannelsAPI;
313 nSamplesIn -= nSamplesFromInput;
314
315 /* Default */
316 psEnc->allowBandwidthSwitch = 0;
317
318 /* Silk encoder */
319 if( psEnc->state_Fxx[ 0 ].sCmn.inputBufIx >= psEnc->state_Fxx[ 0 ].sCmn.frame_length ) {
320 /* Enough data in input buffer, so encode */
321 silk_assert( psEnc->state_Fxx[ 0 ].sCmn.inputBufIx == psEnc->state_Fxx[ 0 ].sCmn.frame_length );
322 silk_assert( encControl->nChannelsInternal == 1 || psEnc->state_Fxx[ 1 ].sCmn.inputBufIx == psEnc->state_Fxx[ 1 ].sCmn.frame_length );
323
324 /* Deal with LBRR data */
325 if( psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded == 0 && !prefillFlag ) {
326 /* Create space at start of payload for VAD and FEC flags */
327 opus_uint8 iCDF[ 2 ] = { 0, 0 };
328 iCDF[ 0 ] = 256 - silk_RSHIFT( 256, ( psEnc->state_Fxx[ 0 ].sCmn.nFramesPerPacket + 1 ) * encControl->nChannelsInternal );
329 ec_enc_icdf( psRangeEnc, 0, iCDF, 8 );
330
331 /* Encode any LBRR data from previous packet */
332 /* Encode LBRR flags */
333 for( n = 0; n < encControl->nChannelsInternal; n++ ) {
334 LBRR_symbol = 0;
335 for( i = 0; i < psEnc->state_Fxx[ n ].sCmn.nFramesPerPacket; i++ ) {
336 LBRR_symbol |= silk_LSHIFT( psEnc->state_Fxx[ n ].sCmn.LBRR_flags[ i ], i );
337 }
338 psEnc->state_Fxx[ n ].sCmn.LBRR_flag = LBRR_symbol > 0 ? 1 : 0;
339 if( LBRR_symbol && psEnc->state_Fxx[ n ].sCmn.nFramesPerPacket > 1 ) {
340 ec_enc_icdf( psRangeEnc, LBRR_symbol - 1, silk_LBRR_flags_iCDF_ptr[ psEnc->state_Fxx[ n ].sCmn.nFramesPerPacket - 2 ], 8 );
341 }
342 }
343
344 /* Code LBRR indices and excitation signals */
345 for( i = 0; i < psEnc->state_Fxx[ 0 ].sCmn.nFramesPerPacket; i++ ) {
346 for( n = 0; n < encControl->nChannelsInternal; n++ ) {
347 if( psEnc->state_Fxx[ n ].sCmn.LBRR_flags[ i ] ) {
348 opus_int condCoding;
349
350 if( encControl->nChannelsInternal == 2 && n == 0 ) {
351 silk_stereo_encode_pred( psRangeEnc, psEnc->sStereo.predIx[ i ] );
352 /* For LBRR data there's no need to code the mid-only flag if the side-channel LBRR flag is set */
353 if( psEnc->state_Fxx[ 1 ].sCmn.LBRR_flags[ i ] == 0 ) {
354 silk_stereo_encode_mid_only( psRangeEnc, psEnc->sStereo.mid_only_flags[ i ] );
355 }
356 }
357 /* Use conditional coding if previous frame available */
358 if( i > 0 && psEnc->state_Fxx[ n ].sCmn.LBRR_flags[ i - 1 ] ) {
359 condCoding = CODE_CONDITIONALLY;
360 } else {
361 condCoding = CODE_INDEPENDENTLY;
362 }
363 silk_encode_indices( &psEnc->state_Fxx[ n ].sCmn, psRangeEnc, i, 1, condCoding );
364 silk_encode_pulses( psRangeEnc, psEnc->state_Fxx[ n ].sCmn.indices_LBRR[i].signalType, psEnc->state_Fxx[ n ].sCmn.indices_LBRR[i].quantOffsetType,
365 psEnc->state_Fxx[ n ].sCmn.pulses_LBRR[ i ], psEnc->state_Fxx[ n ].sCmn.frame_length );
366 }
367 }
368 }
369
370 /* Reset LBRR flags */
371 for( n = 0; n < encControl->nChannelsInternal; n++ ) {
372 silk_memset( psEnc->state_Fxx[ n ].sCmn.LBRR_flags, 0, sizeof( psEnc->state_Fxx[ n ].sCmn.LBRR_flags ) );
373 }
374 }
375
376 silk_HP_variable_cutoff( psEnc->state_Fxx );
377
378 /* Total target bits for packet */
379 nBits = silk_DIV32_16( silk_MUL( encControl->bitRate, encControl->payloadSize_ms ), 1000 );
380 /* Subtract half of the bits already used */
381 if( !prefillFlag ) {
382 nBits -= ec_tell( psRangeEnc ) >> 1;
383 }
384 /* Divide by number of uncoded frames left in packet */
385 nBits = silk_DIV32_16( nBits, psEnc->state_Fxx[ 0 ].sCmn.nFramesPerPacket - psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded );
386 /* Convert to bits/second */
387 if( encControl->payloadSize_ms == 10 ) {
388 TargetRate_bps = silk_SMULBB( nBits, 100 );
389 } else {
390 TargetRate_bps = silk_SMULBB( nBits, 50 );
391 }
392 /* Subtract fraction of bits in excess of target in previous packets */
393 TargetRate_bps -= silk_DIV32_16( silk_MUL( psEnc->nBitsExceeded, 1000 ), BITRESERVOIR_DECAY_TIME_MS );
394 /* Never exceed input bitrate */
395 TargetRate_bps = silk_LIMIT( TargetRate_bps, encControl->bitRate, 5000 );
396
397 /* Convert Left/Right to Mid/Side */
398 if( encControl->nChannelsInternal == 2 ) {
399 silk_stereo_LR_to_MS( &psEnc->sStereo, &psEnc->state_Fxx[ 0 ].sCmn.inputBuf[ 2 ], &psEnc->state_Fxx[ 1 ].sCmn.inputBuf[ 2 ],
400 psEnc->sStereo.predIx[ psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded ], &psEnc->sStereo.mid_only_flags[ psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded ],
401 MStargetRates_bps, TargetRate_bps, psEnc->state_Fxx[ 0 ].sCmn.speech_activity_Q8, encControl->toMono,
402 psEnc->state_Fxx[ 0 ].sCmn.fs_kHz, psEnc->state_Fxx[ 0 ].sCmn.frame_length );
403 if( psEnc->sStereo.mid_only_flags[ psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded ] == 0 ) {
404 /* Reset side channel encoder memory for first frame with side coding */
405 if( psEnc->prev_decode_only_middle == 1 ) {
406 silk_memset( &psEnc->state_Fxx[ 1 ].sShape, 0, sizeof( psEnc->state_Fxx[ 1 ].sShape ) );
407 silk_memset( &psEnc->state_Fxx[ 1 ].sPrefilt, 0, sizeof( psEnc->state_Fxx[ 1 ].sPrefilt ) );
408 silk_memset( &psEnc->state_Fxx[ 1 ].sCmn.sNSQ, 0, sizeof( psEnc->state_Fxx[ 1 ].sCmn.sNSQ ) );
409 silk_memset( psEnc->state_Fxx[ 1 ].sCmn.prev_NLSFq_Q15, 0, sizeof( psEnc->state_Fxx[ 1 ].sCmn.prev_NLSFq_Q15 ) );
410 silk_memset( &psEnc->state_Fxx[ 1 ].sCmn.sLP.In_LP_State, 0, sizeof( psEnc->state_Fxx[ 1 ].sCmn.sLP.In_LP_State ) );
411 psEnc->state_Fxx[ 1 ].sCmn.prevLag = 100;
412 psEnc->state_Fxx[ 1 ].sCmn.sNSQ.lagPrev = 100;
413 psEnc->state_Fxx[ 1 ].sShape.LastGainIndex = 10;
414 psEnc->state_Fxx[ 1 ].sCmn.prevSignalType = TYPE_NO_VOICE_ACTIVITY;
415 psEnc->state_Fxx[ 1 ].sCmn.sNSQ.prev_gain_Q16 = 65536;
416 psEnc->state_Fxx[ 1 ].sCmn.first_frame_after_reset = 1;
417 }
418 silk_encode_do_VAD_Fxx( &psEnc->state_Fxx[ 1 ] );
419 } else {
420 psEnc->state_Fxx[ 1 ].sCmn.VAD_flags[ psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded ] = 0;
421 }
422 if( !prefillFlag ) {
423 silk_stereo_encode_pred( psRangeEnc, psEnc->sStereo.predIx[ psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded ] );
424 if( psEnc->state_Fxx[ 1 ].sCmn.VAD_flags[ psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded ] == 0 ) {
425 silk_stereo_encode_mid_only( psRangeEnc, psEnc->sStereo.mid_only_flags[ psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded ] );
426 }
427 }
428 } else {
429 /* Buffering */
430 silk_memcpy( psEnc->state_Fxx[ 0 ].sCmn.inputBuf, psEnc->sStereo.sMid, 2 * sizeof( opus_int16 ) );
431 silk_memcpy( psEnc->sStereo.sMid, &psEnc->state_Fxx[ 0 ].sCmn.inputBuf[ psEnc->state_Fxx[ 0 ].sCmn.frame_length ], 2 * sizeof( opus_int16 ) );
432 }
433 silk_encode_do_VAD_Fxx( &psEnc->state_Fxx[ 0 ] );
434
435 /* Encode */
436 for( n = 0; n < encControl->nChannelsInternal; n++ ) {
437 opus_int maxBits, useCBR;
438
439 /* Handling rate constraints */
440 maxBits = encControl->maxBits;
441 if( tot_blocks == 2 && curr_block == 0 ) {
442 maxBits = maxBits * 3 / 5;
443 } else if( tot_blocks == 3 ) {
444 if( curr_block == 0 ) {
445 maxBits = maxBits * 2 / 5;
446 } else if( curr_block == 1 ) {
447 maxBits = maxBits * 3 / 4;
448 }
449 }
450 useCBR = encControl->useCBR && curr_block == tot_blocks - 1;
451
452 if( encControl->nChannelsInternal == 1 ) {
453 channelRate_bps = TargetRate_bps;
454 } else {
455 channelRate_bps = MStargetRates_bps[ n ];
456 if( n == 0 && MStargetRates_bps[ 1 ] > 0 ) {
457 useCBR = 0;
458 /* Give mid up to 1/2 of the max bits for that frame */
459 maxBits -= encControl->maxBits / ( tot_blocks * 2 );
460 }
461 }
462
463 if( channelRate_bps > 0 ) {
464 opus_int condCoding;
465
466 silk_control_SNR( &psEnc->state_Fxx[ n ].sCmn, channelRate_bps );
467
468 /* Use independent coding if no previous frame available */
469 if( psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded - n <= 0 ) {
470 condCoding = CODE_INDEPENDENTLY;
471 } else if( n > 0 && psEnc->prev_decode_only_middle ) {
472 /* If we skipped a side frame in this packet, we don't
473 need LTP scaling; the LTP state is well-defined. */
474 condCoding = CODE_INDEPENDENTLY_NO_LTP_SCALING;
475 } else {
476 condCoding = CODE_CONDITIONALLY;
477 }
478 if( ( ret = silk_encode_frame_Fxx( &psEnc->state_Fxx[ n ], nBytesOut, psRangeEnc, condCoding, maxBits, useCBR ) ) != 0 ) {
479 silk_assert( 0 );
480 }
481 }
482 psEnc->state_Fxx[ n ].sCmn.controlled_since_last_payload = 0;
483 psEnc->state_Fxx[ n ].sCmn.inputBufIx = 0;
484 psEnc->state_Fxx[ n ].sCmn.nFramesEncoded++;
485 }
486 psEnc->prev_decode_only_middle = psEnc->sStereo.mid_only_flags[ psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded - 1 ];
487
488 /* Insert VAD and FEC flags at beginning of bitstream */
489 if( *nBytesOut > 0 && psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded == psEnc->state_Fxx[ 0 ].sCmn.nFramesPerPacket) {
490 flags = 0;
491 for( n = 0; n < encControl->nChannelsInternal; n++ ) {
492 for( i = 0; i < psEnc->state_Fxx[ n ].sCmn.nFramesPerPacket; i++ ) {
493 flags = silk_LSHIFT( flags, 1 );
494 flags |= psEnc->state_Fxx[ n ].sCmn.VAD_flags[ i ];
495 }
496 flags = silk_LSHIFT( flags, 1 );
497 flags |= psEnc->state_Fxx[ n ].sCmn.LBRR_flag;
498 }
499 if( !prefillFlag ) {
500 ec_enc_patch_initial_bits( psRangeEnc, flags, ( psEnc->state_Fxx[ 0 ].sCmn.nFramesPerPacket + 1 ) * encControl->nChannelsInternal );
501 }
502
503 /* Return zero bytes if all channels DTXed */
504 if( psEnc->state_Fxx[ 0 ].sCmn.inDTX && ( encControl->nChannelsInternal == 1 || psEnc->state_Fxx[ 1 ].sCmn.inDTX ) ) {
505 *nBytesOut = 0;
506 }
507
508 psEnc->nBitsExceeded += *nBytesOut * 8;
509 psEnc->nBitsExceeded -= silk_DIV32_16( silk_MUL( encControl->bitRate, encControl->payloadSize_ms ), 1000 );
510 psEnc->nBitsExceeded = silk_LIMIT( psEnc->nBitsExceeded, 0, 10000 );
511
512 /* Update flag indicating if bandwidth switching is allowed */
513 speech_act_thr_for_switch_Q8 = silk_SMLAWB( SILK_FIX_CONST( SPEECH_ACTIVITY_DTX_THRES, 8 ),
514 SILK_FIX_CONST( ( 1 - SPEECH_ACTIVITY_DTX_THRES ) / MAX_BANDWIDTH_SWITCH_DELAY_MS, 16 + 8 ), psEnc->timeSinceSwitchAllowed_ms );
515 if( psEnc->state_Fxx[ 0 ].sCmn.speech_activity_Q8 < speech_act_thr_for_switch_Q8 ) {
516 psEnc->allowBandwidthSwitch = 1;
517 psEnc->timeSinceSwitchAllowed_ms = 0;
518 } else {
519 psEnc->allowBandwidthSwitch = 0;
520 psEnc->timeSinceSwitchAllowed_ms += encControl->payloadSize_ms;
521 }
522 }
523
524 if( nSamplesIn == 0 ) {
525 break;
526 }
527 } else {
528 break;
529 }
530 curr_block++;
531 }
532
533 psEnc->nPrevChannelsInternal = encControl->nChannelsInternal;
534
535 encControl->allowBandwidthSwitch = psEnc->allowBandwidthSwitch;
536 encControl->inWBmodeWithoutVariableLP = psEnc->state_Fxx[ 0 ].sCmn.fs_kHz == 16 && psEnc->state_Fxx[ 0 ].sCmn.sLP.mode == 0;
537 encControl->internalSampleRate = silk_SMULBB( psEnc->state_Fxx[ 0 ].sCmn.fs_kHz, 1000 );
538 encControl->stereoWidth_Q14 = encControl->toMono ? 0 : psEnc->sStereo.smth_width_Q14;
539 if( prefillFlag ) {
540 encControl->payloadSize_ms = tmp_payloadSize_ms;
541 encControl->complexity = tmp_complexity;
542 for( n = 0; n < encControl->nChannelsInternal; n++ ) {
543 psEnc->state_Fxx[ n ].sCmn.controlled_since_last_payload = 0;
544 psEnc->state_Fxx[ n ].sCmn.prefillFlag = 0;
545 }
546 }
547
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +0000548 RESTORE_STACK;
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +0000549 return ret;
550}
551