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 : lsf_q );
189 :
190 13989 : NumIndices = add( NumIndices, TCXLPC_NUMSTAGES ); /* Q0 */
191 :
192 237813 : FOR( i = 0; i < M; ++i )
193 : {
194 223824 : lsf_q_ind[i] = lsf_q[i];
195 223824 : move16();
196 : }
197 :
198 13989 : IF( indices[0] ) /* Only add contribution if flag is enabled */
199 : {
200 4359 : msvq_dec(
201 4359 : lsf_ind_codebook[narrowband][cdk],
202 : lsf_ind_dims,
203 : lsf_ind_offs,
204 : TCXLPC_IND_NUMSTAGES,
205 : M,
206 : M,
207 4359 : indices + NumIndices,
208 : lsf_rem_q_ind );
209 4359 : NumIndices = add( NumIndices, TCXLPC_IND_NUMSTAGES ); /* Q0 */
210 :
211 : /* Add to MA-removed vector */
212 74103 : FOR( i = 0; i < M; ++i )
213 : {
214 69744 : lsf_q_ind[i] = add( lsf_q_ind[i], lsf_rem_q_ind[i] ); /* Q1 */
215 69744 : move16();
216 : }
217 : }
218 :
219 : /* Inter-frame prediction */
220 13989 : move16();
221 13989 : means = lsf_means[narrowband]; /* Q1 */
222 :
223 237813 : FOR( i = 0; i < M; ++i )
224 : {
225 223824 : pred[i] = add( means[i], mult_r( MU_MA_FX, mem_MA[i] ) ); /* Q1 */
226 223824 : move16();
227 : }
228 :
229 : /* Add prediction */
230 237813 : FOR( i = 0; i < M; ++i )
231 : {
232 223824 : lsf_q[i] = add( lsf_q[i], pred[i] ); /* Q1 */
233 223824 : move16();
234 223824 : lsf_q_ind[i] = add( lsf_q_ind[i], means[i] ); /* Q1 */
235 223824 : move16();
236 : }
237 :
238 13989 : reorder_lsf_fx( lsf_q, TCXLPC_LSF_GAP, M, INT_FS_FX );
239 :
240 13989 : reorder_lsf_fx( lsf_q_ind, TCXLPC_LSF_GAP, M, INT_FS_FX );
241 13989 : IF( lsp_q_ind )
242 : {
243 13989 : E_LPC_lsf_lsp_conversion /*lsf2lsp*/ ( lsf_q_ind, lsp_q_ind, M );
244 : }
245 :
246 13989 : return NumIndices;
247 : }
248 :
249 : /* Returns: number of bits read */
250 13989 : 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 13989 : flag = *indices; /* Save pointer Q0*/
262 13989 : *flag = 0;
263 13989 : move16(); /* Set flag to disabled */
264 13989 : ++*indices;
265 :
266 13989 : start_bit_pos = st->next_bit_pos; /* Q0 */
267 13989 : move16();
268 55956 : FOR( i = 0; i < TCXLPC_NUMSTAGES; ++i )
269 : {
270 41967 : **indices = get_next_indice_fx( st, lsf_numbits[i] ); /* Q0 */
271 41967 : ++*indices;
272 41967 : move16();
273 : }
274 :
275 : /* Decode independent lsf */
276 13989 : msvq_dec(
277 13989 : lsf_codebook[narrowband][cdk],
278 : lsf_dims,
279 : lsf_offs,
280 : TCXLPC_NUMSTAGES,
281 : M,
282 : M,
283 13989 : flag + 1,
284 : lsf_q_ind );
285 :
286 : /* Update flag */
287 13989 : *flag = lsf_ind_is_active( lsf_q_ind, lsf_means[narrowband], narrowband, cdk ); /* Q0 */
288 13989 : move16();
289 13989 : IF( *flag )
290 : {
291 8718 : FOR( i = 0; i < TCXLPC_IND_NUMSTAGES; ++i )
292 : {
293 4359 : **indices = get_next_indice_fx( st, lsf_ind_numbits[i] ); /* Q0 */
294 4359 : ++*indices;
295 4359 : move16();
296 : }
297 : }
298 13989 : return sub( st->next_bit_pos, start_bit_pos );
299 : }
|