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 "stl.h"
8 :
9 : #include "rom_com.h"
10 : #include "prot_fx.h"
11 :
12 13737 : Word32 ar_div(
13 : Word32 num,
14 : Word32 denum )
15 : {
16 : Word16 exp1, exp2, exp, i;
17 : Word32 varout;
18 : Word32 sign;
19 :
20 13737 : sign = L_and( L_xor( num, denum ), (Word32) 0x80000000 );
21 :
22 13737 : num = L_abs( num );
23 13737 : denum = L_abs( denum );
24 :
25 13737 : test();
26 13737 : IF( LT_32( num, denum ) || denum == 0 )
27 : {
28 1622 : return 0;
29 : }
30 12115 : ELSE IF( EQ_32( num, denum ) )
31 : {
32 0 : return 1;
33 : }
34 : ELSE
35 : {
36 12115 : exp1 = norm_l( num );
37 12115 : exp2 = norm_l( denum );
38 12115 : exp = sub( exp2, exp1 );
39 12115 : denum = L_shl( denum, exp );
40 12115 : exp = add( exp, 1 );
41 12115 : varout = L_deposit_l( 0 );
42 213661 : FOR( i = 0; i < exp; i++ )
43 : {
44 201546 : num = L_sub( num, denum );
45 201546 : varout = L_shl( varout, 1 );
46 201546 : IF( num >= 0 )
47 : {
48 100581 : num = L_shl( num, 1 );
49 100581 : varout = L_add( varout, 1 );
50 : }
51 : ELSE
52 : {
53 100965 : num = L_add( num, denum );
54 100965 : num = L_shl( num, 1 );
55 : }
56 : }
57 : }
58 :
59 12115 : if ( sign != 0 )
60 : {
61 0 : varout = L_negate( varout );
62 : }
63 :
64 12115 : return varout;
65 : }
66 :
67 0 : static void bitstream_save_bit(
68 : TCQ_PBITSTREAM pBS,
69 : Word32 bit )
70 : {
71 : UWord8 cur;
72 :
73 0 : cur = pBS->buf[pBS->numByte];
74 0 : move16();
75 :
76 :
77 0 : cur = (UWord8) ( cur | L_shl( bit, pBS->curPos ) );
78 0 : move16();
79 0 : pBS->curPos = sub( pBS->curPos, 1 );
80 0 : move16();
81 0 : pBS->buf[pBS->numByte] = cur;
82 0 : move16();
83 0 : pBS->numbits = L_add( pBS->numbits, 1 );
84 0 : move32();
85 0 : IF( pBS->curPos < 0 )
86 : {
87 0 : pBS->curPos = 7;
88 0 : move16();
89 0 : pBS->numByte = L_add( pBS->numByte, 1 );
90 0 : move32();
91 : }
92 :
93 0 : return;
94 : }
95 :
96 4789 : static UWord32 bitstream_load_bit(
97 : TCQ_PBITSTREAM pBS )
98 : {
99 : UWord32 bit;
100 : Word16 *curPos;
101 :
102 : /* safety check in case of bit errors */
103 4789 : IF( GE_32( pBS->numByte, pBS->maxBytes ) )
104 : {
105 0 : return 0;
106 : }
107 :
108 4789 : curPos = &pBS->curPos;
109 4789 : bit = UL_and( UL_lshr( pBS->buf[pBS->numByte], ( *curPos ) ), 0x00000001 );
110 4789 : *curPos = sub( *curPos, 1 );
111 :
112 4789 : IF( *curPos < 0 )
113 : {
114 586 : pBS->numByte = L_add( pBS->numByte, 1 );
115 586 : move32();
116 586 : *curPos = 7;
117 586 : move16();
118 : }
119 :
120 4789 : return bit;
121 : }
122 :
123 32 : static void bitstream_rollback(
124 : TCQ_PBITSTREAM pBS,
125 : Word32 numBits )
126 : {
127 :
128 480 : FOR( ; numBits > 0; numBits-- )
129 : {
130 448 : pBS->curPos++;
131 448 : move16();
132 448 : pBS->numbits = L_sub( pBS->numbits, 1 );
133 448 : move32();
134 448 : IF( EQ_16( pBS->curPos, 8 ) )
135 : {
136 56 : pBS->curPos = 0;
137 56 : move16();
138 56 : pBS->numByte = L_sub( pBS->numByte, 1 );
139 56 : move32();
140 : }
141 : }
142 :
143 32 : return;
144 : }
145 0 : static void transmission_bits(
146 : PARCODEC arInst,
147 : Word32 bit )
148 : {
149 0 : bitstream_save_bit( arInst->bsInst, bit );
150 0 : arInst->num_bits = L_add( arInst->num_bits, 1 );
151 0 : move32();
152 0 : bit = !bit;
153 0 : move32();
154 :
155 0 : FOR( ; arInst->bits_to_follow > 0 && arInst->num_bits < arInst->max_bits; arInst->bits_to_follow-- )
156 : {
157 0 : bitstream_save_bit( arInst->bsInst, bit );
158 0 : arInst->num_bits = L_add( arInst->num_bits, 1 );
159 0 : move32();
160 : }
161 :
162 0 : return;
163 : }
164 :
165 316 : static Word32 ar_make_model_fx(
166 : const Word16 *freq,
167 : Word16 *model,
168 : const Word16 len )
169 : {
170 : Word16 dist;
171 316 : Word32 sum = 0;
172 316 : move32();
173 316 : Word32 cum = 0;
174 316 : move32();
175 : Word16 i, tmp;
176 :
177 1312 : FOR( i = 0; i < len; i++ )
178 : {
179 996 : sum = L_add( sum, freq[i] );
180 : }
181 :
182 316 : IF( sum == 0 )
183 : {
184 0 : return 0;
185 : }
186 :
187 1628 : FOR( i = len; i >= 0; i-- )
188 : {
189 : /*model[i] = (short)( ( cum * MAX_AR_FREQ ) / sum ); */
190 1312 : model[i] = extract_l( ar_div( cum * MAX_AR_FREQ, sum ) );
191 1312 : move16();
192 1312 : if ( i )
193 996 : cum = L_add( cum, freq[i - 1] );
194 : }
195 :
196 316 : tmp = sub( len, 1 );
197 996 : FOR( i = 0; i < tmp; i++ )
198 : {
199 680 : dist = sub( model[i], model[i + 1] );
200 :
201 680 : IF( dist <= 0 )
202 : {
203 0 : model[i + 1] = add( model[i + 1], sub( dist, 1 ) );
204 0 : move16();
205 : }
206 : }
207 :
208 1312 : FOR( i = len; i > 0; i-- )
209 : {
210 996 : dist = sub( model[i - 1], model[i] );
211 :
212 996 : IF( dist <= 0 )
213 : {
214 0 : model[i - 1] = sub( model[i - 1], sub( dist, 1 ) );
215 0 : move16();
216 : }
217 : }
218 :
219 316 : return ( model[0] > model[1] );
220 : }
221 :
222 0 : void ar_encoder_start_fx(
223 : PARCODEC arInst,
224 : TCQ_PBITSTREAM bsInst,
225 : const Word32 max_bits )
226 : {
227 0 : arInst->bsInst = bsInst;
228 0 : move32();
229 :
230 0 : arInst->low = L_deposit_l( 0 );
231 0 : move32();
232 0 : arInst->high = AR_TOP;
233 0 : move32();
234 0 : arInst->bits_to_follow = 0;
235 0 : move16();
236 :
237 0 : arInst->num_bits = L_deposit_l( 0 );
238 0 : move32();
239 0 : arInst->max_bits = max_bits;
240 0 : move32();
241 0 : }
242 :
243 0 : static void ar_encode_fx(
244 : PARCODEC arInst,
245 : const Word16 *model,
246 : Word32 symbol )
247 : {
248 : Word32 range, high, low;
249 :
250 0 : high = L_add( arInst->high, 0 );
251 0 : low = L_add( arInst->low, 0 );
252 :
253 0 : symbol = L_add( symbol, 1 );
254 0 : range = L_add( L_sub( high, low ), 1 );
255 :
256 0 : high = L_sub( L_add( low, ar_div( imult3216( range, model[symbol - 1] ), model[0] ) ), 1 );
257 0 : low = L_add( low, ar_div( imult3216( range, model[symbol] ), model[0] ) );
258 :
259 : FOR( ;; )
260 : {
261 0 : IF( LT_32( high, AR_HALF ) )
262 : {
263 0 : transmission_bits( arInst, 0 );
264 : }
265 : ELSE
266 : {
267 0 : IF( GE_32( low, AR_HALF ) )
268 : {
269 0 : transmission_bits( arInst, 1 );
270 :
271 0 : low = L_sub( low, AR_HALF );
272 0 : high = L_sub( high, AR_HALF );
273 : }
274 : ELSE
275 : {
276 0 : test();
277 0 : IF( GE_32( low, AR_FIRST ) && LT_32( high, AR_THIRD ) )
278 : {
279 0 : arInst->bits_to_follow = add( arInst->bits_to_follow, 1 );
280 0 : move16();
281 :
282 0 : low = L_sub( low, AR_FIRST );
283 0 : high = L_sub( high, AR_FIRST );
284 : }
285 : ELSE
286 : {
287 : BREAK;
288 : }
289 : }
290 : }
291 :
292 0 : low = L_shl( low, 1 );
293 0 : high = L_add( L_shl( high, 1 ), 1 );
294 : }
295 :
296 0 : arInst->high = high;
297 0 : move32();
298 0 : arInst->low = low;
299 0 : move32();
300 :
301 0 : return;
302 : }
303 :
304 0 : static void ar_encode_uniform_fx(
305 : PARCODEC arInst,
306 : UWord32 data,
307 : const Word32 bits )
308 : {
309 : Word32 i;
310 :
311 0 : FOR( i = 0; i < bits; i++ )
312 : {
313 0 : ar_encode_fx( arInst, uniform_model, data & 0x1 );
314 0 : data = L_lshr( data, 1 );
315 : }
316 :
317 0 : return;
318 : }
319 :
320 0 : void ar_encoder_done_fx(
321 : PARCODEC arInst )
322 : {
323 0 : arInst->bits_to_follow = add( arInst->bits_to_follow, 1 );
324 0 : move16();
325 0 : transmission_bits( arInst, arInst->low >= AR_FIRST );
326 :
327 0 : return;
328 : }
329 :
330 32 : void ar_decoder_start_fx(
331 : PARCODEC arInst,
332 : TCQ_PBITSTREAM bsInst )
333 : {
334 : Word16 i;
335 :
336 32 : arInst->bsInst = bsInst;
337 32 : move32();
338 :
339 32 : arInst->low = L_deposit_l( 0 );
340 32 : move32();
341 32 : arInst->high = AR_TOP;
342 32 : move32();
343 32 : arInst->value = L_deposit_l( 0 );
344 32 : move32();
345 544 : FOR( i = 0; i < AR_BITS; i++ )
346 : {
347 512 : arInst->value = L_add( L_shl( arInst->value, 1 ), bitstream_load_bit( arInst->bsInst ) );
348 512 : move32();
349 : }
350 :
351 32 : return;
352 : }
353 :
354 2691 : static Word16 ar_decode_fx(
355 : PARCODEC arInst,
356 : const Word16 *model )
357 : {
358 : Word32 range, high, low, value, i;
359 : Word16 cum;
360 : Word16 symbol;
361 :
362 2691 : high = L_add( arInst->high, 0 );
363 2691 : low = L_add( arInst->low, 0 );
364 2691 : value = L_add( arInst->value, 0 );
365 :
366 2691 : range = L_add( L_sub( high, low ), 1 );
367 : /*cum = (short)( ( ( (unsigned int)( arInst->value - arInst->low ) + 1 ) * model[0] - 1 ) / range ); */
368 2691 : cum = extract_l( ar_div( L_sub( imult3216( L_add( L_sub( value, low ), 1 ), model[0] ), 1 ), range ) );
369 :
370 2691 : symbol = 1;
371 2691 : move16();
372 7204 : WHILE( GT_16( model[symbol], cum ) )
373 : {
374 4513 : symbol = add( symbol, 1 );
375 : }
376 :
377 2691 : high = L_sub( L_add( low, ar_div( imult3216( range, model[symbol - 1] ), model[0] ) ), 1 );
378 2691 : low = L_add( low, ar_div( imult3216( range, model[symbol] ), model[0] ) );
379 :
380 6968 : FOR( i = 0; i < 0x7FFF; i++ )
381 : {
382 : Word32 L_msb_diff, L_msb_low, L_msb_high;
383 :
384 6968 : L_msb_high = L_shr( high, 14 );
385 6968 : L_msb_low = L_shr( low, 14 );
386 6968 : L_msb_diff = L_sub( L_msb_high, L_msb_low );
387 6968 : IF( GE_32( L_msb_diff, 2 ) )
388 : {
389 2691 : BREAK;
390 : }
391 4277 : assert( tab_ari_qnew[L_msb_high][L_msb_low] != 0x0CCC );
392 4277 : assert( tab_ari_qnew[L_msb_high][L_msb_low] != 0x0BBB );
393 4277 : low = L_msu( low, 1, tab_ari_qnew[L_msb_high][L_msb_low] );
394 4277 : low = L_shl( low, 1 );
395 4277 : high = L_msu( high, 1, tab_ari_qnew[L_msb_high][L_msb_low] );
396 4277 : high = L_add( L_shl( high, 1 ), 1 );
397 4277 : value = L_msu( value, 1, tab_ari_qnew[L_msb_high][L_msb_low] );
398 4277 : value = L_add( L_shl( value, 1 ), bitstream_load_bit( arInst->bsInst ) );
399 : }
400 :
401 2691 : arInst->low = low;
402 2691 : move32();
403 2691 : arInst->high = high;
404 2691 : move32();
405 2691 : arInst->value = value;
406 2691 : move32();
407 :
408 2691 : return ( sub( symbol, 1 ) );
409 : }
410 :
411 32 : void ar_decoder_done_fx(
412 : PARCODEC arInst )
413 : {
414 32 : bitstream_rollback( arInst->bsInst, AR_BITS - 2 );
415 :
416 32 : return;
417 : }
418 :
419 0 : static Word16 quantize_fx(
420 : Word16 val,
421 : const Word16 D )
422 : {
423 : Word16 qval4_fx;
424 : Word16 retval_fx;
425 :
426 0 : val = s_min( val, 32255 ); /* limit input by (2^15 - 1)-2^9 */
427 0 : qval4_fx = shr( abs_s( add( val, 512 ) ), 12 );
428 0 : retval_fx = add( shl( qval4_fx, 2 ), DDP_fx[D] );
429 : /* 2nd zero check */
430 0 : IF( D == 0 )
431 : {
432 0 : if ( GT_16( abs_s( sub( shl( abs_s( retval_fx ), 10 ), abs_s( val ) ) ), abs_s( val ) ) )
433 : {
434 0 : retval_fx = 0;
435 0 : move16();
436 : }
437 : }
438 : /*return retval; */
439 0 : return retval_fx;
440 : }
441 :
442 2138 : static Word32 GetBitsFromPulses_fx(
443 : Word16 m,
444 : Word16 n )
445 : {
446 : Word16 i, tmp, integer_fx, temp_fx1, temp_fx2, exp1, exp2;
447 : Word32 temp32;
448 : Word32 frac_fx32;
449 : Word32 logCoeff_fx;
450 2138 : Word16 exp = 0;
451 2138 : Word32 mantissa_fx = 0;
452 2138 : move16();
453 2138 : move32();
454 :
455 2138 : IF( m == 0 )
456 : {
457 23 : return 0;
458 : }
459 :
460 2115 : tmp = s_min( m, n );
461 10102 : FOR( i = 0; i < tmp; i++ )
462 : {
463 7987 : logCoeff_fx = L_add( L_shl( i + 1, 16 ), L_sub( table_logcum_fx[n + 1], L_add( table_logcum_fx[i + 2], table_logcum_fx[n - i] ) ) );
464 7987 : logCoeff_fx = L_add( logCoeff_fx, L_sub( table_logcum_fx[m], L_add( table_logcum_fx[i + 1], table_logcum_fx[m - i] ) ) ); /*Q16 */
465 7987 : integer_fx = extract_h( logCoeff_fx ); /*Q0 */
466 7987 : frac_fx32 = L_sub( logCoeff_fx, L_shl( integer_fx, 16 ) ); /*Q16 */
467 :
468 : /*ln2, 0.987, ln2 * ln2, 0.977 */
469 : /*temp1 = (int) (frac / 0.0625); */
470 : /*temp2 = frac - (float)temp1 * 0.0625f; */
471 :
472 : /* frac = pow(2.0, temp1 * 0.0625) * (1 + 0.693 * temp2 + 0.480 * temp2 * temp2 * 0.5);*/
473 : /*frac = pow_getbitsfrompulses[temp1] * (1 + 0.693f * temp2 + 0.480f * temp2 * temp2 * 0.5f); */
474 :
475 7987 : temp_fx1 = extract_h( L_shl( frac_fx32, 4 ) );
476 7987 : temp_fx2 = extract_l( L_and( frac_fx32, 0xfff ) ); /*Q16 */
477 :
478 7987 : frac_fx32 = L_mac( Mult_32_16( L_mult0( temp_fx2, temp_fx2 ), 7864 ), temp_fx2, 22708 ); /*Q32 */
479 7987 : frac_fx32 = L_add( 0x40000000, L_shr( frac_fx32, 2 ) ); /*30 */
480 :
481 7987 : exp1 = norm_l( pow_getbitsfrompulses_fx[temp_fx1] );
482 7987 : exp2 = norm_l( frac_fx32 );
483 7987 : frac_fx32 = Mult_32_32( L_shl( pow_getbitsfrompulses_fx[temp_fx1], exp1 ), L_shl( frac_fx32, exp2 ) ); /*21 + exp1 + 30 + exp2 - 31 */
484 7987 : frac_fx32 = L_add( L_shr( frac_fx32, add( exp1, exp2 ) ), 1 ); /*20 */
485 :
486 7987 : IF( LT_16( exp, integer_fx ) )
487 : {
488 7030 : mantissa_fx = L_shr( mantissa_fx, sub( integer_fx, exp ) );
489 7030 : mantissa_fx = L_add( mantissa_fx, frac_fx32 );
490 :
491 7030 : exp = integer_fx;
492 7030 : move16();
493 : }
494 : ELSE
495 : {
496 957 : mantissa_fx = L_add( mantissa_fx, L_shr( frac_fx32, sub( exp, integer_fx ) ) );
497 : }
498 7987 : IF( GE_32( mantissa_fx, 0x200000 ) )
499 : {
500 1663 : exp = add( exp, 1 );
501 :
502 1663 : mantissa_fx = L_shr( mantissa_fx, 1 );
503 : }
504 : }
505 :
506 2115 : mantissa_fx = L_shl( mantissa_fx, 2 ); /*22 */
507 2115 : temp_fx1 = extract_h( mantissa_fx );
508 : /*temp_fx2 = extract_h(L_shl(L_sub(mantissa_fx, L_deposit_h(temp_fx1)), 15)); // 15 */
509 2115 : temp32 = L_shl( L_sub( mantissa_fx, L_deposit_h( temp_fx1 ) ), 15 ); /*31 */
510 2115 : exp1 = sub( norm_l( temp32 ), 1 );
511 2115 : temp32 = ar_div( L_shl( temp32, exp1 ), temp_fx1 ); /*31 + exp1 */
512 2115 : temp32 = L_shr( temp32, exp1 + 1 ); /*30 */
513 :
514 2115 : frac_fx32 = L_sub( 0x40000000, L_shr( temp32, 1 ) ); /*30 */
515 2115 : frac_fx32 = Mult_32_32( frac_fx32, temp32 ); /*29 */
516 2115 : frac_fx32 = L_shr( frac_fx32, 13 ); /*16 */
517 2115 : exp1 = norm_l( temp_fx1 );
518 2115 : temp_fx1 = Log2_norm_lc( L_shl( temp_fx1, exp1 ) ); /*15 */
519 2115 : frac_fx32 = frac_fx32 + Mult_32_32( frac_fx32, 950680361 ); /* frac_fx32 *= 1/ln(2) */
520 2115 : return L_add( L_deposit_h( exp ), L_add( L_shl( temp_fx1, 1 ), frac_fx32 ) );
521 : /*return exp + (float)temp_fx1 / pow(2.0, 15) + (float)frac_fx32 / pow(2.0, 16); */
522 : }
523 :
524 0 : static void TCQnew_fx(
525 : Word32 *v_fx,
526 : Word32 scale_fx,
527 : Word16 Qscale,
528 : Word16 length,
529 : Word16 *vout_fx,
530 : Word16 pulses,
531 : Word16 *pulsesout,
532 : Word16 *nzposout,
533 : Word32 *savedstates,
534 : Word32 *lasttrellislevel,
535 : Word32 terminate )
536 : {
537 : Word16 i, st, dminpos, position;
538 0 : Word16 pulsesnum, nzpos = 0;
539 0 : move16();
540 : Word32 metric_fx[STATES][TCQ_MAX_BAND_SIZE];
541 : Word16 path_fx[STATES][TCQ_MAX_BAND_SIZE];
542 : Word16 quant_fx[STATES][TCQ_MAX_BAND_SIZE];
543 : Word16 pused_fx[STATES][TCQ_MAX_BAND_SIZE];
544 : Word16 quantum1_fx, quantum2_fx, newdist1_fx, newdist2_fx /*, signq_fx*/;
545 : Word32 /*scale_fx, */ tmp32, dmin_fx, curdist1_fx, curdist2_fx;
546 : Word16 value_fx, exp;
547 : Word16 exp1, exp2;
548 :
549 0 : set32_fx( *metric_fx, 0, STATES * TCQ_MAX_BAND_SIZE );
550 0 : set16_fx( *path_fx, 0, STATES * TCQ_MAX_BAND_SIZE );
551 0 : set16_fx( *quant_fx, 0, STATES * TCQ_MAX_BAND_SIZE );
552 0 : set16_fx( *pused_fx, 0, STATES * TCQ_MAX_BAND_SIZE );
553 :
554 : /* Initialize metric */
555 0 : FOR( st = 1; st < STATES; st++ )
556 : {
557 0 : metric_fx[st][0] = MAX_32 >> 1;
558 0 : move32();
559 : }
560 0 : FOR( st = 2; st < STATES; st++ )
561 : {
562 0 : metric_fx[st][1] = MAX_32 >> 1;
563 0 : move32();
564 : }
565 0 : FOR( st = 4; st < STATES; st++ )
566 : {
567 0 : metric_fx[st][2] = MAX_32 >> 1;
568 0 : move32();
569 : }
570 : /* Viterbi for input sequence */
571 0 : FOR( i = 0; i < length; i++ ) /* cycle over symbols */
572 : {
573 0 : FOR( st = 0; st < STATES; st++ ) /* cycle over conditions */
574 : {
575 0 : curdist1_fx = L_add( metric_fx[step_tcq[st][0]][i], 0 );
576 0 : curdist2_fx = L_add( metric_fx[step_tcq[st][1]][i], 0 );
577 :
578 0 : exp = norm_l( scale_fx );
579 0 : tmp32 = L_shl( scale_fx, exp );
580 0 : tmp32 = Mult_32_16( v_fx[i], extract_h( tmp32 ) ); /*12 + 20 + exp - 16 - 15 + Qscale */
581 0 : exp1 = sub( 26, add( sub( exp, 19 ), Qscale ) );
582 0 : exp2 = norm_l( tmp32 );
583 0 : IF( GE_16( exp2, exp1 ) )
584 : {
585 0 : value_fx = extract_h( L_shl( tmp32, sub( 26, add( sub( exp, 19 ), Qscale ) ) ) ); /*exp -19 + Qscale*/ /*10*/
586 : }
587 : ELSE
588 : {
589 0 : value_fx = extract_h( L_shl( tmp32, exp2 ) ); /*exp -19 + Qscale*/ /*10*/
590 : }
591 : /* step 1 */
592 0 : quantum1_fx = quantize_fx( value_fx, denc[st][0] );
593 0 : newdist1_fx = sub( shl( quantum1_fx, 10 ), abs_s( value_fx ) ); /*10*/
594 0 : newdist1_fx = mult( newdist1_fx, newdist1_fx ); /* 5 */
595 :
596 0 : test();
597 0 : if ( GT_16( add( quantum1_fx, pused_fx[step_tcq[st][0]][i] ), pulses ) && terminate )
598 : {
599 0 : newdist1_fx = MAX_16;
600 0 : move16();
601 : }
602 : /* step 2 */
603 0 : quantum2_fx = quantize_fx( value_fx, denc[st][1] );
604 0 : newdist2_fx = sub( shl( quantum2_fx, 10 ), abs_s( value_fx ) ); /*10*/
605 0 : newdist2_fx = mult( newdist2_fx, newdist2_fx ); /*5*/
606 :
607 0 : test();
608 0 : if ( GT_16( add( quantum2_fx, pused_fx[step_tcq[st][1]][i] ), pulses ) && terminate )
609 : {
610 0 : newdist2_fx = MAX_16;
611 0 : move16();
612 : }
613 :
614 : /* decision */
615 0 : IF( LT_32( L_add( curdist1_fx, newdist1_fx ), L_add( curdist2_fx, newdist2_fx ) ) )
616 : {
617 0 : path_fx[st][i + 1] = step_tcq[st][0];
618 0 : move16();
619 0 : metric_fx[st][i + 1] = L_add( curdist1_fx, newdist1_fx );
620 0 : move32();
621 0 : quant_fx[st][i + 1] = quantize_fx( value_fx, denc[st][0] );
622 0 : move16();
623 0 : pused_fx[st][i + 1] = add( pused_fx[step_tcq[st][0]][i], abs_s( quant_fx[st][i + 1] ) );
624 0 : move16();
625 : }
626 : ELSE
627 : {
628 0 : path_fx[st][i + 1] = step_tcq[st][1];
629 0 : move16();
630 0 : metric_fx[st][i + 1] = L_add( curdist2_fx, newdist2_fx );
631 0 : move32();
632 0 : quant_fx[st][i + 1] = quantize_fx( value_fx, denc[st][1] );
633 0 : move16();
634 0 : pused_fx[st][i + 1] = add( pused_fx[step_tcq[st][1]][i], abs_s( quant_fx[st][i + 1] ) );
635 0 : move16();
636 : }
637 : }
638 : }
639 :
640 : /* Find path with minimal metric */
641 0 : dminpos = 0;
642 0 : move16();
643 0 : dmin_fx = L_add( metric_fx[dminpos][length], 0 );
644 0 : FOR( i = 1; i < STATES; i++ )
645 : {
646 0 : test();
647 0 : test();
648 0 : test();
649 0 : IF( ( GT_32( dmin_fx, metric_fx[i][length] ) && EQ_16( pused_fx[i][length], pulses ) ) ||
650 : ( NE_16( pused_fx[dminpos][length], pulses ) && EQ_16( pused_fx[i][length], pulses ) ) )
651 : {
652 0 : dmin_fx = L_add( metric_fx[i][length], 0 );
653 0 : dminpos = i;
654 0 : move16();
655 : }
656 : }
657 : /* Trace back to get output */
658 0 : nzpos = 0;
659 0 : move16();
660 0 : pulsesnum = 0;
661 0 : move16();
662 0 : position = dminpos;
663 0 : move16();
664 0 : FOR( i = length; i > 0; i-- )
665 : {
666 0 : vout_fx[i - 1] = quant_fx[position][i];
667 0 : move16();
668 0 : if ( v_fx[i - 1] <= 0 )
669 : {
670 0 : vout_fx[i - 1] = negate( quant_fx[position][i] );
671 0 : move16();
672 : }
673 0 : position = path_fx[position][i];
674 0 : move16();
675 0 : savedstates[i - 1] = position;
676 0 : move32();
677 :
678 : /* calculate output pulses number & nz */
679 0 : pulsesnum = add( pulsesnum, abs_s( vout_fx[i - 1] ) ); /*quant[position][i]; */
680 0 : IF( abs_s( vout_fx[i - 1] ) > 0 )
681 : {
682 0 : if ( nzpos == 0 )
683 : {
684 0 : *lasttrellislevel = i;
685 0 : move32();
686 : }
687 :
688 0 : nzpos = add( nzpos, 1 );
689 : }
690 : }
691 :
692 0 : if ( pulsesout != 0 )
693 : {
694 0 : *pulsesout = pulsesnum;
695 0 : move16();
696 : }
697 0 : if ( nzposout != 0 )
698 : {
699 0 : *nzposout = nzpos;
700 0 : move16();
701 : }
702 :
703 0 : return;
704 : }
705 :
706 0 : Word32 GetISCScale_fx(
707 : Word32 *quants_fx,
708 : Word16 size,
709 : Word32 bits_fx,
710 : Word16 *magn_fx,
711 : Word32 *qscale_fx,
712 : Word32 *surplus_fx,
713 : Word16 *pulses,
714 : Word32 *savedstates,
715 : Word32 noTCQ,
716 : Word16 *nzpout,
717 : Word16 *bcount,
718 : Word32 *abuffer,
719 : Word16 *mbuffer,
720 : Word32 *sbuffer )
721 : {
722 : Word32 pos, terminate, trellislevel, st;
723 : Word32 lasttrellislevel;
724 : Word16 i, j, m_int, leftp, leftnz, nzpos, direction, pulsesnum, diff, pulsescurr, nzposcurr;
725 : Word16 sign;
726 : Word16 flag_g1;
727 : Word32 t32;
728 : Word16 SafeExp;
729 :
730 0 : Word32 magnbits_fx = 0, tcqmagnbits_fx /*, surplus_fx, bits_fx*/;
731 0 : move32();
732 : Word16 prob0_fx, prob1_fx, num, denum, quantum1_fx, quantum2_fx;
733 : Word32 dmin_fx, scale_fx32;
734 : Word32 actualt_fx;
735 0 : Word32 pt_fx, sxy_fx = 0, sy2_fx = 0;
736 0 : move32();
737 0 : move32();
738 : Word16 pn_fx, g_fx, scale_fx;
739 : Word16 tmp16, exp, exp1, exp2, Q_temp, hi, lo;
740 : Word32 m_fx, tmp32;
741 : Word32 /*quants_fx[TCQ_MAX_BAND_SIZE], */ aquants_fx[TCQ_MAX_BAND_SIZE], dist_fx[TCQ_MAX_BAND_SIZE];
742 : Word16 exp_dist[TCQ_MAX_BAND_SIZE];
743 : Word16 /*magn_fx[TCQ_MAX_BAND_SIZE], */ t_fx;
744 : Word16 Qscale;
745 0 : Word16 Qsxy = 4;
746 :
747 0 : move32();
748 0 : move32();
749 0 : move32();
750 0 : move16();
751 :
752 0 : exp = 0; /* to avoid compilation warnings */
753 0 : move16();
754 0 : Qscale = 0; /* to avoid compilation warnings */
755 0 : move16();
756 :
757 0 : set32_fx( dist_fx, 0, size );
758 0 : set16_fx( exp_dist, 31, size );
759 0 : set32_fx( aquants_fx, 0, size );
760 :
761 0 : IF( bits_fx < 0 )
762 : {
763 0 : pulsesnum = 0;
764 0 : move16();
765 :
766 0 : IF( surplus_fx != NULL )
767 : {
768 : /* *surplus_fx += bits_fx; */
769 0 : *surplus_fx = L_add( *surplus_fx, bits_fx );
770 0 : move32();
771 : }
772 : }
773 : ELSE
774 : {
775 0 : pulsesnum = GetScale_fx( size, bits_fx, surplus_fx );
776 : }
777 0 : *nzpout = 0;
778 0 : move16();
779 :
780 0 : if ( pulses != NULL )
781 : {
782 0 : *pulses = pulsesnum;
783 0 : move16();
784 : }
785 :
786 0 : IF( pulsesnum > 0 )
787 : {
788 : /* Initial quantization */
789 0 : m_fx = L_deposit_l( 0 );
790 0 : FOR( i = 0; i < size; i++ )
791 : {
792 0 : aquants_fx[i] = L_abs( quants_fx[i] ); /*Q12 */
793 0 : move32();
794 0 : m_fx = L_add( m_fx, L_shr( aquants_fx[i], 2 ) ); /*Q12 - 2*/
795 : }
796 :
797 0 : IF( m_fx == 0 )
798 : {
799 0 : scale_fx = 0;
800 0 : move16();
801 0 : FOR( i = 0; i < size; i++ )
802 : {
803 0 : magn_fx[i] = 0;
804 0 : move16();
805 : }
806 0 : t_fx = 0;
807 0 : move16();
808 : }
809 : ELSE
810 : {
811 0 : exp1 = sub( norm_s( pulsesnum ), 1 );
812 0 : exp2 = norm_l( m_fx );
813 0 : scale_fx = div_s( shl( pulsesnum, exp1 ), extract_h( L_shl( m_fx, exp2 ) ) ); /*15 + exp1 - (exp2 + 12 - 16) */
814 :
815 0 : exp = add( sub( add( 15, exp1 ), sub( add( exp2, 12 ), 16 ) ), 2 );
816 0 : move16();
817 0 : t_fx = 0;
818 0 : move16();
819 0 : FOR( i = 0; i < size; i++ )
820 : {
821 0 : tmp32 = Mult_32_16( aquants_fx[i], scale_fx ); /*12 + exp - 15 */
822 0 : tmp32 = L_shl( tmp32, sub( 16, add( 12 - 15, exp ) ) ); /*16 */
823 0 : magn_fx[i] = extract_h( L_add( 32768, tmp32 ) );
824 0 : move16();
825 0 : t_fx = add( t_fx, magn_fx[i] );
826 : }
827 : }
828 :
829 : /* Pulses redistribution */
830 0 : WHILE( NE_16( t_fx, pulsesnum ) )
831 : {
832 0 : pn_fx = 0;
833 0 : move16();
834 0 : pt_fx = L_deposit_l( 0 );
835 :
836 0 : nzpos = 0;
837 0 : move16();
838 0 : FOR( i = 0; i < size; i++ )
839 : {
840 0 : IF( magn_fx[i] > 0 )
841 : {
842 0 : pn_fx = add( pn_fx, magn_fx[i] ); /*0 */
843 0 : pt_fx = L_add( pt_fx, L_shr( aquants_fx[i], 2 ) ); /*12 */
844 : }
845 : }
846 :
847 0 : direction = -1;
848 0 : move16();
849 0 : if ( GT_16( pulsesnum, t_fx ) )
850 : {
851 0 : direction = 1;
852 0 : move16();
853 : }
854 :
855 : /* new alg */
856 : {
857 0 : FOR( i = 0; i < size; i++ )
858 : {
859 0 : sxy_fx = L_add( sxy_fx, L_shl( Mult_32_16( aquants_fx[i], magn_fx[i] ), add( Qsxy, 3 ) ) ); /* 12+0-15 +9 -> 6 */
860 0 : sy2_fx = L_add( sy2_fx, L_mult0( magn_fx[i], magn_fx[i] ) ); /*0 */
861 : }
862 0 : Q_temp = 32;
863 0 : move16();
864 0 : FOR( i = 0; i < size; i++ )
865 : {
866 0 : IF( magn_fx[i] > 0 )
867 : {
868 0 : tmp16 = add( pn_fx, direction );
869 0 : tmp32 = L_add( pt_fx, 0 );
870 : }
871 : ELSE
872 : {
873 0 : tmp16 = add( pn_fx, direction );
874 0 : tmp32 = L_add( pt_fx, L_shr( aquants_fx[i], 2 ) );
875 : }
876 :
877 0 : IF( tmp32 == 0 )
878 : {
879 0 : g_fx = 0;
880 0 : move16();
881 : }
882 : ELSE
883 : {
884 0 : exp1 = sub( norm_l( tmp32 ), 1 );
885 0 : exp2 = norm_s( tmp16 );
886 0 : tmp32 = L_shl( tmp32, exp1 );
887 0 : IF( tmp16 == 0 )
888 : {
889 0 : tmp16 = 1;
890 0 : move16();
891 0 : exp2 = 16;
892 0 : move16();
893 : }
894 : ELSE
895 : {
896 0 : tmp16 = shl( tmp16, exp2 );
897 : }
898 0 : g_fx = div_s( extract_h( tmp32 ), tmp16 ); /*15 + 12 + exp1 - 16 - exp2; */
899 0 : exp = add( 15 + 12 - 16 - 2, sub( exp1, exp2 ) ); /*exp = 15 + 12 + exp1 - 16 - exp2 - 2*/
900 0 : move16();
901 : }
902 :
903 0 : IF( g_fx == 0 )
904 : {
905 0 : dist_fx[i] = L_deposit_l( 0 );
906 0 : move32();
907 : }
908 : ELSE
909 : {
910 0 : IF( direction > 0 )
911 : {
912 0 : tmp32 = L_add( sxy_fx, L_shr( aquants_fx[i], sub( 12, Qsxy ) ) ); /*Qsxy */
913 0 : t32 = L_add( sy2_fx, L_add( 1, L_deposit_l( shl( magn_fx[i], 1 ) ) ) );
914 :
915 0 : IF( LT_16( norm_l( t32 ), 15 ) )
916 : {
917 0 : SafeExp = sub( 16, norm_l( t32 ) );
918 0 : tmp16 = extract_l( L_shr( t32, SafeExp ) );
919 : }
920 : ELSE
921 : {
922 0 : SafeExp = 0;
923 0 : move16();
924 0 : tmp16 = extract_l( t32 );
925 : }
926 : }
927 : ELSE
928 : {
929 0 : tmp32 = L_sub( sxy_fx, L_shr( aquants_fx[i], sub( 12, Qsxy ) ) ); /*Qsxy */
930 0 : t32 = L_add( sy2_fx, L_sub( 1, L_deposit_l( shl( magn_fx[i], 1 ) ) ) );
931 0 : SafeExp = norm_l( t32 );
932 :
933 0 : IF( LE_16( norm_l( t32 ), 15 ) )
934 : {
935 0 : SafeExp = sub( 16, norm_l( t32 ) );
936 0 : tmp16 = extract_l( L_shr( t32, SafeExp ) );
937 : }
938 : ELSE
939 : {
940 0 : SafeExp = 0;
941 0 : move16();
942 0 : tmp16 = extract_l( t32 );
943 : }
944 : }
945 0 : tmp32 = L_shl_sat( tmp32, sub( 1, SafeExp ) ); /* *2 */
946 0 : tmp32 = L_sub_sat( L_shl_sat( L_mult0( g_fx, tmp16 ), sub( Qsxy, exp ) ), tmp32 ); /*Qsxy */
947 0 : dist_fx[i] = Mult_32_16( tmp32, g_fx ); /*Qsxy + exp - 15 */
948 0 : move32();
949 0 : exp_dist[i] = add( sub( Qsxy, 15 ), exp );
950 0 : move16();
951 0 : if ( LT_16( exp_dist[i], Q_temp ) )
952 : {
953 0 : Q_temp = exp_dist[i];
954 0 : move16();
955 : }
956 : }
957 : }
958 0 : FOR( i = 0; i < size; i++ )
959 : {
960 0 : dist_fx[i] = L_shr( dist_fx[i], s_min( sub( exp_dist[i], Q_temp ), 31 ) );
961 0 : move32();
962 : }
963 : }
964 :
965 : {
966 : /* find min */
967 0 : pos = L_deposit_l( 0 );
968 0 : dmin_fx = L_add( dist_fx[0], 0 );
969 0 : FOR( i = 1; i < size; i++ )
970 : {
971 0 : IF( GT_32( dmin_fx, dist_fx[i] ) )
972 : {
973 0 : pos = L_deposit_l( i );
974 0 : dmin_fx = L_add( dist_fx[i], 0 );
975 : }
976 : }
977 : /*IF (magn_fx[i] == 0 && direction < 0) */
978 0 : test();
979 0 : IF( magn_fx[pos] == 0 && direction < 0 )
980 : {
981 0 : pos = L_deposit_l( 0 );
982 0 : FOR( i = 0; i < size; i++ )
983 : {
984 0 : IF( magn_fx[i] != 0 )
985 : {
986 0 : pos = L_deposit_l( i );
987 0 : BREAK;
988 : }
989 : }
990 0 : dmin_fx = L_add( dist_fx[i], 0 );
991 0 : FOR( ; i < size; i++ )
992 : {
993 0 : test();
994 0 : IF( magn_fx[i] != 0 && LT_32( dmin_fx, dist_fx[i] ) )
995 : {
996 0 : pos = L_deposit_l( i );
997 0 : dmin_fx = L_add( dist_fx[i], 0 );
998 : }
999 : }
1000 : }
1001 :
1002 0 : magn_fx[pos] = add( magn_fx[pos], direction );
1003 0 : move16();
1004 0 : t_fx = add( t_fx, direction );
1005 : }
1006 : }
1007 :
1008 : /* calculate actual nz positions */
1009 0 : actualt_fx = L_deposit_l( 0 );
1010 0 : nzpos = 0;
1011 0 : move16();
1012 0 : FOR( i = 0; i < size; i++ )
1013 : {
1014 0 : IF( magn_fx[i] > 0 )
1015 : {
1016 0 : if ( quants_fx[i] < 0 )
1017 : {
1018 0 : magn_fx[i] = negate( magn_fx[i] );
1019 0 : move16();
1020 : }
1021 0 : actualt_fx = L_add( actualt_fx, L_shr( aquants_fx[i], 2 ) ); /*12 */
1022 0 : nzpos++;
1023 : }
1024 : /*magn[i] = (float)magn_fx[i]; */
1025 : }
1026 :
1027 : /* calculate scale */
1028 0 : IF( actualt_fx == 0 )
1029 : {
1030 0 : scale_fx32 = L_add( MAX_32, 0 );
1031 : }
1032 : ELSE
1033 : {
1034 0 : exp1 = norm_l( actualt_fx );
1035 0 : exp2 = sub( norm_l( pulsesnum ), 1 );
1036 0 : lo = L_Extract_lc( L_shl( actualt_fx, exp1 ), &hi );
1037 0 : scale_fx32 = Div_32( L_shl( pulsesnum, exp2 ), hi, lo ); /*31 + exp2 - exp1 - 12 */
1038 0 : Qscale = add( 31 - 12 + 2, sub( exp2, exp1 ) ); /*31 + exp2 - exp1 - 12 + 2*/
1039 0 : move16();
1040 : }
1041 :
1042 0 : *qscale_fx = scale_fx32;
1043 0 : move32();
1044 0 : *nzpout = nzpos;
1045 0 : move16();
1046 :
1047 :
1048 0 : test();
1049 0 : test();
1050 0 : IF( ( NE_16( nzpos, pulsesnum ) && GT_16( nzpos, 1 ) ) && noTCQ == 0 )
1051 : {
1052 0 : terminate = L_deposit_l( 1 );
1053 : /*TCQnew( quants, scale, size, magn, pulsesnum, &pulsescurr, &nzposcurr, savedstates, &lasttrellislevel, terminate); */
1054 0 : TCQnew_fx( quants_fx, scale_fx32, Qscale,
1055 : size, magn_fx, pulsesnum, &pulsescurr, &nzposcurr, savedstates, &lasttrellislevel, terminate );
1056 0 : IF( GT_16( pulsesnum, pulsescurr ) )
1057 : {
1058 : Word32 L_tmp;
1059 0 : IF( GT_32( 1952247030, scale_fx32 ) )
1060 : {
1061 0 : scale_fx32 = L_add( scale_fx32, Mult_32_16( scale_fx32, 3277 /*0.1 in Q15*/ ) );
1062 : }
1063 : ELSE
1064 : {
1065 0 : L_tmp = L_shr( scale_fx32, 1 );
1066 0 : scale_fx32 = L_add( L_tmp, Mult_32_16( L_tmp, 3277 /*0.1 in Q15*/ ) );
1067 0 : Qscale = sub( Qscale, 1 );
1068 : }
1069 : }
1070 :
1071 0 : if ( LT_16( pulsesnum, pulsescurr ) )
1072 : {
1073 0 : scale_fx32 = Mult_32_16( scale_fx32, 29491 /*0.9 in Q15*/ );
1074 : }
1075 0 : IF( GT_16( pulsesnum, pulsescurr ) )
1076 : {
1077 0 : diff = sub( pulsesnum, pulsescurr );
1078 :
1079 0 : FOR( i = size - 1; i >= 0; i-- )
1080 : {
1081 0 : IF( abs_s( magn_fx[i] ) > 0 )
1082 : {
1083 0 : sign = -1;
1084 0 : move16();
1085 0 : if ( magn_fx[i] > 0 )
1086 : {
1087 0 : sign = 1;
1088 0 : move16();
1089 : }
1090 : /*magn_fx[i] = sign * abs_s(add(magn_fx[i], diff)); move32(); */
1091 0 : IF( sign > 0 )
1092 : {
1093 0 : magn_fx[i] = abs_s( add( magn_fx[i], diff ) );
1094 0 : move16();
1095 : }
1096 : ELSE
1097 : {
1098 0 : magn_fx[i] = negate( abs_s( add( magn_fx[i], diff ) ) );
1099 0 : move16();
1100 : }
1101 :
1102 0 : BREAK;
1103 : }
1104 : }
1105 : }
1106 0 : ELSE IF( LT_16( pulsesnum, pulsescurr ) )
1107 : {
1108 0 : diff = sub( pulsescurr, pulsesnum );
1109 :
1110 0 : FOR( i = size - 1; i >= 0; i-- )
1111 : {
1112 0 : IF( diff <= 0 )
1113 : {
1114 0 : BREAK;
1115 : }
1116 :
1117 0 : IF( abs_s( magn_fx[i] ) > 0 )
1118 : {
1119 0 : sign = -1;
1120 0 : move16();
1121 0 : if ( magn_fx[i] > 0 )
1122 : {
1123 0 : sign = 1;
1124 0 : move16();
1125 : }
1126 0 : m_int = abs_s( magn_fx[i] );
1127 :
1128 0 : IF( LT_16( diff, m_int ) )
1129 : {
1130 : /*magn_fx[i] = sign * sub(abs_s(magn_fx[i]), diff); move16(); */
1131 0 : IF( sign > 0 )
1132 : {
1133 0 : magn_fx[i] = sub( abs_s( magn_fx[i] ), diff );
1134 0 : move16();
1135 : }
1136 : ELSE
1137 : {
1138 0 : magn_fx[i] = negate( sub( abs_s( magn_fx[i] ), diff ) );
1139 0 : move16();
1140 : }
1141 0 : BREAK;
1142 : }
1143 : ELSE
1144 : {
1145 0 : diff = sub( diff, m_int );
1146 0 : magn_fx[i] = 0;
1147 0 : move16();
1148 0 : nzposcurr = sub( nzposcurr, 1 );
1149 : }
1150 : }
1151 : }
1152 : }
1153 :
1154 0 : pulsescurr = pulsesnum;
1155 0 : move16();
1156 :
1157 : /* Magnitudes coding */
1158 : {
1159 0 : leftp = pulsescurr;
1160 0 : move16(); /*pulsesnum; */
1161 0 : leftnz = nzposcurr;
1162 0 : move16(); /*nzpos; */
1163 0 : trellislevel = L_deposit_l( 0 );
1164 :
1165 0 : FOR( i = 0; i < size; i++ )
1166 : {
1167 0 : IF( LE_16( leftnz, 1 ) )
1168 : {
1169 0 : BREAK;
1170 : }
1171 :
1172 0 : IF( magn_fx[i] != 0 )
1173 : {
1174 0 : FOR( j = 0; j < leftp; j++ )
1175 : {
1176 0 : num = sub( leftnz, 1 );
1177 0 : denum = sub( leftp, add( j, 1 ) );
1178 0 : IF( GE_16( num, denum ) )
1179 : {
1180 0 : prob1_fx = MAX_16;
1181 0 : move16();
1182 0 : prob0_fx = 0;
1183 0 : move16();
1184 : }
1185 : ELSE
1186 : {
1187 0 : exp1 = sub( norm_s( num ), 1 );
1188 0 : exp2 = norm_s( denum );
1189 0 : prob1_fx = div_s( shl( num, exp1 ), shl( denum, exp2 ) ); /*15 + exp1 - exp2 */
1190 0 : exp = add( 15, sub( exp1, exp2 ) );
1191 0 : prob1_fx = shl( prob1_fx, sub( 15, exp ) );
1192 0 : prob0_fx = sub( MAX_16, prob1_fx );
1193 : }
1194 :
1195 0 : st = L_add( savedstates[trellislevel], 0 );
1196 0 : quantum1_fx = quantize_fx( shl( add( j, 1 ), 10 ), ddec[st][0] );
1197 0 : quantum2_fx = quantize_fx( shl( add( j, 1 ), 10 ), ddec[st][1] );
1198 :
1199 0 : test();
1200 0 : IF( NE_16( quantum1_fx, add( j, 1 ) ) && NE_16( quantum2_fx, add( j, 1 ) ) )
1201 : {
1202 : /* this magnitude is not possible so set probabilities */
1203 0 : prob0_fx = MAX_16;
1204 0 : move16();
1205 0 : prob1_fx = 0;
1206 0 : move16();
1207 : }
1208 :
1209 0 : IF( LT_16( j, sub( abs_s( magn_fx[i] ), 1 ) ) )
1210 : {
1211 0 : exp1 = norm_s( prob0_fx );
1212 0 : tmp32 = L_deposit_h( shl( prob0_fx, exp1 ) ); /*exp1 + 15 + 16 */
1213 0 : tmp16 = Log2_norm_lc( tmp32 ); /*15 */
1214 0 : magnbits_fx = L_sub( magnbits_fx, L_sub( tmp16, L_shl( add( exp1, 1 ), 15 ) ) ); /*15 */
1215 : }
1216 : ELSE
1217 : {
1218 0 : exp1 = norm_s( prob1_fx );
1219 0 : tmp32 = L_deposit_h( shl( prob1_fx, exp1 ) ); /*exp1 + 15 + 16 */
1220 0 : tmp16 = Log2_norm_lc( tmp32 ); /*15 */
1221 0 : magnbits_fx = L_sub( magnbits_fx, L_sub( tmp16, L_shl( add( exp1, 1 ), 15 ) ) ); /*15 */
1222 0 : BREAK;
1223 : }
1224 : }
1225 :
1226 0 : leftnz = sub( leftnz, 1 );
1227 0 : leftp = sub( leftp, abs_s( magn_fx[i] ) );
1228 : }
1229 :
1230 0 : trellislevel = L_add( trellislevel, 1 );
1231 : }
1232 :
1233 : /* Update actual occurred surplus */
1234 0 : tcqmagnbits_fx = L_sub( L_sub( table_logcum_fx[pulsescurr], table_logcum_fx[nzposcurr] ), table_logcum_fx[pulsescurr - ( nzposcurr - 1 )] );
1235 0 : *surplus_fx = L_add( *surplus_fx, L_sub( tcqmagnbits_fx, L_shl( magnbits_fx, 1 ) ) );
1236 0 : move32();
1237 0 : *nzpout = nzposcurr;
1238 0 : move16();
1239 : } /*magnitude coding */
1240 : } /*TCQ */
1241 :
1242 0 : IF( actualt_fx == 0 )
1243 : {
1244 0 : scale_fx32 = L_add( MAX_32, 0 );
1245 : }
1246 : ELSE
1247 : {
1248 0 : exp1 = norm_l( actualt_fx );
1249 0 : exp2 = sub( norm_l( pulsesnum ), 1 );
1250 0 : lo = L_Extract_lc( L_shl( actualt_fx, exp1 ), &hi );
1251 0 : scale_fx32 = Div_32( L_shl( pulsesnum, exp2 ), hi, lo ); /*31 + exp2 - exp1 - 12 */
1252 0 : Qscale = add( 31 - 12, sub( exp2, exp1 ) ); /*31 + exp2 - exp1 - 12*/
1253 0 : move16();
1254 : }
1255 0 : test();
1256 0 : IF( GT_16( *nzpout, 1 ) && bcount != NULL )
1257 : {
1258 0 : flag_g1 = 0;
1259 0 : move16();
1260 :
1261 0 : FOR( i = 0; i < size; i++ )
1262 : {
1263 0 : if ( GT_16( abs_s( magn_fx[i] ), 1 ) )
1264 : {
1265 0 : flag_g1 = 1;
1266 0 : move16();
1267 : }
1268 : }
1269 : /* prepare vector for TCQ */
1270 0 : FOR( i = 0; i < size; i++ )
1271 : {
1272 0 : test();
1273 0 : IF( flag_g1 == 0 || GE_16( *bcount, 2 * TCQ_AMP ) )
1274 : {
1275 : BREAK;
1276 : }
1277 :
1278 0 : IF( abs_s( magn_fx[i] ) > 0 )
1279 : {
1280 0 : abuffer[*bcount] = quants_fx[i];
1281 0 : move32();
1282 0 : mbuffer[*bcount] = magn_fx[i];
1283 0 : move16();
1284 : /*sbuffer[*bcount] = scale_fx32;*/
1285 0 : exp = norm_s( pulsesnum );
1286 0 : tmp16 = div_l( actualt_fx, shl( pulsesnum, sub( exp, 1 ) ) );
1287 0 : tmp32 = L_shl( L_deposit_l( tmp16 ), exp );
1288 : /*sbuffer[*bcount] = 1/((float)tmp32/pow(2.0, 12));*/
1289 0 : sbuffer[*bcount] = tmp32; /*Q12*/
1290 0 : move32();
1291 : /*sbuffer[*bcount] = (float)scale_fx32 / pow(2.0, Qscale);*/
1292 :
1293 0 : ( *bcount ) = add( *bcount, 1 );
1294 0 : move16();
1295 : }
1296 : }
1297 : }
1298 0 : *qscale_fx = scale_fx32;
1299 0 : move32();
1300 : }
1301 :
1302 0 : return L_shl( magnbits_fx, 1 );
1303 : }
1304 :
1305 0 : void TCQLSB_fx(
1306 : Word16 bcount,
1307 : Word32 *abuffer_fx,
1308 : Word16 *mbuffer_fx,
1309 : Word32 *sbuffer_fx,
1310 : Word16 *dpath )
1311 : {
1312 : Word16 i, st, dminpos, position;
1313 0 : Word16 q_fx = 6554; /*Q15*/
1314 0 : move16();
1315 : Word32 dmin_fx, curdist1_fx, curdist2_fx, newdist1_fx, newdist2_fx;
1316 : Word16 path[STATES_LSB][TCQ_LSB_SIZE];
1317 : Word16 quant[STATES_LSB][TCQ_LSB_SIZE];
1318 : Word16 dquant[STATES_LSB][TCQ_LSB_SIZE];
1319 : Word16 qout[TCQ_LSB_SIZE];
1320 : Word32 s1_fx, s2_fx, a1_fx, a2_fx;
1321 : Word16 s1_fx16, s2_fx16;
1322 : Word16 q1_fx, q2_fx, sign1_fx, sign2_fx;
1323 : Word16 dbuffer_fx[MAX_PULSES];
1324 :
1325 : Word32 tmp1, tmp2;
1326 : Word16 exp1, exp2;
1327 : Word32 metric_fx[STATES_LSB][TCQ_LSB_SIZE];
1328 : Word32 MaxPath;
1329 :
1330 0 : set32_fx( *metric_fx, 0, STATES_LSB * TCQ_LSB_SIZE );
1331 0 : set16_fx( *path, 0, STATES_LSB * TCQ_LSB_SIZE );
1332 0 : set16_fx( *quant, 0, STATES_LSB * TCQ_LSB_SIZE );
1333 0 : set16_fx( *dquant, 0, STATES_LSB * TCQ_LSB_SIZE );
1334 0 : set16_fx( qout, 0, TCQ_LSB_SIZE );
1335 :
1336 0 : metric_fx[1][0] = MAX_32 >> 8;
1337 0 : move32();
1338 0 : metric_fx[2][0] = MAX_32 >> 8;
1339 0 : move32();
1340 0 : metric_fx[3][0] = MAX_32 >> 8;
1341 0 : move32();
1342 :
1343 0 : FOR( i = 0; i < 2 * TCQ_AMP; i += 2 )
1344 : {
1345 0 : q1_fx = mbuffer_fx[i];
1346 0 : move16();
1347 0 : q2_fx = mbuffer_fx[i + 1];
1348 0 : move16();
1349 :
1350 0 : s1_fx = L_add( sbuffer_fx[i], 0 ); /*12*/
1351 0 : s2_fx = L_add( sbuffer_fx[i + 1], 0 ); /*12*/
1352 0 : exp1 = norm_l( s1_fx );
1353 0 : exp2 = norm_l( s2_fx );
1354 0 : s1_fx16 = extract_h( L_shl( s1_fx, exp1 ) ); /*12 + exp1 - 16*/
1355 0 : s2_fx16 = extract_h( L_shl( s2_fx, exp2 ) ); /*12 + exp2 - 16*/
1356 0 : exp1 = add( 12 - 16, exp1 );
1357 0 : move16();
1358 0 : exp2 = add( 12 - 16, exp2 );
1359 0 : move16();
1360 :
1361 0 : a1_fx = L_add( abuffer_fx[i], 0 );
1362 0 : a2_fx = L_add( abuffer_fx[i + 1], 0 );
1363 :
1364 0 : MaxPath = L_add( MAX_32, 0 );
1365 :
1366 : /* cycle over conditions */
1367 0 : FOR( st = 0; st < 4; st++ )
1368 : {
1369 0 : curdist1_fx = L_add( metric_fx[step_LSB[st][0]][i / 2], 0 );
1370 0 : curdist2_fx = L_add( metric_fx[step_LSB[st][1]][i / 2], 0 );
1371 :
1372 : /* step 1 */
1373 : /*sign1_fx = (denc_LSB[st][0] & 0x1)?(q_fx):(-q_fx);*/
1374 0 : IF( s_and( denc_LSB[st][0], 0x1 ) )
1375 : {
1376 0 : sign1_fx = q_fx;
1377 0 : move16();
1378 : }
1379 : ELSE
1380 : {
1381 0 : sign1_fx = negate( q_fx );
1382 : }
1383 : /*sign2_fx = (denc_LSB[st][0] & 0x2)?(q_fx):(-q_fx);*/
1384 0 : IF( s_and( denc_LSB[st][0], 0x2 ) )
1385 : {
1386 0 : sign2_fx = q_fx;
1387 0 : move16();
1388 : }
1389 : ELSE
1390 : {
1391 0 : sign2_fx = negate( q_fx );
1392 : }
1393 0 : tmp1 = L_sub( a1_fx, L_shl( Mult_32_16( L_add( L_shl( q1_fx, 15 ), sign1_fx ), s1_fx16 ), sub( 12 + 2, exp1 ) ) ); /*12*/
1394 0 : tmp2 = L_sub( a2_fx, L_shl( Mult_32_16( L_add( L_shl( q2_fx, 15 ), sign2_fx ), s2_fx16 ), sub( 12 + 2, exp2 ) ) ); /*12*/
1395 0 : newdist1_fx = L_add( Mult_32_32( tmp1, tmp1 ), Mult_32_32( tmp2, tmp2 ) ); /* -7 */
1396 :
1397 : /* step 2 */
1398 : /*sign1_fx = (denc_LSB[st][1] & 0x1)?(q_fx):(-q_fx);*/
1399 0 : IF( s_and( denc_LSB[st][1], 0x1 ) )
1400 : {
1401 0 : sign1_fx = q_fx;
1402 0 : move16();
1403 : }
1404 : ELSE
1405 : {
1406 0 : sign1_fx = negate( q_fx );
1407 : }
1408 : /*sign2_fx = (denc_LSB[st][1] & 0x2)?(q_fx):(-q_fx);*/
1409 0 : IF( s_and( denc_LSB[st][1], 0x2 ) )
1410 : {
1411 0 : sign2_fx = q_fx;
1412 0 : move16();
1413 : }
1414 : ELSE
1415 : {
1416 0 : sign2_fx = negate( q_fx );
1417 : }
1418 0 : tmp1 = L_sub( a1_fx, L_shl( Mult_32_16( L_add( L_shl( q1_fx, 15 ), sign1_fx ), s1_fx16 ), sub( 12 + 2, exp1 ) ) ); /*12*/
1419 0 : tmp2 = L_sub( a2_fx, L_shl( Mult_32_16( L_add( L_shl( q2_fx, 15 ), sign2_fx ), s2_fx16 ), sub( 12 + 2, exp2 ) ) ); /*12*/
1420 0 : newdist2_fx = L_add( Mult_32_32( tmp1, tmp1 ), Mult_32_32( tmp2, tmp2 ) ); /*-7*/
1421 :
1422 : /* decision */
1423 0 : IF( LT_32( L_add( curdist1_fx, newdist1_fx ), L_add( curdist2_fx, newdist2_fx ) ) )
1424 : {
1425 0 : path[st][i / 2 + 1] = step_LSB[st][0];
1426 0 : move16();
1427 0 : metric_fx[st][i / 2 + 1] = L_add( curdist1_fx, newdist1_fx );
1428 0 : move32();
1429 0 : quant[st][i / 2 + 1] = 0;
1430 0 : move16();
1431 0 : dquant[st][i / 2 + 1] = dqnt_LSB[step_LSB[st][0]][st];
1432 0 : move16();
1433 : }
1434 : ELSE
1435 : {
1436 0 : path[st][i / 2 + 1] = step_LSB[st][1];
1437 0 : move16();
1438 0 : metric_fx[st][i / 2 + 1] = L_add( curdist2_fx, newdist2_fx );
1439 0 : move32();
1440 0 : quant[st][i / 2 + 1] = 1;
1441 0 : move16();
1442 0 : dquant[st][i / 2 + 1] = dqnt_LSB[step_LSB[st][0]][st];
1443 0 : move16();
1444 : }
1445 :
1446 0 : if ( GT_32( MaxPath, metric_fx[st][i / 2 + 1] ) )
1447 : {
1448 0 : MaxPath = L_add( metric_fx[st][i / 2 + 1], 0 );
1449 : }
1450 : }
1451 : /* Metric renormalization to prevent overflow */
1452 0 : FOR( st = 0; st < 4; st++ )
1453 : {
1454 0 : metric_fx[st][i / 2 + 1] = L_sub( metric_fx[st][i / 2 + 1], MaxPath );
1455 0 : move32();
1456 : }
1457 : }
1458 :
1459 : /* Find path with minimal metric */
1460 0 : dminpos = 0;
1461 0 : move16();
1462 0 : dmin_fx = L_add( metric_fx[dminpos][i / 2], 0 );
1463 0 : FOR( st = 1; st < 4; st++ )
1464 : {
1465 0 : IF( GT_32( dmin_fx, metric_fx[st][i / 2] ) )
1466 : {
1467 0 : dmin_fx = L_add( metric_fx[st][i / 2], 0 );
1468 0 : dminpos = st;
1469 0 : move16();
1470 : }
1471 : }
1472 :
1473 : /* Trace back to get output */
1474 0 : position = dminpos;
1475 0 : move16();
1476 :
1477 0 : FOR( ; i >= 0; i -= 2 )
1478 : {
1479 0 : qout[i / 2] = quant[position][i / 2 + 1];
1480 0 : move16();
1481 0 : dpath[i / 2] = dquant[position][i / 2 + 1];
1482 0 : move16();
1483 :
1484 0 : IF( s_and( denc_LSB[position][qout[i / 2]], 0x1 ) )
1485 : {
1486 0 : dbuffer_fx[i] = 1;
1487 0 : move16();
1488 : }
1489 : ELSE
1490 : {
1491 0 : dbuffer_fx[i] = -1;
1492 0 : move16();
1493 : }
1494 0 : IF( s_and( denc_LSB[position][qout[i / 2]], 0x2 ) )
1495 : {
1496 0 : dbuffer_fx[i + 1] = 1;
1497 0 : move16();
1498 : }
1499 : ELSE
1500 : {
1501 0 : dbuffer_fx[i + 1] = -1;
1502 0 : move16();
1503 : }
1504 :
1505 0 : position = path[position][i / 2 + 1];
1506 0 : move16();
1507 : }
1508 :
1509 : /* add decoded sequence to quanta */
1510 0 : FOR( i = 0; i < bcount; i++ )
1511 : {
1512 0 : mbuffer_fx[i] = add( add( mbuffer_fx[i], shl( mbuffer_fx[i], 2 ) ), dbuffer_fx[i] );
1513 0 : move16();
1514 : }
1515 :
1516 0 : return;
1517 : }
1518 32 : void TCQLSBdec_fx(
1519 : Word16 *dpath,
1520 : Word16 *mbuffer,
1521 : Word16 bcount )
1522 : {
1523 : /*float q = QTCQ;*/
1524 32 : Word16 q = 1; /*x5*/
1525 32 : move16();
1526 32 : Word16 i, tmp, state = 0;
1527 32 : move16();
1528 32 : tmp = shr( bcount, 1 );
1529 352 : FOR( i = 0; i < tmp; i++ )
1530 : {
1531 320 : IF( s_and( ddec_LSB[state][dpath[i]], 0x1 ) )
1532 : {
1533 146 : mbuffer[2 * i] = q;
1534 146 : move16();
1535 : }
1536 : ELSE
1537 : {
1538 174 : mbuffer[2 * i] = negate( q );
1539 174 : move16();
1540 : }
1541 :
1542 320 : IF( s_and( ddec_LSB[state][dpath[i]], 0x2 ) )
1543 : {
1544 191 : mbuffer[2 * i + 1] = q;
1545 191 : move16();
1546 : }
1547 : ELSE
1548 : {
1549 129 : mbuffer[2 * i + 1] = negate( q );
1550 129 : move16();
1551 : }
1552 :
1553 320 : state = dstep_LSB[state][dpath[i]];
1554 320 : move16();
1555 : }
1556 :
1557 32 : return;
1558 : }
1559 0 : void RestoreTCQ_fx(
1560 : Word16 *magn,
1561 : Word16 size,
1562 : Word16 *bcount,
1563 : Word16 *mbuffer )
1564 : {
1565 0 : Word16 i, nzpos = 0, flag_g1 = 0;
1566 0 : move16();
1567 0 : move16();
1568 : /* calculate actual nz positions */
1569 0 : nzpos = 0;
1570 0 : move16();
1571 0 : FOR( i = 0; i < size; i++ )
1572 : {
1573 0 : IF( magn[i] != 0 )
1574 : {
1575 0 : nzpos = add( nzpos, 1 );
1576 0 : if ( GT_16( abs_s( magn[i] ), 5 ) )
1577 : {
1578 0 : flag_g1 = 1;
1579 0 : move16();
1580 : }
1581 : }
1582 : }
1583 :
1584 0 : IF( GT_16( nzpos, 1 ) )
1585 : {
1586 0 : FOR( i = 0; i < size; i++ )
1587 : {
1588 0 : test();
1589 0 : IF( flag_g1 == 0 || GE_16( *bcount, 2 * TCQ_AMP ) )
1590 : {
1591 : BREAK;
1592 : }
1593 :
1594 0 : IF( abs_s( magn[i] ) > 0 )
1595 : {
1596 0 : magn[i] = mbuffer[*bcount];
1597 0 : move16();
1598 0 : *bcount = add( *bcount, 1 );
1599 0 : move16();
1600 : }
1601 : }
1602 : }
1603 :
1604 0 : return;
1605 : }
1606 515 : void RestoreTCQdec_fx(
1607 : Word16 *magn,
1608 : Word16 size,
1609 : Word16 *bcount,
1610 : Word16 *mbuffer )
1611 : {
1612 515 : Word16 i, nzpos = 0, flag_g1 = 0;
1613 515 : move16();
1614 515 : move16();
1615 : /* calculate actual nz positions */
1616 515 : nzpos = 0;
1617 515 : move16();
1618 7491 : FOR( i = 0; i < size; i++ )
1619 : {
1620 6976 : IF( magn[i] != 0 )
1621 : {
1622 934 : nzpos = add( nzpos, 1 );
1623 934 : if ( GT_16( abs_s( magn[i] ), 1 ) )
1624 : {
1625 191 : flag_g1 = 1;
1626 191 : move16();
1627 : }
1628 934 : magn[i] = extract_l( L_mult0( magn[i], 5 ) );
1629 934 : move16();
1630 : }
1631 : }
1632 :
1633 515 : IF( GT_16( nzpos, 1 ) )
1634 : {
1635 996 : FOR( i = 0; i < size; i++ )
1636 : {
1637 897 : test();
1638 897 : IF( !( flag_g1 && LT_16( *bcount, 2 * TCQ_AMP ) ) )
1639 : {
1640 : BREAK;
1641 : }
1642 :
1643 718 : IF( magn[i] != 0 )
1644 : {
1645 302 : mbuffer[*bcount] = add( magn[i], mbuffer[*bcount] );
1646 302 : move16();
1647 302 : magn[i] = mbuffer[*bcount];
1648 302 : move16();
1649 302 : *bcount = add( *bcount, 1 );
1650 302 : move16();
1651 : }
1652 : }
1653 : }
1654 :
1655 515 : return;
1656 : }
1657 :
1658 0 : void InitLSBTCQ_fx(
1659 : Word16 *bcount )
1660 : {
1661 0 : *bcount = 0;
1662 0 : move16();
1663 :
1664 0 : return;
1665 : }
1666 0 : void SaveTCQdata_fx(
1667 : PARCODEC arInst,
1668 : Word16 *dpath,
1669 : Word16 bcount )
1670 : {
1671 : Word16 i;
1672 0 : FOR( i = 0; i < bcount; i++ )
1673 : {
1674 0 : ar_encode_uniform_fx( arInst, dpath[i], 1 );
1675 : }
1676 :
1677 0 : return;
1678 : }
1679 32 : void LoadTCQdata_fx(
1680 : PARCODEC arInst,
1681 : Word16 *dpath,
1682 : Word16 bcount )
1683 : {
1684 : Word32 i;
1685 352 : FOR( i = 0; i < bcount; i++ )
1686 : {
1687 320 : dpath[i] = ar_decode_fx( arInst, uniform_model );
1688 320 : move16();
1689 : }
1690 :
1691 32 : return;
1692 : }
1693 :
1694 :
1695 0 : Word32 encode_position_ari_fx(
1696 : PARCODEC parenc,
1697 : Word16 *quants,
1698 : Word16 size,
1699 : Word32 *est_bits_frame_fx )
1700 : {
1701 : Word16 i, tmp;
1702 0 : Word16 nz = 0, pulses = 0;
1703 0 : move16();
1704 0 : move16();
1705 : Word16 prob[TCQ_MAX_BAND_SIZE];
1706 : Word16 model_num_nz[TCQ_MAX_BAND_SIZE];
1707 0 : Word16 *cur_quants = quants;
1708 : Word16 integer, frac;
1709 0 : Word32 /*est_bits_frame_fx, */ btcq_fx = 0, bits_fx = 0, pnzp_fx;
1710 0 : move16();
1711 0 : move16();
1712 : Word32 cp, scp, fxone, fxp1;
1713 : Word16 pos;
1714 :
1715 0 : fxone = 32768;
1716 0 : move32();
1717 0 : fxp1 = 512 * 32768;
1718 0 : move32();
1719 :
1720 :
1721 0 : set16_fx( prob, 0, TCQ_MAX_BAND_SIZE );
1722 0 : set16_fx( model_num_nz, 0, TCQ_MAX_BAND_SIZE );
1723 :
1724 0 : FOR( i = 0; i < size; i++ )
1725 : {
1726 0 : pulses = add( pulses, abs_s( cur_quants[i] ) );
1727 0 : if ( cur_quants[i] != 0 )
1728 : {
1729 0 : nz = add( nz, 1 );
1730 : }
1731 : }
1732 :
1733 0 : btcq_fx = GetBitsFromPulses_fx( pulses, size );
1734 : /* Estimate TCQ bits */
1735 0 : bits_fx = L_sub( table_logcum_fx[size + 1], L_add( table_logcum_fx[nz + 1], table_logcum_fx[size - nz + 1] ) );
1736 0 : bits_fx = L_add( bits_fx, L_sub( btcq_fx, L_sub( table_logcum_fx[size + 1], L_add( table_logcum_fx[nz + 1], table_logcum_fx[size - nz + 1] ) ) ) );
1737 0 : bits_fx = L_sub( bits_fx, L_sub( table_logcum_fx[pulses], L_add( table_logcum_fx[nz], table_logcum_fx[pulses - ( nz - 1 )] ) ) );
1738 0 : bits_fx = L_sub( bits_fx, nz );
1739 0 : *est_bits_frame_fx = L_add( *est_bits_frame_fx, bits_fx );
1740 0 : move32();
1741 : /*caculate the #nz probability */
1742 0 : tmp = s_min( pulses, size );
1743 0 : FOR( i = 0; i < tmp; i++ )
1744 : {
1745 0 : pnzp_fx = L_sub( L_deposit_h( add( i, 1 ) ), btcq_fx );
1746 0 : pnzp_fx = L_add( pnzp_fx, L_add( L_sub( table_logcum_fx[size + 1], L_add( table_logcum_fx[i + 2], table_logcum_fx[size - i] ) ),
1747 0 : L_sub( table_logcum_fx[pulses], L_add( table_logcum_fx[i + 1], table_logcum_fx[pulses - i] ) ) ) );
1748 0 : pnzp_fx = L_add( pnzp_fx, 917498 ); /*16 */
1749 0 : IF( pnzp_fx > 0 )
1750 : {
1751 0 : integer = extract_h( pnzp_fx );
1752 0 : frac = extract_l( L_shr( L_sub( pnzp_fx, L_deposit_h( integer ) ), 1 ) ); /*15 */
1753 0 : prob[i] = extract_h( L_shl( Pow2( integer, frac ), 16 ) ); /*0 */
1754 0 : move16();
1755 : /*zero probability will incur problems in ar_make_model() */
1756 0 : if ( prob[i] == 0 )
1757 : {
1758 0 : prob[i] = 1;
1759 0 : move16();
1760 : }
1761 : }
1762 : ELSE
1763 : {
1764 0 : prob[i] = 1;
1765 0 : move16();
1766 : }
1767 : }
1768 :
1769 0 : ar_make_model_fx( prob, model_num_nz, s_min( pulses, size ) );
1770 :
1771 0 : IF( GT_16( nz, 1 ) )
1772 : {
1773 0 : ar_encode_fx( parenc, model_num_nz, sub( nz, 1 ) ); /*encode #nz */
1774 0 : scp = L_add( fxp1, 0 );
1775 0 : pos = 0;
1776 0 : move16();
1777 0 : FOR( i = 0; i < size; i++ )
1778 : {
1779 0 : IF( nz <= 0 )
1780 : {
1781 0 : BREAK;
1782 : }
1783 :
1784 0 : IF( EQ_16( nz, sub( size, i ) ) )
1785 : {
1786 0 : cp = L_deposit_l( 0 );
1787 : }
1788 : ELSE
1789 : {
1790 0 : cp = L_sub( fxone, div_l( L_deposit_h( nz ), sub( size, i ) ) );
1791 : }
1792 0 : scp = Mult_32_16( scp, extract_l( cp ) );
1793 0 : model_num_nz[pos + 1] = round_fx( L_shl( scp, 6 ) );
1794 0 : move16();
1795 0 : test();
1796 0 : test();
1797 0 : IF( ( model_num_nz[pos + 1] == 0 && scp > 0 ) || EQ_16( model_num_nz[pos], model_num_nz[pos + 1] ) )
1798 : {
1799 0 : model_num_nz[pos + 1] = 0;
1800 0 : move16();
1801 0 : ar_encode_fx( parenc, model_num_nz, pos );
1802 0 : i--;
1803 0 : move16();
1804 0 : scp = L_add( fxp1, 0 );
1805 0 : pos = 0;
1806 0 : move16();
1807 0 : CONTINUE;
1808 : }
1809 :
1810 0 : IF( cur_quants[i] != 0 )
1811 : {
1812 0 : ar_encode_fx( parenc, model_num_nz, pos );
1813 0 : pos = 0;
1814 0 : move16();
1815 0 : scp = L_add( fxp1, 0 );
1816 0 : nz--;
1817 0 : move16();
1818 : }
1819 : ELSE
1820 : {
1821 0 : pos++;
1822 0 : move16();
1823 : }
1824 : }
1825 : }
1826 0 : ELSE IF( EQ_16( nz, 1 ) )
1827 : {
1828 0 : IF( GT_16( pulses, 1 ) )
1829 : {
1830 : /*temp -= log2_f((float)(model_num_nz[nz-1] - model_num_nz[nz]) / MAX_AR_FREQ); */
1831 0 : ar_encode_fx( parenc, model_num_nz, 0 ); /*encode #nz */
1832 : }
1833 0 : pos = 0;
1834 0 : move16();
1835 0 : FOR( i = 0; i < size; i++ )
1836 : {
1837 0 : model_num_nz[i + 1] = round_fx( L_shr( L_deposit_h( div_l( L_deposit_h( sub( sub( size, i ), 1 ) ), size ) ), 1 ) );
1838 0 : move16();
1839 0 : if ( cur_quants[i] != 0 )
1840 : {
1841 0 : pos = i;
1842 0 : move16();
1843 : }
1844 : }
1845 0 : ar_encode_fx( parenc, model_num_nz, pos ); /* encode pos */
1846 : }
1847 0 : return bits_fx;
1848 : }
1849 0 : Word32 encode_magnitude_usq_fx(
1850 : ARCODEC *parenc,
1851 : Word16 *magn_fx,
1852 : Word16 size,
1853 : Word16 npulses,
1854 : Word16 nzpos,
1855 : Word32 *est_frame_bits_fx )
1856 : {
1857 : Word16 i, j, k, tmp, magnp, magnzp;
1858 : Word16 magn_position[MAX_PULSES];
1859 : Word32 /*est_frame_bits_fx, */ bits_fx;
1860 : Word16 pos, model_m[MAX_PULSES + 2];
1861 : Word32 fxone, fxp1, cp, scp;
1862 :
1863 0 : fxone = 32768;
1864 0 : move32();
1865 0 : fxp1 = 512 * 32768;
1866 0 : move32();
1867 :
1868 :
1869 : /*estimate fac bits */
1870 0 : bits_fx = L_sub( table_logcum_fx[npulses], L_add( table_logcum_fx[nzpos], table_logcum_fx[npulses - nzpos + 1] ) );
1871 0 : *est_frame_bits_fx = L_add( *est_frame_bits_fx, bits_fx );
1872 :
1873 0 : test();
1874 0 : IF( EQ_16( npulses, nzpos ) || EQ_16( nzpos, 1 ) )
1875 : {
1876 0 : return bits_fx;
1877 : }
1878 0 : magnp = sub( npulses, 1 );
1879 0 : magnzp = sub( nzpos, 1 );
1880 :
1881 : /*generate the binary sequences of magnitudes */
1882 0 : k = 0;
1883 0 : move16();
1884 0 : FOR( i = 0; i < size; i++ )
1885 : {
1886 0 : IF( magn_fx[i] != 0 )
1887 : {
1888 0 : tmp = sub( abs_s( magn_fx[i] ), 1 );
1889 0 : FOR( j = 0; j < tmp; j++ )
1890 : {
1891 0 : magn_position[k] = 0;
1892 0 : move16();
1893 0 : k = add( k, 1 );
1894 : }
1895 0 : magn_position[k] = 1;
1896 0 : move16();
1897 0 : k = add( k, 1 );
1898 : }
1899 : }
1900 :
1901 0 : set16_fx( model_m, 0, MAX_PULSES + 2 );
1902 0 : scp = L_add( fxp1, 0 );
1903 0 : model_m[0] = MAX_AR_FREQ;
1904 0 : move16();
1905 0 : pos = 0;
1906 0 : move16();
1907 0 : tmp = sub( npulses, 1 );
1908 0 : FOR( i = 0; i < tmp; i++ )
1909 : {
1910 0 : IF( magnzp <= 0 )
1911 : {
1912 0 : BREAK;
1913 : }
1914 :
1915 0 : IF( magnzp == magnp )
1916 : {
1917 0 : cp = L_deposit_l( 0 );
1918 : }
1919 : ELSE
1920 : {
1921 0 : cp = L_sub( fxone, div_l( L_deposit_h( magnzp ), magnp ) );
1922 : }
1923 0 : scp = Mult_32_16( scp, extract_l( cp ) );
1924 0 : model_m[pos + 1] = round_fx( L_shl( scp, 6 ) );
1925 0 : move16();
1926 0 : test();
1927 0 : test();
1928 0 : IF( ( model_m[pos + 1] == 0 && scp > 0 ) || EQ_16( model_m[pos], model_m[pos + 1] ) )
1929 : {
1930 0 : model_m[pos + 1] = 0;
1931 0 : move16();
1932 :
1933 0 : ar_encode_fx( parenc, model_m, pos );
1934 0 : pos = 0;
1935 0 : move16();
1936 0 : i = sub( i, 1 );
1937 0 : scp = L_add( fxp1, 0 );
1938 0 : CONTINUE;
1939 : }
1940 :
1941 0 : IF( magn_position[i] != 0 )
1942 : {
1943 0 : ar_encode_fx( parenc, model_m, pos );
1944 0 : pos = 0;
1945 0 : move16();
1946 0 : magnzp = sub( magnzp, 1 );
1947 0 : move16();
1948 0 : scp = L_add( fxp1, 0 );
1949 : }
1950 : ELSE
1951 : {
1952 0 : pos = add( pos, 1 );
1953 : }
1954 :
1955 0 : magnp = sub( magnp, 1 );
1956 0 : move16();
1957 : }
1958 0 : return bits_fx;
1959 : }
1960 0 : Word32 encode_magnitude_tcq_fx(
1961 : ARCODEC *parenc,
1962 : Word16 *magn_fx,
1963 : Word16 size,
1964 : Word16 npulses,
1965 : Word16 nzpos,
1966 : Word32 *savedstates,
1967 : Word32 *est_frame_bits_fx )
1968 : {
1969 : Word32 tcq_bits_fx, bits_fx /*, est_frame_bits_fx*/;
1970 : Word16 prob0_fx, prob1_fx, num, denum, quantum1_fx, quantum2_fx;
1971 : Word16 exp, exp1, exp2;
1972 :
1973 : Word16 i, j;
1974 : Word32 st;
1975 0 : Word16 magn_mode[3] = { MAX_AR_FREQ, 0, 0 };
1976 0 : move16();
1977 0 : move16();
1978 0 : move16();
1979 :
1980 0 : Word16 leftp = npulses; /*pulsesnum; */
1981 0 : Word16 leftnz = nzpos; /*nzpos; */
1982 0 : move16();
1983 0 : move16();
1984 :
1985 0 : bits_fx = L_deposit_l( 0 );
1986 0 : tcq_bits_fx = L_sub( table_logcum_fx[npulses], L_add( table_logcum_fx[nzpos], table_logcum_fx[npulses - ( nzpos - 1 )] ) );
1987 0 : *est_frame_bits_fx = L_add( *est_frame_bits_fx, tcq_bits_fx );
1988 0 : move32();
1989 :
1990 0 : test();
1991 0 : IF( EQ_16( nzpos, npulses ) || EQ_16( nzpos, 1 ) )
1992 : {
1993 0 : return bits_fx;
1994 : }
1995 :
1996 0 : st = L_deposit_l( 0 );
1997 0 : FOR( i = 0; i < size; i++ )
1998 : {
1999 0 : IF( LE_16( leftnz, 1 ) )
2000 : {
2001 0 : BREAK;
2002 : }
2003 :
2004 0 : st = L_add( savedstates[i], 0 );
2005 0 : IF( magn_fx[i] != 0 )
2006 : {
2007 0 : FOR( j = 0; j < leftp; j++ )
2008 : {
2009 : /*calculate the two path probs point to next two states */
2010 0 : num = sub( leftnz, 1 );
2011 0 : denum = sub( leftp, add( j, 0x1 ) );
2012 0 : IF( GE_16( num, denum ) )
2013 : {
2014 0 : prob1_fx = MAX_16;
2015 0 : move16();
2016 0 : prob0_fx = 0;
2017 0 : move16();
2018 : }
2019 : ELSE
2020 : {
2021 0 : exp1 = sub( norm_s( num ), 1 );
2022 0 : exp2 = norm_s( denum );
2023 0 : prob1_fx = div_s( shl( num, exp1 ), shl( denum, exp2 ) ); /*15 + exp1 - exp2 */
2024 0 : exp = add( 15, sub( exp1, exp2 ) );
2025 0 : move16();
2026 0 : prob1_fx = shl( prob1_fx, sub( 15, exp ) );
2027 0 : prob0_fx = sub( MAX_16, prob1_fx );
2028 : }
2029 :
2030 0 : quantum1_fx = quantize_fx( shl( add( j, 1 ), 10 ), ddec[st][0] );
2031 0 : quantum2_fx = quantize_fx( shl( add( j, 1 ), 10 ), ddec[st][1] );
2032 :
2033 0 : test();
2034 0 : IF( NE_16( quantum1_fx, add( j, 1 ) ) && NE_16( quantum2_fx, add( j, 1 ) ) )
2035 : {
2036 0 : prob0_fx = MAX_16;
2037 0 : move16();
2038 0 : prob1_fx = 0;
2039 0 : move16();
2040 : }
2041 :
2042 0 : test();
2043 0 : IF( EQ_16( prob0_fx, MAX_16 ) || EQ_16( prob1_fx, MAX_16 ) )
2044 : {
2045 0 : CONTINUE;
2046 : }
2047 :
2048 0 : magn_mode[1] = mult( prob1_fx, MAX_AR_FREQ );
2049 0 : move16();
2050 0 : IF( LT_16( j, sub( abs_s( magn_fx[i] ), 1 ) ) )
2051 : {
2052 0 : ar_encode_fx( parenc, magn_mode, 0 );
2053 : }
2054 : ELSE
2055 : {
2056 0 : IF( sub( leftp, j ) > leftnz )
2057 : {
2058 0 : ar_encode_fx( parenc, magn_mode, 1 );
2059 : }
2060 0 : BREAK;
2061 : }
2062 : }
2063 :
2064 0 : leftnz = sub( leftnz, 1 );
2065 0 : move16();
2066 0 : leftp = sub( leftp, abs_s( magn_fx[i] ) );
2067 : }
2068 : }
2069 :
2070 0 : return bits_fx;
2071 : }
2072 0 : Word32 encode_signs_fx(
2073 : ARCODEC *parenc,
2074 : Word16 *magn,
2075 : Word16 size,
2076 : Word16 npos,
2077 : Word32 *est_frame_bits_fx )
2078 : {
2079 : Word32 i, sign;
2080 :
2081 0 : *est_frame_bits_fx = L_add( *est_frame_bits_fx, L_deposit_h( npos ) );
2082 0 : move32();
2083 0 : FOR( i = 0; i < size; i++ )
2084 : {
2085 0 : IF( magn[i] != 0 )
2086 : {
2087 0 : sign = L_deposit_l( 0 );
2088 0 : if ( magn[i] > 0 )
2089 : {
2090 0 : sign = L_deposit_l( 1 );
2091 : }
2092 0 : ar_encode_uniform_fx( parenc, sign, 1 );
2093 : }
2094 : }
2095 :
2096 0 : return L_deposit_h( npos );
2097 : }
2098 515 : void decode_position_ari_fx(
2099 : PARCODEC pardec,
2100 : Word16 size,
2101 : Word16 npulses,
2102 : Word16 *nz,
2103 : Word16 *position )
2104 : {
2105 : Word16 i, tmp, nzp;
2106 : Word16 mode_num_nz[TCQ_MAX_BAND_SIZE];
2107 : Word16 prob[TCQ_MAX_BAND_SIZE];
2108 :
2109 : Word32 btcq_fx, pnzp_fx;
2110 : Word16 integer, frac;
2111 : Word32 cp, scp, fxone, fxp1;
2112 515 : Word16 stpos = 0, pos, ovrflag = 0, temppos, storepos;
2113 515 : move16();
2114 515 : move16();
2115 :
2116 515 : fxone = 32768;
2117 515 : move32();
2118 515 : fxp1 = 512 * 32768;
2119 515 : move32();
2120 515 : temppos = 0;
2121 515 : move16();
2122 515 : storepos = 0;
2123 515 : move16();
2124 :
2125 515 : set16_fx( mode_num_nz, 0, TCQ_MAX_BAND_SIZE );
2126 515 : set16_fx( prob, 0, TCQ_MAX_BAND_SIZE );
2127 :
2128 7491 : FOR( i = 0; i < size; i++ )
2129 : {
2130 6976 : position[i] = 0;
2131 6976 : move16();
2132 : }
2133 :
2134 515 : IF( GT_32( npulses, 1 ) )
2135 : {
2136 316 : btcq_fx = GetBitsFromPulses_fx( npulses, size );
2137 316 : tmp = s_min( npulses, size );
2138 1312 : FOR( i = 0; i < tmp; i++ )
2139 : {
2140 : /*calculate the probability of #nz */
2141 :
2142 996 : pnzp_fx = L_sub( L_deposit_h( add( i, 1 ) ), btcq_fx );
2143 996 : pnzp_fx = L_add( pnzp_fx, L_add( L_sub( table_logcum_fx[size + 1], L_add( table_logcum_fx[i + 2], table_logcum_fx[size - i] ) ),
2144 996 : L_sub( table_logcum_fx[npulses], L_add( table_logcum_fx[i + 1], table_logcum_fx[npulses - i] ) ) ) );
2145 996 : pnzp_fx = L_add( pnzp_fx, 917498 ); /*16 */
2146 996 : IF( GT_32( pnzp_fx, 0 ) )
2147 : {
2148 990 : integer = extract_h( pnzp_fx );
2149 990 : frac = extract_l( L_shr( L_sub( pnzp_fx, L_deposit_h( integer ) ), 1 ) ); /*15 */
2150 990 : prob[i] = extract_h( L_shl( Pow2( integer, frac ), 16 ) ); /*0 */
2151 990 : move16();
2152 990 : if ( prob[i] == 0 )
2153 : {
2154 0 : prob[i] = 1;
2155 0 : move16();
2156 : }
2157 : }
2158 : ELSE
2159 : {
2160 6 : prob[i] = 1;
2161 6 : move16();
2162 : }
2163 : }
2164 :
2165 316 : ar_make_model_fx( prob, mode_num_nz, s_min( npulses, size ) );
2166 316 : *nz = add( 1, ar_decode_fx( pardec, mode_num_nz ) ); /*get #nz */
2167 316 : move16();
2168 316 : nzp = *nz;
2169 316 : move16();
2170 316 : IF( EQ_16( nzp, 1 ) )
2171 : {
2172 38 : mode_num_nz[0] = MAX_AR_FREQ;
2173 38 : move16();
2174 372 : FOR( i = 0; i < size; i++ )
2175 : {
2176 334 : mode_num_nz[i + 1] = round_fx( L_shr( L_deposit_h( div_l( L_deposit_h( sub( sub( size, i ), 1 ) ), size ) ), 1 ) );
2177 334 : move16();
2178 : }
2179 :
2180 38 : position[ar_decode_fx( pardec, mode_num_nz )] = 1;
2181 38 : move16();
2182 : }
2183 : ELSE
2184 : {
2185 278 : mode_num_nz[0] = MAX_AR_FREQ;
2186 278 : move16();
2187 :
2188 998 : FOR( ; nzp > 0; nzp-- )
2189 : {
2190 720 : scp = L_add( fxp1, 0 );
2191 720 : temppos = 0;
2192 720 : move16();
2193 720 : storepos = 0;
2194 720 : move16();
2195 :
2196 6276 : FOR( i = stpos; i < size; i++ )
2197 : {
2198 5998 : ovrflag = 0;
2199 5998 : move16();
2200 :
2201 5998 : IF( nzp == sub( size, i ) )
2202 : {
2203 720 : cp = L_deposit_l( 0 );
2204 : }
2205 : ELSE
2206 : {
2207 5278 : cp = L_sub( fxone, div_l( L_deposit_h( nzp ), sub( size, i ) ) );
2208 : }
2209 5998 : scp = Mult_32_16( scp, extract_l( cp ) );
2210 5998 : mode_num_nz[i + 1 - storepos - stpos] = round_fx( L_shl( scp, 6 ) );
2211 :
2212 5998 : test();
2213 5998 : test();
2214 5998 : IF( ( mode_num_nz[i + 1 - storepos - stpos] == 0 && scp > 0 ) || EQ_16( mode_num_nz[i - storepos - stpos], mode_num_nz[i + 1 - storepos - stpos] ) )
2215 : {
2216 442 : mode_num_nz[i + 1 - storepos - stpos] = 0;
2217 442 : move16();
2218 442 : ovrflag = 1;
2219 442 : move16();
2220 442 : temppos = ar_decode_fx( pardec, mode_num_nz );
2221 442 : storepos = add( storepos, temppos );
2222 442 : scp = L_add( fxp1, 0 );
2223 :
2224 442 : IF( EQ_16( temppos, sub( i, stpos ) ) ) /* esc transmitted */
2225 : {
2226 0 : i = sub( i, 1 );
2227 0 : move16();
2228 : }
2229 : ELSE
2230 : {
2231 442 : BREAK;
2232 : }
2233 : }
2234 : }
2235 720 : IF( !ovrflag )
2236 : {
2237 278 : pos = add( ar_decode_fx( pardec, mode_num_nz ), storepos );
2238 278 : move16();
2239 : }
2240 : ELSE
2241 : {
2242 442 : pos = storepos;
2243 442 : move16();
2244 : }
2245 :
2246 720 : position[add( stpos, pos )] = 1;
2247 720 : move16();
2248 720 : stpos = add( stpos, add( pos, 1 ) );
2249 : }
2250 : }
2251 : }
2252 199 : ELSE IF( EQ_32( npulses, 1 ) )
2253 : {
2254 176 : *nz = npulses;
2255 176 : move16();
2256 176 : nzp = *nz;
2257 176 : move16();
2258 176 : mode_num_nz[0] = MAX_AR_FREQ;
2259 176 : move16();
2260 3055 : FOR( i = 0; i < size; i++ )
2261 : {
2262 2879 : mode_num_nz[i + 1] = round_fx( L_shr( L_deposit_h( div_l( L_deposit_h( sub( sub( size, i ), 1 ) ), size ) ), 1 ) );
2263 2879 : move16();
2264 : }
2265 :
2266 176 : position[ar_decode_fx( pardec, mode_num_nz )] = 1;
2267 176 : move16();
2268 : }
2269 : ELSE
2270 : {
2271 23 : *nz = 0;
2272 23 : move16();
2273 : }
2274 :
2275 515 : return;
2276 : }
2277 515 : void decode_magnitude_usq_fx(
2278 : ARCODEC *pardec,
2279 : Word16 size,
2280 : Word16 npulses,
2281 : Word16 nzpos,
2282 : Word16 *positions,
2283 : Word16 *out )
2284 : {
2285 : Word16 i, magnp, magnzp;
2286 515 : Word16 magns[TCQ_MAX_BAND_SIZE], magncout = 0;
2287 515 : move16();
2288 515 : Word16 storemagn, ovrflag = 0, pos, tempmagn = 0, mmodel[MAX_PULSES + 2];
2289 515 : move16();
2290 515 : move16();
2291 : Word32 cp, scp, fxone, fxp1;
2292 :
2293 515 : fxone = 32768;
2294 515 : move32();
2295 515 : fxp1 = 512 * 32768;
2296 515 : move32();
2297 :
2298 515 : set16_fx( magns, 1, TCQ_MAX_BAND_SIZE );
2299 515 : IF( EQ_16( nzpos, npulses ) )
2300 : {
2301 6293 : FOR( i = 0; i < size; i++ )
2302 : {
2303 5917 : out[i] = positions[i];
2304 5917 : move16();
2305 : }
2306 376 : return;
2307 : }
2308 139 : ELSE IF( EQ_16( nzpos, 1 ) )
2309 : {
2310 226 : FOR( i = 0; i < size; i++ )
2311 : {
2312 226 : IF( positions[i] != 0 )
2313 : {
2314 38 : out[i] = npulses;
2315 38 : move16();
2316 38 : return;
2317 : }
2318 : }
2319 : }
2320 :
2321 101 : magnzp = sub( nzpos, 1 );
2322 101 : magnp = sub( npulses, 1 );
2323 :
2324 101 : magncout = 0;
2325 101 : move16();
2326 :
2327 101 : set16_fx( out, 0, size );
2328 101 : set16_fx( mmodel, 0, MAX_PULSES + 2 );
2329 :
2330 101 : mmodel[0] = MAX_AR_FREQ;
2331 101 : move16();
2332 101 : magncout = 0;
2333 101 : move16();
2334 326 : FOR( pos = 0; pos < size; pos++ )
2335 : {
2336 326 : scp = L_add( fxp1, 0 );
2337 326 : IF( positions[pos] != 0 )
2338 : {
2339 187 : storemagn = 0;
2340 187 : move16();
2341 :
2342 865 : FOR( i = 0; i < magnp; i++ )
2343 : {
2344 780 : ovrflag = 0;
2345 780 : move16();
2346 :
2347 780 : IF( magnzp == sub( magnp, i ) )
2348 : {
2349 187 : cp = L_deposit_l( 0 );
2350 : }
2351 : ELSE
2352 : {
2353 593 : cp = L_sub( fxone, div_l( L_deposit_h( magnzp ), sub( magnp, i ) ) );
2354 : }
2355 :
2356 780 : IF( EQ_32( cp, fxone ) )
2357 : {
2358 0 : BREAK;
2359 : }
2360 :
2361 780 : scp = Mult_32_16( scp, extract_l( cp ) );
2362 780 : mmodel[i + 1 - storemagn] = round_fx( L_shl( scp, 6 ) );
2363 780 : move16();
2364 780 : test();
2365 780 : test();
2366 780 : IF( ( mmodel[i + 1 - storemagn] == 0 && scp > 0 ) || EQ_16( mmodel[i - storemagn], mmodel[i + 1 - storemagn] ) )
2367 : {
2368 102 : mmodel[sub( add( i, 1 ), storemagn )] = 0;
2369 102 : move16();
2370 : /* read data */
2371 102 : tempmagn = ar_decode_fx( pardec, mmodel );
2372 102 : storemagn = add( storemagn, tempmagn );
2373 :
2374 102 : IF( LT_16( tempmagn, i ) )
2375 : {
2376 : /* just magnitude */
2377 102 : ovrflag = 1;
2378 102 : move16();
2379 102 : BREAK;
2380 : }
2381 : ELSE
2382 : {
2383 : /* esc code */
2384 0 : scp = L_add( fxp1, 0 );
2385 0 : i = sub( i, 1 );
2386 : }
2387 : }
2388 : }
2389 :
2390 187 : IF( ovrflag )
2391 : {
2392 102 : out[magncout] = add( storemagn, 1 );
2393 102 : move16();
2394 : }
2395 : ELSE
2396 : {
2397 85 : out[magncout] = add( add( ar_decode_fx( pardec, mmodel ), storemagn ), 1 );
2398 85 : move16();
2399 : }
2400 187 : magnp = sub( magnp, out[magncout] );
2401 187 : magnzp = sub( magnzp, 1 );
2402 187 : magncout = add( magncout, 1 );
2403 :
2404 187 : IF( magnzp == 0 ) /* last magnitude generation */
2405 : {
2406 155 : FOR( pos = add( pos, 1 ); pos < size; pos++ )
2407 : {
2408 155 : IF( positions[pos] != 0 )
2409 : {
2410 85 : out[magncout] = add( magnp, 1 );
2411 85 : move16();
2412 85 : return;
2413 : }
2414 : ELSE
2415 : {
2416 70 : out[magncout] = 0;
2417 70 : move16();
2418 70 : magncout = add( magncout, 1 );
2419 70 : move16();
2420 : }
2421 : }
2422 : }
2423 102 : ELSE IF( EQ_16( magnzp, magnp ) ) /* rest magnitudes generation */
2424 : {
2425 81 : FOR( pos = add( pos, 1 ); pos < size; pos++ )
2426 : {
2427 65 : out[magncout] = positions[pos];
2428 65 : move16();
2429 65 : magncout = add( magncout, 1 );
2430 : }
2431 16 : return;
2432 : }
2433 : }
2434 : ELSE
2435 : {
2436 139 : out[magncout] = 0;
2437 139 : move16();
2438 139 : magncout = add( magncout, 1 );
2439 : }
2440 : }
2441 :
2442 0 : return;
2443 : }
2444 0 : void decode_mangitude_tcq_fx(
2445 : ARCODEC *pardec,
2446 : Word16 size,
2447 : Word16 npulses,
2448 : Word16 nzpos,
2449 : Word16 *positions,
2450 : Word16 *out,
2451 : Word32 *surplus_fx )
2452 : {
2453 : Word32 tcq_bits_fx, bits_fx /*, surplus_fx*/;
2454 : Word16 prob0_fx, prob1_fx, num, denum, quantum1_fx, quantum2_fx;
2455 : Word16 exp, exp1, exp2, tmp16;
2456 : Word32 tmp32;
2457 :
2458 : Word16 i, j, symbol, st;
2459 0 : Word16 leftp = npulses; /*pulsesnum; */
2460 0 : move16();
2461 0 : Word16 leftnz = nzpos; /*nzpos; */
2462 0 : move16();
2463 0 : Word16 magn_mode[3] = { MAX_AR_FREQ, 0, 0 };
2464 0 : move16();
2465 0 : move16();
2466 0 : move16();
2467 :
2468 0 : bits_fx = L_deposit_l( 0 );
2469 0 : tcq_bits_fx = L_sub( table_logcum_fx[npulses], L_add( table_logcum_fx[nzpos], table_logcum_fx[npulses - ( nzpos - 1 )] ) );
2470 :
2471 0 : IF( EQ_16( nzpos, npulses ) )
2472 : {
2473 0 : FOR( i = 0; i < size; i++ )
2474 : {
2475 0 : out[i] = positions[i];
2476 0 : move16();
2477 : }
2478 :
2479 0 : return;
2480 : }
2481 0 : ELSE IF( EQ_16( nzpos, 1 ) )
2482 : {
2483 0 : FOR( i = 0; i < size; i++ )
2484 : {
2485 0 : IF( positions[i] != 0 )
2486 : {
2487 0 : out[i] = npulses;
2488 0 : move16();
2489 0 : return;
2490 : }
2491 : }
2492 : }
2493 0 : st = 0;
2494 0 : move16();
2495 0 : FOR( i = 0; i < size; i++ )
2496 : {
2497 0 : IF( LE_16( leftnz, 1 ) )
2498 : {
2499 0 : BREAK;
2500 : }
2501 :
2502 0 : out[i] = positions[i];
2503 0 : move16();
2504 0 : IF( positions[i] != 0 )
2505 : {
2506 : /*generate the trellis path */
2507 0 : symbol = 0;
2508 0 : move16();
2509 0 : FOR( j = 0; j < leftp; j++ )
2510 : {
2511 0 : num = sub( leftnz, 1 );
2512 0 : denum = sub( leftp, add( j, 1 ) );
2513 0 : IF( GE_16( num, denum ) )
2514 : {
2515 0 : prob1_fx = MAX_16;
2516 0 : move16();
2517 0 : prob0_fx = 0;
2518 0 : move16();
2519 : }
2520 : ELSE
2521 : {
2522 0 : exp1 = sub( norm_s( num ), 1 );
2523 0 : exp2 = norm_s( denum );
2524 0 : prob1_fx = div_s( shl( num, exp1 ), shl( denum, exp2 ) ); /*15 + exp1 - exp2 */
2525 0 : exp = add( 15, sub( exp1, exp2 ) );
2526 0 : prob1_fx = shl( prob1_fx, sub( 15, exp ) );
2527 0 : prob0_fx = sub( MAX_16, prob1_fx );
2528 : }
2529 0 : IF( EQ_32( sub( leftp, j ), leftnz ) )
2530 : {
2531 0 : symbol = add( j, 1 );
2532 0 : BREAK;
2533 : }
2534 :
2535 0 : quantum1_fx = quantize_fx( shl( add( j, 1 ), 10 ), ddec[st][0] );
2536 0 : quantum2_fx = quantize_fx( shl( add( j, 1 ), 10 ), ddec[st][1] );
2537 :
2538 0 : test();
2539 0 : IF( NE_16( quantum1_fx, add( j, 1 ) ) && NE_16( quantum2_fx, add( j, 1 ) ) )
2540 : {
2541 0 : prob0_fx = MAX_16;
2542 0 : move16();
2543 0 : prob1_fx = 0;
2544 0 : move16();
2545 : }
2546 :
2547 0 : test();
2548 0 : IF( EQ_16( prob0_fx, MAX_16 ) || EQ_16( prob1_fx, MAX_16 ) )
2549 : {
2550 0 : symbol = add( j, 1 );
2551 0 : CONTINUE;
2552 : }
2553 :
2554 : /*magn_mode[1] = (short)(prob1 * MAX_AR_FREQ); */
2555 0 : magn_mode[1] = mult( prob1_fx, MAX_AR_FREQ );
2556 0 : move16();
2557 0 : IF( ar_decode_fx( pardec, magn_mode ) )
2558 : {
2559 0 : exp1 = norm_s( prob1_fx );
2560 0 : tmp32 = L_deposit_h( shl( prob1_fx, exp1 ) ); /*exp1 + 15 + 16 */
2561 0 : tmp16 = Log2_norm_lc( tmp32 ); /*15 */
2562 0 : bits_fx = L_sub( bits_fx, L_sub( tmp16, L_shl( add( exp1, 1 ), 15 ) ) ); /*15 */
2563 :
2564 0 : symbol = add( j, 1 );
2565 0 : BREAK;
2566 : }
2567 : ELSE
2568 : {
2569 0 : exp1 = norm_s( prob0_fx );
2570 0 : tmp32 = L_deposit_h( shl( prob0_fx, exp1 ) ); /*exp1 + 15 + 16 */
2571 0 : tmp16 = Log2_norm_lc( tmp32 ); /*15 */
2572 0 : bits_fx = L_sub( bits_fx, L_sub( tmp16, L_shl( add( exp1, 1 ), 15 ) ) ); /*15 */
2573 : }
2574 : }
2575 0 : out[i] = symbol;
2576 0 : move16();
2577 : /*leftp -= symbol; */
2578 0 : leftp = sub( leftp, symbol );
2579 0 : leftnz = sub( leftnz, 1 );
2580 : }
2581 :
2582 0 : quantum1_fx = quantize_fx( out[i], ddec[st][0] );
2583 0 : quantum2_fx = quantize_fx( out[i], ddec[st][1] );
2584 :
2585 : /*generate the next state */
2586 0 : IF( EQ_16( quantum1_fx, out[i] ) )
2587 : {
2588 0 : st = nextstate[st][0];
2589 0 : move16();
2590 : }
2591 : ELSE
2592 : {
2593 0 : st = nextstate[st][1];
2594 0 : move16();
2595 : }
2596 : }
2597 :
2598 : /*generate the magnitudes */
2599 0 : FOR( ; i < size; i++ )
2600 : {
2601 0 : out[i] = 0;
2602 0 : move16();
2603 0 : IF( positions[i] != 0 )
2604 : {
2605 0 : out[i] = add( sub( leftp, leftnz ), 1 );
2606 0 : move16();
2607 : }
2608 : }
2609 :
2610 0 : test();
2611 0 : IF( NE_16( nzpos, npulses ) && GT_16( nzpos, 1 ) )
2612 : {
2613 : /*update the surplus */
2614 0 : *surplus_fx = L_add( *surplus_fx, L_sub( tcq_bits_fx, L_shl( bits_fx, 1 ) ) );
2615 0 : move32();
2616 : }
2617 :
2618 0 : return;
2619 : }
2620 :
2621 515 : void decode_signs_fx(
2622 : ARCODEC *pardec,
2623 : Word16 size,
2624 : Word16 *out )
2625 : {
2626 : Word16 i;
2627 :
2628 7491 : FOR( i = 0; i < size; i++ )
2629 : {
2630 6976 : IF( out[i] != 0 )
2631 : {
2632 : Word16 tmp;
2633 934 : tmp = ar_decode_fx( pardec, uniform_model );
2634 :
2635 934 : if ( tmp <= 0 )
2636 : {
2637 455 : out[i] = negate( out[i] );
2638 455 : move16();
2639 : }
2640 : }
2641 : }
2642 :
2643 515 : return;
2644 : }
2645 :
2646 515 : Word16 GetScale_fx(
2647 : Word16 blen,
2648 : Word32 bits_fx /*Q16*/,
2649 : Word32 *surplus_fx /*Q16*/
2650 : )
2651 : {
2652 515 : Word16 pulses = MAX_PULSES, p_est, exp, exp1, exp2, magicnum;
2653 515 : move16();
2654 515 : Word32 t, a, b, ab, estbits_fx = 0;
2655 515 : move32();
2656 515 : magicnum = 24773;
2657 515 : move16(); /*Q17: 0.188992013101951f; */
2658 :
2659 515 : t = L_shr( L_mult( magicnum, blen ), 2 );
2660 515 : exp = norm_l( t );
2661 515 : a = L_add( L_shl( sub( 14, exp ), 15 ), Log2_norm_lc( L_shl( t, exp ) ) );
2662 :
2663 515 : exp1 = sub( norm_l( bits_fx ), 1 );
2664 515 : exp2 = norm_s( sub( blen, 1 ) );
2665 515 : b = L_shr( L_deposit_l( div_l( L_shl( bits_fx, exp1 ), shl( sub( blen, 1 ), exp2 ) ) ), sub( exp1, exp2 ) );
2666 :
2667 515 : ab = L_add( a, b );
2668 :
2669 515 : p_est = extract_h( L_shl( Pow2( extract_l( L_shr( ab, 15 ) ), extract_l( L_and( ab, 0x7FFF ) ) ), 16 ) ); /* enable saturationof pow2 result */
2670 :
2671 515 : pulses = s_min( p_est, MAX_PULSES );
2672 :
2673 1822 : FOR( ; pulses >= 0; pulses-- )
2674 : {
2675 1822 : estbits_fx = GetBitsFromPulses_fx( pulses, blen );
2676 1822 : IF( GE_32( bits_fx, estbits_fx ) )
2677 : {
2678 515 : BREAK;
2679 : }
2680 : }
2681 :
2682 515 : IF( surplus_fx != 0 )
2683 : {
2684 515 : *surplus_fx = L_add( *surplus_fx, L_sub( bits_fx, estbits_fx ) );
2685 515 : move16();
2686 : }
2687 :
2688 515 : return pulses;
2689 : }
2690 :
2691 32 : void srt_vec_ind_fx(
2692 : const Word32 *linear, /* linear input */
2693 : Word32 *srt, /* sorted output*/
2694 : Word16 *I, /* index for sorted output */
2695 : Word16 length )
2696 : {
2697 : Word16 pos, npos, tmp;
2698 : Word16 idxMem;
2699 : Word32 valMem;
2700 :
2701 : /*initilize */
2702 756 : FOR( pos = 0; pos < length; pos++ )
2703 : {
2704 724 : I[pos] = pos;
2705 724 : move16();
2706 : }
2707 :
2708 32 : Copy32( linear, srt, length );
2709 :
2710 : /* now iterate */
2711 32 : tmp = sub( length, 1 );
2712 724 : FOR( pos = 0; pos < tmp; pos++ )
2713 : {
2714 8614 : FOR( npos = add( pos, 1 ); npos < length; npos++ )
2715 : {
2716 7922 : IF( LT_32( srt[npos], srt[pos] ) )
2717 : {
2718 3113 : idxMem = I[pos];
2719 3113 : move16();
2720 3113 : I[pos] = I[npos];
2721 3113 : move16();
2722 3113 : I[npos] = idxMem;
2723 3113 : move16();
2724 :
2725 3113 : valMem = L_add( srt[pos], 0 );
2726 3113 : srt[pos] = srt[npos];
2727 3113 : move32();
2728 3113 : srt[npos] = valMem;
2729 3113 : move32();
2730 : }
2731 : }
2732 : }
2733 :
2734 32 : return;
2735 : }
|