Line data Source code
1 : /*====================================================================================
2 : EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0
3 : ====================================================================================*/
4 :
5 : #include <stdint.h>
6 : #include "options.h" /* Compilation switches */
7 : #include "prot_fx.h" /* Function prototypes */
8 : #include "rom_com.h" /* Static table prototypes */
9 :
10 : /*------------------------------------------------------------------------*
11 : * decode_envelope_indices_fx()
12 : *
13 : * Decode envelope indices
14 : *------------------------------------------------------------------------*/
15 :
16 7758 : Word16 decode_envelope_indices_fx( /* o : Number of bits Q0*/
17 : Decoder_State *st_fx, /* i/o: decoder state structure */
18 : const Word16 start_norm, /* i : starting band index Q0*/
19 : const Word16 num_sfm, /* i : Number of subbands Q0*/
20 : const Word16 numnrmibits, /* i : Bitrate of fall-back coding mode Q0*/
21 : Word16 *difidx, /* o : Diff indices/encoded diff indices Q0*/
22 : const Word16 flag_HQ2 /* i : indicator of HQ2 core Q0*/
23 : ,
24 : const Word16 is_transient /* i : indicator of HQ_TRANSIENT Q0*/
25 : )
26 : {
27 : Word16 hcode_l;
28 : Word16 i, j;
29 : Word16 LCmode;
30 : Word16 startNormPlus1, numSfmMinus1, numSfmMinus2, offset;
31 : Word16 *pDifidx, *pDifidx1;
32 :
33 7758 : test();
34 7758 : IF( EQ_16( flag_HQ2, LOW_RATE_HQ_CORE ) || EQ_16( flag_HQ2, LOW_RATE_HQ_CORE_TRAN ) )
35 : {
36 30 : LCmode = (Word16) get_next_indice_fx( st_fx, BITS_DE_HMODE ); /* Q0 */
37 30 : difidx[start_norm] = (Word16) get_next_indice_fx( st_fx, BITS_DE_FCOMP ); /* Q0 */
38 30 : move16();
39 : }
40 : ELSE
41 : {
42 7728 : LCmode = (Word16) get_next_indice_fx( st_fx, 2 ); /* Q0 */
43 7728 : difidx[start_norm] = (Word16) get_next_indice_fx( st_fx, NORM0_BITS ); /* Q0 */
44 7728 : move16();
45 : }
46 :
47 7758 : test();
48 7758 : IF( is_transient && EQ_16( flag_HQ2, LOW_RATE_HQ_CORE_TRAN ) )
49 : {
50 1 : hcode_l = 0;
51 1 : move16();
52 1 : IF( EQ_16( LCmode, 1 ) )
53 : {
54 1 : hdecnrm_tran_fx( st_fx, num_sfm, &difidx[start_norm + 1] );
55 1 : j = add( start_norm, num_sfm ); /* Q0 */
56 32 : FOR( i = start_norm + 1; i < j; i++ )
57 : {
58 31 : hcode_l = add( hcode_l, huffsizn_tran[difidx[i]] ); /* Q0 */
59 : }
60 : }
61 : ELSE
62 : {
63 0 : hdecnrm_context_fx( st_fx, num_sfm, &difidx[start_norm], &hcode_l );
64 : }
65 : }
66 : ELSE
67 : {
68 7757 : hcode_l = 0;
69 7757 : move16();
70 7757 : IF( LCmode == 0 )
71 : {
72 4515 : hdecnrm_context_fx( st_fx, num_sfm, &difidx[start_norm], &hcode_l );
73 : }
74 3242 : ELSE IF( EQ_16( LCmode, 1 ) )
75 : {
76 2193 : startNormPlus1 = add( start_norm, 1 ); /* Q0 */
77 2193 : hdecnrm_resize_fx( st_fx, num_sfm, &difidx[startNormPlus1] );
78 :
79 2193 : pDifidx = &difidx[startNormPlus1]; /* Q0 */
80 2193 : move16();
81 2193 : numSfmMinus1 = sub( num_sfm, 1 ); /* Q0 */
82 65105 : FOR( i = 0; i < numSfmMinus1; i++ )
83 : {
84 62912 : j = *pDifidx++;
85 62912 : move16();
86 62912 : hcode_l = add( hcode_l, resize_huffsizn[j] ); /* Q0 */
87 : }
88 :
89 2193 : pDifidx1 = &difidx[startNormPlus1]; /* Q0 */
90 2193 : move16();
91 2193 : numSfmMinus2 = sub( num_sfm, 2 ); /* Q0 */
92 62912 : FOR( i = 0; i < numSfmMinus2; i++ )
93 : {
94 60719 : pDifidx = pDifidx1++; /* Q0 */
95 60719 : move16();
96 60719 : IF( GT_16( *pDifidx, 17 ) )
97 : {
98 10905 : offset = sub( *pDifidx, 17 ); /* Q0 */
99 10905 : offset = s_min( offset, 3 ); /* Q0 */
100 10905 : *pDifidx1 = sub( *pDifidx1, offset ); /* Q0 */
101 10905 : move16();
102 : }
103 49814 : ELSE IF( LT_16( *pDifidx, 13 ) )
104 : {
105 6674 : offset = sub( *pDifidx, 13 ); /* Q0 */
106 6674 : offset = s_max( offset, -3 ); /* Q0 */
107 6674 : *pDifidx1 = sub( *pDifidx1, offset ); /* Q0 */
108 6674 : move16();
109 : }
110 : }
111 : }
112 1049 : ELSE IF( EQ_16( LCmode, 2 ) )
113 : {
114 927 : startNormPlus1 = add( start_norm, 1 ); /* Q0 */
115 927 : hdecnrm_fx( st_fx, num_sfm, &difidx[start_norm + 1] );
116 :
117 927 : pDifidx = &difidx[startNormPlus1]; /* Q0 */
118 927 : move16();
119 927 : numSfmMinus1 = sub( num_sfm, 1 ); /* Q0 */
120 26184 : FOR( i = 0; i < numSfmMinus1; i++ )
121 : {
122 25257 : j = *pDifidx++; /* Q0 */
123 25257 : move16();
124 25257 : hcode_l = add( hcode_l, huffsizn[j] ); /* Q0 */
125 : }
126 : }
127 : ELSE
128 : {
129 122 : startNormPlus1 = add( start_norm, 1 ); /* Q0 */
130 122 : numSfmMinus1 = sub( num_sfm, 1 ); /* Q0 */
131 122 : pDifidx = &difidx[startNormPlus1]; /* Q0 */
132 2821 : FOR( i = 0; i < numSfmMinus1; i++ )
133 : {
134 2699 : *pDifidx++ = (Word16) get_next_indice_fx( st_fx, NORMI_BITS ); /* Q0 */
135 2699 : move16();
136 : }
137 122 : hcode_l = numnrmibits; /* Q0 */
138 122 : move16();
139 : }
140 : }
141 :
142 7758 : return hcode_l;
143 : }
144 :
145 : /*------------------------------------------------------------------------*
146 : * dequantize_norms_fx()
147 : *
148 : * De-quantization of norms
149 : *------------------------------------------------------------------------*/
150 :
151 7728 : void dequantize_norms_fx(
152 : Decoder_State *st_fx, /* i/o: decoder state structure */
153 : const Word16 start_norm, /* i : First SDE encoded norm Q0*/
154 : const Word16 num_sfm, /* i : Number of norms Q0*/
155 : const Word16 is_transient, /* i : Transient flag Q0*/
156 : Word16 *ynrm, /* o : Decoded norm indices Q0*/
157 : Word16 *normqlg2 /* o : Log2 of decoded norms Q0*/
158 : )
159 : {
160 : Word16 i, j;
161 : Word16 idxbuf[NB_SFM];
162 : Word16 *pYnrm, *pNormqlg2;
163 :
164 : /* First sub-frame */
165 7728 : i = ynrm[start_norm]; /* Q0 */
166 7728 : move16();
167 7728 : normqlg2[start_norm] = dicnlg2[i]; /* Q0 */
168 7728 : move16();
169 :
170 : /* Other sub-frames */
171 7728 : IF( is_transient )
172 : {
173 : /* Recover quantization indices and quantized norms */
174 512 : idxbuf[0] = ynrm[0]; /* Q0 */
175 512 : move16();
176 21521 : FOR( i = 1; i < num_sfm; i++ )
177 : {
178 21009 : idxbuf[i] = sub( add( ynrm[i], idxbuf[i - 1] ), 15 ); /* Q0 */
179 21009 : move16();
180 : /* safety check in case of bit errors */
181 21009 : test();
182 21009 : IF( idxbuf[i] < 0 || GT_16( idxbuf[i], 39 ) )
183 : {
184 0 : idxbuf[i] = 39; /* Q0 */
185 0 : move16();
186 0 : st_fx->BER_detect = 1; /* Q0 */
187 0 : move16();
188 : }
189 : }
190 :
191 512 : recovernorm_fx( idxbuf, ynrm, normqlg2, num_sfm );
192 : }
193 : ELSE
194 : {
195 7216 : pYnrm = &ynrm[start_norm]; /* Q0 */
196 7216 : move16();
197 7216 : pNormqlg2 = &normqlg2[start_norm + 1]; /* Q0 */
198 7216 : move16();
199 206646 : FOR( i = 1; i < num_sfm; i++ )
200 : {
201 199430 : j = sub( *pYnrm++, 15 ); /* Q0 */
202 199430 : move16();
203 199430 : *pYnrm = add( *pYnrm, j ); /* Q0 */
204 199430 : move16();
205 : /* safety check in case of bit errors */
206 199430 : test();
207 199430 : IF( *pYnrm < 0 || GT_16( *pYnrm, 39 ) )
208 : {
209 0 : *pYnrm = 39; /* Q0 */
210 0 : move16();
211 0 : st_fx->BER_detect = 1; /* Q0 */
212 0 : move16();
213 : }
214 199430 : *pNormqlg2++ = dicnlg2[*pYnrm]; /* Q0 */
215 199430 : move16();
216 : }
217 : }
218 :
219 7728 : return;
220 : }
|