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 98189 : 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 98189 : bits_midlpc = 5; /* Q0 */
40 98189 : move16();
41 :
42 98189 : test();
43 98189 : IF( ( EQ_32( st->sr_core, INT_FS_16k ) ) && ( EQ_16( st->coder_type, UNVOICED ) ) )
44 : {
45 3627 : 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 94562 : IF( EQ_16( st->core, TCX_20_CORE ) )
51 : {
52 94246 : 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 316 : 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 98189 : lsf_allocate_fx( sub( ENDLSF_NBITS, shr( predmode, 1 ) ), mode_lvq, mode_lvq_p, &stages0, &stages1, levels0, levels1, bits0, bits1 );
60 :
61 :
62 98189 : nbits_lpc = 0;
63 98189 : move16();
64 :
65 98189 : IF( EQ_16( predmode, 2 ) )
66 : {
67 : /* there is choice between SN and AR prediction */
68 31865 : safety_net = get_next_indice_fx( st, 1 ); /* Q0 */
69 :
70 31865 : IF( EQ_16( safety_net, 1 ) )
71 : {
72 10786 : stages = stages0; /* Q0 */
73 10786 : move16();
74 10786 : bits = bits0; /* Q0 */
75 10786 : move16();
76 : }
77 : ELSE
78 : {
79 21079 : stages = stages1; /* Q0 */
80 21079 : move16();
81 21079 : bits = bits1; /* Q0 */
82 21079 : move16();
83 : }
84 31865 : *param_lpc = safety_net; /* Q0 */
85 31865 : move16();
86 31865 : param_lpc++;
87 31865 : nbits_lpc = add( nbits_lpc, 1 );
88 : }
89 : ELSE
90 : {
91 66324 : stages = stages1; /* Q0 */
92 66324 : move16();
93 66324 : bits = bits1; /* Q0 */
94 66324 : move16();
95 : }
96 :
97 :
98 98189 : tmp = sub( stages, 1 ); /* Q0 */
99 175299 : FOR( i = 0; i < tmp; i++ )
100 : {
101 77110 : *param_lpc = get_next_indice_fx( st, bits[i] ); /* Q0 */
102 77110 : move16();
103 77110 : param_lpc++;
104 77110 : nbits_lpc = add( nbits_lpc, bits[i] ); /* Q0 */
105 : }
106 98189 : *param_lpc = get_next_indice_fx( st, LEN_INDICE ); /* Q0 */
107 98189 : move16();
108 98189 : param_lpc++;
109 98189 : nbits_lpc = add( nbits_lpc, LEN_INDICE ); /* Q0 */
110 :
111 :
112 98189 : *param_lpc = get_next_indice_fx( st, sub( bits[i], LEN_INDICE ) ); /* Q0 */
113 98189 : move16();
114 98189 : param_lpc++;
115 98189 : nbits_lpc = add( nbits_lpc, sub( bits[i], LEN_INDICE ) ); /* Q0 */
116 :
117 :
118 98189 : test();
119 98189 : test();
120 98189 : 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 98189 : return nbits_lpc;
129 : }
130 :
131 :
132 268 : 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 268 : num_par = 10; /* Q0 */
142 268 : move16();
143 268 : bits1 = BC_TCVQ_BIT_ALLOC_40B; /* Q0 */
144 :
145 268 : nbits_lpc = 0;
146 268 : move16();
147 :
148 :
149 2948 : FOR( i = 0; i < num_par; i++ )
150 : {
151 2680 : *param_lpc = get_next_indice_fx( st, bits1[i] ); /* Q0 */
152 2680 : move16();
153 2680 : param_lpc++;
154 2680 : nbits_lpc = add( nbits_lpc, bits1[i] ); /* Q0 */
155 : }
156 :
157 268 : return nbits_lpc;
158 : }
159 :
160 : /* Returns: number of indices */
161 13989 : 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 13989 : NumIndices = 1; /* Q0 */
178 13989 : move16();
179 :
180 13989 : msvq_dec(
181 13989 : lsf_codebook[narrowband][cdk],
182 : lsf_dims,
183 : lsf_offs,
184 : TCXLPC_NUMSTAGES,
185 : M,
186 : M,
187 13989 : indices + NumIndices,
188 : #ifdef IVAS_MSVQ
189 : 0, NULL,
190 : #endif
191 : lsf_q );
192 :
193 13989 : NumIndices = add( NumIndices, TCXLPC_NUMSTAGES ); /* Q0 */
194 :
195 237813 : FOR( i = 0; i < M; ++i )
196 : {
197 223824 : lsf_q_ind[i] = lsf_q[i];
198 223824 : move16();
199 : }
200 :
201 13989 : IF( indices[0] ) /* Only add contribution if flag is enabled */
202 : {
203 4359 : msvq_dec(
204 4359 : lsf_ind_codebook[narrowband][cdk],
205 : lsf_ind_dims,
206 : lsf_ind_offs,
207 : TCXLPC_IND_NUMSTAGES,
208 : M,
209 : M,
210 4359 : indices + NumIndices,
211 : #ifdef IVAS_MSVQ
212 : 0, NULL,
213 : #endif
214 : lsf_rem_q_ind );
215 4359 : NumIndices = add( NumIndices, TCXLPC_IND_NUMSTAGES ); /* Q0 */
216 :
217 : /* Add to MA-removed vector */
218 74103 : FOR( i = 0; i < M; ++i )
219 : {
220 69744 : lsf_q_ind[i] = add( lsf_q_ind[i], lsf_rem_q_ind[i] ); /* Q1 */
221 69744 : move16();
222 : }
223 : }
224 :
225 : /* Inter-frame prediction */
226 13989 : move16();
227 13989 : means = lsf_means[narrowband]; /* Q1 */
228 :
229 237813 : FOR( i = 0; i < M; ++i )
230 : {
231 223824 : pred[i] = add( means[i], mult_r( MU_MA_FX, mem_MA[i] ) ); /* Q1 */
232 223824 : move16();
233 : }
234 :
235 : /* Add prediction */
236 237813 : FOR( i = 0; i < M; ++i )
237 : {
238 223824 : lsf_q[i] = add( lsf_q[i], pred[i] ); /* Q1 */
239 223824 : move16();
240 223824 : lsf_q_ind[i] = add( lsf_q_ind[i], means[i] ); /* Q1 */
241 223824 : move16();
242 : }
243 :
244 13989 : reorder_lsf_fx( lsf_q, TCXLPC_LSF_GAP, M, INT_FS_FX );
245 :
246 13989 : reorder_lsf_fx( lsf_q_ind, TCXLPC_LSF_GAP, M, INT_FS_FX );
247 13989 : IF( lsp_q_ind )
248 : {
249 13989 : E_LPC_lsf_lsp_conversion /*lsf2lsp*/ ( lsf_q_ind, lsp_q_ind, M );
250 : }
251 :
252 13989 : return NumIndices;
253 : }
254 :
255 : /* Returns: number of bits read */
256 13989 : Word16 dec_lsf_tcxlpc(
257 : Decoder_State *st, /* i/o: Decoder state */
258 : Word16 **indices, /* o : Ptr to VQ indices Q0*/
259 : Word16 narrowband, /* i : narrowband flag Q0*/
260 : Word16 cdk /* i : codebook selector Q0*/
261 : )
262 : {
263 : Word16 i, start_bit_pos;
264 : Word16 lsf_q_ind[M];
265 : Word16 *flag;
266 :
267 13989 : flag = *indices; /* Save pointer Q0*/
268 13989 : *flag = 0;
269 13989 : move16(); /* Set flag to disabled */
270 13989 : ++*indices;
271 :
272 13989 : start_bit_pos = st->next_bit_pos; /* Q0 */
273 13989 : move16();
274 55956 : FOR( i = 0; i < TCXLPC_NUMSTAGES; ++i )
275 : {
276 41967 : **indices = get_next_indice_fx( st, lsf_numbits[i] ); /* Q0 */
277 41967 : ++*indices;
278 41967 : move16();
279 : }
280 :
281 : /* Decode independent lsf */
282 13989 : msvq_dec(
283 13989 : lsf_codebook[narrowband][cdk],
284 : lsf_dims,
285 : lsf_offs,
286 : TCXLPC_NUMSTAGES,
287 : M,
288 : M,
289 13989 : flag + 1,
290 : #ifdef IVAS_MSVQ
291 : 0, NULL,
292 : #endif
293 : lsf_q_ind );
294 :
295 : /* Update flag */
296 13989 : *flag = lsf_ind_is_active( lsf_q_ind, lsf_means[narrowband], narrowband, cdk ); /* Q0 */
297 13989 : move16();
298 13989 : IF( *flag )
299 : {
300 8718 : FOR( i = 0; i < TCXLPC_IND_NUMSTAGES; ++i )
301 : {
302 4359 : **indices = get_next_indice_fx( st, lsf_ind_numbits[i] ); /* Q0 */
303 4359 : ++*indices;
304 4359 : move16();
305 : }
306 : }
307 13989 : return sub( st->next_bit_pos, start_bit_pos );
308 : }
|