LCOV - code coverage report
Current view: top level - lib_enc - ACcontextMapping_enc_fx.c (source / functions) Hit Total Coverage
Test: Coverage on main enc/dec/rend @ 574a190e3c6896c6c4ed10d7f23649709a0c4347 Lines: 780 828 94.2 %
Date: 2025-06-27 02:59:36 Functions: 8 8 100.0 %

          Line data    Source code
       1             : /*====================================================================================
       2             :     EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0
       3             :   ====================================================================================*/
       4             : 
       5             : #include <stdint.h>
       6             : #include <assert.h>
       7             : #include "options.h"
       8             : #include "basop_util.h"
       9             : #include "cnst.h"
      10             : #include "prot_fx.h"
      11             : #include "ivas_prot_fx.h"
      12             : #include "rom_com.h"
      13             : #include "ivas_rom_com.h"
      14             : #include "ivas_rom_enc.h"
      15             : #include "prot_fx_enc.h"
      16             : 
      17             : #define MAKE_NUMBER_QX( number, QX )     ( ( number ) << ( QX ) )                                      /* evaulated at compile time */
      18             : #define MAKE_VARIABLE_QX( variable, QX ) W_shl( W_deposit32_l( L_deposit_l( ( variable ) ) ), ( QX ) ) /* evaluated at run time */
      19             : 
      20             : /*-------------------------------------------------------------------*
      21             :  * ACcontextMapping_encode2_no_mem_s17_LC_fx()
      22             :  *
      23             :  * Arithmetic encoder
      24             :  *-------------------------------------------------------------------*/
      25             : /**
      26             :  * \brief Arithmetic encoder
      27             :  * \param[i] x
      28             :  * \param[o] ntuples amount of encoded tuple (2 lines per tuple)
      29             :  * \param[i] nt
      30             :  * \param[i] nbbits
      31             :  * \param[i] resQMaxBits
      32             :  * \return none
      33             :  */
      34         637 : void ACcontextMapping_encode2_no_mem_s17_LC_fx(
      35             :     BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle            */
      36             :     Word16 *x,             /* Q0 */
      37             :     Word16 nt,             /* Q0 */
      38             :     Word16 lastnz,         /* Q0 */
      39             :     Word16 nbbits,         /* Q0 */
      40             :     Word16 resQMaxBits,    /* Q0 */
      41             :     CONTEXT_HM_CONFIG *hm_cfg )
      42             : {
      43             :     Word16 ptr[BITBUFSIZE];
      44             :     TastatEnc as, as_overflow;
      45             :     Word16 bp, bp_overflow;
      46             :     Word16 a1, b1, a1_i, b1_i, k;
      47             :     Word16 t, pki, lev1;
      48             :     Word16 rateFlag;
      49             :     Word16 value;
      50             :     Word16 nbbits_ntuples, nbbits_lsbs, nbbits_signs, nbbits_signs_overflow, nbbits_lsbs_overflow, flag_overflow;
      51             :     Word16 *lsbs_bits2;
      52             :     Word16 tmp;
      53             :     Word16 nt_half;
      54             :     Word16 c[2], *ctx;
      55             :     Word16 p1, p2;
      56             :     Word16 ii[2], idx1, idx2, idx;
      57             :     Word16 numPeakIndicesOrig, numHoleIndices;
      58             :     get_next_coeff_function get_next_coeff;
      59             :     Word16 signs[N_MAX];
      60             :     Word16 nbbits_m2;
      61             : 
      62         637 :     a1 = 0; /* to avoid compilation warnings */
      63         637 :     b1 = 0; /* to avoid compilation warnings */
      64         637 :     move16();
      65         637 :     move16();
      66             : 
      67             :     /* Rate flag */
      68         637 :     rateFlag = 0;
      69         637 :     move16();
      70         637 :     if ( GT_16( nbbits, 400 ) )
      71             :     {
      72          42 :         rateFlag = 2 << NBITS_CONTEXT;
      73          42 :         move16();
      74             :     }
      75             : 
      76             :     /* Init */
      77         637 :     nt_half = shr( nt, 1 );
      78         637 :     c[0] = c[1] = 0;
      79         637 :     move16();
      80         637 :     move16();
      81             : 
      82             :     /* Bits for encoding the number of encoded tuples */
      83         637 :     nbbits_ntuples = sub( 14, norm_s( negate( nt ) ) ); /* Q0 */
      84             : 
      85         637 :     t = 0;
      86         637 :     move16();
      87         637 :     bp = nbbits_ntuples; /* Q0 */
      88         637 :     move16();
      89         637 :     nbbits_signs = 0;
      90         637 :     move16();
      91         637 :     nbbits_lsbs = 0;
      92         637 :     move16();
      93         637 :     nbbits_m2 = sub( nbbits, 2 ); /* Q0 */
      94         637 :     flag_overflow = 0;
      95         637 :     move16();
      96             : 
      97         637 :     IF( hm_cfg ) /* mapped domain */
      98             :     {
      99          50 :         numPeakIndicesOrig = hm_cfg->numPeakIndices; /* Q0 */
     100          50 :         move16();
     101          50 :         hm_cfg->numPeakIndices = s_min( hm_cfg->numPeakIndices, lastnz ); /* Q0 */
     102          50 :         move16();
     103          50 :         numHoleIndices = sub( lastnz, hm_cfg->numPeakIndices ); /* Q0 */
     104             : 
     105             :         /* Mark hole indices beyond lastnz as pruned */
     106       22052 :         FOR( k = numHoleIndices; k < hm_cfg->numHoleIndices; ++k )
     107             :         {
     108       22002 :             hm_cfg->holeIndices[k] = add( hm_cfg->holeIndices[k], nt ); /* Q0 */
     109       22002 :             move16();
     110             :         }
     111             : 
     112          50 :         ii[0] = numPeakIndicesOrig; /* Q0 */
     113          50 :         move16();
     114          50 :         ii[1] = 0;
     115          50 :         move16();
     116             : 
     117          50 :         get_next_coeff = get_next_coeff_mapped; /* Q0 */
     118          50 :         move16();
     119             :     }
     120             :     ELSE /* unmapped domain */
     121             :     {
     122         587 :         ii[0] = 0;
     123         587 :         move16();
     124             : 
     125         587 :         p1 = p2 = 0;
     126         587 :         move16();
     127         587 :         move16();
     128             : 
     129         587 :         get_next_coeff = get_next_coeff_unmapped; /* Q0 */
     130         587 :         move16();
     131             : 
     132             :         /* Find last non-zero tuple */
     133             :         /* ensure termination of while loop by dummy value */
     134         587 :         a1 = x[0];
     135         587 :         move16();
     136         587 :         x[0] = 1;
     137         587 :         move16();
     138             : 
     139        2406 :         WHILE( s_or( x[lastnz - 1], x[lastnz - 2] ) == 0 )
     140             :         {
     141        1819 :             lastnz = sub( lastnz, 2 ); /* Q0 */
     142             :         }
     143         587 :         x[0] = a1;
     144         587 :         move16();
     145             :     }
     146             : 
     147         637 :     lsbs_bits2 = ptr + nbbits - 1;
     148             : 
     149             :     /*Start Encoding*/
     150         637 :     ari_start_encoding_14bits_fx( &as );
     151             : 
     152             :     /*Main Loop through the 2-tuples*/
     153         637 :     b1_i = -1;
     154         637 :     move16();
     155       66143 :     FOR( k = 0; k < lastnz; k += 2 )
     156             :     {
     157             :         /* First coefficient */
     158       65506 :         a1_i = get_next_coeff( ii, &p1, &idx1, hm_cfg ); /* Q0 */
     159             : 
     160             :         /* Second coefficient */
     161       65506 :         b1_i = get_next_coeff( ii, &p2, &idx2, hm_cfg ); /* Q0 */
     162             : 
     163       65506 :         idx = s_min( idx1, idx2 ); /* Q0 */
     164             : 
     165             :         /* Get context */
     166       65506 :         ctx = &c[s_or( p1, p2 )]; /* Q0 */
     167             :         /* _DIFF_FLOAT_FIX_  float is using t as UWord16 */
     168       65506 :         t = add( *ctx, rateFlag ); /* Q0 */
     169       65506 :         if ( GT_16( idx, nt_half ) )
     170             :         {
     171          81 :             t = add( t, 1 << NBITS_CONTEXT ); /* Q0 */
     172             :         }
     173             : 
     174             :         /* Init current 2-tuple encoding */
     175       65506 :         if ( flag_overflow != 0 )
     176             :         {
     177           0 :             x[a1_i] = 0;
     178           0 :             move16();
     179             :         }
     180       65506 :         if ( flag_overflow != 0 )
     181             :         {
     182           0 :             x[b1_i] = 0;
     183           0 :             move16();
     184             :         }
     185             : 
     186       65506 :         a1 = abs_s( x[a1_i] ); /* Q0 */
     187       65506 :         b1 = abs_s( x[b1_i] ); /* Q0 */
     188             : 
     189       65506 :         lev1 = -1;
     190       65506 :         move16();
     191             : 
     192             :         /*Copy states*/
     193       65506 :         ari_copy_states_fx( &as, &as_overflow );
     194       65506 :         bp_overflow = bp; /* Q0 */
     195       65506 :         move16();
     196       65506 :         nbbits_signs_overflow = nbbits_signs; /* Q0 */
     197       65506 :         move16();
     198       65506 :         nbbits_lsbs_overflow = nbbits_lsbs; /* Q0 */
     199       65506 :         move16();
     200             : 
     201             :         /*Signs encoding*/
     202       65506 :         signs[nbbits_signs] = lshr( x[a1_i], 15 ); /* Q0 */
     203       65506 :         move16();
     204       65506 :         if ( a1 > 0 )
     205             :         {
     206       17248 :             nbbits_signs = add( nbbits_signs, 1 ); /* Q0 */
     207             :         }
     208       65506 :         signs[nbbits_signs] = lshr( x[b1_i], 15 ); /* Q0 */
     209       65506 :         move16();
     210       65506 :         if ( b1 > 0 )
     211             :         {
     212       17047 :             nbbits_signs = add( nbbits_signs, 1 ); /* Q0 */
     213             :         }
     214             : 
     215             :         /* MSBs coding */
     216       69365 :         WHILE( GE_16( s_max( a1, b1 ), A_THRES ) )
     217             :         {
     218        3859 :             tmp = add( t, Tab_esc_nb[lev1 + 1] ); /* Q0 */
     219        3859 :             assert( tmp >= 0 && tmp < 4096 );
     220        3859 :             pki = ari_lookup_s17_LC[tmp]; /* Q0 */
     221        3859 :             move16();
     222        3859 :             bp = ari_encode_14bits_ext_fx( ptr, bp, &as, VAL_ESC, ari_pk_s17_LC_ext[pki] ); /* Q0 */
     223             : 
     224        3859 :             *lsbs_bits2-- = s_and( a1, 1 );
     225        3859 :             move16();
     226        3859 :             *lsbs_bits2-- = s_and( b1, 1 );
     227        3859 :             move16();
     228             : 
     229             :             /* LSBs bit counting */
     230        3859 :             nbbits_lsbs = add( nbbits_lsbs, 2 ); /* Q0 */
     231             : 
     232        3859 :             a1 = shr( a1, 1 );
     233        3859 :             b1 = shr( b1, 1 );
     234             : 
     235        3859 :             lev1 = s_min( add( lev1, 1 ), 2 ); /* Q0 */
     236             :         }
     237             : 
     238       65506 :         tmp = add( t, Tab_esc_nb[lev1 + 1] ); /* Q0 */
     239       65506 :         assert( tmp >= 0 && tmp < 4096 );
     240       65506 :         pki = ari_lookup_s17_LC[tmp]; /* Q0 */
     241       65506 :         move16();
     242       65506 :         bp = ari_encode_14bits_ext_fx( ptr, bp, &as, add( a1, shl( b1, A_THRES_SHIFT ) ), ari_pk_s17_LC_ext[pki] ); /* Q0 */
     243             : 
     244             :         /* Check bit budget */
     245       65506 :         IF( GT_16( add( add( add( bp, extract_l( as.value ) ), nbbits_signs ), nbbits_lsbs ), nbbits_m2 ) )
     246             :         {
     247           0 :             ari_copy_states_fx( &as_overflow, &as );
     248           0 :             bp = bp_overflow; /* Q0 */
     249           0 :             move16();
     250             : 
     251           0 :             IF( flag_overflow == 0 )
     252             :             {
     253           0 :                 nbbits_signs = nbbits_signs_overflow; /* Q0 */
     254           0 :                 move16();
     255           0 :                 nbbits_lsbs = nbbits_lsbs_overflow; /* Q0 */
     256           0 :                 move16();
     257           0 :                 IF( hm_cfg )
     258             :                 {
     259           0 :                     flag_overflow = 1;
     260           0 :                     move16();
     261             : 
     262             :                     /* Code from now only zeros */
     263           0 :                     x[a1_i] = 0;
     264           0 :                     move16();
     265           0 :                     x[b1_i] = 0;
     266           0 :                     move16();
     267           0 :                     lev1 = -1;
     268           0 :                     move16();
     269             : 
     270           0 :                     assert( t >= 0 && t < 4096 );
     271           0 :                     pki = ari_lookup_s17_LC[t]; /* Q0 */
     272           0 :                     move16();
     273           0 :                     bp = ari_encode_14bits_ext_fx( ptr, bp, &as, 0, ari_pk_s17_LC_ext[pki] ); /* Q0 */
     274             : 
     275           0 :                     IF( GT_16( add( add( add( bp, extract_l( as.value ) ), nbbits_signs ), nbbits_lsbs ), nbbits_m2 ) )
     276             :                     {
     277           0 :                         ari_copy_states_fx( &as_overflow, &as );
     278           0 :                         bp = bp_overflow; /* Q0 */
     279           0 :                         move16();
     280           0 :                         BREAK;
     281             :                     }
     282             :                 }
     283             :                 ELSE
     284             :                 {
     285           0 :                     BREAK;
     286             :                 }
     287             :             }
     288             :             ELSE
     289             :             {
     290           0 :                 BREAK;
     291             :             }
     292             :         }
     293             : 
     294             :         /* Update context for next 2-tuple */
     295       65506 :         IF( EQ_16( p1, p2 ) ) /* peak-peak or hole-hole context */
     296             :         {
     297       65273 :             if ( lev1 > 0 )
     298         897 :                 t = add( 12, lev1 );
     299       65273 :             if ( lev1 <= 0 )
     300       64376 :                 t = add( a1, b1 );
     301       65273 :             if ( lev1 == 0 )
     302        1730 :                 t = add( t, t );
     303             : 
     304       65273 :             *ctx = add( shl( s_and( *ctx, 0xf ), 4 ), add( t, 1 ) ); /* Q0 */
     305       65273 :             move16();
     306             :         }
     307             :         ELSE /* mixed context */
     308             :         {
     309         233 :             IF( s_and( idx1, 1 ) ) /* update first context */
     310             :             {
     311         113 :                 c[p1] = update_mixed_context( c[p1], abs_s( x[a1_i] ) ); /* Q0 */
     312         113 :                 move16();
     313             :             }
     314             : 
     315         233 :             IF( s_and( idx2, 1 ) ) /* update second context */
     316             :             {
     317         120 :                 c[p2] = update_mixed_context( c[p2], abs_s( x[b1_i] ) ); /* Q0 */
     318         120 :                 move16();
     319             :             }
     320             :         }
     321             :     } /*end of the 2-tuples loop*/
     322             : 
     323             :     /* End arithmetic coder, overflow management */
     324         637 :     bp = ari_done_encoding_14bits_fx( ptr, bp, &as ); /* Q0 */
     325             : 
     326             :     /* Overflow is detected */
     327         637 :     IF( NE_16( k, lastnz ) )
     328             :     {
     329           0 :         IF( hm_cfg )
     330             :         {
     331             :             /* Fill with zero to be sure that the decoder finishes the MSB decoding at the same position */
     332           0 :             tmp = sub( nbbits, add( nbbits_signs, nbbits_lsbs ) ); /* Q0 */
     333           0 :             set16_fx( &ptr[bp], 0, sub( tmp, bp ) );
     334           0 :             bp = tmp;
     335           0 :             move16();
     336             :         }
     337           0 :         if ( !hm_cfg )
     338             :         {
     339           0 :             lastnz = k; /* Q0 */
     340           0 :             move16();
     341             :         }
     342             :     }
     343             : 
     344             :     /* Push number of encoded tuples */
     345         637 :     value = sub( shr( lastnz, 1 ), 1 ); /* Q0 */
     346         637 :     push_next_indice( hBstr, value, nbbits_ntuples );
     347             : 
     348             :     /* Push arithmetic coded bits */
     349         637 :     push_next_bits( hBstr, (UWord16 *) &ptr[nbbits_ntuples], sub( bp, nbbits_ntuples ) );
     350             : 
     351             :     /* Push sign bits */
     352         637 :     push_next_bits( hBstr, (UWord16 *) signs, nbbits_signs );
     353         637 :     bp = add( bp, nbbits_signs ); /* Q0 */
     354             : 
     355             :     /*write residual Quantization bits*/
     356         637 :     tmp = s_min( sub( sub( nbbits, bp ), nbbits_lsbs ), resQMaxBits ); /* Q0 */
     357        6980 :     FOR( k = 0; k < tmp; k++ )
     358             :     {
     359        6343 :         ptr[nbbits - 1 - nbbits_lsbs - k] = x[nt + k]; /* Q0 */
     360        6343 :         move16();
     361             :     }
     362             :     /* Write filler bits */
     363         637 :     tmp = sub( nbbits, add( bp, nbbits_lsbs ) ); /* Q0 */
     364        1826 :     FOR( ; k < tmp; ++k )
     365             :     {
     366        1189 :         ptr[nbbits - 1 - nbbits_lsbs - k] = 0;
     367        1189 :         move16();
     368             :     }
     369             :     /*   fprintf(stderr, "Budget: %d Fill bits: %d ResQ Bits: %d\n",(int) (nbbits),(int) (nbbits-bp-nbbits_lsbs),(int)i);*/
     370             : 
     371             :     /* Check for debugging */
     372         637 :     assert( bp + k <= nbbits );
     373             : 
     374             :     /* Push the rest of the buffer */
     375         637 :     push_next_bits( hBstr, (UWord16 *) &ptr[bp], sub( nbbits, bp ) );
     376             : 
     377         637 :     return /*(bp+nbbits_lsbs)*/; /*return only for debug plot*/
     378             : }
     379             : /*-------------------------------------------------------------------*
     380             :  * find_last_nz_pair()
     381             :  *
     382             :  *
     383             :  *-------------------------------------------------------------------*/
     384        4391 : static Word16 find_last_nz_pair(
     385             :     const Word16 x[], /* Q0 */
     386             :     Word16 length,
     387             :     const CONTEXT_HM_CONFIG *hm_cfg )
     388             : {
     389             :     Word16 last_nz, i, stage, lobs[4];
     390        4391 :     const Word16 *tmp = NULL;
     391             : 
     392        4391 :     if ( hm_cfg )
     393             :     {
     394        1341 :         tmp = hm_cfg->indexBuffer; /* Q0 */
     395        1341 :         move16();
     396             :     }
     397             : 
     398        4391 :     lobs[0] = 4;
     399        4391 :     move16();
     400        4391 :     lobs[1] = shr( length, 1 ); /* length/2 */
     401        4391 :     move16();
     402        4391 :     lobs[2] = add( lobs[1], shr( length, 2 ) ); /* Q0 */
     403        4391 :     move16();
     404        4391 :     lobs[3] = add( lobs[2], shr( length, 3 ) ); /* Q0 */
     405        4391 :     move16();
     406             : 
     407        4391 :     last_nz = 0;
     408        4391 :     move16();
     409        4391 :     i = length;
     410        4391 :     move16();
     411       16814 :     FOR( stage = 3; stage >= 0; --stage )
     412             :     {
     413       16809 :         IF( hm_cfg ) /* mapped kernel */
     414             :         {
     415      315552 :             FOR( ; i >= lobs[stage]; i -= 2 )
     416             :             {
     417      310931 :                 if ( x[tmp[i - 2]] != 0 )
     418             :                 {
     419       15544 :                     last_nz = s_max( last_nz, i ); /* Q0 */
     420             :                 }
     421      310931 :                 if ( x[tmp[i - 1]] != 0 )
     422             :                 {
     423       15451 :                     last_nz = s_max( last_nz, i ); /* Q0 */
     424             :                 }
     425             :             }
     426             :         }
     427             :         ELSE /* unmapped kernel */
     428             :         {
     429      996642 :             FOR( ; i >= lobs[stage]; i -= 2 )
     430             :             {
     431      984454 :                 if ( x[i - 2] != 0 )
     432             :                 {
     433       80366 :                     last_nz = s_max( last_nz, i ); /* Q0 */
     434             :                 }
     435      984454 :                 if ( x[i - 1] != 0 )
     436             :                 {
     437       79058 :                     last_nz = s_max( last_nz, i ); /* Q0 */
     438             :                 }
     439             :             }
     440             :         }
     441       16809 :         IF( last_nz > 0 )
     442             :         {
     443        4386 :             BREAK;
     444             :         }
     445             :     }
     446             : 
     447        4391 :     return s_max( last_nz, 2 );
     448             : }
     449             : /*-------------------------------------------------------------------*
     450             :  * ACcontextMapping_encode2_estimate_no_mem_s17_LC_fx()
     451             :  *
     452             :  *
     453             :  *-------------------------------------------------------------------*/
     454        4391 : Word16 ACcontextMapping_encode2_estimate_no_mem_s17_LC_fx(
     455             :     const Word16 *x,    /* Q0 */
     456             :     Word16 nt,          /* Q0 */
     457             :     Word16 *lastnz_out, /* Q0 */
     458             :     Word16 *nEncoded,   /* Q0 */
     459             :     Word16 target,      /* Q0 */
     460             :     Word16 *stop,       /* Q0 */
     461             :     CONTEXT_HM_CONFIG *hm_cfg )
     462             : {
     463             :     Word16 a1, b1, a1_i, b1_i;
     464             :     Word16 k, t, pki, lev1;
     465             :     Word16 lastnz, lastnz2;
     466             :     Word16 rateFlag;
     467             :     Word16 nbits_old, nbits;
     468             :     Word16 stop2;
     469             :     Word16 cum_freq_norm, cum_freq_norm_e;
     470             :     Word32 proba;
     471             :     Word16 nlz;
     472             :     const UWord16 *cum_freq;
     473             :     Word16 symbol;
     474             :     const Word8 *lookup;
     475             :     Word16 nt_half;
     476             :     Word16 c[2], *ctx;
     477             :     Word16 p1, p2;
     478             :     Word16 ii[2], idx1, idx2, idx;
     479        4391 :     Word16 numPeakIndicesOrig = 0, numHoleIndices = 0; /* initialize just to avoid compiler warning */
     480        4391 :     move16();
     481        4391 :     move16();
     482             :     get_next_coeff_function get_next_coeff;
     483             : 
     484             : 
     485             :     /* Rate flag */
     486        4391 :     rateFlag = 0;
     487        4391 :     move16();
     488        4391 :     if ( GT_16( target, 400 ) )
     489             :     {
     490         210 :         rateFlag = 2 << NBITS_CONTEXT; /* Q0 */
     491         210 :         move16();
     492             :     }
     493             : 
     494             :     /* proba coded on 14bits -> proba=1 */
     495        4391 :     proba = L_deposit_l( 16384 ); /* Q0 */
     496             : 
     497             :     /* Init */
     498        4391 :     nt_half = shr( nt, 1 );
     499        4391 :     stop2 = 0;
     500        4391 :     move16();
     501        4391 :     c[0] = c[1] = 0;
     502        4391 :     move16();
     503        4391 :     move16();
     504             : 
     505             :     /* bits to encode lastnz + 2 bits headroom */
     506        4391 :     nbits = sub( 2 + 14, norm_s( sub( nt, 1 ) ) ); /* Q0 */
     507        4391 :     nbits_old = nbits;                             /* Q0 */
     508        4391 :     move16();
     509        4391 :     nbits = sub( nbits, target ); /* Q0 */
     510             : 
     511             :     /* Find last non-zero tuple in the mapped domain signal */
     512        4391 :     lastnz = find_last_nz_pair( x, nt, hm_cfg ); /* Q0 */
     513             : 
     514             :     /* At least one tuple is coded */
     515        4391 :     lastnz2 = 2;
     516        4391 :     move16();
     517             : 
     518        4391 :     IF( hm_cfg ) /* mapped domain */
     519             :     {
     520        1341 :         numPeakIndicesOrig = hm_cfg->numPeakIndices; /* Q0 */
     521        1341 :         move16();
     522        1341 :         hm_cfg->numPeakIndices = s_min( hm_cfg->numPeakIndices, lastnz ); /* Q0 */
     523        1341 :         move16();
     524        1341 :         numHoleIndices = sub( lastnz, hm_cfg->numPeakIndices ); /* Q0 */
     525             : 
     526             :         /* Mark hole indices beyond lastnz as pruned */
     527      424829 :         FOR( k = numHoleIndices; k < hm_cfg->numHoleIndices; ++k )
     528             :         {
     529      423488 :             hm_cfg->holeIndices[k] = add( hm_cfg->holeIndices[k], nt ); /* Q0 */
     530      423488 :             move16();
     531             :         }
     532             : 
     533        1341 :         ii[0] = numPeakIndicesOrig; /* Q0 */
     534        1341 :         move16();
     535        1341 :         ii[1] = 0;
     536        1341 :         move16();
     537             : 
     538        1341 :         get_next_coeff = get_next_coeff_mapped; /* Q0 */
     539        1341 :         move16();
     540             :     }
     541             :     ELSE /* unmapped domain */
     542             :     {
     543        3050 :         ii[0] = 0;
     544        3050 :         move16();
     545             : 
     546        3050 :         p1 = p2 = 0;
     547        3050 :         move16();
     548        3050 :         move16();
     549             : 
     550        3050 :         get_next_coeff = get_next_coeff_unmapped; /* Q0 */
     551        3050 :         move16();
     552             :     }
     553             : 
     554             :     /* Main Loop through the 2-tuples */
     555      494598 :     FOR( k = 0; k < lastnz; k += 2 )
     556             :     {
     557             :         /* First coefficient */
     558      490750 :         a1_i = get_next_coeff( ii, &p1, &idx1, hm_cfg ); /* Q0 */
     559             : 
     560             :         /* Second coefficient */
     561      490750 :         b1_i = get_next_coeff( ii, &p2, &idx2, hm_cfg ); /* Q0 */
     562             : 
     563      490750 :         idx = s_min( idx1, idx2 ); /* Q0 */
     564             : 
     565             :         /* Get context */
     566      490750 :         ctx = &c[s_or( p1, p2 )]; /* Q0 */
     567             : 
     568      490750 :         t = add( *ctx, rateFlag ); /* Q0 */
     569      490750 :         if ( GT_16( idx, nt_half ) )
     570             :         {
     571       18133 :             t = add( t, 1 << NBITS_CONTEXT ); /* Q0 */
     572             :         }
     573             : 
     574             :         /* Init current 2-tuple encoding */
     575      490750 :         a1 = abs_s( x[a1_i] ); /* Q0 */
     576      490750 :         b1 = abs_s( x[b1_i] ); /* Q0 */
     577             : 
     578      490750 :         lev1 = -( 1 << ( NBITS_CONTEXT + NBITS_RATEQ ) );
     579      490750 :         move16();
     580             :         /* Signs Bits */
     581      490750 :         if ( a1 > 0 )
     582             :         {
     583      116211 :             nbits = add( nbits, 1 ); /* Q0 */
     584             :         }
     585             : 
     586      490750 :         if ( b1 > 0 )
     587             :         {
     588      114949 :             nbits = add( nbits, 1 ); /* Q0 */
     589             :         }
     590             : 
     591             :         /* pre-compute address of ari_pk_s17_LC_ext[0][Val_esc] to avoid doing it multiple times inside the loop */
     592             : 
     593             :         /* check while condition */
     594             : 
     595             :         /* MSBs coding */
     596      490750 :         lookup = (const Word8 *) ( &ari_lookup_s17_LC[t] + ( 1 << ( NBITS_CONTEXT + NBITS_RATEQ ) ) ); /* address calculation not counted */
     597      517228 :         WHILE( GE_16( s_max( a1, b1 ), A_THRES ) )
     598             :         {
     599       26478 :             pki = lookup[lev1];
     600       26478 :             move16();
     601       26478 :             cum_freq = ari_pk_s17_LC_ext[pki] + VAL_ESC; /* address calculation not counted */
     602             :             /*p1*p2=proba on 28 bits: p=0.5->power(2,27)*/
     603             : 
     604       26478 :             cum_freq_norm_e = norm_s( cum_freq[0] );
     605       26478 :             cum_freq_norm = shl( cum_freq[0], cum_freq_norm_e );
     606       26478 :             proba = Mpy_32_16_1( proba, cum_freq_norm );
     607       26478 :             proba = L_shl( proba, sub( 14, cum_freq_norm_e ) ); /* Q14 + cum_freq_norm_e */
     608             : 
     609             :             /*Number of leading zero computed in one cycle=norm_l() in BASOP*/
     610       26478 :             nlz = sub( norm_l( proba ), 2 );
     611       26478 :             proba = L_shl( proba, sub( nlz, 15 ) ); /* cum_freq_norm_e */
     612             : 
     613       26478 :             nbits = add( nbits, nlz ); /* Q0 */
     614             :             /*addition added as shift not done in norm_l(): real shift = 14-nlz*/
     615             :             /*proba is rounded down on 14 bits ->automatic over-estimation of bit consumption*/
     616             : 
     617       26478 :             a1 = shr( a1, 1 );
     618       26478 :             b1 = shr( b1, 1 );
     619       26478 :             lev1 = s_min( add( lev1, 1 << ( NBITS_CONTEXT + NBITS_RATEQ ) ), 2 << ( NBITS_CONTEXT + NBITS_RATEQ ) ); /* Q0 */
     620             :         }
     621             : 
     622      490750 :         pki = lookup[lev1]; /* Q0 */
     623      490750 :         move16();
     624      490750 :         symbol = add( a1, shl( b1, A_THRES_SHIFT ) ); /* Q0 */
     625      490750 :         cum_freq = ari_pk_s17_LC_ext[pki] + symbol;   /* address calculation not counted */
     626             :         /*p1*p2=proba on 28 bits: p=0.5->power(2,27)*/
     627             : 
     628      490750 :         cum_freq_norm = sub( cum_freq[0], cum_freq[1] );
     629      490750 :         cum_freq_norm_e = norm_s( cum_freq_norm );
     630      490750 :         cum_freq_norm = shl( cum_freq_norm, cum_freq_norm_e );
     631      490750 :         proba = Mpy_32_16_1( proba, cum_freq_norm );
     632      490750 :         proba = L_shl( proba, sub( 15, cum_freq_norm_e ) ); /* Q15 + cum_freq_norm_e */
     633             : 
     634             :         /*Number of leading zero computed in one cycle=norm_l() in BASOP*/
     635      490750 :         nlz = sub( norm_l( proba ), 3 );
     636      490750 :         proba = L_shl( proba, sub( nlz, 14 ) ); /* cum_freq_norm_e */
     637             : 
     638      490750 :         nbits = add( nbits, nlz ); /* Q0 */
     639             :         /*addition added as shift not done in norm_l(): real shift = 14-nlz*/
     640             :         /*proba is rounded down on 14 bits ->automatic over-estimation of bit consumption*/
     641             : 
     642             :         /* Should we truncate? */
     643             : 
     644      490750 :         IF( nbits > 0 )
     645             :         {
     646       48552 :             stop2 = 1;
     647       48552 :             move16();
     648             : 
     649       48552 :             IF( *stop )
     650             :             {
     651         543 :                 BREAK;
     652             :             }
     653             :         }
     654             :         ELSE
     655             :         {
     656      442198 :             test();
     657      442198 :             test();
     658      442198 :             IF( hm_cfg || k == 0 || s_or( x[a1_i], x[b1_i] ) )
     659             :             {
     660      268360 :                 nbits_old = add( nbits, target ); /* Q0 */
     661      268360 :                 lastnz2 = add( b1_i, 1 );         /* Q0 */
     662             :             }
     663             :         }
     664             : 
     665             :         /* Update context for next 2-tuple */
     666      490207 :         IF( EQ_16( p1, p2 ) ) /* peak-peak or hole-hole context */
     667             :         {
     668      465073 :             lev1 = shr( lev1, NBITS_CONTEXT + NBITS_RATEQ ); /* Q0 */
     669      465073 :             if ( lev1 > 0 )
     670        5925 :                 t = add( 12, lev1 );
     671      465073 :             if ( lev1 <= 0 )
     672      459148 :                 t = add( a1, b1 );
     673      465073 :             if ( lev1 == 0 )
     674       11313 :                 t = add( t, t );
     675             : 
     676      465073 :             *ctx = add( shl( s_and( *ctx, 0xf ), 4 ), add( t, 1 ) ); /* Q0 */
     677      465073 :             move16();
     678             :         }
     679             :         ELSE /* mixed context */
     680             :         {
     681       25134 :             IF( s_and( idx1, 1 ) ) /* update first context */
     682             :             {
     683       12452 :                 c[p1] = update_mixed_context( c[p1], abs_s( x[a1_i] ) ); /* Q0 */
     684       12452 :                 move16();
     685             :             }
     686             : 
     687       25134 :             IF( s_and( idx2, 1 ) ) /* update second context */
     688             :             {
     689       12589 :                 c[p2] = update_mixed_context( c[p2], abs_s( x[b1_i] ) ); /* Q0 */
     690       12589 :                 move16();
     691             :             }
     692             :         }
     693             :     } /* end of the 2-tuples loop */
     694             : 
     695        4391 :     nbits = add( nbits, target ); /* Q0 */
     696             : 
     697             :     /* Output */
     698        4391 :     if ( *stop )
     699             :     {
     700         603 :         nbits = nbits_old; /* Q0 */
     701         603 :         move16();
     702             :     }
     703             : 
     704        4391 :     if ( stop2 )
     705             :     {
     706        2421 :         stop2 = nbits; /* Q0 */
     707        2421 :         move16();
     708             :     }
     709        4391 :     *nEncoded = lastnz2; /* Q0 */
     710        4391 :     move16();
     711        4391 :     *stop = stop2; /* Q0 */
     712        4391 :     move16();
     713        4391 :     if ( lastnz_out )
     714             :     {
     715        4391 :         *lastnz_out = lastnz; /* Q0 */
     716        4391 :         move16();
     717             :     }
     718             : 
     719        4391 :     IF( hm_cfg )
     720             :     {
     721             :         /* Restore hole indices beyond lastnz */
     722      424829 :         FOR( k = numHoleIndices; k < hm_cfg->numHoleIndices; ++k )
     723             :         {
     724      423488 :             hm_cfg->holeIndices[k] = sub( hm_cfg->holeIndices[k], nt ); /* Q0 */
     725      423488 :             move16();
     726             :         }
     727        1341 :         hm_cfg->numPeakIndices = numPeakIndicesOrig; /* Q0 */
     728        1341 :         move16();
     729             :     }
     730             : 
     731             : 
     732        4391 :     return nbits_old;
     733             : }
     734             : 
     735             : /* Range Coder Functions */
     736             : 
     737             : /*-------------------------------------------------------------------*
     738             :  * RCcontextMapping_encode2_no_mem_s17_LCS()
     739             :  *
     740             :  * Range encoder
     741             :  *-------------------------------------------------------------------*/
     742             : 
     743      845374 : void RCcontextMapping_encode2_no_mem_s17_LCS_fx(
     744             :     BSTR_ENC_HANDLE hBstr,    /* i/o: bitstream handle            */
     745             :     Word16 *x,                /* Q0 */
     746             :     const Word16 nt,          /* Q0 */
     747             :     Word16 lastnz,            /* Q0 */
     748             :     const Word16 nbbits,      /* Q0 */
     749             :     const Word16 resQMaxBits, /* Q0 */
     750             :     CONTEXT_HM_CONFIG *hm_cfg )
     751             : {
     752             :     Word16 ptr[BITBUFSIZE];
     753             :     RangeUniEncState rc_st_enc;
     754             :     Word16 bp;
     755             :     Word16 rc_tot_bits; /* No. of bits returned by range coder */
     756             :     Word16 pki, lev1;
     757             :     UWord16 t;
     758             :     Word16 rateFlag;
     759             :     Word16 value;
     760             :     Word16 nbbits_ntuples, nbbits_lsbs, nbbits_signs;
     761             :     Word16 *lsbs_bits;
     762             :     Word16 nt_half;
     763             :     Word16 signs[N_MAX];
     764             :     Word16 a1, b1, k;
     765             : 
     766      845374 :     a1 = 0; /* to avoid compilation warnings */
     767      845374 :     b1 = 0; /* to avoid compilation warnings */
     768      845374 :     move16();
     769      845374 :     move16();
     770             : 
     771             :     /* Init */
     772      845374 :     nt_half = shr( nt, 1 );
     773             : 
     774             :     /* Bits for encoding the number of encoded tuples */
     775      845374 :     nbbits_ntuples = 0;
     776      845374 :     k = 1;
     777      845374 :     move16();
     778      845374 :     move16();
     779             : 
     780     8360632 :     WHILE( LT_16( k, shr( nt, 1 ) ) )
     781             :     {
     782     7515258 :         nbbits_ntuples = add( nbbits_ntuples, 1 ); /* Q0 */
     783     7515258 :         k = shl( k, 1 );
     784             :     }
     785             : 
     786      845374 :     t = 0;
     787      845374 :     nbbits_signs = 0;
     788      845374 :     nbbits_lsbs = 0;
     789      845374 :     move16();
     790      845374 :     move16();
     791      845374 :     move16();
     792             : 
     793      845374 :     IF( hm_cfg )
     794             :     {
     795             :         Word16 a1_i, b1_i;
     796             :         Word32 c[2], *ctx;
     797             :         Word32 p1, p2;
     798             :         Word16 ii[2];
     799             :         Word16 idx1, idx2, idx;
     800             :         Word16 numPeakIndicesOrig, numHoleIndices;
     801             : 
     802             :         /* Rate flag */
     803       12641 :         IF( GT_16( nbbits, 400 ) )
     804             :         {
     805        6011 :             rateFlag = 2 << NBITS_CONTEXT;
     806        6011 :             move16();
     807             :         }
     808             :         ELSE
     809             :         {
     810        6630 :             rateFlag = 0;
     811        6630 :             move16();
     812             :         }
     813             : 
     814       12641 :         c[0] = c[1] = 0;
     815       12641 :         move32();
     816       12641 :         move32();
     817             : 
     818             :         /* mapped domain */
     819       12641 :         numPeakIndicesOrig = hm_cfg->numPeakIndices;                      /* Q0 */
     820       12641 :         hm_cfg->numPeakIndices = s_min( hm_cfg->numPeakIndices, lastnz ); /* Q0 */
     821       12641 :         numHoleIndices = sub( lastnz, hm_cfg->numPeakIndices );           /* Q0 */
     822       12641 :         move16();
     823       12641 :         move16();
     824             : 
     825             :         /* Mark hole indices beyond lastnz as pruned */
     826     5498704 :         FOR( k = numHoleIndices; k < hm_cfg->numHoleIndices; ++k )
     827             :         {
     828     5486063 :             hm_cfg->holeIndices[k] = add( hm_cfg->holeIndices[k], nt ); /* Q0 */
     829     5486063 :             move16();
     830             :         }
     831             : 
     832       12641 :         ii[0] = numPeakIndicesOrig; /* Q0 */
     833       12641 :         ii[1] = 0;
     834       12641 :         move16();
     835       12641 :         move16();
     836             : 
     837       12641 :         p1 = p2 = 0; /* to avoid compilation warnings */
     838       12641 :         move16();
     839       12641 :         move16();
     840             : 
     841       12641 :         lsbs_bits = ptr + sub( nbbits, 1 );
     842             : 
     843             :         /*Start Encoding*/
     844             :         /* Initialize range encoder */
     845       12641 :         rc_uni_enc_init_fx( &rc_st_enc );
     846             : 
     847             :         /*Main Loop through the 2-tuples*/
     848       12641 :         b1_i = -1;
     849       12641 :         move16();
     850             : 
     851     2315486 :         FOR( k = 0; k < lastnz; k += 2 )
     852             :         {
     853     2302845 :             a1_i = get_next_coeff_mapped_ivas_fx( ii, &p1, &idx1, hm_cfg ); /* Q0 */
     854     2302845 :             b1_i = get_next_coeff_mapped_ivas_fx( ii, &p2, &idx2, hm_cfg ); /* Q0 */
     855             : 
     856     2302845 :             idx = s_min( idx1, idx2 ); /* Q0 */
     857             : 
     858             :             /* Get context */
     859     2302845 :             ctx = &c[L_or( p1, p2 )]; /* Q0 */
     860             : 
     861     2302845 :             t = (UWord16) L_add( *ctx, rateFlag ); /* Q0 */
     862             :             // t += ( nt_half >= idx ) ? 0 : ( 1 << NBITS_CONTEXT );
     863     2302845 :             IF( LT_16( nt_half, idx ) )
     864             :             {
     865      271836 :                 t = add( t, ( 1 << NBITS_CONTEXT ) );
     866             :             }
     867             : 
     868             :             /* Init current 2-tuple encoding */
     869     2302845 :             a1 = abs_s( x[a1_i] ); /* Q0 */
     870     2302845 :             b1 = abs_s( x[b1_i] ); /* Q0 */
     871             : 
     872     2302845 :             lev1 = -1;
     873     2302845 :             move16();
     874             : 
     875             :             /*Signs encoding*/
     876     2302845 :             IF( a1 > 0 )
     877             :             {
     878             :                 // signs[nbbits_signs++] = ( (uint16_t) x[a1_i] >> ( sizeof( uint16_t ) * 8 - 1 ) );
     879      608484 :                 if ( x[a1_i] >= 0 )
     880             :                 {
     881      306474 :                     signs[nbbits_signs] = 0;
     882      306474 :                     move16();
     883             :                 }
     884      608484 :                 if ( x[a1_i] < 0 )
     885             :                 {
     886      302010 :                     signs[nbbits_signs] = 1;
     887      302010 :                     move16();
     888             :                 }
     889      608484 :                 nbbits_signs = add( nbbits_signs, 1 ); /* Q0 */
     890             :             }
     891             : 
     892     2302845 :             IF( b1 > 0 )
     893             :             {
     894             :                 // signs[nbbits_signs++] = ( (uint16_t) x[b1_i] >> ( sizeof( uint16_t ) * 8 - 1 ) );
     895      603305 :                 if ( x[b1_i] >= 0 )
     896             :                 {
     897      300920 :                     signs[nbbits_signs] = 0;
     898      300920 :                     move16();
     899             :                 }
     900      603305 :                 if ( x[b1_i] < 0 )
     901             :                 {
     902      302385 :                     signs[nbbits_signs] = 1;
     903      302385 :                     move16();
     904             :                 }
     905      603305 :                 nbbits_signs = add( nbbits_signs, 1 ); /* Q0 */
     906             :             }
     907             : 
     908             :             /* MSBs coding */
     909     2608450 :             WHILE( GE_16( s_max( a1, b1 ), A_THRES ) )
     910             :             {
     911      305605 :                 pki = ari_lookup_s17_LC[t + ( ( lev1 + 1 ) << ( NBITS_CONTEXT + NBITS_RATEQ ) )]; /* Q0 */
     912      305605 :                 move16();
     913      305605 :                 rc_uni_enc_encode_symbol_fastS_fx( &rc_st_enc, VAL_ESC, cum_freq_ari_pk_s17_LC_ext[pki], sym_freq_ari_pk_s17_LC_ext[pki], 14 ); /* Encode ESC symbol */
     914             : 
     915      305605 :                 *lsbs_bits-- = s_and( a1, 1 );
     916      305605 :                 *lsbs_bits-- = s_and( b1, 1 );
     917      305605 :                 move16();
     918      305605 :                 move16();
     919             : 
     920             :                 /* LSBs bit counting */
     921      305605 :                 nbbits_lsbs = add( nbbits_lsbs, 2 ); /* Q0 */
     922             : 
     923      305605 :                 a1 = shr( a1, 1 );
     924      305605 :                 b1 = shr( b1, 1 );
     925             : 
     926      305605 :                 lev1 = s_min( add( lev1, 1 ), 2 ); /* Q0 */
     927             :             }
     928             : 
     929     2302845 :             pki = ari_lookup_s17_LC[t + ( ( lev1 + 1 ) << ( NBITS_CONTEXT + NBITS_RATEQ ) )]; /* Q0 */
     930     2302845 :             move16();
     931     2302845 :             rc_uni_enc_encode_symbol_fastS_fx( &rc_st_enc, a1 + A_THRES * b1, cum_freq_ari_pk_s17_LC_ext[pki], sym_freq_ari_pk_s17_LC_ext[pki], 14 ); /* Encode MSB symbol */
     932             : 
     933             :             /*Confirm that there is no overflow, i.e. bit-budget has not exceeded */
     934             : 
     935             :             /* Update context for next 2-tuple */
     936     2302845 :             IF( EQ_32( p1, p2 ) )
     937             :             {
     938             :                 /* peak-peak or hole-hole context */
     939             : 
     940     2093837 :                 IF( lev1 <= 0 )
     941             :                 {
     942     2036054 :                     t = (UWord16) L_add( 1, L_mult0( add( a1, b1 ), add( lev1, 2 ) ) ); /* Q0 */
     943             :                 }
     944             :                 ELSE
     945             :                 {
     946       57783 :                     t = (UWord16) L_add( 13, lev1 ); /* Q0 */
     947             :                 }
     948             : 
     949     2093837 :                 *ctx = L_add( L_shl( L_and( *ctx, 0xf ), 4 ), t ); /* Q0 */
     950     2093837 :                 move32();
     951             :             }
     952             :             ELSE
     953             :             {
     954             :                 /* mixed context */
     955             : 
     956      209008 :                 IF( s_and( idx1, 1 ) )
     957             :                 {
     958             :                     /* update first context */
     959       99419 :                     c[p1] = update_mixed_context_ivas_fx( c[p1], abs_s( x[a1_i] ) ); /* Q0 */
     960       99419 :                     move32();
     961             :                 }
     962             : 
     963      209008 :                 IF( s_and( idx2, 1 ) )
     964             :                 {
     965             :                     /* update second context */
     966      109589 :                     c[p2] = update_mixed_context_ivas_fx( c[p2], abs_s( x[b1_i] ) ); /* Q0 */
     967      109589 :                     move32();
     968             :                 }
     969             :             }
     970             : 
     971             :         } /*end of the 2-tuples loop*/
     972             :     }
     973             :     ELSE /* if (!hm_cfg) */
     974             :     {
     975             :         Word16 cp;
     976             :         Word16 esc_nb, rateQ;
     977             :         UWord16 s;
     978             : 
     979             :         /* Rate flag */
     980      832733 :         IF( GT_16( nbbits, 400 ) )
     981             :         {
     982      606037 :             rateFlag = 2;
     983      606037 :             move16();
     984             :         }
     985             :         ELSE
     986             :         {
     987      226696 :             rateFlag = 0;
     988      226696 :             move16();
     989             :         }
     990             : 
     991      832733 :         s = 0;
     992      832733 :         move16();
     993             : 
     994             :         /* Find last non-zero tuple */
     995             :         /* ensure termination of while loop by dummy value */
     996      832733 :         a1 = x[0];
     997      832733 :         x[0] = 1; /* ensure first tuple is non-zero */
     998      832733 :         move16();
     999      832733 :         move16();
    1000             : 
    1001     7088470 :         WHILE( x[lastnz - 1] == 0 && x[lastnz - 2] == 0 )
    1002             :         {
    1003     6255737 :             test();
    1004     6255737 :             lastnz = sub( lastnz, 2 ); /* Q0 */
    1005             :         }
    1006      832733 :         x[0] = a1;
    1007      832733 :         move16();
    1008             : 
    1009      832733 :         lsbs_bits = ptr + sub( nbbits, 1 );
    1010             : 
    1011             :         /*Start Encoding*/
    1012             :         /* Initialize range encoder */
    1013      832733 :         rc_uni_enc_init_fx( &rc_st_enc );
    1014             : 
    1015             :         /*Main Loop through the 2-tuples*/
    1016   179096897 :         FOR( k = 0; k < lastnz; k += 2 )
    1017             :         {
    1018             : 
    1019             :             /* Init current 2-tuple encoding */
    1020   178264164 :             a1 = abs_s( x[k + 0] ); /* Q0 */
    1021   178264164 :             b1 = abs_s( x[k + 1] ); /* Q0 */
    1022             : 
    1023   178264164 :             lev1 = 0;
    1024   178264164 :             esc_nb = 0;
    1025   178264164 :             move16();
    1026   178264164 :             move16();
    1027             : 
    1028             :             /*Signs encoding*/
    1029   178264164 :             IF( a1 > 0 )
    1030             :             {
    1031             :                 // signs[nbbits_signs++] = ( (uint16_t) x[k + 0] >> ( sizeof( uint16_t ) * 8 - 1 ) );
    1032    73139521 :                 if ( x[k] >= 0 )
    1033             :                 {
    1034    36579103 :                     signs[nbbits_signs] = 0;
    1035    36579103 :                     move16();
    1036             :                 }
    1037    73139521 :                 if ( x[k] < 0 )
    1038             :                 {
    1039    36560418 :                     signs[nbbits_signs] = 1;
    1040    36560418 :                     move16();
    1041             :                 }
    1042    73139521 :                 nbbits_signs = add( nbbits_signs, 1 ); /* Q0 */
    1043             :             }
    1044             : 
    1045   178264164 :             IF( b1 > 0 )
    1046             :             {
    1047             :                 // signs[nbbits_signs++] = ( (uint16_t) x[k + 1] >> ( sizeof( uint16_t ) * 8 - 1 ) );
    1048    72938725 :                 if ( x[k + 1] >= 0 )
    1049             :                 {
    1050    36380879 :                     signs[nbbits_signs] = 0;
    1051    36380879 :                     move16();
    1052             :                 }
    1053    72938725 :                 if ( x[k + 1] < 0 )
    1054             :                 {
    1055    36557846 :                     signs[nbbits_signs] = 1;
    1056    36557846 :                     move16();
    1057             :                 }
    1058    72938725 :                 nbbits_signs = add( nbbits_signs, 1 ); /* Q0 */
    1059             :             }
    1060             : 
    1061   178264164 :             rateQ = add( rateFlag, extract_l( GT_16( k, shr( nt, 1 ) ) ) );
    1062             : 
    1063             :             /* MSBs coding */
    1064   211591082 :             WHILE( GE_16( s_max( a1, b1 ), A_THRES ) )
    1065             :             {
    1066    33326918 :                 pki = ari_lookup_s17_LC[t + ( ( rateQ ) << NBITS_CONTEXT ) + ( esc_nb << ( NBITS_CONTEXT + NBITS_RATEQ ) )];
    1067    33326918 :                 move16();
    1068    33326918 :                 rc_uni_enc_encode_symbol_fastS_fx( &rc_st_enc, VAL_ESC, cum_freq_ari_pk_s17_LC_ext[pki], sym_freq_ari_pk_s17_LC_ext[pki], 14 ); /* Encode ESC symbol */
    1069             : 
    1070    33326918 :                 *lsbs_bits-- = s_and( a1, 1 );
    1071    33326918 :                 *lsbs_bits-- = s_and( b1, 1 );
    1072    33326918 :                 move16();
    1073    33326918 :                 move16();
    1074             : 
    1075             :                 /* LSBs bit counting */
    1076    33326918 :                 nbbits_lsbs = add( nbbits_lsbs, 2 ); /* Q0 */
    1077             : 
    1078    33326918 :                 a1 = shr( a1, 1 );
    1079    33326918 :                 b1 = shr( b1, 1 );
    1080             : 
    1081    33326918 :                 lev1 = add( lev1, 1 );     /* Q0 */
    1082    33326918 :                 esc_nb = s_min( lev1, 3 ); /* Q0 */
    1083             :             }
    1084             : 
    1085   178264164 :             move16();
    1086             : 
    1087   178264164 :             pki = ari_lookup_s17_LC[t + ( ( rateQ ) << NBITS_CONTEXT ) + ( esc_nb << ( NBITS_CONTEXT + NBITS_RATEQ ) )];                              /* Q0 */
    1088   178264164 :             rc_uni_enc_encode_symbol_fastS_fx( &rc_st_enc, a1 + A_THRES * b1, cum_freq_ari_pk_s17_LC_ext[pki], sym_freq_ari_pk_s17_LC_ext[pki], 14 ); /* Encode MSB symbol */
    1089             : 
    1090             :             /*Confirm that there is no overflow, i.e. bit-budget has not exceeded */
    1091             : 
    1092             :             /* Update context for next 2-tuple */
    1093   178264164 :             IF( LT_16( esc_nb, 2 ) )
    1094             :             {
    1095   170010890 :                 cp = add( 1, imult1616( add( a1, b1 ), add( esc_nb, 1 ) ) ); /* Q0 */
    1096             :             }
    1097             :             ELSE
    1098             :             {
    1099     8253274 :                 cp = add( 12, esc_nb ); /* Q0 */
    1100             :             }
    1101             : 
    1102             :             /*Shift old 4 bits, replace last 4 bits*/
    1103   178264164 :             s = (UWord16) ( L_add( L_shl( s, 4 ), cp ) );
    1104   178264164 :             t = (UWord16) L_and( s, 0xFF );
    1105             : 
    1106             :         } /*end of the 2-tuples loop*/
    1107             :     }
    1108             : 
    1109             :     /* Finish range encoder */
    1110      845374 :     rc_tot_bits = rc_uni_enc_finish_fx( &rc_st_enc ); /* No. of bits consumed by range coder    Q0*/
    1111      845374 :     bp = add( rc_tot_bits, nbbits_ntuples );          /* Update bitstream pointer    Q0*/
    1112             : 
    1113             :     /* Cross-check that there is no overflow */
    1114             : 
    1115             :     /* Push number of encoded tuples */
    1116      845374 :     value = sub( shr( lastnz, 1 ), 1 ); /* Q0 */
    1117      845374 :     push_next_indice( hBstr, value, nbbits_ntuples );
    1118             : 
    1119             :     /* Push range coded bits from byte_buffer to bitstream */
    1120             :     /* 1) Push all complete bytes, one byte at a time */
    1121    65563541 :     FOR( k = 0; k < ( rc_tot_bits >> 3 ); k++ )
    1122             :     {
    1123    64718167 :         push_next_indice( hBstr, rc_st_enc.byte_buffer[k], 8 );
    1124             :     }
    1125             :     /* 2) Push remaining bits */
    1126      845374 :     IF( s_and( rc_tot_bits, 7 ) != 0 )
    1127             :     {
    1128      739704 :         push_next_indice( hBstr, shr( rc_st_enc.byte_buffer[k], sub( 8, s_and( rc_tot_bits, 7 ) ) ), s_and( rc_tot_bits, 7 ) );
    1129             :     }
    1130             : 
    1131             :     /* Push sign bits */
    1132      845374 :     push_next_bits( hBstr, (UWord16 *) signs, nbbits_signs );
    1133      845374 :     bp = add( bp, nbbits_signs ); /* Q0 */
    1134             : 
    1135             :     /*write residual Quantization bits*/
    1136             : 
    1137     4827528 :     FOR( k = 0; k < s_min( nbbits - bp - nbbits_lsbs, resQMaxBits ); k++ )
    1138             :     {
    1139     3982154 :         ptr[nbbits - 1 - nbbits_lsbs - k] = x[nt + k]; /* Q0 */
    1140     3982154 :         move16();
    1141             :     }
    1142             :     /* Write filler bits */
    1143    19324956 :     FOR( ; k < nbbits - bp - nbbits_lsbs; ++k )
    1144             :     {
    1145    18479582 :         ptr[nbbits - 1 - nbbits_lsbs - k] = 0;
    1146    18479582 :         move16();
    1147             :     }
    1148             : 
    1149             :     /* Check for debugging */
    1150      845374 :     assert( bp + k <= nbbits );
    1151             : 
    1152             :     /* Push the rest of the buffer */
    1153      845374 :     push_next_bits( hBstr, (UWord16 *) &ptr[bp], sub( nbbits, bp ) );
    1154             : 
    1155             :     /* return (bp+nbbits_lsbs);*/ /*return only for debug plot*/
    1156      845374 :     return;
    1157             : }
    1158             : 
    1159             : /*-------------------------------------------------------------------*
    1160             :  * find_last_nz_pair_fx()
    1161             :  *
    1162             :  *
    1163             :  *-------------------------------------------------------------------*/
    1164             : 
    1165      399500 : static Word16 find_last_nz_pair_fx(
    1166             :     const Word16 x[], /* Q0 */
    1167             :     const Word16 length,
    1168             :     const CONTEXT_HM_CONFIG *hm_cfg )
    1169             : {
    1170             :     Word16 last_nz, i;
    1171             :     const Word16 *tmp;
    1172             : 
    1173      399500 :     last_nz = 2;
    1174      399500 :     move16();
    1175             : 
    1176      399500 :     IF( hm_cfg )
    1177             :     {
    1178             :         /* mapped kernel */
    1179      399500 :         tmp = hm_cfg->indexBuffer;
    1180             : 
    1181    68456486 :         FOR( i = length; i >= 4; i -= 2 )
    1182             :         {
    1183    68452427 :             test();
    1184    68452427 :             IF( x[tmp[i - 2]] || x[tmp[i - 1]] )
    1185             :             {
    1186      395441 :                 last_nz = i; /* Q0 */
    1187      395441 :                 move16();
    1188      395441 :                 BREAK;
    1189             :             }
    1190             :         }
    1191             :     }
    1192             :     ELSE
    1193             :     {
    1194             :         /* unmapped kernel */
    1195             : 
    1196           0 :         FOR( i = length; i >= 4; i -= 2 )
    1197             :         {
    1198           0 :             test();
    1199           0 :             IF( x[i - 2] || x[i - 1] )
    1200             :             {
    1201           0 :                 last_nz = i; /* Q0 */
    1202           0 :                 move16();
    1203           0 :                 BREAK;
    1204             :             }
    1205             :         }
    1206             :     }
    1207             : 
    1208      399500 :     return last_nz;
    1209             : }
    1210             : 
    1211             : 
    1212             : /*-------------------------------------------------------------------*
    1213             :  * RCcontextMapping_encode2_estimate_no_mem_s17_LCS_fx()
    1214             :  *
    1215             :  * Range coder bit-estimation
    1216             :  *-------------------------------------------------------------------*/
    1217             : 
    1218     3886480 : Word16 RCcontextMapping_encode2_estimate_no_mem_s17_LCS_fx(
    1219             :     Word16 *x,                /* Spectral coefficients    Q0*/
    1220             :     const Word16 nt,          /* L - size of spectrum (no. of spectral coefficients)        Q0*/
    1221             :     Word16 *lastnz_out,       /* Q0 */
    1222             :     Word16 *nEncoded,         /* No. of spectral coefficients that can be coded without an overflow occuring        Q0*/
    1223             :     const Word16 target,      /* Target bits        Q0*/
    1224             :     Word16 *stop,             /* Q0 */
    1225             :     Word16 mode,              /* Q0 */
    1226             :     CONTEXT_HM_CONFIG *hm_cfg /* context-based harmonic model configuration */
    1227             : )
    1228             : {
    1229             :     /* Common variables */
    1230             :     Word16 a1, b1;
    1231             :     Word16 k, pki, lev1;
    1232             :     UWord16 t;
    1233             :     Word16 lastnz, lastnz2;
    1234             :     Word16 rateFlag;
    1235             :     Word64 bit_estimate_fx; /* Q23 */
    1236             : 
    1237             :     Word16 symbol;
    1238             :     const UWord8 *lookup;
    1239             :     Word64 nbits2_fx;
    1240             : 
    1241             :     /* Initialization */
    1242     3886480 :     bit_estimate_fx = MAKE_NUMBER_QX( 2, Q23 );
    1243     3886480 :     move64();
    1244             : 
    1245     3886480 :     nbits2_fx = 0;
    1246     3886480 :     move64();
    1247             : 
    1248             :     /* bits to encode lastnz */
    1249     3886480 :     k = 1;
    1250     3886480 :     move16();
    1251             : 
    1252             : #ifdef OPT_SBA_ENC_V2_BE
    1253             :     Word16 round_bit_estimate_fx;
    1254     3886480 :     Word32 target_Q15 = L_shl( target, Q15 ); // Q15
    1255             : #endif
    1256             : 
    1257    38224049 :     WHILE( LT_16( k, nt / 2 ) )
    1258             :     {
    1259    34337569 :         bit_estimate_fx = W_add( bit_estimate_fx, MAKE_NUMBER_QX( 1, Q23 ) );
    1260    34337569 :         k = shl( k, 1 );
    1261             :         /* check while condition */
    1262             :     }
    1263             : 
    1264     3886480 :     nbits2_fx = bit_estimate_fx;
    1265     3886480 :     move64();
    1266             : 
    1267     3886480 :     IF( hm_cfg )
    1268             :     {
    1269             :         Word16 a1_i, b1_i;
    1270             :         Word16 stop2;
    1271             :         Word16 total_output_bits;
    1272             :         Word16 nt_half;
    1273             :         Word32 c[2], *ctx;
    1274             :         Word32 p1, p2;
    1275             :         Word16 ii[2];
    1276             :         Word16 idx1, idx2, idx;
    1277      399500 :         Word16 numPeakIndicesOrig = 0, numHoleIndices = 0; /* only to avoid compiler warning */
    1278      399500 :         move16();
    1279      399500 :         move16();
    1280             : 
    1281             :         /* Rate flag */
    1282      399500 :         IF( GT_16( target, 400 ) )
    1283             :         {
    1284      247846 :             rateFlag = 2 << NBITS_CONTEXT; /* Select context-A for higher bitrates */
    1285      247846 :             move16();
    1286             :         }
    1287             :         ELSE
    1288             :         {
    1289      151654 :             rateFlag = 0; /* Select context-B for lower bitrates */
    1290      151654 :             move16();
    1291             :         }
    1292             : 
    1293      399500 :         nt_half = shr( nt, 1 );
    1294      399500 :         move16();
    1295      399500 :         stop2 = 0;
    1296      399500 :         move16();
    1297      399500 :         c[0] = c[1] = 0;
    1298      399500 :         move32();
    1299      399500 :         move32();
    1300             : 
    1301             :         /* Find last non-zero tuple in the mapped domain signal */
    1302      399500 :         lastnz = find_last_nz_pair_fx( x, nt, hm_cfg );
    1303             : 
    1304      399500 :         lastnz2 = 2;
    1305      399500 :         move16();
    1306             : 
    1307             :         /* mapped domain */
    1308      399500 :         numPeakIndicesOrig = hm_cfg->numPeakIndices; /* Q0 */
    1309      399500 :         move16();
    1310      399500 :         hm_cfg->numPeakIndices = s_min( hm_cfg->numPeakIndices, lastnz ); /* Q0 */
    1311      399500 :         move16();
    1312      399500 :         numHoleIndices = sub( lastnz, hm_cfg->numPeakIndices ); /* Q0 */
    1313             : 
    1314             :         /* Mark hole indices beyond lastnz as pruned */
    1315   134628308 :         FOR( k = numHoleIndices; k < hm_cfg->numHoleIndices; ++k )
    1316             :         {
    1317   134228808 :             hm_cfg->holeIndices[k] = add( hm_cfg->holeIndices[k], nt ); /* Q0 */
    1318   134228808 :             move16();
    1319             :         }
    1320             : 
    1321      399500 :         ii[0] = numPeakIndicesOrig; /* Q0 */
    1322      399500 :         move16();
    1323      399500 :         ii[1] = 0;
    1324      399500 :         move16();
    1325             : 
    1326      399500 :         p1 = p2 = 0; /* to avoid compilation warnings */
    1327      399500 :         move32();
    1328      399500 :         move32();
    1329             : 
    1330             :         /* Main Loop through the 2-tuples */
    1331    83478106 :         FOR( k = 0; k < lastnz; k += 2 )
    1332             :         {
    1333    83235547 :             a1_i = get_next_coeff_mapped_ivas_fx( ii, &p1, &idx1, hm_cfg ); /* Q0 */
    1334    83235547 :             b1_i = get_next_coeff_mapped_ivas_fx( ii, &p2, &idx2, hm_cfg ); /* Q0 */
    1335             : 
    1336    83235547 :             idx = s_min( idx1, idx2 );
    1337             : 
    1338             :             /* Get context */
    1339    83235547 :             ctx = &c[L_or( p1, p2 )];
    1340             : 
    1341    83235547 :             t = (UWord16) L_add( *ctx, rateFlag );
    1342    83235547 :             if ( LT_16( nt_half, idx ) )
    1343             :             {
    1344    14975120 :                 t = add( t, ( 1 << NBITS_CONTEXT ) );
    1345             :             }
    1346             : 
    1347             :             /* Init current 2-tuple encoding */
    1348    83235547 :             a1 = abs_s( x[a1_i] );
    1349    83235547 :             b1 = abs_s( x[b1_i] );
    1350    83235547 :             lev1 = -( 1 << ( NBITS_CONTEXT + NBITS_RATEQ ) );
    1351             : 
    1352    83235547 :             bit_estimate_fx = W_add( bit_estimate_fx, MAKE_VARIABLE_QX( s_min( a1, 1 ), Q23 ) );
    1353    83235547 :             bit_estimate_fx = W_add( bit_estimate_fx, MAKE_VARIABLE_QX( s_min( b1, 1 ), Q23 ) );
    1354             :             /* pre-compute address of ari_pk_s17_LC_ext[0][Val_esc] to avoid doing it multiple times inside the loop */
    1355    83235547 :             lookup = &ari_lookup_s17_LC[t] + ( 1 << ( NBITS_CONTEXT + NBITS_RATEQ ) );
    1356             : 
    1357             :             /* check while condition */
    1358             :             /* MSBs coding */
    1359             : #ifdef OPT_SBA_ENC_V2_BE
    1360    92672716 :             FOR( ; s_max( a1, b1 ) >= A_THRES; )
    1361             :             {
    1362     9437169 :                 pki = lookup[lev1]; /* ESC symbol */
    1363             : 
    1364     9437169 :                 bit_estimate_fx = W_add( bit_estimate_fx, ari_bit_estimate_s17_LC_fx[pki][VAL_ESC] );
    1365     9437169 :                 bit_estimate_fx = W_add( bit_estimate_fx, MAKE_VARIABLE_QX( 2, Q23 ) );
    1366     9437169 :                 a1 = shr( a1, 1 );
    1367     9437169 :                 b1 = shr( b1, 1 );
    1368             : 
    1369     9437169 :                 lev1 = s_min( add( lev1, ( 1 << ( NBITS_CONTEXT + NBITS_RATEQ ) ) ), 2 << ( NBITS_CONTEXT + NBITS_RATEQ ) );
    1370             :             }
    1371             : #else
    1372             :             WHILE( GE_16( s_max( a1, b1 ), A_THRES ) )
    1373             :             {
    1374             :                 pki = lookup[lev1]; /* ESC symbol */
    1375             : 
    1376             :                 bit_estimate_fx = W_add( bit_estimate_fx, ari_bit_estimate_s17_LC_fx[pki][VAL_ESC] );
    1377             :                 bit_estimate_fx = W_add( bit_estimate_fx, MAKE_VARIABLE_QX( 2, Q23 ) );
    1378             :                 a1 = shr( a1, 1 );
    1379             :                 b1 = shr( b1, 1 );
    1380             : 
    1381             :                 lev1 = s_min( add( lev1, ( 1 << ( NBITS_CONTEXT + NBITS_RATEQ ) ) ), 2 << ( NBITS_CONTEXT + NBITS_RATEQ ) );
    1382             : 
    1383             :                 /* check while condition */
    1384             :             }
    1385             : #endif
    1386    83235547 :             pki = lookup[lev1];
    1387             : 
    1388    83235547 :             symbol = add( a1, i_mult( A_THRES, b1 ) ); /* Q0 */
    1389    83235547 :             bit_estimate_fx = W_add( bit_estimate_fx, ari_bit_estimate_s17_LC_fx[pki][symbol] );
    1390             : 
    1391             : #ifdef OPT_SBA_ENC_V2_BE
    1392    83235547 :             IF( GT_32( W_shl_sat_l( bit_estimate_fx, -Q8 ), target_Q15 ) ) // Q15
    1393             : #else
    1394             :             /* Should we truncate? */
    1395             :             IF( GT_32( W_extract_l( W_shr( bit_estimate_fx, Q8 ) ), L_shl( target, Q15 ) ) )
    1396             : #endif
    1397             :             {
    1398    13807937 :                 stop2 = 1;
    1399    13807937 :                 move16();
    1400             : 
    1401    13807937 :                 IF( *stop )
    1402             :                 {
    1403      156941 :                     BREAK;
    1404             :                 }
    1405             :             }
    1406             :             ELSE
    1407             :             {
    1408    69427610 :                 lastnz2 = add( b1_i, 1 );
    1409    69427610 :                 nbits2_fx = bit_estimate_fx;
    1410    69427610 :                 move64();
    1411             :             }
    1412             : 
    1413             :             /* Update context for next 2-tuple */
    1414    83078606 :             IF( EQ_32( p1, p2 ) ) /* peak-peak or hole-hole context */
    1415             :             {
    1416    68262259 :                 lev1 = shr( lev1, NBITS_CONTEXT + NBITS_RATEQ );
    1417             : 
    1418             : #ifdef OPT_SBA_ENC_V2_BE
    1419    68262259 :                 t = add( 13, lev1 );
    1420    68262259 :                 IF( lev1 <= 0 )
    1421             :                 {
    1422    66591359 :                     t = add( 1, i_mult( add( a1, b1 ), add( lev1, 2 ) ) );
    1423             :                 }
    1424             : #else
    1425             :                 IF( lev1 <= 0 )
    1426             :                 {
    1427             :                     t = add( 1, i_mult( add( a1, b1 ), add( lev1, 2 ) ) );
    1428             :                 }
    1429             :                 ELSE
    1430             :                 {
    1431             :                     t = add( 13, lev1 );
    1432             :                 }
    1433             : #endif
    1434             : 
    1435    68262259 :                 *ctx = L_add( imult3216( L_and( *ctx, 0xf ), 16 ), t );
    1436    68262259 :                 move32();
    1437             :             }
    1438             :             ELSE
    1439             :             {
    1440             :                 /* mixed context */
    1441             : 
    1442    14816347 :                 IF( s_and( idx1, 1 ) )
    1443             :                 {
    1444             :                     /* update first context */
    1445     7403798 :                     c[p1] = update_mixed_context_ivas_fx( c[p1], abs_s( x[a1_i] ) ); /* Q0 */
    1446     7403798 :                     move32();
    1447             :                 }
    1448             : 
    1449    14816347 :                 IF( s_and( idx2, 1 ) )
    1450             :                 {
    1451             :                     /* update second context */
    1452     7391844 :                     c[p2] = update_mixed_context_ivas_fx( c[p2], abs_s( x[b1_i] ) ); /* Q0 */
    1453     7391844 :                     move32();
    1454             :                 }
    1455             :             }
    1456             : 
    1457             :         } /*end of the 2-tuples loop*/
    1458             : #ifdef OPT_SBA_ENC_V2_BE
    1459      399500 :         total_output_bits = round_fx( W_shl_sat_l( bit_estimate_fx, -Q7 ) ); /* Q23 -> Q16 -> Q0 */
    1460             : #else
    1461             :         total_output_bits = round_fx( W_extract_l( W_shr( bit_estimate_fx, Q7 ) ) );   /* Q23 -> Q16 -> Q0 */
    1462             : #endif
    1463      399500 :         IF( *stop )
    1464             :         {
    1465             : #ifdef OPT_SBA_ENC_V2_BE
    1466      168835 :             total_output_bits = round_fx( W_shl_sat_l( nbits2_fx, -Q7 ) ); /* Q23 -> Q16 -> Q0 */
    1467             : #else
    1468             :             total_output_bits = round_fx( W_extract_l( W_shr( nbits2_fx, Q7 ) ) );     /* Q23 -> Q16 -> Q0 */
    1469             : #endif
    1470             :         }
    1471             : 
    1472      399500 :         if ( stop2 )
    1473             :         {
    1474      326338 :             stop2 = total_output_bits; /* Q0 */
    1475      326338 :             move16();
    1476             :         }
    1477             : 
    1478      399500 :         *nEncoded = lastnz2; /* Q0 */
    1479      399500 :         move16();
    1480      399500 :         *stop = stop2; /* If zero, it means no overflow occured during bit-estimation    Q0*/
    1481      399500 :         move16();
    1482      399500 :         *lastnz_out = lastnz; /* Q0 */
    1483      399500 :         move16();
    1484             : 
    1485             :         /* Restore hole indices beyond lastnz */
    1486   134628308 :         FOR( k = numHoleIndices; k < hm_cfg->numHoleIndices; ++k )
    1487             :         {
    1488   134228808 :             hm_cfg->holeIndices[k] = sub( hm_cfg->holeIndices[k], nt ); /* Q0 */
    1489   134228808 :             move16();
    1490             :         }
    1491      399500 :         hm_cfg->numPeakIndices = numPeakIndicesOrig; /* Q0 */
    1492      399500 :         move16();
    1493             : 
    1494             : #ifdef OPT_SBA_ENC_V2_BE
    1495      399500 :         return round_fx( L_add( W_shl_sat_l( nbits2_fx, -Q7 ), ONE_IN_Q14 ) ); /* Q0 */
    1496             : #else
    1497             :         return round_fx( L_add( W_extract_l( W_shr( nbits2_fx, Q7 ) ), ONE_IN_Q14 ) ); /* Q0 */
    1498             : #endif
    1499             :     }
    1500             :     ELSE /* if (!hm_cfg) */
    1501             :     {
    1502             :         Word16 esc_nb, cp, rateQ;
    1503             :         UWord16 s;
    1504             :         Word16 tot_bits2;
    1505     3486980 :         Word16 overflow_flag = 0;
    1506     3486980 :         move16();
    1507             : 
    1508             :         /* Rate flag */
    1509     3486980 :         IF( GT_16( target, 400 ) )
    1510             :         {
    1511     2650867 :             rateFlag = 2; /* Q0 */
    1512     2650867 :             move16();
    1513             :         }
    1514             :         ELSE
    1515             :         {
    1516      836113 :             rateFlag = 0; /* Select context-B for lower bitrates */
    1517      836113 :             move16();
    1518             :         }
    1519             : 
    1520     3486980 :         t = 0;
    1521     3486980 :         move16();
    1522     3486980 :         s = 0;
    1523     3486980 :         move16();
    1524     3486980 :         cp = 0;
    1525     3486980 :         move16();
    1526     3486980 :         lastnz = 1;
    1527     3486980 :         move16();
    1528     3486980 :         lastnz2 = 0;
    1529     3486980 :         move16();
    1530     3486980 :         tot_bits2 = 0;
    1531     3486980 :         move16();
    1532             : 
    1533             :         /* Find last non-zero tuple in the mapped domain signal */
    1534   590286159 :         FOR( lastnz = sub( nt, 2 ); lastnz >= 0; lastnz -= 2 )
    1535             :         {
    1536   590272471 :             test();
    1537   590272471 :             IF( ( x[lastnz] != 0 ) || ( x[lastnz + 1] != 0 ) )
    1538             :             {
    1539             :                 BREAK;
    1540             :             }
    1541             :         }
    1542     3486980 :         lastnz = add( lastnz, 2 ); /* Q0 */
    1543     3486980 :         IF( LT_16( lastnz, 2 ) )
    1544             :         {
    1545       13688 :             lastnz = 2; /* At least one tuple is coded    Q0*/
    1546       13688 :             move16();
    1547             :         }
    1548             : 
    1549     3486980 :         lastnz2 = 2;
    1550     3486980 :         move16();
    1551             : 
    1552             :         /* Main Loop through the 2-tuples */
    1553   776407841 :         FOR( k = 0; k < lastnz; k += 2 )
    1554             :         {
    1555             :             /* Init current 2-tuple encoding */
    1556   772920861 :             a1 = abs_s( x[k] );     /* Q0 */
    1557   772920861 :             b1 = abs_s( x[k + 1] ); /* Q0 */
    1558   772920861 :             lev1 = 0;
    1559   772920861 :             move16();
    1560   772920861 :             esc_nb = 0;
    1561   772920861 :             move16();
    1562   772920861 :             rateQ = add( rateFlag, extract_l( GT_16( k, shr( nt, 1 ) ) ) ); /* Q0 */
    1563             : 
    1564   772920861 :             bit_estimate_fx = W_add( bit_estimate_fx, MAKE_VARIABLE_QX( s_min( a1, 1 ), Q23 ) );
    1565   772920861 :             bit_estimate_fx = W_add( bit_estimate_fx, MAKE_VARIABLE_QX( s_min( b1, 1 ), Q23 ) );
    1566             : 
    1567             :             /* pre-compute address of ari_pk_s17_LC_ext[0][Val_esc] to avoid doing it multiple times inside the loop */
    1568   772920861 :             lookup = &ari_lookup_s17_LC[t + shl( rateQ, NBITS_CONTEXT )]; /* Q0 */
    1569             : 
    1570             :             /* check while condition */
    1571             :             /* MSBs coding */
    1572             : #ifdef OPT_SBA_ENC_V2_BE
    1573   921819652 :             FOR( ; s_max( a1, b1 ) >= A_THRES; )
    1574             :             {
    1575   148898791 :                 pki = lookup[( esc_nb << ( NBITS_CONTEXT + NBITS_RATEQ ) )]; /* Q0 */
    1576             : 
    1577   148898791 :                 bit_estimate_fx = W_add( bit_estimate_fx, ari_bit_estimate_s17_LC_fx[pki][VAL_ESC] );
    1578   148898791 :                 bit_estimate_fx = W_add( bit_estimate_fx, MAKE_NUMBER_QX( 2, Q23 ) );
    1579             : 
    1580   148898791 :                 a1 = shr( a1, 1 );
    1581   148898791 :                 b1 = shr( b1, 1 );
    1582             : 
    1583   148898791 :                 lev1 = add( lev1, 1 );
    1584   148898791 :                 esc_nb = s_min( lev1, 3 );
    1585             :             }
    1586             : #else
    1587             :             WHILE( GE_16( s_max( a1, b1 ), A_THRES ) )
    1588             :             {
    1589             :                 pki = lookup[( esc_nb << ( NBITS_CONTEXT + NBITS_RATEQ ) )]; /* Q0 */
    1590             :                 move16();
    1591             : 
    1592             :                 bit_estimate_fx = W_add( bit_estimate_fx, ari_bit_estimate_s17_LC_fx[pki][VAL_ESC] );
    1593             :                 bit_estimate_fx = W_add( bit_estimate_fx, MAKE_NUMBER_QX( 2, Q23 ) );
    1594             : 
    1595             :                 a1 = shr( a1, 1 );
    1596             :                 b1 = shr( b1, 1 );
    1597             : 
    1598             :                 lev1 = add( lev1, 1 );
    1599             :                 esc_nb = s_min( lev1, 3 );
    1600             : 
    1601             :                 /* check while condition */
    1602             :             }
    1603             : #endif
    1604   772920861 :             pki = lookup[( esc_nb << ( NBITS_CONTEXT + NBITS_RATEQ ) )]; /* Q0 */
    1605             : 
    1606   772920861 :             symbol = add( a1, i_mult( A_THRES, b1 ) ); /* Q0 */
    1607   772920861 :             bit_estimate_fx = W_add( bit_estimate_fx, ari_bit_estimate_s17_LC_fx[pki][symbol] );
    1608             : 
    1609             :             /* Should we truncate? */
    1610             : #ifdef OPT_SBA_ENC_V2_BE
    1611   772920861 :             IF( GT_32( W_shl_sat_l( bit_estimate_fx, -Q8 ), target_Q15 ) ) // Q15
    1612             : #else
    1613             :             IF( GT_32( W_extract_l( W_shr( bit_estimate_fx, Q8 ) ), L_shl( target, Q15 ) ) )
    1614             : #endif
    1615             :             {
    1616    26958122 :                 overflow_flag = 1;
    1617    26958122 :                 move16();
    1618             :             }
    1619             :             ELSE
    1620             :             {
    1621   745962739 :                 IF( abs_s( x[k] ) || abs_s( x[k + 1] ) ) /* No overflow & non-zero tuple */
    1622             :                 {
    1623   450180323 :                     nbits2_fx = bit_estimate_fx; /* exp(bit_estimate_e) */
    1624   450180323 :                     move64();
    1625             : 
    1626   450180323 :                     lastnz2 = add( k, 2 );
    1627             :                 }
    1628             :             }
    1629             : 
    1630             : #ifdef OPT_SBA_ENC_V2_BE
    1631             :             /* Update context for next 2-tuple */
    1632   772920861 :             cp = add( 1, i_mult( add( a1, b1 ), add( esc_nb, 1 ) ) ); /* Q0 */
    1633   772920861 :             if ( GE_16( esc_nb, 2 ) )
    1634             :             {
    1635    36927925 :                 cp = add( 12, esc_nb ); /* Q0 */
    1636             :             }
    1637             : #else
    1638             :             /* Update context for next 2-tuple */
    1639             :             IF( LT_16( esc_nb, 2 ) )
    1640             :             {
    1641             :                 cp = add( 1, i_mult( add( a1, b1 ), add( esc_nb, 1 ) ) ); /* Q0 */
    1642             :             }
    1643             :             ELSE
    1644             :             {
    1645             :                 cp = add( 12, esc_nb ); /* Q0 */
    1646             :             }
    1647             : #endif
    1648             :             /*shift old bits and replace last 4 bits*/
    1649   772920861 :             s = (UWord16) L_add( L_shl( s, 4 ), cp );
    1650   772920861 :             t = s_and( s, 0xFF );
    1651             :         } /*end of the 2-tuples loop*/
    1652             : 
    1653             : #ifdef OPT_SBA_ENC_V2_BE
    1654     3486980 :         tot_bits2 = round_fx( W_shl_sat_l( nbits2_fx, -Q7 ) );                   /* Q23 -> Q16 -> Q0 */
    1655     3486980 :         round_bit_estimate_fx = round_fx( W_shl_sat_l( bit_estimate_fx, -Q7 ) ); /* Q23 -> Q16 -> Q0 */
    1656             : #else
    1657             :         tot_bits2 = round_fx( W_extract_l( W_shr( nbits2_fx, Q7 ) ) ); /* Q23 -> Q16 -> Q0 */
    1658             : #endif
    1659     3486980 :         if ( LT_16( lastnz2, lastnz ) ) /* Overflow occured because unable to code all tuples */
    1660             :         {
    1661     1430012 :             overflow_flag = 1;
    1662     1430012 :             move16();
    1663             :         }
    1664             : #ifdef OPT_SBA_ENC_V2_BE
    1665     3486980 :         if ( EQ_16( mode, -1 ) )
    1666             :         {
    1667           0 :             tot_bits2 = round_bit_estimate_fx;
    1668           0 :             move16();
    1669             :         }
    1670             : #else
    1671             :         IF( EQ_16( mode, -1 ) )
    1672             :         {
    1673             :             tot_bits2 = round_fx( W_shl_sat_l( bit_estimate_fx, -Q7 ) ); /* Q23 -> Q16 -> Q0 */
    1674             :         }
    1675             : #endif
    1676             : #ifdef OPT_SBA_ENC_V2_BE
    1677     3486980 :         if ( overflow_flag == 0 ) /* No overflow */
    1678             :         {
    1679     2056968 :             *stop = 0;
    1680     2056968 :             move16();
    1681             :         }
    1682     3486980 :         IF( overflow_flag != 0 ) /* Overflow */
    1683             :         {
    1684     1430012 :             IF( *stop )
    1685             :             {
    1686        9686 :                 *stop = tot_bits2; /* Q0 */
    1687        9686 :                 move16();
    1688             :             }
    1689             :             ELSE
    1690             :             {
    1691     1420326 :                 *stop = round_bit_estimate_fx;
    1692     1420326 :                 move16();
    1693             :             }
    1694             :         }
    1695             : #else
    1696             :         IF( overflow_flag == 0 ) /* No overflow */
    1697             :         {
    1698             :             *stop = 0;
    1699             :             move16();
    1700             :         }
    1701             :         ELSE /* Overflow */
    1702             :         {
    1703             :             IF( *stop )
    1704             :             {
    1705             :                 *stop = tot_bits2; /* Q0 */
    1706             :                 move16();
    1707             :             }
    1708             :             ELSE
    1709             :             {
    1710             :                 *stop = round_fx( W_extract_l( W_shr( bit_estimate_fx, Q7 ) ) ); /* Q23 -> Q16 -> Q0 */
    1711             :                 move16();
    1712             :             }
    1713             :         }
    1714             : #endif
    1715             : 
    1716     3486980 :         *lastnz_out = lastnz; /* Q0 */
    1717     3486980 :         move16();
    1718     3486980 :         *nEncoded = lastnz2; /* Q0 */
    1719     3486980 :         move16();
    1720             :         /* Safety mechanism to avoid overflow */
    1721     3486980 :         test();
    1722     3486980 :         IF( EQ_16( lastnz2, 2 ) && EQ_16( overflow_flag, 1 ) )
    1723             :         {
    1724         174 :             FOR( k = 0; k < lastnz2; k++ )
    1725             :             {
    1726         116 :                 x[k] = 0;
    1727         116 :                 move16();
    1728             :             }
    1729             :         }
    1730             : 
    1731     3486980 :         return tot_bits2;
    1732             :     }
    1733             : }
    1734             : 
    1735             : 
    1736             : /*-------------------------------------------------------------------*
    1737             :  * RCcontextMapping_encode2_estimate_bandWise_start_fx()
    1738             :  *
    1739             :  * Range coder - start bandwise bit-estimation
    1740             :  *-------------------------------------------------------------------*/
    1741             : 
    1742      552892 : Word16 RCcontextMapping_encode2_estimate_bandWise_start_fx(
    1743             :     Word16 *x,           /* Q0 */
    1744             :     const Word16 nt,     /* Q0 */
    1745             :     const Word16 target, /* Q0 */
    1746             :     HANDLE_RC_CONTEXT_MEM hContextMem )
    1747             : {
    1748             :     Word16 i, k;
    1749             : 
    1750             :     /* Rate flag */
    1751      552892 :     IF( GT_16( target, 400 ) )
    1752             :     {
    1753      543524 :         hContextMem->rateFlag = 2 << NBITS_CONTEXT;
    1754      543524 :         move16();
    1755             :     }
    1756             :     ELSE
    1757             :     {
    1758        9368 :         hContextMem->rateFlag = 0;
    1759        9368 :         move16();
    1760             :     }
    1761             : 
    1762      552892 :     hContextMem->bit_estimate_fx = MAKE_NUMBER_QX( 2, Q23 );
    1763      552892 :     move64();
    1764             : 
    1765             : 
    1766             :     /* Init */
    1767      552892 :     hContextMem->nt_half = shr( nt, 1 );
    1768      552892 :     move16();
    1769             : 
    1770             :     /* bits to encode lastnz */
    1771      552892 :     k = 1;
    1772      552892 :     move16();
    1773             : 
    1774     5206056 :     WHILE( LT_16( k, hContextMem->nt_half ) )
    1775             :     {
    1776     4653164 :         hContextMem->bit_estimate_fx = W_add( hContextMem->bit_estimate_fx, MAKE_NUMBER_QX( 1, Q23 ) );
    1777     4653164 :         move64();
    1778             : 
    1779     4653164 :         k = shl( k, 1 );
    1780             :         /* check while condition */
    1781             :     }
    1782             : 
    1783             :     /* bits to encode lastnz */
    1784      552892 :     hContextMem->nbits_old = round_fx( W_extract_l( W_shr( hContextMem->bit_estimate_fx, Q7 ) ) ); /* Q0 */
    1785      552892 :     move16();
    1786             : 
    1787      552892 :     hContextMem->ctx = 0;
    1788      552892 :     move16();
    1789      552892 :     hContextMem->lastnz = 2;
    1790      552892 :     move16();
    1791             : 
    1792             :     /* Find last non-zero tuple  */
    1793             : 
    1794     8218850 :     FOR( i = nt; i >= 4; i -= 2 )
    1795             :     {
    1796     8218203 :         test();
    1797     8218203 :         IF( x[i - 2] != 0 || x[i - 1] != 0 )
    1798             :         {
    1799      552245 :             hContextMem->lastnz = i;
    1800      552245 :             move16();
    1801      552245 :             BREAK;
    1802             :         }
    1803             :     }
    1804             : 
    1805      552892 :     return hContextMem->nbits_old;
    1806             : }
    1807             : 
    1808             : /*-------------------------------------------------------------------*
    1809             :  * RCcontextMapping_encode2_estimate_bandWise_fx()
    1810             :  *
    1811             :  * Range coder - bandwise bit-estimation
    1812             :  *-------------------------------------------------------------------*/
    1813             : 
    1814    21943852 : Word16 RCcontextMapping_encode2_estimate_bandWise_fx(
    1815             :     Word16 *x,               /* Q0 */
    1816             :     const Word16 start_line, /* Q0 */
    1817             :     const Word16 end_line,   /* Q0 */
    1818             :     HANDLE_RC_CONTEXT_MEM hContextMem )
    1819             : {
    1820             :     Word16 a1, b1, a1_i, b1_i;
    1821             :     Word16 k, pki, lev1;
    1822             :     UWord16 t;
    1823    21943852 :     Word16 bandBits = 0;
    1824    21943852 :     move16();
    1825             :     Word16 total_output_bits; /* No. of bits after finalization */
    1826             :     Word16 symbol;
    1827             :     const UWord8 *lookup;
    1828             :     Word16 idx;
    1829             :     Word16 tmp;
    1830             : 
    1831             :     /* Main Loop through the 2-tuples */
    1832             :     /*hContextMem->nt_half = end_line >> 1;*/
    1833    21943852 :     Word16 len = s_min( hContextMem->lastnz, end_line );
    1834   172154708 :     FOR( k = start_line; k < len; k += 2 )
    1835             :     {
    1836   150210856 :         a1_i = k; /* Q0 */
    1837   150210856 :         move16();
    1838   150210856 :         b1_i = add( k, 1 ); /* Q0 */
    1839             : 
    1840   150210856 :         idx = k;
    1841   150210856 :         move16();
    1842             : 
    1843             :         /* Get context */
    1844   150210856 :         t = add( hContextMem->ctx, hContextMem->rateFlag ); /* Q0 */
    1845             : 
    1846             : #ifdef OPT_SBA_ENC_V2_BE
    1847   150210856 :         tmp = ( 1 << NBITS_CONTEXT );
    1848   150210856 :         move16();
    1849   150210856 :         if ( GE_16( hContextMem->nt_half, idx ) )
    1850             :         {
    1851    78897473 :             tmp = 0;
    1852    78897473 :             move16();
    1853             :         }
    1854             : #else
    1855             :         IF( GE_16( hContextMem->nt_half, idx ) )
    1856             :         {
    1857             :             tmp = 0;
    1858             :         }
    1859             :         ELSE
    1860             :         {
    1861             :             tmp = ( 1 << NBITS_CONTEXT );
    1862             :         }
    1863             : #endif
    1864             : 
    1865   150210856 :         t = add( t, tmp ); /* Q0 */
    1866             : 
    1867             :         /* Init current 2-tuple encoding */
    1868   150210856 :         a1 = abs_s( x[a1_i] );                            /* Q0 */
    1869   150210856 :         b1 = abs_s( x[b1_i] );                            /* Q0 */
    1870   150210856 :         lev1 = -( 1 << ( NBITS_CONTEXT + NBITS_RATEQ ) ); /* Q0 */
    1871             : 
    1872             :         /* Signs Bits */
    1873   150210856 :         hContextMem->bit_estimate_fx = W_add( hContextMem->bit_estimate_fx, MAKE_VARIABLE_QX( s_min( a1, 1 ), Q23 ) );
    1874   150210856 :         hContextMem->bit_estimate_fx = W_add( hContextMem->bit_estimate_fx, MAKE_VARIABLE_QX( s_min( b1, 1 ), Q23 ) );
    1875             : 
    1876   150210856 :         move32();
    1877   150210856 :         move32();
    1878             : 
    1879             :         /* pre-compute address of ari_pk_s17_LC_ext[0][Val_esc] to avoid doing it multiple times inside the loop */
    1880   150210856 :         lookup = &ari_lookup_s17_LC[t] + ( 1 << ( NBITS_CONTEXT + NBITS_RATEQ ) );
    1881             : 
    1882             :         /* check while condition */
    1883             :         /* MSBs coding */
    1884             : #ifdef OPT_SBA_ENC_V2_BE
    1885   181416096 :         FOR( ; s_max( a1, b1 ) >= A_THRES; )
    1886             : #else
    1887             :         WHILE( GE_16( s_max( a1, b1 ), A_THRES ) )
    1888             : #endif
    1889             :         {
    1890    31205240 :             pki = lookup[lev1]; /* Q0 */
    1891             : 
    1892    31205240 :             hContextMem->bit_estimate_fx = W_add( hContextMem->bit_estimate_fx, ari_bit_estimate_s17_LC_fx[pki][VAL_ESC] );
    1893    31205240 :             hContextMem->bit_estimate_fx = W_add( hContextMem->bit_estimate_fx, MAKE_NUMBER_QX( 2, Q23 ) );
    1894    31205240 :             move64();
    1895    31205240 :             move64();
    1896             : 
    1897             : 
    1898             :             // hContextMem->bit_estimate = hContextMem->bit_estimate + ari_bit_estimate_s17_LC[pki][VAL_ESC];
    1899             :             // hContextMem->bit_estimate += 2; /* Add the 2 LSB bits that were shifted out */
    1900             : 
    1901    31205240 :             a1 = shr( a1, 1 );
    1902    31205240 :             b1 = shr( b1, 1 );
    1903             : 
    1904    31205240 :             lev1 = s_min( add( lev1, ( 1 << ( NBITS_CONTEXT + NBITS_RATEQ ) ) ), 2 << ( NBITS_CONTEXT + NBITS_RATEQ ) ); /* Q0 */
    1905             :                                                                                                                          /* check while condition */
    1906             :         }
    1907             : 
    1908   150210856 :         pki = lookup[lev1]; /* Q0 */
    1909             : 
    1910   150210856 :         symbol = add( a1, i_mult( A_THRES, b1 ) ); /* MSB symbol    Q0*/
    1911   150210856 :         hContextMem->bit_estimate_fx = W_add( hContextMem->bit_estimate_fx, ari_bit_estimate_s17_LC_fx[pki][symbol] );
    1912             : 
    1913   150210856 :         move64();
    1914             :         // hContextMem->bit_estimate = hContextMem->bit_estimate + ari_bit_estimate_s17_LC[pki][symbol];
    1915             : 
    1916             :         /* Update context */
    1917   150210856 :         lev1 = shr( lev1, NBITS_CONTEXT + NBITS_RATEQ );
    1918             : 
    1919             : #ifdef OPT_SBA_ENC_V2_BE
    1920   150210856 :         t = add( 1, i_mult( add( a1, b1 ), add( lev1, 2 ) ) ); /* Q0 */
    1921   150210856 :         if ( lev1 > 0 )
    1922             :         {
    1923     7801807 :             t = add( 13, lev1 ); /* Q0 */
    1924             :         }
    1925             : #else
    1926             :         IF( lev1 <= 0 )
    1927             :         {
    1928             :             t = add( 1, i_mult( add( a1, b1 ), add( lev1, 2 ) ) ); /* Q0 */
    1929             :         }
    1930             :         ELSE
    1931             :         {
    1932             :             t = add( 13, lev1 ); /* Q0 */
    1933             :         }
    1934             : #endif
    1935   150210856 :         hContextMem->ctx = add( i_mult( s_and( hContextMem->ctx, 0xf ), 16 ), t ); /* Q0 */
    1936   150210856 :         move16();
    1937             : 
    1938             :     } /*end of the 2-tuples loop*/
    1939             : #ifdef OPT_SBA_ENC_V2_BE
    1940    21943852 :     total_output_bits = round_fx( W_shl_sat_l( hContextMem->bit_estimate_fx, -Q7 ) ); /* Q0 */
    1941             : #else
    1942             :     total_output_bits = round_fx( W_extract_l( W_shr( hContextMem->bit_estimate_fx, Q7 ) ) ); /* Q0 */
    1943             : #endif
    1944             :     // total_output_bits = (Word16) ( hContextMem->bit_estimate + 0.5f );
    1945             : 
    1946             : 
    1947    21943852 :     bandBits = sub( total_output_bits, hContextMem->nbits_old ); /* Q0 */
    1948    21943852 :     hContextMem->nbits_old = total_output_bits;                  /* Q0 */
    1949    21943852 :     move16();
    1950             : 
    1951    21943852 :     return bandBits;
    1952             : }

Generated by: LCOV version 1.14