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 7870 : 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 7870 : test();
34 7870 : IF( EQ_16( flag_HQ2, LOW_RATE_HQ_CORE ) || EQ_16( flag_HQ2, LOW_RATE_HQ_CORE_TRAN ) )
35 : {
36 32 : LCmode = (Word16) get_next_indice_fx( st_fx, BITS_DE_HMODE ); /* Q0 */
37 32 : difidx[start_norm] = (Word16) get_next_indice_fx( st_fx, BITS_DE_FCOMP ); /* Q0 */
38 32 : move16();
39 : }
40 : ELSE
41 : {
42 7838 : LCmode = (Word16) get_next_indice_fx( st_fx, 2 ); /* Q0 */
43 7838 : difidx[start_norm] = (Word16) get_next_indice_fx( st_fx, NORM0_BITS ); /* Q0 */
44 7838 : move16();
45 : }
46 :
47 7870 : test();
48 7870 : IF( is_transient && EQ_16( flag_HQ2, LOW_RATE_HQ_CORE_TRAN ) )
49 : {
50 2 : hcode_l = 0;
51 2 : move16();
52 2 : IF( EQ_16( LCmode, 1 ) )
53 : {
54 2 : hdecnrm_tran_fx( st_fx, num_sfm, &difidx[start_norm + 1] );
55 2 : j = add( start_norm, num_sfm ); /* Q0 */
56 64 : FOR( i = start_norm + 1; i < j; i++ )
57 : {
58 62 : 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 7868 : hcode_l = 0;
69 7868 : move16();
70 7868 : IF( LCmode == 0 )
71 : {
72 4592 : hdecnrm_context_fx( st_fx, num_sfm, &difidx[start_norm], &hcode_l );
73 : }
74 3276 : ELSE IF( EQ_16( LCmode, 1 ) )
75 : {
76 2220 : startNormPlus1 = add( start_norm, 1 ); /* Q0 */
77 2220 : hdecnrm_resize_fx( st_fx, num_sfm, &difidx[startNormPlus1] );
78 :
79 2220 : pDifidx = &difidx[startNormPlus1]; /* Q0 */
80 2220 : move16();
81 2220 : numSfmMinus1 = sub( num_sfm, 1 ); /* Q0 */
82 65909 : FOR( i = 0; i < numSfmMinus1; i++ )
83 : {
84 63689 : j = *pDifidx++;
85 63689 : move16();
86 63689 : hcode_l = add( hcode_l, resize_huffsizn[j] ); /* Q0 */
87 : }
88 :
89 2220 : pDifidx1 = &difidx[startNormPlus1]; /* Q0 */
90 2220 : move16();
91 2220 : numSfmMinus2 = sub( num_sfm, 2 ); /* Q0 */
92 63689 : FOR( i = 0; i < numSfmMinus2; i++ )
93 : {
94 61469 : pDifidx = pDifidx1++; /* Q0 */
95 61469 : move16();
96 61469 : IF( GT_16( *pDifidx, 17 ) )
97 : {
98 11022 : offset = sub( *pDifidx, 17 ); /* Q0 */
99 11022 : offset = s_min( offset, 3 ); /* Q0 */
100 11022 : *pDifidx1 = sub( *pDifidx1, offset ); /* Q0 */
101 11022 : move16();
102 : }
103 50447 : ELSE IF( LT_16( *pDifidx, 13 ) )
104 : {
105 6767 : offset = sub( *pDifidx, 13 ); /* Q0 */
106 6767 : offset = s_max( offset, -3 ); /* Q0 */
107 6767 : *pDifidx1 = sub( *pDifidx1, offset ); /* Q0 */
108 6767 : move16();
109 : }
110 : }
111 : }
112 1056 : ELSE IF( EQ_16( LCmode, 2 ) )
113 : {
114 934 : startNormPlus1 = add( start_norm, 1 ); /* Q0 */
115 934 : hdecnrm_fx( st_fx, num_sfm, &difidx[start_norm + 1] );
116 :
117 934 : pDifidx = &difidx[startNormPlus1]; /* Q0 */
118 934 : move16();
119 934 : numSfmMinus1 = sub( num_sfm, 1 ); /* Q0 */
120 26415 : FOR( i = 0; i < numSfmMinus1; i++ )
121 : {
122 25481 : j = *pDifidx++; /* Q0 */
123 25481 : move16();
124 25481 : 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 7870 : return hcode_l;
143 : }
144 :
145 : /*------------------------------------------------------------------------*
146 : * dequantize_norms_fx()
147 : *
148 : * De-quantization of norms
149 : *------------------------------------------------------------------------*/
150 :
151 7838 : 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 7838 : i = ynrm[start_norm]; /* Q0 */
166 7838 : move16();
167 7838 : normqlg2[start_norm] = dicnlg2[i]; /* Q0 */
168 7838 : move16();
169 :
170 : /* Other sub-frames */
171 7838 : IF( is_transient )
172 : {
173 : /* Recover quantization indices and quantized norms */
174 523 : idxbuf[0] = ynrm[0]; /* Q0 */
175 523 : move16();
176 21995 : FOR( i = 1; i < num_sfm; i++ )
177 : {
178 21472 : idxbuf[i] = sub( add( ynrm[i], idxbuf[i - 1] ), 15 ); /* Q0 */
179 21472 : move16();
180 : /* safety check in case of bit errors */
181 21472 : test();
182 21472 : 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 523 : recovernorm_fx( idxbuf, ynrm, normqlg2, num_sfm );
192 : }
193 : ELSE
194 : {
195 7315 : pYnrm = &ynrm[start_norm]; /* Q0 */
196 7315 : move16();
197 7315 : pNormqlg2 = &normqlg2[start_norm + 1]; /* Q0 */
198 7315 : move16();
199 209490 : FOR( i = 1; i < num_sfm; i++ )
200 : {
201 202175 : j = sub( *pYnrm++, 15 ); /* Q0 */
202 202175 : move16();
203 202175 : *pYnrm = add( *pYnrm, j ); /* Q0 */
204 202175 : move16();
205 : /* safety check in case of bit errors */
206 202175 : test();
207 202175 : 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 202175 : *pNormqlg2++ = dicnlg2[*pYnrm]; /* Q0 */
215 202175 : move16();
216 : }
217 : }
218 :
219 7838 : return;
220 : }
|