1/***********************************************************************
2Copyright (c) 2006-2011, Skype Limited. All rights reserved.
3Redistribution and use in source and binary forms, with or without
4modification, are permitted provided that the following conditions
5are met:
6- Redistributions of source code must retain the above copyright notice,
7this list of conditions and the following disclaimer.
8- Redistributions in binary form must reproduce the above copyright
9notice, this list of conditions and the following disclaimer in the
10documentation and/or other materials provided with the distribution.
11- Neither the name of Internet Society, IETF or IETF Trust, nor the
12names of specific contributors, may be used to endorse or promote
13products derived from this software without specific prior written
14permission.
15THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
19LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25POSSIBILITY OF SUCH DAMAGE.
26***********************************************************************/
27
28#ifdef HAVE_CONFIG_H
29#include "config.h"
30#endif
31#include "define.h"
32#include "API.h"
33#include "control.h"
34#include "typedef.h"
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/***************************************/
47static 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
56opus_int silk_Get_Encoder_Size(                         /* O    Returns error code                              */
57    opus_int                        *encSizeBytes       /* O    Number of bytes in SILK encoder state           */
58)
59{
60    opus_int ret = SILK_NO_ERROR;
61
62    *encSizeBytes = sizeof( silk_encoder );
63
64    return ret;
65}
66
67/*************************/
68/* Init or Reset encoder */
69/*************************/
70opus_int silk_InitEncoder(                              /* O    Returns error code                              */
71    void                            *encState,          /* I/O  State                                           */
72    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/***************************************/
103static 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                                                                         */
140opus_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