Coverage Report

Created: 2025-11-16 07:20

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/opus/silk/dec_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 "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
55.0k
{
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
55.0k
    (void) decState;
74
55.0k
    (void) data;
75
55.0k
    (void) len;
76
55.0k
    return SILK_NO_ERROR;
77
55.0k
#endif
78
55.0k
}
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.56M
{
84
1.56M
    opus_int ret = SILK_NO_ERROR;
85
86
1.56M
    *decSizeBytes = sizeof( silk_decoder );
87
88
1.56M
    return ret;
89
1.56M
}
90
91
/* Reset decoder state */
92
opus_int silk_ResetDecoder(                              /* O    Returns error code                              */
93
    void                            *decState           /* I/O  State                                           */
94
)
95
2.07M
{
96
2.07M
    opus_int n, ret = SILK_NO_ERROR;
97
2.07M
    silk_decoder_state *channel_state = ((silk_decoder *)decState)->channel_state;
98
99
6.21M
    for( n = 0; n < DECODER_NUM_CHANNELS; n++ ) {
100
4.14M
        ret  = silk_reset_decoder( &channel_state[ n ] );
101
4.14M
    }
102
2.07M
    silk_memset(&((silk_decoder *)decState)->sStereo, 0, sizeof(((silk_decoder *)decState)->sStereo));
103
    /* Not strictly needed, but it's cleaner that way */
104
2.07M
    ((silk_decoder *)decState)->prev_decode_only_middle = 0;
105
106
2.07M
    return ret;
107
2.07M
}
108
109
110
opus_int silk_InitDecoder(                              /* O    Returns error code                              */
111
    void                            *decState           /* I/O  State                                           */
112
)
113
55.0k
{
114
55.0k
    opus_int n, ret = SILK_NO_ERROR;
115
55.0k
    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
55.0k
#ifndef USE_WEIGHTS_FILE
120
    /* load osce models */
121
55.0k
    silk_LoadOSCEModels(decState, NULL, 0);
122
55.0k
#endif
123
124
165k
    for( n = 0; n < DECODER_NUM_CHANNELS; n++ ) {
125
110k
        ret  = silk_init_decoder( &channel_state[ n ] );
126
110k
    }
127
55.0k
    silk_memset(&((silk_decoder *)decState)->sStereo, 0, sizeof(((silk_decoder *)decState)->sStereo));
128
    /* Not strictly needed, but it's cleaner that way */
129
55.0k
    ((silk_decoder *)decState)->prev_decode_only_middle = 0;
130
131
55.0k
    return ret;
132
55.0k
}
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
282k
{
149
282k
    opus_int   i, n, decode_only_middle = 0, ret = SILK_NO_ERROR;
150
282k
    opus_int32 nSamplesOutDec, LBRR_symbol;
151
282k
    opus_int16 *samplesOut1_tmp[ 2 ];
152
282k
    VARDECL( opus_int16, samplesOut1_tmp_storage1 );
153
282k
    VARDECL( opus_int16, samplesOut2_tmp );
154
282k
    opus_int32 MS_pred_Q13[ 2 ] = { 0 };
155
282k
    opus_int16 *resample_out_ptr;
156
282k
    silk_decoder *psDec = ( silk_decoder * )decState;
157
282k
    silk_decoder_state *channel_state = psDec->channel_state;
158
282k
    opus_int has_side;
159
282k
    opus_int stereo_to_mono;
160
#ifdef ENABLE_OSCE_BWE
161
    ALLOC(resamp_buffer, 3 * MAX_FRAME_LENGTH, opus_int16);
162
#endif
163
282k
    SAVE_STACK;
164
165
282k
    celt_assert( decControl->nChannelsInternal == 1 || decControl->nChannelsInternal == 2 );
166
167
    /**********************************/
168
    /* Test if first frame in payload */
169
    /**********************************/
170
282k
    if( newPacketFlag ) {
171
567k
        for( n = 0; n < decControl->nChannelsInternal; n++ ) {
172
314k
            channel_state[ n ].nFramesDecoded = 0;  /* Used to count frames in packet */
173
314k
        }
174
253k
    }
175
176
    /* If Mono -> Stereo transition in bitstream: init state of second channel */
177
282k
    if( decControl->nChannelsInternal > psDec->nChannelsInternal ) {
178
7.28k
        ret += silk_init_decoder( &channel_state[ 1 ] );
179
7.28k
    }
180
181
282k
    stereo_to_mono = decControl->nChannelsInternal == 1 && psDec->nChannelsInternal == 2 &&
182
3.88k
                     ( decControl->internalSampleRate == 1000*channel_state[ 0 ].fs_kHz );
183
184
282k
    if( channel_state[ 0 ].nFramesDecoded == 0 ) {
185
567k
        for( n = 0; n < decControl->nChannelsInternal; n++ ) {
186
314k
            opus_int fs_kHz_dec;
187
314k
            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
314k
            } else if( decControl->payloadSize_ms == 10 ) {
192
206k
                channel_state[ n ].nFramesPerPacket = 1;
193
206k
                channel_state[ n ].nb_subfr = 2;
194
206k
            } else if( decControl->payloadSize_ms == 20 ) {
195
62.0k
                channel_state[ n ].nFramesPerPacket = 1;
196
62.0k
                channel_state[ n ].nb_subfr = 4;
197
62.0k
            } else if( decControl->payloadSize_ms == 40 ) {
198
36.1k
                channel_state[ n ].nFramesPerPacket = 2;
199
36.1k
                channel_state[ n ].nb_subfr = 4;
200
36.1k
            } else if( decControl->payloadSize_ms == 60 ) {
201
8.94k
                channel_state[ n ].nFramesPerPacket = 3;
202
8.94k
                channel_state[ n ].nb_subfr = 4;
203
8.94k
            } else {
204
0
                celt_assert( 0 );
205
0
                RESTORE_STACK;
206
0
                return SILK_DEC_INVALID_FRAME_SIZE;
207
0
            }
208
314k
            fs_kHz_dec = ( decControl->internalSampleRate >> 10 ) + 1;
209
314k
            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
314k
            ret += silk_decoder_set_fs( &channel_state[ n ], fs_kHz_dec, decControl->API_sampleRate );
215
314k
        }
216
253k
    }
