Line data Source code
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 :
32 : #include "main.h"
33 : #include "stack_alloc.h"
34 : #include "PLC.h"
35 :
36 : /****************/
37 : /* Decode frame */
38 : /****************/
39 0 : opus_int silk_decode_frame(
40 : silk_decoder_state *psDec, /* I/O Pointer to Silk decoder state */
41 : ec_dec *psRangeDec, /* I/O Compressor data structure */
42 : opus_int16 pOut[], /* O Pointer to output speech frame */
43 : opus_int32 *pN, /* O Pointer to size of output frame */
44 : opus_int lostFlag, /* I 0: no loss, 1 loss, 2 decode fec */
45 : opus_int condCoding, /* I The type of conditional coding to use */
46 : int arch /* I Run-time architecture */
47 : )
48 : {
49 : VARDECL( silk_decoder_control, psDecCtrl );
50 0 : opus_int L, mv_len, ret = 0;
51 : SAVE_STACK;
52 :
53 0 : L = psDec->frame_length;
54 0 : ALLOC( psDecCtrl, 1, silk_decoder_control );
55 0 : psDecCtrl->LTP_scale_Q14 = 0;
56 :
57 : /* Safety checks */
58 0 : silk_assert( L > 0 && L <= MAX_FRAME_LENGTH );
59 :
60 0 : if( lostFlag == FLAG_DECODE_NORMAL ||
61 0 : ( lostFlag == FLAG_DECODE_LBRR && psDec->LBRR_flags[ psDec->nFramesDecoded ] == 1 ) )
62 0 : {
63 : VARDECL( opus_int16, pulses );
64 0 : ALLOC( pulses, (L + SHELL_CODEC_FRAME_LENGTH - 1) &
65 : ~(SHELL_CODEC_FRAME_LENGTH - 1), opus_int16 );
66 : /*********************************************/
67 : /* Decode quantization indices of side info */
68 : /*********************************************/
69 0 : silk_decode_indices( psDec, psRangeDec, psDec->nFramesDecoded, lostFlag, condCoding );
70 :
71 : /*********************************************/
72 : /* Decode quantization indices of excitation */
73 : /*********************************************/
74 0 : silk_decode_pulses( psRangeDec, pulses, psDec->indices.signalType,
75 0 : psDec->indices.quantOffsetType, psDec->frame_length );
76 :
77 : /********************************************/
78 : /* Decode parameters and pulse signal */
79 : /********************************************/
80 0 : silk_decode_parameters( psDec, psDecCtrl, condCoding );
81 :
82 : /********************************************************/
83 : /* Run inverse NSQ */
84 : /********************************************************/
85 0 : silk_decode_core( psDec, psDecCtrl, pOut, pulses, arch );
86 :
87 : /********************************************************/
88 : /* Update PLC state */
89 : /********************************************************/
90 0 : silk_PLC( psDec, psDecCtrl, pOut, 0, arch );
91 :
92 0 : psDec->lossCnt = 0;
93 0 : psDec->prevSignalType = psDec->indices.signalType;
94 0 : silk_assert( psDec->prevSignalType >= 0 && psDec->prevSignalType <= 2 );
95 :
96 : /* A frame has been decoded without errors */
97 0 : psDec->first_frame_after_reset = 0;
98 : } else {
99 : /* Handle packet loss by extrapolation */
100 0 : psDec->indices.signalType = psDec->prevSignalType;
101 0 : silk_PLC( psDec, psDecCtrl, pOut, 1, arch );
102 : }
103 :
104 : /*************************/
105 : /* Update output buffer. */
106 : /*************************/
107 0 : silk_assert( psDec->ltp_mem_length >= psDec->frame_length );
108 0 : mv_len = psDec->ltp_mem_length - psDec->frame_length;
109 0 : silk_memmove( psDec->outBuf, &psDec->outBuf[ psDec->frame_length ], mv_len * sizeof(opus_int16) );
110 0 : silk_memcpy( &psDec->outBuf[ mv_len ], pOut, psDec->frame_length * sizeof( opus_int16 ) );
111 :
112 : /************************************************/
113 : /* Comfort noise generation / estimation */
114 : /************************************************/
115 0 : silk_CNG( psDec, psDecCtrl, pOut, L );
116 :
117 : /****************************************************************/
118 : /* Ensure smooth connection of extrapolated and good frames */
119 : /****************************************************************/
120 0 : silk_PLC_glue_frames( psDec, pOut, L );
121 :
122 : /* Update some decoder state variables */
123 0 : psDec->lagPrev = psDecCtrl->pitchL[ psDec->nb_subfr - 1 ];
124 :
125 : /* Set output frame length */
126 0 : *pN = L;
127 :
128 : RESTORE_STACK;
129 0 : return ret;
130 : }
|