xref: /aosp_15_r20/external/libopus/silk/dec_API.c (revision a58d3d2adb790c104798cd88c8a3aff4fa8b82cc)
1*a58d3d2aSXin Li /***********************************************************************
2*a58d3d2aSXin Li Copyright (c) 2006-2011, Skype Limited. All rights reserved.
3*a58d3d2aSXin Li Redistribution and use in source and binary forms, with or without
4*a58d3d2aSXin Li modification, are permitted provided that the following conditions
5*a58d3d2aSXin Li are met:
6*a58d3d2aSXin Li - Redistributions of source code must retain the above copyright notice,
7*a58d3d2aSXin Li this list of conditions and the following disclaimer.
8*a58d3d2aSXin Li - Redistributions in binary form must reproduce the above copyright
9*a58d3d2aSXin Li notice, this list of conditions and the following disclaimer in the
10*a58d3d2aSXin Li documentation and/or other materials provided with the distribution.
11*a58d3d2aSXin Li - Neither the name of Internet Society, IETF or IETF Trust, nor the
12*a58d3d2aSXin Li names of specific contributors, may be used to endorse or promote
13*a58d3d2aSXin Li products derived from this software without specific prior written
14*a58d3d2aSXin Li permission.
15*a58d3d2aSXin Li THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16*a58d3d2aSXin Li AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17*a58d3d2aSXin Li IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18*a58d3d2aSXin Li ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
19*a58d3d2aSXin Li LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20*a58d3d2aSXin Li CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21*a58d3d2aSXin Li SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22*a58d3d2aSXin Li INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23*a58d3d2aSXin Li CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24*a58d3d2aSXin Li ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25*a58d3d2aSXin Li POSSIBILITY OF SUCH DAMAGE.
26*a58d3d2aSXin Li ***********************************************************************/
27*a58d3d2aSXin Li 
28*a58d3d2aSXin Li #ifdef HAVE_CONFIG_H
29*a58d3d2aSXin Li #include "config.h"
30*a58d3d2aSXin Li #endif
31*a58d3d2aSXin Li #include "API.h"
32*a58d3d2aSXin Li #include "main.h"
33*a58d3d2aSXin Li #include "stack_alloc.h"
34*a58d3d2aSXin Li #include "os_support.h"
35*a58d3d2aSXin Li 
36*a58d3d2aSXin Li #ifdef ENABLE_OSCE
37*a58d3d2aSXin Li #include "osce.h"
38*a58d3d2aSXin Li #include "osce_structs.h"
39*a58d3d2aSXin Li #endif
40*a58d3d2aSXin Li 
41*a58d3d2aSXin Li /************************/
42*a58d3d2aSXin Li /* Decoder Super Struct */
43*a58d3d2aSXin Li /************************/
44*a58d3d2aSXin Li typedef struct {
45*a58d3d2aSXin Li     silk_decoder_state          channel_state[ DECODER_NUM_CHANNELS ];
46*a58d3d2aSXin Li     stereo_dec_state                sStereo;
47*a58d3d2aSXin Li     opus_int                         nChannelsAPI;
48*a58d3d2aSXin Li     opus_int                         nChannelsInternal;
49*a58d3d2aSXin Li     opus_int                         prev_decode_only_middle;
50*a58d3d2aSXin Li #ifdef ENABLE_OSCE
51*a58d3d2aSXin Li     OSCEModel                        osce_model;
52*a58d3d2aSXin Li #endif
53*a58d3d2aSXin Li } silk_decoder;
54*a58d3d2aSXin Li 
55*a58d3d2aSXin Li /*********************/
56*a58d3d2aSXin Li /* Decoder functions */
57*a58d3d2aSXin Li /*********************/
58*a58d3d2aSXin Li 
59*a58d3d2aSXin Li 
60*a58d3d2aSXin Li 
silk_LoadOSCEModels(void * decState,const unsigned char * data,int len)61*a58d3d2aSXin Li opus_int silk_LoadOSCEModels(void *decState, const unsigned char *data, int len)
62*a58d3d2aSXin Li {
63*a58d3d2aSXin Li #ifdef ENABLE_OSCE
64*a58d3d2aSXin Li     opus_int ret = SILK_NO_ERROR;
65*a58d3d2aSXin Li 
66*a58d3d2aSXin Li     ret = osce_load_models(&((silk_decoder *)decState)->osce_model, data, len);
67*a58d3d2aSXin Li     ((silk_decoder *)decState)->osce_model.loaded = (ret == 0);
68*a58d3d2aSXin Li     return ret;
69*a58d3d2aSXin Li #else
70*a58d3d2aSXin Li     (void) decState;
71*a58d3d2aSXin Li     (void) data;
72*a58d3d2aSXin Li     (void) len;
73*a58d3d2aSXin Li     return SILK_NO_ERROR;
74*a58d3d2aSXin Li #endif
75*a58d3d2aSXin Li }
76*a58d3d2aSXin Li 
silk_Get_Decoder_Size(opus_int * decSizeBytes)77*a58d3d2aSXin Li opus_int silk_Get_Decoder_Size(                         /* O    Returns error code                              */
78*a58d3d2aSXin Li     opus_int                        *decSizeBytes       /* O    Number of bytes in SILK decoder state           */
79*a58d3d2aSXin Li )
80*a58d3d2aSXin Li {
81*a58d3d2aSXin Li     opus_int ret = SILK_NO_ERROR;
82*a58d3d2aSXin Li 
83*a58d3d2aSXin Li     *decSizeBytes = sizeof( silk_decoder );
84*a58d3d2aSXin Li 
85*a58d3d2aSXin Li     return ret;
86*a58d3d2aSXin Li }
87*a58d3d2aSXin Li 
88*a58d3d2aSXin Li /* Reset decoder state */
silk_ResetDecoder(void * decState)89*a58d3d2aSXin Li opus_int silk_ResetDecoder(                              /* O    Returns error code                              */
90*a58d3d2aSXin Li     void                            *decState           /* I/O  State                                           */
91*a58d3d2aSXin Li )
92*a58d3d2aSXin Li {
93*a58d3d2aSXin Li     opus_int n, ret = SILK_NO_ERROR;
94*a58d3d2aSXin Li     silk_decoder_state *channel_state = ((silk_decoder *)decState)->channel_state;
95*a58d3d2aSXin Li 
96*a58d3d2aSXin Li     for( n = 0; n < DECODER_NUM_CHANNELS; n++ ) {
97*a58d3d2aSXin Li         ret  = silk_reset_decoder( &channel_state[ n ] );
98*a58d3d2aSXin Li     }
99*a58d3d2aSXin Li     silk_memset(&((silk_decoder *)decState)->sStereo, 0, sizeof(((silk_decoder *)decState)->sStereo));
100*a58d3d2aSXin Li     /* Not strictly needed, but it's cleaner that way */
101*a58d3d2aSXin Li     ((silk_decoder *)decState)->prev_decode_only_middle = 0;
102*a58d3d2aSXin Li 
103*a58d3d2aSXin Li     return ret;
104*a58d3d2aSXin Li }
105*a58d3d2aSXin Li 
106*a58d3d2aSXin Li 
silk_InitDecoder(void * decState)107*a58d3d2aSXin Li opus_int silk_InitDecoder(                              /* O    Returns error code                              */
108*a58d3d2aSXin Li     void                            *decState           /* I/O  State                                           */
109*a58d3d2aSXin Li )
110*a58d3d2aSXin Li {
111*a58d3d2aSXin Li     opus_int n, ret = SILK_NO_ERROR;
112*a58d3d2aSXin Li     silk_decoder_state *channel_state = ((silk_decoder *)decState)->channel_state;
113*a58d3d2aSXin Li #ifdef ENABLE_OSCE
114*a58d3d2aSXin Li     ((silk_decoder *)decState)->osce_model.loaded = 0;
115*a58d3d2aSXin Li #endif
116*a58d3d2aSXin Li #ifndef USE_WEIGHTS_FILE
117*a58d3d2aSXin Li     /* load osce models */
118*a58d3d2aSXin Li     silk_LoadOSCEModels(decState, NULL, 0);
119*a58d3d2aSXin Li #endif
120*a58d3d2aSXin Li 
121*a58d3d2aSXin Li     for( n = 0; n < DECODER_NUM_CHANNELS; n++ ) {
122*a58d3d2aSXin Li         ret  = silk_init_decoder( &channel_state[ n ] );
123*a58d3d2aSXin Li     }
124*a58d3d2aSXin Li     silk_memset(&((silk_decoder *)decState)->sStereo, 0, sizeof(((silk_decoder *)decState)->sStereo));
125*a58d3d2aSXin Li     /* Not strictly needed, but it's cleaner that way */
126*a58d3d2aSXin Li     ((silk_decoder *)decState)->prev_decode_only_middle = 0;
127*a58d3d2aSXin Li 
128*a58d3d2aSXin Li     return ret;
129*a58d3d2aSXin Li }
130*a58d3d2aSXin Li 
131*a58d3d2aSXin Li /* Decode a frame */
silk_Decode(void * decState,silk_DecControlStruct * decControl,opus_int lostFlag,opus_int newPacketFlag,ec_dec * psRangeDec,opus_int16 * samplesOut,opus_int32 * nSamplesOut,LPCNetPLCState * lpcnet,int arch)132*a58d3d2aSXin Li opus_int silk_Decode(                                   /* O    Returns error code                              */
133*a58d3d2aSXin Li     void*                           decState,           /* I/O  State                                           */
134*a58d3d2aSXin Li     silk_DecControlStruct*          decControl,         /* I/O  Control Structure                               */
135*a58d3d2aSXin Li     opus_int                        lostFlag,           /* I    0: no loss, 1 loss, 2 decode fec                */
136*a58d3d2aSXin Li     opus_int                        newPacketFlag,      /* I    Indicates first decoder call for this packet    */
137*a58d3d2aSXin Li     ec_dec                          *psRangeDec,        /* I/O  Compressor data structure                       */
138*a58d3d2aSXin Li     opus_int16                      *samplesOut,        /* O    Decoded output speech vector                    */
139*a58d3d2aSXin Li     opus_int32                      *nSamplesOut,       /* O    Number of samples decoded                       */
140*a58d3d2aSXin Li #ifdef ENABLE_DEEP_PLC
141*a58d3d2aSXin Li     LPCNetPLCState                  *lpcnet,
142*a58d3d2aSXin Li #endif
143*a58d3d2aSXin Li     int                             arch                /* I    Run-time architecture                           */
144*a58d3d2aSXin Li )
145*a58d3d2aSXin Li {
146*a58d3d2aSXin Li     opus_int   i, n, decode_only_middle = 0, ret = SILK_NO_ERROR;
147*a58d3d2aSXin Li     opus_int32 nSamplesOutDec, LBRR_symbol;
148*a58d3d2aSXin Li     opus_int16 *samplesOut1_tmp[ 2 ];
149*a58d3d2aSXin Li     VARDECL( opus_int16, samplesOut1_tmp_storage1 );
150*a58d3d2aSXin Li     VARDECL( opus_int16, samplesOut1_tmp_storage2 );
151*a58d3d2aSXin Li     VARDECL( opus_int16, samplesOut2_tmp );
152*a58d3d2aSXin Li     opus_int32 MS_pred_Q13[ 2 ] = { 0 };
153*a58d3d2aSXin Li     opus_int16 *resample_out_ptr;
154*a58d3d2aSXin Li     silk_decoder *psDec = ( silk_decoder * )decState;
155*a58d3d2aSXin Li     silk_decoder_state *channel_state = psDec->channel_state;
156*a58d3d2aSXin Li     opus_int has_side;
157*a58d3d2aSXin Li     opus_int stereo_to_mono;
158*a58d3d2aSXin Li     int delay_stack_alloc;
159*a58d3d2aSXin Li     SAVE_STACK;
160*a58d3d2aSXin Li 
161*a58d3d2aSXin Li     celt_assert( decControl->nChannelsInternal == 1 || decControl->nChannelsInternal == 2 );
162*a58d3d2aSXin Li 
163*a58d3d2aSXin Li     /**********************************/
164*a58d3d2aSXin Li     /* Test if first frame in payload */
165*a58d3d2aSXin Li     /**********************************/
166*a58d3d2aSXin Li     if( newPacketFlag ) {
167*a58d3d2aSXin Li         for( n = 0; n < decControl->nChannelsInternal; n++ ) {
168*a58d3d2aSXin Li             channel_state[ n ].nFramesDecoded = 0;  /* Used to count frames in packet */
169*a58d3d2aSXin Li         }
170*a58d3d2aSXin Li     }
171*a58d3d2aSXin Li 
172*a58d3d2aSXin Li     /* If Mono -> Stereo transition in bitstream: init state of second channel */
173*a58d3d2aSXin Li     if( decControl->nChannelsInternal > psDec->nChannelsInternal ) {
174*a58d3d2aSXin Li         ret += silk_init_decoder( &channel_state[ 1 ] );
175*a58d3d2aSXin Li     }
176*a58d3d2aSXin Li 
177*a58d3d2aSXin Li     stereo_to_mono = decControl->nChannelsInternal == 1 && psDec->nChannelsInternal == 2 &&
178*a58d3d2aSXin Li                      ( decControl->internalSampleRate == 1000*channel_state[ 0 ].fs_kHz );
179*a58d3d2aSXin Li 
180*a58d3d2aSXin Li     if( channel_state[ 0 ].nFramesDecoded == 0 ) {
181*a58d3d2aSXin Li         for( n = 0; n < decControl->nChannelsInternal; n++ ) {
182*a58d3d2aSXin Li             opus_int fs_kHz_dec;
183*a58d3d2aSXin Li             if( decControl->payloadSize_ms == 0 ) {
184*a58d3d2aSXin Li                 /* Assuming packet loss, use 10 ms */
185*a58d3d2aSXin Li                 channel_state[ n ].nFramesPerPacket = 1;
186*a58d3d2aSXin Li                 channel_state[ n ].nb_subfr = 2;
187*a58d3d2aSXin Li             } else if( decControl->payloadSize_ms == 10 ) {
188*a58d3d2aSXin Li                 channel_state[ n ].nFramesPerPacket = 1;
189*a58d3d2aSXin Li                 channel_state[ n ].nb_subfr = 2;
190*a58d3d2aSXin Li             } else if( decControl->payloadSize_ms == 20 ) {
191*a58d3d2aSXin Li                 channel_state[ n ].nFramesPerPacket = 1;
192*a58d3d2aSXin Li                 channel_state[ n ].nb_subfr = 4;
193*a58d3d2aSXin Li             } else if( decControl->payloadSize_ms == 40 ) {
194*a58d3d2aSXin Li                 channel_state[ n ].nFramesPerPacket = 2;
195*a58d3d2aSXin Li                 channel_state[ n ].nb_subfr = 4;
196*a58d3d2aSXin Li             } else if( decControl->payloadSize_ms == 60 ) {
197*a58d3d2aSXin Li                 channel_state[ n ].nFramesPerPacket = 3;
198*a58d3d2aSXin Li                 channel_state[ n ].nb_subfr = 4;
199*a58d3d2aSXin Li             } else {
200*a58d3d2aSXin Li                 celt_assert( 0 );
201*a58d3d2aSXin Li                 RESTORE_STACK;
202*a58d3d2aSXin Li                 return SILK_DEC_INVALID_FRAME_SIZE;
203*a58d3d2aSXin Li             }
204*a58d3d2aSXin Li             fs_kHz_dec = ( decControl->internalSampleRate >> 10 ) + 1;
205*a58d3d2aSXin Li             if( fs_kHz_dec != 8 && fs_kHz_dec != 12 && fs_kHz_dec != 16 ) {
206*a58d3d2aSXin Li                 celt_assert( 0 );
207*a58d3d2aSXin Li                 RESTORE_STACK;
208*a58d3d2aSXin Li                 return SILK_DEC_INVALID_SAMPLING_FREQUENCY;
209*a58d3d2aSXin Li             }
210*a58d3d2aSXin Li             ret += silk_decoder_set_fs( &channel_state[ n ], fs_kHz_dec, decControl->API_sampleRate );
211*a58d3d2aSXin Li         }
212*a58d3d2aSXin Li     }
213*a58d3d2aSXin Li 
214*a58d3d2aSXin Li     if( decControl->nChannelsAPI == 2 && decControl->nChannelsInternal == 2 && ( psDec->nChannelsAPI == 1 || psDec->nChannelsInternal == 1 ) ) {
215*a58d3d2aSXin Li         silk_memset( psDec->sStereo.pred_prev_Q13, 0, sizeof( psDec->sStereo.pred_prev_Q13 ) );
216*a58d3d2aSXin Li         silk_memset( psDec->sStereo.sSide, 0, sizeof( psDec->sStereo.sSide ) );
217*a58d3d2aSXin Li         silk_memcpy( &channel_state[ 1 ].resampler_state, &channel_state[ 0 ].resampler_state, sizeof( silk_resampler_state_struct ) );
218*a58d3d2aSXin Li     }
219*a58d3d2aSXin Li     psDec->nChannelsAPI      = decControl->nChannelsAPI;
220*a58d3d2aSXin Li     psDec->nChannelsInternal = decControl->nChannelsInternal;
221*a58d3d2aSXin Li 
222*a58d3d2aSXin Li     if( decControl->API_sampleRate > (opus_int32)MAX_API_FS_KHZ * 1000 || decControl->API_sampleRate < 8000 ) {
223*a58d3d2aSXin Li         ret = SILK_DEC_INVALID_SAMPLING_FREQUENCY;
224*a58d3d2aSXin Li         RESTORE_STACK;
225*a58d3d2aSXin Li         return( ret );
226*a58d3d2aSXin Li     }
227*a58d3d2aSXin Li 
228*a58d3d2aSXin Li     if( lostFlag != FLAG_PACKET_LOST && channel_state[ 0 ].nFramesDecoded == 0 ) {
229*a58d3d2aSXin Li         /* First decoder call for this payload */
230*a58d3d2aSXin Li         /* Decode VAD flags and LBRR flag */
231*a58d3d2aSXin Li         for( n = 0; n < decControl->nChannelsInternal; n++ ) {
232*a58d3d2aSXin Li             for( i = 0; i < channel_state[ n ].nFramesPerPacket; i++ ) {
233*a58d3d2aSXin Li                 channel_state[ n ].VAD_flags[ i ] = ec_dec_bit_logp(psRangeDec, 1);
234*a58d3d2aSXin Li             }
235*a58d3d2aSXin Li             channel_state[ n ].LBRR_flag = ec_dec_bit_logp(psRangeDec, 1);
236*a58d3d2aSXin Li         }
237*a58d3d2aSXin Li         /* Decode LBRR flags */
238*a58d3d2aSXin Li         for( n = 0; n < decControl->nChannelsInternal; n++ ) {
239*a58d3d2aSXin Li             silk_memset( channel_state[ n ].LBRR_flags, 0, sizeof( channel_state[ n ].LBRR_flags ) );
240*a58d3d2aSXin Li             if( channel_state[ n ].LBRR_flag ) {
241*a58d3d2aSXin Li                 if( channel_state[ n ].nFramesPerPacket == 1 ) {
242*a58d3d2aSXin Li                     channel_state[ n ].LBRR_flags[ 0 ] = 1;
243*a58d3d2aSXin Li                 } else {
244*a58d3d2aSXin Li                     LBRR_symbol = ec_dec_icdf( psRangeDec, silk_LBRR_flags_iCDF_ptr[ channel_state[ n ].nFramesPerPacket - 2 ], 8 ) + 1;
245*a58d3d2aSXin Li                     for( i = 0; i < channel_state[ n ].nFramesPerPacket; i++ ) {
246*a58d3d2aSXin Li                         channel_state[ n ].LBRR_flags[ i ] = silk_RSHIFT( LBRR_symbol, i ) & 1;
247*a58d3d2aSXin Li                     }
248*a58d3d2aSXin Li                 }
249*a58d3d2aSXin Li             }
250*a58d3d2aSXin Li         }
251*a58d3d2aSXin Li 
252*a58d3d2aSXin Li         if( lostFlag == FLAG_DECODE_NORMAL ) {
253*a58d3d2aSXin Li             /* Regular decoding: skip all LBRR data */
254*a58d3d2aSXin Li             for( i = 0; i < channel_state[ 0 ].nFramesPerPacket; i++ ) {
255*a58d3d2aSXin Li                 for( n = 0; n < decControl->nChannelsInternal; n++ ) {
256*a58d3d2aSXin Li                     if( channel_state[ n ].LBRR_flags[ i ] ) {
257*a58d3d2aSXin Li                         opus_int16 pulses[ MAX_FRAME_LENGTH ];
258*a58d3d2aSXin Li                         opus_int condCoding;
259*a58d3d2aSXin Li 
260*a58d3d2aSXin Li                         if( decControl->nChannelsInternal == 2 && n == 0 ) {
261*a58d3d2aSXin Li                             silk_stereo_decode_pred( psRangeDec, MS_pred_Q13 );
262*a58d3d2aSXin Li                             if( channel_state[ 1 ].LBRR_flags[ i ] == 0 ) {
263*a58d3d2aSXin Li                                 silk_stereo_decode_mid_only( psRangeDec, &decode_only_middle );
264*a58d3d2aSXin Li                             }
265*a58d3d2aSXin Li                         }
266*a58d3d2aSXin Li                         /* Use conditional coding if previous frame available */
267*a58d3d2aSXin Li                         if( i > 0 && channel_state[ n ].LBRR_flags[ i - 1 ] ) {
268*a58d3d2aSXin Li                             condCoding = CODE_CONDITIONALLY;
269*a58d3d2aSXin Li                         } else {
270*a58d3d2aSXin Li                             condCoding = CODE_INDEPENDENTLY;
271*a58d3d2aSXin Li                         }
272*a58d3d2aSXin Li                         silk_decode_indices( &channel_state[ n ], psRangeDec, i, 1, condCoding );
273*a58d3d2aSXin Li                         silk_decode_pulses( psRangeDec, pulses, channel_state[ n ].indices.signalType,
274*a58d3d2aSXin Li                             channel_state[ n ].indices.quantOffsetType, channel_state[ n ].frame_length );
275*a58d3d2aSXin Li                     }
276*a58d3d2aSXin Li                 }
277*a58d3d2aSXin Li             }
278*a58d3d2aSXin Li         }
279*a58d3d2aSXin Li     }
280*a58d3d2aSXin Li 
281*a58d3d2aSXin Li     /* Get MS predictor index */
282*a58d3d2aSXin Li     if( decControl->nChannelsInternal == 2 ) {
283*a58d3d2aSXin Li         if(   lostFlag == FLAG_DECODE_NORMAL ||
284*a58d3d2aSXin Li             ( lostFlag == FLAG_DECODE_LBRR && channel_state[ 0 ].LBRR_flags[ channel_state[ 0 ].nFramesDecoded ] == 1 ) )
285*a58d3d2aSXin Li         {
286*a58d3d2aSXin Li             silk_stereo_decode_pred( psRangeDec, MS_pred_Q13 );
287*a58d3d2aSXin Li             /* For LBRR data, decode mid-only flag only if side-channel's LBRR flag is false */
288*a58d3d2aSXin Li             if( ( lostFlag == FLAG_DECODE_NORMAL && channel_state[ 1 ].VAD_flags[ channel_state[ 0 ].nFramesDecoded ] == 0 ) ||
289*a58d3d2aSXin Li                 ( lostFlag == FLAG_DECODE_LBRR && channel_state[ 1 ].LBRR_flags[ channel_state[ 0 ].nFramesDecoded ] == 0 ) )
290*a58d3d2aSXin Li             {
291*a58d3d2aSXin Li                 silk_stereo_decode_mid_only( psRangeDec, &decode_only_middle );
292*a58d3d2aSXin Li             } else {
293*a58d3d2aSXin Li                 decode_only_middle = 0;
294*a58d3d2aSXin Li             }
295*a58d3d2aSXin Li         } else {
296*a58d3d2aSXin Li             for( n = 0; n < 2; n++ ) {
297*a58d3d2aSXin Li                 MS_pred_Q13[ n ] = psDec->sStereo.pred_prev_Q13[ n ];
298*a58d3d2aSXin Li             }
299*a58d3d2aSXin Li         }
300*a58d3d2aSXin Li     }
301*a58d3d2aSXin Li 
302*a58d3d2aSXin Li     /* Reset side channel decoder prediction memory for first frame with side coding */
303*a58d3d2aSXin Li     if( decControl->nChannelsInternal == 2 && decode_only_middle == 0 && psDec->prev_decode_only_middle == 1 ) {
304*a58d3d2aSXin Li         silk_memset( psDec->channel_state[ 1 ].outBuf, 0, sizeof(psDec->channel_state[ 1 ].outBuf) );
305*a58d3d2aSXin Li         silk_memset( psDec->channel_state[ 1 ].sLPC_Q14_buf, 0, sizeof(psDec->channel_state[ 1 ].sLPC_Q14_buf) );
306*a58d3d2aSXin Li         psDec->channel_state[ 1 ].lagPrev        = 100;
307*a58d3d2aSXin Li         psDec->channel_state[ 1 ].LastGainIndex  = 10;
308*a58d3d2aSXin Li         psDec->channel_state[ 1 ].prevSignalType = TYPE_NO_VOICE_ACTIVITY;
309*a58d3d2aSXin Li         psDec->channel_state[ 1 ].first_frame_after_reset = 1;
310*a58d3d2aSXin Li     }
311*a58d3d2aSXin Li 
312*a58d3d2aSXin Li     /* Check if the temp buffer fits into the output PCM buffer. If it fits,
313*a58d3d2aSXin Li        we can delay allocating the temp buffer until after the SILK peak stack
314*a58d3d2aSXin Li        usage. We need to use a < and not a <= because of the two extra samples. */
315*a58d3d2aSXin Li     delay_stack_alloc = decControl->internalSampleRate*decControl->nChannelsInternal
316*a58d3d2aSXin Li           < decControl->API_sampleRate*decControl->nChannelsAPI;
317*a58d3d2aSXin Li     ALLOC( samplesOut1_tmp_storage1, delay_stack_alloc ? ALLOC_NONE
318*a58d3d2aSXin Li            : decControl->nChannelsInternal*(channel_state[ 0 ].frame_length + 2 ),
319*a58d3d2aSXin Li            opus_int16 );
320*a58d3d2aSXin Li     if ( delay_stack_alloc )
321*a58d3d2aSXin Li     {
322*a58d3d2aSXin Li        samplesOut1_tmp[ 0 ] = samplesOut;
323*a58d3d2aSXin Li        samplesOut1_tmp[ 1 ] = samplesOut + channel_state[ 0 ].frame_length + 2;
324*a58d3d2aSXin Li     } else {
325*a58d3d2aSXin Li        samplesOut1_tmp[ 0 ] = samplesOut1_tmp_storage1;
326*a58d3d2aSXin Li        samplesOut1_tmp[ 1 ] = samplesOut1_tmp_storage1 + channel_state[ 0 ].frame_length + 2;
327*a58d3d2aSXin Li     }
328*a58d3d2aSXin Li 
329*a58d3d2aSXin Li     if( lostFlag == FLAG_DECODE_NORMAL ) {
330*a58d3d2aSXin Li         has_side = !decode_only_middle;
331*a58d3d2aSXin Li     } else {
332*a58d3d2aSXin Li         has_side = !psDec->prev_decode_only_middle
333*a58d3d2aSXin Li               || (decControl->nChannelsInternal == 2 && lostFlag == FLAG_DECODE_LBRR && channel_state[1].LBRR_flags[ channel_state[1].nFramesDecoded ] == 1 );
334*a58d3d2aSXin Li     }
335*a58d3d2aSXin Li     channel_state[ 0 ].sPLC.enable_deep_plc = decControl->enable_deep_plc;
336*a58d3d2aSXin Li     /* Call decoder for one frame */
337*a58d3d2aSXin Li     for( n = 0; n < decControl->nChannelsInternal; n++ ) {
338*a58d3d2aSXin Li         if( n == 0 || has_side ) {
339*a58d3d2aSXin Li             opus_int FrameIndex;
340*a58d3d2aSXin Li             opus_int condCoding;
341*a58d3d2aSXin Li 
342*a58d3d2aSXin Li             FrameIndex = channel_state[ 0 ].nFramesDecoded - n;
343*a58d3d2aSXin Li             /* Use independent coding if no previous frame available */
344*a58d3d2aSXin Li             if( FrameIndex <= 0 ) {
345*a58d3d2aSXin Li                 condCoding = CODE_INDEPENDENTLY;
346*a58d3d2aSXin Li             } else if( lostFlag == FLAG_DECODE_LBRR ) {
347*a58d3d2aSXin Li                 condCoding = channel_state[ n ].LBRR_flags[ FrameIndex - 1 ] ? CODE_CONDITIONALLY : CODE_INDEPENDENTLY;
348*a58d3d2aSXin Li             } else if( n > 0 && psDec->prev_decode_only_middle ) {
349*a58d3d2aSXin Li                 /* If we skipped a side frame in this packet, we don't
350*a58d3d2aSXin Li                    need LTP scaling; the LTP state is well-defined. */
351*a58d3d2aSXin Li                 condCoding = CODE_INDEPENDENTLY_NO_LTP_SCALING;
352*a58d3d2aSXin Li             } else {
353*a58d3d2aSXin Li                 condCoding = CODE_CONDITIONALLY;
354*a58d3d2aSXin Li             }
355*a58d3d2aSXin Li #ifdef ENABLE_OSCE
356*a58d3d2aSXin Li             if ( channel_state[n].osce.method != decControl->osce_method ) {
357*a58d3d2aSXin Li                 osce_reset( &channel_state[n].osce, decControl->osce_method );
358*a58d3d2aSXin Li             }
359*a58d3d2aSXin Li #endif
360*a58d3d2aSXin Li             ret += silk_decode_frame( &channel_state[ n ], psRangeDec, &samplesOut1_tmp[ n ][ 2 ], &nSamplesOutDec, lostFlag, condCoding,
361*a58d3d2aSXin Li #ifdef ENABLE_DEEP_PLC
362*a58d3d2aSXin Li                 n == 0 ? lpcnet : NULL,
363*a58d3d2aSXin Li #endif
364*a58d3d2aSXin Li #ifdef ENABLE_OSCE
365*a58d3d2aSXin Li                 &psDec->osce_model,
366*a58d3d2aSXin Li #endif
367*a58d3d2aSXin Li                 arch);
368*a58d3d2aSXin Li         } else {
369*a58d3d2aSXin Li             silk_memset( &samplesOut1_tmp[ n ][ 2 ], 0, nSamplesOutDec * sizeof( opus_int16 ) );
370*a58d3d2aSXin Li         }
371*a58d3d2aSXin Li         channel_state[ n ].nFramesDecoded++;
372*a58d3d2aSXin Li     }
373*a58d3d2aSXin Li 
374*a58d3d2aSXin Li     if( decControl->nChannelsAPI == 2 && decControl->nChannelsInternal == 2 ) {
375*a58d3d2aSXin Li         /* Convert Mid/Side to Left/Right */
376*a58d3d2aSXin Li         silk_stereo_MS_to_LR( &psDec->sStereo, samplesOut1_tmp[ 0 ], samplesOut1_tmp[ 1 ], MS_pred_Q13, channel_state[ 0 ].fs_kHz, nSamplesOutDec );
377*a58d3d2aSXin Li     } else {
378*a58d3d2aSXin Li         /* Buffering */
379*a58d3d2aSXin Li         silk_memcpy( samplesOut1_tmp[ 0 ], psDec->sStereo.sMid, 2 * sizeof( opus_int16 ) );
380*a58d3d2aSXin Li         silk_memcpy( psDec->sStereo.sMid, &samplesOut1_tmp[ 0 ][ nSamplesOutDec ], 2 * sizeof( opus_int16 ) );
381*a58d3d2aSXin Li     }
382*a58d3d2aSXin Li 
383*a58d3d2aSXin Li     /* Number of output samples */
384*a58d3d2aSXin Li     *nSamplesOut = silk_DIV32( nSamplesOutDec * decControl->API_sampleRate, silk_SMULBB( channel_state[ 0 ].fs_kHz, 1000 ) );
385*a58d3d2aSXin Li 
386*a58d3d2aSXin Li     /* Set up pointers to temp buffers */
387*a58d3d2aSXin Li     ALLOC( samplesOut2_tmp,
388*a58d3d2aSXin Li            decControl->nChannelsAPI == 2 ? *nSamplesOut : ALLOC_NONE, opus_int16 );
389*a58d3d2aSXin Li     if( decControl->nChannelsAPI == 2 ) {
390*a58d3d2aSXin Li         resample_out_ptr = samplesOut2_tmp;
391*a58d3d2aSXin Li     } else {
392*a58d3d2aSXin Li         resample_out_ptr = samplesOut;
393*a58d3d2aSXin Li     }
394*a58d3d2aSXin Li 
395*a58d3d2aSXin Li     ALLOC( samplesOut1_tmp_storage2, delay_stack_alloc
396*a58d3d2aSXin Li            ? decControl->nChannelsInternal*(channel_state[ 0 ].frame_length + 2 )
397*a58d3d2aSXin Li            : ALLOC_NONE,
398*a58d3d2aSXin Li            opus_int16 );
399*a58d3d2aSXin Li     if ( delay_stack_alloc ) {
400*a58d3d2aSXin Li        OPUS_COPY(samplesOut1_tmp_storage2, samplesOut, decControl->nChannelsInternal*(channel_state[ 0 ].frame_length + 2));
401*a58d3d2aSXin Li        samplesOut1_tmp[ 0 ] = samplesOut1_tmp_storage2;
402*a58d3d2aSXin Li        samplesOut1_tmp[ 1 ] = samplesOut1_tmp_storage2 + channel_state[ 0 ].frame_length + 2;
403*a58d3d2aSXin Li     }
404*a58d3d2aSXin Li     for( n = 0; n < silk_min( decControl->nChannelsAPI, decControl->nChannelsInternal ); n++ ) {
405*a58d3d2aSXin Li 
406*a58d3d2aSXin Li         /* Resample decoded signal to API_sampleRate */
407*a58d3d2aSXin Li         ret += silk_resampler( &channel_state[ n ].resampler_state, resample_out_ptr, &samplesOut1_tmp[ n ][ 1 ], nSamplesOutDec );
408*a58d3d2aSXin Li 
409*a58d3d2aSXin Li         /* Interleave if stereo output and stereo stream */
410*a58d3d2aSXin Li         if( decControl->nChannelsAPI == 2 ) {
411*a58d3d2aSXin Li             for( i = 0; i < *nSamplesOut; i++ ) {
412*a58d3d2aSXin Li                 samplesOut[ n + 2 * i ] = resample_out_ptr[ i ];
413*a58d3d2aSXin Li             }
414*a58d3d2aSXin Li         }
415*a58d3d2aSXin Li     }
416*a58d3d2aSXin Li 
417*a58d3d2aSXin Li     /* Create two channel output from mono stream */
418*a58d3d2aSXin Li     if( decControl->nChannelsAPI == 2 && decControl->nChannelsInternal == 1 ) {
419*a58d3d2aSXin Li         if ( stereo_to_mono ){
420*a58d3d2aSXin Li             /* Resample right channel for newly collapsed stereo just in case
421*a58d3d2aSXin Li                we weren't doing collapsing when switching to mono */
422*a58d3d2aSXin Li             ret += silk_resampler( &channel_state[ 1 ].resampler_state, resample_out_ptr, &samplesOut1_tmp[ 0 ][ 1 ], nSamplesOutDec );
423*a58d3d2aSXin Li 
424*a58d3d2aSXin Li             for( i = 0; i < *nSamplesOut; i++ ) {
425*a58d3d2aSXin Li                 samplesOut[ 1 + 2 * i ] = resample_out_ptr[ i ];
426*a58d3d2aSXin Li             }
427*a58d3d2aSXin Li         } else {
428*a58d3d2aSXin Li             for( i = 0; i < *nSamplesOut; i++ ) {
429*a58d3d2aSXin Li                 samplesOut[ 1 + 2 * i ] = samplesOut[ 0 + 2 * i ];
430*a58d3d2aSXin Li             }
431*a58d3d2aSXin Li         }
432*a58d3d2aSXin Li     }
433*a58d3d2aSXin Li 
434*a58d3d2aSXin Li     /* Export pitch lag, measured at 48 kHz sampling rate */
435*a58d3d2aSXin Li     if( channel_state[ 0 ].prevSignalType == TYPE_VOICED ) {
436*a58d3d2aSXin Li         int mult_tab[ 3 ] = { 6, 4, 3 };
437*a58d3d2aSXin Li         decControl->prevPitchLag = channel_state[ 0 ].lagPrev * mult_tab[ ( channel_state[ 0 ].fs_kHz - 8 ) >> 2 ];
438*a58d3d2aSXin Li     } else {
439*a58d3d2aSXin Li         decControl->prevPitchLag = 0;
440*a58d3d2aSXin Li     }
441*a58d3d2aSXin Li 
442*a58d3d2aSXin Li     if( lostFlag == FLAG_PACKET_LOST ) {
443*a58d3d2aSXin Li        /* On packet loss, remove the gain clamping to prevent having the energy "bounce back"
444*a58d3d2aSXin Li           if we lose packets when the energy is going down */
445*a58d3d2aSXin Li        for ( i = 0; i < psDec->nChannelsInternal; i++ )
446*a58d3d2aSXin Li           psDec->channel_state[ i ].LastGainIndex = 10;
447*a58d3d2aSXin Li     } else {
448*a58d3d2aSXin Li        psDec->prev_decode_only_middle = decode_only_middle;
449*a58d3d2aSXin Li     }
450*a58d3d2aSXin Li     RESTORE_STACK;
451*a58d3d2aSXin Li     return ret;
452*a58d3d2aSXin Li }
453*a58d3d2aSXin Li 
454*a58d3d2aSXin Li #if 0
455*a58d3d2aSXin Li /* Getting table of contents for a packet */
456*a58d3d2aSXin Li opus_int silk_get_TOC(
457*a58d3d2aSXin Li     const opus_uint8                *payload,           /* I    Payload data                                */
458*a58d3d2aSXin Li     const opus_int                  nBytesIn,           /* I    Number of input bytes                       */
459*a58d3d2aSXin Li     const opus_int                  nFramesPerPayload,  /* I    Number of SILK frames per payload           */
460*a58d3d2aSXin Li     silk_TOC_struct                 *Silk_TOC           /* O    Type of content                             */
461*a58d3d2aSXin Li )
462*a58d3d2aSXin Li {
463*a58d3d2aSXin Li     opus_int i, flags, ret = SILK_NO_ERROR;
464*a58d3d2aSXin Li 
465*a58d3d2aSXin Li     if( nBytesIn < 1 ) {
466*a58d3d2aSXin Li         return -1;
467*a58d3d2aSXin Li     }
468*a58d3d2aSXin Li     if( nFramesPerPayload < 0 || nFramesPerPayload > 3 ) {
469*a58d3d2aSXin Li         return -1;
470*a58d3d2aSXin Li     }
471*a58d3d2aSXin Li 
472*a58d3d2aSXin Li     silk_memset( Silk_TOC, 0, sizeof( *Silk_TOC ) );
473*a58d3d2aSXin Li 
474*a58d3d2aSXin Li     /* For stereo, extract the flags for the mid channel */
475*a58d3d2aSXin Li     flags = silk_RSHIFT( payload[ 0 ], 7 - nFramesPerPayload ) & ( silk_LSHIFT( 1, nFramesPerPayload + 1 ) - 1 );
476*a58d3d2aSXin Li 
477*a58d3d2aSXin Li     Silk_TOC->inbandFECFlag = flags & 1;
478*a58d3d2aSXin Li     for( i = nFramesPerPayload - 1; i >= 0 ; i-- ) {
479*a58d3d2aSXin Li         flags = silk_RSHIFT( flags, 1 );
480*a58d3d2aSXin Li         Silk_TOC->VADFlags[ i ] = flags & 1;
481*a58d3d2aSXin Li         Silk_TOC->VADFlag |= flags & 1;
482*a58d3d2aSXin Li     }
483*a58d3d2aSXin Li 
484*a58d3d2aSXin Li     return ret;
485*a58d3d2aSXin Li }
486*a58d3d2aSXin Li #endif
487