217
218
282k
    if( decControl->nChannelsAPI == 2 && decControl->nChannelsInternal == 2 && ( psDec->nChannelsAPI == 1 || psDec->nChannelsInternal == 1 ) ) {
219
3.63k
        silk_memset( psDec->sStereo.pred_prev_Q13, 0, sizeof( psDec->sStereo.pred_prev_Q13 ) );
220
3.63k
        silk_memset( psDec->sStereo.sSide, 0, sizeof( psDec->sStereo.sSide ) );
221
3.63k
        silk_memcpy( &channel_state[ 1 ].resampler_state, &channel_state[ 0 ].resampler_state, sizeof( silk_resampler_state_struct ) );
222
3.63k
    }
223
282k
    psDec->nChannelsAPI      = decControl->nChannelsAPI;
224
282k
    psDec->nChannelsInternal = decControl->nChannelsInternal;
225
226
282k
    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
282k
    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
268k
        for( n = 0; n < decControl->nChannelsInternal; n++ ) {
236
353k
            for( i = 0; i < channel_state[ n ].nFramesPerPacket; i++ ) {
237
203k
                channel_state[ n ].VAD_flags[ i ] = ec_dec_bit_logp(psRangeDec, 1);
238
203k
            }
239
149k
            channel_state[ n ].LBRR_flag = ec_dec_bit_logp(psRangeDec, 1);
240
149k
        }
241
        /* Decode LBRR flags */
