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 <string.h>
7 : #include "options.h"
8 : #include "cnst.h"
9 : #include "prot_fx.h"
10 : #include "basop_util.h"
11 : #include "rom_com.h"
12 :
13 : #ifndef swap
14 : #define swap( x, y, type ) \
15 : { \
16 : type u__p; \
17 : u__p = x; \
18 : x = y; \
19 : y = u__p; \
20 : }
21 : #endif
22 : /*---------------------------------------------------------------------*
23 : * lsf_msvq_ma_decprm()
24 : *
25 : *
26 : *---------------------------------------------------------------------*/
27 :
28 103008 : Word16 lsf_msvq_ma_decprm(
29 : Decoder_State *st,
30 : Word16 *param_lpc /* Q0 */
31 : )
32 : {
33 : Word16 i, nbits_lpc, tmp;
34 : Word16 bits_midlpc;
35 : Word16 bits0[MAX_VQ_STAGES], bits1[MAX_VQ_STAGES], stages0, stages1, stages,
36 : levels0[MAX_VQ_STAGES], levels1[MAX_VQ_STAGES], *bits;
37 : Word16 predmode, mode_lvq, mode_lvq_p, safety_net;
38 :
39 103008 : bits_midlpc = 5; /* Q0 */
40 103008 : move16();
41 :
42 103008 : test();
43 103008 : IF( ( EQ_32( st->sr_core, INT_FS_16k ) ) && ( EQ_16( st->coder_type, UNVOICED ) ) )
44 : {
45 3683 : find_pred_mode( &predmode, GENERIC, sub( 1, st->narrowBand ) /*st->bwidth*/, st->sr_core,
46 : &mode_lvq, &mode_lvq_p, st->total_brate );
47 : }
48 : ELSE
49 : {
50 99325 : IF( EQ_16( st->core, TCX_20_CORE ) )
51 : {
52 99010 : find_pred_mode( &predmode, AUDIO, sub( 1, st->narrowBand ) /*st->bwidth*/, st->sr_core, &mode_lvq, &mode_lvq_p, st->total_brate );
53 : }
54 : ELSE
55 : {
56 315 : find_pred_mode( &predmode, st->coder_type, sub( 1, st->narrowBand ) /*st->bwidth*/, st->sr_core, &mode_lvq, &mode_lvq_p, st->total_brate );
57 : }
58 : }
59 103008 : lsf_allocate_fx( sub( ENDLSF_NBITS, shr( predmode, 1 ) ), mode_lvq, mode_lvq_p, &stages0, &stages1, levels0, levels1, bits0, bits1 );
60 :
61 :
62 103008 : nbits_lpc = 0;
63 103008 : move16();
64 :
65 103008 : IF( EQ_16( predmode, 2 ) )
66 : {
67 : /* there is choice between SN and AR prediction */
68 31944 : safety_net = get_next_indice_fx( st, 1 ); /* Q0 */
69 :
70 31944 : IF( EQ_16( safety_net, 1 ) )
71 : {
72 10753 : stages = stages0; /* Q0 */
73 10753 : move16();
74 10753 : bits = bits0; /* Q0 */
75 10753 : move16();
76 : }
77 : ELSE
78 : {
79 21191 : stages = stages1; /* Q0 */
80 21191 : move16();
81 21191 : bits = bits1; /* Q0 */
82 21191 : move16();
83 : }
84 31944 : *param_lpc = safety_net; /* Q0 */
85 31944 : move16();
86 31944 : param_lpc++;
87 31944 : nbits_lpc = add( nbits_lpc, 1 );
88 : }
89 : ELSE
90 : {
91 71064 : stages = stages1; /* Q0 */
92 71064 : move16();
93 71064 : bits = bits1; /* Q0 */
94 71064 : move16();
95 : }
96 :
97 :
98 103008 : tmp = sub( stages, 1 ); /* Q0 */
99 184825 : FOR( i = 0; i < tmp; i++ )
100 : {
101 81817 : *param_lpc = get_next_indice_fx( st, bits[i] ); /* Q0 */
102 81817 : move16();
103 81817 : param_lpc++;
104 81817 : nbits_lpc = add( nbits_lpc, bits[i] ); /* Q0 */
105 : }
106 103008 : *param_lpc = get_next_indice_fx( st, LEN_INDICE ); /* Q0 */
107 103008 : move16();
108 103008 : param_lpc++;
109 103008 : nbits_lpc = add( nbits_lpc, LEN_INDICE ); /* Q0 */
110 :
111 :
112 103008 : *param_lpc = get_next_indice_fx( st, sub( bits[i], LEN_INDICE ) ); /* Q0 */
113 103008 : move16();
114 103008 : param_lpc++;
115 103008 : nbits_lpc = add( nbits_lpc, sub( bits[i], LEN_INDICE ) ); /* Q0 */
116 :
117 :
118 103008 : test();
119 103008 : test();
120 103008 : IF( NE_16( st->coder_type, VOICED ) && st->core == 0 && st->acelp_cfg.midLpc )
121 : {
122 :
123 342 : *param_lpc = get_next_indice_fx( st, bits_midlpc ); /* Q0 */
124 342 : move16();
125 342 : nbits_lpc = add( nbits_lpc, bits_midlpc ); /* Q0 */
126 : }
127 :
128 103008 : return nbits_lpc;
129 : }
130 :
131 :
132 270 : Word16 lsf_bctcvq_decprm(
133 : Decoder_State *st,
134 : Word16 *param_lpc /* Q0 */
135 : )
136 : {
137 : Word16 i, nbits_lpc;
138 : Word16 num_par;
139 : const Word16 *bits1;
140 :
141 270 : num_par = 10; /* Q0 */
142 270 : move16();
143 270 : bits1 = BC_TCVQ_BIT_ALLOC_40B; /* Q0 */
144 :
145 270 : nbits_lpc = 0;
146 270 : move16();
147 :
148 :
149 2970 : FOR( i = 0; i < num_par; i++ )
150 : {
151 2700 : *param_lpc = get_next_indice_fx( st, bits1[i] ); /* Q0 */
152 2700 : move16();
153 2700 : param_lpc++;
154 2700 : nbits_lpc = add( nbits_lpc, bits1[i] ); /* Q0 */
155 : }
156 :
157 270 : return nbits_lpc;
158 : }
159 :
160 : /* Returns: number of indices */
161 14042 : Word16 D_lsf_tcxlpc(
162 : const Word16 indices[], /* i : VQ indices Q0*/
163 : Word16 lsf_q[], /* o : quantized LSF Q1*/
164 : Word16 lsp_q_ind[], /* o :quantized LSP (w/o MA prediction) Q1*/
165 : Word16 narrowband, /* i : narrowband flag Q0*/
166 : Word16 cdk, /* i : codebook selector Q0*/
167 : Word16 mem_MA[] /* i : MA memory Q1*/
168 : )
169 : {
170 : Word16 i;
171 : Word16 NumIndices;
172 : Word16 lsf_q_ind[M16k];
173 : Word16 pred[M16k];
174 : const Word16 *means;
175 : Word16 lsf_rem_q_ind[M];
176 :
177 14042 : NumIndices = 1; /* Q0 */
178 14042 : move16();
179 :
180 14042 : msvq_dec(
181 14042 : lsf_codebook[narrowband][cdk],
182 : lsf_dims,
183 : lsf_offs,
184 : TCXLPC_NUMSTAGES,
185 : M,
186 : M,
187 14042 : indices + NumIndices,
188 : lsf_q );
189 :
190 14042 : NumIndices = add( NumIndices, TCXLPC_NUMSTAGES ); /* Q0 */
191 :
192 238714 : FOR( i = 0; i < M; ++i )
193 : {
194 224672 : lsf_q_ind[i] = lsf_q[i];
195 224672 : move16();
196 : }
197 :
198 14042 : IF( indices[0] ) /* Only add contribution if flag is enabled */
199 : {
200 4382 : msvq_dec(
201 4382 : lsf_ind_codebook[narrowband][cdk],
202 : lsf_ind_dims,
203 : lsf_ind_offs,
204 : TCXLPC_IND_NUMSTAGES,
205 : M,
206 : M,
207 4382 : indices + NumIndices,
208 : lsf_rem_q_ind );
209 4382 : NumIndices = add( NumIndices, TCXLPC_IND_NUMSTAGES ); /* Q0 */
210 :
211 : /* Add to MA-removed vector */
212 74494 : FOR( i = 0; i < M; ++i )
213 : {
214 70112 : lsf_q_ind[i] = add( lsf_q_ind[i], lsf_rem_q_ind[i] ); /* Q1 */
215 70112 : move16();
216 : }
217 : }
218 :
219 : /* Inter-frame prediction */
220 14042 : move16();
221 14042 : means = lsf_means[narrowband]; /* Q1 */
222 :
223 238714 : FOR( i = 0; i < M; ++i )
224 : {
225 224672 : pred[i] = add( means[i], mult_r( MU_MA_FX, mem_MA[i] ) ); /* Q1 */
226 224672 : move16();
227 : }
228 :
229 : /* Add prediction */
230 238714 : FOR( i = 0; i < M; ++i )
231 : {
232 224672 : lsf_q[i] = add( lsf_q[i], pred[i] ); /* Q1 */
233 224672 : move16();
234 224672 : lsf_q_ind[i] = add( lsf_q_ind[i], means[i] ); /* Q1 */
235 224672 : move16();
236 : }
237 :
238 14042 : reorder_lsf_fx( lsf_q, TCXLPC_LSF_GAP, M, INT_FS_FX );
239 :
240 14042 : reorder_lsf_fx( lsf_q_ind, TCXLPC_LSF_GAP, M, INT_FS_FX );
241 14042 : IF( lsp_q_ind )
242 : {
243 14042 : E_LPC_lsf_lsp_conversion /*lsf2lsp*/ ( lsf_q_ind, lsp_q_ind, M );
244 : }
245 :
246 14042 : return NumIndices;
247 : }
248 :
249 : /* Returns: number of bits read */
250 14042 : Word16 dec_lsf_tcxlpc(
251 : Decoder_State *st, /* i/o: Decoder state */
252 : Word16 **indices, /* o : Ptr to VQ indices Q0*/
253 : Word16 narrowband, /* i : narrowband flag Q0*/
254 : Word16 cdk /* i : codebook selector Q0*/
255 : )
256 : {
257 : Word16 i, start_bit_pos;
258 : Word16 lsf_q_ind[M];
259 : Word16 *flag;
260 :
261 14042 : flag = *indices; /* Save pointer Q0*/
262 14042 : *flag = 0;
263 14042 : move16(); /* Set flag to disabled */
264 14042 : ++*indices;
265 :
266 14042 : start_bit_pos = st->next_bit_pos; /* Q0 */
267 14042 : move16();
268 56168 : FOR( i = 0; i < TCXLPC_NUMSTAGES; ++i )
269 : {
270 42126 : **indices = get_next_indice_fx( st, lsf_numbits[i] ); /* Q0 */
271 42126 : ++*indices;
272 42126 : move16();
273 : }
274 :
275 : /* Decode independent lsf */
276 14042 : msvq_dec(
277 14042 : lsf_codebook[narrowband][cdk],
278 : lsf_dims,
279 : lsf_offs,
280 : TCXLPC_NUMSTAGES,
281 : M,
282 : M,
283 14042 : flag + 1,
284 : lsf_q_ind );
285 :
286 : /* Update flag */
287 14042 : *flag = lsf_ind_is_active( lsf_q_ind, lsf_means[narrowband], narrowband, cdk ); /* Q0 */
288 14042 : move16();
289 14042 : IF( *flag )
290 : {
291 8764 : FOR( i = 0; i < TCXLPC_IND_NUMSTAGES; ++i )
292 : {
293 4382 : **indices = get_next_indice_fx( st, lsf_ind_numbits[i] ); /* Q0 */
294 4382 : ++*indices;
295 4382 : move16();
296 : }
297 : }
298 14042 : return sub( st->next_bit_pos, start_bit_pos );
299 : }
|