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