242
268k
        for( n = 0; n < decControl->nChannelsInternal; n++ ) {
243
149k
            silk_memset( channel_state[ n ].LBRR_flags, 0, sizeof( channel_state[ n ].LBRR_flags ) );
244
149k
            if( channel_state[ n ].LBRR_flag ) {
245
60.7k
                if( channel_state[ n ].nFramesPerPacket == 1 ) {
246
43.3k
                    channel_state[ n ].LBRR_flags[ 0 ] = 1;
247
43.3k
                } else {
248
17.4k
                    LBRR_symbol = ec_dec_icdf( psRangeDec, silk_LBRR_flags_iCDF_ptr[ channel_state[ n ].nFramesPerPacket - 2 ], 8 ) + 1;
249
56.9k
                    for( i = 0; i < channel_state[ n ].nFramesPerPacket; i++ ) {
250
39.5k
                        channel_state[ n ].LBRR_flags[ i ] = silk_RSHIFT( LBRR_symbol, i ) & 1;
251
39.5k
                    }
252
17.4k
                }
253
60.7k
            }
254
149k
        }
255
256
119k
        if( lostFlag == FLAG_DECODE_NORMAL ) {
257
            /* Regular decoding: skip all LBRR data */
258
267k
            for( i = 0; i < channel_state[ 0 ].nFramesPerPacket; i++ ) {
259
352k
                for( n = 0; n < decControl->nChannelsInternal; n++ ) {
260
203k
                    if( channel_state[ n ].LBRR_flags[ i ] ) {
261
71.8k
                        opus_int16 pulses[ MAX_FRAME_LENGTH ];
262
71.8k
                        opus_int condCoding;
263
264
71.8k
                        if( decControl->nChannelsInternal == 2 && n == 0 ) {
265
15.8k
                            silk_stereo_decode_pred( psRangeDec, MS_pred_Q13 );
266
15.8k
                            if( channel_state[ 1 ].LBRR_flags[ i ] == 0 ) {
267
5.01k
                                silk_stereo_decode_mid_only( psRangeDec, &decode_only_middle );
268
5.01k
                            }
269
15.8k
                        }
270
                        /* Use conditional coding if previous frame available */
271
71.8k
                        if( i > 0 && channel_state[ n ].LBRR_flags[ i - 1 ] ) {
272
11.0k
                            condCoding = CODE_CONDITIONALLY;
273
60.8k
                        } else {
274
60.8k
                            condCoding = CODE_INDEPENDENTLY;
275
60.8k
                        }
276
71.8k
                        silk_decode_indices( &channel_state[ n ], psRangeDec, i, 1, condCoding );
277
71.8k
                        silk_decode_pulses( psRangeDec, pulses, channel_state[ n ].indices.signalType,
278
71.8k
                            channel_state[ n ].indices.quantOffsetType, channel_state[ n ].frame_length );
279
71.8k
                    }
280
203k
                }
281
148k
            }
282
119k
        }
283
119k
    }
284
285
    /* Get MS predictor index */
286
282k
    if( decControl->nChannelsInternal == 2 ) {
287
85.6k
        if(   lostFlag == FLAG_DECODE_NORMAL ||
288
30.5k
            ( lostFlag == FLAG_DECODE_LBRR && channel_state[ 0 ].LBRR_flags[ channel_state[ 0 ].nFramesDecoded ] == 1 ) )
289
55.1k
        {
290
55.1k
            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
55.1k
            if( ( lostFlag == FLAG_DECODE_NORMAL && channel_state[ 1 ].VAD_flags[ channel_state[ 0 ].nFramesDecoded ] == 0 ) ||
293
17.4k
                ( lostFlag == FLAG_DECODE_LBRR && channel_state[ 1 ].LBRR_flags[ channel_state[ 0 ].nFramesDecoded ] == 0 ) )
294
37.7k
            {
295
37.7k
                silk_stereo_decode_mid_only( psRangeDec, &decode_only_middle );
296
37.7k
            } else {
297
17.4k
                decode_only_middle = 0;
298
17.4k
            }
299
55.1k
        } else {
300
91.6k
            for( n = 0; n < 2; n++ ) {
301
61.1k
                MS_pred_Q13[ n ] = psDec->sStereo.pred_prev_Q13[ n ];
302
61.1k
            }
303
30.5k
        }
304
85.6k
    }
