• 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 
381             silk_HP_variable_cutoff( psEnc->state_Fxx );
382 
383             /* Total target bits for packet */
384             nBits = silk_DIV32_16( silk_MUL( encControl->bitRate, encControl->payloadSize_ms ), 1000 );
385             /* Subtract half of the bits already used */
386             if( !prefillFlag ) {
387                 nBits -= ec_tell( psRangeEnc ) >> 1;
388             }
389             /* Divide by number of uncoded frames left in packet */
390             nBits = silk_DIV32_16( nBits, psEnc->state_Fxx[ 0 ].sCmn.nFramesPerPacket - psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded );
391             /* Convert to bits/second */
392             if( encControl->payloadSize_ms == 10 ) {
393                 TargetRate_bps = silk_SMULBB( nBits, 100 );
394             } else {
395                 TargetRate_bps = silk_SMULBB( nBits, 50 );
396             }
397             /* Subtract fraction of bits in excess of target in previous packets */
398             TargetRate_bps -= silk_DIV32_16( silk_MUL( psEnc->nBitsExceeded, 1000 ), BITRESERVOIR_DECAY_TIME_MS );
399             /* Never exceed input bitrate */
400             TargetRate_bps = silk_LIMIT( TargetRate_bps, encControl->bitRate, 5000 );
401 
402             /* Convert Left/Right to Mid/Side */
403             if( encControl->nChannelsInternal == 2 ) {
404                 silk_stereo_LR_to_MS( &psEnc->sStereo, &psEnc->state_Fxx[ 0 ].sCmn.inputBuf[ 2 ], &psEnc->state_Fxx[ 1 ].sCmn.inputBuf[ 2 ],
405                     psEnc->sStereo.predIx[ psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded ], &psEnc->sStereo.mid_only_flags[ psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded ],
406                     MStargetRates_bps, TargetRate_bps, psEnc->state_Fxx[ 0 ].sCmn.speech_activity_Q8, encControl->toMono,
407                     psEnc->state_Fxx[ 0 ].sCmn.fs_kHz, psEnc->state_Fxx[ 0 ].sCmn.frame_length );
408                 if( psEnc->sStereo.mid_only_flags[ psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded ] == 0 ) {
409                     /* Reset side channel encoder memory for first frame with side coding */
410                     if( psEnc->prev_decode_only_middle == 1 ) {
411                         silk_memset( &psEnc->state_Fxx[ 1 ].sShape,               0, sizeof( psEnc->state_Fxx[ 1 ].sShape ) );
412                         silk_memset( &psEnc->state_Fxx[ 1 ].sPrefilt,             0, sizeof( psEnc->state_Fxx[ 1 ].sPrefilt ) );
413                         silk_memset( &psEnc->state_Fxx[ 1 ].sCmn.sNSQ,            0, sizeof( psEnc->state_Fxx[ 1 ].sCmn.sNSQ ) );
414                         silk_memset( psEnc->state_Fxx[ 1 ].sCmn.prev_NLSFq_Q15,   0, sizeof( psEnc->state_Fxx[ 1 ].sCmn.prev_NLSFq_Q15 ) );
415                         silk_memset( &psEnc->state_Fxx[ 1 ].sCmn.sLP.In_LP_State, 0, sizeof( psEnc->state_Fxx[ 1 ].sCmn.sLP.In_LP_State ) );
416                         psEnc->state_Fxx[ 1 ].sCmn.prevLag                 = 100;
417                         psEnc->state_Fxx[ 1 ].sCmn.sNSQ.lagPrev            = 100;
418                         psEnc->state_Fxx[ 1 ].sShape.LastGainIndex         = 10;
419                         psEnc->state_Fxx[ 1 ].sCmn.prevSignalType          = TYPE_NO_VOICE_ACTIVITY;
420                         psEnc->state_Fxx[ 1 ].sCmn.sNSQ.prev_gain_Q16      = 65536;
421                         psEnc->state_Fxx[ 1 ].sCmn.first_frame_after_reset = 1;
422                     }
423                     silk_encode_do_VAD_Fxx( &psEnc->state_Fxx[ 1 ] );
424                 } else {
425                     psEnc->state_Fxx[ 1 ].sCmn.VAD_flags[ psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded ] = 0;
426                 }
427                 if( !prefillFlag ) {
428                     silk_stereo_encode_pred( psRangeEnc, psEnc->sStereo.predIx[ psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded ] );
429                     if( psEnc->state_Fxx[ 1 ].sCmn.VAD_flags[ psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded ] == 0 ) {
430                         silk_stereo_encode_mid_only( psRangeEnc, psEnc->sStereo.mid_only_flags[ psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded ] );
431                     }
432                 }
433             } else {
434                 /* Buffering */
435                 silk_memcpy( psEnc->state_Fxx[ 0 ].sCmn.inputBuf, psEnc->sStereo.sMid, 2 * sizeof( opus_int16 ) );
436                 silk_memcpy( psEnc->sStereo.sMid, &psEnc->state_Fxx[ 0 ].sCmn.inputBuf[ psEnc->state_Fxx[ 0 ].sCmn.frame_length ], 2 * sizeof( opus_int16 ) );
437             }
438             silk_encode_do_VAD_Fxx( &psEnc->state_Fxx[ 0 ] );
439 
440             /* Encode */
441             for( n = 0; n < encControl->nChannelsInternal; n++ ) {
442                 opus_int maxBits, useCBR;
443 
444                 /* Handling rate constraints */
445                 maxBits = encControl->maxBits;
446                 if( tot_blocks == 2 && curr_block == 0 ) {
447                     maxBits = maxBits * 3 / 5;
448                 } else if( tot_blocks == 3 ) {
449                     if( curr_block == 0 ) {
450                         maxBits = maxBits * 2 / 5;
451                     } else if( curr_block == 1 ) {
452                         maxBits = maxBits * 3 / 4;
453                     }
454                 }
455                 useCBR = encControl->useCBR && curr_block == tot_blocks - 1;
456 
457                 if( encControl->nChannelsInternal == 1 ) {
458                     channelRate_bps = TargetRate_bps;
459                 } else {
460                     channelRate_bps = MStargetRates_bps[ n ];
461                     if( n == 0 && MStargetRates_bps[ 1 ] > 0 ) {
462                         useCBR = 0;
463                         /* Give mid up to 1/2 of the max bits for that frame */
464                         maxBits -= encControl->maxBits / ( tot_blocks * 2 );
465                     }
466                 }
467 
468                 if( channelRate_bps > 0 ) {
469                     opus_int condCoding;
470 
471                     silk_control_SNR( &psEnc->state_Fxx[ n ].sCmn, channelRate_bps );
472 
473                     /* Use independent coding if no previous frame available */
474                     if( psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded - n <= 0 ) {
475                         condCoding = CODE_INDEPENDENTLY;
476                     } else if( n > 0 && psEnc->prev_decode_only_middle ) {
477                         /* If we skipped a side frame in this packet, we don't
478                            need LTP scaling; the LTP state is well-defined. */
479                         condCoding = CODE_INDEPENDENTLY_NO_LTP_SCALING;
480                     } else {
481                         condCoding = CODE_CONDITIONALLY;
482                     }
483                     if( ( ret = silk_encode_frame_Fxx( &psEnc->state_Fxx[ n ], nBytesOut, psRangeEnc, condCoding, maxBits, useCBR ) ) != 0 ) {
484                         silk_assert( 0 );
485                     }
486                 }
487                 psEnc->state_Fxx[ n ].sCmn.controlled_since_last_payload = 0;
488                 psEnc->state_Fxx[ n ].sCmn.inputBufIx = 0;
489                 psEnc->state_Fxx[ n ].sCmn.nFramesEncoded++;
490             }
491             psEnc->prev_decode_only_middle = psEnc->sStereo.mid_only_flags[ psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded - 1 ];
492 
493             /* Insert VAD and FEC flags at beginning of bitstream */
494             if( *nBytesOut > 0 && psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded == psEnc->state_Fxx[ 0 ].sCmn.nFramesPerPacket) {
495                 flags = 0;
496                 for( n = 0; n < encControl->nChannelsInternal; n++ ) {
497                     for( i = 0; i < psEnc->state_Fxx[ n ].sCmn.nFramesPerPacket; i++ ) {
498                         flags  = silk_LSHIFT( flags, 1 );
499                         flags |= psEnc->state_Fxx[ n ].sCmn.VAD_flags[ i ];
500                     }
501                     flags  = silk_LSHIFT( flags, 1 );
502                     flags |= psEnc->state_Fxx[ n ].sCmn.LBRR_flag;
503                 }
504                 if( !prefillFlag ) {
505                     ec_enc_patch_initial_bits( psRangeEnc, flags, ( psEnc->state_Fxx[ 0 ].sCmn.nFramesPerPacket + 1 ) * encControl->nChannelsInternal );
506                 }
507 
508                 /* Return zero bytes if all channels DTXed */
509                 if( psEnc->state_Fxx[ 0 ].sCmn.inDTX && ( encControl->nChannelsInternal == 1 || psEnc->state_Fxx[ 1 ].sCmn.inDTX ) ) {
510                     *nBytesOut = 0;
511                 }
512 
513                 psEnc->nBitsExceeded += *nBytesOut * 8;
514                 psEnc->nBitsExceeded -= silk_DIV32_16( silk_MUL( encControl->bitRate, encControl->payloadSize_ms ), 1000 );
515                 psEnc->nBitsExceeded  = silk_LIMIT( psEnc->nBitsExceeded, 0, 10000 );
516 
517                 /* Update flag indicating if bandwidth switching is allowed */
518                 speech_act_thr_for_switch_Q8 = silk_SMLAWB( SILK_FIX_CONST( SPEECH_ACTIVITY_DTX_THRES, 8 ),
519                     SILK_FIX_CONST( ( 1 - SPEECH_ACTIVITY_DTX_THRES ) / MAX_BANDWIDTH_SWITCH_DELAY_MS, 16 + 8 ), psEnc->timeSinceSwitchAllowed_ms );
520                 if( psEnc->state_Fxx[ 0 ].sCmn.speech_activity_Q8 < speech_act_thr_for_switch_Q8 ) {
521                     psEnc->allowBandwidthSwitch = 1;
522                     psEnc->timeSinceSwitchAllowed_ms = 0;
523                 } else {
524                     psEnc->allowBandwidthSwitch = 0;
525                     psEnc->timeSinceSwitchAllowed_ms += encControl->payloadSize_ms;
526                 }
527             }
528 
529             if( nSamplesIn == 0 ) {
530                 break;
531             }
532         } else {
533             break;
534         }
535         curr_block++;
536     }
537 
538     psEnc->nPrevChannelsInternal = encControl->nChannelsInternal;
539 
540     encControl->allowBandwidthSwitch = psEnc->allowBandwidthSwitch;
541     encControl->inWBmodeWithoutVariableLP = psEnc->state_Fxx[ 0 ].sCmn.fs_kHz == 16 && psEnc->state_Fxx[ 0 ].sCmn.sLP.mode == 0;
542     encControl->internalSampleRate = silk_SMULBB( psEnc->state_Fxx[ 0 ].sCmn.fs_kHz, 1000 );
543     encControl->stereoWidth_Q14 = encControl->toMono ? 0 : psEnc->sStereo.smth_width_Q14;
544     if( prefillFlag ) {
545         encControl->payloadSize_ms = tmp_payloadSize_ms;
546         encControl->complexity = tmp_complexity;
547         for( n = 0; n < encControl->nChannelsInternal; n++ ) {
548             psEnc->state_Fxx[ n ].sCmn.controlled_since_last_payload = 0;
549             psEnc->state_Fxx[ n ].sCmn.prefillFlag = 0;
550         }
551     }
552 
553     RESTORE_STACK;
554     return ret;
555 }
556 
557