LCOV - code coverage report
Current view: top level - lib_com - tcq_position_arith.c (source / functions) Hit Total Coverage
Test: Coverage on main -- merged total coverage @ 9b04ec3cb36f5e8dc438cf854fa3e349998fa1e9 Lines: 861 902 95.5 %
Date: 2025-10-31 05:45:46 Functions: 39 39 100.0 %

          Line data    Source code
       1             : /******************************************************************************************************
       2             : 
       3             :    (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB,
       4             :    Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
       5             :    Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
       6             :    Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
       7             :    contributors to this repository. All Rights Reserved.
       8             : 
       9             :    This software is protected by copyright law and by international treaties.
      10             :    The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB,
      11             :    Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
      12             :    Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
      13             :    Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
      14             :    contributors to this repository retain full ownership rights in their respective contributions in
      15             :    the software. This notice grants no license of any kind, including but not limited to patent
      16             :    license, nor is any license granted by implication, estoppel or otherwise.
      17             : 
      18             :    Contributors are required to enter into the IVAS codec Public Collaboration agreement before making
      19             :    contributions.
      20             : 
      21             :    This software is provided "AS IS", without any express or implied warranties. The software is in the
      22             :    development stage. It is intended exclusively for experts who have experience with such software and
      23             :    solely for the purpose of inspection. All implied warranties of non-infringement, merchantability
      24             :    and fitness for a particular purpose are hereby disclaimed and excluded.
      25             : 
      26             :    Any dispute, controversy or claim arising under or in relation to providing this software shall be
      27             :    submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in
      28             :    accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and
      29             :    the United Nations Convention on Contracts on the International Sales of Goods.
      30             : 
      31             : *******************************************************************************************************/
      32             : 
      33             : /*====================================================================================
      34             :     EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0
      35             :   ====================================================================================*/
      36             : 
      37             : #include <stdint.h>
      38             : #include "options.h"
      39             : #ifdef DEBUGGING
      40             : #include "debug.h"
      41             : #endif
      42             : #include <math.h>
      43             : #include "prot.h"
      44             : #include "rom_com.h"
      45             : #include "basop_util.h"
      46             : #include "basop_proto_func.h"
      47             : #include "wmc_auto.h"
      48             : 
      49             : 
      50             : static void bitstream_save_bit( TCQ_PBITSTREAM pBS, const int16_t bit );
      51             : static uint32_t bitstream_load_bit( TCQ_PBITSTREAM pBS );
      52             : static void bitstream_rollback( TCQ_PBITSTREAM pBS, int16_t numBits );
      53             : 
      54             : static int32_t ar_make_model( const int16_t *freq, int16_t *model, const int16_t len );
      55             : static int32_t ar_decode( PARCODEC arInst, const int16_t *model );
      56             : static void ar_encode( PARCODEC arInst, const int16_t *model, int32_t symbol );
      57             : static void ar_encode_uniform( PARCODEC arInst, uint16_t data, const int16_t bits );
      58             : 
      59             : 
      60             : /* 32x16 multiply: */
      61     3084093 : Word32 Mult_32_16( Word32 a, Word16 b )
      62             : {
      63             :     Word32 result;
      64             :     UWord16 lo;
      65             :     /* use Mpy_32_16_ss(): */
      66     3084093 :     Mpy_32_16_ss( a, b, &result, &lo );
      67             : 
      68     3084093 :     return result;
      69             : }
      70             : 
      71             : /* 32x32 multiply: */
      72     2379156 : Word32 Mult_32_32( Word32 a, Word32 b )
      73             : {
      74             :     Word32 result;
      75             :     UWord32 lo;
      76             :     /* use Mpy_32_32_ss(): */
      77     2379156 :     Mpy_32_32_ss( a, b, &result, &lo );
      78             : 
      79     2379156 :     return result;
      80             : }
      81             : 
      82      313405 : static void set16_fx(
      83             :     Word16 y[],     /* i/o: Vector to set                       */
      84             :     const Word16 a, /* i  : Value to set the vector to          */
      85             :     const Word16 N  /* i  : Lenght of the vector                */
      86             : )
      87             : {
      88             :     Word16 i;
      89             : 
      90    51861801 :     for ( i = 0; i < N; i++ )
      91             :     {
      92    51548396 :         y[i] = a;
      93             :     }
      94             : 
      95      313405 :     return;
      96             : }
      97             : 
      98       22057 : static void set32_fx(
      99             :     Word32 y[],     /* i/o: Vector to set                       */
     100             :     const Word32 a, /* i  : Value to set the vector to          */
     101             :     const Word16 N  /* i  : Lenght of the vector                */
     102             : )
     103             : {
     104             :     Word16 i;
     105      163028 :     for ( i = 0; i < N; i++ )
     106             :     {
     107      140971 :         y[i] = a;
     108             :     }
     109             : 
     110       22057 :     return;
     111             : }
     112             : 
     113      857343 : Word32 ar_div(
     114             :     Word32 num,
     115             :     Word32 denum )
     116             : {
     117             :     Word16 exp1, exp2, exp, i;
     118             :     Word32 varout;
     119             :     Word32 sign;
     120             : 
     121      857343 :     sign = L_and( L_xor( num, denum ), 0x80000000 );
     122             : 
     123      857343 :     num = L_abs( num );
     124      857343 :     denum = L_abs( denum );
     125             : 
     126      857343 :     if ( L_sub( num, denum ) < 0 || denum == 0 )
     127             :     {
     128       54974 :         return 0;
     129             :     }
     130      802369 :     else if ( L_sub( num, denum ) == 0 )
     131             :     {
     132           0 :         return 1;
     133             :     }
     134             :     else
     135             :     {
     136      802369 :         exp1 = norm_l( num );
     137      802369 :         exp2 = norm_l( denum );
     138      802369 :         exp = sub( exp2, exp1 );
     139      802369 :         denum = L_shl( denum, exp );
     140      802369 :         exp = add( exp, 1 );
     141      802369 :         varout = 0;
     142    17154363 :         for ( i = 0; i < exp; i++ )
     143             :         {
     144    16351994 :             num = L_sub( num, denum );
     145    16351994 :             varout = L_shl( varout, 1 );
     146    16351994 :             if ( num >= 0 )
     147             :             {
     148     8023904 :                 num = L_shl( num, 1 );
     149     8023904 :                 varout = L_add( varout, 1 );
     150             :             }
     151             :             else
     152             :             {
     153     8328090 :                 num = L_add( num, denum );
     154     8328090 :                 num = L_shl( num, 1 );
     155             :             }
     156             :         }
     157             :     }
     158             : 
     159      802369 :     if ( sign != 0 )
     160             :     {
     161           0 :         varout = L_negate( varout );
     162             :     }
     163             : 
     164      802369 :     return varout;
     165             : }
     166             : 
     167        6496 : void srt_vec_ind_fx(
     168             :     const Word32 *linear, /* linear input */
     169             :     Word32 *srt,          /* sorted output*/
     170             :     Word16 *I,            /* index for sorted output  */
     171             :     Word16 length )
     172             : {
     173             :     Word16 pos, npos;
     174             :     Word16 idxMem;
     175             :     Word32 valMem;
     176             : 
     177             :     /*initialize */
     178      145390 :     for ( pos = 0; pos < length; pos++ )
     179             :     {
     180      138894 :         I[pos] = pos;
     181             :     }
     182             : 
     183      145390 :     for ( pos = 0; pos < length; pos++ )
     184             :     {
     185      138894 :         srt[pos] = linear[pos];
     186             :     }
     187             : 
     188             :     /* now iterate */
     189      138894 :     for ( pos = 0; pos < ( length - 1 ); pos++ )
     190             :     {
     191     1581512 :         for ( npos = ( pos + 1 ); npos < length; npos++ )
     192             :         {
     193     1449114 :             if ( L_sub( srt[npos], srt[pos] ) < 0 )
     194             :             {
     195      723702 :                 idxMem = I[pos];
     196      723702 :                 I[pos] = I[npos];
     197      723702 :                 I[npos] = idxMem;
     198             : 
     199      723702 :                 valMem = srt[pos];
     200      723702 :                 srt[pos] = srt[npos];
     201      723702 :                 srt[npos] = valMem;
     202             :             }
     203             :         }
     204             :     }
     205             : 
     206        6496 :     return;
     207             : }
     208             : 
     209      421504 : static Word32 GetBitsFromPulses_fx(
     210             :     Word16 m,
     211             :     Word16 n )
     212             : {
     213             :     Word16 i, integer_fx, temp_fx1, temp_fx2, exp1, exp2;
     214             :     Word32 temp32;
     215             :     Word32 frac_fx32;
     216             :     Word32 logCoeff_fx;
     217      421504 :     Word16 exp = 0;
     218      421504 :     Word32 mantissa_fx = 0;
     219             : 
     220      421504 :     if ( m == 0 )
     221             :     {
     222        6238 :         return 0;
     223             :     }
     224             : 
     225     1963890 :     for ( i = 0; i < min( m, n ); i++ )
     226             :     {
     227     1548624 :         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] ) ) );
     228     1548624 :         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 */
     229             : 
     230     1548624 :         integer_fx = extract_h( logCoeff_fx );                     /*Q0 */
     231     1548624 :         frac_fx32 = L_sub( logCoeff_fx, L_shl( integer_fx, 16 ) ); /*Q16 */
     232             : 
     233             :         /*ln2, 0.987, ln2 * ln2, 0.977 */
     234             :         /*temp1 = (long) (frac / 0.0625); */
     235             :         /*temp2 = frac - (float)temp1 * 0.0625f; */
     236             : 
     237             :         /* frac = pow(2.0, temp1 * 0.0625) * (1 + 0.693 * temp2 + 0.480 * temp2 * temp2 * 0.5);*/
     238             :         /*frac = pow_getbitsfrompulses[temp1] * (1 + 0.693f * temp2 + 0.480f * temp2 * temp2 * 0.5f); */
     239             : 
     240     1548624 :         temp_fx1 = extract_h( L_shl( frac_fx32, 4 ) );
     241     1548624 :         temp_fx2 = extract_l( L_and( frac_fx32, 0xfff ) ); /*Q16 */
     242             : 
     243     1548624 :         frac_fx32 = L_add( L_mult( temp_fx2, 22708 ), Mult_32_16( L_mult0( temp_fx2, temp_fx2 ), 7864 ) ); /*Q32 */
     244     1548624 :         frac_fx32 = L_add( 0x40000000, L_shr( frac_fx32, 2 ) );                                            /*30 */
     245             : 
     246     1548624 :         exp1 = norm_l( pow_getbitsfrompulses_fx[temp_fx1] );
     247     1548624 :         exp2 = norm_l( frac_fx32 );
     248     1548624 :         frac_fx32 = Mult_32_32( L_shl( pow_getbitsfrompulses_fx[temp_fx1], exp1 ), L_shl( frac_fx32, exp2 ) ); /*21 + exp1 + 30 + exp2 - 31 */
     249     1548624 :         frac_fx32 = L_shr( frac_fx32, exp1 + exp2 ) + 1;                                                       /*20 */
     250             : 
     251     1548624 :         if ( sub( exp, integer_fx ) < 0 )
     252             :         {
     253     1316583 :             mantissa_fx = L_shr( mantissa_fx, sub( integer_fx, exp ) );
     254     1316583 :             mantissa_fx = L_add( mantissa_fx, frac_fx32 );
     255             : 
     256     1316583 :             exp = integer_fx;
     257             :         }
     258             :         else
     259             :         {
     260      232041 :             mantissa_fx = L_add( mantissa_fx, L_shr( frac_fx32, sub( exp, integer_fx ) ) );
     261             :         }
     262     1548624 :         if ( L_sub( mantissa_fx, 0x200000 ) >= 0 )
     263             :         {
     264      325358 :             exp++;
     265             : 
     266      325358 :             mantissa_fx = L_shr( mantissa_fx, 1 );
     267             :         }
     268             :     }
     269             : 
     270      415266 :     mantissa_fx = L_shl( mantissa_fx, 2 ); /*22 */
     271      415266 :     temp_fx1 = extract_h( mantissa_fx );
     272      415266 :     temp32 = L_shl( L_sub( mantissa_fx, L_deposit_h( temp_fx1 ) ), 15 ); /*31 */
     273      415266 :     exp1 = sub( norm_l( temp32 ), 1 );
     274      415266 :     temp32 = ar_div( L_shl( temp32, exp1 ), temp_fx1 ); /*31 + exp1 */
     275      415266 :     temp32 = L_shr( temp32, exp1 + 1 );                 /*30 */
     276             : 
     277      415266 :     frac_fx32 = L_sub( 0x40000000, L_shr( temp32, 1 ) ); /*30 */
     278      415266 :     frac_fx32 = Mult_32_32( frac_fx32, temp32 );         /*29 */
     279      415266 :     frac_fx32 = L_shr( frac_fx32, 13 );                  /*16 */
     280      415266 :     exp1 = norm_l( temp_fx1 );
     281      415266 :     temp_fx1 = Log2_norm_lc( L_shl( temp_fx1, exp1 ) );         /*15 */
     282      415266 :     frac_fx32 = frac_fx32 + Mult_32_32( frac_fx32, 950680361 ); /* frac_fx32 *= 1/ln(2) */
     283      415266 :     return L_add( L_deposit_h( exp ), L_add( L_shl( temp_fx1, 1 ), frac_fx32 ) );
     284             : }
     285             : 
     286       72932 : void decode_position_ari_fx(
     287             :     PARCODEC pardec,
     288             :     Word16 size,
     289             :     Word16 npulses,
     290             :     Word16 *nz,
     291             :     Word32 *position )
     292             : {
     293             :     Word16 i, nzp;
     294             :     Word16 mode_num_nz[TCQ_MAX_BAND_SIZE];
     295             :     Word16 prob[TCQ_MAX_BAND_SIZE];
     296             : 
     297             :     Word32 btcq_fx, pnzp_fx;
     298             :     Word16 integer, frac;
     299             : 
     300             :     Word32 cp, scp, fxone, fxp1;
     301       72932 :     Word16 stpos = 0, pos, ovrflag, temppos, storepos;
     302             : 
     303       72932 :     fxone = 32768;
     304       72932 :     fxp1 = 512 * 32768;
     305       72932 :     temppos = 0;
     306       72932 :     storepos = 0;
     307       72932 :     ovrflag = 0;
     308             : 
     309       72932 :     set16_fx( mode_num_nz, 0, TCQ_MAX_BAND_SIZE );
     310       72932 :     set16_fx( prob, 0, TCQ_MAX_BAND_SIZE );
     311             : 
     312      975500 :     for ( i = 0; i < size; i++ )
     313             :     {
     314      902568 :         position[i] = 0;
     315             :     }
     316             : 
     317       72932 :     if ( L_sub( npulses, 1 ) > 0 )
     318             :     {
     319       48844 :         btcq_fx = GetBitsFromPulses_fx( npulses, size );
     320      234061 :         for ( i = 0; i < L_min( npulses, size ); i++ )
     321             :         {
     322             :             /*calculate the probability of #nz */
     323             : 
     324      185217 :             pnzp_fx = L_sub( L_deposit_h( add( i, 1 ) ), btcq_fx );
     325      185217 :             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] ) ), L_sub( table_logcum_fx[npulses], L_add( table_logcum_fx[i + 1], table_logcum_fx[npulses - i] ) ) ) );
     326      185217 :             pnzp_fx = L_add( pnzp_fx, 917498 ); /*16 */
     327      185217 :             if ( L_sub( pnzp_fx, 0 ) > 0 )
     328             :             {
     329      183726 :                 integer = extract_h( pnzp_fx );
     330      183726 :                 frac = extract_l( L_shr( L_sub( pnzp_fx, L_deposit_h( integer ) ), 1 ) ); /*15 */
     331      183726 :                 prob[i] = extract_h( L_shl( Pow2( integer, frac ), 16 ) );                /*0 */
     332      183726 :                 if ( prob[i] == 0 )
     333             :                 {
     334           0 :                     prob[i] = 1;
     335             :                 }
     336             :             }
     337             :             else
     338             :             {
     339        1491 :                 prob[i] = 1;
     340             :             }
     341             :         }
     342             : 
     343       48844 :         ar_make_model( prob, mode_num_nz, min( npulses, size ) );
     344       48844 :         *nz = add( 1, (Word16) ar_decode( pardec, mode_num_nz ) ); /*get #nz */
     345       48844 :         nzp = *nz;
     346             : 
     347       48844 :         if ( nzp == 1 )
     348             :         {
     349             :             Word16 tmp;
     350        1639 :             mode_num_nz[0] = MAX_AR_FREQ;
     351       17832 :             for ( i = 0; i < size; i++ )
     352             :             {
     353       16193 :                 tmp = div_l( L_deposit_h( size - i - 1 ), size );
     354       16193 :                 mode_num_nz[i + 1] = round_fx( L_shr( L_deposit_h( tmp ), 1 ) );
     355             :             }
     356             : 
     357        1639 :             position[ar_decode( pardec, mode_num_nz )] = 1;
     358             :         }
     359             :         else
     360             :         {
     361             :             Word16 tmp;
     362       47205 :             mode_num_nz[0] = MAX_AR_FREQ;
     363             : 
     364      195638 :             for ( ; nzp > 0; nzp-- )
     365             :             {
     366      148433 :                 scp = fxp1;
     367      148433 :                 temppos = 0;
     368      148433 :                 storepos = 0;
     369             : 
     370      827268 :                 for ( i = stpos; i < size; i++ )
     371             :                 {
     372      780063 :                     ovrflag = 0;
     373             : 
     374      780063 :                     if ( nzp == ( size - i ) )
     375             :                     {
     376      148377 :                         cp = 0;
     377             :                     }
     378             :                     else
     379             :                     {
     380      631686 :                         tmp = div_l( L_deposit_h( nzp ), ( size - i ) );
     381      631686 :                         cp = L_sub( fxone, tmp );
     382             :                     }
     383      780063 :                     scp = Mult_32_16( scp, extract_l( cp ) );
     384      780063 :                     mode_num_nz[i + 1 - storepos - stpos] = round_fx( L_shl( scp, 6 ) );
     385             : 
     386      780063 :                     if ( ( mode_num_nz[i + 1 - storepos - stpos] == 0 && scp > 0 ) || mode_num_nz[i - storepos - stpos] == mode_num_nz[i + 1 - storepos - stpos] )
     387             :                     {
     388      101228 :                         ovrflag = 1;
     389      101228 :                         temppos = (Word16) ar_decode( pardec, mode_num_nz );
     390      101228 :                         storepos += temppos;
     391      101228 :                         scp = fxp1;
     392             : 
     393      101228 :                         if ( temppos == i - stpos ) /* esc transmitted */
     394             :                         {
     395           0 :                             i--;
     396             :                         }
     397             :                         else
     398             :                         {
     399      101228 :                             break;
     400             :                         }
     401             :                     }
     402             :                 }
     403      148433 :                 if ( !ovrflag )
     404             :                 {
     405       47205 :                     pos = (Word16) ar_decode( pardec, mode_num_nz ) + storepos;
     406             :                 }
     407             :                 else
     408             :                 {
     409      101228 :                     pos = storepos;
     410             :                 }
     411             : 
     412      148433 :                 position[stpos + pos] = 1;
     413      148433 :                 stpos += pos + 1;
     414             :             }
     415             :         }
     416             :     }
     417       24088 :     else if ( L_sub( npulses, 1 ) == 0 )
     418             :     {
     419             :         Word16 tmp;
     420       21142 :         *nz = npulses;
     421       21142 :         nzp = *nz;
     422       21142 :         mode_num_nz[0] = MAX_AR_FREQ;
     423      423539 :         for ( i = 0; i < size; i++ )
     424             :         {
     425      402397 :             tmp = div_l( L_deposit_h( size - i - 1 ), size );
     426      402397 :             mode_num_nz[i + 1] = round_fx( L_shr( L_deposit_h( tmp ), 1 ) );
     427             :         }
     428             : 
     429       21142 :         position[ar_decode( pardec, mode_num_nz )] = 1;
     430             :     }
     431             :     else
     432             :     {
     433        2946 :         *nz = 0;
     434             :     }
     435             : 
     436       72932 :     return;
     437             : }
     438             : 
     439             : 
     440       71539 : void decode_magnitude_usq_fx(
     441             :     ARCODEC *pardec,
     442             :     Word16 size,
     443             :     Word16 npulses,
     444             :     Word16 nzpos,
     445             :     Word32 *positions,
     446             :     Word32 *out )
     447             : {
     448             :     Word16 i, magnp, magnzp;
     449       71539 :     Word16 magns[TCQ_MAX_BAND_SIZE], magncout = 0;
     450             : 
     451       71539 :     Word16 storemagn, ovrflag, pos, tempmagn = 0, mmodel[MAX_PULSES + 2];
     452             :     Word32 cp, scp, fxone, fxp1;
     453             : 
     454       71539 :     fxone = 32768;
     455       71539 :     fxp1 = 512 * 32768;
     456       71539 :     ovrflag = 0;
     457             : 
     458             : 
     459       71539 :     set16_fx( magns, 1, TCQ_MAX_BAND_SIZE );
     460       71539 :     if ( sub( nzpos, npulses ) == 0 )
     461             :     {
     462      772536 :         for ( i = 0; i < size; i++ )
     463             :         {
     464      724657 :             out[i] = positions[i];
     465             :         }
     466       47879 :         return;
     467             :     }
     468       23660 :     else if ( sub( nzpos, 1 ) == 0 )
     469             :     {
     470        8179 :         for ( i = 0; i < size; i++ )
     471             :         {
     472        8179 :             if ( positions[i] != 0 )
     473             :             {
     474        1603 :                 out[i] = npulses;
     475        1603 :                 return;
     476             :             }
     477             :         }
     478             :     }
     479             : 
     480       22057 :     magnzp = sub( nzpos, 1 );
     481       22057 :     magnp = sub( npulses, 1 );
     482             : 
     483       22057 :     magncout = 0;
     484             : 
     485       22057 :     set32_fx( out, 0, size );
     486       22057 :     set16_fx( mmodel, 0, MAX_PULSES + 2 );
     487             : 
     488       22057 :     mmodel[0] = MAX_AR_FREQ;
     489       22057 :     magncout = 0;
     490       75613 :     for ( pos = 0; pos < size; pos++ )
     491             :     {
     492       75613 :         scp = fxp1;
     493       75613 :         if ( positions[pos] != 0 )
     494             :         {
     495       52453 :             storemagn = 0;
     496             : 
     497      252973 :             for ( i = 0; i < magnp; i++ )
     498             :             {
     499      236829 :                 ovrflag = 0;
     500             : 
     501      236829 :                 if ( magnzp == ( magnp - i ) )
     502             :                 {
     503       52361 :                     cp = 0;
     504             :                 }
     505             :                 else
     506             :                 {
     507             :                     Word16 tmp;
     508      184468 :                     tmp = div_l( L_deposit_h( magnzp ), magnp - i );
     509      184468 :                     cp = L_sub( fxone, tmp );
     510             :                 }
     511             : 
     512      236829 :                 if ( cp == fxone )
     513             :                 {
     514           0 :                     break;
     515             :                 }
     516             : 
     517      236829 :                 scp = Mult_32_16( scp, extract_l( cp ) );
     518      236829 :                 mmodel[i + 1 - storemagn] = round_fx( L_shl( scp, 6 ) );
     519             : 
     520      236829 :                 if ( ( mmodel[i + 1 - storemagn] == 0 && scp > 0 ) || mmodel[i - storemagn] == mmodel[i + 1 - storemagn] )
     521             :                 {
     522       36309 :                     mmodel[i + 1 - storemagn] = 0;
     523             :                     /* read data */
     524       36309 :                     tempmagn = (Word16) ar_decode( pardec, mmodel );
     525       36309 :                     storemagn += tempmagn;
     526             : 
     527       36309 :                     if ( tempmagn < i )
     528             :                     {
     529             :                         /* just magnitude */
     530       36309 :                         ovrflag = 1;
     531       36309 :                         break;
     532             :                     }
     533             :                     else
     534             :                     {
     535             :                         /* esc code */
     536           0 :                         scp = fxp1;
     537           0 :                         i--;
     538             :                     }
     539             :                 }
     540             :             }
     541             : 
     542       52453 :             if ( ovrflag )
     543             :             {
     544       36309 :                 out[magncout] = storemagn + 1;
     545             :             }
     546             :             else
     547             :             {
     548       16144 :                 out[magncout] = ar_decode( pardec, mmodel ) + storemagn + 1;
     549             :             }
     550       52453 :             magnp -= (Word16) out[magncout];
     551       52453 :             magnzp--;
     552       52453 :             magncout++;
     553             : 
     554       52453 :             if ( magnzp == 0 ) /* last magnitude generation */
     555             :             {
     556       26537 :                 for ( pos = pos + 1; pos < size; pos++ )
     557             :                 {
     558       26537 :                     if ( positions[pos] != 0 )
     559             :                     {
     560       16144 :                         out[magncout] = magnp + 1;
     561       16144 :                         return;
     562             :                     }
     563             :                     else
     564             :                     {
     565       10393 :                         out[magncout] = 0;
     566       10393 :                         magncout++;
     567             :                     }
     568             :                 }
     569             :             }
     570       36309 :             else if ( magnzp == magnp ) /* rest magnitudes generation */
     571             :             {
     572       29079 :                 for ( pos = pos + 1; pos < size; pos++ )
     573             :                 {
     574       23166 :                     out[magncout] = positions[pos];
     575       23166 :                     magncout++;
     576             :                 }
     577        5913 :                 return;
     578             :             }
     579             :         }
     580             :         else
     581             :         {
     582       23160 :             out[magncout] = 0;
     583       23160 :             magncout++;
     584             :         }
     585             :     }
     586             : 
     587           0 :     return;
     588             : }
     589             : 
     590        1360 : static Word16 quantize_fx(
     591             :     Word16 val,
     592             :     Word16 D )
     593             : {
     594             :     Word16 qval4_fx;
     595             :     Word16 retval_fx;
     596             : 
     597        1360 :     qval4_fx = shr( abs_s( add( val, 512 ) ), 12 );
     598        1360 :     retval_fx = add( shl( qval4_fx, 2 ), DDP_fx[D] );
     599             :     /* 2nd zero check */
     600        1360 :     if ( D == 0 )
     601             :     {
     602         421 :         if ( sub( abs_s( sub( shl( abs_s( retval_fx ), 10 ), abs_s( val ) ) ), abs_s( val ) ) > 0 )
     603             :         {
     604         356 :             retval_fx = 0;
     605             :         }
     606             :     }
     607             : 
     608        1360 :     return retval_fx;
     609             : }
     610             : 
     611        1393 : void decode_mangitude_tcq_fx(
     612             :     ARCODEC *pardec,
     613             :     Word16 size,
     614             :     Word16 npulses,
     615             :     Word16 nzpos,
     616             :     Word32 *positions,
     617             :     Word32 *out,
     618             :     Word32 *surplus_fx )
     619             : {
     620             :     Word32 tcq_bits_fx, bits_fx /*, surplus_fx*/;
     621             :     Word16 prob0_fx, prob1_fx, num, denum, quantum1_fx, quantum2_fx;
     622             :     Word16 exp, exp1, exp2, tmp16;
     623             :     Word32 tmp32;
     624             : 
     625             :     Word16 i, j, symbol, st;
     626        1393 :     Word16 leftp = npulses; /*pulsesnum; */
     627        1393 :     Word16 leftnz = nzpos;  /*nzpos; */
     628        1393 :     Word16 magn_mode[3] = { MAX_AR_FREQ, 0, 0 };
     629             : 
     630        1393 :     bits_fx = 0;
     631        1393 :     tcq_bits_fx = L_sub( table_logcum_fx[npulses], L_add( table_logcum_fx[nzpos], table_logcum_fx[npulses - ( nzpos - 1 )] ) );
     632             : 
     633        1393 :     if ( sub( nzpos, npulses ) == 0 )
     634             :     {
     635       21496 :         for ( i = 0; i < size; i++ )
     636             :         {
     637       20185 :             out[i] = positions[i];
     638             :         }
     639             : 
     640        1311 :         return;
     641             :     }
     642          82 :     else if ( sub( nzpos, 1 ) == 0 )
     643             :     {
     644         191 :         for ( i = 0; i < size; i++ )
     645             :         {
     646         191 :             if ( positions[i] != 0 )
     647             :             {
     648          36 :                 out[i] = npulses;
     649          36 :                 return;
     650             :             }
     651             :         }
     652             :     }
     653          46 :     st = 0;
     654         421 :     for ( i = 0; i < size && leftnz > 1; i++ )
     655             :     {
     656         375 :         out[i] = positions[i];
     657         375 :         if ( positions[i] != 0 )
     658             :         {
     659             :             /*generate the trellis path */
     660         111 :             symbol = 0;
     661         168 :             for ( j = 0; j < leftp; j++ )
     662             :             {
     663         168 :                 num = sub( leftnz, 1 );
     664         168 :                 denum = sub( leftp, add( j, 1 ) );
     665         168 :                 if ( sub( num, denum ) >= 0 )
     666             :                 {
     667          41 :                     prob1_fx = MAX_16;
     668          41 :                     prob0_fx = 0;
     669             :                 }
     670             :                 else
     671             :                 {
     672         127 :                     exp1 = sub( norm_s( num ), 1 );
     673         127 :                     exp2 = norm_s( denum );
     674         127 :                     prob1_fx = div_s( shl( num, exp1 ), shl( denum, exp2 ) ); /*15 + exp1 - exp2 */
     675         127 :                     exp = 15 + exp1 - exp2;
     676         127 :                     prob1_fx = shl( prob1_fx, sub( 15, exp ) );
     677         127 :                     prob0_fx = sub( MAX_16, prob1_fx );
     678             :                 }
     679         168 :                 if ( L_sub( sub( leftp, j ), leftnz ) == 0 )
     680             :                 {
     681          41 :                     symbol = add( j, 1 );
     682          41 :                     break;
     683             :                 }
     684             : 
     685         127 :                 quantum1_fx = quantize_fx( shl( add( j, 1 ), 10 ), ddec[st][0] );
     686         127 :                 quantum2_fx = quantize_fx( shl( add( j, 1 ), 10 ), ddec[st][1] );
     687             : 
     688         127 :                 if ( sub( quantum1_fx, add( j, 1 ) ) != 0 && sub( quantum2_fx, add( j, 1 ) ) != 0 )
     689             :                 {
     690          43 :                     prob0_fx = MAX_16;
     691          43 :                     move16();
     692          43 :                     prob1_fx = 0;
     693          43 :                     move16();
     694             :                 }
     695         127 :                 if ( sub( prob0_fx, MAX_16 ) == 0 || sub( prob1_fx, MAX_16 ) == 0 )
     696             :                 {
     697          43 :                     symbol = add( j, 1 );
     698          43 :                     continue;
     699             :                 }
     700             : 
     701             :                 /*magn_mode[1] = (int16_t)(prob1 * MAX_AR_FREQ); */
     702          84 :                 magn_mode[1] = mult( prob1_fx, MAX_AR_FREQ );
     703             : 
     704          84 :                 if ( ar_decode( pardec, magn_mode ) )
     705             :                 {
     706          70 :                     exp1 = norm_s( prob1_fx );
     707          70 :                     tmp32 = L_deposit_h( shl( prob1_fx, exp1 ) );                            /*exp1 + 15 + 16 */
     708          70 :                     tmp16 = Log2_norm_lc( tmp32 );                                           /*15 */
     709          70 :                     bits_fx = L_sub( bits_fx, L_sub( tmp16, L_shl( add( exp1, 1 ), 15 ) ) ); /*15 */
     710             : 
     711          70 :                     symbol = add( j, 1 );
     712          70 :                     break;
     713             :                 }
     714             :                 else
     715             :                 {
     716          14 :                     exp1 = norm_s( prob0_fx );
     717          14 :                     tmp32 = L_deposit_h( shl( prob0_fx, exp1 ) );                            /*exp1 + 15 + 16 */
     718          14 :                     tmp16 = Log2_norm_lc( tmp32 );                                           /*15 */
     719          14 :                     bits_fx = L_sub( bits_fx, L_sub( tmp16, L_shl( add( exp1, 1 ), 15 ) ) ); /*15 */
     720             :                 }
     721             :             }
     722         111 :             out[i] = symbol;
     723             :             /*leftp -= symbol; */
     724         111 :             leftp = sub( leftp, symbol );
     725         111 :             leftnz--;
     726             :         }
     727             : 
     728         375 :         quantum1_fx = quantize_fx( (Word16) out[i], ddec[st][0] );
     729         375 :         quantum2_fx = quantize_fx( (Word16) out[i], ddec[st][1] );
     730             : 
     731             :         /*generate the next state */
     732         375 :         if ( sub( quantum1_fx, (Word16) out[i] ) == 0 )
     733             :         {
     734         206 :             st = nextstate[st][0];
     735             :         }
     736             :         else
     737             :         {
     738         169 :             st = nextstate[st][1];
     739             :         }
     740             :     }
     741             : 
     742             :     /*generate the magnitudes */
     743         233 :     for ( ; i < size; i++ )
     744             :     {
     745         187 :         out[i] = 0;
     746         187 :         if ( positions[i] != 0 )
     747             :         {
     748          46 :             out[i] = add( sub( leftp, leftnz ), 1 );
     749             :         }
     750             :     }
     751             : 
     752          46 :     if ( sub( nzpos, npulses ) != 0 && sub( nzpos, 1 ) > 0 )
     753             :     {
     754             :         /*update the surplus */
     755          46 :         *surplus_fx = L_add( *surplus_fx, L_sub( tcq_bits_fx, L_shl( bits_fx, 1 ) ) );
     756             :     }
     757             : 
     758          46 :     return;
     759             : }
     760             : 
     761      105164 : Word16 GetScale_fx(
     762             :     Word16 blen,
     763             :     Word32 bits_fx /*Q16*/,
     764             :     Word32 *surplus_fx /*Q16*/
     765             : )
     766             : {
     767      105164 :     Word16 pulses = MAX_PULSES, p_est, exp, exp1, exp2, magicnum, tmp;
     768      105164 :     Word32 t, a, b, ab, estbits_fx = 0;
     769             : 
     770      105164 :     magicnum = 24773; /*Q17: 0.188992013101951f; */
     771             : 
     772      105164 :     t = L_shr( L_mult( magicnum, blen ), 2 );
     773      105164 :     exp = norm_l( t );
     774      105164 :     a = L_shl( 14 - exp, 15 ) + Log2_norm_lc( L_shl( t, exp ) );
     775             : 
     776      105164 :     exp1 = sub( norm_l( bits_fx ), 1 );
     777      105164 :     exp2 = norm_s( blen - 1 );
     778             : 
     779      105164 :     tmp = div_l( L_shl( bits_fx, exp1 ), shl( blen - 1, exp2 ) );
     780      105164 :     b = L_shr( L_deposit_l( tmp ), exp1 - exp2 );
     781             : 
     782      105164 :     ab = L_add( a, b );
     783             : 
     784      105164 :     p_est = extract_h( L_shl( Pow2( extract_l( L_shr( ab, 15 ) ), ab & 0x7FFF ), 16 ) ); /* enable saturation of pow2 result  */
     785             : 
     786      105164 :     pulses = min( p_est, MAX_PULSES );
     787             : 
     788      340428 :     for ( ; pulses >= 0; pulses-- )
     789             :     {
     790      340428 :         estbits_fx = GetBitsFromPulses_fx( pulses, blen );
     791      340428 :         if ( L_sub( bits_fx, estbits_fx ) >= 0 )
     792             :         {
     793      105164 :             break;
     794             :         }
     795             :     }
     796             : 
     797      105164 :     if ( surplus_fx != NULL )
     798             :     {
     799      105164 :         *surplus_fx = L_add( *surplus_fx, L_sub( bits_fx, estbits_fx ) );
     800             :     }
     801             : 
     802      105164 :     return pulses;
     803             : }
     804             : 
     805             : 
     806       72932 : void decode_signs_fx(
     807             :     ARCODEC *pardec,
     808             :     Word16 size,
     809             :     Word32 *out )
     810             : {
     811             :     Word16 i;
     812             : 
     813      975500 :     for ( i = 0; i < size; i++ )
     814             :     {
     815      902568 :         if ( out[i] != 0 )
     816             :         {
     817      171214 :             out[i] = ( ar_decode( pardec, uniform_model ) > 0 ) ? out[i] : -out[i];
     818             :         }
     819             :     }
     820             : 
     821       72932 :     return;
     822             : }
     823             : 
     824       32232 : Word32 encode_position_ari_fx(
     825             :     PARCODEC parenc,
     826             :     float *quants,
     827             :     Word16 size,
     828             :     Word32 *est_bits_frame_fx )
     829             : {
     830             :     Word16 i;
     831       32232 :     Word16 nz = 0, pulses = 0;
     832             :     Word16 prob[TCQ_MAX_BAND_SIZE];
     833             :     Word16 model_num_nz[TCQ_MAX_BAND_SIZE];
     834       32232 :     float *cur_quants = quants;
     835             :     Word16 integer, frac;
     836       32232 :     Word32 /*est_bits_frame_fx, */ btcq_fx = 0, bits_fx = 0, pnzp_fx;
     837             :     Word32 cp, scp, fxone, fxp1;
     838             :     Word16 pos;
     839             : 
     840       32232 :     fxone = 32768;
     841       32232 :     fxp1 = 512 * 32768;
     842             : 
     843       32232 :     set16_fx( prob, 0, TCQ_MAX_BAND_SIZE );
     844       32232 :     set16_fx( model_num_nz, 0, TCQ_MAX_BAND_SIZE );
     845             : 
     846      430298 :     for ( i = 0; i < size; i++ )
     847             :     {
     848      398066 :         pulses = add( pulses, abs_s( (int16_t) cur_quants[i] ) );
     849      398066 :         if ( cur_quants[i] != 0 )
     850             :         {
     851       73703 :             nz++;
     852             :         }
     853             :     }
     854             : 
     855       32232 :     btcq_fx = GetBitsFromPulses_fx( pulses, size );
     856             :     /* Estimate TCQ bits */
     857       32232 :     bits_fx = L_sub( table_logcum_fx[size + 1], L_add( table_logcum_fx[nz + 1], table_logcum_fx[size - nz + 1] ) );
     858       32232 :     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] ) ) ) );
     859       32232 :     bits_fx = L_sub( bits_fx, L_sub( table_logcum_fx[pulses], L_add( table_logcum_fx[nz], table_logcum_fx[pulses - ( nz - 1 )] ) ) );
     860             : 
     861       32232 :     bits_fx = L_sub( bits_fx, nz );
     862       32232 :     *est_bits_frame_fx = L_add( *est_bits_frame_fx, bits_fx );
     863             : 
     864             :     /*caculate the #nz probability */
     865      121544 :     for ( i = 0; i < min( pulses, size ); i++ )
     866             :     {
     867       89312 :         pnzp_fx = L_sub( L_deposit_h( add( i, 1 ) ), btcq_fx );
     868             : 
     869       89312 :         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] ) ), L_sub( table_logcum_fx[pulses], L_add( table_logcum_fx[i + 1], table_logcum_fx[pulses - i] ) ) ) );
     870             : 
     871       89312 :         pnzp_fx = L_add( pnzp_fx, 917498 ); /*16 */
     872       89312 :         if ( L_sub( pnzp_fx, 0 ) > 0 )
     873             :         {
     874       88451 :             integer = extract_h( pnzp_fx );
     875       88451 :             frac = extract_l( L_shr( L_sub( pnzp_fx, L_deposit_h( integer ) ), 1 ) ); /*15 */
     876       88451 :             prob[i] = extract_h( L_shl( Pow2( integer, frac ), 16 ) );                /*0 */
     877             : 
     878             :             /*zero probability will incur problems in ar_make_model() */
     879       88451 :             if ( prob[i] == 0 )
     880             :             {
     881           0 :                 prob[i] = 1;
     882             :             }
     883             :         }
     884             :         else
     885             :         {
     886         861 :             prob[i] = 1;
     887             :         }
     888             :     }
     889             : 
     890       32232 :     ar_make_model( prob, model_num_nz, min( pulses, size ) );
     891             : 
     892       32232 :     if ( sub( nz, 1 ) > 0 )
     893             :     {
     894       20520 :         ar_encode( parenc, model_num_nz, nz - 1 ); /*encode #nz */
     895             : 
     896       20520 :         scp = fxp1;
     897       20520 :         pos = 0;
     898      162903 :         for ( i = 0; i < size && nz > 0; i++ )
     899             :         {
     900      142383 :             if ( nz == ( size - i ) )
     901             :             {
     902       18102 :                 cp = 0;
     903             :             }
     904             :             else
     905             :             {
     906             :                 Word16 tmp;
     907      124281 :                 tmp = div_l( L_deposit_h( nz ), ( size - i ) );
     908      124281 :                 cp = L_sub( fxone, tmp );
     909             :             }
     910      142383 :             scp = Mult_32_16( scp, extract_l( cp ) );
     911      142383 :             model_num_nz[pos + 1] = round_fx( L_shl( scp, 6 ) );
     912             : 
     913      142383 :             if ( ( model_num_nz[pos + 1] == 0 && scp > 0 ) || model_num_nz[pos] == model_num_nz[pos + 1] )
     914             :             {
     915           0 :                 model_num_nz[pos + 1] = 0;
     916           0 :                 ar_encode( parenc, model_num_nz, pos );
     917           0 :                 i--;
     918           0 :                 scp = fxp1;
     919           0 :                 pos = 0;
     920           0 :                 continue;
     921             :             }
     922             : 
     923      142383 :             if ( cur_quants[i] != 0 )
     924             :             {
     925       63637 :                 ar_encode( parenc, model_num_nz, pos );
     926       63637 :                 pos = 0;
     927       63637 :                 scp = fxp1;
     928       63637 :                 nz--;
     929             :             }
     930             :             else
     931             :             {
     932       78746 :                 pos++;
     933             :             }
     934             :         }
     935             :     }
     936       11712 :     else if ( sub( nz, 1 ) == 0 )
     937             :     {
     938       10066 :         if ( sub( pulses, 1 ) > 0 )
     939             :         {
     940             :             /*temp -= log2_f((float)(model_num_nz[nz-1] - model_num_nz[nz]) / MAX_AR_FREQ); */
     941         930 :             ar_encode( parenc, model_num_nz, 0 ); /*encode #nz */
     942             :         }
     943             : 
     944       10066 :         pos = 0;
     945      188350 :         for ( i = 0; i < size; i++ )
     946             :         {
     947             :             Word16 tmp;
     948      178284 :             tmp = div_l( L_deposit_h( size - i - 1 ), size );
     949      178284 :             model_num_nz[i + 1] = round_fx( L_shr( L_deposit_h( tmp ), 1 ) );
     950             : 
     951      178284 :             if ( cur_quants[i] != 0 )
     952             :             {
     953       10066 :                 pos = i;
     954             :             }
     955             :         }
     956       10066 :         ar_encode( parenc, model_num_nz, pos ); /* encode pos */
     957             :     }
     958       32232 :     return bits_fx;
     959             : }
     960             : 
     961             : 
     962        1307 : Word32 encode_magnitude_tcq_fx(
     963             :     ARCODEC *parenc,
     964             :     float *magn_fx,
     965             :     Word16 size,
     966             :     Word16 npulses,
     967             :     Word16 nzpos,
     968             :     Word32 *savedstates,
     969             :     Word32 *est_frame_bits_fx )
     970             : {
     971             :     Word32 tcq_bits_fx, bits_fx /*, est_frame_bits_fx*/;
     972             :     Word16 prob0_fx, prob1_fx, num, denum, quantum1_fx, quantum2_fx;
     973             :     Word16 exp, exp1, exp2;
     974             : 
     975             :     Word16 i, j;
     976             :     Word32 st;
     977        1307 :     Word16 magn_mode[3] = { MAX_AR_FREQ, 0, 0 };
     978             : 
     979        1307 :     Word16 leftp = npulses; /*pulsesnum; */
     980        1307 :     Word16 leftnz = nzpos;  /*nzpos; */
     981             : 
     982        1307 :     bits_fx = 0;
     983             : 
     984        1307 :     tcq_bits_fx = L_sub( table_logcum_fx[npulses], L_add( table_logcum_fx[nzpos], table_logcum_fx[npulses - ( nzpos - 1 )] ) );
     985             : 
     986        1307 :     *est_frame_bits_fx = L_add( *est_frame_bits_fx, tcq_bits_fx );
     987             : 
     988        1307 :     if ( sub( nzpos, npulses ) == 0 || sub( nzpos, 1 ) == 0 )
     989             :     {
     990        1271 :         return bits_fx;
     991             :     }
     992             : 
     993          36 :     st = 0;
     994         285 :     for ( i = 0; i < size && leftnz > 1; i++ )
     995             :     {
     996         249 :         st = savedstates[i];
     997         249 :         if ( magn_fx[i] != 0 )
     998             :         {
     999         209 :             for ( j = 0; j < leftp; j++ )
    1000             :             {
    1001             :                 /*calculate the two path probs point to next two states */
    1002         178 :                 num = sub( leftnz, 1 );
    1003         178 :                 denum = sub( leftp, add( j, 0x1 ) );
    1004         178 :                 if ( sub( num, denum ) >= 0 )
    1005             :                 {
    1006          83 :                     prob1_fx = MAX_16;
    1007          83 :                     prob0_fx = 0;
    1008             :                 }
    1009             :                 else
    1010             :                 {
    1011          95 :                     exp1 = sub( norm_s( num ), 1 );
    1012          95 :                     exp2 = norm_s( denum );
    1013          95 :                     prob1_fx = div_s( shl( num, exp1 ), shl( denum, exp2 ) ); /*15 + exp1 - exp2 */
    1014          95 :                     exp = 15 + exp1 - exp2;
    1015          95 :                     prob1_fx = shl( prob1_fx, sub( 15, exp ) );
    1016          95 :                     prob0_fx = sub( MAX_16, prob1_fx );
    1017             :                 }
    1018             : 
    1019         178 :                 quantum1_fx = quantize_fx( shl( add( j, 1 ), 10 ), ddec[st][0] );
    1020         178 :                 quantum2_fx = quantize_fx( shl( add( j, 1 ), 10 ), ddec[st][1] );
    1021             : 
    1022         178 :                 if ( sub( quantum1_fx, add( j, 1 ) ) != 0 && sub( quantum2_fx, add( j, 1 ) ) != 0 )
    1023             :                 {
    1024          70 :                     prob0_fx = MAX_16;
    1025          70 :                     prob1_fx = 0;
    1026             :                 }
    1027         178 :                 if ( sub( prob0_fx, MAX_16 ) == 0 || sub( prob1_fx, MAX_16 ) == 0 )
    1028             :                 {
    1029         116 :                     continue;
    1030             :                 }
    1031             : 
    1032          62 :                 magn_mode[1] = mult( prob1_fx, MAX_AR_FREQ );
    1033          62 :                 if ( sub( j, sub( abs_s( (int16_t) magn_fx[i] ), 1 ) ) < 0 )
    1034             :                 {
    1035          10 :                     ar_encode( parenc, magn_mode, 0 );
    1036             :                 }
    1037             :                 else
    1038             :                 {
    1039          52 :                     if ( sub( leftp, j ) > leftnz )
    1040             :                     {
    1041          52 :                         ar_encode( parenc, magn_mode, 1 );
    1042             :                     }
    1043          52 :                     break;
    1044             :                 }
    1045             :             }
    1046             : 
    1047          83 :             leftnz--;
    1048          83 :             leftp = sub( leftp, abs_s( (int16_t) magn_fx[i] ) );
    1049             :         }
    1050             :     }
    1051             : 
    1052          36 :     return bits_fx;
    1053             : }
    1054             : 
    1055             : 
    1056       32232 : Word32 encode_signs_fx(
    1057             :     ARCODEC *parenc,
    1058             :     float *magn,
    1059             :     Word16 size,
    1060             :     Word16 npos,
    1061             :     Word32 *est_frame_bits_fx )
    1062             : {
    1063             :     Word32 i, sign;
    1064             : 
    1065       32232 :     *est_frame_bits_fx = L_add( *est_frame_bits_fx, L_deposit_h( npos ) );
    1066      430298 :     for ( i = 0; i < size; i++ )
    1067             :     {
    1068      398066 :         if ( magn[i] != 0 )
    1069             :         {
    1070       73703 :             sign = ( magn[i] > 0 ) ? 1 : 0;
    1071       73703 :             ar_encode_uniform( parenc, (uint16_t) sign, 1 );
    1072             :         }
    1073             :     }
    1074             : 
    1075       32232 :     return L_deposit_h( npos );
    1076             : }
    1077             : 
    1078             : 
    1079       30925 : Word32 encode_magnitude_usq_fx(
    1080             :     ARCODEC *parenc,
    1081             :     float *magn_fx,
    1082             :     Word16 size,
    1083             :     Word16 npulses,
    1084             :     Word16 nzpos,
    1085             :     Word32 *est_frame_bits_fx )
    1086             : {
    1087             :     Word16 i, j, k, magnp, magnzp;
    1088             :     Word16 magn_position[MAX_PULSES];
    1089             :     Word32 /*est_frame_bits_fx, */ bits_fx;
    1090             : 
    1091             :     Word16 pos, model_m[MAX_PULSES + 2];
    1092             :     Word32 fxone, fxp1, cp, scp;
    1093             : 
    1094       30925 :     fxone = 32768;
    1095       30925 :     fxp1 = 512 * 32768;
    1096             : 
    1097             :     /*estimate fac bits */
    1098       30925 :     bits_fx = L_sub( table_logcum_fx[npulses], L_add( table_logcum_fx[nzpos], table_logcum_fx[npulses - nzpos + 1] ) );
    1099             : 
    1100       30925 :     *est_frame_bits_fx = L_add( *est_frame_bits_fx, bits_fx );
    1101             : 
    1102       30925 :     if ( sub( npulses, nzpos ) == 0 || sub( nzpos, 1 ) == 0 )
    1103             :     {
    1104       21444 :         return bits_fx;
    1105             :     }
    1106        9481 :     magnp = sub( npulses, 1 );
    1107        9481 :     magnzp = sub( nzpos, 1 );
    1108             : 
    1109             :     /*generate the binary sequences of magnitudes */
    1110        9481 :     k = 0;
    1111       71086 :     for ( i = 0; i < size; i++ )
    1112             :     {
    1113       61605 :         if ( magn_fx[i] != 0 )
    1114             :         {
    1115       66739 :             for ( j = 0; j < abs_s( (int16_t) magn_fx[i] ) - 1; j++ )
    1116             :             {
    1117       31762 :                 magn_position[k++] = 0;
    1118             :             }
    1119       34977 :             magn_position[k++] = 1;
    1120             :         }
    1121             :     }
    1122             : 
    1123        9481 :     set16_fx( model_m, 0, MAX_PULSES + 2 );
    1124        9481 :     scp = fxp1;
    1125        9481 :     model_m[0] = MAX_AR_FREQ;
    1126        9481 :     pos = 0;
    1127       59664 :     for ( i = 0; i < npulses - 1 && magnzp > 0; i++ )
    1128             :     {
    1129       50183 :         if ( magnzp == magnp )
    1130             :         {
    1131        8898 :             cp = 0;
    1132             :         }
    1133             :         else
    1134             :         {
    1135             :             Word16 tmp;
    1136       41285 :             tmp = div_l( L_deposit_h( magnzp ), magnp );
    1137       41285 :             cp = L_sub( fxone, tmp );
    1138             :         }
    1139       50183 :         scp = Mult_32_16( scp, extract_l( cp ) );
    1140       50183 :         model_m[pos + 1] = round_fx( L_shl( scp, 6 ) );
    1141             : 
    1142       50183 :         if ( ( model_m[pos + 1] == 0 && scp > 0 ) || model_m[pos] == model_m[pos + 1] )
    1143             :         {
    1144           0 :             model_m[pos + 1] = 0;
    1145             : 
    1146           0 :             ar_encode( parenc, model_m, pos );
    1147           0 :             pos = 0;
    1148           0 :             i--;
    1149           0 :             scp = fxp1;
    1150           0 :             continue;
    1151             :         }
    1152             : 
    1153       50183 :         if ( magn_position[i] != 0 )
    1154             :         {
    1155       25496 :             ar_encode( parenc, model_m, pos );
    1156       25496 :             pos = 0;
    1157       25496 :             magnzp--;
    1158       25496 :             scp = fxp1;
    1159             :         }
    1160             :         else
    1161             :         {
    1162       24687 :             pos++;
    1163             :         }
    1164             : 
    1165       50183 :         magnp--;
    1166             :     }
    1167        9481 :     return bits_fx;
    1168             : }
    1169             : 
    1170             : 
    1171      182410 : static void transmission_bits(
    1172             :     PARCODEC arInst,
    1173             :     int16_t bit )
    1174             : {
    1175      182410 :     bitstream_save_bit( arInst->bsInst, bit );
    1176      182410 :     arInst->num_bits++;
    1177      182410 :     bit = !bit;
    1178             : 
    1179      295833 :     for ( ; arInst->bits_to_follow > 0 && arInst->num_bits < arInst->max_bits; arInst->bits_to_follow-- )
    1180             :     {
    1181      113423 :         bitstream_save_bit( arInst->bsInst, bit );
    1182      113423 :         arInst->num_bits++;
    1183             :     }
    1184             : 
    1185      182410 :     return;
    1186             : }
    1187             : 
    1188        2030 : void ar_encoder_start(
    1189             :     PARCODEC arInst,
    1190             :     TCQ_PBITSTREAM bsInst,
    1191             :     int16_t max_bits )
    1192             : {
    1193        2030 :     arInst->bsInst = bsInst;
    1194             : 
    1195        2030 :     arInst->low = 0;
    1196        2030 :     arInst->high = AR_TOP;
    1197        2030 :     arInst->bits_to_follow = 0;
    1198             : 
    1199        2030 :     arInst->num_bits = 0;
    1200        2030 :     arInst->max_bits = max_bits;
    1201             : 
    1202        2030 :     return;
    1203             : }
    1204             : 
    1205             : 
    1206      211804 : static void ar_encode(
    1207             :     PARCODEC arInst,
    1208             :     const int16_t *model,
    1209             :     int32_t symbol )
    1210             : {
    1211             :     uint32_t range, high, low;
    1212             : 
    1213      211804 :     high = arInst->high;
    1214      211804 :     low = arInst->low;
    1215             : 
    1216      211804 :     symbol++;
    1217      211804 :     range = high - low + 1;
    1218             : 
    1219      211804 :     high = low + ( range * model[symbol - 1] ) / model[0] - 1;
    1220      211804 :     low = low + ( range * model[symbol] ) / model[0];
    1221             : 
    1222             :     for ( ;; )
    1223             :     {
    1224      503577 :         if ( high < AR_HALF )
    1225             :         {
    1226       89006 :             transmission_bits( arInst, 0 );
    1227             :         }
    1228             :         else
    1229             :         {
    1230      414571 :             if ( low >= AR_HALF )
    1231             :             {
    1232       91374 :                 transmission_bits( arInst, 1 );
    1233             : 
    1234       91374 :                 low -= AR_HALF;
    1235       91374 :                 high -= AR_HALF;
    1236             :             }
    1237             :             else
    1238             :             {
    1239      323197 :                 if ( low >= AR_FIRST && high < AR_THIRD )
    1240             :                 {
    1241      111393 :                     arInst->bits_to_follow++;
    1242             : 
    1243      111393 :                     low -= AR_FIRST;
    1244      111393 :                     high -= AR_FIRST;
    1245             :                 }
    1246             :                 else
    1247             :                 {
    1248             :                     break;
    1249             :                 }
    1250             :             }
    1251             :         }
    1252             : 
    1253      291773 :         low = low << 1;
    1254      291773 :         high = ( high << 1 ) + 1;
    1255             :     }
    1256             : 
    1257      211804 :     arInst->high = high;
    1258      211804 :     arInst->low = low;
    1259             : 
    1260      211804 :     return;
    1261             : }
    1262             : 
    1263             : 
    1264       91093 : static void ar_encode_uniform(
    1265             :     PARCODEC arInst,
    1266             :     uint16_t data,
    1267             :     const int16_t bits )
    1268             : {
    1269             :     int16_t i;
    1270             : 
    1271      182186 :     for ( i = 0; i < bits; i++ )
    1272             :     {
    1273       91093 :         ar_encode( arInst, uniform_model, data & 0x1 );
    1274       91093 :         data >>= 1;
    1275             :     }
    1276             : 
    1277       91093 :     return;
    1278             : }
    1279             : 
    1280             : 
    1281        2030 : void ar_encoder_done(
    1282             :     PARCODEC arInst )
    1283             : {
    1284        2030 :     arInst->bits_to_follow++;
    1285        2030 :     transmission_bits( arInst, arInst->low >= AR_FIRST );
    1286             : 
    1287        2030 :     return;
    1288             : }
    1289             : 
    1290             : 
    1291        4466 : void ar_decoder_start(
    1292             :     PARCODEC arInst,
    1293             :     TCQ_PBITSTREAM bsInst )
    1294             : {
    1295             :     int16_t i;
    1296             : 
    1297        4466 :     arInst->bsInst = bsInst;
    1298             : 
    1299        4466 :     arInst->low = 0;
    1300        4466 :     arInst->high = AR_TOP;
    1301        4466 :     arInst->value = 0;
    1302             : 
    1303       75922 :     for ( i = 0; i < AR_BITS; i++ )
    1304             :     {
    1305       71456 :         arInst->value = ( arInst->value << 1 ) + bitstream_load_bit( arInst->bsInst );
    1306             :     }
    1307             : 
    1308        4466 :     return;
    1309             : }
    1310             : 
    1311             : 
    1312      485299 : static int32_t ar_decode(
    1313             :     PARCODEC arInst,
    1314             :     const int16_t *model )
    1315             : {
    1316             :     uint32_t range;
    1317             :     int16_t cum;
    1318             :     int16_t symbol;
    1319             : 
    1320      485299 :     range = (uint32_t) ( arInst->high - arInst->low ) + 1;
    1321      485299 :     cum = (int16_t) ( ( ( (uint32_t) ( arInst->value - arInst->low ) + 1 ) * model[0] - 1 ) / range );
    1322             : 
    1323     1086018 :     for ( symbol = 1; model[symbol] > cum; symbol++ )
    1324             :     {
    1325             :         ;
    1326             :     }
    1327             : 
    1328      485299 :     arInst->high = arInst->low + ( range * model[symbol - 1] ) / model[0] - 1;
    1329      485299 :     arInst->low = arInst->low + ( range * model[symbol] ) / model[0];
    1330             : 
    1331             :     for ( ;; )
    1332             :     {
    1333     1152700 :         if ( arInst->high >= AR_HALF )
    1334             :         {
    1335      948973 :             if ( arInst->low >= AR_HALF )
    1336             :             {
    1337      207251 :                 arInst->value -= AR_HALF;
    1338      207251 :                 arInst->low -= AR_HALF;
    1339      207251 :                 arInst->high -= AR_HALF;
    1340             :             }
    1341             :             else
    1342             :             {
    1343      741722 :                 if ( arInst->low >= AR_FIRST && arInst->high < AR_THIRD )
    1344             :                 {
    1345      256423 :                     arInst->value -= AR_FIRST;
    1346      256423 :                     arInst->low -= AR_FIRST;
    1347      256423 :                     arInst->high -= AR_FIRST;
    1348             :                 }
    1349             :                 else
    1350             :                 {
    1351             :                     break;
    1352             :                 }
    1353             :             }
    1354             :         }
    1355      667401 :         arInst->low <<= 1;
    1356      667401 :         arInst->high = ( arInst->high << 1 ) + 1;
    1357      667401 :         arInst->value = ( arInst->value << 1 ) + bitstream_load_bit( arInst->bsInst );
    1358             :     }
    1359             : 
    1360      485299 :     return ( symbol - 1 );
    1361             : }
    1362             : 
    1363        4466 : void ar_decoder_done(
    1364             :     PARCODEC arInst )
    1365             : {
    1366        4466 :     bitstream_rollback( arInst->bsInst, AR_BITS - 2 );
    1367             : 
    1368        4466 :     return;
    1369             : }
    1370             : 
    1371             : 
    1372       81076 : static int32_t ar_make_model(
    1373             :     const int16_t *freq,
    1374             :     int16_t *model,
    1375             :     const int16_t len )
    1376             : {
    1377             :     int16_t dist;
    1378       81076 :     uint32_t sum = 0;
    1379       81076 :     uint32_t cum = 0;
    1380             :     int16_t i;
    1381             : 
    1382      355605 :     for ( i = 0; i < len; i++ )
    1383             :     {
    1384      274529 :         sum += freq[i];
    1385             :     }
    1386             : 
    1387       81076 :     if ( sum == 0 )
    1388             :     {
    1389        1646 :         return 0;
    1390             :     }
    1391             : 
    1392       79430 :     for ( i = len;; i-- )
    1393             :     {
    1394      353959 :         model[i] = (int16_t) ( ( cum * MAX_AR_FREQ ) / sum );
    1395             : 
    1396      353959 :         if ( !i )
    1397             :         {
    1398       79430 :             break;
    1399             :         }
    1400             : 
    1401      274529 :         cum += freq[i - 1];
    1402             :     }
    1403             : 
    1404             : 
    1405      274529 :     for ( i = 0; i < len - 1; i++ )
    1406             :     {
    1407      195099 :         dist = model[i] - model[i + 1];
    1408             : 
    1409      195099 :         if ( dist <= 0 )
    1410             :         {
    1411           0 :             model[i + 1] += dist - 1;
    1412             :         }
    1413             :     }
    1414             : 
    1415      353959 :     for ( i = len; i; i-- )
    1416             :     {
    1417      274529 :         dist = model[i - 1] - model[i];
    1418             : 
    1419      274529 :         if ( dist <= 0 )
    1420             :         {
    1421           0 :             model[i - 1] -= dist - 1;
    1422             :         }
    1423             :     }
    1424             : 
    1425       79430 :     return ( model[0] > model[1] );
    1426             : }
    1427             : 
    1428      295833 : static void bitstream_save_bit(
    1429             :     TCQ_PBITSTREAM pBS,
    1430             :     const int16_t bit )
    1431             : {
    1432             :     uint8_t cur;
    1433             : 
    1434      295833 :     cur = pBS->buf[pBS->numByte];
    1435             : 
    1436      295833 :     cur = (uint8_t) ( cur | ( bit << pBS->curPos-- ) );
    1437      295833 :     pBS->buf[pBS->numByte] = cur;
    1438      295833 :     pBS->numbits++;
    1439             : 
    1440      295833 :     if ( pBS->curPos < 0 )
    1441             :     {
    1442       36103 :         pBS->curPos = 7;
    1443       36103 :         pBS->numByte++;
    1444             :     }
    1445             : 
    1446      295833 :     return;
    1447             : }
    1448             : 
    1449             : 
    1450      738857 : static uint32_t bitstream_load_bit(
    1451             :     TCQ_PBITSTREAM pBS )
    1452             : {
    1453             :     uint32_t bit;
    1454             :     signed char *curPos;
    1455             : 
    1456             :     /* safety check in case of bit errors */
    1457      738857 :     if ( pBS->numByte >= pBS->maxBytes )
    1458             :     {
    1459           0 :         return 0;
    1460             :     }
    1461             : 
    1462      738857 :     curPos = &pBS->curPos;
    1463      738857 :     bit = ( ( pBS->buf[pBS->numByte] >> ( *curPos )-- ) & 0x00000001 );
    1464             : 
    1465      738857 :     if ( *curPos < 0 )
    1466             :     {
    1467       90431 :         pBS->numByte++;
    1468       90431 :         *curPos = 7;
    1469             :     }
    1470             : 
    1471      738857 :     return bit;
    1472             : }
    1473             : 
    1474             : 
    1475        4466 : static void bitstream_rollback(
    1476             :     TCQ_PBITSTREAM pBS,
    1477             :     int16_t numBits )
    1478             : {
    1479       66990 :     while ( numBits > 0 )
    1480             :     {
    1481       62524 :         pBS->curPos++;
    1482       62524 :         pBS->numbits--;
    1483       62524 :         if ( pBS->curPos == 8 )
    1484             :         {
    1485        7798 :             pBS->curPos = 0;
    1486        7798 :             pBS->numByte--;
    1487             :         }
    1488       62524 :         numBits--;
    1489             :     }
    1490             : 
    1491        4466 :     return;
    1492             : }
    1493             : 
    1494             : 
    1495       10884 : static float quantize(
    1496             :     float val,
    1497             :     const int16_t D )
    1498             : {
    1499             :     int32_t qval4;
    1500             :     float retval; /* = qval4*4.0f + DD[D]; */
    1501             : 
    1502       10884 :     qval4 = (int32_t) fabs( ( val + 0.5 ) / 4.0 );
    1503       10884 :     retval = qval4 * 4.0f + DDP[D];
    1504             : 
    1505             :     /* 2nd zero check */
    1506       10884 :     if ( D == 0 )
    1507             :     {
    1508        2939 :         if ( fabs( fabs( retval ) - fabs( val ) ) > fabs( val ) )
    1509             :         {
    1510        2639 :             retval = 0;
    1511             :         }
    1512             :     }
    1513             : 
    1514       10884 :     return retval;
    1515             : }
    1516             : 
    1517             : 
    1518          40 : static void TCQnew(
    1519             :     float *v,
    1520             :     float scale,
    1521             :     int16_t length,
    1522             :     float *vout,
    1523             :     int32_t pulses,
    1524             :     int32_t *pulsesout,
    1525             :     int32_t *nzposout,
    1526             :     int32_t *savedstates,
    1527             :     int32_t *lasttrellislevel,
    1528             :     int32_t terminate )
    1529             : {
    1530          40 :     int16_t i, st, dminpos, position, pulsesnum, nzpos = 0;
    1531             :     float dmin, quantum1, quantum2, curdist1, curdist2, newdist1, newdist2, signq;
    1532             : 
    1533             :     float metric[STATES][TCQ_MAX_BAND_SIZE];
    1534             :     int16_t path[STATES][TCQ_MAX_BAND_SIZE];
    1535             :     int16_t quant[STATES][TCQ_MAX_BAND_SIZE];
    1536             :     int16_t pused[STATES][TCQ_MAX_BAND_SIZE];
    1537             : 
    1538          40 :     set_f( *metric, 0.0f, STATES * TCQ_MAX_BAND_SIZE );
    1539          40 :     set_s( *path, 0, STATES * TCQ_MAX_BAND_SIZE );
    1540          40 :     set_s( *quant, 0, STATES * TCQ_MAX_BAND_SIZE );
    1541          40 :     set_s( *pused, 0, STATES * TCQ_MAX_BAND_SIZE );
    1542             : 
    1543             :     /* Initialize metric */
    1544         320 :     for ( st = 1; st < STATES; st++ )
    1545             :     {
    1546         280 :         metric[st][0] = 1000;
    1547             :     }
    1548         280 :     for ( st = 2; st < STATES; st++ )
    1549             :     {
    1550         240 :         metric[st][1] = 1000;
    1551             :     }
    1552         200 :     for ( st = 4; st < STATES; st++ )
    1553             :     {
    1554         160 :         metric[st][2] = 1000;
    1555             :     }
    1556             : 
    1557             :     /* Viterbi for input sequence */
    1558         482 :     for ( i = 0; i < length; i++ ) /* cycle over symbols */
    1559             :     {
    1560        3978 :         for ( st = 0; st < STATES; st++ ) /* cycle over conditions */
    1561             :         {
    1562        3536 :             curdist1 = metric[step_tcq[st][0]][i];
    1563        3536 :             curdist2 = metric[step_tcq[st][1]][i];
    1564             : 
    1565             :             /* step 1 */
    1566        3536 :             quantum1 = quantize( v[i] * scale, denc[st][0] );
    1567        3536 :             newdist1 = (float) ( quantum1 - fabs( v[i] ) * scale );
    1568        3536 :             newdist1 *= newdist1;
    1569             : 
    1570        3536 :             if ( quantum1 + pused[step_tcq[st][0]][i] > pulses && terminate )
    1571             :             {
    1572         459 :                 newdist1 = 10000.0f; /* pulses check */
    1573             :             }
    1574             : 
    1575             :             /* step 2 */
    1576        3536 :             quantum2 = quantize( v[i] * scale, denc[st][1] );
    1577        3536 :             newdist2 = (float) ( quantum2 - fabs( v[i] ) * scale );
    1578        3536 :             newdist2 *= newdist2;
    1579             : 
    1580        3536 :             if ( quantum2 + pused[step_tcq[st][1]][i] > pulses && terminate )
    1581             :             {
    1582         494 :                 newdist2 = 10000.0f; /* pulses check */
    1583             :             }
    1584             : 
    1585             :             /* decision */
    1586        3536 :             if ( curdist1 + newdist1 < curdist2 + newdist2 )
    1587             :             {
    1588        2261 :                 path[st][i + 1] = step_tcq[st][0];
    1589        2261 :                 metric[st][i + 1] = curdist1 + newdist1;
    1590        2261 :                 quant[st][i + 1] = (int16_t) quantize( v[i] * scale, denc[st][0] );
    1591        2261 :                 pused[st][i + 1] = (int16_t) ( pused[step_tcq[st][0]][i] + abs( quant[st][i + 1] ) );
    1592             :             }
    1593             :             else
    1594             :             {
    1595        1275 :                 path[st][i + 1] = step_tcq[st][1];
    1596        1275 :                 metric[st][i + 1] = curdist2 + newdist2;
    1597        1275 :                 quant[st][i + 1] = (int16_t) quantize( v[i] * scale, denc[st][1] );
    1598        1275 :                 pused[st][i + 1] = (int16_t) ( pused[step_tcq[st][1]][i] + abs( quant[st][i + 1] ) );
    1599             :             }
    1600             :         }
    1601             :     }
    1602             : 
    1603             :     /* Find path with minimal metric */
    1604          40 :     dminpos = 0;
    1605          40 :     dmin = metric[dminpos][length];
    1606         320 :     for ( i = 1; i < STATES; i++ )
    1607             :     {
    1608         280 :         if ( ( dmin > metric[i][length] && pused[i][length] == pulses ) ||
    1609         245 :              ( pused[dminpos][length] != pulses && pused[i][length] == pulses ) )
    1610             :         {
    1611          44 :             dmin = metric[i][length];
    1612          44 :             dminpos = i;
    1613             :         }
    1614             :     }
    1615             : 
    1616             :     /* Trace back to get output */
    1617          40 :     pulsesnum = 0;
    1618          40 :     position = dminpos;
    1619             : 
    1620         482 :     for ( i = length; i > 0; i-- )
    1621             :     {
    1622         442 :         signq = ( v[i - 1] > 0.0f ) ? ( 1.0f ) : ( -1.0f );
    1623         442 :         vout[i - 1] = signq * quant[position][i];
    1624             : 
    1625         442 :         position = path[position][i];
    1626         442 :         savedstates[i - 1] = position;
    1627             : 
    1628             :         /* calculate output pulses number & nz */
    1629         442 :         pulsesnum += (int16_t) fabs( vout[i - 1] ); /*quant[position][i]; */
    1630         442 :         if ( fabs( vout[i - 1] ) > 0.0f )
    1631             :         {
    1632         135 :             if ( nzpos == 0 )
    1633             :             {
    1634          40 :                 *lasttrellislevel = i;
    1635             :             }
    1636             : 
    1637         135 :             nzpos++;
    1638             :         }
    1639             :     }
    1640             : 
    1641          40 :     if ( pulsesout != NULL )
    1642             :     {
    1643          40 :         *pulsesout = pulsesnum;
    1644             :     }
    1645          40 :     if ( nzposout != NULL )
    1646             :     {
    1647          40 :         *nzposout = nzpos;
    1648             :     }
    1649             : 
    1650          40 :     return;
    1651             : }
    1652             : 
    1653             : 
    1654       32232 : float GetISCScale(
    1655             :     float *quants,
    1656             :     int16_t size,
    1657             :     Word32 bits_fx,
    1658             :     float *magn,
    1659             :     float *qscale,
    1660             :     Word32 *surplus_fx,
    1661             :     float *pulses,
    1662             :     int32_t *savedstates,
    1663             :     int16_t noTCQ,
    1664             :     int32_t *nzpout,
    1665             :     int16_t *bcount,
    1666             :     float *abuffer,
    1667             :     float *mbuffer,
    1668             :     float *sbuffer )
    1669             : {
    1670       32232 :     float scale, m, t, actualt, magnbits = 0.0f;
    1671             :     int32_t pulsesnum, pos, terminate, leftp, leftnz, trellislevel, st;
    1672             :     int32_t i, j, nzpos, direction, pulsescurr, nzposcurr, lasttrellislevel;
    1673             :     float dist[TCQ_MAX_BAND_SIZE];
    1674             :     float aquants[TCQ_MAX_BAND_SIZE];
    1675             :     float dmin, prob0, prob1, quantum1, quantum2;
    1676       32232 :     float sx2 = 0, sy2 = 0, sxy = 0, g;
    1677       32232 :     int32_t pn = 0;
    1678       32232 :     float pt = 0.f;
    1679             :     int32_t diff;
    1680             :     int16_t sign;
    1681             :     int32_t m_int;
    1682             :     int8_t flag_g1;
    1683             : 
    1684       32232 :     set_f( dist, 0.0f, TCQ_MAX_BAND_SIZE );
    1685       32232 :     set_f( aquants, 0.0f, TCQ_MAX_BAND_SIZE );
    1686             : 
    1687       32232 :     if ( bits_fx < 0 )
    1688             :     {
    1689           0 :         pulsesnum = 0;
    1690             : 
    1691           0 :         if ( surplus_fx != NULL )
    1692             :         {
    1693           0 :             *surplus_fx = L_add( *surplus_fx, bits_fx );
    1694             :         }
    1695             :     }
    1696             :     else
    1697             :     {
    1698       32232 :         pulsesnum = GetScale_fx( size, bits_fx, surplus_fx );
    1699             :     }
    1700       32232 :     *nzpout = 0;
    1701             : 
    1702       32232 :     if ( pulses != NULL )
    1703             :     {
    1704       32232 :         *pulses = (float) pulsesnum;
    1705             :     }
    1706             : 
    1707       32232 :     if ( pulsesnum > 0 )
    1708             :     {
    1709             :         /* Initial quantization */
    1710      397079 :         for ( i = 0, m = 0; i < size; i++ )
    1711             :         {
    1712      366493 :             aquants[i] = (float) fabs( quants[i] );
    1713      366493 :             m += aquants[i];
    1714             :         }
    1715             : 
    1716       30586 :         scale = ( pulsesnum + EPSILON ) / ( m + EPSILON );
    1717             : 
    1718      397079 :         for ( i = 0, t = 0.0f; i < size; i++ )
    1719             :         {
    1720      366493 :             magn[i] = (float) ( (int16_t) ( 0.5f + aquants[i] * scale ) );
    1721             : 
    1722      366493 :             t += magn[i];
    1723             :         }
    1724             : 
    1725             :         /* Pulses redistribution */
    1726       58898 :         while ( t != pulsesnum )
    1727             :         {
    1728       28312 :             pn = 0;
    1729       28312 :             pt = 0.f;
    1730             : 
    1731             : 
    1732      433351 :             for ( i = 0, nzpos = 0; i < size; i++ )
    1733             :             {
    1734      405039 :                 if ( magn[i] > 0.0f )
    1735             :                 {
    1736       32912 :                     pn += (int32_t) magn[i];
    1737       32912 :                     pt += aquants[i];
    1738             :                 }
    1739             :             }
    1740             : 
    1741       28312 :             direction = ( pulsesnum - t > 0 ) ? ( 1 ) : ( -1 );
    1742             : 
    1743             :             /* new alg */
    1744             :             {
    1745      433351 :                 for ( i = 0; i < size; i++ )
    1746             :                 {
    1747      405039 :                     sxy += aquants[i] * magn[i];
    1748      405039 :                     sx2 += aquants[i] * aquants[i];
    1749      405039 :                     sy2 += magn[i] * magn[i];
    1750             :                 }
    1751      433351 :                 for ( i = 0; i < size; i++ )
    1752             :                 {
    1753      405039 :                     if ( magn[i] > 0.0f )
    1754             :                     {
    1755       32912 :                         g = ( pt ) / ( pn + direction + EPSILON );
    1756             :                     }
    1757             :                     else
    1758             :                     {
    1759      372127 :                         g = ( pt + aquants[i] ) / ( pn + direction + EPSILON );
    1760             :                     }
    1761             : 
    1762      405039 :                     dist[i] = sx2 - 2.0f * ( sxy + direction * aquants[i] ) * g + g * g * ( sy2 + 2.0f * magn[i] * direction + 1.0f );
    1763             :                 }
    1764             :             }
    1765             : 
    1766             :             {
    1767       28312 :                 pos = 0;
    1768       28312 :                 dmin = dist[0];
    1769             : 
    1770             :                 /* find min */
    1771      405039 :                 for ( i = 1; i < size; i++ )
    1772             :                 {
    1773      376727 :                     if ( dmin > dist[i] )
    1774             :                     {
    1775       59119 :                         pos = i;
    1776       59119 :                         dmin = dist[i];
    1777             :                     }
    1778             :                 }
    1779             : 
    1780       28312 :                 magn[pos] += direction;
    1781       28312 :                 t += direction;
    1782             :             }
    1783             :         }
    1784             : 
    1785             :         /* calculate actual nz positions */
    1786       30586 :         actualt = 0.0f;
    1787      397079 :         for ( i = 0, nzpos = 0; i < size; i++ )
    1788             :         {
    1789      366493 :             if ( magn[i] > 0.0f )
    1790             :             {
    1791       73705 :                 if ( quants[i] < 0 )
    1792             :                 {
    1793       37099 :                     magn[i] *= -1;
    1794             :                 }
    1795             : 
    1796       73705 :                 actualt += aquants[i];
    1797       73705 :                 nzpos++;
    1798             :             }
    1799             :         }
    1800             : 
    1801             :         /* calculate scale */
    1802       30586 :         if ( actualt > 0 )
    1803             :         {
    1804       30586 :             scale = pulsesnum / actualt;
    1805             :         }
    1806             :         else
    1807             :         {
    1808           0 :             scale = FLT_MAX;
    1809             :         }
    1810       30586 :         *qscale = scale;
    1811       30586 :         *nzpout = nzpos;
    1812             : 
    1813       30586 :         if ( ( nzpos != pulsesnum && nzpos > 1 ) && noTCQ == 0 )
    1814             :         {
    1815          40 :             terminate = 1;
    1816          40 :             TCQnew( quants, scale, size, magn, pulsesnum, &pulsescurr, &nzposcurr, savedstates, &lasttrellislevel, terminate );
    1817             : 
    1818          40 :             if ( pulsesnum > pulsescurr )
    1819             :             {
    1820           2 :                 scale *= 1.1f;
    1821             :             }
    1822             : 
    1823          40 :             if ( pulsesnum < pulsescurr )
    1824             :             {
    1825           0 :                 scale *= 0.9f;
    1826             :             }
    1827          40 :             if ( pulsesnum > pulsescurr )
    1828             :             {
    1829           2 :                 diff = pulsesnum - pulsescurr;
    1830             : 
    1831           3 :                 for ( i = size - 1; i >= 0; i-- )
    1832             :                 {
    1833           3 :                     if ( fabs( magn[i] ) > 0 )
    1834             :                     {
    1835           2 :                         sign = ( magn[i] > 0 ) ? ( 1 ) : ( -1 );
    1836           2 :                         magn[i] = (float) ( sign * ( fabs( magn[i] ) + diff ) );
    1837             : 
    1838           2 :                         break;
    1839             :                     }
    1840             :                 }
    1841             :             }
    1842          38 :             else if ( pulsesnum < pulsescurr )
    1843             :             {
    1844           0 :                 diff = pulsescurr - pulsesnum;
    1845             : 
    1846           0 :                 for ( i = size - 1; i >= 0 && diff > 0; i-- )
    1847             :                 {
    1848           0 :                     if ( fabs( magn[i] ) > 0 )
    1849             :                     {
    1850           0 :                         sign = ( magn[i] > 0 ) ? ( 1 ) : ( -1 );
    1851           0 :                         m_int = (int32_t) fabs( magn[i] );
    1852             : 
    1853           0 :                         if ( diff < m_int )
    1854             :                         {
    1855           0 :                             magn[i] = (float) ( sign * ( fabs( magn[i] ) - diff ) );
    1856           0 :                             break;
    1857             :                         }
    1858             :                         else
    1859             :                         {
    1860           0 :                             diff = diff - m_int;
    1861           0 :                             magn[i] = 0;
    1862           0 :                             nzposcurr--;
    1863             :                         }
    1864             :                     }
    1865             :                 }
    1866             :             }
    1867             : 
    1868          40 :             pulsescurr = pulsesnum;
    1869             : 
    1870             :             /* Magnitudes coding */
    1871             :             {
    1872          40 :                 leftp = pulsescurr; /*pulsesnum; */
    1873          40 :                 leftnz = nzposcurr; /*nzpos; */
    1874          40 :                 trellislevel = 0;
    1875             : 
    1876         310 :                 for ( i = 0; i < size && leftnz > 1; i++ )
    1877             :                 {
    1878         270 :                     if ( magn[i] != 0.0f )
    1879             :                     {
    1880         138 :                         for ( j = 0; j < leftp; j++ )
    1881             :                         {
    1882         138 :                             prob1 = ( leftnz - 1.0f ) / ( leftp - j - 1.0f );
    1883         138 :                             prob0 = 1.0f - prob1;
    1884             : 
    1885         138 :                             st = savedstates[trellislevel];
    1886         138 :                             quantum1 = (float) quantize( (float) ( j + 1 ), ddec[st][0] );
    1887         138 :                             quantum2 = (float) quantize( (float) ( j + 1 ), ddec[st][1] );
    1888             : 
    1889         138 :                             if ( quantum1 != ( j + 1 ) && quantum2 != ( j + 1 ) )
    1890             :                             {
    1891             :                                 /* this magnitude is not possible so set probabilities */
    1892          33 :                                 prob0 = 1.0f;
    1893          33 :                                 prob1 = 0.0f;
    1894             :                             }
    1895             : 
    1896         138 :                             if ( j < fabs( magn[i] ) - 1 )
    1897             :                             {
    1898          43 :                                 magnbits -= log2_f( prob0 );
    1899             :                             }
    1900             :                             else
    1901             :                             {
    1902          95 :                                 magnbits -= log2_f( prob1 );
    1903          95 :                                 break;
    1904             :                             }
    1905             :                         }
    1906             : 
    1907          95 :                         leftnz--;
    1908          95 :                         leftp -= (int32_t) fabs( magn[i] );
    1909             :                     }
    1910             : 
    1911         270 :                     trellislevel++;
    1912             :                 }
    1913             : 
    1914             :                 /* Update actual occured surplus */
    1915          40 :                 *nzpout = nzposcurr;
    1916             :             }
    1917             :         }
    1918             : 
    1919       30586 :         if ( *nzpout > 1 && bcount != NULL )
    1920             :         {
    1921       18413 :             flag_g1 = 0;
    1922             : 
    1923      187772 :             for ( i = 0; i < size; i++ )
    1924             :             {
    1925      169359 :                 if ( fabs( magn[i] ) > 1.0f )
    1926             :                 {
    1927       14016 :                     flag_g1 = 1;
    1928             :                 }
    1929             :             }
    1930             :             /* prepare vector for TCQ */
    1931       68354 :             for ( i = 0; i < size && flag_g1 && *bcount < 2 * TCQ_AMP; i++ )
    1932             :             {
    1933       49941 :                 if ( fabs( magn[i] ) > 0.0f )
    1934             :                 {
    1935       27419 :                     abuffer[*bcount] = quants[i];
    1936       27419 :                     mbuffer[*bcount] = magn[i];
    1937       27419 :                     sbuffer[*bcount] = scale;
    1938             : 
    1939       27419 :                     ( *bcount )++;
    1940             :                 }
    1941             :             }
    1942             :         }
    1943             : 
    1944       30586 :         if ( actualt > 0 )
    1945             :         {
    1946       30586 :             *qscale = pulsesnum / actualt;
    1947             :         }
    1948             :         else
    1949             :         {
    1950           0 :             *qscale = FLT_MAX;
    1951             :         }
    1952             :     }
    1953             : 
    1954       32232 :     return magnbits;
    1955             : }
    1956             : 
    1957             : 
    1958        4060 : void InitLSBTCQ(
    1959             :     int16_t *bcount )
    1960             : {
    1961        4060 :     *bcount = 0;
    1962             : 
    1963        4060 :     return;
    1964             : }
    1965             : 
    1966             : 
    1967        2030 : void TCQLSB(
    1968             :     int16_t bcount,
    1969             :     float *abuffer,
    1970             :     float *mbuffer,
    1971             :     float *sbuffer,
    1972             :     int16_t *dpath )
    1973             : {
    1974             :     int16_t i, st, dminpos, position;
    1975        2030 :     float q = QTCQ;
    1976             :     float dmin, curdist1, curdist2, newdist1, newdist2;
    1977             :     float metric[STATES_LSB][TCQ_LSB_SIZE];
    1978             :     int16_t path[STATES_LSB][TCQ_LSB_SIZE];
    1979             :     int16_t quant[STATES_LSB][TCQ_LSB_SIZE];
    1980             :     int16_t dquant[STATES_LSB][TCQ_LSB_SIZE];
    1981             :     int16_t qout[TCQ_LSB_SIZE];
    1982             :     float q1, q2, s1, s2, a1, a2, sign1, sign2;
    1983             :     float dbuffer[MAX_PULSES];
    1984             : 
    1985        2030 :     set_f( *metric, 0.0f, STATES_LSB * TCQ_LSB_SIZE );
    1986        2030 :     set_s( *path, 0, STATES_LSB * TCQ_LSB_SIZE );
    1987        2030 :     set_s( *quant, 0, STATES_LSB * TCQ_LSB_SIZE );
    1988        2030 :     set_s( *dquant, 0, STATES_LSB * TCQ_LSB_SIZE );
    1989        2030 :     set_s( qout, 0, TCQ_LSB_SIZE );
    1990        2030 :     set_f( dbuffer, 0.0f, MAX_PULSES );
    1991             : 
    1992        2030 :     metric[1][0] = 16777216.0f;
    1993        2030 :     metric[2][0] = 16777216.0f;
    1994        2030 :     metric[3][0] = 16777216.0f;
    1995             : 
    1996       22330 :     for ( i = 0; i < 2 * TCQ_AMP; i += 2 )
    1997             :     {
    1998       20300 :         q1 = mbuffer[i];
    1999       20300 :         q2 = mbuffer[i + 1];
    2000             : 
    2001       20300 :         s1 = sbuffer[i];
    2002       20300 :         s2 = sbuffer[i + 1];
    2003             : 
    2004       20300 :         a1 = abuffer[i];
    2005       20300 :         a2 = abuffer[i + 1];
    2006             : 
    2007             :         /* cycle over conditions */
    2008      101500 :         for ( st = 0; st < 4; st++ )
    2009             :         {
    2010       81200 :             curdist1 = metric[step_LSB[st][0]][i / 2];
    2011       81200 :             curdist2 = metric[step_LSB[st][1]][i / 2];
    2012             : 
    2013             :             /* step 1 */
    2014       81200 :             sign1 = ( denc_LSB[st][0] & 0x1 ) ? ( q ) : ( -q );
    2015       81200 :             sign2 = ( denc_LSB[st][0] & 0x2 ) ? ( q ) : ( -q );
    2016       81200 :             newdist1 = ( a1 - ( q1 + sign1 ) / s1 ) * ( a1 - ( q1 + sign1 ) / s1 ) + ( a2 - ( q2 + sign2 ) / s2 ) * ( a2 - ( q2 + sign2 ) / s2 );
    2017             : 
    2018             :             /* step 2 */
    2019       81200 :             sign1 = ( denc_LSB[st][1] & 0x1 ) ? ( q ) : ( -q );
    2020       81200 :             sign2 = ( denc_LSB[st][1] & 0x2 ) ? ( q ) : ( -q );
    2021       81200 :             newdist2 = ( a1 - ( q1 + sign1 ) / s1 ) * ( a1 - ( q1 + sign1 ) / s1 ) + ( a2 - ( q2 + sign2 ) / s2 ) * ( a2 - ( q2 + sign2 ) / s2 );
    2022             : 
    2023             :             /* decision */
    2024       81200 :             if ( curdist1 + newdist1 < curdist2 + newdist2 )
    2025             :             {
    2026       37628 :                 path[st][i / 2 + 1] = step_LSB[st][0];
    2027       37628 :                 metric[st][i / 2 + 1] = curdist1 + newdist1;
    2028       37628 :                 quant[st][i / 2 + 1] = 0;
    2029       37628 :                 dquant[st][i / 2 + 1] = dqnt_LSB[step_LSB[st][0]][st];
    2030             :             }
    2031             :             else
    2032             :             {
    2033       43572 :                 path[st][i / 2 + 1] = step_LSB[st][1];
    2034       43572 :                 metric[st][i / 2 + 1] = curdist2 + newdist2;
    2035       43572 :                 quant[st][i / 2 + 1] = 1;
    2036       43572 :                 dquant[st][i / 2 + 1] = dqnt_LSB[step_LSB[st][0]][st];
    2037             :             }
    2038             :         }
    2039             :     }
    2040             : 
    2041             :     /* Find path with minimal metric */
    2042        2030 :     dminpos = 0;
    2043        2030 :     dmin = metric[dminpos][i / 2];
    2044        8120 :     for ( st = 1; st < 4; st++ )
    2045             :     {
    2046        6090 :         if ( dmin > metric[st][i / 2] )
    2047             :         {
    2048         942 :             dmin = metric[st][i / 2];
    2049         942 :             dminpos = st;
    2050             :         }
    2051             :     }
    2052             : 
    2053             :     /* Trace back to get output */
    2054        2030 :     position = dminpos;
    2055             : 
    2056       24360 :     for ( ; i >= 0; i -= 2 )
    2057             :     {
    2058       22330 :         qout[i / 2] = quant[position][i / 2 + 1];
    2059       22330 :         dpath[i / 2] = dquant[position][i / 2 + 1];
    2060             : 
    2061       22330 :         dbuffer[i] = ( denc_LSB[position][qout[i / 2]] & 0x1 ) ? ( q ) : ( -q );
    2062       22330 :         dbuffer[i + 1] = ( denc_LSB[position][qout[i / 2]] & 0x2 ) ? ( q ) : ( -q );
    2063             : 
    2064       22330 :         position = path[position][i / 2 + 1];
    2065             :     }
    2066             : 
    2067             :     /* add decoded sequence to quanta */
    2068       29449 :     for ( i = 0; i < bcount; i++ )
    2069             :     {
    2070       27419 :         mbuffer[i] += dbuffer[i];
    2071             :     }
    2072             : 
    2073        2030 :     return;
    2074             : }
    2075             : 
    2076        4466 : void TCQLSBdec(
    2077             :     int16_t *dpath,
    2078             :     float *mbuffer,
    2079             :     int16_t bcount )
    2080             : {
    2081        4466 :     float q = QTCQ;
    2082        4466 :     int16_t i, state = 0;
    2083             : 
    2084       45956 :     for ( i = 0; i < bcount / 2; i++ )
    2085             :     {
    2086       41490 :         mbuffer[2 * i] = ( ddec_LSB[state][dpath[i]] & 0x1 ) ? ( q ) : ( -q );
    2087       41490 :         mbuffer[2 * i + 1] = ( ddec_LSB[state][dpath[i]] & 0x2 ) ? ( q ) : ( -q );
    2088             : 
    2089       41490 :         state = dstep_LSB[state][dpath[i]];
    2090             :     }
    2091             : 
    2092        4466 :     return;
    2093             : }
    2094             : 
    2095        2030 : void SaveTCQdata(
    2096             :     PARCODEC arInst,
    2097             :     int16_t *dpath,
    2098             :     int16_t bcount )
    2099             : {
    2100             :     int16_t i;
    2101             : 
    2102       19420 :     for ( i = 0; i < bcount; i++ )
    2103             :     {
    2104       17390 :         ar_encode_uniform( arInst, dpath[i], 1 );
    2105             :     }
    2106             : 
    2107        2030 :     return;
    2108             : }
    2109             : 
    2110        4466 : void LoadTCQdata(
    2111             :     PARCODEC arInst,
    2112             :     int16_t *dpath,
    2113             :     int16_t bcount )
    2114             : {
    2115             :     int16_t i;
    2116             : 
    2117       45956 :     for ( i = 0; i < bcount; i++ )
    2118             :     {
    2119       41490 :         dpath[i] = (int16_t) ar_decode( arInst, uniform_model );
    2120             :     }
    2121             : 
    2122        4466 :     return;
    2123             : }
    2124             : 
    2125       72932 : void RestoreTCQdec(
    2126             :     int32_t *magn,
    2127             :     int16_t size,
    2128             :     int16_t *bcount,
    2129             :     float *mbuffer )
    2130             : {
    2131       72932 :     int16_t i, nzpos = 0, flag_g1 = 0;
    2132             : 
    2133             :     /* calculate actual nz positions */
    2134      975500 :     for ( i = 0, nzpos = 0; i < size; i++ )
    2135             :     {
    2136      902568 :         if ( magn[i] != 0 )
    2137             :         {
    2138      171214 :             nzpos++;
    2139      171214 :             if ( abs( magn[i] ) > 1 )
    2140             :             {
    2141       39750 :                 flag_g1 = 1;
    2142             :             }
    2143      171214 :             magn[i] *= (int32_t) ( 1.0f / QTCQ );
    2144             :         }
    2145             :     }
    2146             : 
    2147       72932 :     if ( nzpos > 1 )
    2148             :     {
    2149      175477 :         for ( i = 0; i < size && flag_g1 && *bcount < 2 * TCQ_AMP; i++ )
    2150             :         {
    2151      128272 :             if ( magn[i] != 0 )
    2152             :             {
    2153       73355 :                 mbuffer[*bcount] = magn[i] + ( 1.0f / QTCQ ) * mbuffer[*bcount];
    2154       73355 :                 magn[i] = round_f( mbuffer[*bcount] );
    2155       73355 :                 ( *bcount )++;
    2156             :             }
    2157             :         }
    2158             :     }
    2159             : 
    2160       72932 :     return;
    2161             : }
    2162             : 
    2163             : 
    2164       28831 : void RestoreTCQ(
    2165             :     float *magn,
    2166             :     int16_t size,
    2167             :     int16_t *bcount,
    2168             :     float *mbuffer )
    2169             : {
    2170       28831 :     int16_t i, nzpos = 0, flag_g1 = 0;
    2171             : 
    2172             :     /* calculate actual nz positions */
    2173      391987 :     for ( i = 0, nzpos = 0; i < size; i++ )
    2174             :     {
    2175      363156 :         if ( magn[i] != 0.0f )
    2176             :         {
    2177       65979 :             nzpos++;
    2178       65979 :             if ( fabs( magn[i] ) > 1.0f )
    2179             :             {
    2180       14744 :                 flag_g1 = 1;
    2181             :             }
    2182             :         }
    2183             :     }
    2184             : 
    2185       28831 :     if ( nzpos > 1 )
    2186             :     {
    2187       68354 :         for ( i = 0; i < size && flag_g1 && *bcount < 2 * TCQ_AMP; i++ )
    2188             :         {
    2189       49941 :             if ( fabs( magn[i] ) > 0.0f )
    2190             :             {
    2191       27419 :                 magn[i] = mbuffer[*bcount];
    2192       27419 :                 ( *bcount )++;
    2193             :             }
    2194             :         }
    2195             :     }
    2196             : 
    2197       28831 :     return;
    2198             : }

Generated by: LCOV version 1.14