305
306
    /* Reset side channel decoder prediction memory for first frame with side coding */
307
282k
    if( decControl->nChannelsInternal == 2 && decode_only_middle == 0 && psDec->prev_decode_only_middle == 1 ) {
308
8.80k
        silk_memset( psDec->channel_state[ 1 ].outBuf, 0, sizeof(psDec->channel_state[ 1 ].outBuf) );
309
8.80k
        silk_memset( psDec->channel_state[ 1 ].sLPC_Q14_buf, 0, sizeof(psDec->channel_state[ 1 ].sLPC_Q14_buf) );
310
8.80k
        psDec->channel_state[ 1 ].lagPrev        = 100;
311
8.80k
        psDec->channel_state[ 1 ].LastGainIndex  = 10;
312
8.80k
        psDec->channel_state[ 1 ].prevSignalType = TYPE_NO_VOICE_ACTIVITY;
313
8.80k
        psDec->channel_state[ 1 ].first_frame_after_reset = 1;
314
8.80k
    }
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
282k
    ALLOC( samplesOut1_tmp_storage1, decControl->nChannelsInternal*(channel_state[ 0 ].frame_length + 2 ),
320
282k
           opus_int16 );
321
282k
    samplesOut1_tmp[ 0 ] = samplesOut1_tmp_storage1;
322
282k
    samplesOut1_tmp[ 1 ] = samplesOut1_tmp_storage1 + channel_state[ 0 ].frame_length + 2;
323
324
282k
    if( lostFlag == FLAG_DECODE_NORMAL ) {
325
148k
        has_side = !decode_only_middle;
326
148k
    } else {
327
133k
        has_side = !psDec->prev_decode_only_middle
328
3.90k
              || (decControl->nChannelsInternal == 2 && lostFlag == FLAG_DECODE_LBRR && channel_state[1].LBRR_flags[ channel_state[1].nFramesDecoded ] == 1 );
329
133k
    }
330
282k
    channel_state[ 0 ].sPLC.enable_deep_plc = decControl->enable_deep_plc;
331
    /* Call decoder for one frame */
332
650k
    for( n = 0; n < decControl->nChannelsInternal; n++ ) {
333
368k
        if( n == 0 || has_side ) {
334
356k
            opus_int FrameIndex;
335
356k
            opus_int condCoding;
336
337
356k
            FrameIndex = channel_state[ 0 ].nFramesDecoded - n;
338
            /* Use independent coding if no previous frame available */
339
356k
            if( FrameIndex <= 0 ) {
340
305k
                condCoding = CODE_INDEPENDENTLY;
341
305k
            } else if( lostFlag == FLAG_DECODE_LBRR ) {
342
0
                condCoding = channel_state[ n ].LBRR_flags[ FrameIndex - 1 ] ? CODE_CONDITIONALLY : CODE_INDEPENDENTLY;
343
50.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.65k
                condCoding = CODE_INDEPENDENTLY_NO_LTP_SCALING;
347
47.9k
            } else {
348
47.9k
                condCoding = CODE_CONDITIONALLY;
349
47.9k
            }
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
356k
            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
356k
                arch);
363
356k
        } else {
364
11.7k
            silk_memset( &samplesOut1_tmp[ n ][ 2 ], 0, nSamplesOutDec * sizeof( opus_int16 ) );
365
11.7k
        }
366
368k
        channel_state[ n ].nFramesDecoded++;
367
368k
    }
