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