LCOV - code coverage report
Current view: top level - lib_enc - ACcontextMapping_enc_fx.c (source / functions) Hit Total Coverage
Test: Coverage on main @ e95243e9e67ddeb69dddf129509de1b3d95b402e Lines: 780 828 94.2 %
Date: 2025-09-14 03:13:15 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         634 : 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         634 :     a1 = 0; /* to avoid compilation warnings */
      63         634 :     b1 = 0; /* to avoid compilation warnings */
      64         634 :     move16();
      65         634 :     move16();
      66             : 
      67             :     /* Rate flag */
      68         634 :     rateFlag = 0;
      69         634 :     move16();
      70         634 :     if ( GT_16( nbbits, 400 ) )
      71             :     {
      72          45 :         rateFlag = 2 << NBITS_CONTEXT;
      73          45 :         move16();
      74             :     }
      75             : 
      76             :     /* Init */
      77         634 :     nt_half = shr( nt, 1 );
      78         634 :     c[0] = c[1] = 0;
      79         634 :     move16();
      80         634 :     move16();
      81             : 
      82             :     /* Bits for encoding the number of encoded tuples */
      83         634 :     nbbits_ntuples = sub( 14, norm_s( negate( nt ) ) ); /* Q0 */
      84             : 
      85         634 :     t = 0;
      86         634 :     move16();
      87         634 :     bp = nbbits_ntuples; /* Q0 */
      88         634 :     move16();
      89         634 :     nbbits_signs = 0;
      90         634 :     move16();
      91         634 :     nbbits_lsbs = 0;
      92         634 :     move16();
      93         634 :     nbbits_m2 = sub( nbbits, 2 ); /* Q0 */
      94         634 :     flag_overflow = 0;
      95         634 :     move16();
      96             : 
      97         634 :     IF( hm_cfg ) /* mapped domain */
      98             :     {
      99          54 :         numPeakIndicesOrig = hm_cfg->numPeakIndices; /* Q0 */
     100          54 :         move16();
     101          54 :         hm_cfg->numPeakIndices = s_min( hm_cfg->numPeakIndices, lastnz ); /* Q0 */
     102          54 :         move16();
     103          54 :         numHoleIndices = sub( lastnz, hm_cfg->numPeakIndices ); /* Q0 */
     104             : 
     105             :         /* Mark hole indices beyond lastnz as pruned */
     106       23944 :         FOR( k = numHoleIndices; k < hm_cfg->numHoleIndices; ++k )
     107             :         {
     108       23890 :             hm_cfg->holeIndices[k] = add( hm_cfg->holeIndices[k], nt ); /* Q0 */
     109       23890 :             move16();
     110             :         }
     111             : 
     112          54 :         ii[0] = numPeakIndicesOrig; /* Q0 */
     113          54 :         move16();
     114          54 :         ii[1] = 0;
     115          54 :         move16();
     116             : 
     117          54 :         get_next_coeff = get_next_coeff_mapped; /* Q0 */
     118          54 :         move16();
     119             :     }
     120             :     ELSE /* unmapped domain */
     121             :     {
     122         580 :         ii[0] = 0;
     123         580 :         move16();
     124             : 
     125         580 :         p1 = p2 = 0;
     126         580 :         move16();
     127         580 :         move16();
     128             : 
     129         580 :         get_next_coeff = get_next_coeff_unmapped; /* Q0 */
     130         580 :         move16();
     131             : 
     132             :         /* Find last non-zero tuple */
     133             :         /* ensure termination of while loop by dummy value */
     134         580 :         a1 = x[0];
     135         580 :         move16();
     136         580 :         x[0] = 1;
     137         580 :         move16();
     138             : 
     139        2281 :         WHILE( s_or( x[lastnz - 1], x[lastnz - 2] ) == 0 )
     140             :         {
     141        1701 :             lastnz = sub( lastnz, 2 ); /* Q0 */
     142             :         }
     143         580 :         x[0] = a1;
     144         580 :         move16();
     145             :     }
     146             : 
     147         634 :     lsbs_bits2 = ptr + nbbits - 1;
     148             : 
     149             :     /*Start Encoding*/
     150         634 :     ari_start_encoding_14bits_fx( &as );
     151             : 
     152             :     /*Main Loop through the 2-tuples*/
     153         634 :     b1_i = -1;
     154         634 :     move16();
     155       65586 :     FOR( k = 0; k < lastnz; k += 2 )
     156             :     {
     157             :         /* First coefficient */
     158       64952 :         a1_i = get_next_coeff( ii, &p1, &idx1, hm_cfg ); /* Q0 */
     159             : 
     160             :         /* Second coefficient */
     161       64952 :         b1_i = get_next_coeff( ii, &p2, &idx2, hm_cfg ); /* Q0 */
     162             : 
     163       64952 :         idx = s_min( idx1, idx2 ); /* Q0 */
     164             : 
     165             :         /* Get context */
     166       64952 :         ctx = &c[s_or( p1, p2 )]; /* Q0 */
     167             :         /* _DIFF_FLOAT_FIX_  float is using t as UWord16 */
     168       64952 :         t = add( *ctx, rateFlag ); /* Q0 */
     169       64952 :         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       64952 :         if ( flag_overflow != 0 )
     176             :         {
     177           0 :             x[a1_i] = 0;
     178           0 :             move16();
     179             :         }
     180       64952 :         if ( flag_overflow != 0 )
     181             :         {
     182           0 :             x[b1_i] = 0;
     183           0 :             move16();
     184             :         }
     185             : 
     186       64952 :         a1 = abs_s( x[a1_i] ); /* Q0 */
     187       64952 :         b1 = abs_s( x[b1_i] ); /* Q0 */
     188             : 
     189       64952 :         lev1 = -1;
     190       64952 :         move16();
     191             : 
     192             :         /*Copy states*/
     193       64952 :         ari_copy_states_fx( &as, &as_overflow );
     194       64952 :         bp_overflow = bp; /* Q0 */
     195       64952 :         move16();
     196       64952 :         nbbits_signs_overflow = nbbits_signs; /* Q0 */
     197       64952 :         move16();
     198       64952 :         nbbits_lsbs_overflow = nbbits_lsbs; /* Q0 */
     199       64952 :         move16();
     200             : 
     201             :         /*Signs encoding*/
     202       64952 :         signs[nbbits_signs] = lshr( x[a1_i], 15 ); /* Q0 */
     203       64952 :         move16();
     204       64952 :         if ( a1 > 0 )
     205             :         {
     206       17178 :             nbbits_signs = add( nbbits_signs, 1 ); /* Q0 */
     207             :         }
     208       64952 :         signs[nbbits_signs] = lshr( x[b1_i], 15 ); /* Q0 */
     209       64952 :         move16();
     210       64952 :         if ( b1 > 0 )
     211             :         {
     212       16890 :             nbbits_signs = add( nbbits_signs, 1 ); /* Q0 */
     213             :         }
     214             : 
     215             :         /* MSBs coding */
     216       68798 :         WHILE( GE_16( s_max( a1, b1 ), A_THRES ) )
     217             :         {
     218        3846 :             tmp = add( t, Tab_esc_nb[lev1 + 1] ); /* Q0 */
     219        3846 :             assert( tmp >= 0 && tmp < 4096 );
     220        3846 :             pki = ari_lookup_s17_LC[tmp]; /* Q0 */
     221        3846 :             move16();
     222        3846 :             bp = ari_encode_14bits_ext_fx( ptr, bp, &as, VAL_ESC, ari_pk_s17_LC_ext[pki] ); /* Q0 */
     223             : 
     224        3846 :             *lsbs_bits2-- = s_and( a1, 1 );
     225        3846 :             move16();
     226        3846 :             *lsbs_bits2-- = s_and( b1, 1 );
     227        3846 :             move16();
     228             : 
     229             :             /* LSBs bit counting */
     230        3846 :             nbbits_lsbs = add( nbbits_lsbs, 2 ); /* Q0 */
     231             : 
     232        3846 :             a1 = shr( a1, 1 );
     233        3846 :             b1 = shr( b1, 1 );
     234             : 
     235        3846 :             lev1 = s_min( add( lev1, 1 ), 2 ); /* Q0 */
     236             :         }
     237             : 
     238       64952 :         tmp = add( t, Tab_esc_nb[lev1 + 1] ); /* Q0 */
     239       64952 :         assert( tmp >= 0 && tmp < 4096 );
     240       64952 :         pki = ari_lookup_s17_LC[tmp]; /* Q0 */
     241       64952 :         move16();
     242       64952 :         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       64952 :         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       64952 :         IF( EQ_16( p1, p2 ) ) /* peak-peak or hole-hole context */
     296             :         {
     297       64699 :             if ( lev1 > 0 )
     298         899 :                 t = add( 12, lev1 );
     299       64699 :             if ( lev1 <= 0 )
     300       63800 :                 t = add( a1, b1 );
     301       64699 :             if ( lev1 == 0 )
     302        1723 :                 t = add( t, t );
     303             : 
     304       64699 :             *ctx = add( shl( s_and( *ctx, 0xf ), 4 ), add( t, 1 ) ); /* Q0 */
     305       64699 :             move16();
     306             :         }
     307             :         ELSE /* mixed context */
     308             :         {
     309         253 :             IF( s_and( idx1, 1 ) ) /* update first context */
     310             :             {
     311         123 :                 c[p1] = update_mixed_context( c[p1], abs_s( x[a1_i] ) ); /* Q0 */
     312         123 :                 move16();
     313             :             }
     314             : 
     315         253 :             IF( s_and( idx2, 1 ) ) /* update second context */
     316             :             {
     317         130 :                 c[p2] = update_mixed_context( c[p2], abs_s( x[b1_i] ) ); /* Q0 */
     318         130 :                 move16();
     319             :             }
     320             :         }
     321             :     } /*end of the 2-tuples loop*/
     322             : 
     323             :     /* End arithmetic coder, overflow management */
     324         634 :     bp = ari_done_encoding_14bits_fx( ptr, bp, &as ); /* Q0 */
     325             : 
     326             :     /* Overflow is detected */
     327         634 :     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         634 :     value = sub( shr( lastnz, 1 ), 1 ); /* Q0 */
     346         634 :     push_next_indice( hBstr, value, nbbits_ntuples );
     347             : 
     348             :     /* Push arithmetic coded bits */
     349         634 :     push_next_bits( hBstr, (UWord16 *) &ptr[nbbits_ntuples], sub( bp, nbbits_ntuples ) );
     350             : 
     351             :     /* Push sign bits */
     352         634 :     push_next_bits( hBstr, (UWord16 *) signs, nbbits_signs );
     353         634 :     bp = add( bp, nbbits_signs ); /* Q0 */
     354             : 
     355             :     /*write residual Quantization bits*/
     356         634 :     tmp = s_min( sub( sub( nbbits, bp ), nbbits_lsbs ), resQMaxBits ); /* Q0 */
     357        6744 :     FOR( k = 0; k < tmp; k++ )
     358             :     {
     359        6110 :         ptr[nbbits - 1 - nbbits_lsbs - k] = x[nt + k]; /* Q0 */
     360        6110 :         move16();
     361             :     }
     362             :     /* Write filler bits */
     363         634 :     tmp = sub( nbbits, add( bp, nbbits_lsbs ) ); /* Q0 */
     364        1738 :     FOR( ; k < tmp; ++k )
     365             :     {
     366        1104 :         ptr[nbbits - 1 - nbbits_lsbs - k] = 0;
     367        1104 :         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         634 :     assert( bp + k <= nbbits );
     373             : 
     374             :     /* Push the rest of the buffer */
     375         634 :     push_next_bits( hBstr, (UWord16 *) &ptr[bp], sub( nbbits, bp ) );
     376             : 
     377         634 :     return /*(bp+nbbits_lsbs)*/; /*return only for debug plot*/
     378             : }
     379             : /*-------------------------------------------------------------------*
     380             :  * find_last_nz_pair()
     381             :  *
     382             :  *
     383             :  *-------------------------------------------------------------------*/
     384        4362 : 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        4362 :     const Word16 *tmp = NULL;
     391             : 
     392        4362 :     if ( hm_cfg )
     393             :     {
     394        1333 :         tmp = hm_cfg->indexBuffer; /* Q0 */
     395        1333 :         move16();
     396             :     }
     397             : 
     398        4362 :     lobs[0] = 4;
     399        4362 :     move16();
     400        4362 :     lobs[1] = shr( length, 1 ); /* length/2 */
     401        4362 :     move16();
     402        4362 :     lobs[2] = add( lobs[1], shr( length, 2 ) ); /* Q0 */
     403        4362 :     move16();
     404        4362 :     lobs[3] = add( lobs[2], shr( length, 3 ) ); /* Q0 */
     405        4362 :     move16();
     406             : 
     407        4362 :     last_nz = 0;
     408        4362 :     move16();
     409        4362 :     i = length;
     410        4362 :     move16();
     411       16701 :     FOR( stage = 3; stage >= 0; --stage )
     412             :     {
     413       16696 :         IF( hm_cfg ) /* mapped kernel */
     414             :         {
     415      313367 :             FOR( ; i >= lobs[stage]; i -= 2 )
     416             :             {
     417      308775 :                 if ( x[tmp[i - 2]] != 0 )
     418             :                 {
     419       15621 :                     last_nz = s_max( last_nz, i ); /* Q0 */
     420             :                 }
     421      308775 :                 if ( x[tmp[i - 1]] != 0 )
     422             :                 {
     423       15492 :                     last_nz = s_max( last_nz, i ); /* Q0 */
     424             :                 }
     425             :             }
     426             :         }
     427             :         ELSE /* unmapped kernel */
     428             :         {
     429      991459 :             FOR( ; i >= lobs[stage]; i -= 2 )
     430             :             {
     431      979355 :                 if ( x[i - 2] != 0 )
     432             :                 {
     433       79974 :                     last_nz = s_max( last_nz, i ); /* Q0 */
     434             :                 }
     435      979355 :                 if ( x[i - 1] != 0 )
     436             :                 {
     437       78374 :                     last_nz = s_max( last_nz, i ); /* Q0 */
     438             :                 }
     439             :             }
     440             :         }
     441       16696 :         IF( last_nz > 0 )
     442             :         {
     443        4357 :             BREAK;
     444             :         }
     445             :     }
     446             : 
     447        4362 :     return s_max( last_nz, 2 );
     448             : }
     449             : /*-------------------------------------------------------------------*
     450             :  * ACcontextMapping_encode2_estimate_no_mem_s17_LC_fx()
     451             :  *
     452             :  *
     453             :  *-------------------------------------------------------------------*/
     454        4362 : 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        4362 :     Word16 numPeakIndicesOrig = 0, numHoleIndices = 0; /* initialize just to avoid compiler warning */
     480        4362 :     move16();
     481        4362 :     move16();
     482             :     get_next_coeff_function get_next_coeff;
     483             : 
     484             : 
     485             :     /* Rate flag */
     486        4362 :     rateFlag = 0;
     487        4362 :     move16();
     488        4362 :     if ( GT_16( target, 400 ) )
     489             :     {
     490         225 :         rateFlag = 2 << NBITS_CONTEXT; /* Q0 */
     491         225 :         move16();
     492             :     }
     493             : 
     494             :     /* proba coded on 14bits -> proba=1 */
     495        4362 :     proba = L_deposit_l( 16384 ); /* Q0 */
     496             : 
     497             :     /* Init */
     498        4362 :     nt_half = shr( nt, 1 );
     499        4362 :     stop2 = 0;
     500        4362 :     move16();
     501        4362 :     c[0] = c[1] = 0;
     502        4362 :     move16();
     503        4362 :     move16();
     504             : 
     505             :     /* bits to encode lastnz + 2 bits headroom */
     506        4362 :     nbits = sub( 2 + 14, norm_s( sub( nt, 1 ) ) ); /* Q0 */
     507        4362 :     nbits_old = nbits;                             /* Q0 */
     508        4362 :     move16();
     509        4362 :     nbits = sub( nbits, target ); /* Q0 */
     510             : 
     511             :     /* Find last non-zero tuple in the mapped domain signal */
     512        4362 :     lastnz = find_last_nz_pair( x, nt, hm_cfg ); /* Q0 */
     513             : 
     514             :     /* At least one tuple is coded */
     515        4362 :     lastnz2 = 2;
     516        4362 :     move16();
     517             : 
     518        4362 :     IF( hm_cfg ) /* mapped domain */
     519             :     {
     520        1333 :         numPeakIndicesOrig = hm_cfg->numPeakIndices; /* Q0 */
     521        1333 :         move16();
     522        1333 :         hm_cfg->numPeakIndices = s_min( hm_cfg->numPeakIndices, lastnz ); /* Q0 */
     523        1333 :         move16();
     524        1333 :         numHoleIndices = sub( lastnz, hm_cfg->numPeakIndices ); /* Q0 */
     525             : 
     526             :         /* Mark hole indices beyond lastnz as pruned */
     527      421521 :         FOR( k = numHoleIndices; k < hm_cfg->numHoleIndices; ++k )
     528             :         {
     529      420188 :             hm_cfg->holeIndices[k] = add( hm_cfg->holeIndices[k], nt ); /* Q0 */
     530      420188 :             move16();
     531             :         }
     532             : 
     533        1333 :         ii[0] = numPeakIndicesOrig; /* Q0 */
     534        1333 :         move16();
     535        1333 :         ii[1] = 0;
     536        1333 :         move16();
     537             : 
     538        1333 :         get_next_coeff = get_next_coeff_mapped; /* Q0 */
     539        1333 :         move16();
     540             :     }
     541             :     ELSE /* unmapped domain */
     542             :     {
     543        3029 :         ii[0] = 0;
     544        3029 :         move16();
     545             : 
     546        3029 :         p1 = p2 = 0;
     547        3029 :         move16();
     548        3029 :         move16();
     549             : 
     550        3029 :         get_next_coeff = get_next_coeff_unmapped; /* Q0 */
     551        3029 :         move16();
     552             :     }
     553             : 
     554             :     /* Main Loop through the 2-tuples */
     555      491124 :     FOR( k = 0; k < lastnz; k += 2 )
     556             :     {
     557             :         /* First coefficient */
     558      487298 :         a1_i = get_next_coeff( ii, &p1, &idx1, hm_cfg ); /* Q0 */
     559             : 
     560             :         /* Second coefficient */
     561      487298 :         b1_i = get_next_coeff( ii, &p2, &idx2, hm_cfg ); /* Q0 */
     562             : 
     563      487298 :         idx = s_min( idx1, idx2 ); /* Q0 */
     564             : 
     565             :         /* Get context */
     566      487298 :         ctx = &c[s_or( p1, p2 )]; /* Q0 */
     567             : 
     568      487298 :         t = add( *ctx, rateFlag ); /* Q0 */
     569      487298 :         if ( GT_16( idx, nt_half ) )
     570             :         {
     571       18213 :             t = add( t, 1 << NBITS_CONTEXT ); /* Q0 */
     572             :         }
     573             : 
     574             :         /* Init current 2-tuple encoding */
     575      487298 :         a1 = abs_s( x[a1_i] ); /* Q0 */
     576      487298 :         b1 = abs_s( x[b1_i] ); /* Q0 */
     577             : 
     578      487298 :         lev1 = -( 1 << ( NBITS_CONTEXT + NBITS_RATEQ ) );
     579      487298 :         move16();
     580             :         /* Signs Bits */
     581      487298 :         if ( a1 > 0 )
     582             :         {
     583      115475 :             nbits = add( nbits, 1 ); /* Q0 */
     584             :         }
     585             : 
     586      487298 :         if ( b1 > 0 )
     587             :         {
     588      113806 :             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      487298 :         lookup = (const Word8 *) ( &ari_lookup_s17_LC[t] + ( 1 << ( NBITS_CONTEXT + NBITS_RATEQ ) ) ); /* address calculation not counted */
     597      513662 :         WHILE( GE_16( s_max( a1, b1 ), A_THRES ) )
     598             :         {
     599       26364 :             pki = lookup[lev1];
     600       26364 :             move16();
     601       26364 :             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       26364 :             cum_freq_norm_e = norm_s( cum_freq[0] );
     605       26364 :             cum_freq_norm = shl( cum_freq[0], cum_freq_norm_e );
     606       26364 :             proba = Mpy_32_16_1( proba, cum_freq_norm );
     607       26364 :             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       26364 :             nlz = sub( norm_l( proba ), 2 );
     611       26364 :             proba = L_shl( proba, sub( nlz, 15 ) ); /* cum_freq_norm_e */
     612             : 
     613       26364 :             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       26364 :             a1 = shr( a1, 1 );
     618       26364 :             b1 = shr( b1, 1 );
     619       26364 :             lev1 = s_min( add( lev1, 1 << ( NBITS_CONTEXT + NBITS_RATEQ ) ), 2 << ( NBITS_CONTEXT + NBITS_RATEQ ) ); /* Q0 */
     620             :         }
     621             : 
     622      487298 :         pki = lookup[lev1]; /* Q0 */
     623      487298 :         move16();
     624      487298 :         symbol = add( a1, shl( b1, A_THRES_SHIFT ) ); /* Q0 */
     625      487298 :         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      487298 :         cum_freq_norm = sub( cum_freq[0], cum_freq[1] );
     629      487298 :         cum_freq_norm_e = norm_s( cum_freq_norm );
     630      487298 :         cum_freq_norm = shl( cum_freq_norm, cum_freq_norm_e );
     631      487298 :         proba = Mpy_32_16_1( proba, cum_freq_norm );
     632      487298 :         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      487298 :         nlz = sub( norm_l( proba ), 3 );
     636      487298 :         proba = L_shl( proba, sub( nlz, 14 ) ); /* cum_freq_norm_e */
     637             : 
     638      487298 :         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      487298 :         IF( nbits > 0 )
     645             :         {
     646       49833 :             stop2 = 1;
     647       49833 :             move16();
     648             : 
     649       49833 :             IF( *stop )
     650             :             {
     651         536 :                 BREAK;
     652             :             }
     653             :         }
     654             :         ELSE
     655             :         {
     656      437465 :             test();
     657      437465 :             test();
     658      437465 :             IF( hm_cfg || k == 0 || s_or( x[a1_i], x[b1_i] ) )
     659             :             {
     660      265866 :                 nbits_old = add( nbits, target ); /* Q0 */
     661      265866 :                 lastnz2 = add( b1_i, 1 );         /* Q0 */
     662             :             }
     663             :         }
     664             : 
     665             :         /* Update context for next 2-tuple */
     666      486762 :         IF( EQ_16( p1, p2 ) ) /* peak-peak or hole-hole context */
     667             :         {
     668      461700 :             lev1 = shr( lev1, NBITS_CONTEXT + NBITS_RATEQ ); /* Q0 */
     669      461700 :             if ( lev1 > 0 )
     670        5926 :                 t = add( 12, lev1 );
     671      461700 :             if ( lev1 <= 0 )
     672      455774 :                 t = add( a1, b1 );
     673      461700 :             if ( lev1 == 0 )
     674       11266 :                 t = add( t, t );
     675             : 
     676      461700 :             *ctx = add( shl( s_and( *ctx, 0xf ), 4 ), add( t, 1 ) ); /* Q0 */
     677      461700 :             move16();
     678             :         }
     679             :         ELSE /* mixed context */
     680             :         {
     681       25062 :             IF( s_and( idx1, 1 ) ) /* update first context */
     682             :             {
     683       12455 :                 c[p1] = update_mixed_context( c[p1], abs_s( x[a1_i] ) ); /* Q0 */
     684       12455 :                 move16();
     685             :             }
     686             : 
     687       25062 :             IF( s_and( idx2, 1 ) ) /* update second context */
     688             :             {
     689       12514 :                 c[p2] = update_mixed_context( c[p2], abs_s( x[b1_i] ) ); /* Q0 */
     690       12514 :                 move16();
     691             :             }
     692             :         }
     693             :     } /* end of the 2-tuples loop */
     694             : 
     695        4362 :     nbits = add( nbits, target ); /* Q0 */
     696             : 
     697             :     /* Output */
     698        4362 :     if ( *stop )
     699             :     {
     700         596 :         nbits = nbits_old; /* Q0 */
     701         596 :         move16();
     702             :     }
     703             : 
     704        4362 :     if ( stop2 )
     705             :     {
     706        2390 :         stop2 = nbits; /* Q0 */
     707        2390 :         move16();
     708             :     }
     709        4362 :     *nEncoded = lastnz2; /* Q0 */
     710        4362 :     move16();
     711        4362 :     *stop = stop2; /* Q0 */
     712        4362 :     move16();
     713        4362 :     if ( lastnz_out )
     714             :     {
     715        4362 :         *lastnz_out = lastnz; /* Q0 */
     716        4362 :         move16();
     717             :     }
     718             : 
     719        4362 :     IF( hm_cfg )
     720             :     {
     721             :         /* Restore hole indices beyond lastnz */
     722      421521 :         FOR( k = numHoleIndices; k < hm_cfg->numHoleIndices; ++k )
     723             :         {
     724      420188 :             hm_cfg->holeIndices[k] = sub( hm_cfg->holeIndices[k], nt ); /* Q0 */
     725      420188 :             move16();
     726             :         }
     727        1333 :         hm_cfg->numPeakIndices = numPeakIndicesOrig; /* Q0 */
     728        1333 :         move16();
     729             :     }
     730             : 
     731             : 
     732        4362 :     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      876812 : 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      876812 :     a1 = 0; /* to avoid compilation warnings */
     767      876812 :     b1 = 0; /* to avoid compilation warnings */
     768      876812 :     move16();
     769      876812 :     move16();
     770             : 
     771             :     /* Init */
     772      876812 :     nt_half = shr( nt, 1 );
     773             : 
     774             :     /* Bits for encoding the number of encoded tuples */
     775      876812 :     nbbits_ntuples = 0;
     776      876812 :     k = 1;
     777      876812 :     move16();
     778      876812 :     move16();
     779             : 
     780     8666021 :     WHILE( LT_16( k, shr( nt, 1 ) ) )
     781             :     {
     782     7789209 :         nbbits_ntuples = add( nbbits_ntuples, 1 ); /* Q0 */
     783     7789209 :         k = shl( k, 1 );
     784             :     }
     785             : 
     786      876812 :     t = 0;
     787      876812 :     nbbits_signs = 0;
     788      876812 :     nbbits_lsbs = 0;
     789      876812 :     move16();
     790      876812 :     move16();
     791      876812 :     move16();
     792             : 
     793      876812 :     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       12700 :         IF( GT_16( nbbits, 400 ) )
     804             :         {
     805        6027 :             rateFlag = 2 << NBITS_CONTEXT;
     806        6027 :             move16();
     807             :         }
     808             :         ELSE
     809             :         {
     810        6673 :             rateFlag = 0;
     811        6673 :             move16();
     812             :         }
     813             : 
     814       12700 :         c[0] = c[1] = 0;
     815       12700 :         move32();
     816       12700 :         move32();
     817             : 
     818             :         /* mapped domain */
     819       12700 :         numPeakIndicesOrig = hm_cfg->numPeakIndices;                      /* Q0 */
     820       12700 :         hm_cfg->numPeakIndices = s_min( hm_cfg->numPeakIndices, lastnz ); /* Q0 */
     821       12700 :         numHoleIndices = sub( lastnz, hm_cfg->numPeakIndices );           /* Q0 */
     822       12700 :         move16();
     823       12700 :         move16();
     824             : 
     825             :         /* Mark hole indices beyond lastnz as pruned */
     826     5512055 :         FOR( k = numHoleIndices; k < hm_cfg->numHoleIndices; ++k )
     827             :         {
     828     5499355 :             hm_cfg->holeIndices[k] = add( hm_cfg->holeIndices[k], nt ); /* Q0 */
     829     5499355 :             move16();
     830             :         }
     831             : 
     832       12700 :         ii[0] = numPeakIndicesOrig; /* Q0 */
     833       12700 :         ii[1] = 0;
     834       12700 :         move16();
     835       12700 :         move16();
     836             : 
     837       12700 :         p1 = p2 = 0; /* to avoid compilation warnings */
     838       12700 :         move16();
     839       12700 :         move16();
     840             : 
     841       12700 :         lsbs_bits = ptr + sub( nbbits, 1 );
     842             : 
     843             :         /*Start Encoding*/
     844             :         /* Initialize range encoder */
     845       12700 :         rc_uni_enc_init_fx( &rc_st_enc );
     846             : 
     847             :         /*Main Loop through the 2-tuples*/
     848       12700 :         b1_i = -1;
     849       12700 :         move16();
     850             : 
     851     2322197 :         FOR( k = 0; k < lastnz; k += 2 )
     852             :         {
     853     2309497 :             a1_i = get_next_coeff_mapped_ivas_fx( ii, &p1, &idx1, hm_cfg ); /* Q0 */
     854     2309497 :             b1_i = get_next_coeff_mapped_ivas_fx( ii, &p2, &idx2, hm_cfg ); /* Q0 */
     855             : 
     856     2309497 :             idx = s_min( idx1, idx2 ); /* Q0 */
     857             : 
     858             :             /* Get context */
     859     2309497 :             ctx = &c[L_or( p1, p2 )]; /* Q0 */
     860             : 
     861     2309497 :             t = (UWord16) L_add( *ctx, rateFlag ); /* Q0 */
     862             :             // t += ( nt_half >= idx ) ? 0 : ( 1 << NBITS_CONTEXT );
     863     2309497 :             IF( LT_16( nt_half, idx ) )
     864             :             {
     865      273506 :                 t = add( t, ( 1 << NBITS_CONTEXT ) );
     866             :             }
     867             : 
     868             :             /* Init current 2-tuple encoding */
     869     2309497 :             a1 = abs_s( x[a1_i] ); /* Q0 */
     870     2309497 :             b1 = abs_s( x[b1_i] ); /* Q0 */
     871             : 
     872     2309497 :             lev1 = -1;
     873     2309497 :             move16();
     874             : 
     875             :             /*Signs encoding*/
     876     2309497 :             IF( a1 > 0 )
     877             :             {
     878             :                 // signs[nbbits_signs++] = ( (uint16_t) x[a1_i] >> ( sizeof( uint16_t ) * 8 - 1 ) );
     879      609874 :                 if ( x[a1_i] >= 0 )
     880             :                 {
     881      307120 :                     signs[nbbits_signs] = 0;
     882      307120 :                     move16();
     883             :                 }
     884      609874 :                 if ( x[a1_i] < 0 )
     885             :                 {
     886      302754 :                     signs[nbbits_signs] = 1;
     887      302754 :                     move16();
     888             :                 }
     889      609874 :                 nbbits_signs = add( nbbits_signs, 1 ); /* Q0 */
     890             :             }
     891             : 
     892     2309497 :             IF( b1 > 0 )
     893             :             {
     894             :                 // signs[nbbits_signs++] = ( (uint16_t) x[b1_i] >> ( sizeof( uint16_t ) * 8 - 1 ) );
     895      604673 :                 if ( x[b1_i] >= 0 )
     896             :                 {
     897      301544 :                     signs[nbbits_signs] = 0;
     898      301544 :                     move16();
     899             :                 }
     900      604673 :                 if ( x[b1_i] < 0 )
     901             :                 {
     902      303129 :                     signs[nbbits_signs] = 1;
     903      303129 :                     move16();
     904             :                 }
     905      604673 :                 nbbits_signs = add( nbbits_signs, 1 ); /* Q0 */
     906             :             }
     907             : 
     908             :             /* MSBs coding */
     909     2615397 :             WHILE( GE_16( s_max( a1, b1 ), A_THRES ) )
     910             :             {
     911      305900 :                 pki = ari_lookup_s17_LC[t + ( ( lev1 + 1 ) << ( NBITS_CONTEXT + NBITS_RATEQ ) )]; /* Q0 */
     912      305900 :                 move16();
     913      305900 :                 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      305900 :                 *lsbs_bits-- = s_and( a1, 1 );
     916      305900 :                 *lsbs_bits-- = s_and( b1, 1 );
     917      305900 :                 move16();
     918      305900 :                 move16();
     919             : 
     920             :                 /* LSBs bit counting */
     921      305900 :                 nbbits_lsbs = add( nbbits_lsbs, 2 ); /* Q0 */
     922             : 
     923      305900 :                 a1 = shr( a1, 1 );
     924      305900 :                 b1 = shr( b1, 1 );
     925             : 
     926      305900 :                 lev1 = s_min( add( lev1, 1 ), 2 ); /* Q0 */
     927             :             }
     928             : 
     929     2309497 :             pki = ari_lookup_s17_LC[t + ( ( lev1 + 1 ) << ( NBITS_CONTEXT + NBITS_RATEQ ) )]; /* Q0 */
     930     2309497 :             move16();
     931     2309497 :             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     2309497 :             IF( EQ_32( p1, p2 ) )
     937             :             {
     938             :                 /* peak-peak or hole-hole context */
     939             : 
     940     2099549 :                 IF( lev1 <= 0 )
     941             :                 {
     942     2041707 :                     t = (UWord16) L_add( 1, L_mult0( add( a1, b1 ), add( lev1, 2 ) ) ); /* Q0 */
     943             :                 }
     944             :                 ELSE
     945             :                 {
     946       57842 :                     t = (UWord16) L_add( 13, lev1 ); /* Q0 */
     947             :                 }
     948             : 
     949     2099549 :                 *ctx = L_add( L_shl( L_and( *ctx, 0xf ), 4 ), t ); /* Q0 */
     950     2099549 :                 move32();
     951             :             }
     952             :             ELSE
     953             :             {
     954             :                 /* mixed context */
     955             : 
     956      209948 :                 IF( s_and( idx1, 1 ) )
     957             :                 {
     958             :                     /* update first context */
     959       99889 :                     c[p1] = update_mixed_context_ivas_fx( c[p1], abs_s( x[a1_i] ) ); /* Q0 */
     960       99889 :                     move32();
     961             :                 }
     962             : 
     963      209948 :                 IF( s_and( idx2, 1 ) )
     964             :                 {
     965             :                     /* update second context */
     966      110059 :                     c[p2] = update_mixed_context_ivas_fx( c[p2], abs_s( x[b1_i] ) ); /* Q0 */
     967      110059 :                     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      864112 :         IF( GT_16( nbbits, 400 ) )
     981             :         {
     982      610109 :             rateFlag = 2;
     983      610109 :             move16();
     984             :         }
     985             :         ELSE
     986             :         {
     987      254003 :             rateFlag = 0;
     988      254003 :             move16();
     989             :         }
     990             : 
     991      864112 :         s = 0;
     992      864112 :         move16();
     993             : 
     994             :         /* Find last non-zero tuple */
     995             :         /* ensure termination of while loop by dummy value */
     996      864112 :         a1 = x[0];
     997      864112 :         x[0] = 1; /* ensure first tuple is non-zero */
     998      864112 :         move16();
     999      864112 :         move16();
    1000             : 
    1001     7412644 :         WHILE( x[lastnz - 1] == 0 && x[lastnz - 2] == 0 )
    1002             :         {
    1003     6548532 :             test();
    1004     6548532 :             lastnz = sub( lastnz, 2 ); /* Q0 */
    1005             :         }
    1006      864112 :         x[0] = a1;
    1007      864112 :         move16();
    1008             : 
    1009      864112 :         lsbs_bits = ptr + sub( nbbits, 1 );
    1010             : 
    1011             :         /*Start Encoding*/
    1012             :         /* Initialize range encoder */
    1013      864112 :         rc_uni_enc_init_fx( &rc_st_enc );
    1014             : 
    1015             :         /*Main Loop through the 2-tuples*/
    1016   182174899 :         FOR( k = 0; k < lastnz; k += 2 )
    1017             :         {
    1018             : 
    1019             :             /* Init current 2-tuple encoding */
    1020   181310787 :             a1 = abs_s( x[k + 0] ); /* Q0 */
    1021   181310787 :             b1 = abs_s( x[k + 1] ); /* Q0 */
    1022             : 
    1023   181310787 :             lev1 = 0;
    1024   181310787 :             esc_nb = 0;
    1025   181310787 :             move16();
    1026   181310787 :             move16();
    1027             : 
    1028             :             /*Signs encoding*/
    1029   181310787 :             IF( a1 > 0 )
    1030             :             {
    1031             :                 // signs[nbbits_signs++] = ( (uint16_t) x[k + 0] >> ( sizeof( uint16_t ) * 8 - 1 ) );
    1032    73478112 :                 if ( x[k] >= 0 )
    1033             :                 {
    1034    36747982 :                     signs[nbbits_signs] = 0;
    1035    36747982 :                     move16();
    1036             :                 }
    1037    73478112 :                 if ( x[k] < 0 )
    1038             :                 {
    1039    36730130 :                     signs[nbbits_signs] = 1;
    1040    36730130 :                     move16();
    1041             :                 }
    1042    73478112 :                 nbbits_signs = add( nbbits_signs, 1 ); /* Q0 */
    1043             :             }
    1044             : 
    1045   181310787 :             IF( b1 > 0 )
    1046             :             {
    1047             :                 // signs[nbbits_signs++] = ( (uint16_t) x[k + 1] >> ( sizeof( uint16_t ) * 8 - 1 ) );
    1048    73270214 :                 if ( x[k + 1] >= 0 )
    1049             :                 {
    1050    36544837 :                     signs[nbbits_signs] = 0;
    1051    36544837 :                     move16();
    1052             :                 }
    1053    73270214 :                 if ( x[k + 1] < 0 )
    1054             :                 {
    1055    36725377 :                     signs[nbbits_signs] = 1;
    1056    36725377 :                     move16();
    1057             :                 }
    1058    73270214 :                 nbbits_signs = add( nbbits_signs, 1 ); /* Q0 */
    1059             :             }
    1060             : 
    1061   181310787 :             rateQ = add( rateFlag, extract_l( GT_16( k, shr( nt, 1 ) ) ) );
    1062             : 
    1063             :             /* MSBs coding */
    1064   214366861 :             WHILE( GE_16( s_max( a1, b1 ), A_THRES ) )
    1065             :             {
    1066    33056074 :                 pki = ari_lookup_s17_LC[t + ( ( rateQ ) << NBITS_CONTEXT ) + ( esc_nb << ( NBITS_CONTEXT + NBITS_RATEQ ) )];
    1067    33056074 :                 move16();
    1068    33056074 :                 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    33056074 :                 *lsbs_bits-- = s_and( a1, 1 );
    1071    33056074 :                 *lsbs_bits-- = s_and( b1, 1 );
    1072    33056074 :                 move16();
    1073    33056074 :                 move16();
    1074             : 
    1075             :                 /* LSBs bit counting */
    1076    33056074 :                 nbbits_lsbs = add( nbbits_lsbs, 2 ); /* Q0 */
    1077             : 
    1078    33056074 :                 a1 = shr( a1, 1 );
    1079    33056074 :                 b1 = shr( b1, 1 );
    1080             : 
    1081    33056074 :                 lev1 = add( lev1, 1 );     /* Q0 */
    1082    33056074 :                 esc_nb = s_min( lev1, 3 ); /* Q0 */
    1083             :             }
    1084             : 
    1085   181310787 :             move16();
    1086             : 
    1087   181310787 :             pki = ari_lookup_s17_LC[t + ( ( rateQ ) << NBITS_CONTEXT ) + ( esc_nb << ( NBITS_CONTEXT + NBITS_RATEQ ) )];                              /* Q0 */
    1088   181310787 :             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   181310787 :             IF( LT_16( esc_nb, 2 ) )
    1094             :             {
    1095   173156963 :                 cp = add( 1, imult1616( add( a1, b1 ), add( esc_nb, 1 ) ) ); /* Q0 */
    1096             :             }
    1097             :             ELSE
    1098             :             {
    1099     8153824 :                 cp = add( 12, esc_nb ); /* Q0 */
    1100             :             }
    1101             : 
    1102             :             /*Shift old 4 bits, replace last 4 bits*/
    1103   181310787 :             s = (UWord16) ( L_add( L_shl( s, 4 ), cp ) );
    1104   181310787 :             t = (UWord16) L_and( s, 0xFF );
    1105             : 
    1106             :         } /*end of the 2-tuples loop*/
    1107             :     }
    1108             : 
    1109             :     /* Finish range encoder */
    1110      876812 :     rc_tot_bits = rc_uni_enc_finish_fx( &rc_st_enc ); /* No. of bits consumed by range coder    Q0*/
    1111      876812 :     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      876812 :     value = sub( shr( lastnz, 1 ), 1 ); /* Q0 */
    1117      876812 :     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    66089486 :     FOR( k = 0; k < ( rc_tot_bits >> 3 ); k++ )
    1122             :     {
    1123    65212674 :         push_next_indice( hBstr, rc_st_enc.byte_buffer[k], 8 );
    1124             :     }
    1125             :     /* 2) Push remaining bits */
    1126      876812 :     IF( s_and( rc_tot_bits, 7 ) != 0 )
    1127             :     {
    1128      767571 :         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      876812 :     push_next_bits( hBstr, (UWord16 *) signs, nbbits_signs );
    1133      876812 :     bp = add( bp, nbbits_signs ); /* Q0 */
    1134             : 
    1135             :     /*write residual Quantization bits*/
    1136             : 
    1137     4896383 :     FOR( k = 0; k < s_min( nbbits - bp - nbbits_lsbs, resQMaxBits ); k++ )
    1138             :     {
    1139     4019571 :         ptr[nbbits - 1 - nbbits_lsbs - k] = x[nt + k]; /* Q0 */
    1140     4019571 :         move16();
    1141             :     }
    1142             :     /* Write filler bits */
    1143    19683404 :     FOR( ; k < nbbits - bp - nbbits_lsbs; ++k )
    1144             :     {
    1145    18806592 :         ptr[nbbits - 1 - nbbits_lsbs - k] = 0;
    1146    18806592 :         move16();
    1147             :     }
    1148             : 
    1149             :     /* Check for debugging */
    1150      876812 :     assert( bp + k <= nbbits );
    1151             : 
    1152             :     /* Push the rest of the buffer */
    1153      876812 :     push_next_bits( hBstr, (UWord16 *) &ptr[bp], sub( nbbits, bp ) );
    1154             : 
    1155             :     /* return (bp+nbbits_lsbs);*/ /*return only for debug plot*/
    1156      876812 :     return;
    1157             : }
    1158             : 
    1159             : /*-------------------------------------------------------------------*
    1160             :  * find_last_nz_pair_fx()
    1161             :  *
    1162             :  *
    1163             :  *-------------------------------------------------------------------*/
    1164             : 
    1165      399863 : 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      399863 :     last_nz = 2;
    1174      399863 :     move16();
    1175             : 
    1176      399863 :     IF( hm_cfg )
    1177             :     {
    1178             :         /* mapped kernel */
    1179      399863 :         tmp = hm_cfg->indexBuffer;
    1180             : 
    1181    68472092 :         FOR( i = length; i >= 4; i -= 2 )
    1182             :         {
    1183    68468033 :             test();
    1184    68468033 :             IF( x[tmp[i - 2]] || x[tmp[i - 1]] )
    1185             :             {
    1186      395804 :                 last_nz = i; /* Q0 */
    1187      395804 :                 move16();
    1188      395804 :                 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      399863 :     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     3996527 : 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     3996527 :     bit_estimate_fx = MAKE_NUMBER_QX( 2, Q23 );
    1243     3996527 :     move64();
    1244             : 
    1245     3996527 :     nbits2_fx = 0;
    1246     3996527 :     move64();
    1247             : 
    1248             :     /* bits to encode lastnz */
    1249     3996527 :     k = 1;
    1250     3996527 :     move16();
    1251             : 
    1252             :     Word16 round_bit_estimate_fx;
    1253     3996527 :     Word32 target_Q15 = L_shl( target, Q15 ); // Q15
    1254             : 
    1255    39284155 :     WHILE( LT_16( k, nt / 2 ) )
    1256             :     {
    1257    35287628 :         bit_estimate_fx = W_add( bit_estimate_fx, MAKE_NUMBER_QX( 1, Q23 ) );
    1258    35287628 :         k = shl( k, 1 );
    1259             :         /* check while condition */
    1260             :     }
    1261             : 
    1262     3996527 :     nbits2_fx = bit_estimate_fx;
    1263     3996527 :     move64();
    1264             : 
    1265     3996527 :     IF( hm_cfg )
    1266             :     {
    1267             :         Word16 a1_i, b1_i;
    1268             :         Word16 stop2;
    1269             :         Word16 total_output_bits;
    1270             :         Word16 nt_half;
    1271             :         Word32 c[2], *ctx;
    1272             :         Word32 p1, p2;
    1273             :         Word16 ii[2];
    1274             :         Word16 idx1, idx2, idx;
    1275      399863 :         Word16 numPeakIndicesOrig = 0, numHoleIndices = 0; /* only to avoid compiler warning */
    1276      399863 :         move16();
    1277      399863 :         move16();
    1278             : 
    1279             :         /* Rate flag */
    1280      399863 :         IF( GT_16( target, 400 ) )
    1281             :         {
    1282      248040 :             rateFlag = 2 << NBITS_CONTEXT; /* Select context-A for higher bitrates */
    1283      248040 :             move16();
    1284             :         }
    1285             :         ELSE
    1286             :         {
    1287      151823 :             rateFlag = 0; /* Select context-B for lower bitrates */
    1288      151823 :             move16();
    1289             :         }
    1290             : 
    1291      399863 :         nt_half = shr( nt, 1 );
    1292      399863 :         move16();
    1293      399863 :         stop2 = 0;
    1294      399863 :         move16();
    1295      399863 :         c[0] = c[1] = 0;
    1296      399863 :         move32();
    1297      399863 :         move32();
    1298             : 
    1299             :         /* Find last non-zero tuple in the mapped domain signal */
    1300      399863 :         lastnz = find_last_nz_pair_fx( x, nt, hm_cfg );
    1301             : 
    1302      399863 :         lastnz2 = 2;
    1303      399863 :         move16();
    1304             : 
    1305             :         /* mapped domain */
    1306      399863 :         numPeakIndicesOrig = hm_cfg->numPeakIndices; /* Q0 */
    1307      399863 :         move16();
    1308      399863 :         hm_cfg->numPeakIndices = s_min( hm_cfg->numPeakIndices, lastnz ); /* Q0 */
    1309      399863 :         move16();
    1310      399863 :         numHoleIndices = sub( lastnz, hm_cfg->numPeakIndices ); /* Q0 */
    1311             : 
    1312             :         /* Mark hole indices beyond lastnz as pruned */
    1313   134658777 :         FOR( k = numHoleIndices; k < hm_cfg->numHoleIndices; ++k )
    1314             :         {
    1315   134258914 :             hm_cfg->holeIndices[k] = add( hm_cfg->holeIndices[k], nt ); /* Q0 */
    1316   134258914 :             move16();
    1317             :         }
    1318             : 
    1319      399863 :         ii[0] = numPeakIndicesOrig; /* Q0 */
    1320      399863 :         move16();
    1321      399863 :         ii[1] = 0;
    1322      399863 :         move16();
    1323             : 
    1324      399863 :         p1 = p2 = 0; /* to avoid compilation warnings */
    1325      399863 :         move32();
    1326      399863 :         move32();
    1327             : 
    1328             :         /* Main Loop through the 2-tuples */
    1329    83533940 :         FOR( k = 0; k < lastnz; k += 2 )
    1330             :         {
    1331    83291083 :             a1_i = get_next_coeff_mapped_ivas_fx( ii, &p1, &idx1, hm_cfg ); /* Q0 */
    1332    83291083 :             b1_i = get_next_coeff_mapped_ivas_fx( ii, &p2, &idx2, hm_cfg ); /* Q0 */
    1333             : 
    1334    83291083 :             idx = s_min( idx1, idx2 );
    1335             : 
    1336             :             /* Get context */
    1337    83291083 :             ctx = &c[L_or( p1, p2 )];
    1338             : 
    1339    83291083 :             t = (UWord16) L_add( *ctx, rateFlag );
    1340    83291083 :             if ( LT_16( nt_half, idx ) )
    1341             :             {
    1342    14992648 :                 t = add( t, ( 1 << NBITS_CONTEXT ) );
    1343             :             }
    1344             : 
    1345             :             /* Init current 2-tuple encoding */
    1346    83291083 :             a1 = abs_s( x[a1_i] );
    1347    83291083 :             b1 = abs_s( x[b1_i] );
    1348    83291083 :             lev1 = -( 1 << ( NBITS_CONTEXT + NBITS_RATEQ ) );
    1349             : 
    1350    83291083 :             bit_estimate_fx = W_add( bit_estimate_fx, MAKE_VARIABLE_QX( s_min( a1, 1 ), Q23 ) );
    1351    83291083 :             bit_estimate_fx = W_add( bit_estimate_fx, MAKE_VARIABLE_QX( s_min( b1, 1 ), Q23 ) );
    1352             :             /* pre-compute address of ari_pk_s17_LC_ext[0][Val_esc] to avoid doing it multiple times inside the loop */
    1353    83291083 :             lookup = &ari_lookup_s17_LC[t] + ( 1 << ( NBITS_CONTEXT + NBITS_RATEQ ) );
    1354             : 
    1355             :             /* check while condition */
    1356             :             /* MSBs coding */
    1357    92732332 :             FOR( ; s_max( a1, b1 ) >= A_THRES; )
    1358             :             {
    1359     9441249 :                 pki = lookup[lev1]; /* ESC symbol */
    1360             : 
    1361     9441249 :                 bit_estimate_fx = W_add( bit_estimate_fx, ari_bit_estimate_s17_LC_fx[pki][VAL_ESC] );
    1362     9441249 :                 bit_estimate_fx = W_add( bit_estimate_fx, MAKE_VARIABLE_QX( 2, Q23 ) );
    1363     9441249 :                 a1 = shr( a1, 1 );
    1364     9441249 :                 b1 = shr( b1, 1 );
    1365             : 
    1366     9441249 :                 lev1 = s_min( add( lev1, ( 1 << ( NBITS_CONTEXT + NBITS_RATEQ ) ) ), 2 << ( NBITS_CONTEXT + NBITS_RATEQ ) );
    1367             :             }
    1368    83291083 :             pki = lookup[lev1];
    1369             : 
    1370    83291083 :             symbol = add( a1, i_mult( A_THRES, b1 ) ); /* Q0 */
    1371    83291083 :             bit_estimate_fx = W_add( bit_estimate_fx, ari_bit_estimate_s17_LC_fx[pki][symbol] );
    1372             : 
    1373    83291083 :             IF( GT_32( W_shl_sat_l( bit_estimate_fx, -Q8 ), target_Q15 ) ) // Q15
    1374             :             {
    1375    13819189 :                 stop2 = 1;
    1376    13819189 :                 move16();
    1377             : 
    1378    13819189 :                 IF( *stop )
    1379             :                 {
    1380      157006 :                     BREAK;
    1381             :                 }
    1382             :             }
    1383             :             ELSE
    1384             :             {
    1385    69471894 :                 lastnz2 = add( b1_i, 1 );
    1386    69471894 :                 nbits2_fx = bit_estimate_fx;
    1387    69471894 :                 move64();
    1388             :             }
    1389             : 
    1390             :             /* Update context for next 2-tuple */
    1391    83134077 :             IF( EQ_32( p1, p2 ) ) /* peak-peak or hole-hole context */
    1392             :             {
    1393    68304587 :                 lev1 = shr( lev1, NBITS_CONTEXT + NBITS_RATEQ );
    1394             : 
    1395    68304587 :                 t = add( 13, lev1 );
    1396    68304587 :                 IF( lev1 <= 0 )
    1397             :                 {
    1398    66633044 :                     t = add( 1, i_mult( add( a1, b1 ), add( lev1, 2 ) ) );
    1399             :                 }
    1400             : 
    1401    68304587 :                 *ctx = L_add( imult3216( L_and( *ctx, 0xf ), 16 ), t );
    1402    68304587 :                 move32();
    1403             :             }
    1404             :             ELSE
    1405             :             {
    1406             :                 /* mixed context */
    1407             : 
    1408    14829490 :                 IF( s_and( idx1, 1 ) )
    1409             :                 {
    1410             :                     /* update first context */
    1411     7409994 :                     c[p1] = update_mixed_context_ivas_fx( c[p1], abs_s( x[a1_i] ) ); /* Q0 */
    1412     7409994 :                     move32();
    1413             :                 }
    1414             : 
    1415    14829490 :                 IF( s_and( idx2, 1 ) )
    1416             :                 {
    1417             :                     /* update second context */
    1418     7398810 :                     c[p2] = update_mixed_context_ivas_fx( c[p2], abs_s( x[b1_i] ) ); /* Q0 */
    1419     7398810 :                     move32();
    1420             :                 }
    1421             :             }
    1422             : 
    1423             :         }                                                                    /*end of the 2-tuples loop*/
    1424      399863 :         total_output_bits = round_fx( W_shl_sat_l( bit_estimate_fx, -Q7 ) ); /* Q23 -> Q16 -> Q0 */
    1425      399863 :         IF( *stop )
    1426             :         {
    1427      168904 :             total_output_bits = round_fx( W_shl_sat_l( nbits2_fx, -Q7 ) ); /* Q23 -> Q16 -> Q0 */
    1428             :         }
    1429             : 
    1430      399863 :         if ( stop2 )
    1431             :         {
    1432      326632 :             stop2 = total_output_bits; /* Q0 */
    1433      326632 :             move16();
    1434             :         }
    1435             : 
    1436      399863 :         *nEncoded = lastnz2; /* Q0 */
    1437      399863 :         move16();
    1438      399863 :         *stop = stop2; /* If zero, it means no overflow occured during bit-estimation    Q0*/
    1439      399863 :         move16();
    1440      399863 :         *lastnz_out = lastnz; /* Q0 */
    1441      399863 :         move16();
    1442             : 
    1443             :         /* Restore hole indices beyond lastnz */
    1444   134658777 :         FOR( k = numHoleIndices; k < hm_cfg->numHoleIndices; ++k )
    1445             :         {
    1446   134258914 :             hm_cfg->holeIndices[k] = sub( hm_cfg->holeIndices[k], nt ); /* Q0 */
    1447   134258914 :             move16();
    1448             :         }
    1449      399863 :         hm_cfg->numPeakIndices = numPeakIndicesOrig; /* Q0 */
    1450      399863 :         move16();
    1451             : 
    1452      399863 :         return round_fx( L_add( W_shl_sat_l( nbits2_fx, -Q7 ), ONE_IN_Q14 ) ); /* Q0 */
    1453             :     }
    1454             :     ELSE /* if (!hm_cfg) */
    1455             :     {
    1456             :         Word16 esc_nb, cp, rateQ;
    1457             :         UWord16 s;
    1458             :         Word16 tot_bits2;
    1459     3596664 :         Word16 overflow_flag = 0;
    1460     3596664 :         move16();
    1461             : 
    1462             :         /* Rate flag */
    1463     3596664 :         IF( GT_16( target, 400 ) )
    1464             :         {
    1465     2677415 :             rateFlag = 2; /* Q0 */
    1466     2677415 :             move16();
    1467             :         }
    1468             :         ELSE
    1469             :         {
    1470      919249 :             rateFlag = 0; /* Select context-B for lower bitrates */
    1471      919249 :             move16();
    1472             :         }
    1473             : 
    1474     3596664 :         t = 0;
    1475     3596664 :         move16();
    1476     3596664 :         s = 0;
    1477     3596664 :         move16();
    1478     3596664 :         cp = 0;
    1479     3596664 :         move16();
    1480     3596664 :         lastnz = 1;
    1481     3596664 :         move16();
    1482     3596664 :         lastnz2 = 0;
    1483     3596664 :         move16();
    1484     3596664 :         tot_bits2 = 0;
    1485     3596664 :         move16();
    1486             : 
    1487             :         /* Find last non-zero tuple in the mapped domain signal */
    1488   616184191 :         FOR( lastnz = sub( nt, 2 ); lastnz >= 0; lastnz -= 2 )
    1489             :         {
    1490   616170405 :             test();
    1491   616170405 :             IF( ( x[lastnz] != 0 ) || ( x[lastnz + 1] != 0 ) )
    1492             :             {
    1493             :                 BREAK;
    1494             :             }
    1495             :         }
    1496     3596664 :         lastnz = add( lastnz, 2 ); /* Q0 */
    1497     3596664 :         IF( LT_16( lastnz, 2 ) )
    1498             :         {
    1499       13786 :             lastnz = 2; /* At least one tuple is coded    Q0*/
    1500       13786 :             move16();
    1501             :         }
    1502             : 
    1503     3596664 :         lastnz2 = 2;
    1504     3596664 :         move16();
    1505             : 
    1506             :         /* Main Loop through the 2-tuples */
    1507   789225491 :         FOR( k = 0; k < lastnz; k += 2 )
    1508             :         {
    1509             :             /* Init current 2-tuple encoding */
    1510   785628827 :             a1 = abs_s( x[k] );     /* Q0 */
    1511   785628827 :             b1 = abs_s( x[k + 1] ); /* Q0 */
    1512   785628827 :             lev1 = 0;
    1513   785628827 :             move16();
    1514   785628827 :             esc_nb = 0;
    1515   785628827 :             move16();
    1516   785628827 :             rateQ = add( rateFlag, extract_l( GT_16( k, shr( nt, 1 ) ) ) ); /* Q0 */
    1517             : 
    1518   785628827 :             bit_estimate_fx = W_add( bit_estimate_fx, MAKE_VARIABLE_QX( s_min( a1, 1 ), Q23 ) );
    1519   785628827 :             bit_estimate_fx = W_add( bit_estimate_fx, MAKE_VARIABLE_QX( s_min( b1, 1 ), Q23 ) );
    1520             : 
    1521             :             /* pre-compute address of ari_pk_s17_LC_ext[0][Val_esc] to avoid doing it multiple times inside the loop */
    1522   785628827 :             lookup = &ari_lookup_s17_LC[t + shl( rateQ, NBITS_CONTEXT )]; /* Q0 */
    1523             : 
    1524             :             /* check while condition */
    1525             :             /* MSBs coding */
    1526   933720047 :             FOR( ; s_max( a1, b1 ) >= A_THRES; )
    1527             :             {
    1528   148091220 :                 pki = lookup[( esc_nb << ( NBITS_CONTEXT + NBITS_RATEQ ) )]; /* Q0 */
    1529             : 
    1530   148091220 :                 bit_estimate_fx = W_add( bit_estimate_fx, ari_bit_estimate_s17_LC_fx[pki][VAL_ESC] );
    1531   148091220 :                 bit_estimate_fx = W_add( bit_estimate_fx, MAKE_NUMBER_QX( 2, Q23 ) );
    1532             : 
    1533   148091220 :                 a1 = shr( a1, 1 );
    1534   148091220 :                 b1 = shr( b1, 1 );
    1535             : 
    1536   148091220 :                 lev1 = add( lev1, 1 );
    1537   148091220 :                 esc_nb = s_min( lev1, 3 );
    1538             :             }
    1539   785628827 :             pki = lookup[( esc_nb << ( NBITS_CONTEXT + NBITS_RATEQ ) )]; /* Q0 */
    1540             : 
    1541   785628827 :             symbol = add( a1, i_mult( A_THRES, b1 ) ); /* Q0 */
    1542   785628827 :             bit_estimate_fx = W_add( bit_estimate_fx, ari_bit_estimate_s17_LC_fx[pki][symbol] );
    1543             : 
    1544             :             /* Should we truncate? */
    1545   785628827 :             IF( GT_32( W_shl_sat_l( bit_estimate_fx, -Q8 ), target_Q15 ) ) // Q15
    1546             :             {
    1547    28631113 :                 overflow_flag = 1;
    1548    28631113 :                 move16();
    1549             :             }
    1550             :             ELSE
    1551             :             {
    1552   756997714 :                 IF( abs_s( x[k] ) || abs_s( x[k + 1] ) ) /* No overflow & non-zero tuple */
    1553             :                 {
    1554   452945838 :                     nbits2_fx = bit_estimate_fx; /* exp(bit_estimate_e) */
    1555   452945838 :                     move64();
    1556             : 
    1557   452945838 :                     lastnz2 = add( k, 2 );
    1558             :                 }
    1559             :             }
    1560             : 
    1561             :             /* Update context for next 2-tuple */
    1562   785628827 :             cp = add( 1, i_mult( add( a1, b1 ), add( esc_nb, 1 ) ) ); /* Q0 */
    1563   785628827 :             if ( GE_16( esc_nb, 2 ) )
    1564             :             {
    1565    36625439 :                 cp = add( 12, esc_nb ); /* Q0 */
    1566             :             }
    1567             :             /*shift old bits and replace last 4 bits*/
    1568   785628827 :             s = (UWord16) L_add( L_shl( s, 4 ), cp );
    1569   785628827 :             t = s_and( s, 0xFF );
    1570             :         } /*end of the 2-tuples loop*/
    1571             : 
    1572     3596664 :         tot_bits2 = round_fx( W_shl_sat_l( nbits2_fx, -Q7 ) );                   /* Q23 -> Q16 -> Q0 */
    1573     3596664 :         round_bit_estimate_fx = round_fx( W_shl_sat_l( bit_estimate_fx, -Q7 ) ); /* Q23 -> Q16 -> Q0 */
    1574     3596664 :         if ( LT_16( lastnz2, lastnz ) )                                          /* Overflow occured because unable to code all tuples */
    1575             :         {
    1576     1479650 :             overflow_flag = 1;
    1577     1479650 :             move16();
    1578             :         }
    1579     3596664 :         if ( EQ_16( mode, -1 ) )
    1580             :         {
    1581           0 :             tot_bits2 = round_bit_estimate_fx;
    1582           0 :             move16();
    1583             :         }
    1584     3596664 :         if ( overflow_flag == 0 ) /* No overflow */
    1585             :         {
    1586     2117014 :             *stop = 0;
    1587     2117014 :             move16();
    1588             :         }
    1589     3596664 :         IF( overflow_flag != 0 ) /* Overflow */
    1590             :         {
    1591     1479650 :             IF( *stop ){
    1592        9708 :                     *stop = tot_bits2; /* Q0 */
    1593        9708 :         move16();
    1594             :     }
    1595             :     ELSE
    1596             :     {
    1597     1469942 :         *stop = round_bit_estimate_fx;
    1598     1469942 :         move16();
    1599             :     }
    1600             : }
    1601             : 
    1602     3596664 : *lastnz_out = lastnz; /* Q0 */
    1603     3596664 : move16();
    1604     3596664 : *nEncoded = lastnz2; /* Q0 */
    1605     3596664 : move16();
    1606             : /* Safety mechanism to avoid overflow */
    1607     3596664 : test();
    1608     3596664 : IF( EQ_16( lastnz2, 2 ) && EQ_16( overflow_flag, 1 ) )
    1609             : {
    1610         177 :     FOR( k = 0; k < lastnz2; k++ )
    1611             :     {
    1612         118 :         x[k] = 0;
    1613         118 :         move16();
    1614             :     }
    1615             : }
    1616             : 
    1617     3596664 : return tot_bits2;
    1618             : }
    1619             : }
    1620             : 
    1621             : 
    1622             : /*-------------------------------------------------------------------*
    1623             :  * RCcontextMapping_encode2_estimate_bandWise_start_fx()
    1624             :  *
    1625             :  * Range coder - start bandwise bit-estimation
    1626             :  *-------------------------------------------------------------------*/
    1627             : 
    1628      568204 : Word16 RCcontextMapping_encode2_estimate_bandWise_start_fx(
    1629             :     Word16 *x,           /* Q0 */
    1630             :     const Word16 nt,     /* Q0 */
    1631             :     const Word16 target, /* Q0 */
    1632             :     HANDLE_RC_CONTEXT_MEM hContextMem )
    1633             : {
    1634             :     Word16 i, k;
    1635             : 
    1636             :     /* Rate flag */
    1637      568204 :     IF( GT_16( target, 400 ) )
    1638             :     {
    1639      557772 :         hContextMem->rateFlag = 2 << NBITS_CONTEXT;
    1640      557772 :         move16();
    1641             :     }
    1642             :     ELSE
    1643             :     {
    1644       10432 :         hContextMem->rateFlag = 0;
    1645       10432 :         move16();
    1646             :     }
    1647             : 
    1648      568204 :     hContextMem->bit_estimate_fx = MAKE_NUMBER_QX( 2, Q23 );
    1649      568204 :     move64();
    1650             : 
    1651             : 
    1652             :     /* Init */
    1653      568204 :     hContextMem->nt_half = shr( nt, 1 );
    1654      568204 :     move16();
    1655             : 
    1656             :     /* bits to encode lastnz */
    1657      568204 :     k = 1;
    1658      568204 :     move16();
    1659             : 
    1660     5346172 :     WHILE( LT_16( k, hContextMem->nt_half ) )
    1661             :     {
    1662     4777968 :         hContextMem->bit_estimate_fx = W_add( hContextMem->bit_estimate_fx, MAKE_NUMBER_QX( 1, Q23 ) );
    1663     4777968 :         move64();
    1664             : 
    1665     4777968 :         k = shl( k, 1 );
    1666             :         /* check while condition */
    1667             :     }
    1668             : 
    1669             :     /* bits to encode lastnz */
    1670      568204 :     hContextMem->nbits_old = round_fx( W_extract_l( W_shr( hContextMem->bit_estimate_fx, Q7 ) ) ); /* Q0 */
    1671      568204 :     move16();
    1672             : 
    1673      568204 :     hContextMem->ctx = 0;
    1674      568204 :     move16();
    1675      568204 :     hContextMem->lastnz = 2;
    1676      568204 :     move16();
    1677             : 
    1678             :     /* Find last non-zero tuple  */
    1679             : 
    1680     8732137 :     FOR( i = nt; i >= 4; i -= 2 )
    1681             :     {
    1682     8731490 :         test();
    1683     8731490 :         IF( x[i - 2] != 0 || x[i - 1] != 0 )
    1684             :         {
    1685      567557 :             hContextMem->lastnz = i;
    1686      567557 :             move16();
    1687      567557 :             BREAK;
    1688             :         }
    1689             :     }
    1690             : 
    1691      568204 :     return hContextMem->nbits_old;
    1692             : }
    1693             : 
    1694             : /*-------------------------------------------------------------------*
    1695             :  * RCcontextMapping_encode2_estimate_bandWise_fx()
    1696             :  *
    1697             :  * Range coder - bandwise bit-estimation
    1698             :  *-------------------------------------------------------------------*/
    1699             : 
    1700    22598660 : Word16 RCcontextMapping_encode2_estimate_bandWise_fx(
    1701             :     Word16 *x,               /* Q0 */
    1702             :     const Word16 start_line, /* Q0 */
    1703             :     const Word16 end_line,   /* Q0 */
    1704             :     HANDLE_RC_CONTEXT_MEM hContextMem )
    1705             : {
    1706             :     Word16 a1, b1, a1_i, b1_i;
    1707             :     Word16 k, pki, lev1;
    1708             :     UWord16 t;
    1709    22598660 :     Word16 bandBits = 0;
    1710    22598660 :     move16();
    1711             :     Word16 total_output_bits; /* No. of bits after finalization */
    1712             :     Word16 symbol;
    1713             :     const UWord8 *lookup;
    1714             :     Word16 idx;
    1715             :     Word16 tmp;
    1716             : 
    1717             :     /* Main Loop through the 2-tuples */
    1718             :     /*hContextMem->nt_half = end_line >> 1;*/
    1719    22598660 :     Word16 len = s_min( hContextMem->lastnz, end_line );
    1720   175830602 :     FOR( k = start_line; k < len; k += 2 )
    1721             :     {
    1722   153231942 :         a1_i = k; /* Q0 */
    1723   153231942 :         move16();
    1724   153231942 :         b1_i = add( k, 1 ); /* Q0 */
    1725             : 
    1726   153231942 :         idx = k;
    1727   153231942 :         move16();
    1728             : 
    1729             :         /* Get context */
    1730   153231942 :         t = add( hContextMem->ctx, hContextMem->rateFlag ); /* Q0 */
    1731             : 
    1732   153231942 :         tmp = ( 1 << NBITS_CONTEXT );
    1733   153231942 :         move16();
    1734   153231942 :         if ( GE_16( hContextMem->nt_half, idx ) )
    1735             :         {
    1736    80659749 :             tmp = 0;
    1737    80659749 :             move16();
    1738             :         }
    1739             : 
    1740   153231942 :         t = add( t, tmp ); /* Q0 */
    1741             : 
    1742             :         /* Init current 2-tuple encoding */
    1743   153231942 :         a1 = abs_s( x[a1_i] );                            /* Q0 */
    1744   153231942 :         b1 = abs_s( x[b1_i] );                            /* Q0 */
    1745   153231942 :         lev1 = -( 1 << ( NBITS_CONTEXT + NBITS_RATEQ ) ); /* Q0 */
    1746             : 
    1747             :         /* Signs Bits */
    1748   153231942 :         hContextMem->bit_estimate_fx = W_add( hContextMem->bit_estimate_fx, MAKE_VARIABLE_QX( s_min( a1, 1 ), Q23 ) );
    1749   153231942 :         hContextMem->bit_estimate_fx = W_add( hContextMem->bit_estimate_fx, MAKE_VARIABLE_QX( s_min( b1, 1 ), Q23 ) );
    1750             : 
    1751   153231942 :         move32();
    1752   153231942 :         move32();
    1753             : 
    1754             :         /* pre-compute address of ari_pk_s17_LC_ext[0][Val_esc] to avoid doing it multiple times inside the loop */
    1755   153231942 :         lookup = &ari_lookup_s17_LC[t] + ( 1 << ( NBITS_CONTEXT + NBITS_RATEQ ) );
    1756             : 
    1757             :         /* check while condition */
    1758             :         /* MSBs coding */
    1759   184463410 :         FOR( ; s_max( a1, b1 ) >= A_THRES; )
    1760             :         {
    1761    31231468 :             pki = lookup[lev1]; /* Q0 */
    1762             : 
    1763    31231468 :             hContextMem->bit_estimate_fx = W_add( hContextMem->bit_estimate_fx, ari_bit_estimate_s17_LC_fx[pki][VAL_ESC] );
    1764    31231468 :             hContextMem->bit_estimate_fx = W_add( hContextMem->bit_estimate_fx, MAKE_NUMBER_QX( 2, Q23 ) );
    1765    31231468 :             move64();
    1766    31231468 :             move64();
    1767             : 
    1768             : 
    1769             :             // hContextMem->bit_estimate = hContextMem->bit_estimate + ari_bit_estimate_s17_LC[pki][VAL_ESC];
    1770             :             // hContextMem->bit_estimate += 2; /* Add the 2 LSB bits that were shifted out */
    1771             : 
    1772    31231468 :             a1 = shr( a1, 1 );
    1773    31231468 :             b1 = shr( b1, 1 );
    1774             : 
    1775    31231468 :             lev1 = s_min( add( lev1, ( 1 << ( NBITS_CONTEXT + NBITS_RATEQ ) ) ), 2 << ( NBITS_CONTEXT + NBITS_RATEQ ) ); /* Q0 */
    1776             :                                                                                                                          /* check while condition */
    1777             :         }
    1778             : 
    1779   153231942 :         pki = lookup[lev1]; /* Q0 */
    1780             : 
    1781   153231942 :         symbol = add( a1, i_mult( A_THRES, b1 ) ); /* MSB symbol    Q0*/
    1782   153231942 :         hContextMem->bit_estimate_fx = W_add( hContextMem->bit_estimate_fx, ari_bit_estimate_s17_LC_fx[pki][symbol] );
    1783             : 
    1784   153231942 :         move64();
    1785             :         // hContextMem->bit_estimate = hContextMem->bit_estimate + ari_bit_estimate_s17_LC[pki][symbol];
    1786             : 
    1787             :         /* Update context */
    1788   153231942 :         lev1 = shr( lev1, NBITS_CONTEXT + NBITS_RATEQ );
    1789             : 
    1790   153231942 :         t = add( 1, i_mult( add( a1, b1 ), add( lev1, 2 ) ) ); /* Q0 */
    1791   153231942 :         if ( lev1 > 0 )
    1792             :         {
    1793     7802317 :             t = add( 13, lev1 ); /* Q0 */
    1794             :         }
    1795   153231942 :         hContextMem->ctx = add( i_mult( s_and( hContextMem->ctx, 0xf ), 16 ), t ); /* Q0 */
    1796   153231942 :         move16();
    1797             : 
    1798             :     }                                                                                 /*end of the 2-tuples loop*/
    1799    22598660 :     total_output_bits = round_fx( W_shl_sat_l( hContextMem->bit_estimate_fx, -Q7 ) ); /* Q0 */
    1800             :     // total_output_bits = (Word16) ( hContextMem->bit_estimate + 0.5f );
    1801             : 
    1802             : 
    1803    22598660 :     bandBits = sub( total_output_bits, hContextMem->nbits_old ); /* Q0 */
    1804    22598660 :     hContextMem->nbits_old = total_output_bits;                  /* Q0 */
    1805    22598660 :     move16();
    1806             : 
    1807    22598660 :     return bandBits;
    1808             : }

Generated by: LCOV version 1.14