Coverage Report

Created: 2025-08-28 07:12

/src/opus/silk/dec_API.c
Line
Count
Source (jump to first uncovered line)
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 "API.h"
32
#include "main.h"
33
#include "stack_alloc.h"
34
#include "os_support.h"
35
36
#ifdef ENABLE_OSCE
37
#include "osce.h"
38
#include "osce_structs.h"
39
#ifdef ENABLE_OSCE_BWE
40
#include "osce_features.h"
41
#endif
42
#endif
43
44
/************************/
45
/* Decoder Super Struct */
46
/************************/
47
typedef struct {
48
    silk_decoder_state          channel_state[ DECODER_NUM_CHANNELS ];
49
    stereo_dec_state                sStereo;
50
    opus_int                         nChannelsAPI;
51
    opus_int                         nChannelsInternal;
52
    opus_int                         prev_decode_only_middle;
53
#ifdef ENABLE_OSCE
54
    OSCEModel                        osce_model;
55
#endif
56
} silk_decoder;
57
58
/*********************/
59
/* Decoder functions */
60
/*********************/
61
62
63
64
opus_int silk_LoadOSCEModels(void *decState, const unsigned char *data, int len)
65
59.7k
{
66
#ifdef ENABLE_OSCE
67
    opus_int ret = SILK_NO_ERROR;
68
69
    ret = osce_load_models(&((silk_decoder *)decState)->osce_model, data, len);
70
    ((silk_decoder *)decState)->osce_model.loaded = (ret == 0);
71
    return ret;
72
#else
73
59.7k
    (void) decState;
74
59.7k
    (void) data;
75
59.7k
    (void) len;
76
59.7k
    return SILK_NO_ERROR;
77
59.7k
#endif
78
59.7k
}
79
80
opus_int silk_Get_Decoder_Size(                         /* O    Returns error code                              */
81
    opus_int                        *decSizeBytes       /* O    Number of bytes in SILK decoder state           */
82
)
83
1.99M
{
84
1.99M
    opus_int ret = SILK_NO_ERROR;
85
86
1.99M
    *decSizeBytes = sizeof( silk_decoder );
87
88
1.99M
    return ret;
89
1.99M
}
90
91
/* Reset decoder state */
92
opus_int silk_ResetDecoder(                              /* O    Returns error code                              */
93
    void                            *decState           /* I/O  State                                           */
94
)
95
3.19M
{
96
3.19M
    opus_int n, ret = SILK_NO_ERROR;
97
3.19M
    silk_decoder_state *channel_state = ((silk_decoder *)decState)->channel_state;
98
99
9.59M
    for( n = 0; n < DECODER_NUM_CHANNELS; n++ ) {
100
6.39M
        ret  = silk_reset_decoder( &channel_state[ n ] );
101
6.39M
    }
102
3.19M
    silk_memset(&((silk_decoder *)decState)->sStereo, 0, sizeof(((silk_decoder *)decState)->sStereo));
103
    /* Not strictly needed, but it's cleaner that way */
104
3.19M
    ((silk_decoder *)decState)->prev_decode_only_middle = 0;
105
106
3.19M
    return ret;
107
3.19M
}
108
109
110
opus_int silk_InitDecoder(                              /* O    Returns error code                              */
111
    void                            *decState           /* I/O  State                                           */
112
)
113
59.7k
{
114
59.7k
    opus_int n, ret = SILK_NO_ERROR;
115
59.7k
    silk_decoder_state *channel_state = ((silk_decoder *)decState)->channel_state;
116
#ifdef ENABLE_OSCE
117
    ((silk_decoder *)decState)->osce_model.loaded = 0;
118
#endif
119
59.7k
#ifndef USE_WEIGHTS_FILE
120
    /* load osce models */
121
59.7k
    silk_LoadOSCEModels(decState, NULL, 0);
122
59.7k
#endif
123
124
179k
    for( n = 0; n < DECODER_NUM_CHANNELS; n++ ) {
125
119k
        ret  = silk_init_decoder( &channel_state[ n ] );
126
119k
    }
127
59.7k
    silk_memset(&((silk_decoder *)decState)->sStereo, 0, sizeof(((silk_decoder *)decState)->sStereo));
128
    /* Not strictly needed, but it's cleaner that way */
129
59.7k
    ((silk_decoder *)decState)->prev_decode_only_middle = 0;
130
131
59.7k
    return ret;
132
59.7k
}
133
134
/* Decode a frame */
135
opus_int silk_Decode(                                   /* O    Returns error code                              */
136
    void*                           decState,           /* I/O  State                                           */
137
    silk_DecControlStruct*          decControl,         /* I/O  Control Structure                               */
138
    opus_int                        lostFlag,           /* I    0: no loss, 1 loss, 2 decode fec                */
139
    opus_int                        newPacketFlag,      /* I    Indicates first decoder call for this packet    */
140
    ec_dec                          *psRangeDec,        /* I/O  Compressor data structure                       */
141
    opus_res                        *samplesOut,        /* O    Decoded output speech vector                    */
142
    opus_int32                      *nSamplesOut,       /* O    Number of samples decoded                       */
143
#ifdef ENABLE_DEEP_PLC
144
    LPCNetPLCState                  *lpcnet,
145
#endif
146
    int                             arch                /* I    Run-time architecture                           */
147
)
148
334k
{
149
334k
    opus_int   i, n, decode_only_middle = 0, ret = SILK_NO_ERROR;
150
334k
    opus_int32 nSamplesOutDec, LBRR_symbol;
151
334k
    opus_int16 *samplesOut1_tmp[ 2 ];
152
334k
    VARDECL( opus_int16, samplesOut1_tmp_storage1 );
153
334k
    VARDECL( opus_int16, samplesOut2_tmp );
154
334k
    opus_int32 MS_pred_Q13[ 2 ] = { 0 };
155
334k
    opus_int16 *resample_out_ptr;
156
334k
    silk_decoder *psDec = ( silk_decoder * )decState;
157
334k
    silk_decoder_state *channel_state = psDec->channel_state;
158
334k
    opus_int has_side;
159
334k
    opus_int stereo_to_mono;
160
#ifdef ENABLE_OSCE_BWE
161
    ALLOC(resamp_buffer, 3 * MAX_FRAME_LENGTH, opus_int16);
162
#endif
163
334k
    SAVE_STACK;
164
165
334k
    celt_assert( decControl->nChannelsInternal == 1 || decControl->nChannelsInternal == 2 );
166
167
    /**********************************/
168
    /* Test if first frame in payload */
169
    /**********************************/
170
334k
    if( newPacketFlag ) {
171
662k
        for( n = 0; n < decControl->nChannelsInternal; n++ ) {
172
365k
            channel_state[ n ].nFramesDecoded = 0;  /* Used to count frames in packet */
173
365k
        }
174
297k
    }
175
176
    /* If Mono -> Stereo transition in bitstream: init state of second channel */
177
334k
    if( decControl->nChannelsInternal > psDec->nChannelsInternal ) {
178
8.76k
        ret += silk_init_decoder( &channel_state[ 1 ] );
179
8.76k
    }
180
181
334k
    stereo_to_mono = decControl->nChannelsInternal == 1 && psDec->nChannelsInternal == 2 &&
182
334k
                     ( decControl->internalSampleRate == 1000*channel_state[ 0 ].fs_kHz );
183
184
334k
    if( channel_state[ 0 ].nFramesDecoded == 0 ) {
185
662k
        for( n = 0; n < decControl->nChannelsInternal; n++ ) {
186
365k
            opus_int fs_kHz_dec;
187
365k
            if( decControl->payloadSize_ms == 0 ) {
188
                /* Assuming packet loss, use 10 ms */
189
0
                channel_state[ n ].nFramesPerPacket = 1;
190
0
                channel_state[ n ].nb_subfr = 2;
191
365k
            } else if( decControl->payloadSize_ms == 10 ) {
192
235k
                channel_state[ n ].nFramesPerPacket = 1;
193
235k
                channel_state[ n ].nb_subfr = 2;
194
235k
            } else if( decControl->payloadSize_ms == 20 ) {
195
75.0k
                channel_state[ n ].nFramesPerPacket = 1;
196
75.0k
                channel_state[ n ].nb_subfr = 4;
197
75.0k
            } else if( decControl->payloadSize_ms == 40 ) {
198
41.0k
                channel_state[ n ].nFramesPerPacket = 2;
199
41.0k
                channel_state[ n ].nb_subfr = 4;
200
41.0k
            } else if( decControl->payloadSize_ms == 60 ) {
201
13.4k
                channel_state[ n ].nFramesPerPacket = 3;
202
13.4k
                channel_state[ n ].nb_subfr = 4;
203
13.4k
            } else {
204
0
                celt_assert( 0 );
205
0
                RESTORE_STACK;
206
0
                return SILK_DEC_INVALID_FRAME_SIZE;
207
0
            }
208
365k
            fs_kHz_dec = ( decControl->internalSampleRate >> 10 ) + 1;
209
365k
            if( fs_kHz_dec != 8 && fs_kHz_dec != 12 && fs_kHz_dec != 16 ) {
210
0
                celt_assert( 0 );
211
0
                RESTORE_STACK;
212
0
                return SILK_DEC_INVALID_SAMPLING_FREQUENCY;
213
0
            }
214
365k
            ret += silk_decoder_set_fs( &channel_state[ n ], fs_kHz_dec, decControl->API_sampleRate );
215
365k
        }
216
297k
    }
217
218
334k
    if( decControl->nChannelsAPI == 2 && decControl->nChannelsInternal == 2 && ( psDec->nChannelsAPI == 1 || psDec->nChannelsInternal == 1 ) ) {
219
5.12k
        silk_memset( psDec->sStereo.pred_prev_Q13, 0, sizeof( psDec->sStereo.pred_prev_Q13 ) );
220
5.12k
        silk_memset( psDec->sStereo.sSide, 0, sizeof( psDec->sStereo.sSide ) );
221
5.12k
        silk_memcpy( &channel_state[ 1 ].resampler_state, &channel_state[ 0 ].resampler_state, sizeof( silk_resampler_state_struct ) );
222
5.12k
    }
223
334k
    psDec->nChannelsAPI      = decControl->nChannelsAPI;
224
334k
    psDec->nChannelsInternal = decControl->nChannelsInternal;
225
226
334k
    if( decControl->API_sampleRate > (opus_int32)MAX_API_FS_KHZ * 1000 || decControl->API_sampleRate < 8000 ) {
227
0
        ret = SILK_DEC_INVALID_SAMPLING_FREQUENCY;
228
0
        RESTORE_STACK;
229
0
        return( ret );
230
0
    }
231
232
334k
    if( lostFlag != FLAG_PACKET_LOST && channel_state[ 0 ].nFramesDecoded == 0 ) {
233
        /* First decoder call for this payload */
234
        /* Decode VAD flags and LBRR flag */
235
304k
        for( n = 0; n < decControl->nChannelsInternal; n++ ) {
236
407k
            for( i = 0; i < channel_state[ n ].nFramesPerPacket; i++ ) {
237
237k
                channel_state[ n ].VAD_flags[ i ] = ec_dec_bit_logp(psRangeDec, 1);
238
237k
            }
239
169k
            channel_state[ n ].LBRR_flag = ec_dec_bit_logp(psRangeDec, 1);
240
169k
        }
241
        /* Decode LBRR flags */
242
304k
        for( n = 0; n < decControl->nChannelsInternal; n++ ) {
243
169k
            silk_memset( channel_state[ n ].LBRR_flags, 0, sizeof( channel_state[ n ].LBRR_flags ) );
244
169k
            if( channel_state[ n ].LBRR_flag ) {
245
62.5k
                if( channel_state[ n ].nFramesPerPacket == 1 ) {
246
45.9k
                    channel_state[ n ].LBRR_flags[ 0 ] = 1;
247
45.9k
                } else {
248
16.5k
                    LBRR_symbol = ec_dec_icdf( psRangeDec, silk_LBRR_flags_iCDF_ptr[ channel_state[ n ].nFramesPerPacket - 2 ], 8 ) + 1;
249
56.3k
                    for( i = 0; i < channel_state[ n ].nFramesPerPacket; i++ ) {
250
39.7k
                        channel_state[ n ].LBRR_flags[ i ] = silk_RSHIFT( LBRR_symbol, i ) & 1;
251
39.7k
                    }
252
16.5k
                }
253
62.5k
            }
254
169k
        }
255
256
134k
        if( lostFlag == FLAG_DECODE_NORMAL ) {
257
            /* Regular decoding: skip all LBRR data */
258
306k
            for( i = 0; i < channel_state[ 0 ].nFramesPerPacket; i++ ) {
259
409k
                for( n = 0; n < decControl->nChannelsInternal; n++ ) {
260
237k
                    if( channel_state[ n ].LBRR_flags[ i ] ) {
261
73.2k
                        opus_int16 pulses[ MAX_FRAME_LENGTH ];
262
73.2k
                        opus_int condCoding;
263
264
73.2k
                        if( decControl->nChannelsInternal == 2 && n == 0 ) {
265
16.5k
                            silk_stereo_decode_pred( psRangeDec, MS_pred_Q13 );
266
16.5k
                            if( channel_state[ 1 ].LBRR_flags[ i ] == 0 ) {
267
6.90k
                                silk_stereo_decode_mid_only( psRangeDec, &decode_only_middle );
268
6.90k
                            }
269
16.5k
                        }
270
                        /* Use conditional coding if previous frame available */
271
73.2k
                        if( i > 0 && channel_state[ n ].LBRR_flags[ i - 1 ] ) {
272
10.5k
                            condCoding = CODE_CONDITIONALLY;
273
62.7k
                        } else {
274
62.7k
                            condCoding = CODE_INDEPENDENTLY;
275
62.7k
                        }
276
73.2k
                        silk_decode_indices( &channel_state[ n ], psRangeDec, i, 1, condCoding );
277
73.2k
                        silk_decode_pulses( psRangeDec, pulses, channel_state[ n ].indices.signalType,
278
73.2k
                            channel_state[ n ].indices.quantOffsetType, channel_state[ n ].frame_length );
279
73.2k
                    }
280
237k
                }
281
172k
            }
282
134k
        }
283
134k
    }
284
285
    /* Get MS predictor index */
286
334k
    if( decControl->nChannelsInternal == 2 ) {
287
98.7k
        if(   lostFlag == FLAG_DECODE_NORMAL ||
288
98.7k
            ( lostFlag == FLAG_DECODE_LBRR && channel_state[ 0 ].LBRR_flags[ channel_state[ 0 ].nFramesDecoded ] == 1 ) )
289
65.5k
        {
290
65.5k
            silk_stereo_decode_pred( psRangeDec, MS_pred_Q13 );
291
            /* For LBRR data, decode mid-only flag only if side-channel's LBRR flag is false */
292
65.5k
            if( ( lostFlag == FLAG_DECODE_NORMAL && channel_state[ 1 ].VAD_flags[ channel_state[ 0 ].nFramesDecoded ] == 0 ) ||
293
65.5k
                ( lostFlag == FLAG_DECODE_LBRR && channel_state[ 1 ].LBRR_flags[ channel_state[ 0 ].nFramesDecoded ] == 0 ) )
294
43.6k
            {
295
43.6k
                silk_stereo_decode_mid_only( psRangeDec, &decode_only_middle );
296
43.6k
            } else {
297
21.9k
                decode_only_middle = 0;
298
21.9k
            }
299
65.5k
        } else {
300
99.7k
            for( n = 0; n < 2; n++ ) {
301
66.4k
                MS_pred_Q13[ n ] = psDec->sStereo.pred_prev_Q13[ n ];
302
66.4k
            }
303
33.2k
        }
304
98.7k
    }
305
306
    /* Reset side channel decoder prediction memory for first frame with side coding */
307
334k
    if( decControl->nChannelsInternal == 2 && decode_only_middle == 0 && psDec->prev_decode_only_middle == 1 ) {
308
9.61k
        silk_memset( psDec->channel_state[ 1 ].outBuf, 0, sizeof(psDec->channel_state[ 1 ].outBuf) );
309
9.61k
        silk_memset( psDec->channel_state[ 1 ].sLPC_Q14_buf, 0, sizeof(psDec->channel_state[ 1 ].sLPC_Q14_buf) );
310
9.61k
        psDec->channel_state[ 1 ].lagPrev        = 100;
311
9.61k
        psDec->channel_state[ 1 ].LastGainIndex  = 10;
312
9.61k
        psDec->channel_state[ 1 ].prevSignalType = TYPE_NO_VOICE_ACTIVITY;
313
9.61k
        psDec->channel_state[ 1 ].first_frame_after_reset = 1;
314
9.61k
    }
315
316
    /* Check if the temp buffer fits into the output PCM buffer. If it fits,
317
       we can delay allocating the temp buffer until after the SILK peak stack
318
       usage. We need to use a < and not a <= because of the two extra samples. */
319
334k
    ALLOC( samplesOut1_tmp_storage1, decControl->nChannelsInternal*(channel_state[ 0 ].frame_length + 2 ),
320
334k
           opus_int16 );
321
334k
    samplesOut1_tmp[ 0 ] = samplesOut1_tmp_storage1;
322
334k
    samplesOut1_tmp[ 1 ] = samplesOut1_tmp_storage1 + channel_state[ 0 ].frame_length + 2;
323
324
334k
    if( lostFlag == FLAG_DECODE_NORMAL ) {
325
172k
        has_side = !decode_only_middle;
326
172k
    } else {
327
162k
        has_side = !psDec->prev_decode_only_middle
328
162k
              || (decControl->nChannelsInternal == 2 && lostFlag == FLAG_DECODE_LBRR && channel_state[1].LBRR_flags[ channel_state[1].nFramesDecoded ] == 1 );
329
162k
    }
330
334k
    channel_state[ 0 ].sPLC.enable_deep_plc = decControl->enable_deep_plc;
331
    /* Call decoder for one frame */
332
768k
    for( n = 0; n < decControl->nChannelsInternal; n++ ) {
333
433k
        if( n == 0 || has_side ) {
334
420k
            opus_int FrameIndex;
335
420k
            opus_int condCoding;
336
337
420k
            FrameIndex = channel_state[ 0 ].nFramesDecoded - n;
338
            /* Use independent coding if no previous frame available */
339
420k
            if( FrameIndex <= 0 ) {
340
357k
                condCoding = CODE_INDEPENDENTLY;
341
357k
            } else if( lostFlag == FLAG_DECODE_LBRR ) {
342
0
                condCoding = channel_state[ n ].LBRR_flags[ FrameIndex - 1 ] ? CODE_CONDITIONALLY : CODE_INDEPENDENTLY;
343
63.5k
            } else if( n > 0 && psDec->prev_decode_only_middle ) {
344
                /* If we skipped a side frame in this packet, we don't
345
                   need LTP scaling; the LTP state is well-defined. */
346
2.16k
                condCoding = CODE_INDEPENDENTLY_NO_LTP_SCALING;
347
61.4k
            } else {
348
61.4k
                condCoding = CODE_CONDITIONALLY;
349
61.4k
            }
350
#ifdef ENABLE_OSCE
351
            if ( channel_state[n].osce.method != decControl->osce_method ) {
352
                osce_reset( &channel_state[n].osce, decControl->osce_method );
353
            }
354
#endif
355
420k
            ret += silk_decode_frame( &channel_state[ n ], psRangeDec, &samplesOut1_tmp[ n ][ 2 ], &nSamplesOutDec, lostFlag, condCoding,
356
#ifdef ENABLE_DEEP_PLC
357
                n == 0 ? lpcnet : NULL,
358
#endif
359
#ifdef ENABLE_OSCE
360
                &psDec->osce_model,
361
#endif
362
420k
                arch);
363
420k
        } else {
364
12.8k
            silk_memset( &samplesOut1_tmp[ n ][ 2 ], 0, nSamplesOutDec * sizeof( opus_int16 ) );
365
12.8k
        }
366
433k
        channel_state[ n ].nFramesDecoded++;
367
433k
    }
368
369
334k
    if( decControl->nChannelsAPI == 2 && decControl->nChannelsInternal == 2 ) {
370
        /* Convert Mid/Side to Left/Right */
371
96.9k
        silk_stereo_MS_to_LR( &psDec->sStereo, samplesOut1_tmp[ 0 ], samplesOut1_tmp[ 1 ], MS_pred_Q13, channel_state[ 0 ].fs_kHz, nSamplesOutDec );
372
237k
    } else {
373
        /* Buffering */
374
237k
        silk_memcpy( samplesOut1_tmp[ 0 ], psDec->sStereo.sMid, 2 * sizeof( opus_int16 ) );
375
237k
        silk_memcpy( psDec->sStereo.sMid, &samplesOut1_tmp[ 0 ][ nSamplesOutDec ], 2 * sizeof( opus_int16 ) );
376
237k
    }
377
378
    /* Number of output samples */
379
334k
    *nSamplesOut = silk_DIV32( nSamplesOutDec * decControl->API_sampleRate, silk_SMULBB( channel_state[ 0 ].fs_kHz, 1000 ) );
380
381
    /* Set up pointers to temp buffers */
382
334k
    ALLOC( samplesOut2_tmp, *nSamplesOut, opus_int16 );
383
334k
    resample_out_ptr = samplesOut2_tmp;
384
385
766k
    for( n = 0; n < silk_min( decControl->nChannelsAPI, decControl->nChannelsInternal ); n++ ) {
386
387
#ifdef ENABLE_OSCE_BWE
388
        /* Resample or extend decoded signal to API_sampleRate */
389
        if (decControl->osce_extended_mode == OSCE_MODE_SILK_BBWE) {
390
            silk_assert(decControl->API_sampleRate == 48000);
391
392
            if (decControl->prev_osce_extended_mode != OSCE_MODE_SILK_BBWE) {
393
                /* Reset the BWE state */
394
                osce_bwe_reset( &channel_state[ n ].osce_bwe );
395
            }
396
397
            osce_bwe(&psDec->osce_model, &channel_state[ n ].osce_bwe,
398
                resample_out_ptr, &samplesOut1_tmp[ n ][ 1 ], nSamplesOutDec, arch);
399
400
            if (decControl->prev_osce_extended_mode == OSCE_MODE_SILK_ONLY ||
401
                decControl->prev_osce_extended_mode == OSCE_MODE_HYBRID) {
402
                    /* cross-fade with upsampled signal */
403
                    silk_resampler( &channel_state[ n ].resampler_state, resamp_buffer, &samplesOut1_tmp[ n ][ 1 ], nSamplesOutDec );
404
                    osce_bwe_cross_fade_10ms(resample_out_ptr, resamp_buffer, 480);
405
            }
406
        } else {
407
            ret += silk_resampler( &channel_state[ n ].resampler_state, resample_out_ptr, &samplesOut1_tmp[ n ][ 1 ], nSamplesOutDec );
408
            if (decControl->prev_osce_extended_mode == OSCE_MODE_SILK_BBWE) {
409
                osce_bwe(&psDec->osce_model, &channel_state[ n ].osce_bwe,
410
                    resamp_buffer, &samplesOut1_tmp[ n ][ 1 ], nSamplesOutDec, arch);
411
                /* cross-fade with upsampled signal */
412
                osce_bwe_cross_fade_10ms(resample_out_ptr, resamp_buffer, 480);
413
            }
414
        }
415
#else
416
        /* Resample decoded signal to API_sampleRate */
417
431k
        ret += silk_resampler( &channel_state[ n ].resampler_state, resample_out_ptr, &samplesOut1_tmp[ n ][ 1 ], nSamplesOutDec );
418
431k
#endif
419
        /* Interleave if stereo output and stereo stream */
420
431k
        if( decControl->nChannelsAPI == 2 ) {
421
286M
            for( i = 0; i < *nSamplesOut; i++ ) {
422
286M
                samplesOut[ n + 2 * i ] = INT16TORES(resample_out_ptr[ i ]);
423
286M
            }
424
406k
        } else {
425
15.1M
            for( i = 0; i < *nSamplesOut; i++ ) {
426
15.0M
                samplesOut[ i ] = INT16TORES(resample_out_ptr[ i ]);
427
15.0M
            }
428
25.2k
        }
429
431k
    }
430
431
#ifdef ENABLE_OSCE_BWE
432
    decControl->prev_osce_extended_mode = decControl->osce_extended_mode;
433
#endif
434
435
    /* Create two channel output from mono stream */
436
334k
    if( decControl->nChannelsAPI == 2 && decControl->nChannelsInternal == 1 ) {
437
212k
        if ( stereo_to_mono ){
438
            /* Resample right channel for newly collapsed stereo just in case
439
               we weren't doing collapsing when switching to mono */
440
1.03k
            ret += silk_resampler( &channel_state[ 1 ].resampler_state, resample_out_ptr, &samplesOut1_tmp[ 0 ][ 1 ], nSamplesOutDec );
441
442
768k
            for( i = 0; i < *nSamplesOut; i++ ) {
443
767k
                samplesOut[ 1 + 2 * i ] = INT16TORES(resample_out_ptr[ i ]);
444
767k
            }
445
211k
        } else {
446
120M
            for( i = 0; i < *nSamplesOut; i++ ) {
447
120M
                samplesOut[ 1 + 2 * i ] = samplesOut[ 0 + 2 * i ];
448
120M
            }
449
211k
        }
450
212k
    }
451
452
    /* Export pitch lag, measured at 48 kHz sampling rate */
453
334k
    if( channel_state[ 0 ].prevSignalType == TYPE_VOICED ) {
454
31.1k
        int mult_tab[ 3 ] = { 6, 4, 3 };
455
31.1k
        decControl->prevPitchLag = channel_state[ 0 ].lagPrev * mult_tab[ ( channel_state[ 0 ].fs_kHz - 8 ) >> 2 ];
456
303k
    } else {
457
303k
        decControl->prevPitchLag = 0;
458
303k
    }
459
460
334k
    if( lostFlag == FLAG_PACKET_LOST ) {
461
       /* On packet loss, remove the gain clamping to prevent having the energy "bounce back"
462
          if we lose packets when the energy is going down */
463
358k
       for ( i = 0; i < psDec->nChannelsInternal; i++ )
464
195k
          psDec->channel_state[ i ].LastGainIndex = 10;
465
172k
    } else {
466
172k
       psDec->prev_decode_only_middle = decode_only_middle;
467
172k
    }
468
334k
    RESTORE_STACK;
469
334k
    return ret;
470
334k
}
471
472
#if 0
473
/* Getting table of contents for a packet */
474
opus_int silk_get_TOC(
475
    const opus_uint8                *payload,           /* I    Payload data                                */
476
    const opus_int                  nBytesIn,           /* I    Number of input bytes                       */
477
    const opus_int                  nFramesPerPayload,  /* I    Number of SILK frames per payload           */
478
    silk_TOC_struct                 *Silk_TOC           /* O    Type of content                             */
479
)
480
{
481
    opus_int i, flags, ret = SILK_NO_ERROR;
482
483
    if( nBytesIn < 1 ) {
484
        return -1;
485
    }
486
    if( nFramesPerPayload < 0 || nFramesPerPayload > 3 ) {
487
        return -1;
488
    }
489
490
    silk_memset( Silk_TOC, 0, sizeof( *Silk_TOC ) );
491
492
    /* For stereo, extract the flags for the mid channel */
493
    flags = silk_RSHIFT( payload[ 0 ], 7 - nFramesPerPayload ) & ( silk_LSHIFT( 1, nFramesPerPayload + 1 ) - 1 );
494
495
    Silk_TOC->inbandFECFlag = flags & 1;
496
    for( i = nFramesPerPayload - 1; i >= 0 ; i-- ) {
497
        flags = silk_RSHIFT( flags, 1 );
498
        Silk_TOC->VADFlags[ i ] = flags & 1;
499
        Silk_TOC->VADFlag |= flags & 1;
500
    }
501
502
    return ret;
503
}
504
#endif