368
369
282k
    if( decControl->nChannelsAPI == 2 && decControl->nChannelsInternal == 2 ) {
370
        /* Convert Mid/Side to Left/Right */
371
80.2k
        silk_stereo_MS_to_LR( &psDec->sStereo, samplesOut1_tmp[ 0 ], samplesOut1_tmp[ 1 ], MS_pred_Q13, channel_state[ 0 ].fs_kHz, nSamplesOutDec );
372
202k
    } else {
373
        /* Buffering */
374
202k
        silk_memcpy( samplesOut1_tmp[ 0 ], psDec->sStereo.sMid, 2 * sizeof( opus_int16 ) );
375
202k
        silk_memcpy( psDec->sStereo.sMid, &samplesOut1_tmp[ 0 ][ nSamplesOutDec ], 2 * sizeof( opus_int16 ) );
376
202k
    }
377
378
    /* Number of output samples */
379
282k
    *nSamplesOut = silk_DIV32( nSamplesOutDec * decControl->API_sampleRate, silk_SMULBB( channel_state[ 0 ].fs_kHz, 1000 ) );
380
381
    /* Set up pointers to temp buffers */
382
282k
    ALLOC( samplesOut2_tmp, *nSamplesOut, opus_int16 );
383
282k
    resample_out_ptr = samplesOut2_tmp;
384
385
645k
    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
362k
        ret += silk_resampler( &channel_state[ n ].resampler_state, resample_out_ptr, &samplesOut1_tmp[ n ][ 1 ], nSamplesOutDec );
418
362k
#endif
419
        /* Interleave if stereo output and stereo stream */
420
362k
        if( decControl->nChannelsAPI == 2 ) {
421
239M
            for( i = 0; i < *nSamplesOut; i++ ) {
422
239M
                samplesOut[ n + 2 * i ] = INT16TORES(resample_out_ptr[ i ]);
423
239M
            }
424
347k
        } else {
425
10.3M
            for( i = 0; i < *nSamplesOut; i++ ) {
426
10.3M
                samplesOut[ i ] = INT16TORES(resample_out_ptr[ i ]);
427
10.3M
            }
428
14.9k
        }
429
362k
    }
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
282k
    if( decControl->nChannelsAPI == 2 && decControl->nChannelsInternal == 1 ) {
437
187k
        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.13k
            ret += silk_resampler( &channel_state[ 1 ].resampler_state, resample_out_ptr, &samplesOut1_tmp[ 0 ][ 1 ], nSamplesOutDec );
441
442
872k
            for( i = 0; i < *nSamplesOut; i++ ) {
443
871k
                samplesOut[ 1 + 2 * i ] = INT16TORES(resample_out_ptr[ i ]);
444
871k
            }
445
186k
        } else {
446
103M
            for( i = 0; i < *nSamplesOut; i++ ) {
447
102M
                samplesOut[ 1 + 2 * i ] = samplesOut[ 0 + 2 * i ];
448
102M
            }
449
186k
        }
450
187k
    }
451
452
    /* Export pitch lag, measured at 48 kHz sampling rate */
453
282k
    if( channel_state[ 0 ].prevSignalType == TYPE_VOICED ) {
454
35.3k
        int mult_tab[ 3 ] = { 6, 4, 3 };
455
35.3k
        decControl->prevPitchLag = channel_state[ 0 ].lagPrev * mult_tab[ ( channel_state[ 0 ].fs_kHz - 8 ) >> 2 ];
456
247k
    } else {
457
247k
        decControl->prevPitchLag = 0;
458
247k
    }
459
460
282k
    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
298k
       for ( i = 0; i < psDec->nChannelsInternal; i++ )
464
164k
          psDec->channel_state[ i ].LastGainIndex = 10;
465
148k
    } else {
466
148k
       psDec->prev_decode_only_middle = decode_only_middle;
467
148k
    }
468
282k
    RESTORE_STACK;
469
282k
    return ret;
470
282k
}
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