Coverage Report

Created: 2026-09-03 08:13

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