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" /* Compilation switches */
7 : #include "cnst.h" /* Common constants */
8 : #include "rom_com.h" /* Static table prototypes */
9 : #include "prot_fx.h" /* Function prototypes */
10 :
11 10848 : void bitalloc_fx(
12 : Word16 *y, /* i : reordered norm of sub-vectors Q0 */
13 : Word16 *idx, /* i : reordered sub-vector indices Q0 */
14 : Word16 sum, /* i : number of available bits Q0 */
15 : Word16 N, /* i : number of norms Q0 */
16 : Word16 K, /* i : maximum number of bits per dimension Q0 */
17 : Word16 *r, /* o : bit-allacation vector Q0 */
18 : const Word16 *sfmsize, /* i : band length Q0 */
19 : const Word16 hqswb_clas /* i : signal classification flag Q0 */
20 : )
21 : {
22 : Word16 i, j, k, n, m, v, im;
23 : Word16 diff, temp;
24 : Word16 fac;
25 : Word16 ii;
26 : #ifndef ISSUE_1836_replace_overflow_libcom
27 : #ifdef BASOP_NOGLOB_DECLARE_LOCAL
28 : Flag Overflow = 0;
29 : move32();
30 : #endif
31 : #endif
32 10848 : Word16 SFM_thr = SFM_G1G2;
33 10848 : move16();
34 :
35 10848 : N = sub( N, 1 ); /* Q0 */
36 :
37 10848 : if ( EQ_16( hqswb_clas, HQ_HARMONIC ) )
38 : {
39 1570 : SFM_thr = 22; /* Q0 */
40 1570 : move16();
41 : }
42 :
43 10848 : fac = 3;
44 10848 : move16();
45 10848 : K = sub( K, 2 ); /* Q0 */
46 10848 : im = 1;
47 10848 : move16();
48 10848 : diff = sum; /* Q0 */
49 10848 : move16();
50 10848 : n = shr( sum, 3 ); /* Q0 */
51 480526 : FOR( i = 0; i < n; i++ )
52 : {
53 480526 : k = 0;
54 480526 : move16();
55 480526 : temp = y[0];
56 480526 : move16();
57 6654533 : FOR( m = 1; m < im; m++ )
58 : {
59 : #ifdef ISSUE_1836_replace_overflow_libcom
60 6174007 : v = sub_sat( temp, y[m] ); /* Q0 */
61 : #else
62 : v = sub_o( temp, y[m], &Overflow ); /* Q0 */
63 : #endif
64 6174007 : temp = s_max( temp, y[m] );
65 6174007 : if ( v < 0 )
66 : {
67 467615 : k = m; /* Q0 */
68 467615 : move16();
69 : }
70 : }
71 :
72 480526 : IF( LT_16( temp, y[m] ) )
73 : {
74 236147 : k = m;
75 236147 : move16();
76 236147 : if ( LT_16( im, N ) )
77 : {
78 235901 : im = add( im, 1 ); /* Q0 */
79 : }
80 : }
81 :
82 480526 : j = idx[k];
83 480526 : move16();
84 :
85 480526 : test();
86 480526 : IF( GE_16( sum, sfmsize[j] ) && LT_16( r[j], K ) )
87 : {
88 476454 : y[k] = sub( y[k], fac ); /* Q0 */
89 476454 : move16();
90 476454 : r[j] = add( r[j], 1 ); /* Q0 */
91 476454 : move16();
92 :
93 476454 : if ( GE_16( r[j], K ) )
94 : {
95 1090 : y[k] = -32768;
96 1090 : move16();
97 : }
98 476454 : sum = sub( sum, sfmsize[j] ); /* Q0 */
99 : }
100 : ELSE
101 : {
102 4072 : y[k] = -32768;
103 4072 : move16();
104 4072 : k = add( k, 1 );
105 4072 : test();
106 4072 : if ( EQ_16( k, im ) && LT_16( im, N ) )
107 : {
108 2177 : im = add( im, 1 ); /* Q0 */
109 : }
110 : }
111 :
112 480526 : test();
113 480526 : IF( ( LT_16( sum, sfmsize[SFM_G1 - 1] ) ) || ( EQ_16( diff, sum ) ) ) /* sfmsize[SFM_G1-1] matches WID_G1, but also allows for extended BWs used in ACELP->HQ switching. */
114 : {
115 : BREAK;
116 : }
117 :
118 469678 : diff = sum; /* Q0 */
119 469678 : move16();
120 469678 : v = sub( N, 1 ); /* Q0 */
121 :
122 469678 : IF( GT_16( k, v ) )
123 : {
124 490 : FOR( ii = 0; ii <= N; ii++ )
125 : {
126 490 : IF( GT_16( y[ii], -32768 ) )
127 : {
128 234 : if ( LT_16( ii, N ) )
129 : {
130 234 : im = add( ii, 1 ); /* Q0 */
131 : }
132 234 : BREAK;
133 : }
134 : }
135 : }
136 : }
137 :
138 :
139 10848 : IF( GE_16( sum, sfmsize[SFM_G1] ) ) /* sfmsize[SFM_G1] matches WID_G2, but also allows for extended BWs used in ACELP->HQ switching. */
140 : {
141 40870 : FOR( i = 0; i <= N; i++ )
142 : {
143 40462 : j = idx[i]; /* Q0 */
144 40462 : move16();
145 40462 : test();
146 40462 : test();
147 40462 : IF( GE_16( j, SFM_G1 ) && LT_16( j, SFM_thr ) && r[j] == 0 )
148 : {
149 1090 : r[j] = 1;
150 1090 : move16();
151 1090 : sum = sub( sum, sfmsize[j] ); /* Q0 */
152 1090 : IF( LT_16( sum, sfmsize[SFM_G1] ) )
153 : {
154 1032 : BREAK;
155 : }
156 : }
157 : }
158 : }
159 :
160 10848 : IF( GE_16( sum, sfmsize[SFM_G1] ) )
161 : {
162 8582 : FOR( i = 0; i <= N; i++ )
163 : {
164 8526 : j = idx[i];
165 8526 : move16();
166 8526 : test();
167 8526 : test();
168 8526 : IF( GE_16( j, SFM_G1 ) && LT_16( j, SFM_thr ) && EQ_16( r[j], 1 ) )
169 : {
170 366 : r[j] = 2;
171 366 : move16();
172 366 : sum = sub( sum, sfmsize[j] ); /* Q0 */
173 366 : IF( LT_16( sum, sfmsize[SFM_G1] ) )
174 : {
175 352 : BREAK;
176 : }
177 : }
178 : }
179 : }
180 :
181 10848 : IF( GE_16( sum, sfmsize[SFM_G1 - 1] ) )
182 : {
183 93603 : FOR( i = 0; i <= N; i++ )
184 : {
185 92156 : j = idx[i]; /* Q0 */
186 92156 : move16();
187 92156 : test();
188 92156 : IF( LT_16( j, SFM_G1 ) && r[j] == 0 )
189 : {
190 1534 : r[j] = 1;
191 1534 : move16();
192 1534 : sum = sub( sum, sfmsize[j] ); /* Q0 */
193 1534 : IF( LT_16( sum, sfmsize[SFM_G1 - 1] ) )
194 : {
195 1534 : BREAK;
196 : }
197 : }
198 : }
199 : }
200 :
201 10848 : IF( GE_16( sum, sfmsize[SFM_G1 - 1] ) )
202 : {
203 35703 : FOR( i = 0; i <= N; i++ )
204 : {
205 35207 : j = idx[i]; /* Q0 */
206 35207 : move16();
207 35207 : test();
208 35207 : IF( LT_16( j, SFM_G1 ) && EQ_16( r[j], 1 ) )
209 : {
210 967 : r[j] = 2; /* Q0 */
211 967 : move16();
212 967 : sum = sub( sum, sfmsize[j] ); /* Q0 */
213 967 : IF( LT_16( sum, sfmsize[SFM_G1 - 1] ) )
214 : {
215 951 : BREAK;
216 : }
217 : }
218 : }
219 : }
220 :
221 10848 : return;
222 : }
223 :
224 : #define WMC_TOOL_SKIP
225 :
226 : /*-------------------------------------------------------------------*
227 : * BitAllocF()
228 : *
229 : * Fractional bit allocation
230 : *-------------------------------------------------------------------*/
231 :
232 1401 : Word16 BitAllocF_fx(
233 : Word16 *y, /* i : norm of sub-vectors :Q0 */
234 : Word32 bit_rate, /* i : bitrate :Q0 */
235 : Word16 B, /* i : number of available bits :Q0 */
236 : Word16 N, /* i : number of sub-vectors :Q0 */
237 : Word16 *R, /* o : bit-allocation indicator :Q0 */
238 : Word16 *Rsubband_fx /* o : sub-band bit-allocation vector :Q3 */
239 : ,
240 : const Word16 hqswb_clas, /* i : hq swb class :Q0 */
241 : const Word16 num_env_bands /* i : Number sub bands to be encoded for HF GNERIC :Q0 */
242 : )
243 : {
244 : Word16 fac;
245 1401 : Word16 i, n, Nmin, Bits, bs, low_rate = 0;
246 1401 : move16();
247 :
248 : Word16 m_fx;
249 : Word32 t_fx, B_fx;
250 : Word32 L_tmp1, L_tmp2, L_tmp3;
251 : Word16 tmp, exp1, exp2;
252 : Word32 Rsubband_w32_fx[NB_SFM]; /* Q15 */
253 : Word16 B_w16_fx;
254 : #ifndef ISSUE_1836_replace_overflow_libcom
255 : #ifdef BASOP_NOGLOB_DECLARE_LOCAL
256 : Flag Overflow = 0;
257 : move32();
258 : #endif
259 : #endif
260 :
261 1401 : set32_fx( Rsubband_w32_fx, 0, NB_SFM );
262 :
263 1401 : fac = 3;
264 1401 : move16();
265 :
266 1401 : IF( LT_32( bit_rate, 32000 ) )
267 : {
268 1401 : bs = 2;
269 1401 : move16();
270 : }
271 : ELSE
272 : {
273 0 : bs = 3;
274 0 : move16();
275 : }
276 1401 : low_rate = 1;
277 1401 : move16();
278 :
279 1401 : Nmin = N; /* Q0 */
280 1401 : move16();
281 1401 : if ( GT_16( Nmin, SFM_N ) )
282 : {
283 1401 : Nmin = SFM_N; /* Q0 */
284 1401 : move16();
285 : }
286 :
287 : /* Initial bits distribution */
288 1401 : test();
289 1401 : IF( EQ_16( hqswb_clas, HQ_GEN_SWB ) || EQ_16( hqswb_clas, HQ_GEN_FB ) )
290 : {
291 : /* Initial bits distribution */
292 1281 : L_tmp1 = 0;
293 1281 : move16();
294 1281 : m_fx = 0;
295 1281 : move16();
296 35868 : FOR( i = 0; i < num_env_bands; i++ )
297 : {
298 34587 : L_tmp1 = L_mac0( L_tmp1, Nb[i], y[i] ); /* Q0 */
299 : }
300 1281 : L_tmp1 = L_msu0( L_tmp1, fac, B ); /* Q0 */
301 :
302 1281 : t_fx = L_deposit_l( 0 );
303 1281 : n = 0;
304 1281 : move16();
305 1281 : tmp = add( band_end_HQ[num_env_bands - 1], shl( band_end_HQ[num_env_bands - 1], 1 ) ); /* Q0 */
306 1281 : exp1 = norm_s( tmp );
307 1281 : tmp = div_s( 16384, shl( tmp, exp1 ) ); /*15 + 14 - exp1*/
308 1281 : exp2 = norm_s( tmp );
309 1281 : tmp = shl( tmp, exp2 );
310 1281 : exp1 = add( 29, sub( exp2, exp1 ) );
311 :
312 51240 : FOR( i = 0; i < N; i++ )
313 : {
314 49959 : L_tmp2 = L_sub( L_mult0( y[i], band_end_HQ[num_env_bands - 1] ), L_tmp1 ); /* Q0 */
315 49959 : Rsubband_w32_fx[i] = L_mult0( extract_l( L_tmp2 ), Nb[i] );
316 49959 : move32(); /*Q0*/
317 49959 : IF( Rsubband_w32_fx[i] > 0 )
318 : {
319 28312 : n = add( n, Nb[i] );
320 28312 : Rsubband_w32_fx[i] = Mult_32_16( Rsubband_w32_fx[i], tmp );
321 28312 : move32(); /*exp1 - 15*/
322 28312 : Rsubband_w32_fx[i] = L_shl( Rsubband_w32_fx[i], sub( 30, exp1 ) ); /*Q15*/
323 :
324 28312 : t_fx = L_add( t_fx, Rsubband_w32_fx[i] ); /*Q0*/
325 : }
326 : ELSE
327 : {
328 21647 : Rsubband_w32_fx[i] = L_deposit_l( 0 );
329 21647 : move32();
330 : }
331 : }
332 : }
333 : ELSE
334 : {
335 : /* Initial bits distribution */
336 120 : L_tmp1 = 0;
337 120 : move16();
338 120 : m_fx = 0;
339 120 : move16();
340 4800 : FOR( i = 0; i < N; i++ )
341 : {
342 4680 : L_tmp1 = L_mac0( L_tmp1, Nb[i], y[i] ); /* Q0 */
343 : }
344 120 : L_tmp1 = L_msu0( L_tmp1, fac, B ); /* Q0 */
345 :
346 :
347 120 : t_fx = L_deposit_l( 0 );
348 120 : n = 0;
349 120 : move16();
350 120 : tmp = add( band_end_HQ[N - 1], shl( band_end_HQ[N - 1], 1 ) ); /* Q0 */
351 120 : exp1 = norm_s( tmp );
352 120 : tmp = div_s( 16384, shl( tmp, exp1 ) ); /*15 + 14 - exp1*/
353 120 : exp2 = norm_s( tmp );
354 120 : tmp = shl( tmp, exp2 );
355 120 : exp1 = add( 29, sub( exp2, exp1 ) );
356 4800 : FOR( i = 0; i < N; i++ )
357 : {
358 4680 : L_tmp2 = L_sub( L_mult0( y[i], band_end_HQ[N - 1] ), L_tmp1 ); /* Q0 */
359 4680 : Rsubband_w32_fx[i] = L_mult0( extract_l( L_tmp2 ), Nb[i] );
360 4680 : move32(); /*Q0*/
361 4680 : IF( Rsubband_w32_fx[i] > 0 )
362 : {
363 3404 : n = add( n, Nb[i] );
364 3404 : L_tmp3 = Mult_32_16( Rsubband_w32_fx[i], tmp ); /*exp1 - 15*/
365 3404 : Rsubband_w32_fx[i] = L_shl( L_tmp3, sub( 30, exp1 ) ); /*Q15*/
366 3404 : move32();
367 :
368 3404 : t_fx = L_add( t_fx, Rsubband_w32_fx[i] ); /*Q15*/
369 : }
370 : ELSE
371 : {
372 1276 : Rsubband_w32_fx[i] = L_deposit_l( 0 );
373 1276 : move32();
374 : }
375 : }
376 : }
377 :
378 : /* Distribute the remaining bits to subbands with non-zero bits */
379 1401 : B_fx = L_shl( B, 15 );
380 3097 : WHILE( NE_32( L_shr( L_add( t_fx, 16384 ), 15 ), B ) )
381 : {
382 1696 : L_tmp1 = L_sub( t_fx, B_fx );
383 1696 : exp1 = sub( norm_l( L_tmp1 ), 1 );
384 1696 : exp2 = norm_s( n );
385 1696 : tmp = div_s( extract_h( L_shl( L_tmp1, exp1 ) ), shl( n, exp2 ) ); /*15 + 15 + exp1 - 16 - exp2*/
386 1696 : m_fx = shl_sat( tmp, sub( exp2, exp1 ) ); /*Q14*/
387 1696 : t_fx = L_deposit_l( 0 );
388 1696 : n = 0;
389 1696 : move16();
390 67840 : FOR( i = 0; i < N; i++ )
391 : {
392 66144 : IF( Rsubband_w32_fx[i] > 0 )
393 : {
394 37363 : Rsubband_w32_fx[i] = L_msu( Rsubband_w32_fx[i], m_fx, Nb[i] ); /* Q15 */
395 37363 : move32();
396 :
397 37363 : IF( Rsubband_w32_fx[i] > 0 )
398 : {
399 36297 : n = add( n, Nb[i] );
400 :
401 36297 : t_fx = L_add( t_fx, Rsubband_w32_fx[i] ); /* Q15 */
402 : }
403 : ELSE
404 : {
405 1066 : Rsubband_w32_fx[i] = L_deposit_l( 0 );
406 1066 : move32();
407 : }
408 : }
409 : }
410 : }
411 1401 : Bits = B; /* Q0 */
412 1401 : move16();
413 :
414 : /* Impose bit-constraints to subbands with less than minimum bits*/
415 1401 : t_fx = L_deposit_l( 0 );
416 1401 : n = 0;
417 1401 : move16();
418 56040 : FOR( i = 0; i < N; i++ )
419 : {
420 54639 : IF( Rsubband_w32_fx[i] > 0 )
421 : {
422 30650 : test();
423 30650 : IF( ( LT_32( Rsubband_w32_fx[i], L_shl( add( bs, LNb[i] ), 15 ) ) ) && ( EQ_16( low_rate, 1 ) ) )
424 : {
425 6140 : Rsubband_w32_fx[i] = L_deposit_l( 0 );
426 6140 : move32();
427 : }
428 24510 : ELSE IF( LE_32( Rsubband_w32_fx[i], L_shl( Nb[i], 15 ) ) )
429 : {
430 7809 : B = sub( B, Nb[i] ); /* Q0 */
431 7809 : Rsubband_w32_fx[i] = L_shl( Nb[i], 15 ); /* Q15 */
432 7809 : move32();
433 : }
434 : ELSE
435 : {
436 16701 : n = add( n, Nb[i] ); /* Q0 */
437 16701 : t_fx = L_add( t_fx, Rsubband_w32_fx[i] ); /* Q15 */
438 : }
439 : }
440 : }
441 :
442 : /* Distribute the remaining bits to subbands with more than 1-bit per sample */
443 3247 : WHILE( NE_32( L_shr( L_add( t_fx, 16384 ), 15 ), B ) )
444 : {
445 1891 : L_tmp1 = L_sub( t_fx, L_shl( B, 15 ) );
446 1891 : L_tmp2 = L_abs( L_tmp1 );
447 :
448 1891 : IF( n > 0 )
449 : {
450 1891 : exp1 = sub( norm_l( L_tmp2 ), 1 );
451 1891 : exp2 = norm_s( n );
452 1891 : tmp = div_s( extract_h( L_shl( L_tmp2, exp1 ) ), shl( n, exp2 ) ); /*15 + 15 + exp1 - 16 - exp2*/
453 : #ifdef ISSUE_1836_replace_overflow_libcom
454 1891 : m_fx = shl_sat( tmp, sub( exp2, exp1 ) ); /*Q14*/
455 : #else
456 : m_fx = shl_o( tmp, sub( exp2, exp1 ), &Overflow ); /*Q14*/
457 : #endif
458 1891 : if ( L_tmp1 < 0 )
459 : {
460 284 : m_fx = negate( m_fx );
461 : }
462 :
463 1891 : t_fx = L_deposit_l( 0 );
464 1891 : n = 0;
465 1891 : move16();
466 75640 : FOR( i = 0; i < N; i++ )
467 : {
468 73749 : IF( GT_32( Rsubband_w32_fx[i], L_shl( Nb[i], 15 ) ) )
469 : {
470 20530 : Rsubband_w32_fx[i] = L_msu( Rsubband_w32_fx[i], m_fx, Nb[i] ); /* Q15 */
471 20530 : move32();
472 20530 : IF( GT_32( Rsubband_w32_fx[i], L_shl( Nb[i], 15 ) ) )
473 : {
474 18470 : n = add( n, Nb[i] ); /* Q0 */
475 :
476 18470 : t_fx = L_add( t_fx, Rsubband_w32_fx[i] ); /* Q15 */
477 : }
478 : ELSE
479 : {
480 2060 : B = sub( B, Nb[i] ); /* Q0 */
481 :
482 2060 : Rsubband_w32_fx[i] = L_shl( Nb[i], 15 ); /* Q15 */
483 2060 : move32();
484 : }
485 : }
486 : }
487 : }
488 : /*In case no subband has enough bits more than 1-bit per sample, take bits off the higher subbands */
489 1891 : IF( t_fx == 0 )
490 : {
491 195 : FOR( i = N - 1; i >= 0; i-- )
492 : {
493 195 : IF( Rsubband_w32_fx[i] > 0 )
494 : {
495 57 : B = add( B, Nb[i] ); /* Q0 */
496 57 : Rsubband_w32_fx[i] = L_deposit_l( 0 );
497 57 : move32();
498 57 : IF( B >= 0 )
499 : {
500 45 : BREAK;
501 : }
502 : }
503 : }
504 45 : BREAK;
505 : }
506 : }
507 :
508 : /* fine redistribution of over-allocated or under-allocated bits */
509 1401 : tmp = 0;
510 1401 : move16();
511 56040 : FOR( i = 0; i < N; i++ )
512 : {
513 54639 : Rsubband_fx[i] = extract_l( L_shr( Rsubband_w32_fx[i], 12 ) ); /* Q3 */
514 54639 : move16();
515 54639 : tmp = add( tmp, Rsubband_fx[i] ); /* Q3 */
516 : }
517 :
518 1401 : B = Bits;
519 1401 : B_w16_fx = shl( B, 3 );
520 1401 : IF( GT_16( tmp, B_w16_fx ) )
521 : {
522 2 : tmp = sub( tmp, B_w16_fx );
523 2 : FOR( i = 0; i < N; i++ )
524 : {
525 2 : IF( GE_16( Rsubband_fx[i], add( shl( Nb[i], 3 ), tmp ) ) )
526 : {
527 2 : Rsubband_fx[i] = sub( Rsubband_fx[i], tmp ); /* Q3 */
528 2 : move16();
529 2 : BREAK;
530 : }
531 : }
532 : }
533 : ELSE
534 : {
535 1399 : tmp = sub( tmp, B_w16_fx );
536 1801 : FOR( i = 0; i < N; i++ )
537 : {
538 1801 : IF( Rsubband_fx[i] > 0 )
539 : {
540 1399 : Rsubband_fx[i] = sub( Rsubband_fx[i], tmp ); /* Q3 */
541 1399 : move16();
542 1399 : BREAK;
543 : }
544 : }
545 : }
546 :
547 : /* Calcuate total used bits and initialize R to be used for Noise Filling */
548 1401 : tmp = 0;
549 1401 : move16();
550 56040 : FOR( i = 0; i < N; i++ )
551 : {
552 54639 : tmp = add( tmp, Rsubband_fx[i] ); /* Q3 */
553 54639 : R[i] = shr( Rsubband_fx[i], 3 ); /* Q0 */
554 54639 : move16();
555 : }
556 1401 : return shr( tmp, 3 );
557 : }
558 : /*-------------------------------------------------------------------*
559 : * Bit_group()
560 : *
561 : * bit allocation in group
562 : *-------------------------------------------------------------------*/
563 2175 : static void Bit_group_fx(
564 : Word16 *y, /* i : norm of sub-band Q0*/
565 : Word16 start_band, /* i : start band indices Q0*/
566 : Word16 end_band, /* i : end band indices Q0*/
567 : Word16 Bits, /* i : number of allocation bits in group Q0*/
568 : Word16 thr, /* i : smallest bit number for allocation in group Q0*/
569 : Word32 *Rsubband_fx, /* o : bit allocation of sub-band Q21*/
570 : Word16 *fac_fx /* i : weight factor for norm of sub-band Q13*/
571 : )
572 : {
573 : Word16 i, j, k, m, y_index[16], index[16], bit_band, band_num, norm_sum;
574 : Word16 tmp, exp;
575 : Word16 factor_fx;
576 2175 : Word32 R_temp_fx[16], R_sum_fx = 0, R_sum_org_fx = 0, Bits_avg_fx = 0;
577 : Word32 L_tmp;
578 2175 : move32();
579 2175 : move32();
580 2175 : move32();
581 :
582 : /* initialization for bit allocation in one group*/
583 2175 : tmp = 6554;
584 2175 : move16(); /*Q15 1/5 */
585 2175 : if ( EQ_16( thr, 5 ) )
586 : {
587 725 : tmp = 6554;
588 725 : move16(); /*Q15 1/5 */
589 : }
590 2175 : if ( EQ_16( thr, 6 ) )
591 : {
592 725 : tmp = 5462;
593 725 : move16(); /*Q15 1/6 */
594 : }
595 2175 : if ( EQ_16( thr, 7 ) )
596 : {
597 725 : tmp = 4682;
598 725 : move16(); /*Q15 1/7 */
599 : }
600 2175 : bit_band = mult( tmp, Bits ); /*0+15-15=0, Q0 */
601 2175 : band_num = sub( end_band, start_band );
602 :
603 21025 : FOR( i = 0; i < band_num; i++ )
604 : {
605 18850 : y_index[i] = y[i + start_band]; /* Q0 */
606 18850 : move16();
607 18850 : index[i] = i;
608 18850 : move16();
609 : }
610 :
611 : /* Rearrange norm vector in decreasing order */
612 2175 : reordvct_fx( y_index, band_num, index );
613 : /* norm vector modification */
614 :
615 2175 : factor_fx = div_s( 1, band_num ); /*Q15 */
616 2175 : IF( GT_16( thr, 5 ) )
617 : {
618 8700 : FOR( i = 0; i < band_num; i++ )
619 : {
620 7250 : L_tmp = L_mult( i, factor_fx ); /*Q16 */
621 7250 : tmp = extract_h( L_shl( L_tmp, 13 ) ); /*Q13 */
622 7250 : tmp = sub( fac_fx[1], tmp ); /*Q13 */
623 7250 : L_tmp = L_mult( y_index[i], tmp ); /*Q14 */
624 7250 : y_index[i] = extract_h( L_shl( L_tmp, 2 ) ); /*Q0 */
625 7250 : move16();
626 : }
627 : }
628 : ELSE
629 : {
630 12325 : FOR( i = 0; i < band_num; i++ )
631 : {
632 11600 : L_tmp = L_mult( i, factor_fx ); /*Q16 */
633 11600 : tmp = extract_h( L_shl( L_tmp, 13 ) ); /*Q13 */
634 11600 : tmp = sub( fac_fx[0], tmp ); /*Q13 */
635 11600 : L_tmp = L_mult( y_index[i], tmp ); /*Q14 */
636 11600 : y_index[i] = extract_h( L_shl( L_tmp, 2 ) ); /*Q0 */
637 11600 : move16();
638 : }
639 : }
640 :
641 : /* bit allocation based on modified norm */
642 2175 : L_tmp = L_mult( band_num, 24576 ); /*Q16 */
643 2175 : tmp = extract_h( L_shl( L_tmp, 7 ) ); /*Q7 */
644 2175 : IF( GE_16( shl( bit_band, 7 ), tmp ) )
645 : {
646 20221 : FOR( j = 0; j < band_num; j++ )
647 : {
648 18214 : if ( y_index[j] < 0 )
649 : {
650 148 : y_index[j] = 0;
651 148 : move16();
652 : }
653 18214 : R_temp_fx[j] = 2097152;
654 18214 : move16(); /*Q21 = 1 move16(); */
655 : }
656 :
657 2007 : i = sub( band_num, 1 );
658 2007 : norm_sum = 0; /*Q0 */
659 20221 : FOR( k = 0; k <= i; k++ )
660 : {
661 18214 : norm_sum = add( norm_sum, y_index[k] );
662 : }
663 :
664 4120 : FOR( j = 0; j < band_num; j++ )
665 : {
666 4120 : IF( norm_sum == 0 )
667 : {
668 0 : FOR( k = 0; k <= i; k++ )
669 : {
670 0 : R_temp_fx[k] = L_deposit_h( 0 ); /*Q21 */
671 0 : move32();
672 : }
673 : }
674 : ELSE
675 : {
676 4120 : exp = norm_s( norm_sum );
677 4120 : tmp = shl( norm_sum, exp ); /*Q(exp) */
678 4120 : tmp = div_s( 16384, tmp ); /*Q(15+14-exp) */
679 4120 : Bits_avg_fx = L_mult( tmp, Bits ); /*Q(30-exp) */
680 :
681 38722 : FOR( k = 0; k <= i; k++ )
682 : {
683 34602 : L_tmp = L_shl( L_deposit_l( y_index[k] ), 24 );
684 34602 : L_tmp = Mult_32_32( Bits_avg_fx, L_tmp ); /*Q(23-exp) */
685 :
686 34602 : R_temp_fx[k] = L_shl( L_tmp, sub( exp, 2 ) );
687 34602 : move32(); /*Q21 */
688 : }
689 : }
690 :
691 4120 : L_tmp = L_shl( L_deposit_l( thr ), 21 ); /*Q21 */
692 4120 : IF( LT_32( R_temp_fx[i], L_tmp ) )
693 : {
694 2113 : R_temp_fx[i] = L_deposit_h( 0 );
695 2113 : move32();
696 2113 : norm_sum = sub( norm_sum, y_index[i] );
697 2113 : i--;
698 : }
699 : ELSE
700 : {
701 2007 : BREAK;
702 : }
703 : }
704 : }
705 : ELSE
706 : {
707 454 : FOR( j = 0; j < bit_band; j++ )
708 : {
709 286 : if ( y_index[j] < 0 )
710 : {
711 0 : y_index[j] = 0;
712 0 : move16();
713 : }
714 286 : R_temp_fx[j] = 2097152;
715 286 : move32(); /*Q21 = 1 */
716 : }
717 :
718 518 : FOR( j = bit_band; j < band_num; j++ )
719 : {
720 350 : R_temp_fx[j] = L_deposit_l( 0 );
721 350 : move32();
722 : }
723 :
724 168 : norm_sum = 0;
725 168 : move16();
726 454 : FOR( k = 0; k < bit_band; k++ )
727 : {
728 286 : norm_sum = add( norm_sum, y_index[k] );
729 : }
730 :
731 168 : i = bit_band;
732 168 : move16();
733 324 : FOR( j = 0; j < bit_band; j++ )
734 : {
735 204 : IF( norm_sum == 0 )
736 : {
737 0 : FOR( k = 0; k < i; k++ )
738 : {
739 0 : R_temp_fx[k] = L_deposit_l( 0 ); /*Q21 */
740 0 : move32();
741 : }
742 : }
743 : ELSE
744 : {
745 204 : exp = norm_s( norm_sum );
746 204 : tmp = shl( norm_sum, exp ); /*Q(exp) */
747 204 : tmp = div_s( 16384, tmp ); /*Q(15+14-exp) */
748 204 : Bits_avg_fx = L_mult( tmp, Bits ); /*Q(30-exp) */
749 746 : FOR( k = 0; k < i; k++ )
750 : {
751 542 : L_tmp = L_shl( L_deposit_l( y_index[k] ), 24 );
752 542 : L_tmp = Mult_32_32( Bits_avg_fx, L_tmp ); /*Q(23-exp) */
753 :
754 542 : R_temp_fx[k] = L_shl( L_tmp, sub( exp, 2 ) );
755 542 : move32(); /*Q21 */
756 : }
757 : }
758 204 : R_sum_fx = 0;
759 204 : move32();
760 204 : L_tmp = L_shl( L_deposit_l( thr ), 21 ); /*Q21 */
761 648 : FOR( k = 0; k < i; k++ )
762 : {
763 492 : IF( LT_32( R_temp_fx[k], L_tmp ) )
764 : {
765 146 : FOR( m = k; m < i; m++ )
766 : {
767 98 : norm_sum = sub( norm_sum, y_index[m] );
768 98 : R_temp_fx[m] = L_deposit_l( 0 ); /*Q21 */
769 98 : move32();
770 : }
771 48 : i = k;
772 48 : move16();
773 48 : BREAK;
774 : }
775 : ELSE
776 : {
777 444 : R_sum_fx = L_add( R_sum_fx, R_temp_fx[k] ); /* Q21 */
778 : }
779 : }
780 204 : IF( EQ_32( R_sum_fx, R_sum_org_fx ) )
781 : {
782 48 : BREAK;
783 : }
784 :
785 156 : R_sum_org_fx = R_sum_fx;
786 156 : move32();
787 : }
788 : }
789 :
790 : /* index comeback */
791 21025 : FOR( k = 0; k < band_num; k++ )
792 : {
793 18850 : j = index[k];
794 18850 : move16();
795 18850 : Rsubband_fx[j + start_band] = R_temp_fx[k]; /* Q21 */
796 18850 : move32();
797 : }
798 :
799 2175 : return;
800 : }
801 :
802 : /*-------------------------------------------------------------------*
803 : * BitAllocWB()
804 : *
805 : * WB bit allocation
806 : *-------------------------------------------------------------------*/
807 :
808 725 : Word16 BitAllocWB_fx( /* o : t Q0*/
809 : Word16 *y, /* i : norm of sub-vectors Q0*/
810 : Word16 B, /* i : number of available bits Q0*/
811 : Word16 N, /* i : number of sub-vectors Q0*/
812 : Word16 *R, /* o : bit-allocation indicator Q0*/
813 : Word16 *Rsubband_fx /* o : sub-band bit-allocation vector Q3*/
814 : )
815 : {
816 : Word16 t_fx;
817 : Word16 i, j, k, B1, B2, B3, B_saved;
818 : Word16 Rsum_fx, Rsum_sub_fx[3];
819 : Word32 Ravg_sub_32_fx[3], R_diff_32_fx[2];
820 : Word16 factor_fx[2]; /*Q13 */
821 : Word16 BANDS;
822 : Word16 tmp, exp;
823 725 : Word16 Rsum_sub_fx_tmp = 0; /* initialize just to avoid compiler warning */
824 725 : move16();
825 : Word32 L_tmp, L_tmp1;
826 : Word32 Rsubband_buf[NB_SFM];
827 :
828 725 : BANDS = N;
829 725 : move16();
830 725 : if ( GT_16( BANDS, SFM_N ) )
831 : {
832 0 : BANDS = SFM_N;
833 0 : move16();
834 : }
835 : /* Init Rsubband to non-zero values for bands to be allocated bits */
836 19575 : FOR( k = 0; k < BANDS; k++ )
837 : {
838 18850 : Rsubband_buf[k] = 2097152;
839 18850 : move32(); /*Q21 */
840 : }
841 : /* Calculate the norm sum and average of sub-band */
842 725 : Rsum_sub_fx[0] = 0;
843 725 : move16();
844 12325 : FOR( j = 0; j < SFM_G1; j++ )
845 : {
846 11600 : if ( y[j] > 0 )
847 : {
848 11460 : Rsum_sub_fx_tmp = add( Rsum_sub_fx[0], y[j] ); /*Q0 */
849 : }
850 11600 : if ( y[j] > 0 )
851 : {
852 11460 : Rsum_sub_fx[0] = Rsum_sub_fx_tmp;
853 11460 : move16(); /*Q0 */
854 : }
855 : }
856 725 : Ravg_sub_32_fx[0] = L_mult( Rsum_sub_fx[0], 2048 );
857 725 : move32(); /*Q16 0+15+1 //q15 1/16 =2048 */
858 :
859 725 : Rsum_sub_fx[1] = 0;
860 725 : move16();
861 6525 : FOR( j = SFM_G1; j < SFM_G1G2; j++ )
862 : {
863 5800 : if ( y[j] > 0 )
864 : {
865 5560 : Rsum_sub_fx_tmp = add( Rsum_sub_fx[1], y[j] ); /*Q0 */
866 : }
867 5800 : if ( y[j] > 0 )
868 : {
869 5560 : Rsum_sub_fx[1] = Rsum_sub_fx_tmp;
870 5560 : move16(); /*Q0 */
871 : }
872 : }
873 725 : Ravg_sub_32_fx[1] = L_mult( Rsum_sub_fx[1], 4096 ); /*16 0+15+1 //q15 1/8 =4096 */
874 725 : move32();
875 725 : Rsum_sub_fx[2] = 0;
876 725 : move16();
877 2175 : FOR( j = SFM_G1G2; j < BANDS; j++ )
878 : {
879 1450 : if ( y[j] > 0 )
880 : {
881 1370 : Rsum_sub_fx_tmp = add( Rsum_sub_fx[2], y[j] ); /*Q0 */
882 : }
883 1450 : if ( y[j] > 0 )
884 : {
885 1370 : Rsum_sub_fx[2] = Rsum_sub_fx_tmp;
886 1370 : move16(); /*Q0 */
887 : }
888 : }
889 725 : tmp = div_s( 1, BANDS - SFM_G1G2 ); /*Q15 */
890 725 : Ravg_sub_32_fx[2] = L_mult( Rsum_sub_fx[2], tmp );
891 725 : move32(); /*Q16 */
892 :
893 : /* Bit allocation for every group */
894 725 : tmp = add( Rsum_sub_fx[0], Rsum_sub_fx[1] );
895 725 : Rsum_fx = add( tmp, Rsum_sub_fx[2] ); /*Q0 */
896 :
897 725 : factor_fx[0] = 16384; /*Q13 move16(); */
898 725 : factor_fx[1] = 24576; /*Q13 move16(); */
899 725 : move16();
900 725 : move16();
901 : {
902 725 : R_diff_32_fx[0] = L_sub( Ravg_sub_32_fx[0], Ravg_sub_32_fx[1] );
903 725 : move32(); /*Q16 */
904 725 : R_diff_32_fx[1] = L_sub( Ravg_sub_32_fx[1], Ravg_sub_32_fx[2] );
905 725 : move32(); /*Q16 */
906 :
907 725 : test();
908 725 : IF( LT_32( R_diff_32_fx[0], 393216 /* 32 in Q16 */ ) && LT_32( R_diff_32_fx[1], 245760 /* 3.75 in Q16 */ ) )
909 : {
910 433 : IF( Rsum_fx == 0 )
911 : {
912 0 : B1 = 0;
913 0 : move16();
914 0 : B2 = 0;
915 0 : move16();
916 0 : B3 = 0;
917 0 : move16();
918 : }
919 : ELSE
920 : {
921 433 : exp = norm_s( Rsum_fx );
922 433 : tmp = shl( Rsum_fx, exp ); /*Q(exp) */
923 433 : tmp = div_s( 16384, tmp ); /*Q(15+14-exp) */
924 433 : L_tmp1 = L_mult( B, Rsum_sub_fx[0] ); /*Q1 */
925 433 : L_tmp = Mult_32_16( L_tmp1, tmp ); /*Q(15-exp) */
926 433 : B1 = extract_h( L_shl( L_tmp, add( exp, 1 ) ) ); /*Q0 */
927 433 : test();
928 433 : if ( GT_32( L_tmp1, L_mult( B1, Rsum_fx ) ) && GE_32( L_tmp1, L_mult( add( B1, 1 ), Rsum_fx ) ) )
929 : {
930 6 : B1 = add( B1, 1 );
931 : }
932 433 : L_tmp1 = L_mult( B, Rsum_sub_fx[1] ); /*Q1 */
933 433 : L_tmp = Mult_32_16( L_tmp1, tmp ); /*Q(15-exp) */
934 433 : B2 = extract_h( L_shl( L_tmp, add( exp, 1 ) ) ); /*Q0 */
935 433 : test();
936 433 : if ( GT_32( L_tmp1, L_mult( B2, Rsum_fx ) ) && GE_32( L_tmp1, L_mult( add( B2, 1 ), Rsum_fx ) ) )
937 : {
938 8 : B2 = add( B2, 1 );
939 : }
940 433 : L_tmp1 = L_mult( B, Rsum_sub_fx[2] ); /*Q1 */
941 433 : L_tmp = Mult_32_16( L_tmp1, tmp ); /*Q(15-exp) */
942 433 : B3 = extract_h( L_shl( L_tmp, add( exp, 1 ) ) ); /*Q0 */
943 433 : test();
944 433 : if ( GT_32( L_tmp1, L_mult( B3, Rsum_fx ) ) && GE_32( L_tmp1, L_mult( add( B3, 1 ), Rsum_fx ) ) )
945 : {
946 6 : B3 = add( B3, 1 );
947 : }
948 : }
949 433 : IF( GT_32( Ravg_sub_32_fx[2], 786432 /* 12 in Q16 */ ) )
950 : {
951 170 : B_saved = 0;
952 170 : move16();
953 170 : IF( GT_16( B1, 288 ) )
954 : {
955 28 : B_saved = sub( B1, 288 ); /* Q0 */
956 28 : B1 = 288;
957 28 : move16();
958 : }
959 :
960 170 : IF( GT_16( B2, 256 ) )
961 : {
962 0 : tmp = sub( B2, 256 ); /* Q0 */
963 0 : B_saved = add( B_saved, tmp ); /* Q0 */
964 0 : B2 = 256;
965 0 : move16();
966 : }
967 :
968 170 : IF( GT_16( B3, 96 ) )
969 : {
970 0 : tmp = sub( B3, 96 ); /* Q0 */
971 0 : B_saved = add( B_saved, tmp ); /* Q0 */
972 0 : B3 = 96;
973 0 : move16();
974 : }
975 :
976 170 : IF( B_saved > 0 )
977 : {
978 28 : IF( EQ_16( B1, 288 ) )
979 : {
980 28 : tmp = shr( B_saved, 1 ); /* Q0 */
981 28 : B2 = add( B2, tmp ); /* Q0 */
982 28 : tmp = sub( B, B1 ); /* Q0 */
983 28 : B3 = sub( tmp, B2 ); /* Q0 */
984 : }
985 : ELSE
986 : {
987 0 : tmp = shr( B_saved, 1 ); /* Q0 */
988 0 : B1 = add( B1, tmp ); /* Q0 */
989 0 : IF( EQ_16( B2, 256 ) )
990 : {
991 0 : tmp = sub( B, B1 ); /* Q0 */
992 0 : B3 = sub( tmp, B2 ); /* Q0 */
993 : }
994 : ELSE
995 : {
996 0 : tmp = sub( B, B1 ); /* Q0 */
997 0 : B2 = sub( tmp, B3 ); /* Q0 */
998 : }
999 : }
1000 : }
1001 : }
1002 :
1003 433 : factor_fx[0] = 16384;
1004 433 : move16(); /*Q13 */
1005 433 : factor_fx[1] = 12288;
1006 433 : move16(); /*Q13 */
1007 : }
1008 : ELSE
1009 : {
1010 292 : IF( Rsum_fx == 0 )
1011 : {
1012 0 : B1 = 0;
1013 0 : move16();
1014 0 : B2 = 0;
1015 0 : move16();
1016 0 : B3 = B;
1017 0 : move16();
1018 : }
1019 : ELSE
1020 : {
1021 292 : exp = norm_s( Rsum_fx );
1022 292 : tmp = shl( Rsum_fx, exp ); /*Q(exp) */
1023 292 : tmp = div_s( 16384, tmp ); /*Q(15+14-exp) */
1024 292 : L_tmp1 = L_mult( B, Rsum_sub_fx[0] ); /*Q1 */
1025 292 : L_tmp = Mult_32_16( L_tmp1, tmp ); /*Q(15-exp) */
1026 292 : B1 = extract_h( L_shl( L_tmp, add( exp, 1 ) ) ); /*Q0 */
1027 292 : test();
1028 292 : if ( GT_32( L_tmp1, L_mult( B1, Rsum_fx ) ) && GE_32( L_tmp1, L_mult( add( B1, 1 ), Rsum_fx ) ) )
1029 : {
1030 2 : B1 = add( B1, 1 ); /* Q0 */
1031 : }
1032 292 : L_tmp1 = Mult_32_16( 1975684956, shl( B, 5 ) ); /*Q(31+5-15=21) */
1033 292 : L_tmp1 = Mult_32_16( L_tmp1, shl( Rsum_sub_fx[1], 7 ) ); /*Q(21+7-15=13) */
1034 292 : L_tmp = Mult_32_16( L_tmp1, tmp ); /*Q(27-exp) */
1035 292 : B2 = extract_h( L_shl( L_tmp, sub( exp, 11 ) ) ); /*Q0 */
1036 292 : test();
1037 292 : if ( GT_32( L_tmp1, L_shl( L_mult( B2, Rsum_fx ), 12 ) ) && GE_32( L_add( L_tmp1, 2 ), L_shl( L_mult( add( B2, 1 ), Rsum_fx ), 12 ) ) )
1038 : {
1039 0 : B2 = add( B2, 1 );
1040 : }
1041 292 : tmp = sub( B, B1 ); /* Q0 */
1042 292 : B3 = sub( tmp, B2 ); /* Q0 */
1043 : }
1044 : }
1045 : }
1046 :
1047 725 : IF( LT_16( Rsum_sub_fx[2], 3 ) )
1048 : {
1049 60 : B2 = add( B2, B3 ); /* Q0 */
1050 60 : B3 = 0;
1051 60 : move16();
1052 : }
1053 :
1054 : /* Bit allocation in group */
1055 725 : Bit_group_fx( y, 0, SFM_G1, B1, 5, Rsubband_buf, factor_fx );
1056 725 : Bit_group_fx( y, SFM_G1, SFM_G1G2, B2, 6, Rsubband_buf, factor_fx );
1057 725 : Bit_group_fx( y, SFM_G1G2, BANDS, B3, 7, Rsubband_buf, factor_fx );
1058 19575 : FOR( i = 0; i < BANDS; i++ )
1059 : {
1060 18850 : Rsubband_fx[i] = extract_l( L_shr( Rsubband_buf[i], 18 ) ); /* Q3 */
1061 18850 : move16();
1062 : }
1063 :
1064 : /* Calcuate total used bits and initialize R to be used for Noise Filling */
1065 725 : L_tmp = L_deposit_l( 0 );
1066 19575 : FOR( i = 0; i < N; i++ )
1067 : {
1068 18850 : L_tmp = L_add( L_tmp, Rsubband_buf[i] ); /*Q21 */
1069 18850 : R[i] = extract_h( L_shr( Rsubband_buf[i], 5 ) ); /*Q0 */
1070 18850 : move16();
1071 : }
1072 725 : t_fx = extract_h( L_shr( L_tmp, 5 ) ); /*Q0 */
1073 :
1074 725 : return (Word16) t_fx;
1075 : }
1076 :
1077 : #undef WMC_TOOL_SKIP
|