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