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 : #include "wmc_auto.h"
12 :
13 : /*--------------------------------------------------------------------------*
14 : * hq_configure()
15 : *
16 : * Configuration routine for HQ mode
17 : *--------------------------------------------------------------------------*/
18 :
19 7331 : void ivas_hq_configure_fx(
20 : const Word16 length, /* i : Frame length Q0 */
21 : const Word16 hqswb_clas, /* i : HQ SWB class Q0 */
22 : const Word32 core_brate, /* i : Codec bitrate Q0 */
23 : Word16 *num_sfm, /* o : Total number of subbands Q0 */
24 : Word16 *nb_sfm, /* o : Total number of coded bands Q0 */
25 : Word16 *start_norm, /* o : First norm to be SDE encoded Q0 */
26 : Word16 *num_env_bands, /* o : Number coded envelope bands Q0 */
27 : Word16 *numnrmibits, /* o : Number of bits in fall-back norm encoding Q0 */
28 : Word16 *hq_generic_offset, /* o : Freq offset for HQ GENERIC Q0 */
29 : Word16 *sfmsize, /* o : Subband bandwidths Q0 */
30 : Word16 *sfm_start, /* o : Subband start coefficients Q0 */
31 : Word16 *sfm_end /* o : Subband end coefficients Q0 */
32 : )
33 : {
34 : const Word16 *p_sfmsize;
35 : const Word16 *p_sfm_start;
36 : const Word16 *p_sfm_end;
37 : Word16 i, bw_ext;
38 :
39 7331 : bw_ext = 0;
40 7331 : move16();
41 :
42 7331 : *start_norm = 0;
43 7331 : move16();
44 :
45 7331 : IF( EQ_16( length, L_SPEC48k ) )
46 : {
47 5528 : IF( EQ_16( hqswb_clas, HQ_GEN_FB ) )
48 : {
49 2070 : *num_sfm = NB_SFM;
50 2070 : move16();
51 2070 : p_sfmsize = band_len_HQ; /* Q0 */
52 2070 : p_sfm_start = band_start_HQ; /* Q0 */
53 2070 : p_sfm_end = band_end_HQ; /* Q0 */
54 :
55 2070 : IF( GE_32( core_brate, HQ_32k ) )
56 : {
57 0 : *hq_generic_offset = HQ_GENERIC_FOFFSET_32K;
58 0 : move16();
59 0 : *num_env_bands = SFM_N_STA_10k;
60 0 : move16();
61 : }
62 : ELSE /*IF(EQ_32(core_brate, HQ_16k40) || EQ_32(core_brate, HQ_24k40))*/
63 : {
64 2070 : *hq_generic_offset = HQ_GENERIC_FOFFSET_24K4;
65 2070 : move16();
66 2070 : *num_env_bands = SFM_N_STA_8k;
67 2070 : move16();
68 : }
69 2070 : *nb_sfm = *num_sfm;
70 2070 : move16();
71 : }
72 : ELSE
73 : {
74 3458 : IF( EQ_16( hqswb_clas, HQ_HARMONIC ) )
75 : {
76 635 : *num_sfm = SFM_N_HARM_FB;
77 635 : move16();
78 635 : *nb_sfm = SFM_N_HARM_FB;
79 635 : move16();
80 635 : *num_env_bands = SFM_N_HARM_FB;
81 635 : move16();
82 :
83 635 : p_sfmsize = band_len_harm; /* Q0 */
84 635 : p_sfm_start = band_start_harm; /* Q0 */
85 635 : p_sfm_end = band_end_harm; /* Q0 */
86 : }
87 2823 : ELSE IF( EQ_16( hqswb_clas, HQ_HVQ ) )
88 : {
89 1051 : IF( LT_32( core_brate, HQ_BWE_CROSSOVER_BRATE ) )
90 : {
91 536 : *num_sfm = SFM_N_HARM_FB;
92 536 : move16();
93 536 : *nb_sfm = HVQ_THRES_SFM_24k;
94 536 : move16();
95 536 : *num_env_bands = sub( *num_sfm, *nb_sfm ); /* Q0 */
96 536 : move16();
97 536 : *start_norm = HVQ_THRES_SFM_24k;
98 536 : move16();
99 : }
100 : ELSE
101 : {
102 515 : *num_sfm = SFM_N_HARM_FB;
103 515 : move16();
104 515 : *nb_sfm = HVQ_THRES_SFM_32k;
105 515 : move16();
106 515 : *num_env_bands = sub( *num_sfm, *nb_sfm ); /* Q0 */
107 515 : move16();
108 515 : *start_norm = HVQ_THRES_SFM_32k;
109 515 : move16();
110 : }
111 1051 : p_sfmsize = band_len_harm; /* Q0 */
112 1051 : p_sfm_start = band_start_harm; /* Q0 */
113 1051 : p_sfm_end = band_end_harm; /* Q0 */
114 : }
115 : ELSE
116 : {
117 1772 : *num_sfm = NB_SFM;
118 1772 : move16();
119 1772 : *nb_sfm = *num_sfm; /* Q0 */
120 1772 : move16();
121 1772 : *num_env_bands = NB_SFM;
122 1772 : move16();
123 :
124 1772 : p_sfmsize = band_len_HQ; /* Q0 */
125 1772 : p_sfm_start = band_start_HQ; /* Q0 */
126 1772 : p_sfm_end = band_end_HQ; /* Q0 */
127 : }
128 : }
129 : }
130 1803 : ELSE IF( EQ_16( length, L_SPEC32k ) )
131 : {
132 1085 : IF( EQ_16( hqswb_clas, HQ_HARMONIC ) )
133 : {
134 73 : *num_sfm = SFM_N_HARM;
135 73 : move16();
136 73 : *nb_sfm = SFM_N_HARM;
137 73 : move16();
138 73 : *num_env_bands = SFM_N_HARM;
139 73 : move16();
140 :
141 73 : p_sfmsize = band_len_harm; /* Q0 */
142 73 : p_sfm_start = band_start_harm; /* Q0 */
143 73 : p_sfm_end = band_end_harm; /* Q0 */
144 : }
145 1012 : ELSE IF( EQ_16( hqswb_clas, HQ_HVQ ) )
146 : {
147 178 : IF( LT_32( core_brate, HQ_BWE_CROSSOVER_BRATE ) )
148 : {
149 172 : *num_sfm = SFM_N_HARM;
150 172 : move16();
151 172 : *nb_sfm = HVQ_THRES_SFM_24k;
152 172 : move16();
153 172 : *num_env_bands = sub( *num_sfm, *nb_sfm ); /* Q0 */
154 172 : move16();
155 :
156 172 : *start_norm = HVQ_THRES_SFM_24k;
157 172 : move16();
158 : }
159 : ELSE
160 : {
161 6 : *num_sfm = SFM_N_HARM;
162 6 : move16();
163 6 : *nb_sfm = HVQ_THRES_SFM_32k;
164 6 : move16();
165 6 : *num_env_bands = sub( *num_sfm, *nb_sfm ); /* Q0 */
166 6 : move16();
167 :
168 6 : *start_norm = HVQ_THRES_SFM_32k;
169 6 : move16();
170 : }
171 178 : p_sfmsize = band_len_harm;
172 178 : p_sfm_start = band_start_harm;
173 178 : p_sfm_end = band_end_harm;
174 : }
175 834 : ELSE IF( EQ_16( hqswb_clas, HQ_GEN_SWB ) )
176 : {
177 673 : *num_sfm = SFM_N_SWB;
178 673 : move16();
179 673 : p_sfmsize = band_len_HQ; /* Q0 */
180 673 : p_sfm_start = band_start_HQ; /* Q0 */
181 673 : p_sfm_end = band_end_HQ; /* Q0 */
182 :
183 673 : IF( GE_32( core_brate, HQ_32k ) )
184 : {
185 0 : *hq_generic_offset = HQ_GENERIC_FOFFSET_32K;
186 0 : move16();
187 0 : *num_env_bands = SFM_N_STA_10k;
188 0 : move16();
189 : }
190 : ELSE /*if( EQ_32(core_brate, HQ_24k40))*/
191 : {
192 673 : *hq_generic_offset = HQ_GENERIC_FOFFSET_24K4;
193 673 : move16();
194 673 : *num_env_bands = SFM_N_STA_8k;
195 673 : move16();
196 : }
197 :
198 673 : *nb_sfm = *num_sfm;
199 673 : move16();
200 : }
201 : ELSE
202 : {
203 : /* HQ_NORMAL and HQ_TRANSIENT */
204 161 : *num_sfm = SFM_N_SWB;
205 161 : move16();
206 161 : *nb_sfm = *num_sfm; /* Q0 */
207 161 : move16();
208 161 : *num_env_bands = SFM_N_SWB;
209 161 : move16();
210 :
211 161 : p_sfmsize = band_len_HQ; /* Q0 */
212 161 : p_sfm_start = band_start_HQ; /* Q0 */
213 161 : p_sfm_end = band_end_HQ; /* Q0 */
214 : }
215 : }
216 718 : ELSE IF( EQ_16( length, L_SPEC48k_EXT ) )
217 : {
218 89 : bw_ext = 1;
219 89 : move16();
220 89 : p_sfmsize = band_len_HQ; /* Q0 */
221 89 : p_sfm_start = band_start_HQ; /* Q0 */
222 89 : p_sfm_end = band_end_HQ; /* Q0 */
223 89 : *num_sfm = NB_SFM;
224 89 : move16();
225 : }
226 629 : ELSE IF( EQ_16( length, L_SPEC16k_EXT ) )
227 : {
228 33 : bw_ext = 1;
229 33 : move16();
230 33 : p_sfmsize = band_len_wb; /* Q0 */
231 33 : p_sfm_start = band_start_wb; /* Q0 */
232 33 : p_sfm_end = band_end_wb; /* Q0 */
233 33 : *num_sfm = SFM_N_WB;
234 33 : move16();
235 : }
236 : ELSE
237 : {
238 596 : *num_sfm = SFM_N_WB;
239 596 : move16();
240 596 : *nb_sfm = *num_sfm; /* Q0 */
241 596 : move16();
242 596 : *num_env_bands = SFM_N_WB;
243 596 : move16();
244 :
245 596 : p_sfmsize = band_len_wb; /* Q0 */
246 596 : p_sfm_start = band_start_wb; /* Q0 */
247 596 : p_sfm_end = band_end_wb; /* Q0 */
248 : }
249 7331 : IF( bw_ext )
250 : {
251 4896 : FOR( i = 0; i < *num_sfm; i++ )
252 : {
253 : /*sfmsize[i] = (int16_t)(1.25f * p_sfmsize[i]);*/
254 4774 : sfmsize[i] = mult_r( shl( p_sfmsize[i], 1 ), 20480 /* 1.25 in Q14 */ ); /* Q0 */
255 4774 : move16();
256 : /*sfm_start[i] = (int16_t)(1.25f * p_sfm_start[i]);*/
257 4774 : sfm_start[i] = mult_r( shl( p_sfm_start[i], 1 ), 20480 /* 1.25 in Q14 */ ); /* Q0 */
258 4774 : move16();
259 : /*sfm_end[i] = (int16_t)(1.25f * p_sfm_end[i]);*/
260 4774 : sfm_end[i] = mult_r( shl( p_sfm_end[i], 1 ), 20480 /* 1.25 in Q14 */ ); /* Q0 */
261 4774 : move16();
262 : }
263 122 : *nb_sfm = *num_sfm; /* Q0 */
264 122 : *num_env_bands = *num_sfm; /* Q0 */
265 122 : move16();
266 122 : move16();
267 : }
268 : ELSE
269 : {
270 7209 : Copy( p_sfmsize, sfmsize, *num_sfm );
271 7209 : Copy( p_sfm_start, sfm_start, *num_sfm );
272 7209 : Copy( p_sfm_end, sfm_end, *num_sfm );
273 : }
274 :
275 7331 : *numnrmibits = extract_l( L_mult0( sub( *num_env_bands, 1 ), NORMI_BITS ) );
276 7331 : move16();
277 :
278 7331 : return;
279 : }
280 :
281 785 : void hq_configure_evs_fx(
282 : const Word16 length, /* i : Frame length Q0 */
283 : const Word16 hqswb_clas, /* i : HQ SWB class Q0 */
284 : const Word32 core_brate, /* i : Codec bitrate Q0 */
285 : Word16 *num_sfm, /* o : Total number of subbands Q0 */
286 : Word16 *nb_sfm, /* o : Total number of coded bands Q0 */
287 : Word16 *start_norm, /* o : First norm to be SDE encoded Q0 */
288 : Word16 *num_env_bands, /* o : Number coded envelope bands Q0 */
289 : Word16 *numnrmibits, /* o : Number of bits in fall-back norm encoding Q0 */
290 : Word16 *hq_generic_offset, /* o : Freq offset for HQ GENERIC Q0 */
291 : Word16 *sfmsize, /* o : Subband bandwidths Q0 */
292 : Word16 *sfm_start, /* o : Subband start coefficients Q0 */
293 : Word16 *sfm_end /* o : Subband end coefficients Q0 */
294 : )
295 : {
296 : const Word16 *p_sfmsize;
297 : const Word16 *p_sfm_start;
298 : const Word16 *p_sfm_end;
299 : Word16 i, bw_ext;
300 :
301 785 : bw_ext = 0;
302 785 : move16();
303 :
304 785 : *start_norm = 0;
305 785 : move16();
306 :
307 785 : IF( EQ_16( length, L_FRAME48k ) ) /*tbv SOLVED_COMP_ENC_DEC*/
308 : {
309 0 : IF( EQ_16( hqswb_clas, HQ_GEN_FB ) )
310 : {
311 0 : *num_sfm = NB_SFM;
312 0 : move16();
313 0 : p_sfmsize = band_len_HQ; /* Q0 */
314 0 : p_sfm_start = band_start_HQ; /* Q0 */
315 0 : p_sfm_end = band_end_HQ; /* Q0 */
316 :
317 0 : IF( GE_32( core_brate, HQ_32k ) )
318 : {
319 0 : *hq_generic_offset = HQ_GENERIC_FOFFSET_32K;
320 0 : move16();
321 0 : *num_env_bands = SFM_N_STA_10k;
322 0 : move16();
323 : }
324 : ELSE /*IF(EQ_32(core_brate, HQ_16k40) || EQ_32(core_brate, HQ_24k40))*/
325 : {
326 0 : *hq_generic_offset = HQ_GENERIC_FOFFSET_24K4;
327 0 : *num_env_bands = SFM_N_STA_8k;
328 0 : move16();
329 0 : move16();
330 : }
331 0 : *nb_sfm = *num_sfm; /* Q0 */
332 0 : move16();
333 : }
334 : ELSE
335 : {
336 0 : IF( EQ_16( hqswb_clas, HQ_HARMONIC ) )
337 : {
338 0 : *num_sfm = SFM_N_HARM_FB;
339 0 : move16();
340 0 : *nb_sfm = SFM_N_HARM_FB;
341 0 : move16();
342 0 : *num_env_bands = SFM_N_HARM_FB;
343 0 : move16();
344 :
345 0 : p_sfmsize = band_len_harm; /* Q0 */
346 0 : p_sfm_start = band_start_harm; /* Q0 */
347 0 : p_sfm_end = band_end_harm; /* Q0 */
348 : }
349 0 : ELSE IF( EQ_16( hqswb_clas, HQ_HVQ ) )
350 : {
351 0 : IF( LT_32( core_brate, HQ_BWE_CROSSOVER_BRATE ) )
352 : {
353 0 : *num_sfm = SFM_N_HARM_FB;
354 0 : move16();
355 0 : *nb_sfm = HVQ_THRES_SFM_24k;
356 0 : move16();
357 0 : *num_env_bands = sub( *num_sfm, *nb_sfm ); /* Q0 */
358 0 : move16();
359 0 : *start_norm = HVQ_THRES_SFM_24k;
360 0 : move16();
361 : }
362 : ELSE
363 : {
364 0 : *num_sfm = SFM_N_HARM_FB;
365 0 : move16();
366 0 : *nb_sfm = HVQ_THRES_SFM_32k;
367 0 : move16();
368 0 : *num_env_bands = sub( *num_sfm, *nb_sfm ); /* Q0 */
369 0 : move16();
370 0 : *start_norm = HVQ_THRES_SFM_32k;
371 0 : move16();
372 : }
373 0 : p_sfmsize = band_len_harm; /* Q0 */
374 0 : p_sfm_start = band_start_harm; /* Q0 */
375 0 : p_sfm_end = band_end_harm; /* Q0 */
376 : }
377 : ELSE
378 : {
379 0 : *num_sfm = NB_SFM;
380 0 : move16();
381 0 : *nb_sfm = *num_sfm; /* Q0 */
382 0 : move16();
383 0 : *num_env_bands = NB_SFM;
384 0 : move16();
385 :
386 0 : p_sfmsize = band_len_HQ; /* Q0 */
387 0 : p_sfm_start = band_start_HQ; /* Q0 */
388 0 : p_sfm_end = band_end_HQ; /* Q0 */
389 : }
390 : }
391 : }
392 785 : ELSE IF( EQ_16( length, L_SPEC32k ) )
393 : {
394 785 : IF( EQ_16( hqswb_clas, HQ_HARMONIC ) )
395 : {
396 39 : *num_sfm = SFM_N_HARM;
397 39 : move16();
398 39 : *nb_sfm = SFM_N_HARM;
399 39 : move16();
400 39 : *num_env_bands = SFM_N_HARM;
401 39 : move16();
402 :
403 39 : p_sfmsize = band_len_harm; /* Q0 */
404 39 : p_sfm_start = band_start_harm; /* Q0 */
405 39 : p_sfm_end = band_end_harm; /* Q0 */
406 : }
407 746 : ELSE IF( EQ_16( hqswb_clas, HQ_HVQ ) )
408 : {
409 0 : IF( LT_32( core_brate, HQ_BWE_CROSSOVER_BRATE ) )
410 : {
411 0 : *num_sfm = SFM_N_HARM;
412 0 : move16();
413 0 : *nb_sfm = HVQ_THRES_SFM_24k;
414 0 : move16();
415 0 : *num_env_bands = sub( *num_sfm, *nb_sfm );
416 0 : move16();
417 :
418 0 : *start_norm = HVQ_THRES_SFM_24k;
419 0 : move16();
420 : }
421 : ELSE
422 : {
423 0 : *num_sfm = SFM_N_HARM;
424 0 : move16();
425 0 : *nb_sfm = HVQ_THRES_SFM_32k;
426 0 : move16();
427 0 : *num_env_bands = sub( *num_sfm, *nb_sfm );
428 0 : move16();
429 :
430 0 : *start_norm = HVQ_THRES_SFM_32k;
431 0 : move16();
432 : }
433 0 : p_sfmsize = band_len_harm; /* Q0 */
434 0 : p_sfm_start = band_start_harm; /* Q0 */
435 0 : p_sfm_end = band_end_harm; /* Q0 */
436 : }
437 746 : ELSE IF( EQ_16( hqswb_clas, HQ_GEN_SWB ) )
438 : {
439 89 : *num_sfm = SFM_N_SWB;
440 89 : move16();
441 89 : p_sfmsize = band_len_HQ; /* Q0 */
442 89 : p_sfm_start = band_start_HQ; /* Q0 */
443 89 : p_sfm_end = band_end_HQ; /* Q0 */
444 :
445 89 : IF( GE_32( core_brate, HQ_32k ) )
446 : {
447 0 : *hq_generic_offset = HQ_GENERIC_FOFFSET_32K;
448 0 : move16();
449 0 : *num_env_bands = SFM_N_STA_10k;
450 0 : move16();
451 : }
452 : ELSE /*if( EQ_32(core_brate, HQ_24k40))*/
453 : {
454 89 : *hq_generic_offset = HQ_GENERIC_FOFFSET_24K4;
455 89 : move16();
456 89 : *num_env_bands = SFM_N_STA_8k;
457 89 : move16();
458 : }
459 :
460 89 : *nb_sfm = *num_sfm;
461 89 : move16();
462 : }
463 : ELSE
464 : {
465 : /* HQ_NORMAL and HQ_TRANSIENT */
466 657 : *num_sfm = SFM_N_SWB;
467 657 : move16();
468 657 : *nb_sfm = *num_sfm;
469 657 : move16();
470 657 : *num_env_bands = SFM_N_SWB;
471 657 : move16();
472 :
473 657 : p_sfmsize = band_len_HQ; /* Q0 */
474 657 : p_sfm_start = band_start_HQ; /* Q0 */
475 657 : p_sfm_end = band_end_HQ; /* Q0 */
476 : }
477 : }
478 0 : ELSE IF( EQ_16( length, L_SPEC48k_EXT ) )
479 : {
480 0 : bw_ext = 1;
481 0 : move16();
482 0 : p_sfmsize = band_len_HQ; /* Q0 */
483 0 : p_sfm_start = band_start_HQ; /* Q0 */
484 0 : p_sfm_end = band_end_HQ; /* Q0 */
485 0 : *num_sfm = NB_SFM;
486 0 : move16();
487 : }
488 0 : ELSE IF( EQ_16( length, L_SPEC16k_EXT ) )
489 : {
490 0 : bw_ext = 1;
491 0 : move16();
492 0 : p_sfmsize = band_len_wb; /* Q0 */
493 0 : p_sfm_start = band_start_wb; /* Q0 */
494 0 : p_sfm_end = band_end_wb; /* Q0 */
495 0 : *num_sfm = SFM_N_WB;
496 0 : move16();
497 : }
498 : ELSE
499 : {
500 0 : *num_sfm = SFM_N_WB;
501 0 : move16();
502 0 : *nb_sfm = *num_sfm;
503 0 : move16();
504 0 : *num_env_bands = SFM_N_WB;
505 0 : move16();
506 :
507 0 : p_sfmsize = band_len_wb; /* Q0 */
508 0 : p_sfm_start = band_start_wb; /* Q0 */
509 0 : p_sfm_end = band_end_wb; /* Q0 */
510 : }
511 785 : IF( bw_ext )
512 : {
513 0 : FOR( i = 0; i < *num_sfm; i++ )
514 : {
515 : /*sfmsize[i] = (int16_t)(1.25f * p_sfmsize[i]);*/
516 0 : sfmsize[i] = mult_r( shl( p_sfmsize[i], 1 ), 20480 /* 1.25 in Q14 */ );
517 0 : move16();
518 : /*sfm_start[i] = (int16_t)(1.25f * p_sfm_start[i]);*/
519 0 : sfm_start[i] = mult_r( shl( p_sfm_start[i], 1 ), 20480 /* 1.25 in Q14 */ );
520 0 : move16();
521 : /*sfm_end[i] = (int16_t)(1.25f * p_sfm_end[i]);*/
522 0 : sfm_end[i] = mult_r( shl( p_sfm_end[i], 1 ), 20480 /* 1.25 in Q14 */ );
523 0 : move16();
524 : }
525 0 : *nb_sfm = *num_sfm;
526 0 : *num_env_bands = *num_sfm;
527 0 : move16();
528 0 : move16();
529 : }
530 : ELSE
531 : {
532 785 : Copy( p_sfmsize, sfmsize, *num_sfm );
533 785 : Copy( p_sfm_start, sfm_start, *num_sfm );
534 785 : Copy( p_sfm_end, sfm_end, *num_sfm );
535 : }
536 :
537 785 : *numnrmibits = extract_l( L_mult0( sub( *num_env_bands, 1 ), NORMI_BITS ) );
538 785 : move16();
539 :
540 785 : return;
541 : }
542 :
543 7772 : void hq_configure_fx(
544 : const Word16 length, /* i : Frame length Q0 */
545 : const Word16 hqswb_clas, /* i : HQ SWB class Q0 */
546 : const Word32 core_brate, /* i : Codec bitrate Q0 */
547 : Word16 *num_sfm, /* o : Total number of subbands Q0 */
548 : Word16 *nb_sfm, /* o : Total number of coded bands Q0 */
549 : Word16 *start_norm, /* o : First norm to be SDE encoded Q0 */
550 : Word16 *num_env_bands, /* o : Number coded envelope bands Q0 */
551 : Word16 *numnrmibits, /* o : Number of bits in fall-back norm encoding Q0 */
552 : Word16 *hq_generic_offset, /* o : Freq offset for HQ GENERIC Q0 */
553 : Word16 *sfmsize, /* o : Subband bandwidths Q0 */
554 : Word16 *sfm_start, /* o : Subband start coefficients Q0 */
555 : Word16 *sfm_end /* o : Subband end coefficients Q0 */
556 : )
557 : {
558 : const Word16 *p_sfmsize;
559 : const Word16 *p_sfm_start;
560 : const Word16 *p_sfm_end;
561 : Word16 i, bw_ext;
562 :
563 7772 : bw_ext = 0;
564 7772 : move16();
565 :
566 7772 : *start_norm = 0;
567 7772 : move16();
568 :
569 7772 : IF( EQ_16( length, L_SPEC48k ) )
570 : {
571 6091 : IF( EQ_16( hqswb_clas, HQ_GEN_FB ) )
572 : {
573 2210 : *num_sfm = NB_SFM;
574 2210 : move16();
575 2210 : p_sfmsize = band_len_HQ; /* Q0 */
576 2210 : p_sfm_start = band_start_HQ; /* Q0 */
577 2210 : p_sfm_end = band_end_HQ; /* Q0 */
578 :
579 2210 : IF( GE_32( core_brate, HQ_32k ) )
580 : {
581 0 : *hq_generic_offset = HQ_GENERIC_FOFFSET_32K;
582 0 : move16();
583 0 : *num_env_bands = SFM_N_STA_10k;
584 0 : move16();
585 : }
586 : ELSE /*IF(EQ_32(core_brate, HQ_16k40) || EQ_32(core_brate, HQ_24k40))*/
587 : {
588 2210 : *hq_generic_offset = HQ_GENERIC_FOFFSET_24K4;
589 2210 : *num_env_bands = SFM_N_STA_8k;
590 2210 : move16();
591 2210 : move16();
592 : }
593 2210 : *nb_sfm = *num_sfm;
594 2210 : move16();
595 : }
596 : ELSE
597 : {
598 3881 : IF( EQ_16( hqswb_clas, HQ_HARMONIC ) )
599 : {
600 692 : *num_sfm = SFM_N_HARM_FB;
601 692 : move16();
602 692 : *nb_sfm = SFM_N_HARM_FB;
603 692 : move16();
604 692 : *num_env_bands = SFM_N_HARM_FB;
605 692 : move16();
606 :
607 692 : p_sfmsize = band_len_harm; /* Q0 */
608 692 : p_sfm_start = band_start_harm; /* Q0 */
609 692 : p_sfm_end = band_end_harm; /* Q0 */
610 : }
611 3189 : ELSE IF( EQ_16( hqswb_clas, HQ_HVQ ) )
612 : {
613 1231 : IF( LT_32( core_brate, HQ_BWE_CROSSOVER_BRATE ) )
614 : {
615 626 : *num_sfm = SFM_N_HARM_FB;
616 626 : move16();
617 626 : *nb_sfm = HVQ_THRES_SFM_24k;
618 626 : move16();
619 626 : *num_env_bands = sub( *num_sfm, *nb_sfm );
620 626 : move16();
621 626 : *start_norm = HVQ_THRES_SFM_24k;
622 626 : move16();
623 : }
624 : ELSE
625 : {
626 605 : *num_sfm = SFM_N_HARM_FB;
627 605 : move16();
628 605 : *nb_sfm = HVQ_THRES_SFM_32k;
629 605 : move16();
630 605 : *num_env_bands = sub( *num_sfm, *nb_sfm );
631 605 : move16();
632 605 : *start_norm = HVQ_THRES_SFM_32k;
633 605 : move16();
634 : }
635 1231 : p_sfmsize = band_len_harm; /* Q0 */
636 1231 : p_sfm_start = band_start_harm; /* Q0 */
637 1231 : p_sfm_end = band_end_harm; /* Q0 */
638 : }
639 : ELSE
640 : {
641 1958 : *num_sfm = NB_SFM;
642 1958 : move16();
643 1958 : *nb_sfm = *num_sfm; /* Q0 */
644 1958 : move16();
645 1958 : *num_env_bands = NB_SFM;
646 1958 : move16();
647 :
648 1958 : p_sfmsize = band_len_HQ; /* Q0 */
649 1958 : p_sfm_start = band_start_HQ; /* Q0 */
650 1958 : p_sfm_end = band_end_HQ; /* Q0 */
651 : }
652 : }
653 : }
654 1681 : ELSE IF( EQ_16( length, L_SPEC32k ) )
655 : {
656 1041 : IF( EQ_16( hqswb_clas, HQ_HARMONIC ) )
657 : {
658 87 : *num_sfm = SFM_N_HARM;
659 87 : move16();
660 87 : *nb_sfm = SFM_N_HARM;
661 87 : move16();
662 87 : *num_env_bands = SFM_N_HARM;
663 87 : move16();
664 :
665 87 : p_sfmsize = band_len_harm; /* Q0 */
666 87 : p_sfm_start = band_start_harm; /* Q0 */
667 87 : p_sfm_end = band_end_harm; /* Q0 */
668 : }
669 954 : ELSE IF( EQ_16( hqswb_clas, HQ_HVQ ) )
670 : {
671 235 : IF( LT_32( core_brate, HQ_BWE_CROSSOVER_BRATE ) )
672 : {
673 227 : *num_sfm = SFM_N_HARM;
674 227 : move16();
675 227 : *nb_sfm = HVQ_THRES_SFM_24k;
676 227 : move16();
677 227 : *num_env_bands = sub( *num_sfm, *nb_sfm ); /* Q0 */
678 227 : move16();
679 :
680 227 : *start_norm = HVQ_THRES_SFM_24k;
681 227 : move16();
682 : }
683 : ELSE
684 : {
685 8 : *num_sfm = SFM_N_HARM;
686 8 : move16();
687 8 : *nb_sfm = HVQ_THRES_SFM_32k;
688 8 : move16();
689 8 : *num_env_bands = sub( *num_sfm, *nb_sfm ); /* Q0 */
690 8 : move16();
691 :
692 8 : *start_norm = HVQ_THRES_SFM_32k;
693 8 : move16();
694 : }
695 235 : p_sfmsize = band_len_harm;
696 235 : p_sfm_start = band_start_harm;
697 235 : p_sfm_end = band_end_harm;
698 : }
699 719 : ELSE IF( EQ_16( hqswb_clas, HQ_GEN_SWB ) )
700 : {
701 597 : *num_sfm = SFM_N_SWB;
702 597 : move16();
703 597 : p_sfmsize = band_len_HQ; /* Q0 */
704 597 : p_sfm_start = band_start_HQ; /* Q0 */
705 597 : p_sfm_end = band_end_HQ; /* Q0 */
706 :
707 597 : IF( GE_32( core_brate, HQ_32k ) )
708 : {
709 0 : *hq_generic_offset = HQ_GENERIC_FOFFSET_32K;
710 0 : move16();
711 0 : *num_env_bands = SFM_N_STA_10k;
712 0 : move16();
713 : }
714 : ELSE /*if( EQ_32(core_brate, HQ_24k40))*/
715 : {
716 597 : *hq_generic_offset = HQ_GENERIC_FOFFSET_24K4;
717 597 : move16();
718 597 : *num_env_bands = SFM_N_STA_8k;
719 597 : move16();
720 : }
721 :
722 597 : *nb_sfm = *num_sfm;
723 597 : move16();
724 : }
725 : ELSE
726 : {
727 : /* HQ_NORMAL and HQ_TRANSIENT */
728 122 : *num_sfm = SFM_N_SWB;
729 122 : move16();
730 122 : *nb_sfm = *num_sfm;
731 122 : move16();
732 122 : *num_env_bands = SFM_N_SWB;
733 122 : move16();
734 :
735 122 : p_sfmsize = band_len_HQ; /* Q0 */
736 122 : p_sfm_start = band_start_HQ; /* Q0 */
737 122 : p_sfm_end = band_end_HQ; /* Q0 */
738 : }
739 : }
740 640 : ELSE IF( EQ_16( length, L_SPEC48k_EXT ) )
741 : {
742 120 : bw_ext = 1;
743 120 : p_sfmsize = band_len_HQ; /* Q0 */
744 120 : p_sfm_start = band_start_HQ; /* Q0 */
745 120 : p_sfm_end = band_end_HQ; /* Q0 */
746 120 : *num_sfm = NB_SFM;
747 : }
748 520 : ELSE IF( EQ_16( length, L_SPEC16k_EXT ) )
749 : {
750 25 : bw_ext = 1;
751 25 : move16();
752 25 : p_sfmsize = band_len_wb; /* Q0 */
753 25 : p_sfm_start = band_start_wb; /* Q0 */
754 25 : p_sfm_end = band_end_wb; /* Q0 */
755 25 : *num_sfm = SFM_N_WB;
756 25 : move16();
757 : }
758 : ELSE
759 : {
760 495 : *num_sfm = SFM_N_WB;
761 495 : move16();
762 495 : *nb_sfm = *num_sfm; /* Q0 */
763 495 : move16();
764 495 : *num_env_bands = SFM_N_WB;
765 495 : move16();
766 :
767 495 : p_sfmsize = band_len_wb; /* Q0 */
768 495 : p_sfm_start = band_start_wb; /* Q0 */
769 495 : p_sfm_end = band_end_wb; /* Q0 */
770 : }
771 7772 : IF( bw_ext )
772 : {
773 6075 : FOR( i = 0; i < *num_sfm; i++ )
774 : {
775 : /*sfmsize[i] = (int16_t)(1.25f * p_sfmsize[i]);*/
776 5930 : sfmsize[i] = mult_r( shl( p_sfmsize[i], 1 ), 20480 /* 1.25 in Q14 */ ); /* Q0 */
777 5930 : move16();
778 : /*sfm_start[i] = (int16_t)(1.25f * p_sfm_start[i]);*/
779 5930 : sfm_start[i] = mult_r( shl( p_sfm_start[i], 1 ), 20480 /* 1.25 in Q14 */ ); /* Q0 */
780 5930 : move16();
781 : /*sfm_end[i] = (int16_t)(1.25f * p_sfm_end[i]);*/
782 5930 : sfm_end[i] = mult_r( shl( p_sfm_end[i], 1 ), 20480 /* 1.25 in Q14 */ ); /* Q0 */
783 5930 : move16();
784 : }
785 145 : *nb_sfm = *num_sfm; /* Q0 */
786 145 : *num_env_bands = *num_sfm; /* Q0 */
787 145 : move16();
788 145 : move16();
789 : }
790 : ELSE
791 : {
792 7627 : Copy( p_sfmsize, sfmsize, *num_sfm );
793 7627 : Copy( p_sfm_start, sfm_start, *num_sfm );
794 7627 : Copy( p_sfm_end, sfm_end, *num_sfm );
795 : }
796 :
797 7772 : *numnrmibits = extract_l( L_mult0( sub( *num_env_bands, 1 ), NORMI_BITS ) );
798 7772 : move16();
799 :
800 7772 : return;
801 : }
|