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 5219 : 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 5219 : Flag Overflow = 0;
28 5219 : move32();
29 : #endif
30 5219 : Word16 SFM_thr = SFM_G1G2;
31 5219 : move16();
32 :
33 5219 : N = sub( N, 1 ); /* Q0 */
34 :
35 5219 : if ( EQ_16( hqswb_clas, HQ_HARMONIC ) )
36 : {
37 728 : SFM_thr = 22; /* Q0 */
38 728 : move16();
39 : }
40 :
41 5219 : fac = 3;
42 5219 : move16();
43 5219 : K = sub( K, 2 ); /* Q0 */
44 5219 : im = 1;
45 5219 : move16();
46 5219 : diff = sum; /* Q0 */
47 5219 : move16();
48 5219 : n = shr( sum, 3 ); /* Q0 */
49 231614 : FOR( i = 0; i < n; i++ )
50 : {
51 231614 : k = 0;
52 231614 : move16();
53 231614 : temp = y[0];
54 231614 : move16();
55 3195415 : FOR( m = 1; m < im; m++ )
56 : {
57 2963801 : v = sub_o( temp, y[m], &Overflow ); /* Q0 */
58 2963801 : temp = s_max( temp, y[m] );
59 2963801 : if ( v < 0 )
60 : {
61 225589 : k = m; /* Q0 */
62 225589 : move16();
63 : }
64 : }
65 :
66 231614 : IF( LT_16( temp, y[m] ) )
67 : {
68 113116 : k = m;
69 113116 : move16();
70 113116 : if ( LT_16( im, N ) )
71 : {
72 112990 : im = add( im, 1 ); /* Q0 */
73 : }
74 : }
75 :
76 231614 : j = idx[k];
77 231614 : move16();
78 :
79 231614 : test();
80 231614 : IF( GE_16( sum, sfmsize[j] ) && LT_16( r[j], K ) )
81 : {
82 229657 : y[k] = sub( y[k], fac ); /* Q0 */
83 229657 : move16();
84 229657 : r[j] = add( r[j], 1 ); /* Q0 */
85 229657 : move16();
86 :
87 229657 : if ( GE_16( r[j], K ) )
88 : {
89 551 : y[k] = -32768;
90 551 : move16();
91 : }
92 229657 : sum = sub( sum, sfmsize[j] ); /* Q0 */
93 : }
94 : ELSE
95 : {
96 1957 : y[k] = -32768;
97 1957 : move16();
98 1957 : k = add( k, 1 );
99 1957 : test();
100 1957 : if ( EQ_16( k, im ) && LT_16( im, N ) )
101 : {
102 1046 : im = add( im, 1 ); /* Q0 */
103 : }
104 : }
105 :
106 231614 : test();
107 231614 : 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 226395 : diff = sum; /* Q0 */
113 226395 : move16();
114 226395 : v = sub( N, 1 ); /* Q0 */
115 :
116 226395 : IF( GT_16( k, v ) )
117 : {
118 253 : FOR( ii = 0; ii <= N; ii++ )
119 : {
120 253 : IF( GT_16( y[ii], -32768 ) )
121 : {
122 119 : if ( LT_16( ii, N ) )
123 : {
124 119 : im = add( ii, 1 ); /* Q0 */
125 : }
126 119 : BREAK;
127 : }
128 : }
129 : }
130 : }
131 :
132 :
133 5219 : 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 19115 : FOR( i = 0; i <= N; i++ )
136 : {
137 18924 : j = idx[i]; /* Q0 */
138 18924 : move16();
139 18924 : test();
140 18924 : test();
141 18924 : IF( GE_16( j, SFM_G1 ) && LT_16( j, SFM_thr ) && r[j] == 0 )
142 : {
143 507 : r[j] = 1;
144 507 : move16();
145 507 : sum = sub( sum, sfmsize[j] ); /* Q0 */
146 507 : IF( LT_16( sum, sfmsize[SFM_G1] ) )
147 : {
148 486 : BREAK;
149 : }
150 : }
151 : }
152 : }
153 :
154 5219 : IF( GE_16( sum, sfmsize[SFM_G1] ) )
155 : {
156 4062 : FOR( i = 0; i <= N; i++ )
157 : {
158 4035 : j = idx[i];
159 4035 : move16();
160 4035 : test();
161 4035 : test();
162 4035 : IF( GE_16( j, SFM_G1 ) && LT_16( j, SFM_thr ) && EQ_16( r[j], 1 ) )
163 : {
164 170 : r[j] = 2;
165 170 : move16();
166 170 : sum = sub( sum, sfmsize[j] ); /* Q0 */
167 170 : IF( LT_16( sum, sfmsize[SFM_G1] ) )
168 : {
169 164 : BREAK;
170 : }
171 : }
172 : }
173 : }
174 :
175 5219 : IF( GE_16( sum, sfmsize[SFM_G1 - 1] ) )
176 : {
177 44446 : FOR( i = 0; i <= N; i++ )
178 : {
179 43771 : j = idx[i]; /* Q0 */
180 43771 : move16();
181 43771 : test();
182 43771 : IF( LT_16( j, SFM_G1 ) && r[j] == 0 )
183 : {
184 752 : r[j] = 1;
185 752 : move16();
186 752 : sum = sub( sum, sfmsize[j] ); /* Q0 */
187 752 : IF( LT_16( sum, sfmsize[SFM_G1 - 1] ) )
188 : {
189 752 : BREAK;
190 : }
191 : }
192 : }
193 : }
194 :
195 5219 : IF( GE_16( sum, sfmsize[SFM_G1 - 1] ) )
196 : {
197 16706 : FOR( i = 0; i <= N; i++ )
198 : {
199 16477 : j = idx[i]; /* Q0 */
200 16477 : move16();
201 16477 : test();
202 16477 : IF( LT_16( j, SFM_G1 ) && EQ_16( r[j], 1 ) )
203 : {
204 454 : r[j] = 2; /* Q0 */
205 454 : move16();
206 454 : sum = sub( sum, sfmsize[j] ); /* Q0 */
207 454 : IF( LT_16( sum, sfmsize[SFM_G1 - 1] ) )
208 : {
209 446 : BREAK;
210 : }
211 : }
212 : }
213 : }
214 :
215 5219 : return;
216 : }
217 :
218 : #define WMC_TOOL_SKIP
219 :
220 : /*-------------------------------------------------------------------*
221 : * BitAllocF()
222 : *
223 : * Fractional bit allocation
224 : *-------------------------------------------------------------------*/
225 :
226 815 : 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 815 : Word16 i, n, Nmin, Bits, bs, low_rate = 0;
240 815 : 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 815 : Flag Overflow = 0;
250 815 : move32();
251 : #endif
252 :
253 815 : set32_fx( Rsubband_w32_fx, 0, NB_SFM );
254 :
255 815 : fac = 3;
256 815 : move16();
257 :
258 815 : IF( LT_32( bit_rate, 32000 ) )
259 : {
260 815 : bs = 2;
261 815 : move16();
262 : }
263 : ELSE
264 : {
265 0 : bs = 3;
266 0 : move16();
267 : }
268 815 : low_rate = 1;
269 815 : move16();
270 :
271 815 : Nmin = N; /* Q0 */
272 815 : move16();
273 815 : if ( GT_16( Nmin, SFM_N ) )
274 : {
275 815 : Nmin = SFM_N; /* Q0 */
276 815 : move16();
277 : }
278 :
279 : /* Initial bits distribution */
280 815 : test();
281 815 : IF( EQ_16( hqswb_clas, HQ_GEN_SWB ) || EQ_16( hqswb_clas, HQ_GEN_FB ) )
282 : {
283 : /* Initial bits distribution */
284 719 : L_tmp1 = 0;
285 719 : move16();
286 719 : m_fx = 0;
287 719 : move16();
288 20132 : FOR( i = 0; i < num_env_bands; i++ )
289 : {
290 19413 : L_tmp1 = L_mac0( L_tmp1, Nb[i], y[i] ); /* Q0 */
291 : }
292 719 : L_tmp1 = L_msu0( L_tmp1, fac, B ); /* Q0 */
293 :
294 719 : t_fx = L_deposit_l( 0 );
295 719 : n = 0;
296 719 : move16();
297 719 : tmp = add( band_end_HQ[num_env_bands - 1], shl( band_end_HQ[num_env_bands - 1], 1 ) ); /* Q0 */
298 719 : exp1 = norm_s( tmp );
299 719 : tmp = div_s( 16384, shl( tmp, exp1 ) ); /*15 + 14 - exp1*/
300 719 : exp2 = norm_s( tmp );
301 719 : tmp = shl( tmp, exp2 );
302 719 : exp1 = add( 29, sub( exp2, exp1 ) );
303 :
304 28760 : FOR( i = 0; i < N; i++ )
305 : {
306 28041 : L_tmp2 = L_sub( L_mult0( y[i], band_end_HQ[num_env_bands - 1] ), L_tmp1 ); /* Q0 */
307 28041 : Rsubband_w32_fx[i] = L_mult0( extract_l( L_tmp2 ), Nb[i] );
308 28041 : move32(); /*Q0*/
309 28041 : IF( Rsubband_w32_fx[i] > 0 )
310 : {
311 15726 : n = add( n, Nb[i] );
312 15726 : Rsubband_w32_fx[i] = Mult_32_16( Rsubband_w32_fx[i], tmp );
313 15726 : move32(); /*exp1 - 15*/
314 15726 : Rsubband_w32_fx[i] = L_shl( Rsubband_w32_fx[i], sub( 30, exp1 ) ); /*Q15*/
315 :
316 15726 : t_fx = L_add( t_fx, Rsubband_w32_fx[i] ); /*Q0*/
317 : }
318 : ELSE
319 : {
320 12315 : Rsubband_w32_fx[i] = L_deposit_l( 0 );
321 12315 : move32();
322 : }
323 : }
324 : }
325 : ELSE
326 : {
327 : /* Initial bits distribution */
328 96 : L_tmp1 = 0;
329 96 : move16();
330 96 : m_fx = 0;
331 96 : move16();
332 3840 : FOR( i = 0; i < N; i++ )
333 : {
334 3744 : L_tmp1 = L_mac0( L_tmp1, Nb[i], y[i] ); /* Q0 */
335 : }
336 96 : L_tmp1 = L_msu0( L_tmp1, fac, B ); /* Q0 */
337 :
338 :
339 96 : t_fx = L_deposit_l( 0 );
340 96 : n = 0;
341 96 : move16();
342 96 : tmp = add( band_end_HQ[N - 1], shl( band_end_HQ[N - 1], 1 ) ); /* Q0 */
343 96 : exp1 = norm_s( tmp );
344 96 : tmp = div_s( 16384, shl( tmp, exp1 ) ); /*15 + 14 - exp1*/
345 96 : exp2 = norm_s( tmp );
346 96 : tmp = shl( tmp, exp2 );
347 96 : exp1 = add( 29, sub( exp2, exp1 ) );
348 3840 : FOR( i = 0; i < N; i++ )
349 : {
350 3744 : L_tmp2 = L_sub( L_mult0( y[i], band_end_HQ[N - 1] ), L_tmp1 ); /* Q0 */
351 3744 : Rsubband_w32_fx[i] = L_mult0( extract_l( L_tmp2 ), Nb[i] );
352 3744 : move32(); /*Q0*/
353 3744 : IF( Rsubband_w32_fx[i] > 0 )
354 : {
355 2513 : n = add( n, Nb[i] );
356 2513 : L_tmp3 = Mult_32_16( Rsubband_w32_fx[i], tmp ); /*exp1 - 15*/
357 2513 : Rsubband_w32_fx[i] = L_shl( L_tmp3, sub( 30, exp1 ) ); /*Q15*/
358 2513 : move32();
359 :
360 2513 : t_fx = L_add( t_fx, Rsubband_w32_fx[i] ); /*Q15*/
361 : }
362 : ELSE
363 : {
364 1231 : Rsubband_w32_fx[i] = L_deposit_l( 0 );
365 1231 : move32();
366 : }
367 : }
368 : }
369 :
370 : /* Distribute the remaining bits to subbands with non-zero bits */
371 815 : B_fx = L_shl( B, 15 );
372 1877 : WHILE( NE_32( L_shr( L_add( t_fx, 16384 ), 15 ), B ) )
373 : {
374 1062 : L_tmp1 = L_sub( t_fx, B_fx );
375 1062 : exp1 = sub( norm_l( L_tmp1 ), 1 );
376 1062 : exp2 = norm_s( n );
377 1062 : tmp = div_s( extract_h( L_shl( L_tmp1, exp1 ) ), shl( n, exp2 ) ); /*15 + 15 + exp1 - 16 - exp2*/
378 1062 : m_fx = shl_sat( tmp, sub( exp2, exp1 ) ); /*Q14*/
379 1062 : t_fx = L_deposit_l( 0 );
380 1062 : n = 0;
381 1062 : move16();
382 42480 : FOR( i = 0; i < N; i++ )
383 : {
384 41418 : IF( Rsubband_w32_fx[i] > 0 )
385 : {
386 22816 : Rsubband_w32_fx[i] = L_msu( Rsubband_w32_fx[i], m_fx, Nb[i] ); /* Q15 */
387 22816 : move32();
388 :
389 22816 : IF( Rsubband_w32_fx[i] > 0 )
390 : {
391 21860 : n = add( n, Nb[i] );
392 :
393 21860 : t_fx = L_add( t_fx, Rsubband_w32_fx[i] ); /* Q15 */
394 : }
395 : ELSE
396 : {
397 956 : Rsubband_w32_fx[i] = L_deposit_l( 0 );
398 956 : move32();
399 : }
400 : }
401 : }
402 : }
403 815 : Bits = B; /* Q0 */
404 815 : move16();
405 :
406 : /* Impose bit-constraints to subbands with less than minimum bits*/
407 815 : t_fx = L_deposit_l( 0 );
408 815 : n = 0;
409 815 : move16();
410 32600 : FOR( i = 0; i < N; i++ )
411 : {
412 31785 : IF( Rsubband_w32_fx[i] > 0 )
413 : {
414 17283 : test();
415 17283 : IF( ( LT_32( Rsubband_w32_fx[i], L_shl( add( bs, LNb[i] ), 15 ) ) ) && ( EQ_16( low_rate, 1 ) ) )
416 : {
417 3750 : Rsubband_w32_fx[i] = L_deposit_l( 0 );
418 3750 : move32();
419 : }
420 13533 : ELSE IF( LE_32( Rsubband_w32_fx[i], L_shl( Nb[i], 15 ) ) )
421 : {
422 4333 : B = sub( B, Nb[i] ); /* Q0 */
423 4333 : Rsubband_w32_fx[i] = L_shl( Nb[i], 15 ); /* Q15 */
424 4333 : move32();
425 : }
426 : ELSE
427 : {
428 9200 : n = add( n, Nb[i] ); /* Q0 */
429 9200 : 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 1846 : WHILE( NE_32( L_shr( L_add( t_fx, 16384 ), 15 ), B ) )
436 : {
437 1070 : L_tmp1 = L_sub( t_fx, L_shl( B, 15 ) );
438 1070 : L_tmp2 = L_abs( L_tmp1 );
439 :
440 1070 : IF( n > 0 )
441 : {
442 1070 : exp1 = sub( norm_l( L_tmp2 ), 1 );
443 1070 : exp2 = norm_s( n );
444 1070 : tmp = div_s( extract_h( L_shl( L_tmp2, exp1 ) ), shl( n, exp2 ) ); /*15 + 15 + exp1 - 16 - exp2*/
445 1070 : m_fx = shl_o( tmp, sub( exp2, exp1 ), &Overflow ); /*Q14*/
446 1070 : if ( L_tmp1 < 0 )
447 : {
448 211 : m_fx = negate( m_fx );
449 : }
450 :
451 1070 : t_fx = L_deposit_l( 0 );
452 1070 : n = 0;
453 1070 : move16();
454 42800 : FOR( i = 0; i < N; i++ )
455 : {
456 41730 : IF( GT_32( Rsubband_w32_fx[i], L_shl( Nb[i], 15 ) ) )
457 : {
458 11058 : Rsubband_w32_fx[i] = L_msu( Rsubband_w32_fx[i], m_fx, Nb[i] ); /* Q15 */
459 11058 : move32();
460 11058 : IF( GT_32( Rsubband_w32_fx[i], L_shl( Nb[i], 15 ) ) )
461 : {
462 10009 : n = add( n, Nb[i] ); /* Q0 */
463 :
464 10009 : t_fx = L_add( t_fx, Rsubband_w32_fx[i] ); /* Q15 */
465 : }
466 : ELSE
467 : {
468 1049 : B = sub( B, Nb[i] ); /* Q0 */
469 :
470 1049 : Rsubband_w32_fx[i] = L_shl( Nb[i], 15 ); /* Q15 */
471 1049 : 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 1070 : IF( t_fx == 0 )
478 : {
479 192 : FOR( i = N - 1; i >= 0; i-- )
480 : {
481 192 : IF( Rsubband_w32_fx[i] > 0 )
482 : {
483 62 : B = add( B, Nb[i] ); /* Q0 */
484 62 : Rsubband_w32_fx[i] = L_deposit_l( 0 );
485 62 : move32();
486 62 : IF( B >= 0 )
487 : {
488 39 : BREAK;
489 : }
490 : }
491 : }
492 39 : BREAK;
493 : }
494 : }
495 :
496 : /* fine redistribution of over-allocated or under-allocated bits */
497 815 : tmp = 0;
498 815 : move16();
499 32600 : FOR( i = 0; i < N; i++ )
500 : {
501 31785 : Rsubband_fx[i] = extract_l( L_shr( Rsubband_w32_fx[i], 12 ) ); /* Q3 */
502 31785 : move16();
503 31785 : tmp = add( tmp, Rsubband_fx[i] ); /* Q3 */
504 : }
505 :
506 815 : B = Bits;
507 815 : B_w16_fx = shl( B, 3 );
508 815 : IF( GT_16( tmp, B_w16_fx ) )
509 : {
510 0 : tmp = sub( tmp, B_w16_fx );
511 0 : FOR( i = 0; i < N; i++ )
512 : {
513 0 : IF( GE_16( Rsubband_fx[i], add( shl( Nb[i], 3 ), tmp ) ) )
514 : {
515 0 : Rsubband_fx[i] = sub( Rsubband_fx[i], tmp ); /* Q3 */
516 0 : move16();
517 0 : BREAK;
518 : }
519 : }
520 : }
521 : ELSE
522 : {
523 815 : tmp = sub( tmp, B_w16_fx );
524 1016 : FOR( i = 0; i < N; i++ )
525 : {
526 1016 : IF( Rsubband_fx[i] > 0 )
527 : {
528 815 : Rsubband_fx[i] = sub( Rsubband_fx[i], tmp ); /* Q3 */
529 815 : move16();
530 815 : BREAK;
531 : }
532 : }
533 : }
534 :
535 : /* Calcuate total used bits and initialize R to be used for Noise Filling */
536 815 : tmp = 0;
537 815 : move16();
538 32600 : FOR( i = 0; i < N; i++ )
539 : {
540 31785 : tmp = add( tmp, Rsubband_fx[i] ); /* Q3 */
541 31785 : R[i] = shr( Rsubband_fx[i], 3 ); /* Q0 */
542 31785 : move16();
543 : }
544 815 : return shr( tmp, 3 );
545 : }
546 : /*-------------------------------------------------------------------*
547 : * Bit_group()
548 : *
549 : * bit allocation in group
550 : *-------------------------------------------------------------------*/
551 1395 : 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 1395 : Word32 R_temp_fx[16], R_sum_fx = 0, R_sum_org_fx = 0, Bits_avg_fx = 0;
565 : Word32 L_tmp;
566 1395 : move32();
567 1395 : move32();
568 1395 : move32();
569 :
570 : /* initialization for bit allocation in one group*/
571 1395 : tmp = 6554;
572 1395 : move16(); /*Q15 1/5 */
573 1395 : if ( EQ_16( thr, 5 ) )
574 : {
575 465 : tmp = 6554;
576 465 : move16(); /*Q15 1/5 */
577 : }
578 1395 : if ( EQ_16( thr, 6 ) )
579 : {
580 465 : tmp = 5462;
581 465 : move16(); /*Q15 1/6 */
582 : }
583 1395 : if ( EQ_16( thr, 7 ) )
584 : {
585 465 : tmp = 4682;
586 465 : move16(); /*Q15 1/7 */
587 : }
588 1395 : bit_band = mult( tmp, Bits ); /*0+15-15=0, Q0 */
589 1395 : band_num = sub( end_band, start_band );
590 :
591 13485 : FOR( i = 0; i < band_num; i++ )
592 : {
593 12090 : y_index[i] = y[i + start_band]; /* Q0 */
594 12090 : move16();
595 12090 : index[i] = i;
596 12090 : move16();
597 : }
598 :
599 : /* Rearrange norm vector in decreasing order */
600 1395 : reordvct_fx( y_index, band_num, index );
601 : /* norm vector modification */
602 :
603 1395 : factor_fx = div_s( 1, band_num ); /*Q15 */
604 1395 : IF( GT_16( thr, 5 ) )
605 : {
606 5580 : FOR( i = 0; i < band_num; i++ )
607 : {
608 4650 : L_tmp = L_mult( i, factor_fx ); /*Q16 */
609 4650 : tmp = extract_h( L_shl( L_tmp, 13 ) ); /*Q13 */
610 4650 : tmp = sub( fac_fx[1], tmp ); /*Q13 */
611 4650 : L_tmp = L_mult( y_index[i], tmp ); /*Q14 */
612 4650 : y_index[i] = extract_h( L_shl( L_tmp, 2 ) ); /*Q0 */
613 4650 : move16();
614 : }
615 : }
616 : ELSE
617 : {
618 7905 : FOR( i = 0; i < band_num; i++ )
619 : {
620 7440 : L_tmp = L_mult( i, factor_fx ); /*Q16 */
621 7440 : tmp = extract_h( L_shl( L_tmp, 13 ) ); /*Q13 */
622 7440 : tmp = sub( fac_fx[0], tmp ); /*Q13 */
623 7440 : L_tmp = L_mult( y_index[i], tmp ); /*Q14 */
624 7440 : y_index[i] = extract_h( L_shl( L_tmp, 2 ) ); /*Q0 */
625 7440 : move16();
626 : }
627 : }
628 :
629 : /* bit allocation based on modified norm */
630 1395 : L_tmp = L_mult( band_num, 24576 ); /*Q16 */
631 1395 : tmp = extract_h( L_shl( L_tmp, 7 ) ); /*Q7 */
632 1395 : IF( GE_16( shl( bit_band, 7 ), tmp ) )
633 : {
634 12669 : FOR( j = 0; j < band_num; j++ )
635 : {
636 11428 : if ( y_index[j] < 0 )
637 : {
638 262 : y_index[j] = 0;
639 262 : move16();
640 : }
641 11428 : R_temp_fx[j] = 2097152;
642 11428 : move16(); /*Q21 = 1 move16(); */
643 : }
644 :
645 1241 : i = sub( band_num, 1 );
646 1241 : norm_sum = 0; /*Q0 */
647 12669 : FOR( k = 0; k <= i; k++ )
648 : {
649 11428 : norm_sum = add( norm_sum, y_index[k] );
650 : }
651 :
652 2807 : FOR( j = 0; j < band_num; j++ )
653 : {
654 2807 : 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 2807 : exp = norm_s( norm_sum );
665 2807 : tmp = shl( norm_sum, exp ); /*Q(exp) */
666 2807 : tmp = div_s( 16384, tmp ); /*Q(15+14-exp) */
667 2807 : Bits_avg_fx = L_mult( tmp, Bits ); /*Q(30-exp) */
668 :
669 27914 : FOR( k = 0; k <= i; k++ )
670 : {
671 25107 : L_tmp = L_shl( L_deposit_l( y_index[k] ), 24 );
672 25107 : L_tmp = Mult_32_32( Bits_avg_fx, L_tmp ); /*Q(23-exp) */
673 :
674 25107 : R_temp_fx[k] = L_shl( L_tmp, sub( exp, 2 ) );
675 25107 : move32(); /*Q21 */
676 : }
677 : }
678 :
679 2807 : L_tmp = L_shl( L_deposit_l( thr ), 21 ); /*Q21 */
680 2807 : IF( LT_32( R_temp_fx[i], L_tmp ) )
681 : {
682 1566 : R_temp_fx[i] = L_deposit_h( 0 );
683 1566 : move32();
684 1566 : norm_sum = sub( norm_sum, y_index[i] );
685 1566 : i--;
686 : }
687 : ELSE
688 : {
689 1241 : BREAK;
690 : }
691 : }
692 : }
693 : ELSE
694 : {
695 299 : FOR( j = 0; j < bit_band; j++ )
696 : {
697 145 : if ( y_index[j] < 0 )
698 : {
699 2 : y_index[j] = 0;
700 2 : move16();
701 : }
702 145 : R_temp_fx[j] = 2097152;
703 145 : move32(); /*Q21 = 1 */
704 : }
705 :
706 671 : FOR( j = bit_band; j < band_num; j++ )
707 : {
708 517 : R_temp_fx[j] = L_deposit_l( 0 );
709 517 : move32();
710 : }
711 :
712 154 : norm_sum = 0;
713 154 : move16();
714 299 : FOR( k = 0; k < bit_band; k++ )
715 : {
716 145 : norm_sum = add( norm_sum, y_index[k] );
717 : }
718 :
719 154 : i = bit_band;
720 154 : move16();
721 234 : FOR( j = 0; j < bit_band; j++ )
722 : {
723 104 : 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 104 : exp = norm_s( norm_sum );
734 104 : tmp = shl( norm_sum, exp ); /*Q(exp) */
735 104 : tmp = div_s( 16384, tmp ); /*Q(15+14-exp) */
736 104 : Bits_avg_fx = L_mult( tmp, Bits ); /*Q(30-exp) */
737 377 : FOR( k = 0; k < i; k++ )
738 : {
739 273 : L_tmp = L_shl( L_deposit_l( y_index[k] ), 24 );
740 273 : L_tmp = Mult_32_32( Bits_avg_fx, L_tmp ); /*Q(23-exp) */
741 :
742 273 : R_temp_fx[k] = L_shl( L_tmp, sub( exp, 2 ) );
743 273 : move32(); /*Q21 */
744 : }
745 : }
746 104 : R_sum_fx = 0;
747 104 : move32();
748 104 : L_tmp = L_shl( L_deposit_l( thr ), 21 ); /*Q21 */
749 328 : FOR( k = 0; k < i; k++ )
750 : {
751 248 : IF( LT_32( R_temp_fx[k], L_tmp ) )
752 : {
753 73 : FOR( m = k; m < i; m++ )
754 : {
755 49 : norm_sum = sub( norm_sum, y_index[m] );
756 49 : R_temp_fx[m] = L_deposit_l( 0 ); /*Q21 */
757 49 : move32();
758 : }
759 24 : i = k;
760 24 : move16();
761 24 : BREAK;
762 : }
763 : ELSE
764 : {
765 224 : R_sum_fx = L_add( R_sum_fx, R_temp_fx[k] ); /* Q21 */
766 : }
767 : }
768 104 : IF( EQ_32( R_sum_fx, R_sum_org_fx ) )
769 : {
770 24 : BREAK;
771 : }
772 :
773 80 : R_sum_org_fx = R_sum_fx;
774 80 : move32();
775 : }
776 : }
777 :
778 : /* index comeback */
779 13485 : FOR( k = 0; k < band_num; k++ )
780 : {
781 12090 : j = index[k];
782 12090 : move16();
783 12090 : Rsubband_fx[j + start_band] = R_temp_fx[k]; /* Q21 */
784 12090 : move32();
785 : }
786 :
787 1395 : return;
788 : }
789 :
790 : /*-------------------------------------------------------------------*
791 : * BitAllocWB()
792 : *
793 : * WB bit allocation
794 : *-------------------------------------------------------------------*/
795 :
796 465 : 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 465 : Word16 Rsum_sub_fx_tmp = 0; /* initialize just to avoid compiler warning */
812 465 : move16();
813 : Word32 L_tmp, L_tmp1;
814 : Word32 Rsubband_buf[NB_SFM];
815 :
816 465 : BANDS = N;
817 465 : move16();
818 465 : 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 12555 : FOR( k = 0; k < BANDS; k++ )
825 : {
826 12090 : Rsubband_buf[k] = 2097152;
827 12090 : move32(); /*Q21 */
828 : }
829 : /* Calculate the norm sum and average of sub-band */
830 465 : Rsum_sub_fx[0] = 0;
831 465 : move16();
832 7905 : FOR( j = 0; j < SFM_G1; j++ )
833 : {
834 7440 : if ( y[j] > 0 )
835 : {
836 7167 : Rsum_sub_fx_tmp = add( Rsum_sub_fx[0], y[j] ); /*Q0 */
837 : }
838 7440 : if ( y[j] > 0 )
839 : {
840 7167 : Rsum_sub_fx[0] = Rsum_sub_fx_tmp;
841 7167 : move16(); /*Q0 */
842 : }
843 : }
844 465 : Ravg_sub_32_fx[0] = L_mult( Rsum_sub_fx[0], 2048 );
845 465 : move32(); /*Q16 0+15+1 //q15 1/16 =2048 */
846 :
847 465 : Rsum_sub_fx[1] = 0;
848 465 : move16();
849 4185 : FOR( j = SFM_G1; j < SFM_G1G2; j++ )
850 : {
851 3720 : if ( y[j] > 0 )
852 : {
853 3317 : Rsum_sub_fx_tmp = add( Rsum_sub_fx[1], y[j] ); /*Q0 */
854 : }
855 3720 : if ( y[j] > 0 )
856 : {
857 3317 : Rsum_sub_fx[1] = Rsum_sub_fx_tmp;
858 3317 : move16(); /*Q0 */
859 : }
860 : }
861 465 : Ravg_sub_32_fx[1] = L_mult( Rsum_sub_fx[1], 4096 ); /*16 0+15+1 //q15 1/8 =4096 */
862 465 : move32();
863 465 : Rsum_sub_fx[2] = 0;
864 465 : move16();
865 1395 : FOR( j = SFM_G1G2; j < BANDS; j++ )
866 : {
867 930 : if ( y[j] > 0 )
868 : {
869 826 : Rsum_sub_fx_tmp = add( Rsum_sub_fx[2], y[j] ); /*Q0 */
870 : }
871 930 : if ( y[j] > 0 )
872 : {
873 826 : Rsum_sub_fx[2] = Rsum_sub_fx_tmp;
874 826 : move16(); /*Q0 */
875 : }
876 : }
877 465 : tmp = div_s( 1, BANDS - SFM_G1G2 ); /*Q15 */
878 465 : Ravg_sub_32_fx[2] = L_mult( Rsum_sub_fx[2], tmp );
879 465 : move32(); /*Q16 */
880 :
881 : /* Bit allocation for every group */
882 465 : tmp = add( Rsum_sub_fx[0], Rsum_sub_fx[1] );
883 465 : Rsum_fx = add( tmp, Rsum_sub_fx[2] ); /*Q0 */
884 :
885 465 : factor_fx[0] = 16384; /*Q13 move16(); */
886 465 : factor_fx[1] = 24576; /*Q13 move16(); */
887 465 : move16();
888 465 : move16();
889 : {
890 465 : R_diff_32_fx[0] = L_sub( Ravg_sub_32_fx[0], Ravg_sub_32_fx[1] );
891 465 : move32(); /*Q16 */
892 465 : R_diff_32_fx[1] = L_sub( Ravg_sub_32_fx[1], Ravg_sub_32_fx[2] );
893 465 : move32(); /*Q16 */
894 :
895 465 : test();
896 465 : 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 306 : 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 306 : exp = norm_s( Rsum_fx );
910 306 : tmp = shl( Rsum_fx, exp ); /*Q(exp) */
911 306 : tmp = div_s( 16384, tmp ); /*Q(15+14-exp) */
912 306 : L_tmp1 = L_mult( B, Rsum_sub_fx[0] ); /*Q1 */
913 306 : L_tmp = Mult_32_16( L_tmp1, tmp ); /*Q(15-exp) */
914 306 : B1 = extract_h( L_shl( L_tmp, add( exp, 1 ) ) ); /*Q0 */
915 306 : test();
916 306 : if ( GT_32( L_tmp1, L_mult( B1, Rsum_fx ) ) && GE_32( L_tmp1, L_mult( add( B1, 1 ), Rsum_fx ) ) )
917 : {
918 31 : B1 = add( B1, 1 );
919 : }
920 306 : L_tmp1 = L_mult( B, Rsum_sub_fx[1] ); /*Q1 */
921 306 : L_tmp = Mult_32_16( L_tmp1, tmp ); /*Q(15-exp) */
922 306 : B2 = extract_h( L_shl( L_tmp, add( exp, 1 ) ) ); /*Q0 */
923 306 : test();
924 306 : if ( GT_32( L_tmp1, L_mult( B2, Rsum_fx ) ) && GE_32( L_tmp1, L_mult( add( B2, 1 ), Rsum_fx ) ) )
925 : {
926 6 : B2 = add( B2, 1 );
927 : }
928 306 : L_tmp1 = L_mult( B, Rsum_sub_fx[2] ); /*Q1 */
929 306 : L_tmp = Mult_32_16( L_tmp1, tmp ); /*Q(15-exp) */
930 306 : B3 = extract_h( L_shl( L_tmp, add( exp, 1 ) ) ); /*Q0 */
931 306 : test();
932 306 : if ( GT_32( L_tmp1, L_mult( B3, Rsum_fx ) ) && GE_32( L_tmp1, L_mult( add( B3, 1 ), Rsum_fx ) ) )
933 : {
934 5 : B3 = add( B3, 1 );
935 : }
936 : }
937 306 : IF( GT_32( Ravg_sub_32_fx[2], 786432 /* 12 in Q16 */ ) )
938 : {
939 99 : B_saved = 0;
940 99 : move16();
941 99 : IF( GT_16( B1, 288 ) )
942 : {
943 13 : B_saved = sub( B1, 288 ); /* Q0 */
944 13 : B1 = 288;
945 13 : move16();
946 : }
947 :
948 99 : 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 99 : 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 99 : IF( B_saved > 0 )
965 : {
966 13 : IF( EQ_16( B1, 288 ) )
967 : {
968 13 : tmp = shr( B_saved, 1 ); /* Q0 */
969 13 : B2 = add( B2, tmp ); /* Q0 */
970 13 : tmp = sub( B, B1 ); /* Q0 */
971 13 : 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 306 : factor_fx[0] = 16384;
992 306 : move16(); /*Q13 */
993 306 : factor_fx[1] = 12288;
994 306 : move16(); /*Q13 */
995 : }
996 : ELSE
997 : {
998 159 : 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 159 : exp = norm_s( Rsum_fx );
1010 159 : tmp = shl( Rsum_fx, exp ); /*Q(exp) */
1011 159 : tmp = div_s( 16384, tmp ); /*Q(15+14-exp) */
1012 159 : L_tmp1 = L_mult( B, Rsum_sub_fx[0] ); /*Q1 */
1013 159 : L_tmp = Mult_32_16( L_tmp1, tmp ); /*Q(15-exp) */
1014 159 : B1 = extract_h( L_shl( L_tmp, add( exp, 1 ) ) ); /*Q0 */
1015 159 : test();
1016 159 : 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 159 : L_tmp1 = Mult_32_16( 1975684956, shl( B, 5 ) ); /*Q(31+5-15=21) */
1021 159 : L_tmp1 = Mult_32_16( L_tmp1, shl( Rsum_sub_fx[1], 7 ) ); /*Q(21+7-15=13) */
1022 159 : L_tmp = Mult_32_16( L_tmp1, tmp ); /*Q(27-exp) */
1023 159 : B2 = extract_h( L_shl( L_tmp, sub( exp, 11 ) ) ); /*Q0 */
1024 159 : test();
1025 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 ) ) )
1026 : {
1027 0 : B2 = add( B2, 1 );
1028 : }
1029 159 : tmp = sub( B, B1 ); /* Q0 */
1030 159 : B3 = sub( tmp, B2 ); /* Q0 */
1031 : }
1032 : }
1033 : }
1034 :
1035 465 : IF( LT_16( Rsum_sub_fx[2], 3 ) )
1036 : {
1037 64 : B2 = add( B2, B3 ); /* Q0 */
1038 64 : B3 = 0;
1039 64 : move16();
1040 : }
1041 :
1042 : /* Bit allocation in group */
1043 465 : Bit_group_fx( y, 0, SFM_G1, B1, 5, Rsubband_buf, factor_fx );
1044 465 : Bit_group_fx( y, SFM_G1, SFM_G1G2, B2, 6, Rsubband_buf, factor_fx );
1045 465 : Bit_group_fx( y, SFM_G1G2, BANDS, B3, 7, Rsubband_buf, factor_fx );
1046 12555 : FOR( i = 0; i < BANDS; i++ )
1047 : {
1048 12090 : Rsubband_fx[i] = extract_l( L_shr( Rsubband_buf[i], 18 ) ); /* Q3 */
1049 12090 : move16();
1050 : }
1051 :
1052 : /* Calcuate total used bits and initialize R to be used for Noise Filling */
1053 465 : L_tmp = L_deposit_l( 0 );
1054 12555 : FOR( i = 0; i < N; i++ )
1055 : {
1056 12090 : L_tmp = L_add( L_tmp, Rsubband_buf[i] ); /*Q21 */
1057 12090 : R[i] = extract_h( L_shr( Rsubband_buf[i], 5 ) ); /*Q0 */
1058 12090 : move16();
1059 : }
1060 465 : t_fx = extract_h( L_shr( L_tmp, 5 ) ); /*Q0 */
1061 :
1062 465 : return (Word16) t_fx;
1063 : }
1064 :
1065 : #undef WMC_TOOL_SKIP
|