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