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"
7 : #include "cnst.h" /* Audio core constants */
8 : #include "rom_com.h" /* Static table prototypes */
9 : #include "prot_fx.h" /* Function prototypes */
10 : #include "ivas_prot_fx.h"
11 :
12 : /*--------------------------------------------------------------------------*
13 : * hq_configure()
14 : *
15 : * Configuration routine for HQ mode
16 : *--------------------------------------------------------------------------*/
17 :
18 7331 : void ivas_hq_configure_fx(
19 : const Word16 length, /* i : Frame length Q0 */
20 : const Word16 hqswb_clas, /* i : HQ SWB class Q0 */
21 : const Word32 core_brate, /* i : Codec bitrate Q0 */
22 : Word16 *num_sfm, /* o : Total number of subbands Q0 */
23 : Word16 *nb_sfm, /* o : Total number of coded bands Q0 */
24 : Word16 *start_norm, /* o : First norm to be SDE encoded Q0 */
25 : Word16 *num_env_bands, /* o : Number coded envelope bands Q0 */
26 : Word16 *numnrmibits, /* o : Number of bits in fall-back norm encoding Q0 */
27 : Word16 *hq_generic_offset, /* o : Freq offset for HQ GENERIC Q0 */
28 : Word16 *sfmsize, /* o : Subband bandwidths Q0 */
29 : Word16 *sfm_start, /* o : Subband start coefficients Q0 */
30 : Word16 *sfm_end /* o : Subband end coefficients Q0 */
31 : )
32 : {
33 : const Word16 *p_sfmsize;
34 : const Word16 *p_sfm_start;
35 : const Word16 *p_sfm_end;
36 : Word16 i, bw_ext;
37 :
38 7331 : bw_ext = 0;
39 7331 : move16();
40 :
41 7331 : *start_norm = 0;
42 7331 : move16();
43 :
44 7331 : IF( EQ_16( length, L_SPEC48k ) )
45 : {
46 5528 : IF( EQ_16( hqswb_clas, HQ_GEN_FB ) )
47 : {
48 2070 : *num_sfm = NB_SFM;
49 2070 : move16();
50 2070 : p_sfmsize = band_len_HQ; /* Q0 */
51 2070 : p_sfm_start = band_start_HQ; /* Q0 */
52 2070 : p_sfm_end = band_end_HQ; /* Q0 */
53 :
54 2070 : IF( GE_32( core_brate, HQ_32k ) )
55 : {
56 0 : *hq_generic_offset = HQ_GENERIC_FOFFSET_32K;
57 0 : move16();
58 0 : *num_env_bands = SFM_N_STA_10k;
59 0 : move16();
60 : }
61 : ELSE /*IF(EQ_32(core_brate, HQ_16k40) || EQ_32(core_brate, HQ_24k40))*/
62 : {
63 2070 : *hq_generic_offset = HQ_GENERIC_FOFFSET_24K4;
64 2070 : move16();
65 2070 : *num_env_bands = SFM_N_STA_8k;
66 2070 : move16();
67 : }
68 2070 : *nb_sfm = *num_sfm;
69 2070 : move16();
70 : }
71 : ELSE
72 : {
73 3458 : IF( EQ_16( hqswb_clas, HQ_HARMONIC ) )
74 : {
75 635 : *num_sfm = SFM_N_HARM_FB;
76 635 : move16();
77 635 : *nb_sfm = SFM_N_HARM_FB;
78 635 : move16();
79 635 : *num_env_bands = SFM_N_HARM_FB;
80 635 : move16();
81 :
82 635 : p_sfmsize = band_len_harm; /* Q0 */
83 635 : p_sfm_start = band_start_harm; /* Q0 */
84 635 : p_sfm_end = band_end_harm; /* Q0 */
85 : }
86 2823 : ELSE IF( EQ_16( hqswb_clas, HQ_HVQ ) )
87 : {
88 1051 : IF( LT_32( core_brate, HQ_BWE_CROSSOVER_BRATE ) )
89 : {
90 536 : *num_sfm = SFM_N_HARM_FB;
91 536 : move16();
92 536 : *nb_sfm = HVQ_THRES_SFM_24k;
93 536 : move16();
94 536 : *num_env_bands = sub( *num_sfm, *nb_sfm ); /* Q0 */
95 536 : move16();
96 536 : *start_norm = HVQ_THRES_SFM_24k;
97 536 : move16();
98 : }
99 : ELSE
100 : {
101 515 : *num_sfm = SFM_N_HARM_FB;
102 515 : move16();
103 515 : *nb_sfm = HVQ_THRES_SFM_32k;
104 515 : move16();
105 515 : *num_env_bands = sub( *num_sfm, *nb_sfm ); /* Q0 */
106 515 : move16();
107 515 : *start_norm = HVQ_THRES_SFM_32k;
108 515 : move16();
109 : }
110 1051 : p_sfmsize = band_len_harm; /* Q0 */
111 1051 : p_sfm_start = band_start_harm; /* Q0 */
112 1051 : p_sfm_end = band_end_harm; /* Q0 */
113 : }
114 : ELSE
115 : {
116 1772 : *num_sfm = NB_SFM;
117 1772 : move16();
118 1772 : *nb_sfm = *num_sfm; /* Q0 */
119 1772 : move16();
120 1772 : *num_env_bands = NB_SFM;
121 1772 : move16();
122 :
123 1772 : p_sfmsize = band_len_HQ; /* Q0 */
124 1772 : p_sfm_start = band_start_HQ; /* Q0 */
125 1772 : p_sfm_end = band_end_HQ; /* Q0 */
126 : }
127 : }
128 : }
129 1803 : ELSE IF( EQ_16( length, L_SPEC32k ) )
130 : {
131 1085 : IF( EQ_16( hqswb_clas, HQ_HARMONIC ) )
132 : {
133 73 : *num_sfm = SFM_N_HARM;
134 73 : move16();
135 73 : *nb_sfm = SFM_N_HARM;
136 73 : move16();
137 73 : *num_env_bands = SFM_N_HARM;
138 73 : move16();
139 :
140 73 : p_sfmsize = band_len_harm; /* Q0 */
141 73 : p_sfm_start = band_start_harm; /* Q0 */
142 73 : p_sfm_end = band_end_harm; /* Q0 */
143 : }
144 1012 : ELSE IF( EQ_16( hqswb_clas, HQ_HVQ ) )
145 : {
146 178 : IF( LT_32( core_brate, HQ_BWE_CROSSOVER_BRATE ) )
147 : {
148 172 : *num_sfm = SFM_N_HARM;
149 172 : move16();
150 172 : *nb_sfm = HVQ_THRES_SFM_24k;
151 172 : move16();
152 172 : *num_env_bands = sub( *num_sfm, *nb_sfm ); /* Q0 */
153 172 : move16();
154 :
155 172 : *start_norm = HVQ_THRES_SFM_24k;
156 172 : move16();
157 : }
158 : ELSE
159 : {
160 6 : *num_sfm = SFM_N_HARM;
161 6 : move16();
162 6 : *nb_sfm = HVQ_THRES_SFM_32k;
163 6 : move16();
164 6 : *num_env_bands = sub( *num_sfm, *nb_sfm ); /* Q0 */
165 6 : move16();
166 :
167 6 : *start_norm = HVQ_THRES_SFM_32k;
168 6 : move16();
169 : }
170 178 : p_sfmsize = band_len_harm;
171 178 : p_sfm_start = band_start_harm;
172 178 : p_sfm_end = band_end_harm;
173 : }
174 834 : ELSE IF( EQ_16( hqswb_clas, HQ_GEN_SWB ) )
175 : {
176 673 : *num_sfm = SFM_N_SWB;
177 673 : move16();
178 673 : p_sfmsize = band_len_HQ; /* Q0 */
179 673 : p_sfm_start = band_start_HQ; /* Q0 */
180 673 : p_sfm_end = band_end_HQ; /* Q0 */
181 :
182 673 : IF( GE_32( core_brate, HQ_32k ) )
183 : {
184 0 : *hq_generic_offset = HQ_GENERIC_FOFFSET_32K;
185 0 : move16();
186 0 : *num_env_bands = SFM_N_STA_10k;
187 0 : move16();
188 : }
189 : ELSE /*if( EQ_32(core_brate, HQ_24k40))*/
190 : {
191 673 : *hq_generic_offset = HQ_GENERIC_FOFFSET_24K4;
192 673 : move16();
193 673 : *num_env_bands = SFM_N_STA_8k;
194 673 : move16();
195 : }
196 :
197 673 : *nb_sfm = *num_sfm;
198 673 : move16();
199 : }
200 : ELSE
201 : {
202 : /* HQ_NORMAL and HQ_TRANSIENT */
203 161 : *num_sfm = SFM_N_SWB;
204 161 : move16();
205 161 : *nb_sfm = *num_sfm; /* Q0 */
206 161 : move16();
207 161 : *num_env_bands = SFM_N_SWB;
208 161 : move16();
209 :
210 161 : p_sfmsize = band_len_HQ; /* Q0 */
211 161 : p_sfm_start = band_start_HQ; /* Q0 */
212 161 : p_sfm_end = band_end_HQ; /* Q0 */
213 : }
214 : }
215 718 : ELSE IF( EQ_16( length, L_SPEC48k_EXT ) )
216 : {
217 89 : bw_ext = 1;
218 89 : move16();
219 89 : p_sfmsize = band_len_HQ; /* Q0 */
220 89 : p_sfm_start = band_start_HQ; /* Q0 */
221 89 : p_sfm_end = band_end_HQ; /* Q0 */
222 89 : *num_sfm = NB_SFM;
223 89 : move16();
224 : }
225 629 : ELSE IF( EQ_16( length, L_SPEC16k_EXT ) )
226 : {
227 33 : bw_ext = 1;
228 33 : move16();
229 33 : p_sfmsize = band_len_wb; /* Q0 */
230 33 : p_sfm_start = band_start_wb; /* Q0 */
231 33 : p_sfm_end = band_end_wb; /* Q0 */
232 33 : *num_sfm = SFM_N_WB;
233 33 : move16();
234 : }
235 : ELSE
236 : {
237 596 : *num_sfm = SFM_N_WB;
238 596 : move16();
239 596 : *nb_sfm = *num_sfm; /* Q0 */
240 596 : move16();
241 596 : *num_env_bands = SFM_N_WB;
242 596 : move16();
243 :
244 596 : p_sfmsize = band_len_wb; /* Q0 */
245 596 : p_sfm_start = band_start_wb; /* Q0 */
246 596 : p_sfm_end = band_end_wb; /* Q0 */
247 : }
248 7331 : IF( bw_ext )
249 : {
250 4896 : FOR( i = 0; i < *num_sfm; i++ )
251 : {
252 : /*sfmsize[i] = (int16_t)(1.25f * p_sfmsize[i]);*/
253 4774 : sfmsize[i] = mult_r( shl( p_sfmsize[i], 1 ), 20480 /* 1.25 in Q14 */ ); /* Q0 */
254 4774 : move16();
255 : /*sfm_start[i] = (int16_t)(1.25f * p_sfm_start[i]);*/
256 4774 : sfm_start[i] = mult_r( shl( p_sfm_start[i], 1 ), 20480 /* 1.25 in Q14 */ ); /* Q0 */
257 4774 : move16();
258 : /*sfm_end[i] = (int16_t)(1.25f * p_sfm_end[i]);*/
259 4774 : sfm_end[i] = mult_r( shl( p_sfm_end[i], 1 ), 20480 /* 1.25 in Q14 */ ); /* Q0 */
260 4774 : move16();
261 : }
262 122 : *nb_sfm = *num_sfm; /* Q0 */
263 122 : *num_env_bands = *num_sfm; /* Q0 */
264 122 : move16();
265 122 : move16();
266 : }
267 : ELSE
268 : {
269 7209 : Copy( p_sfmsize, sfmsize, *num_sfm );
270 7209 : Copy( p_sfm_start, sfm_start, *num_sfm );
271 7209 : Copy( p_sfm_end, sfm_end, *num_sfm );
272 : }
273 :
274 7331 : *numnrmibits = extract_l( L_mult0( sub( *num_env_bands, 1 ), NORMI_BITS ) );
275 7331 : move16();
276 :
277 7331 : return;
278 : }
279 :
280 767 : void hq_configure_evs_fx(
281 : const Word16 length, /* i : Frame length Q0 */
282 : const Word16 hqswb_clas, /* i : HQ SWB class Q0 */
283 : const Word32 core_brate, /* i : Codec bitrate Q0 */
284 : Word16 *num_sfm, /* o : Total number of subbands Q0 */
285 : Word16 *nb_sfm, /* o : Total number of coded bands Q0 */
286 : Word16 *start_norm, /* o : First norm to be SDE encoded Q0 */
287 : Word16 *num_env_bands, /* o : Number coded envelope bands Q0 */
288 : Word16 *numnrmibits, /* o : Number of bits in fall-back norm encoding Q0 */
289 : Word16 *hq_generic_offset, /* o : Freq offset for HQ GENERIC Q0 */
290 : Word16 *sfmsize, /* o : Subband bandwidths Q0 */
291 : Word16 *sfm_start, /* o : Subband start coefficients Q0 */
292 : Word16 *sfm_end /* o : Subband end coefficients Q0 */
293 : )
294 : {
295 : const Word16 *p_sfmsize;
296 : const Word16 *p_sfm_start;
297 : const Word16 *p_sfm_end;
298 : Word16 i, bw_ext;
299 :
300 767 : bw_ext = 0;
301 767 : move16();
302 :
303 767 : *start_norm = 0;
304 767 : move16();
305 :
306 767 : IF( EQ_16( length, L_FRAME48k ) ) /*tbv SOLVED_COMP_ENC_DEC*/
307 : {
308 0 : IF( EQ_16( hqswb_clas, HQ_GEN_FB ) )
309 : {
310 0 : *num_sfm = NB_SFM;
311 0 : move16();
312 0 : p_sfmsize = band_len_HQ; /* Q0 */
313 0 : p_sfm_start = band_start_HQ; /* Q0 */
314 0 : p_sfm_end = band_end_HQ; /* Q0 */
315 :
316 0 : IF( GE_32( core_brate, HQ_32k ) )
317 : {
318 0 : *hq_generic_offset = HQ_GENERIC_FOFFSET_32K;
319 0 : move16();
320 0 : *num_env_bands = SFM_N_STA_10k;
321 0 : move16();
322 : }
323 : ELSE /*IF(EQ_32(core_brate, HQ_16k40) || EQ_32(core_brate, HQ_24k40))*/
324 : {
325 0 : *hq_generic_offset = HQ_GENERIC_FOFFSET_24K4;
326 0 : *num_env_bands = SFM_N_STA_8k;
327 0 : move16();
328 0 : move16();
329 : }
330 0 : *nb_sfm = *num_sfm; /* Q0 */
331 0 : move16();
332 : }
333 : ELSE
334 : {
335 0 : IF( EQ_16( hqswb_clas, HQ_HARMONIC ) )
336 : {
337 0 : *num_sfm = SFM_N_HARM_FB;
338 0 : move16();
339 0 : *nb_sfm = SFM_N_HARM_FB;
340 0 : move16();
341 0 : *num_env_bands = SFM_N_HARM_FB;
342 0 : move16();
343 :
344 0 : p_sfmsize = band_len_harm; /* Q0 */
345 0 : p_sfm_start = band_start_harm; /* Q0 */
346 0 : p_sfm_end = band_end_harm; /* Q0 */
347 : }
348 0 : ELSE IF( EQ_16( hqswb_clas, HQ_HVQ ) )
349 : {
350 0 : IF( LT_32( core_brate, HQ_BWE_CROSSOVER_BRATE ) )
351 : {
352 0 : *num_sfm = SFM_N_HARM_FB;
353 0 : move16();
354 0 : *nb_sfm = HVQ_THRES_SFM_24k;
355 0 : move16();
356 0 : *num_env_bands = sub( *num_sfm, *nb_sfm ); /* Q0 */
357 0 : move16();
358 0 : *start_norm = HVQ_THRES_SFM_24k;
359 0 : move16();
360 : }
361 : ELSE
362 : {
363 0 : *num_sfm = SFM_N_HARM_FB;
364 0 : move16();
365 0 : *nb_sfm = HVQ_THRES_SFM_32k;
366 0 : move16();
367 0 : *num_env_bands = sub( *num_sfm, *nb_sfm ); /* Q0 */
368 0 : move16();
369 0 : *start_norm = HVQ_THRES_SFM_32k;
370 0 : move16();
371 : }
372 0 : p_sfmsize = band_len_harm; /* Q0 */
373 0 : p_sfm_start = band_start_harm; /* Q0 */
374 0 : p_sfm_end = band_end_harm; /* Q0 */
375 : }
376 : ELSE
377 : {
378 0 : *num_sfm = NB_SFM;
379 0 : move16();
380 0 : *nb_sfm = *num_sfm; /* Q0 */
381 0 : move16();
382 0 : *num_env_bands = NB_SFM;
383 0 : move16();
384 :
385 0 : p_sfmsize = band_len_HQ; /* Q0 */
386 0 : p_sfm_start = band_start_HQ; /* Q0 */
387 0 : p_sfm_end = band_end_HQ; /* Q0 */
388 : }
389 : }
390 : }
391 767 : ELSE IF( EQ_16( length, L_SPEC32k ) )
392 : {
393 767 : IF( EQ_16( hqswb_clas, HQ_HARMONIC ) )
394 : {
395 32 : *num_sfm = SFM_N_HARM;
396 32 : move16();
397 32 : *nb_sfm = SFM_N_HARM;
398 32 : move16();
399 32 : *num_env_bands = SFM_N_HARM;
400 32 : move16();
401 :
402 32 : p_sfmsize = band_len_harm; /* Q0 */
403 32 : p_sfm_start = band_start_harm; /* Q0 */
404 32 : p_sfm_end = band_end_harm; /* Q0 */
405 : }
406 735 : ELSE IF( EQ_16( hqswb_clas, HQ_HVQ ) )
407 : {
408 0 : IF( LT_32( core_brate, HQ_BWE_CROSSOVER_BRATE ) )
409 : {
410 0 : *num_sfm = SFM_N_HARM;
411 0 : move16();
412 0 : *nb_sfm = HVQ_THRES_SFM_24k;
413 0 : move16();
414 0 : *num_env_bands = sub( *num_sfm, *nb_sfm );
415 0 : move16();
416 :
417 0 : *start_norm = HVQ_THRES_SFM_24k;
418 0 : move16();
419 : }
420 : ELSE
421 : {
422 0 : *num_sfm = SFM_N_HARM;
423 0 : move16();
424 0 : *nb_sfm = HVQ_THRES_SFM_32k;
425 0 : move16();
426 0 : *num_env_bands = sub( *num_sfm, *nb_sfm );
427 0 : move16();
428 :
429 0 : *start_norm = HVQ_THRES_SFM_32k;
430 0 : move16();
431 : }
432 0 : p_sfmsize = band_len_harm; /* Q0 */
433 0 : p_sfm_start = band_start_harm; /* Q0 */
434 0 : p_sfm_end = band_end_harm; /* Q0 */
435 : }
436 735 : ELSE IF( EQ_16( hqswb_clas, HQ_GEN_SWB ) )
437 : {
438 78 : *num_sfm = SFM_N_SWB;
439 78 : move16();
440 78 : p_sfmsize = band_len_HQ; /* Q0 */
441 78 : p_sfm_start = band_start_HQ; /* Q0 */
442 78 : p_sfm_end = band_end_HQ; /* Q0 */
443 :
444 78 : IF( GE_32( core_brate, HQ_32k ) )
445 : {
446 0 : *hq_generic_offset = HQ_GENERIC_FOFFSET_32K;
447 0 : move16();
448 0 : *num_env_bands = SFM_N_STA_10k;
449 0 : move16();
450 : }
451 : ELSE /*if( EQ_32(core_brate, HQ_24k40))*/
452 : {
453 78 : *hq_generic_offset = HQ_GENERIC_FOFFSET_24K4;
454 78 : move16();
455 78 : *num_env_bands = SFM_N_STA_8k;
456 78 : move16();
457 : }
458 :
459 78 : *nb_sfm = *num_sfm;
460 78 : move16();
461 : }
462 : ELSE
463 : {
464 : /* HQ_NORMAL and HQ_TRANSIENT */
465 657 : *num_sfm = SFM_N_SWB;
466 657 : move16();
467 657 : *nb_sfm = *num_sfm;
468 657 : move16();
469 657 : *num_env_bands = SFM_N_SWB;
470 657 : move16();
471 :
472 657 : p_sfmsize = band_len_HQ; /* Q0 */
473 657 : p_sfm_start = band_start_HQ; /* Q0 */
474 657 : p_sfm_end = band_end_HQ; /* Q0 */
475 : }
476 : }
477 0 : ELSE IF( EQ_16( length, L_SPEC48k_EXT ) )
478 : {
479 0 : bw_ext = 1;
480 0 : move16();
481 0 : p_sfmsize = band_len_HQ; /* Q0 */
482 0 : p_sfm_start = band_start_HQ; /* Q0 */
483 0 : p_sfm_end = band_end_HQ; /* Q0 */
484 0 : *num_sfm = NB_SFM;
485 0 : move16();
486 : }
487 0 : ELSE IF( EQ_16( length, L_SPEC16k_EXT ) )
488 : {
489 0 : bw_ext = 1;
490 0 : move16();
491 0 : p_sfmsize = band_len_wb; /* Q0 */
492 0 : p_sfm_start = band_start_wb; /* Q0 */
493 0 : p_sfm_end = band_end_wb; /* Q0 */
494 0 : *num_sfm = SFM_N_WB;
495 0 : move16();
496 : }
497 : ELSE
498 : {
499 0 : *num_sfm = SFM_N_WB;
500 0 : move16();
501 0 : *nb_sfm = *num_sfm;
502 0 : move16();
503 0 : *num_env_bands = SFM_N_WB;
504 0 : move16();
505 :
506 0 : p_sfmsize = band_len_wb; /* Q0 */
507 0 : p_sfm_start = band_start_wb; /* Q0 */
508 0 : p_sfm_end = band_end_wb; /* Q0 */
509 : }
510 767 : IF( bw_ext )
511 : {
512 0 : FOR( i = 0; i < *num_sfm; i++ )
513 : {
514 : /*sfmsize[i] = (int16_t)(1.25f * p_sfmsize[i]);*/
515 0 : sfmsize[i] = mult_r( shl( p_sfmsize[i], 1 ), 20480 /* 1.25 in Q14 */ );
516 0 : move16();
517 : /*sfm_start[i] = (int16_t)(1.25f * p_sfm_start[i]);*/
518 0 : sfm_start[i] = mult_r( shl( p_sfm_start[i], 1 ), 20480 /* 1.25 in Q14 */ );
519 0 : move16();
520 : /*sfm_end[i] = (int16_t)(1.25f * p_sfm_end[i]);*/
521 0 : sfm_end[i] = mult_r( shl( p_sfm_end[i], 1 ), 20480 /* 1.25 in Q14 */ );
522 0 : move16();
523 : }
524 0 : *nb_sfm = *num_sfm;
525 0 : *num_env_bands = *num_sfm;
526 0 : move16();
527 0 : move16();
528 : }
529 : ELSE
530 : {
531 767 : Copy( p_sfmsize, sfmsize, *num_sfm );
532 767 : Copy( p_sfm_start, sfm_start, *num_sfm );
533 767 : Copy( p_sfm_end, sfm_end, *num_sfm );
534 : }
535 :
536 767 : *numnrmibits = extract_l( L_mult0( sub( *num_env_bands, 1 ), NORMI_BITS ) );
537 767 : move16();
538 :
539 767 : return;
540 : }
|