• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #include "define.h"
32 #include "API.h"
33 #include "control.h"
34 #include "typedef.h"
35 #include "stack_alloc.h"
36 #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 
44 /***************************************/
45 /* Read control structure from encoder */
46 /***************************************/
47 static opus_int silk_QueryEncoder(                      /* O    Returns error code                              */
48     const void                      *encState,          /* I    State                                           */
49     silk_EncControlStruct           *encStatus          /* O    Encoder Status                                  */
50 );
51 
52 /****************************************/
53 /* Encoder functions                    */
54 /****************************************/
55 
silk_Get_Encoder_Size(opus_int * encSizeBytes)56 opus_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 /*************************/
silk_InitEncoder(void * encState,int arch,silk_EncControlStruct * encStatus)70 opus_int silk_InitEncoder(                              /* O    Returns error code                              */
71     void                            *encState,          /* I/O  State                                           */
72     int                              arch,              /* I    Run-time architecture                           */
73     silk_EncControlStruct           *encStatus          /* O    Encoder Status                                  */
74 )
75 {
76     silk_encoder *psEnc;
77     opus_int n, ret = SILK_NO_ERROR;
78 
79     psEnc = (silk_encoder *)encState;
80 
81     /* Reset encoder */
82     silk_memset( psEnc, 0, sizeof( silk_encoder ) );
83     for( n = 0; n < ENCODER_NUM_CHANNELS; n++ ) {
84         if( ret += silk_init_encoder( &psEnc->state_Fxx[ n ], arch ) ) {
85             silk_assert( 0 );
86         }
87     }
88 
89     psEnc->nChannelsAPI = 1;
90     psEnc->nChannelsInternal = 1;
91 
92     /* Read control structure */
93     if( ret += silk_QueryEncoder( encState, encStatus ) ) {
94         silk_assert( 0 );
95     }
96 
97     return ret;
98 }
99 
100 /***************************************/
101 /* Read control structure from encoder */
102 /***************************************/
silk_QueryEncoder(const void * encState,silk_EncControlStruct * encStatus)103 static opus_int silk_QueryEncoder(                      /* O    Returns error code                              */
104     const void                      *encState,          /* I    State                                           */
105     silk_EncControlStruct           *encStatus          /* O    Encoder Status                                  */
106 )
107 {
108     opus_int ret = SILK_NO_ERROR;
109     silk_encoder_state_Fxx *state_Fxx;
110     silk_encoder *psEnc = (silk_encoder *)encState;
111 
112     state_Fxx = psEnc->state_Fxx;
113 
114     encStatus->nChannelsAPI              = psEnc->nChannelsAPI;
115     encStatus->nChannelsInternal         = psEnc->nChannelsInternal;
116     encStatus->API_sampleRate            = state_Fxx[ 0 ].sCmn.API_fs_Hz;
117     encStatus->maxInternalSampleRate     = state_Fxx[ 0 ].sCmn.maxInternal_fs_Hz;
118     encStatus->minInternalSampleRate     = state_Fxx[ 0 ].sCmn.minInternal_fs_Hz;
119     encStatus->desiredInternalSampleRate = state_Fxx[ 0 ].sCmn.desiredInternal_fs_Hz;
120     encStatus->payloadSize_ms            = state_Fxx[ 0 ].sCmn.PacketSize_ms;
121     encStatus->bitRate                   = state_Fxx[ 0 ].sCmn.TargetRate_bps;
122     encStatus->packetLossPercentage      = state_Fxx[ 0 ].sCmn.PacketLoss_perc;
123     encStatus->complexity                = state_Fxx[ 0 ].sCmn.Complexity;
124     encStatus->useInBandFEC              = state_Fxx[ 0 ].sCmn.useInBandFEC;
125     encStatus->useDTX                    = state_Fxx[ 0 ].sCmn.useDTX;
126     encStatus->useCBR                    = state_Fxx[ 0 ].sCmn.useCBR;
127     encStatus->internalSampleRate        = silk_SMULBB( state_Fxx[ 0 ].sCmn.fs_kHz, 1000 );
128     encStatus->allowBandwidthSwitch      = state_Fxx[ 0 ].sCmn.allow_bandwidth_switch;
129     encStatus->inWBmodeWithoutVariableLP = state_Fxx[ 0 ].sCmn.fs_kHz == 16 && state_Fxx[ 0 ].sCmn.sLP.mode == 0;
130 
131     return ret;
132 }
133 
134 
135 /**************************/
136 /* Encode frame with Silk */
137 /**************************/
138 /* Note: if prefillFlag is set, the input must contain 10 ms of audio, irrespective of what                     */
139 /* encControl->payloadSize_ms is set to                                                                         */
silk_Encode(void * encState,silk_EncControlStruct * encControl,const opus_int16 * samplesIn,opus_int nSamplesIn,ec_enc * psRangeEnc,opus_int32 * nBytesOut,const opus_int prefillFlag)140 opus_int silk_Encode(                                   /* O    Returns error code                              */
141     void                            *encState,          /* I/O  State                                           */
142     silk_EncControlStruct           *encControl,        /* I    Control status                                  */
143     const opus_int16                *samplesIn,         /* I    Speech sample input vector                      */
144     opus_int                        nSamplesIn,         /* I    Number of samples in input vector               */
145     ec_enc                          *psRangeEnc,        /* I/O  Compressor data structure                       */
146     opus_int32                      *nBytesOut,         /* I/O  Number of bytes in payload (input: Max bytes)   */
147     const opus_int                  prefillFlag         /* I    Flag to indicate prefilling buffers no coding   */
148 )
149 {
150     opus_int   n, i, nBits, flags, tmp_payloadSize_ms = 0, tmp_complexity = 0, ret = 0;
151     opus_int   nSamplesToBuffer, nSamplesToBufferMax, nBlocksOf10ms;
152     opus_int   nSamplesFromInput = 0, nSamplesFromInputMax;
153     opus_int   speech_act_thr_for_switch_Q8;
154     opus_int32 TargetRate_bps, MStargetRates_bps[ 2 ], channelRate_bps, LBRR_symbol, sum;
155     silk_encoder *psEnc = ( silk_encoder * )encState;
156     VARDECL( opus_int16, buf );
157     opus_int transition, curr_block, tot_blocks;
158     SAVE_STACK;
159 
160     if (encControl->reducedDependency)
161     {
162        psEnc->state_Fxx[0].sCmn.first_frame_after_reset = 1;
163        psEnc->state_Fxx[1].sCmn.first_frame_after_reset = 1;
164     }
165     psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded = psEnc->state_Fxx[ 1 ].sCmn.nFramesEncoded = 0;
166 
167     /* Check values in encoder control structure */
168     if( ( ret = check_control_input( encControl ) ) != 0 ) {
169         silk_assert( 0 );
170         RESTORE_STACK;
171         return ret;
172     }
173 
174     encControl->switchReady = 0;
175 
176     if( encControl->nChannelsInternal > psEnc->nChannelsInternal ) {
177         /* Mono -> Stereo transition: init state of second channel and stereo state */
178         ret += silk_init_encoder( &psEnc->state_Fxx[ 1 ], psEnc->state_Fxx[ 0 ].sCmn.arch );
179         silk_memset( psEnc->sStereo.pred_prev_Q13, 0, sizeof( psEnc->sStereo.pred_prev_Q13 ) );
180         silk_memset( psEnc->sStereo.sSide, 0, sizeof( psEnc->sStereo.sSide ) );
181         psEnc->sStereo.mid_side_amp_Q0[ 0 ] = 0;
182         psEnc->sStereo.mid_side_amp_Q0[ 1 ] = 1;
183         psEnc->sStereo.mid_side_amp_Q0[ 2 ] = 0;
184         psEnc->sStereo.mid_side_amp_Q0[ 3 ] = 1;
185         psEnc->sStereo.width_prev_Q14 = 0;
186         psEnc->sStereo.smth_width_Q14 = SILK_FIX_CONST( 1, 14 );
187         if( psEnc->nChannelsAPI == 2 ) {
188             silk_memcpy( &psEnc->state_Fxx[ 1 ].sCmn.resampler_state, &psEnc->state_Fxx[ 0 ].sCmn.resampler_state, sizeof( silk_resampler_state_struct ) );
189             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 ) );
190         }
191     }
192 
193     transition = (encControl->payloadSize_ms != psEnc->state_Fxx[ 0 ].sCmn.PacketSize_ms) || (psEnc->nChannelsInternal != encControl->nChannelsInternal);
194 
195     psEnc->nChannelsAPI = encControl->nChannelsAPI;
196     psEnc->nChannelsInternal = encControl->nChannelsInternal;
197 
198     nBlocksOf10ms = silk_DIV32( 100 * nSamplesIn, encControl->API_sampleRate );
199     tot_blocks = ( nBlocksOf10ms > 1 ) ? nBlocksOf10ms >> 1 : 1;
200     curr_block = 0;
201     if( prefillFlag ) {
202         /* Only accept input length of 10 ms */
203         if( nBlocksOf10ms != 1 ) {
204             silk_assert( 0 );
205             RESTORE_STACK;
206             return SILK_ENC_INPUT_INVALID_NO_OF_SAMPLES;
207         }
208         /* Reset Encoder */
209         for( n = 0; n < encControl->nChannelsInternal; n++ ) {
210             ret = silk_init_encoder( &psEnc->state_Fxx[ n ], psEnc->state_Fxx[ n ].sCmn.arch );
211             silk_assert( !ret );
212         }
213         tmp_payloadSize_ms = encControl->payloadSize_ms;
214         encControl->payloadSize_ms = 10;
215         tmp_complexity = encControl->complexity;
216         encControl->complexity = 0;
217         for( n = 0; n < encControl->nChannelsInternal; n++ ) {
218             psEnc->state_Fxx[ n ].sCmn.controlled_since_last_payload = 0;
219             psEnc->state_Fxx[ n ].sCmn.prefillFlag = 1;
220         }
221     } else {
222         /* Only accept input lengths that are a multiple of 10 ms */
223         if( nBlocksOf10ms * encControl->API_sampleRate != 100 * nSamplesIn || nSamplesIn < 0 ) {
224             silk_assert( 0 );
225             RESTORE_STACK;
226             return SILK_ENC_INPUT_INVALID_NO_OF_SAMPLES;
227         }
228         /* Make sure no more than one packet can be produced */
229         if( 1000 * (opus_int32)nSamplesIn > encControl->payloadSize_ms * encControl->API_sampleRate ) {
230             silk_assert( 0 );
231             RESTORE_STACK;
232             return SILK_ENC_INPUT_INVALID_NO_OF_SAMPLES;
233         }
234     }
235 
236     TargetRate_bps = silk_RSHIFT32( encControl->bitRate, encControl->nChannelsInternal - 1 );
237     for( n = 0; n < encControl->nChannelsInternal; n++ ) {
238         /* Force the side channel to the same rate as the mid */
239         opus_int force_fs_kHz = (n==1) ? psEnc->state_Fxx[0].sCmn.fs_kHz : 0;
240         if( ( ret = silk_control_encoder( &psEnc->state_Fxx[ n ], encControl, TargetRate_bps, psEnc->allowBandwidthSwitch, n, force_fs_kHz ) ) != 0 ) {
241             silk_assert( 0 );
242             RESTORE_STACK;
243             return ret;
244         }
245         if( psEnc->state_Fxx[n].sCmn.first_frame_after_reset || transition ) {
246             for( i = 0; i < psEnc->state_Fxx[ 0 ].sCmn.nFramesPerPacket; i++ ) {
247                 psEnc->state_Fxx[ n ].sCmn.LBRR_flags[ i ] = 0;
248             }
249         }
250         psEnc->state_Fxx[ n ].sCmn.inDTX = psEnc->state_Fxx[ n ].sCmn.useDTX;
251     }
252     silk_assert( encControl->nChannelsInternal == 1 || psEnc->state_Fxx[ 0 ].sCmn.fs_kHz == psEnc->state_Fxx[ 1 ].sCmn.fs_kHz );
253 
254     /* Input buffering/resampling and encoding */
255     nSamplesToBufferMax =
256         10 * nBlocksOf10ms * psEnc->state_Fxx[ 0 ].sCmn.fs_kHz;
257     nSamplesFromInputMax =
258         silk_DIV32_16( nSamplesToBufferMax *
259                            psEnc->state_Fxx[ 0 ].sCmn.API_fs_Hz,
260                        psEnc->state_Fxx[ 0 ].sCmn.fs_kHz * 1000 );
261     ALLOC( buf, nSamplesFromInputMax, opus_int16 );
262     while( 1 ) {
263         nSamplesToBuffer  = psEnc->state_Fxx[ 0 ].sCmn.frame_length - psEnc->state_Fxx[ 0 ].sCmn.inputBufIx;
264         nSamplesToBuffer  = silk_min( nSamplesToBuffer, nSamplesToBufferMax );
265         nSamplesFromInput = silk_DIV32_16( nSamplesToBuffer * psEnc->state_Fxx[ 0 ].sCmn.API_fs_Hz, psEnc->state_Fxx[ 0 ].sCmn.fs_kHz * 1000 );
266         /* Resample and write to buffer */
267         if( encControl->nChannelsAPI == 2 && encControl->nChannelsInternal == 2 ) {
268             opus_int id = psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded;
269             for( n = 0; n < nSamplesFromInput; n++ ) {
270                 buf[ n ] = samplesIn[ 2 * n ];
271             }
272             /* Making sure to start both resamplers from the same state when switching from mono to stereo */
273             if( psEnc->nPrevChannelsInternal == 1 && id==0 ) {
274                silk_memcpy( &psEnc->state_Fxx[ 1 ].sCmn.resampler_state, &psEnc->state_Fxx[ 0 ].sCmn.resampler_state, sizeof(psEnc->state_Fxx[ 1 ].sCmn.resampler_state));
275             }
276 
277             ret += silk_resampler( &psEnc->state_Fxx[ 0 ].sCmn.resampler_state,
278                 &psEnc->state_Fxx[ 0 ].sCmn.inputBuf[ psEnc->state_Fxx[ 0 ].sCmn.inputBufIx + 2 ], buf, nSamplesFromInput );
279             psEnc->state_Fxx[ 0 ].sCmn.inputBufIx += nSamplesToBuffer;
280 
281             nSamplesToBuffer  = psEnc->state_Fxx[ 1 ].sCmn.frame_length - psEnc->state_Fxx[ 1 ].sCmn.inputBufIx;
282             nSamplesToBuffer  = silk_min( nSamplesToBuffer, 10 * nBlocksOf10ms * psEnc->state_Fxx[ 1 ].sCmn.fs_kHz );
283             for( n = 0; n < nSamplesFromInput; n++ ) {
284                 buf[ n ] = samplesIn[ 2 * n + 1 ];
285             }
286             ret += silk_resampler( &psEnc->state_Fxx[ 1 ].sCmn.resampler_state,
287                 &psEnc->state_Fxx[ 1 ].sCmn.inputBuf[ psEnc->state_Fxx[ 1 ].sCmn.inputBufIx + 2 ], buf, nSamplesFromInput );
288 
289             psEnc->state_Fxx[ 1 ].sCmn.inputBufIx += nSamplesToBuffer;
290         } else if( encControl->nChannelsAPI == 2 && encControl->nChannelsInternal == 1 ) {
291             /* Combine left and right channels before resampling */
292             for( n = 0; n < nSamplesFromInput; n++ ) {
293                 sum = samplesIn[ 2 * n ] + samplesIn[ 2 * n + 1 ];
294                 buf[ n ] = (opus_int16)silk_RSHIFT_ROUND( sum,  1 );
295             }
296             ret += silk_resampler( &psEnc->state_Fxx[ 0 ].sCmn.resampler_state,
297                 &psEnc->state_Fxx[ 0 ].sCmn.inputBuf[ psEnc->state_Fxx[ 0 ].sCmn.inputBufIx + 2 ], buf, nSamplesFromInput );
298             /* On the first mono frame, average the results for the two resampler states  */
299             if( psEnc->nPrevChannelsInternal == 2 && psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded == 0 ) {
300                ret += silk_resampler( &psEnc->state_Fxx[ 1 ].sCmn.resampler_state,
301                    &psEnc->state_Fxx[ 1 ].sCmn.inputBuf[ psEnc->state_Fxx[ 1 ].sCmn.inputBufIx + 2 ], buf, nSamplesFromInput );
302                for( n = 0; n < psEnc->state_Fxx[ 0 ].sCmn.frame_length; n++ ) {
303                   psEnc->state_Fxx[ 0 ].sCmn.inputBuf[ psEnc->state_Fxx[ 0 ].sCmn.inputBufIx+n+2 ] =
304                         silk_RSHIFT(psEnc->state_Fxx[ 0 ].sCmn.inputBuf[ psEnc->state_Fxx[ 0 ].sCmn.inputBufIx+n+2 ]
305                                   + psEnc->state_Fxx[ 1 ].sCmn.inputBuf[ psEnc->state_Fxx[ 1 ].sCmn.inputBufIx+n+2 ], 1);
306                }
307             }
308             psEnc->state_Fxx[ 0 ].sCmn.inputBufIx += nSamplesToBuffer;
309         } else {
310             silk_assert( encControl->nChannelsAPI == 1 && encControl->nChannelsInternal == 1 );
311             silk_memcpy(buf, samplesIn, nSamplesFromInput*sizeof(opus_int16));
312             ret += silk_resampler( &psEnc->state_Fxx[ 0 ].sCmn.resampler_state,
313                 &psEnc->state_Fxx[ 0 ].sCmn.inputBuf[ psEnc->state_Fxx[ 0 ].sCmn.inputBufIx + 2 ], buf, nSamplesFromInput );
314             psEnc->state_Fxx[ 0 ].sCmn.inputBufIx += nSamplesToBuffer;
315         }
316 
317         samplesIn  += nSamplesFromInput * encControl->nChannelsAPI;
318         nSamplesIn -= nSamplesFromInput;
319 
320         /* Default */
321         psEnc->allowBandwidthSwitch = 0;
322 
323         /* Silk encoder */
324         if( psEnc->state_Fxx[ 0 ].sCmn.inputBufIx >= psEnc->state_Fxx[ 0 ].sCmn.frame_length ) {
325             /* Enough data in input buffer, so encode */
326             silk_assert( psEnc->state_Fxx[ 0 ].sCmn.inputBufIx == psEnc->state_Fxx[ 0 ].sCmn.frame_length );
327             silk_assert( encControl->nChannelsInternal == 1 || psEnc->state_Fxx[ 1 ].sCmn.inputBufIx == psEnc->state_Fxx[ 1 ].sCmn.frame_length );
328 
329             /* Deal with LBRR data */
330             if( psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded == 0 && !prefillFlag ) {
331                 /* Create space at start of payload for VAD and FEC flags */
332                 opus_uint8 iCDF[ 2 ] = { 0, 0 };
333                 iCDF[ 0 ] = 256 - silk_RSHIFT( 256, ( psEnc->state_Fxx[ 0 ].sCmn.nFramesPerPacket + 1 ) * encControl->nChannelsInternal );
334                 ec_enc_icdf( psRangeEnc, 0, iCDF, 8 );
335 
336                 /* Encode any LBRR data from previous packet */
337                 /* Encode LBRR flags */
338                 for( n = 0; n < encControl->nChannelsInternal; n++ ) {
339                     LBRR_symbol = 0;
340                     for( i = 0; i < psEnc->state_Fxx[ n ].sCmn.nFramesPerPacket; i++ ) {
341                         LBRR_symbol |= silk_LSHIFT( psEnc->state_Fxx[ n ].sCmn.LBRR_flags[ i ], i );
342                     }
343                     psEnc->state_Fxx[ n ].sCmn.LBRR_flag = LBRR_symbol > 0 ? 1 : 0;
344                     if( LBRR_symbol && psEnc->state_Fxx[ n ].sCmn.nFramesPerPacket > 1 ) {
345                         ec_enc_icdf( psRangeEnc, LBRR_symbol - 1, silk_LBRR_flags_iCDF_ptr[ psEnc->state_Fxx[ n ].sCmn.nFramesPerPacket - 2 ], 8 );
346                     }
347                 }
348 
349                 /* Code LBRR indices and excitation signals */
350                 for( i = 0; i < psEnc->state_Fxx[ 0 ].sCmn.nFramesPerPacket; i++ ) {
351                     for( n = 0; n < encControl->nChannelsInternal; n++ ) {
352                         if( psEnc->state_Fxx[ n ].sCmn.LBRR_flags[ i ] ) {
353                             opus_int condCoding;
354 
355                             if( encControl->nChannelsInternal == 2 && n == 0 ) {
356                                 silk_stereo_encode_pred( psRangeEnc, psEnc->sStereo.predIx[ i ] );
357                                 /* For LBRR data there's no need to code the mid-only flag if the side-channel LBRR flag is set */
358                                 if( psEnc->state_Fxx[ 1 ].sCmn.LBRR_flags[ i ] == 0 ) {
359                                     silk_stereo_encode_mid_only( psRangeEnc, psEnc->sStereo.mid_only_flags[ i ] );
360                                 }
361                             }
362                             /* Use conditional coding if previous frame available */
363                             if( i > 0 && psEnc->state_Fxx[ n ].sCmn.LBRR_flags[ i - 1 ] ) {
364                                 condCoding = CODE_CONDITIONALLY;
365                             } else {
366                                 condCoding = CODE_INDEPENDENTLY;
367                             }
368                             silk_encode_indices( &psEnc->state_Fxx[ n ].sCmn, psRangeEnc, i, 1, condCoding );
369                             silk_encode_pulses( psRangeEnc, psEnc->state_Fxx[ n ].sCmn.indices_LBRR[i].signalType, psEnc->state_Fxx[ n ].sCmn.indices_LBRR[i].quantOffsetType,
370                                 psEnc->state_Fxx[ n ].sCmn.pulses_LBRR[ i ], psEnc->state_Fxx[ n ].sCmn.frame_length );
371                         }
372                     }
373                 }
374 
375                 /* Reset LBRR flags */
376                 for( n = 0; n < encControl->nChannelsInternal; n++ ) {
377                     silk_memset( psEnc->state_Fxx[ n ].sCmn.LBRR_flags, 0, sizeof( psEnc->state_Fxx[ n ].sCmn.LBRR_flags ) );
378                 }
379 
380                 psEnc->nBitsUsedLBRR = ec_tell( psRangeEnc );
381             }
382 
383             silk_HP_variable_cutoff( psEnc->state_Fxx );
384 
385             /* Total target bits for packet */
386             nBits = silk_DIV32_16( silk_MUL( encControl->bitRate, encControl->payloadSize_ms ), 1000 );
387             /* Subtract bits used for LBRR */
388             if( !prefillFlag ) {
389                 nBits -= psEnc->nBitsUsedLBRR;
390             }
391             /* Divide by number of uncoded frames left in packet */
392             nBits = silk_DIV32_16( nBits, psEnc->state_Fxx[ 0 ].sCmn.nFramesPerPacket );
393             /* Convert to bits/second */
394             if( encControl->payloadSize_ms == 10 ) {
395                 TargetRate_bps = silk_SMULBB( nBits, 100 );
396             } else {
397                 TargetRate_bps = silk_SMULBB( nBits, 50 );
398             }
399             /* Subtract fraction of bits in excess of target in previous frames and packets */
400             TargetRate_bps -= silk_DIV32_16( silk_MUL( psEnc->nBitsExceeded, 1000 ), BITRESERVOIR_DECAY_TIME_MS );
401             if( !prefillFlag && psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded > 0 ) {
402                 /* Compare actual vs target bits so far in this packet */
403                 opus_int32 bitsBalance = ec_tell( psRangeEnc ) - psEnc->nBitsUsedLBRR - nBits * psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded;
404                 TargetRate_bps -= silk_DIV32_16( silk_MUL( bitsBalance, 1000 ), BITRESERVOIR_DECAY_TIME_MS );
405             }
406             /* Never exceed input bitrate */
407             TargetRate_bps = silk_LIMIT( TargetRate_bps, encControl->bitRate, 5000 );
408 
409             /* Convert Left/Right to Mid/Side */
410             if( encControl->nChannelsInternal == 2 ) {
411                 silk_stereo_LR_to_MS( &psEnc->sStereo, &psEnc->state_Fxx[ 0 ].sCmn.inputBuf[ 2 ], &psEnc->state_Fxx[ 1 ].sCmn.inputBuf[ 2 ],
412                     psEnc->sStereo.predIx[ psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded ], &psEnc->sStereo.mid_only_flags[ psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded ],
413                     MStargetRates_bps, TargetRate_bps, psEnc->state_Fxx[ 0 ].sCmn.speech_activity_Q8, encControl->toMono,
414                     psEnc->state_Fxx[ 0 ].sCmn.fs_kHz, psEnc->state_Fxx[ 0 ].sCmn.frame_length );
415                 if( psEnc->sStereo.mid_only_flags[ psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded ] == 0 ) {
416                     /* Reset side channel encoder memory for first frame with side coding */
417                     if( psEnc->prev_decode_only_middle == 1 ) {
418                         silk_memset( &psEnc->state_Fxx[ 1 ].sShape,               0, sizeof( psEnc->state_Fxx[ 1 ].sShape ) );
419                         silk_memset( &psEnc->state_Fxx[ 1 ].sPrefilt,             0, sizeof( psEnc->state_Fxx[ 1 ].sPrefilt ) );
420                         silk_memset( &psEnc->state_Fxx[ 1 ].sCmn.sNSQ,            0, sizeof( psEnc->state_Fxx[ 1 ].sCmn.sNSQ ) );
421                         silk_memset( psEnc->state_Fxx[ 1 ].sCmn.prev_NLSFq_Q15,   0, sizeof( psEnc->state_Fxx[ 1 ].sCmn.prev_NLSFq_Q15 ) );
422                         silk_memset( &psEnc->state_Fxx[ 1 ].sCmn.sLP.In_LP_State, 0, sizeof( psEnc->state_Fxx[ 1 ].sCmn.sLP.In_LP_State ) );
423                         psEnc->state_Fxx[ 1 ].sCmn.prevLag                 = 100;
424                         psEnc->state_Fxx[ 1 ].sCmn.sNSQ.lagPrev            = 100;
425                         psEnc->state_Fxx[ 1 ].sShape.LastGainIndex         = 10;
426                         psEnc->state_Fxx[ 1 ].sCmn.prevSignalType          = TYPE_NO_VOICE_ACTIVITY;
427                         psEnc->state_Fxx[ 1 ].sCmn.sNSQ.prev_gain_Q16      = 65536;
428                         psEnc->state_Fxx[ 1 ].sCmn.first_frame_after_reset = 1;
429                     }
430                     silk_encode_do_VAD_Fxx( &psEnc->state_Fxx[ 1 ] );
431                 } else {
432                     psEnc->state_Fxx[ 1 ].sCmn.VAD_flags[ psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded ] = 0;
433                 }
434                 if( !prefillFlag ) {
435                     silk_stereo_encode_pred( psRangeEnc, psEnc->sStereo.predIx[ psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded ] );
436                     if( psEnc->state_Fxx[ 1 ].sCmn.VAD_flags[ psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded ] == 0 ) {
437                         silk_stereo_encode_mid_only( psRangeEnc, psEnc->sStereo.mid_only_flags[ psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded ] );
438                     }
439                 }
440             } else {
441                 /* Buffering */
442                 silk_memcpy( psEnc->state_Fxx[ 0 ].sCmn.inputBuf, psEnc->sStereo.sMid, 2 * sizeof( opus_int16 ) );
443                 silk_memcpy( psEnc->sStereo.sMid, &psEnc->state_Fxx[ 0 ].sCmn.inputBuf[ psEnc->state_Fxx[ 0 ].sCmn.frame_length ], 2 * sizeof( opus_int16 ) );
444             }
445             silk_encode_do_VAD_Fxx( &psEnc->state_Fxx[ 0 ] );
446 
447             /* Encode */
448             for( n = 0; n < encControl->nChannelsInternal; n++ ) {
449                 opus_int maxBits, useCBR;
450 
451                 /* Handling rate constraints */
452                 maxBits = encControl->maxBits;
453                 if( tot_blocks == 2 && curr_block == 0 ) {
454                     maxBits = maxBits * 3 / 5;
455                 } else if( tot_blocks == 3 ) {
456                     if( curr_block == 0 ) {
457                         maxBits = maxBits * 2 / 5;
458                     } else if( curr_block == 1 ) {
459                         maxBits = maxBits * 3 / 4;
460                     }
461                 }
462                 useCBR = encControl->useCBR && curr_block == tot_blocks - 1;
463 
464                 if( encControl->nChannelsInternal == 1 ) {
465                     channelRate_bps = TargetRate_bps;
466                 } else {
467                     channelRate_bps = MStargetRates_bps[ n ];
468                     if( n == 0 && MStargetRates_bps[ 1 ] > 0 ) {
469                         useCBR = 0;
470                         /* Give mid up to 1/2 of the max bits for that frame */
471                         maxBits -= encControl->maxBits / ( tot_blocks * 2 );
472                     }
473                 }
474 
475                 if( channelRate_bps > 0 ) {
476                     opus_int condCoding;
477 
478                     silk_control_SNR( &psEnc->state_Fxx[ n ].sCmn, channelRate_bps );
479 
480                     /* Use independent coding if no previous frame available */
481                     if( psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded - n <= 0 ) {
482                         condCoding = CODE_INDEPENDENTLY;
483                     } else if( n > 0 && psEnc->prev_decode_only_middle ) {
484                         /* If we skipped a side frame in this packet, we don't
485                            need LTP scaling; the LTP state is well-defined. */
486                         condCoding = CODE_INDEPENDENTLY_NO_LTP_SCALING;
487                     } else {
488                         condCoding = CODE_CONDITIONALLY;
489                     }
490                     if( ( ret = silk_encode_frame_Fxx( &psEnc->state_Fxx[ n ], nBytesOut, psRangeEnc, condCoding, maxBits, useCBR ) ) != 0 ) {
491                         silk_assert( 0 );
492                     }
493                 }
494                 psEnc->state_Fxx[ n ].sCmn.controlled_since_last_payload = 0;
495                 psEnc->state_Fxx[ n ].sCmn.inputBufIx = 0;
496                 psEnc->state_Fxx[ n ].sCmn.nFramesEncoded++;
497             }
498             psEnc->prev_decode_only_middle = psEnc->sStereo.mid_only_flags[ psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded - 1 ];
499 
500             /* Insert VAD and FEC flags at beginning of bitstream */
501             if( *nBytesOut > 0 && psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded == psEnc->state_Fxx[ 0 ].sCmn.nFramesPerPacket) {
502                 flags = 0;
503                 for( n = 0; n < encControl->nChannelsInternal; n++ ) {
504                     for( i = 0; i < psEnc->state_Fxx[ n ].sCmn.nFramesPerPacket; i++ ) {
505                         flags  = silk_LSHIFT( flags, 1 );
506                         flags |= psEnc->state_Fxx[ n ].sCmn.VAD_flags[ i ];
507                     }
508                     flags  = silk_LSHIFT( flags, 1 );
509                     flags |= psEnc->state_Fxx[ n ].sCmn.LBRR_flag;
510                 }
511                 if( !prefillFlag ) {
512                     ec_enc_patch_initial_bits( psRangeEnc, flags, ( psEnc->state_Fxx[ 0 ].sCmn.nFramesPerPacket + 1 ) * encControl->nChannelsInternal );
513                 }
514 
515                 /* Return zero bytes if all channels DTXed */
516                 if( psEnc->state_Fxx[ 0 ].sCmn.inDTX && ( encControl->nChannelsInternal == 1 || psEnc->state_Fxx[ 1 ].sCmn.inDTX ) ) {
517                     *nBytesOut = 0;
518                 }
519 
520                 psEnc->nBitsExceeded += *nBytesOut * 8;
521                 psEnc->nBitsExceeded -= silk_DIV32_16( silk_MUL( encControl->bitRate, encControl->payloadSize_ms ), 1000 );
522                 psEnc->nBitsExceeded  = silk_LIMIT( psEnc->nBitsExceeded, 0, 10000 );
523 
524                 /* Update flag indicating if bandwidth switching is allowed */
525                 speech_act_thr_for_switch_Q8 = silk_SMLAWB( SILK_FIX_CONST( SPEECH_ACTIVITY_DTX_THRES, 8 ),
526                     SILK_FIX_CONST( ( 1 - SPEECH_ACTIVITY_DTX_THRES ) / MAX_BANDWIDTH_SWITCH_DELAY_MS, 16 + 8 ), psEnc->timeSinceSwitchAllowed_ms );
527                 if( psEnc->state_Fxx[ 0 ].sCmn.speech_activity_Q8 < speech_act_thr_for_switch_Q8 ) {
528                     psEnc->allowBandwidthSwitch = 1;
529                     psEnc->timeSinceSwitchAllowed_ms = 0;
530                 } else {
531                     psEnc->allowBandwidthSwitch = 0;
532                     psEnc->timeSinceSwitchAllowed_ms += encControl->payloadSize_ms;
533                 }
534             }
535 
536             if( nSamplesIn == 0 ) {
537                 break;
538             }
539         } else {
540             break;
541         }
542         curr_block++;
543     }
544 
545     psEnc->nPrevChannelsInternal = encControl->nChannelsInternal;
546 
547     encControl->allowBandwidthSwitch = psEnc->allowBandwidthSwitch;
548     encControl->inWBmodeWithoutVariableLP = psEnc->state_Fxx[ 0 ].sCmn.fs_kHz == 16 && psEnc->state_Fxx[ 0 ].sCmn.sLP.mode == 0;
549     encControl->internalSampleRate = silk_SMULBB( psEnc->state_Fxx[ 0 ].sCmn.fs_kHz, 1000 );
550     encControl->stereoWidth_Q14 = encControl->toMono ? 0 : psEnc->sStereo.smth_width_Q14;
551     if( prefillFlag ) {
552         encControl->payloadSize_ms = tmp_payloadSize_ms;
553         encControl->complexity = tmp_complexity;
554         for( n = 0; n < encControl->nChannelsInternal; n++ ) {
555             psEnc->state_Fxx[ n ].sCmn.controlled_since_last_payload = 0;
556             psEnc->state_Fxx[ n ].sCmn.prefillFlag = 0;
557         }
558     }
559 
560     RESTORE_STACK;
561     return ret;
562 }
563 
564