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 5303 : 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 5303 : Word16 SFM_thr = SFM_G1G2;
33 5303 : move16();
34 :
35 5303 : N = sub( N, 1 ); /* Q0 */
36 :
37 5303 : if ( EQ_16( hqswb_clas, HQ_HARMONIC ) )
38 : {
39 752 : SFM_thr = 22; /* Q0 */
40 752 : move16();
41 : }
42 :
43 5303 : fac = 3;
44 5303 : move16();
45 5303 : K = sub( K, 2 ); /* Q0 */
46 5303 : im = 1;
47 5303 : move16();
48 5303 : diff = sum; /* Q0 */
49 5303 : move16();
50 5303 : n = shr( sum, 3 ); /* Q0 */
51 234204 : FOR( i = 0; i < n; i++ )
52 : {
53 234204 : k = 0;
54 234204 : move16();
55 234204 : temp = y[0];
56 234204 : move16();
57 3221544 : FOR( m = 1; m < im; m++ )
58 : {
59 : #ifdef ISSUE_1836_replace_overflow_libcom
60 2987340 : v = sub_sat( temp, y[m] ); /* Q0 */
61 : #else
62 : v = sub_o( temp, y[m], &Overflow ); /* Q0 */
63 : #endif
64 2987340 : temp = s_max( temp, y[m] );
65 2987340 : if ( v < 0 )
66 : {
67 227583 : k = m; /* Q0 */
68 227583 : move16();
69 : }
70 : }
71 :
72 234204 : IF( LT_16( temp, y[m] ) )
73 : {
74 114643 : k = m;
75 114643 : move16();
76 114643 : if ( LT_16( im, N ) )
77 : {
78 114517 : im = add( im, 1 ); /* Q0 */
79 : }
80 : }
81 :
82 234204 : j = idx[k];
83 234204 : move16();
84 :
85 234204 : test();
86 234204 : IF( GE_16( sum, sfmsize[j] ) && LT_16( r[j], K ) )
87 : {
88 232214 : y[k] = sub( y[k], fac ); /* Q0 */
89 232214 : move16();
90 232214 : r[j] = add( r[j], 1 ); /* Q0 */
91 232214 : move16();
92 :
93 232214 : if ( GE_16( r[j], K ) )
94 : {
95 551 : y[k] = -32768;
96 551 : move16();
97 : }
98 232214 : sum = sub( sum, sfmsize[j] ); /* Q0 */
99 : }
100 : ELSE
101 : {
102 1990 : y[k] = -32768;
103 1990 : move16();
104 1990 : k = add( k, 1 );
105 1990 : test();
106 1990 : if ( EQ_16( k, im ) && LT_16( im, N ) )
107 : {
108 1068 : im = add( im, 1 ); /* Q0 */
109 : }
110 : }
111 :
112 234204 : test();
113 234204 : 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 228901 : diff = sum; /* Q0 */
119 228901 : move16();
120 228901 : v = sub( N, 1 ); /* Q0 */
121 :
122 228901 : IF( GT_16( k, v ) )
123 : {
124 253 : FOR( ii = 0; ii <= N; ii++ )
125 : {
126 253 : IF( GT_16( y[ii], -32768 ) )
127 : {
128 119 : if ( LT_16( ii, N ) )
129 : {
130 119 : im = add( ii, 1 ); /* Q0 */
131 : }
132 119 : BREAK;
133 : }
134 : }
135 : }
136 : }
137 :
138 :
139 5303 : 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 19396 : FOR( i = 0; i <= N; i++ )
142 : {
143 19202 : j = idx[i]; /* Q0 */
144 19202 : move16();
145 19202 : test();
146 19202 : test();
147 19202 : IF( GE_16( j, SFM_G1 ) && LT_16( j, SFM_thr ) && r[j] == 0 )
148 : {
149 516 : r[j] = 1;
150 516 : move16();
151 516 : sum = sub( sum, sfmsize[j] ); /* Q0 */
152 516 : IF( LT_16( sum, sfmsize[SFM_G1] ) )
153 : {
154 495 : BREAK;
155 : }
156 : }
157 : }
158 : }
159 :
160 5303 : IF( GE_16( sum, sfmsize[SFM_G1] ) )
161 : {
162 4087 : FOR( i = 0; i <= N; i++ )
163 : {
164 4060 : j = idx[i];
165 4060 : move16();
166 4060 : test();
167 4060 : test();
168 4060 : IF( GE_16( j, SFM_G1 ) && LT_16( j, SFM_thr ) && EQ_16( r[j], 1 ) )
169 : {
170 174 : r[j] = 2;
171 174 : move16();
172 174 : sum = sub( sum, sfmsize[j] ); /* Q0 */
173 174 : IF( LT_16( sum, sfmsize[SFM_G1] ) )
174 : {
175 167 : BREAK;
176 : }
177 : }
178 : }
179 : }
180 :
181 5303 : IF( GE_16( sum, sfmsize[SFM_G1 - 1] ) )
182 : {
183 45006 : FOR( i = 0; i <= N; i++ )
184 : {
185 44327 : j = idx[i]; /* Q0 */
186 44327 : move16();
187 44327 : test();
188 44327 : IF( LT_16( j, SFM_G1 ) && r[j] == 0 )
189 : {
190 771 : r[j] = 1;
191 771 : move16();
192 771 : sum = sub( sum, sfmsize[j] ); /* Q0 */
193 771 : IF( LT_16( sum, sfmsize[SFM_G1 - 1] ) )
194 : {
195 771 : BREAK;
196 : }
197 : }
198 : }
199 : }
200 :
201 5303 : IF( GE_16( sum, sfmsize[SFM_G1 - 1] ) )
202 : {
203 16734 : FOR( i = 0; i <= N; i++ )
204 : {
205 16505 : j = idx[i]; /* Q0 */
206 16505 : move16();
207 16505 : test();
208 16505 : IF( LT_16( j, SFM_G1 ) && EQ_16( r[j], 1 ) )
209 : {
210 458 : r[j] = 2; /* Q0 */
211 458 : move16();
212 458 : sum = sub( sum, sfmsize[j] ); /* Q0 */
213 458 : IF( LT_16( sum, sfmsize[SFM_G1 - 1] ) )
214 : {
215 450 : BREAK;
216 : }
217 : }
218 : }
219 : }
220 :
221 5303 : return;
222 : }
223 :
224 : #define WMC_TOOL_SKIP
225 :
226 : /*-------------------------------------------------------------------*
227 : * BitAllocF()
228 : *
229 : * Fractional bit allocation
230 : *-------------------------------------------------------------------*/
231 :
232 834 : 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 834 : Word16 i, n, Nmin, Bits, bs, low_rate = 0;
246 834 : 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 834 : set32_fx( Rsubband_w32_fx, 0, NB_SFM );
262 :
263 834 : fac = 3;
264 834 : move16();
265 :
266 834 : IF( LT_32( bit_rate, 32000 ) )
267 : {
268 834 : bs = 2;
269 834 : move16();
270 : }
271 : ELSE
272 : {
273 0 : bs = 3;
274 0 : move16();
275 : }
276 834 : low_rate = 1;
277 834 : move16();
278 :
279 834 : Nmin = N; /* Q0 */
280 834 : move16();
281 834 : if ( GT_16( Nmin, SFM_N ) )
282 : {
283 834 : Nmin = SFM_N; /* Q0 */
284 834 : move16();
285 : }
286 :
287 : /* Initial bits distribution */
288 834 : test();
289 834 : IF( EQ_16( hqswb_clas, HQ_GEN_SWB ) || EQ_16( hqswb_clas, HQ_GEN_FB ) )
290 : {
291 : /* Initial bits distribution */
292 736 : L_tmp1 = 0;
293 736 : move16();
294 736 : m_fx = 0;
295 736 : move16();
296 20608 : FOR( i = 0; i < num_env_bands; i++ )
297 : {
298 19872 : L_tmp1 = L_mac0( L_tmp1, Nb[i], y[i] ); /* Q0 */
299 : }
300 736 : L_tmp1 = L_msu0( L_tmp1, fac, B ); /* Q0 */
301 :
302 736 : t_fx = L_deposit_l( 0 );
303 736 : n = 0;
304 736 : move16();
305 736 : tmp = add( band_end_HQ[num_env_bands - 1], shl( band_end_HQ[num_env_bands - 1], 1 ) ); /* Q0 */
306 736 : exp1 = norm_s( tmp );
307 736 : tmp = div_s( 16384, shl( tmp, exp1 ) ); /*15 + 14 - exp1*/
308 736 : exp2 = norm_s( tmp );
309 736 : tmp = shl( tmp, exp2 );
310 736 : exp1 = add( 29, sub( exp2, exp1 ) );
311 :
312 29440 : FOR( i = 0; i < N; i++ )
313 : {
314 28704 : L_tmp2 = L_sub( L_mult0( y[i], band_end_HQ[num_env_bands - 1] ), L_tmp1 ); /* Q0 */
315 28704 : Rsubband_w32_fx[i] = L_mult0( extract_l( L_tmp2 ), Nb[i] );
316 28704 : move32(); /*Q0*/
317 28704 : IF( Rsubband_w32_fx[i] > 0 )
318 : {
319 16148 : n = add( n, Nb[i] );
320 16148 : Rsubband_w32_fx[i] = Mult_32_16( Rsubband_w32_fx[i], tmp );
321 16148 : move32(); /*exp1 - 15*/
322 16148 : Rsubband_w32_fx[i] = L_shl( Rsubband_w32_fx[i], sub( 30, exp1 ) ); /*Q15*/
323 :
324 16148 : t_fx = L_add( t_fx, Rsubband_w32_fx[i] ); /*Q0*/
325 : }
326 : ELSE
327 : {
328 12556 : Rsubband_w32_fx[i] = L_deposit_l( 0 );
329 12556 : move32();
330 : }
331 : }
332 : }
333 : ELSE
334 : {
335 : /* Initial bits distribution */
336 98 : L_tmp1 = 0;
337 98 : move16();
338 98 : m_fx = 0;
339 98 : move16();
340 3920 : FOR( i = 0; i < N; i++ )
341 : {
342 3822 : L_tmp1 = L_mac0( L_tmp1, Nb[i], y[i] ); /* Q0 */
343 : }
344 98 : L_tmp1 = L_msu0( L_tmp1, fac, B ); /* Q0 */
345 :
346 :
347 98 : t_fx = L_deposit_l( 0 );
348 98 : n = 0;
349 98 : move16();
350 98 : tmp = add( band_end_HQ[N - 1], shl( band_end_HQ[N - 1], 1 ) ); /* Q0 */
351 98 : exp1 = norm_s( tmp );
352 98 : tmp = div_s( 16384, shl( tmp, exp1 ) ); /*15 + 14 - exp1*/
353 98 : exp2 = norm_s( tmp );
354 98 : tmp = shl( tmp, exp2 );
355 98 : exp1 = add( 29, sub( exp2, exp1 ) );
356 3920 : FOR( i = 0; i < N; i++ )
357 : {
358 3822 : L_tmp2 = L_sub( L_mult0( y[i], band_end_HQ[N - 1] ), L_tmp1 ); /* Q0 */
359 3822 : Rsubband_w32_fx[i] = L_mult0( extract_l( L_tmp2 ), Nb[i] );
360 3822 : move32(); /*Q0*/
361 3822 : IF( Rsubband_w32_fx[i] > 0 )
362 : {
363 2577 : n = add( n, Nb[i] );
364 2577 : L_tmp3 = Mult_32_16( Rsubband_w32_fx[i], tmp ); /*exp1 - 15*/
365 2577 : Rsubband_w32_fx[i] = L_shl( L_tmp3, sub( 30, exp1 ) ); /*Q15*/
366 2577 : move32();
367 :
368 2577 : t_fx = L_add( t_fx, Rsubband_w32_fx[i] ); /*Q15*/
369 : }
370 : ELSE
371 : {
372 1245 : Rsubband_w32_fx[i] = L_deposit_l( 0 );
373 1245 : move32();
374 : }
375 : }
376 : }
377 :
378 : /* Distribute the remaining bits to subbands with non-zero bits */
379 834 : B_fx = L_shl( B, 15 );
380 1922 : WHILE( NE_32( L_shr( L_add( t_fx, 16384 ), 15 ), B ) )
381 : {
382 1088 : L_tmp1 = L_sub( t_fx, B_fx );
383 1088 : exp1 = sub( norm_l( L_tmp1 ), 1 );
384 1088 : exp2 = norm_s( n );
385 1088 : tmp = div_s( extract_h( L_shl( L_tmp1, exp1 ) ), shl( n, exp2 ) ); /*15 + 15 + exp1 - 16 - exp2*/
386 1088 : m_fx = shl_sat( tmp, sub( exp2, exp1 ) ); /*Q14*/
387 1088 : t_fx = L_deposit_l( 0 );
388 1088 : n = 0;
389 1088 : move16();
390 43520 : FOR( i = 0; i < N; i++ )
391 : {
392 42432 : IF( Rsubband_w32_fx[i] > 0 )
393 : {
394 23449 : Rsubband_w32_fx[i] = L_msu( Rsubband_w32_fx[i], m_fx, Nb[i] ); /* Q15 */
395 23449 : move32();
396 :
397 23449 : IF( Rsubband_w32_fx[i] > 0 )
398 : {
399 22476 : n = add( n, Nb[i] );
400 :
401 22476 : t_fx = L_add( t_fx, Rsubband_w32_fx[i] ); /* Q15 */
402 : }
403 : ELSE
404 : {
405 973 : Rsubband_w32_fx[i] = L_deposit_l( 0 );
406 973 : move32();
407 : }
408 : }
409 : }
410 : }
411 834 : Bits = B; /* Q0 */
412 834 : move16();
413 :
414 : /* Impose bit-constraints to subbands with less than minimum bits*/
415 834 : t_fx = L_deposit_l( 0 );
416 834 : n = 0;
417 834 : move16();
418 33360 : FOR( i = 0; i < N; i++ )
419 : {
420 32526 : IF( Rsubband_w32_fx[i] > 0 )
421 : {
422 17752 : test();
423 17752 : IF( ( LT_32( Rsubband_w32_fx[i], L_shl( add( bs, LNb[i] ), 15 ) ) ) && ( EQ_16( low_rate, 1 ) ) )
424 : {
425 3839 : Rsubband_w32_fx[i] = L_deposit_l( 0 );
426 3839 : move32();
427 : }
428 13913 : ELSE IF( LE_32( Rsubband_w32_fx[i], L_shl( Nb[i], 15 ) ) )
429 : {
430 4469 : B = sub( B, Nb[i] ); /* Q0 */
431 4469 : Rsubband_w32_fx[i] = L_shl( Nb[i], 15 ); /* Q15 */
432 4469 : move32();
433 : }
434 : ELSE
435 : {
436 9444 : n = add( n, Nb[i] ); /* Q0 */
437 9444 : 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 1884 : WHILE( NE_32( L_shr( L_add( t_fx, 16384 ), 15 ), B ) )
444 : {
445 1090 : L_tmp1 = L_sub( t_fx, L_shl( B, 15 ) );
446 1090 : L_tmp2 = L_abs( L_tmp1 );
447 :
448 1090 : IF( n > 0 )
449 : {
450 1090 : exp1 = sub( norm_l( L_tmp2 ), 1 );
451 1090 : exp2 = norm_s( n );
452 1090 : 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 1090 : 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 1090 : if ( L_tmp1 < 0 )
459 : {
460 205 : m_fx = negate( m_fx );
461 : }
462 :
463 1090 : t_fx = L_deposit_l( 0 );
464 1090 : n = 0;
465 1090 : move16();
466 43600 : FOR( i = 0; i < N; i++ )
467 : {
468 42510 : IF( GT_32( Rsubband_w32_fx[i], L_shl( Nb[i], 15 ) ) )
469 : {
470 11302 : Rsubband_w32_fx[i] = L_msu( Rsubband_w32_fx[i], m_fx, Nb[i] ); /* Q15 */
471 11302 : move32();
472 11302 : IF( GT_32( Rsubband_w32_fx[i], L_shl( Nb[i], 15 ) ) )
473 : {
474 10243 : n = add( n, Nb[i] ); /* Q0 */
475 :
476 10243 : t_fx = L_add( t_fx, Rsubband_w32_fx[i] ); /* Q15 */
477 : }
478 : ELSE
479 : {
480 1059 : B = sub( B, Nb[i] ); /* Q0 */
481 :
482 1059 : Rsubband_w32_fx[i] = L_shl( Nb[i], 15 ); /* Q15 */
483 1059 : 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 1090 : IF( t_fx == 0 )
490 : {
491 193 : FOR( i = N - 1; i >= 0; i-- )
492 : {
493 193 : IF( Rsubband_w32_fx[i] > 0 )
494 : {
495 63 : B = add( B, Nb[i] ); /* Q0 */
496 63 : Rsubband_w32_fx[i] = L_deposit_l( 0 );
497 63 : move32();
498 63 : IF( B >= 0 )
499 : {
500 40 : BREAK;
501 : }
502 : }
503 : }
504 40 : BREAK;
505 : }
506 : }
507 :
508 : /* fine redistribution of over-allocated or under-allocated bits */
509 834 : tmp = 0;
510 834 : move16();
511 33360 : FOR( i = 0; i < N; i++ )
512 : {
513 32526 : Rsubband_fx[i] = extract_l( L_shr( Rsubband_w32_fx[i], 12 ) ); /* Q3 */
514 32526 : move16();
515 32526 : tmp = add( tmp, Rsubband_fx[i] ); /* Q3 */
516 : }
517 :
518 834 : B = Bits;
519 834 : B_w16_fx = shl( B, 3 );
520 834 : IF( GT_16( tmp, B_w16_fx ) )
521 : {
522 0 : tmp = sub( tmp, B_w16_fx );
523 0 : FOR( i = 0; i < N; i++ )
524 : {
525 0 : IF( GE_16( Rsubband_fx[i], add( shl( Nb[i], 3 ), tmp ) ) )
526 : {
527 0 : Rsubband_fx[i] = sub( Rsubband_fx[i], tmp ); /* Q3 */
528 0 : move16();
529 0 : BREAK;
530 : }
531 : }
532 : }
533 : ELSE
534 : {
535 834 : tmp = sub( tmp, B_w16_fx );
536 1054 : FOR( i = 0; i < N; i++ )
537 : {
538 1054 : IF( Rsubband_fx[i] > 0 )
539 : {
540 834 : Rsubband_fx[i] = sub( Rsubband_fx[i], tmp ); /* Q3 */
541 834 : move16();
542 834 : BREAK;
543 : }
544 : }
545 : }
546 :
547 : /* Calcuate total used bits and initialize R to be used for Noise Filling */
548 834 : tmp = 0;
549 834 : move16();
550 33360 : FOR( i = 0; i < N; i++ )
551 : {
552 32526 : tmp = add( tmp, Rsubband_fx[i] ); /* Q3 */
553 32526 : R[i] = shr( Rsubband_fx[i], 3 ); /* Q0 */
554 32526 : move16();
555 : }
556 834 : return shr( tmp, 3 );
557 : }
558 : /*-------------------------------------------------------------------*
559 : * Bit_group()
560 : *
561 : * bit allocation in group
562 : *-------------------------------------------------------------------*/
563 1410 : 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 1410 : Word32 R_temp_fx[16], R_sum_fx = 0, R_sum_org_fx = 0, Bits_avg_fx = 0;
577 : Word32 L_tmp;
578 1410 : move32();
579 1410 : move32();
580 1410 : move32();
581 :
582 : /* initialization for bit allocation in one group*/
583 1410 : tmp = 6554;
584 1410 : move16(); /*Q15 1/5 */
585 1410 : if ( EQ_16( thr, 5 ) )
586 : {
587 470 : tmp = 6554;
588 470 : move16(); /*Q15 1/5 */
589 : }
590 1410 : if ( EQ_16( thr, 6 ) )
591 : {
592 470 : tmp = 5462;
593 470 : move16(); /*Q15 1/6 */
594 : }
595 1410 : if ( EQ_16( thr, 7 ) )
596 : {
597 470 : tmp = 4682;
598 470 : move16(); /*Q15 1/7 */
599 : }
600 1410 : bit_band = mult( tmp, Bits ); /*0+15-15=0, Q0 */
601 1410 : band_num = sub( end_band, start_band );
602 :
603 13630 : FOR( i = 0; i < band_num; i++ )
604 : {
605 12220 : y_index[i] = y[i + start_band]; /* Q0 */
606 12220 : move16();
607 12220 : index[i] = i;
608 12220 : move16();
609 : }
610 :
611 : /* Rearrange norm vector in decreasing order */
612 1410 : reordvct_fx( y_index, band_num, index );
613 : /* norm vector modification */
614 :
615 1410 : factor_fx = div_s( 1, band_num ); /*Q15 */
616 1410 : IF( GT_16( thr, 5 ) )
617 : {
618 5640 : FOR( i = 0; i < band_num; i++ )
619 : {
620 4700 : L_tmp = L_mult( i, factor_fx ); /*Q16 */
621 4700 : tmp = extract_h( L_shl( L_tmp, 13 ) ); /*Q13 */
622 4700 : tmp = sub( fac_fx[1], tmp ); /*Q13 */
623 4700 : L_tmp = L_mult( y_index[i], tmp ); /*Q14 */
624 4700 : y_index[i] = extract_h( L_shl( L_tmp, 2 ) ); /*Q0 */
625 4700 : move16();
626 : }
627 : }
628 : ELSE
629 : {
630 7990 : FOR( i = 0; i < band_num; i++ )
631 : {
632 7520 : L_tmp = L_mult( i, factor_fx ); /*Q16 */
633 7520 : tmp = extract_h( L_shl( L_tmp, 13 ) ); /*Q13 */
634 7520 : tmp = sub( fac_fx[0], tmp ); /*Q13 */
635 7520 : L_tmp = L_mult( y_index[i], tmp ); /*Q14 */
636 7520 : y_index[i] = extract_h( L_shl( L_tmp, 2 ) ); /*Q0 */
637 7520 : move16();
638 : }
639 : }
640 :
641 : /* bit allocation based on modified norm */
642 1410 : L_tmp = L_mult( band_num, 24576 ); /*Q16 */
643 1410 : tmp = extract_h( L_shl( L_tmp, 7 ) ); /*Q7 */
644 1410 : IF( GE_16( shl( bit_band, 7 ), tmp ) )
645 : {
646 12814 : FOR( j = 0; j < band_num; j++ )
647 : {
648 11558 : if ( y_index[j] < 0 )
649 : {
650 262 : y_index[j] = 0;
651 262 : move16();
652 : }
653 11558 : R_temp_fx[j] = 2097152;
654 11558 : move16(); /*Q21 = 1 move16(); */
655 : }
656 :
657 1256 : i = sub( band_num, 1 );
658 1256 : norm_sum = 0; /*Q0 */
659 12814 : FOR( k = 0; k <= i; k++ )
660 : {
661 11558 : norm_sum = add( norm_sum, y_index[k] );
662 : }
663 :
664 2826 : FOR( j = 0; j < band_num; j++ )
665 : {
666 2826 : 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 2826 : exp = norm_s( norm_sum );
677 2826 : tmp = shl( norm_sum, exp ); /*Q(exp) */
678 2826 : tmp = div_s( 16384, tmp ); /*Q(15+14-exp) */
679 2826 : Bits_avg_fx = L_mult( tmp, Bits ); /*Q(30-exp) */
680 :
681 28099 : FOR( k = 0; k <= i; k++ )
682 : {
683 25273 : L_tmp = L_shl( L_deposit_l( y_index[k] ), 24 );
684 25273 : L_tmp = Mult_32_32( Bits_avg_fx, L_tmp ); /*Q(23-exp) */
685 :
686 25273 : R_temp_fx[k] = L_shl( L_tmp, sub( exp, 2 ) );
687 25273 : move32(); /*Q21 */
688 : }
689 : }
690 :
691 2826 : L_tmp = L_shl( L_deposit_l( thr ), 21 ); /*Q21 */
692 2826 : IF( LT_32( R_temp_fx[i], L_tmp ) )
693 : {
694 1570 : R_temp_fx[i] = L_deposit_h( 0 );
695 1570 : move32();
696 1570 : norm_sum = sub( norm_sum, y_index[i] );
697 1570 : i--;
698 : }
699 : ELSE
700 : {
701 1256 : BREAK;
702 : }
703 : }
704 : }
705 : ELSE
706 : {
707 299 : FOR( j = 0; j < bit_band; j++ )
708 : {
709 145 : if ( y_index[j] < 0 )
710 : {
711 2 : y_index[j] = 0;
712 2 : move16();
713 : }
714 145 : R_temp_fx[j] = 2097152;
715 145 : move32(); /*Q21 = 1 */
716 : }
717 :
718 671 : FOR( j = bit_band; j < band_num; j++ )
719 : {
720 517 : R_temp_fx[j] = L_deposit_l( 0 );
721 517 : move32();
722 : }
723 :
724 154 : norm_sum = 0;
725 154 : move16();
726 299 : FOR( k = 0; k < bit_band; k++ )
727 : {
728 145 : norm_sum = add( norm_sum, y_index[k] );
729 : }
730 :
731 154 : i = bit_band;
732 154 : move16();
733 234 : FOR( j = 0; j < bit_band; j++ )
734 : {
735 104 : 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 104 : exp = norm_s( norm_sum );
746 104 : tmp = shl( norm_sum, exp ); /*Q(exp) */
747 104 : tmp = div_s( 16384, tmp ); /*Q(15+14-exp) */
748 104 : Bits_avg_fx = L_mult( tmp, Bits ); /*Q(30-exp) */
749 377 : FOR( k = 0; k < i; k++ )
750 : {
751 273 : L_tmp = L_shl( L_deposit_l( y_index[k] ), 24 );
752 273 : L_tmp = Mult_32_32( Bits_avg_fx, L_tmp ); /*Q(23-exp) */
753 :
754 273 : R_temp_fx[k] = L_shl( L_tmp, sub( exp, 2 ) );
755 273 : move32(); /*Q21 */
756 : }
757 : }
758 104 : R_sum_fx = 0;
759 104 : move32();
760 104 : L_tmp = L_shl( L_deposit_l( thr ), 21 ); /*Q21 */
761 328 : FOR( k = 0; k < i; k++ )
762 : {
763 248 : IF( LT_32( R_temp_fx[k], L_tmp ) )
764 : {
765 73 : FOR( m = k; m < i; m++ )
766 : {
767 49 : norm_sum = sub( norm_sum, y_index[m] );
768 49 : R_temp_fx[m] = L_deposit_l( 0 ); /*Q21 */
769 49 : move32();
770 : }
771 24 : i = k;
772 24 : move16();
773 24 : BREAK;
774 : }
775 : ELSE
776 : {
777 224 : R_sum_fx = L_add( R_sum_fx, R_temp_fx[k] ); /* Q21 */
778 : }
779 : }
780 104 : IF( EQ_32( R_sum_fx, R_sum_org_fx ) )
781 : {
782 24 : BREAK;
783 : }
784 :
785 80 : R_sum_org_fx = R_sum_fx;
786 80 : move32();
787 : }
788 : }
789 :
790 : /* index comeback */
791 13630 : FOR( k = 0; k < band_num; k++ )
792 : {
793 12220 : j = index[k];
794 12220 : move16();
795 12220 : Rsubband_fx[j + start_band] = R_temp_fx[k]; /* Q21 */
796 12220 : move32();
797 : }
798 :
799 1410 : return;
800 : }
801 :
802 : /*-------------------------------------------------------------------*
803 : * BitAllocWB()
804 : *
805 : * WB bit allocation
806 : *-------------------------------------------------------------------*/
807 :
808 470 : 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 470 : Word16 Rsum_sub_fx_tmp = 0; /* initialize just to avoid compiler warning */
824 470 : move16();
825 : Word32 L_tmp, L_tmp1;
826 : Word32 Rsubband_buf[NB_SFM];
827 :
828 470 : BANDS = N;
829 470 : move16();
830 470 : 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 12690 : FOR( k = 0; k < BANDS; k++ )
837 : {
838 12220 : Rsubband_buf[k] = 2097152;
839 12220 : move32(); /*Q21 */
840 : }
841 : /* Calculate the norm sum and average of sub-band */
842 470 : Rsum_sub_fx[0] = 0;
843 470 : move16();
844 7990 : FOR( j = 0; j < SFM_G1; j++ )
845 : {
846 7520 : if ( y[j] > 0 )
847 : {
848 7247 : Rsum_sub_fx_tmp = add( Rsum_sub_fx[0], y[j] ); /*Q0 */
849 : }
850 7520 : if ( y[j] > 0 )
851 : {
852 7247 : Rsum_sub_fx[0] = Rsum_sub_fx_tmp;
853 7247 : move16(); /*Q0 */
854 : }
855 : }
856 470 : Ravg_sub_32_fx[0] = L_mult( Rsum_sub_fx[0], 2048 );
857 470 : move32(); /*Q16 0+15+1 //q15 1/16 =2048 */
858 :
859 470 : Rsum_sub_fx[1] = 0;
860 470 : move16();
861 4230 : FOR( j = SFM_G1; j < SFM_G1G2; j++ )
862 : {
863 3760 : if ( y[j] > 0 )
864 : {
865 3357 : Rsum_sub_fx_tmp = add( Rsum_sub_fx[1], y[j] ); /*Q0 */
866 : }
867 3760 : if ( y[j] > 0 )
868 : {
869 3357 : Rsum_sub_fx[1] = Rsum_sub_fx_tmp;
870 3357 : move16(); /*Q0 */
871 : }
872 : }
873 470 : Ravg_sub_32_fx[1] = L_mult( Rsum_sub_fx[1], 4096 ); /*16 0+15+1 //q15 1/8 =4096 */
874 470 : move32();
875 470 : Rsum_sub_fx[2] = 0;
876 470 : move16();
877 1410 : FOR( j = SFM_G1G2; j < BANDS; j++ )
878 : {
879 940 : if ( y[j] > 0 )
880 : {
881 836 : Rsum_sub_fx_tmp = add( Rsum_sub_fx[2], y[j] ); /*Q0 */
882 : }
883 940 : if ( y[j] > 0 )
884 : {
885 836 : Rsum_sub_fx[2] = Rsum_sub_fx_tmp;
886 836 : move16(); /*Q0 */
887 : }
888 : }
889 470 : tmp = div_s( 1, BANDS - SFM_G1G2 ); /*Q15 */
890 470 : Ravg_sub_32_fx[2] = L_mult( Rsum_sub_fx[2], tmp );
891 470 : move32(); /*Q16 */
892 :
893 : /* Bit allocation for every group */
894 470 : tmp = add( Rsum_sub_fx[0], Rsum_sub_fx[1] );
895 470 : Rsum_fx = add( tmp, Rsum_sub_fx[2] ); /*Q0 */
896 :
897 470 : factor_fx[0] = 16384; /*Q13 move16(); */
898 470 : factor_fx[1] = 24576; /*Q13 move16(); */
899 470 : move16();
900 470 : move16();
901 : {
902 470 : R_diff_32_fx[0] = L_sub( Ravg_sub_32_fx[0], Ravg_sub_32_fx[1] );
903 470 : move32(); /*Q16 */
904 470 : R_diff_32_fx[1] = L_sub( Ravg_sub_32_fx[1], Ravg_sub_32_fx[2] );
905 470 : move32(); /*Q16 */
906 :
907 470 : test();
908 470 : 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 311 : 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 311 : exp = norm_s( Rsum_fx );
922 311 : tmp = shl( Rsum_fx, exp ); /*Q(exp) */
923 311 : tmp = div_s( 16384, tmp ); /*Q(15+14-exp) */
924 311 : L_tmp1 = L_mult( B, Rsum_sub_fx[0] ); /*Q1 */
925 311 : L_tmp = Mult_32_16( L_tmp1, tmp ); /*Q(15-exp) */
926 311 : B1 = extract_h( L_shl( L_tmp, add( exp, 1 ) ) ); /*Q0 */
927 311 : test();
928 311 : if ( GT_32( L_tmp1, L_mult( B1, Rsum_fx ) ) && GE_32( L_tmp1, L_mult( add( B1, 1 ), Rsum_fx ) ) )
929 : {
930 31 : B1 = add( B1, 1 );
931 : }
932 311 : L_tmp1 = L_mult( B, Rsum_sub_fx[1] ); /*Q1 */
933 311 : L_tmp = Mult_32_16( L_tmp1, tmp ); /*Q(15-exp) */
934 311 : B2 = extract_h( L_shl( L_tmp, add( exp, 1 ) ) ); /*Q0 */
935 311 : test();
936 311 : if ( GT_32( L_tmp1, L_mult( B2, Rsum_fx ) ) && GE_32( L_tmp1, L_mult( add( B2, 1 ), Rsum_fx ) ) )
937 : {
938 6 : B2 = add( B2, 1 );
939 : }
940 311 : L_tmp1 = L_mult( B, Rsum_sub_fx[2] ); /*Q1 */
941 311 : L_tmp = Mult_32_16( L_tmp1, tmp ); /*Q(15-exp) */
942 311 : B3 = extract_h( L_shl( L_tmp, add( exp, 1 ) ) ); /*Q0 */
943 311 : test();
944 311 : if ( GT_32( L_tmp1, L_mult( B3, Rsum_fx ) ) && GE_32( L_tmp1, L_mult( add( B3, 1 ), Rsum_fx ) ) )
945 : {
946 5 : B3 = add( B3, 1 );
947 : }
948 : }
949 311 : IF( GT_32( Ravg_sub_32_fx[2], 786432 /* 12 in Q16 */ ) )
950 : {
951 104 : B_saved = 0;
952 104 : move16();
953 104 : IF( GT_16( B1, 288 ) )
954 : {
955 13 : B_saved = sub( B1, 288 ); /* Q0 */
956 13 : B1 = 288;
957 13 : move16();
958 : }
959 :
960 104 : 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 104 : 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 104 : IF( B_saved > 0 )
977 : {
978 13 : IF( EQ_16( B1, 288 ) )
979 : {
980 13 : tmp = shr( B_saved, 1 ); /* Q0 */
981 13 : B2 = add( B2, tmp ); /* Q0 */
982 13 : tmp = sub( B, B1 ); /* Q0 */
983 13 : 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 311 : factor_fx[0] = 16384;
1004 311 : move16(); /*Q13 */
1005 311 : factor_fx[1] = 12288;
1006 311 : move16(); /*Q13 */
1007 : }
1008 : ELSE
1009 : {
1010 159 : 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 159 : exp = norm_s( Rsum_fx );
1022 159 : tmp = shl( Rsum_fx, exp ); /*Q(exp) */
1023 159 : tmp = div_s( 16384, tmp ); /*Q(15+14-exp) */
1024 159 : L_tmp1 = L_mult( B, Rsum_sub_fx[0] ); /*Q1 */
1025 159 : L_tmp = Mult_32_16( L_tmp1, tmp ); /*Q(15-exp) */
1026 159 : B1 = extract_h( L_shl( L_tmp, add( exp, 1 ) ) ); /*Q0 */
1027 159 : test();
1028 159 : if ( GT_32( L_tmp1, L_mult( B1, Rsum_fx ) ) && GE_32( L_tmp1, L_mult( add( B1, 1 ), Rsum_fx ) ) )
1029 : {
1030 1 : B1 = add( B1, 1 ); /* Q0 */
1031 : }
1032 159 : L_tmp1 = Mult_32_16( 1975684956, shl( B, 5 ) ); /*Q(31+5-15=21) */
1033 159 : L_tmp1 = Mult_32_16( L_tmp1, shl( Rsum_sub_fx[1], 7 ) ); /*Q(21+7-15=13) */
1034 159 : L_tmp = Mult_32_16( L_tmp1, tmp ); /*Q(27-exp) */
1035 159 : B2 = extract_h( L_shl( L_tmp, sub( exp, 11 ) ) ); /*Q0 */
1036 159 : test();
1037 159 : 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 159 : tmp = sub( B, B1 ); /* Q0 */
1042 159 : B3 = sub( tmp, B2 ); /* Q0 */
1043 : }
1044 : }
1045 : }
1046 :
1047 470 : IF( LT_16( Rsum_sub_fx[2], 3 ) )
1048 : {
1049 64 : B2 = add( B2, B3 ); /* Q0 */
1050 64 : B3 = 0;
1051 64 : move16();
1052 : }
1053 :
1054 : /* Bit allocation in group */
1055 470 : Bit_group_fx( y, 0, SFM_G1, B1, 5, Rsubband_buf, factor_fx );
1056 470 : Bit_group_fx( y, SFM_G1, SFM_G1G2, B2, 6, Rsubband_buf, factor_fx );
1057 470 : Bit_group_fx( y, SFM_G1G2, BANDS, B3, 7, Rsubband_buf, factor_fx );
1058 12690 : FOR( i = 0; i < BANDS; i++ )
1059 : {
1060 12220 : Rsubband_fx[i] = extract_l( L_shr( Rsubband_buf[i], 18 ) ); /* Q3 */
1061 12220 : move16();
1062 : }
1063 :
1064 : /* Calcuate total used bits and initialize R to be used for Noise Filling */
1065 470 : L_tmp = L_deposit_l( 0 );
1066 12690 : FOR( i = 0; i < N; i++ )
1067 : {
1068 12220 : L_tmp = L_add( L_tmp, Rsubband_buf[i] ); /*Q21 */
1069 12220 : R[i] = extract_h( L_shr( Rsubband_buf[i], 5 ) ); /*Q0 */
1070 12220 : move16();
1071 : }
1072 470 : t_fx = extract_h( L_shr( L_tmp, 5 ) ); /*Q0 */
1073 :
1074 470 : return (Word16) t_fx;
1075 : }
1076 :
1077 : #undef WMC_TOOL_SKIP
|