LCOV - code coverage report
Current view: top level - lib_enc - ACcontextMapping_enc.c (source / functions) Hit Total Coverage
Test: Coverage on main -- merged total coverage @ 0c62f5312a76f89f3e6d6ab9a8d50516c9ab4059 Lines: 535 539 99.3 %
Date: 2025-12-17 10:49:08 Functions: 7 7 100.0 %

          Line data    Source code
       1             : /******************************************************************************************************
       2             : 
       3             :    (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB,
       4             :    Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
       5             :    Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
       6             :    Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
       7             :    contributors to this repository. All Rights Reserved.
       8             : 
       9             :    This software is protected by copyright law and by international treaties.
      10             :    The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB,
      11             :    Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
      12             :    Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
      13             :    Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
      14             :    contributors to this repository retain full ownership rights in their respective contributions in
      15             :    the software. This notice grants no license of any kind, including but not limited to patent
      16             :    license, nor is any license granted by implication, estoppel or otherwise.
      17             : 
      18             :    Contributors are required to enter into the IVAS codec Public Collaboration agreement before making
      19             :    contributions.
      20             : 
      21             :    This software is provided "AS IS", without any express or implied warranties. The software is in the
      22             :    development stage. It is intended exclusively for experts who have experience with such software and
      23             :    solely for the purpose of inspection. All implied warranties of non-infringement, merchantability
      24             :    and fitness for a particular purpose are hereby disclaimed and excluded.
      25             : 
      26             :    Any dispute, controversy or claim arising under or in relation to providing this software shall be
      27             :    submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in
      28             :    accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and
      29             :    the United Nations Convention on Contracts on the International Sales of Goods.
      30             : 
      31             : *******************************************************************************************************/
      32             : 
      33             : /*====================================================================================
      34             :     EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0
      35             :   ====================================================================================*/
      36             : 
      37             : #include <stdint.h>
      38             : #include "options.h"
      39             : #include <assert.h>
      40             : #include "cnst.h"
      41             : #include "rom_com.h"
      42             : #include "prot.h"
      43             : #include "ivas_prot.h" /* Range coder header file */
      44             : #include "ivas_rom_com.h"
      45             : #include "ivas_rom_enc.h"
      46             : #ifdef DEBUGGING
      47             : #include "debug.h"
      48             : #endif
      49             : #include "wmc_auto.h"
      50             : 
      51             : 
      52             : /*-------------------------------------------------------------------*
      53             :  * ACcontextMapping_encode2_no_mem_s17_LC()
      54             :  *
      55             :  * Arithmetic encoder
      56             :  *-------------------------------------------------------------------*/
      57             : 
      58       30068 : void ACcontextMapping_encode2_no_mem_s17_LC(
      59             :     BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle            */
      60             :     int16_t *x,
      61             :     int16_t nt,
      62             :     int16_t lastnz,
      63             :     int16_t nbbits,
      64             :     int16_t resQMaxBits,
      65             :     CONTEXT_HM_CONFIG *hm_cfg )
      66             : {
      67             :     int16_t ptr[BITBUFSIZE];
      68             :     Tastat as, as_overflow;
      69             :     int16_t bp, bp_overflow;
      70             :     int16_t a1, b1, a1_i, b1_i, k;
      71             :     uint16_t t;
      72             :     int16_t pki, lev1;
      73             :     int16_t rateFlag;
      74             :     int16_t value;
      75             :     int16_t nbbits_ntuples, nbbits_lsbs, nbbits_signs, nbbits_signs_overflow, nbbits_lsbs_overflow, flag_overflow;
      76             :     int16_t *lsbs_bits;
      77             :     int16_t nt_half;
      78             :     int32_t c[2], *ctx;
      79             :     int32_t p1, p2;
      80             :     int16_t ii[2];
      81             :     int16_t idx1, idx2, idx;
      82             :     int16_t numPeakIndicesOrig, numHoleIndices;
      83             :     uint16_t signs[N_MAX];
      84             :     int16_t nbbits_m2;
      85             : 
      86       30068 :     a1 = 0; /* to avoid compilation warnings */
      87       30068 :     b1 = 0; /* to avoid compilation warnings */
      88             : 
      89             :     /* Rate flag */
      90       30068 :     if ( nbbits > 400 )
      91             :     {
      92       14839 :         rateFlag = 2 << NBITS_CONTEXT;
      93             :     }
      94             :     else
      95             :     {
      96       15229 :         rateFlag = 0;
      97             :     }
      98             : 
      99             :     /* Init */
     100       30068 :     nt_half = nt >> 1;
     101       30068 :     c[0] = c[1] = 0;
     102             : 
     103             :     /* Bits for encoding the number of encoded tuples */
     104       30068 :     nbbits_ntuples = 0;
     105       30068 :     k = 1;
     106             : 
     107      292112 :     while ( k < nt / 2 )
     108             :     {
     109      262044 :         nbbits_ntuples++;
     110      262044 :         k = k << 1;
     111             :     }
     112             : 
     113       30068 :     t = 0;
     114       30068 :     bp = nbbits_ntuples;
     115       30068 :     nbbits_signs = 0;
     116       30068 :     nbbits_lsbs = 0;
     117       30068 :     nbbits_m2 = nbbits - 2;
     118       30068 :     flag_overflow = 0;
     119             : 
     120       30068 :     if ( hm_cfg )
     121             :     {
     122             :         /* mapped domain */
     123        3568 :         numPeakIndicesOrig = hm_cfg->numPeakIndices;
     124        3568 :         hm_cfg->numPeakIndices = min( hm_cfg->numPeakIndices, lastnz );
     125        3568 :         numHoleIndices = lastnz - hm_cfg->numPeakIndices;
     126             : 
     127             :         /* Mark hole indices beyond lastnz as pruned */
     128      753056 :         for ( k = numHoleIndices; k < hm_cfg->numHoleIndices; ++k )
     129             :         {
     130      749488 :             hm_cfg->holeIndices[k] = hm_cfg->holeIndices[k] + nt;
     131             :         }
     132             : 
     133        3568 :         ii[0] = numPeakIndicesOrig;
     134        3568 :         ii[1] = 0;
     135             : 
     136        3568 :         p1 = p2 = 0; /* to avoid compilation warnings */
     137             :     }
     138             :     else
     139             :     {
     140             :         /* unmapped domain */
     141       26500 :         ii[0] = 0;
     142             : 
     143       26500 :         p1 = p2 = 0;
     144             : 
     145             :         /* Find last non-zero tuple */
     146             :         /* ensure termination of while loop by dummy value */
     147       26500 :         a1 = x[0];
     148       26500 :         x[0] = 1;
     149             : 
     150       86884 :         while ( x[lastnz - 1] == 0 && x[lastnz - 2] == 0 )
     151             :         {
     152       60384 :             lastnz -= 2;
     153             :         }
     154       26500 :         x[0] = a1;
     155             :     }
     156             : 
     157       30068 :     lsbs_bits = (int16_t *) ptr + nbbits - 1;
     158             : 
     159             :     /*Start Encoding*/
     160       30068 :     ari_start_encoding_14bits( &as );
     161             : 
     162             :     /*Main Loop through the 2-tuples*/
     163       30068 :     b1_i = -1;
     164             : 
     165     4609186 :     for ( k = 0; k < lastnz; k += 2 )
     166             :     {
     167             : 
     168     4579128 :         if ( hm_cfg )
     169             :         {
     170      496936 :             a1_i = get_next_coeff_mapped( ii, &p1, &idx1, hm_cfg );
     171      496936 :             b1_i = get_next_coeff_mapped( ii, &p2, &idx2, hm_cfg );
     172             :         }
     173             :         else
     174             :         {
     175     4082192 :             a1_i = get_next_coeff_unmapped( ii, &idx1 );
     176     4082192 :             b1_i = get_next_coeff_unmapped( ii, &idx2 );
     177             :         }
     178             : 
     179     4579128 :         idx = min( idx1, idx2 );
     180             : 
     181             :         /* Get context */
     182     4579128 :         ctx = &c[p1 | p2];
     183             : 
     184     4579128 :         t = (uint16_t) ( *ctx + rateFlag );
     185     4579128 :         t += ( nt_half >= idx ) ? 0 : ( 1 << NBITS_CONTEXT );
     186             : 
     187             :         /* Init current 2-tuple encoding */
     188             : 
     189     4579128 :         if ( flag_overflow != 0 )
     190             :         {
     191           0 :             x[a1_i] = 0;
     192           0 :             x[b1_i] = 0;
     193             :         }
     194             : 
     195     4579128 :         a1 = (int16_t) abs( x[a1_i] );
     196     4579128 :         b1 = (int16_t) abs( x[b1_i] );
     197             : 
     198     4579128 :         lev1 = -1;
     199             : 
     200             :         /*Copy states*/
     201     4579128 :         ari_copy_states( &as, &as_overflow );
     202     4579128 :         bp_overflow = bp;
     203     4579128 :         nbbits_signs_overflow = nbbits_signs;
     204     4579128 :         nbbits_lsbs_overflow = nbbits_lsbs;
     205             : 
     206             :         /*Signs encoding*/
     207             : 
     208     4579128 :         if ( a1 > 0 )
     209             :         {
     210     2058166 :             signs[nbbits_signs++] = ( (uint16_t) x[a1_i] >> ( sizeof( uint16_t ) * 8 - 1 ) );
     211             :         }
     212             : 
     213     4579128 :         if ( b1 > 0 )
     214             :         {
     215     2057464 :             signs[nbbits_signs++] = ( (uint16_t) x[b1_i] >> ( sizeof( uint16_t ) * 8 - 1 ) );
     216             :         }
     217             : 
     218             :         /* MSBs coding */
     219     5934046 :         while ( max( a1, b1 ) >= A_THRES )
     220             :         {
     221     1354918 :             pki = ari_lookup_s17_LC[t + ( ( lev1 + 1 ) << ( NBITS_CONTEXT + NBITS_RATEQ ) )];
     222     1354918 :             bp = ari_encode_14bits_ext( ptr, bp, &as, VAL_ESC, ari_pk_s17_LC_ext[pki] );
     223             : 
     224     1354918 :             *lsbs_bits-- = a1 & 1;
     225     1354918 :             *lsbs_bits-- = b1 & 1;
     226             : 
     227             :             /* LSBs bit counting */
     228     1354918 :             nbbits_lsbs += 2;
     229             : 
     230     1354918 :             a1 >>= 1;
     231     1354918 :             b1 >>= 1;
     232             : 
     233     1354918 :             lev1 = min( lev1 + 1, 2 );
     234             :         }
     235             : 
     236     4579128 :         pki = ari_lookup_s17_LC[t + ( ( lev1 + 1 ) << ( NBITS_CONTEXT + NBITS_RATEQ ) )];
     237     4579128 :         bp = ari_encode_14bits_ext( ptr, bp, &as, a1 + A_THRES * b1, ari_pk_s17_LC_ext[pki] );
     238             : 
     239             : 
     240             :         /* Check bit budget */
     241     4579128 :         if ( bp + as.bits_to_follow + nbbits_signs + nbbits_lsbs > nbbits_m2 )
     242             :         {
     243          10 :             ari_copy_states( &as_overflow, &as );
     244          10 :             bp = bp_overflow;
     245             : 
     246          10 :             if ( !flag_overflow )
     247             :             {
     248          10 :                 nbbits_signs = nbbits_signs_overflow;
     249          10 :                 nbbits_lsbs = nbbits_lsbs_overflow;
     250             : 
     251          10 :                 if ( hm_cfg )
     252             :                 {
     253           6 :                     flag_overflow = 1;
     254             : 
     255             :                     /* Code from now only zeros */
     256           6 :                     x[a1_i] = 0;
     257           6 :                     x[b1_i] = 0;
     258           6 :                     lev1 = -1;
     259             : 
     260           6 :                     pki = ari_lookup_s17_LC[t];
     261           6 :                     bp = ari_encode_14bits_ext( ptr, bp, &as, 0, ari_pk_s17_LC_ext[pki] );
     262             : 
     263           6 :                     if ( bp + as.bits_to_follow + nbbits_signs + nbbits_lsbs > nbbits_m2 )
     264             :                     {
     265           6 :                         ari_copy_states( &as_overflow, &as );
     266           6 :                         bp = bp_overflow;
     267           6 :                         break;
     268             :                     }
     269             :                 }
     270             :                 else
     271             :                 {
     272           4 :                     break;
     273             :                 }
     274             :             }
     275             :             else
     276             :             {
     277           0 :                 break;
     278             :             }
     279             :         }
     280             : 
     281             :         /* Update context for next 2-tuple */
     282     4579118 :         if ( p1 == p2 )
     283             :         {
     284             :             /* peak-peak or hole-hole context */
     285             : 
     286     4518606 :             if ( lev1 <= 0 )
     287             :             {
     288     4154648 :                 t = 1 + ( a1 + b1 ) * ( lev1 + 2 );
     289             :             }
     290             :             else
     291             :             {
     292      363958 :                 t = 13 + lev1;
     293             :             }
     294             : 
     295     4518606 :             *ctx = ( *ctx & 0xf ) * 16 + t;
     296             :         }
     297             :         else
     298             :         {
     299             :             /* mixed context */
     300             : 
     301       60512 :             if ( idx1 & 1 )
     302             :             {
     303             :                 /* update first context */
     304       30374 :                 c[p1] = update_mixed_context( c[p1], (int16_t) abs( x[a1_i] ) );
     305             :             }
     306             : 
     307       60512 :             if ( idx2 & 1 )
     308             :             {
     309             :                 /* update second context */
     310       30138 :                 c[p2] = update_mixed_context( c[p2], (int16_t) abs( x[b1_i] ) );
     311             :             }
     312             :         }
     313             :     } /*end of the 2-tuples loop*/
     314             : 
     315             : 
     316             :     /* End arithmetic coder, overflow management */
     317       30068 :     bp = ari_done_encoding_14bits( ptr, bp, &as );
     318             : 
     319             :     /*Overflow is detected*/
     320             : 
     321       30068 :     if ( k != lastnz )
     322             :     {
     323             : 
     324          10 :         if ( hm_cfg )
     325             :         {
     326             :             /*Fill with zero to be sure that decoder finish at the same position the MSB decoding*/
     327             : 
     328           9 :             for ( ; bp < nbbits - ( nbbits_signs + nbbits_lsbs ); )
     329             :             {
     330           3 :                 ptr[bp++] = 0;
     331             :             }
     332             :         }
     333             :         else
     334             :         {
     335           4 :             lastnz = k;
     336             :         }
     337             :     }
     338             : 
     339             :     /* Push number of encoded tuples */
     340       30068 :     value = ( lastnz >> 1 ) - 1;
     341       30068 :     push_next_indice( hBstr, value, nbbits_ntuples );
     342             : 
     343             :     /* Push arithmetic coded bits */
     344       30068 :     push_next_bits( hBstr, (uint16_t *) &ptr[nbbits_ntuples], bp - nbbits_ntuples );
     345             : 
     346             :     /* Push sign bits */
     347       30068 :     push_next_bits( hBstr, (uint16_t *) signs, nbbits_signs );
     348       30068 :     bp += nbbits_signs;
     349             : 
     350             :     /* write residual Quantization bits */
     351      201448 :     for ( k = 0; k < min( nbbits - bp - nbbits_lsbs, resQMaxBits ); k++ )
     352             :     {
     353      171380 :         ptr[nbbits - 1 - nbbits_lsbs - k] = x[nt + k];
     354             :     }
     355             : 
     356             :     /* Write filler bits */
     357      269416 :     for ( ; k < nbbits - bp - nbbits_lsbs; ++k )
     358             :     {
     359      239348 :         ptr[nbbits - 1 - nbbits_lsbs - k] = 0;
     360             :     }
     361             : 
     362             :     /* Check for debugging */
     363       30068 :     assert( bp + k <= nbbits );
     364             : 
     365             :     /* Push the rest of the buffer */
     366       30068 :     push_next_bits( hBstr, (uint16_t *) &ptr[bp], nbbits - bp );
     367             : 
     368             : #ifdef DEBUGGING
     369             :     /* return (bp+nbbits_lsbs);*/ /*return only for debug plot*/
     370             : #endif
     371       30068 :     return;
     372             : }
     373             : 
     374             : /*-------------------------------------------------------------------*
     375             :  * find_last_nz_pair()
     376             :  *
     377             :  *
     378             :  *-------------------------------------------------------------------*/
     379             : 
     380     5082625 : static int16_t find_last_nz_pair(
     381             :     const int16_t x[],
     382             :     const int16_t length,
     383             :     const CONTEXT_HM_CONFIG *hm_cfg )
     384             : {
     385             :     int16_t last_nz, i;
     386             :     const int16_t *tmp;
     387             : 
     388     5082625 :     last_nz = 2;
     389             : 
     390     5082625 :     if ( hm_cfg )
     391             :     {
     392             :         /* mapped kernel */
     393     4941831 :         tmp = hm_cfg->indexBuffer;
     394             : 
     395   948834954 :         for ( i = length; i >= 4; i -= 2 )
     396             :         {
     397             : 
     398   948276043 :             if ( x[tmp[i - 2]] != 0 || x[tmp[i - 1]] != 0 )
     399             :             {
     400     4382920 :                 last_nz = i;
     401     4382920 :                 break;
     402             :             }
     403             :         }
     404             :     }
     405             :     else
     406             :     {
     407             :         /* unmapped kernel */
     408             : 
     409    20624664 :         for ( i = length; i >= 4; i -= 2 )
     410             :         {
     411             : 
     412    20623744 :             if ( x[i - 2] != 0 || x[i - 1] != 0 )
     413             :             {
     414      139874 :                 last_nz = i;
     415      139874 :                 break;
     416             :             }
     417             :         }
     418             :     }
     419             : 
     420     5082625 :     return last_nz;
     421             : }
     422             : 
     423             : 
     424             : /*-------------------------------------------------------------------*
     425             :  * ACcontextMapping_encode2_estimate_no_mem_s17_LC()
     426             :  *
     427             :  *
     428             :  *-------------------------------------------------------------------*/
     429             : 
     430      196606 : int16_t ACcontextMapping_encode2_estimate_no_mem_s17_LC(
     431             :     const int16_t *x,
     432             :     const int16_t nt,
     433             :     int16_t *lastnz_out,
     434             :     int16_t *nEncoded,
     435             :     const int16_t target,
     436             :     int16_t *stop,
     437             :     CONTEXT_HM_CONFIG *hm_cfg )
     438             : {
     439             :     int16_t a1, b1, a1_i, b1_i;
     440             :     int16_t k, pki, lev1;
     441             :     uint16_t t;
     442             :     int16_t lastnz, lastnz2;
     443             :     int16_t rateFlag;
     444             :     int16_t nbits_old, nbits;
     445             :     int16_t stop2;
     446             :     int32_t proba;
     447             :     int16_t nlz;
     448             :     const uint16_t *cum_freq;
     449             :     int16_t symbol;
     450             :     const uint8_t *lookup;
     451             :     int16_t nt_half;
     452             :     int32_t c[2], *ctx;
     453             :     int32_t p1, p2;
     454             :     int16_t ii[2];
     455             :     int16_t idx1, idx2, idx;
     456      196606 :     int16_t numPeakIndicesOrig = 0, numHoleIndices = 0; /* only to avoid compiler warning */
     457             : 
     458             :     /* Rate flag */
     459      196606 :     if ( target > 400 )
     460             :     {
     461       87352 :         rateFlag = 2 << NBITS_CONTEXT;
     462             :     }
     463             :     else
     464             :     {
     465      109254 :         rateFlag = 0;
     466             :     }
     467             : 
     468             :     /* 2 bits = arithmetic coder initialization interval = 1 bits for rounding last proba + 1 bit?*/
     469      196606 :     nbits = 2;
     470             :     /*proba coded on 14bits -> proba=1*/
     471      196606 :     proba = 16384;
     472             : 
     473             :     /* Init */
     474      196606 :     nt_half = nt >> 1;
     475      196606 :     stop2 = 0;
     476      196606 :     c[0] = c[1] = 0;
     477             : 
     478             :     /* bits to encode lastnz */
     479      196606 :     k = 1;
     480             : 
     481     1912141 :     while ( k < nt / 2 )
     482             :     {
     483     1715535 :         nbits++;
     484     1715535 :         k = k << 1;
     485             :         /* check while condition */
     486             :     }
     487      196606 :     nbits_old = nbits;
     488             : 
     489      196606 :     nbits -= target;
     490             : 
     491             :     /* Find last non-zero tuple in the mapped domain signal */
     492      196606 :     lastnz = find_last_nz_pair( x, nt, hm_cfg );
     493             : 
     494             :     /* At least one tuple is coded */
     495      196606 :     lastnz2 = 2;
     496             : 
     497      196606 :     if ( hm_cfg )
     498             :     {
     499             :         /* mapped domain */
     500       55812 :         numPeakIndicesOrig = hm_cfg->numPeakIndices;
     501       55812 :         hm_cfg->numPeakIndices = min( hm_cfg->numPeakIndices, lastnz );
     502       55812 :         numHoleIndices = lastnz - hm_cfg->numPeakIndices;
     503             : 
     504             :         /* Mark hole indices beyond lastnz as pruned */
     505    12692546 :         for ( k = numHoleIndices; k < hm_cfg->numHoleIndices; ++k )
     506             :         {
     507    12636734 :             hm_cfg->holeIndices[k] = hm_cfg->holeIndices[k] + nt;
     508             :         }
     509             : 
     510       55812 :         ii[0] = numPeakIndicesOrig;
     511       55812 :         ii[1] = 0;
     512             : 
     513       55812 :         p1 = p2 = 0; /* to avoid compilation warnings */
     514             :     }
     515             :     else
     516             :     {
     517             :         /* unmapped domain */
     518      140794 :         ii[0] = 0;
     519             : 
     520      140794 :         p1 = p2 = 0;
     521             :     }
     522             : 
     523             :     /* Main Loop through the 2-tuples */
     524    30155471 :     for ( k = 0; k < lastnz; k += 2 )
     525             :     {
     526    29979832 :         if ( hm_cfg )
     527             :         {
     528     8477101 :             a1_i = get_next_coeff_mapped( ii, &p1, &idx1, hm_cfg );
     529     8477101 :             b1_i = get_next_coeff_mapped( ii, &p2, &idx2, hm_cfg );
     530             :         }
     531             :         else
     532             :         {
     533    21502731 :             a1_i = get_next_coeff_unmapped( ii, &idx1 );
     534    21502731 :             b1_i = get_next_coeff_unmapped( ii, &idx2 );
     535             :         }
     536             : 
     537    29979832 :         idx = min( idx1, idx2 );
     538             : 
     539             :         /* Get context */
     540    29979832 :         ctx = &c[p1 | p2];
     541             : 
     542    29979832 :         t = (uint16_t) ( *ctx + rateFlag );
     543    29979832 :         t += ( nt_half >= idx ) ? 0 : ( 1 << NBITS_CONTEXT );
     544             : 
     545             :         /* Init current 2-tuple encoding */
     546    29979832 :         a1 = (int16_t) abs( x[a1_i] );
     547    29979832 :         b1 = (int16_t) abs( x[b1_i] );
     548    29979832 :         lev1 = -( 1 << ( NBITS_CONTEXT + NBITS_RATEQ ) );
     549             : 
     550             :         /* Signs Bits */
     551    29979832 :         nbits += min( a1, 1 );
     552    29979832 :         nbits += min( b1, 1 );
     553             : 
     554             :         /* pre-compute address of ari_pk_s17_LC_ext[0][Val_esc] to avoid doing it multiple times inside the loop */
     555    29979832 :         lookup = &ari_lookup_s17_LC[t] + ( 1 << ( NBITS_CONTEXT + NBITS_RATEQ ) );
     556             : 
     557             :         /* check while condition */
     558             :         /* MSBs coding */
     559    37171162 :         while ( max( a1, b1 ) >= A_THRES )
     560             :         {
     561     7191330 :             pki = lookup[lev1];
     562     7191330 :             cum_freq = ari_pk_s17_LC_ext[pki] + VAL_ESC;
     563             :             /*p1*p2=proba on 28 bits: p=0.5->power(2,27)*/
     564     7191330 :             proba *= *( cum_freq );
     565             :             /*Number of leading zero computed in one cycle=norm_l() in BASOP*/
     566     7191330 :             nlz = 2;
     567    16475727 :             while ( proba < 134217728 ) /*power(2,27)*/
     568             :             {
     569     9284397 :                 nlz++;
     570     9284397 :                 proba = proba << 1;
     571             :             }
     572     7191330 :             nbits += nlz;
     573             :             /*addition added as shift not done in norm_l(): real shift = 14-nlz*/
     574     7191330 :             proba >>= 14; /*proba is rounded down on 14 bits ->automatic over-estimation of bit consumption*/
     575             : 
     576     7191330 :             ( a1 ) >>= 1;
     577     7191330 :             ( b1 ) >>= 1;
     578             : 
     579     7191330 :             lev1 = min( lev1 + ( 1 << ( NBITS_CONTEXT + NBITS_RATEQ ) ), 2 << ( NBITS_CONTEXT + NBITS_RATEQ ) );
     580             :             /* check while condition */
     581             :         }
     582    29979832 :         pki = lookup[lev1];
     583    29979832 :         symbol = a1 + A_THRES * b1;
     584    29979832 :         cum_freq = ari_pk_s17_LC_ext[pki] + symbol;
     585             :         /*p1*p2=proba on 28 bits: p=0.5->power(2,27)*/
     586    29979832 :         proba *= ( cum_freq[0] - cum_freq[1] );
     587             :         /*Number of leading zero computed in one cycle=norm_l() in BASOP*/
     588    29979832 :         nlz = 0;
     589   106561153 :         while ( proba < 134217728 ) /*power(2,27)*/
     590             :         {
     591    76581321 :             nlz++;
     592    76581321 :             proba = proba << 1;
     593             :         }
     594             : 
     595    29979832 :         nbits += nlz;
     596    29979832 :         proba >>= 14; /*proba is rounded down on 14 bits ->automatic over-estimation of bit consumption*/
     597             : 
     598             :         /* Should we truncate? */
     599    29979832 :         if ( nbits > 0 )
     600             :         {
     601     1683662 :             stop2 = 1;
     602             : 
     603     1683662 :             if ( *stop )
     604             :             {
     605       20967 :                 break;
     606             :             }
     607             :         }
     608             :         else
     609             :         {
     610    28296170 :             if ( hm_cfg || k == 0 || x[a1_i] || x[b1_i] )
     611             :             {
     612    20341724 :                 nbits_old = nbits + target;
     613    20341724 :                 lastnz2 = b1_i + 1;
     614             :             }
     615             :         }
     616             : 
     617             :         /* Update context for next 2-tuple */
     618    29958865 :         if ( p1 == p2 ) /* peak-peak or hole-hole context */
     619             :         {
     620    28550445 :             lev1 >>= NBITS_CONTEXT + NBITS_RATEQ;
     621             : 
     622    28550445 :             if ( lev1 <= 0 )
     623             :             {
     624    26671129 :                 t = 1 + ( a1 + b1 ) * ( lev1 + 2 );
     625             :             }
     626             :             else
     627             :             {
     628     1879316 :                 t = 13 + lev1;
     629             :             }
     630             : 
     631    28550445 :             *ctx = ( *ctx & 0xf ) * 16 + t;
     632             :         }
     633             :         else
     634             :         {
     635             :             /* mixed context */
     636             : 
     637     1408420 :             if ( idx1 & 1 )
     638             :             {
     639             :                 /* update first context */
     640      690617 :                 c[p1] = update_mixed_context( c[p1], (int16_t) abs( x[a1_i] ) );
     641             :             }
     642             : 
     643     1408420 :             if ( idx2 & 1 )
     644             :             {
     645             :                 /* update second context */
     646      714625 :                 c[p2] = update_mixed_context( c[p2], (int16_t) abs( x[b1_i] ) );
     647             :             }
     648             :         }
     649             :     } /*end of the 2-tuples loop*/
     650             : 
     651      196606 :     nbits += target;
     652             : 
     653             :     /* Output */
     654             : 
     655      196606 :     if ( *stop )
     656             :     {
     657       23259 :         nbits = nbits_old;
     658             :     }
     659             : 
     660      196606 :     if ( stop2 )
     661             :     {
     662      107110 :         stop2 = nbits;
     663             :     }
     664      196606 :     *nEncoded = lastnz2;
     665      196606 :     *stop = stop2;
     666      196606 :     *lastnz_out = lastnz;
     667             : 
     668      196606 :     if ( hm_cfg )
     669             :     {
     670             :         /* Restore hole indices beyond lastnz */
     671    12692546 :         for ( k = numHoleIndices; k < hm_cfg->numHoleIndices; ++k )
     672             :         {
     673    12636734 :             hm_cfg->holeIndices[k] = hm_cfg->holeIndices[k] - nt;
     674             :         }
     675       55812 :         hm_cfg->numPeakIndices = numPeakIndicesOrig;
     676             :     }
     677             : 
     678      196606 :     return nbits_old;
     679             : }
     680             : 
     681             : 
     682             : /* Range Coder Functions */
     683             : 
     684             : /*-------------------------------------------------------------------*
     685             :  * RCcontextMapping_encode2_no_mem_s17_LCS()
     686             :  *
     687             :  * Range encoder
     688             :  *-------------------------------------------------------------------*/
     689             : 
     690    14519543 : void RCcontextMapping_encode2_no_mem_s17_LCS(
     691             :     BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle            */
     692             :     int16_t *x,
     693             :     const int16_t nt,
     694             :     int16_t lastnz,
     695             :     const int16_t nbbits,
     696             :     const int16_t resQMaxBits,
     697             :     CONTEXT_HM_CONFIG *hm_cfg )
     698             : {
     699             :     int16_t ptr[BITBUFSIZE];
     700             :     RangeUniEncState rc_st_enc;
     701             :     int16_t bp;
     702             :     int16_t rc_tot_bits; /* No. of bits returned by range coder */
     703             :     int16_t pki, lev1;
     704             :     uint16_t t;
     705             :     int16_t rateFlag;
     706             :     int16_t value;
     707             :     int16_t nbbits_ntuples, nbbits_lsbs, nbbits_signs;
     708             :     int16_t *lsbs_bits;
     709             :     int16_t nt_half;
     710             :     int16_t signs[N_MAX];
     711             :     int16_t a1, b1, k;
     712             : 
     713    14519543 :     a1 = 0; /* to avoid compilation warnings */
     714    14519543 :     b1 = 0; /* to avoid compilation warnings */
     715             : 
     716             :     /* Init */
     717    14519543 :     nt_half = nt >> 1;
     718             : 
     719             :     /* Bits for encoding the number of encoded tuples */
     720    14519543 :     nbbits_ntuples = 0;
     721    14519543 :     k = 1;
     722   142935123 :     while ( k < nt / 2 )
     723             :     {
     724   128415580 :         nbbits_ntuples++;
     725   128415580 :         k = k << 1;
     726             :     }
     727             : 
     728    14519543 :     t = 0;
     729    14519543 :     nbbits_signs = 0;
     730    14519543 :     nbbits_lsbs = 0;
     731             : 
     732    14519543 :     if ( hm_cfg )
     733             :     {
     734             :         int16_t a1_i, b1_i;
     735             :         int32_t c[2], *ctx;
     736             :         int32_t p1, p2;
     737             :         int16_t ii[2];
     738             :         int16_t idx1, idx2, idx;
     739             :         int16_t numPeakIndicesOrig, numHoleIndices;
     740             : 
     741             :         /* Rate flag */
     742      155604 :         if ( nbbits > 400 )
     743             :         {
     744       61907 :             rateFlag = 2 << NBITS_CONTEXT;
     745             :         }
     746             :         else
     747             :         {
     748       93697 :             rateFlag = 0;
     749             :         }
     750             : 
     751      155604 :         c[0] = c[1] = 0;
     752             : 
     753             :         /* mapped domain */
     754      155604 :         numPeakIndicesOrig = hm_cfg->numPeakIndices;
     755      155604 :         hm_cfg->numPeakIndices = min( hm_cfg->numPeakIndices, lastnz );
     756      155604 :         numHoleIndices = lastnz - hm_cfg->numPeakIndices;
     757             : 
     758             :         /* Mark hole indices beyond lastnz as pruned */
     759    55549420 :         for ( k = numHoleIndices; k < hm_cfg->numHoleIndices; ++k )
     760             :         {
     761    55393816 :             hm_cfg->holeIndices[k] = hm_cfg->holeIndices[k] + nt;
     762             :         }
     763             : 
     764      155604 :         ii[0] = numPeakIndicesOrig;
     765      155604 :         ii[1] = 0;
     766             : 
     767      155604 :         p1 = p2 = 0; /* to avoid compilation warnings */
     768             : 
     769      155604 :         lsbs_bits = ptr + nbbits - 1;
     770             : 
     771             :         /*Start Encoding*/
     772             :         /* Initialize range encoder */
     773      155604 :         rc_uni_enc_init( &rc_st_enc );
     774             : 
     775             :         /*Main Loop through the 2-tuples*/
     776      155604 :         b1_i = -1;
     777             : 
     778    26166416 :         for ( k = 0; k < lastnz; k += 2 )
     779             :         {
     780    26010812 :             a1_i = get_next_coeff_mapped( ii, &p1, &idx1, hm_cfg );
     781    26010812 :             b1_i = get_next_coeff_mapped( ii, &p2, &idx2, hm_cfg );
     782             : 
     783    26010812 :             idx = min( idx1, idx2 );
     784             : 
     785             :             /* Get context */
     786    26010812 :             ctx = &c[p1 | p2];
     787             : 
     788    26010812 :             t = (uint16_t) ( *ctx + rateFlag );
     789    26010812 :             t += ( nt_half >= idx ) ? 0 : ( 1 << NBITS_CONTEXT );
     790             : 
     791             :             /* Init current 2-tuple encoding */
     792    26010812 :             a1 = (int16_t) abs( x[a1_i] );
     793    26010812 :             b1 = (int16_t) abs( x[b1_i] );
     794             : 
     795    26010812 :             lev1 = -1;
     796             : 
     797             :             /*Signs encoding*/
     798    26010812 :             if ( a1 > 0 )
     799             :             {
     800     5682990 :                 signs[nbbits_signs++] = ( (uint16_t) x[a1_i] >> ( sizeof( uint16_t ) * 8 - 1 ) );
     801             :             }
     802             : 
     803    26010812 :             if ( b1 > 0 )
     804             :             {
     805     5653944 :                 signs[nbbits_signs++] = ( (uint16_t) x[b1_i] >> ( sizeof( uint16_t ) * 8 - 1 ) );
     806             :             }
     807             : 
     808             :             /* MSBs coding */
     809    28464107 :             while ( max( a1, b1 ) >= A_THRES )
     810             :             {
     811     2453295 :                 pki = ari_lookup_s17_LC[t + ( ( lev1 + 1 ) << ( NBITS_CONTEXT + NBITS_RATEQ ) )];
     812     2453295 :                 rc_uni_enc_encode_symbol_fastS( &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 */
     813             : 
     814     2453295 :                 *lsbs_bits-- = a1 & 1;
     815     2453295 :                 *lsbs_bits-- = b1 & 1;
     816             : 
     817             :                 /* LSBs bit counting */
     818     2453295 :                 nbbits_lsbs += 2;
     819             : 
     820     2453295 :                 a1 >>= 1;
     821     2453295 :                 b1 >>= 1;
     822             : 
     823     2453295 :                 lev1 = min( lev1 + 1, 2 );
     824             :             }
     825             : 
     826    26010812 :             pki = ari_lookup_s17_LC[t + ( ( lev1 + 1 ) << ( NBITS_CONTEXT + NBITS_RATEQ ) )];
     827    26010812 :             rc_uni_enc_encode_symbol_fastS( &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 */
     828             : 
     829             :             /*Confirm that there is no overflow, i.e. bit-budget has not exceeded */
     830             : #ifdef DEBUGGING
     831             :             assert( rc_uni_enc_virtual_finish( &rc_st_enc ) <= nbbits - nbbits_signs - nbbits_lsbs - nbbits_ntuples );
     832             : #endif
     833             : 
     834             :             /* Update context for next 2-tuple */
     835    26010812 :             if ( p1 == p2 )
     836             :             {
     837             :                 /* peak-peak or hole-hole context */
     838             : 
     839    23641358 :                 if ( lev1 <= 0 )
     840             :                 {
     841    23191464 :                     t = 1 + ( a1 + b1 ) * ( lev1 + 2 );
     842             :                 }
     843             :                 else
     844             :                 {
     845      449894 :                     t = 13 + lev1;
     846             :                 }
     847             : 
     848    23641358 :                 *ctx = ( *ctx & 0xf ) * 16 + t;
     849             :             }
     850             :             else
     851             :             {
     852             :                 /* mixed context */
     853             : 
     854     2369454 :                 if ( idx1 & 1 )
     855             :                 {
     856             :                     /* update first context */
     857     1168625 :                     c[p1] = update_mixed_context( c[p1], (int16_t) abs( x[a1_i] ) );
     858             :                 }
     859             : 
     860     2369454 :                 if ( idx2 & 1 )
     861             :                 {
     862             :                     /* update second context */
     863     1200829 :                     c[p2] = update_mixed_context( c[p2], (int16_t) abs( x[b1_i] ) );
     864             :                 }
     865             :             }
     866             : 
     867             :         } /*end of the 2-tuples loop*/
     868             :     }
     869             :     else /* if (!hm_cfg) */
     870             :     {
     871             :         int16_t cp;
     872             :         int16_t esc_nb, rateQ;
     873             :         uint16_t s;
     874             : 
     875             :         /* Rate flag */
     876    14363939 :         if ( nbbits > 400 )
     877             :         {
     878    10066951 :             rateFlag = 2;
     879             :         }
     880             :         else
     881             :         {
     882     4296988 :             rateFlag = 0;
     883             :         }
     884             : 
     885    14363939 :         s = 0;
     886             : 
     887             :         /* Find last non-zero tuple */
     888             :         /* ensure termination of while loop by dummy value */
     889    14363939 :         a1 = x[0];
     890    14363939 :         x[0] = 1; /* ensure first tuple is non-zero */
     891             : 
     892   116330655 :         while ( x[lastnz - 1] == 0 && x[lastnz - 2] == 0 )
     893             :         {
     894   101966716 :             lastnz -= 2;
     895             :         }
     896    14363939 :         x[0] = a1;
     897             : 
     898    14363939 :         lsbs_bits = ptr + nbbits - 1;
     899             : 
     900             :         /*Start Encoding*/
     901             :         /* Initialize range encoder */
     902    14363939 :         rc_uni_enc_init( &rc_st_enc );
     903             : 
     904             :         /*Main Loop through the 2-tuples*/
     905  2987534121 :         for ( k = 0; k < lastnz; k += 2 )
     906             :         {
     907             : 
     908             :             /* Init current 2-tuple encoding */
     909  2973170182 :             a1 = (int16_t) abs( x[k + 0] );
     910  2973170182 :             b1 = (int16_t) abs( x[k + 1] );
     911             : 
     912  2973170182 :             lev1 = 0;
     913  2973170182 :             esc_nb = 0;
     914             : 
     915             :             /*Signs encoding*/
     916  2973170182 :             if ( a1 > 0 )
     917             :             {
     918  1157586843 :                 signs[nbbits_signs++] = ( (uint16_t) x[k + 0] >> ( sizeof( uint16_t ) * 8 - 1 ) );
     919             :             }
     920             : 
     921  2973170182 :             if ( b1 > 0 )
     922             :             {
     923  1157934399 :                 signs[nbbits_signs++] = ( (uint16_t) x[k + 1] >> ( sizeof( uint16_t ) * 8 - 1 ) );
     924             :             }
     925             : 
     926  2973170182 :             rateQ = rateFlag + ( k > ( nt >> 1 ) );
     927             : 
     928             :             /* MSBs coding */
     929  3587908529 :             while ( max( a1, b1 ) >= A_THRES )
     930             :             {
     931   614738347 :                 pki = ari_lookup_s17_LC[t + ( ( rateQ ) << NBITS_CONTEXT ) + ( esc_nb << ( NBITS_CONTEXT + NBITS_RATEQ ) )];
     932   614738347 :                 rc_uni_enc_encode_symbol_fastS( &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 */
     933             : 
     934   614738347 :                 *lsbs_bits-- = a1 & 1;
     935   614738347 :                 *lsbs_bits-- = b1 & 1;
     936             : 
     937             :                 /* LSBs bit counting */
     938   614738347 :                 nbbits_lsbs += 2;
     939             : 
     940   614738347 :                 a1 >>= 1;
     941   614738347 :                 b1 >>= 1;
     942             : 
     943   614738347 :                 lev1++;
     944   614738347 :                 esc_nb = min( lev1, 3 );
     945             :             }
     946             : 
     947  2973170182 :             pki = ari_lookup_s17_LC[t + ( ( rateQ ) << NBITS_CONTEXT ) + ( esc_nb << ( NBITS_CONTEXT + NBITS_RATEQ ) )];
     948  2973170182 :             rc_uni_enc_encode_symbol_fastS( &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 */
     949             : 
     950             :             /*Confirm that there is no overflow, i.e. bit-budget has not exceeded */
     951             : #ifdef DEBUGGING
     952             :             assert( rc_uni_enc_virtual_finish( &rc_st_enc ) <= nbbits - nbbits_signs - nbbits_lsbs - nbbits_ntuples );
     953             : #endif
     954             : 
     955             :             /* Update context for next 2-tuple */
     956  2973170182 :             if ( esc_nb < 2 )
     957             :             {
     958  2819564818 :                 cp = 1 + ( ( a1 + b1 ) * ( esc_nb + 1 ) );
     959             :             }
     960             :             else
     961             :             {
     962   153605364 :                 cp = 12 + esc_nb;
     963             :             }
     964             : 
     965             :             /*Shift old 4 bits, replace last 4 bits*/
     966             : #ifdef FIX_1464_UBSAN_RC_CONTEXT_MAP
     967  2973170182 :             s = s & 0x0F;
     968             : #endif
     969  2973170182 :             s = ( s << 4 ) + cp;
     970  2973170182 :             t = s & 0xFF;
     971             : 
     972             :         } /*end of the 2-tuples loop*/
     973             :     }
     974             : 
     975             :     /* Finish range encoder */
     976    14519543 :     rc_tot_bits = rc_uni_enc_finish( &rc_st_enc ); /* No. of bits consumed by range coder */
     977    14519543 :     bp = rc_tot_bits + nbbits_ntuples;             /* Update bitstream pointer */
     978             : 
     979             :     /* Cross-check that there is no overflow */
     980             : #ifdef DEBUGGING
     981             :     assert( k == lastnz );
     982             : #endif
     983             : 
     984             :     /* Push number of encoded tuples */
     985    14519543 :     value = ( lastnz >> 1 ) - 1;
     986    14519543 :     push_next_indice( hBstr, value, nbbits_ntuples );
     987             : 
     988             :     /* Push range coded bits from byte_buffer to bitstream */
     989             :     /* 1) Push all complete bytes, one byte at a time */
     990  1044364471 :     for ( k = 0; k < ( rc_tot_bits >> 3 ); k++ )
     991             :     {
     992  1029844928 :         push_next_indice( hBstr, rc_st_enc.byte_buffer[k], 8 );
     993             :     }
     994             :     /* 2) Push remaining bits */
     995    14519543 :     if ( ( rc_tot_bits & 7 ) != 0 )
     996             :     {
     997    12743146 :         push_next_indice( hBstr, rc_st_enc.byte_buffer[k] >> ( 8 - ( rc_tot_bits & 7 ) ), rc_tot_bits & 7 );
     998             :     }
     999             : 
    1000             :     /* Push sign bits */
    1001    14519543 :     push_next_bits( hBstr, (uint16_t *) signs, nbbits_signs );
    1002    14519543 :     bp += nbbits_signs;
    1003             : 
    1004             :     /*write residual Quantization bits*/
    1005             : 
    1006   120447617 :     for ( k = 0; k < min( nbbits - bp - nbbits_lsbs, resQMaxBits ); k++ )
    1007             :     {
    1008   105928074 :         ptr[nbbits - 1 - nbbits_lsbs - k] = x[nt + k];
    1009             :     }
    1010             :     /* Write filler bits */
    1011   797757090 :     for ( ; k < nbbits - bp - nbbits_lsbs; ++k )
    1012             :     {
    1013   783237547 :         ptr[nbbits - 1 - nbbits_lsbs - k] = 0;
    1014             :     }
    1015             : 
    1016             :     /* Check for debugging */
    1017    14519543 :     assert( bp + k <= nbbits );
    1018             : 
    1019             :     /* Push the rest of the buffer */
    1020    14519543 :     push_next_bits( hBstr, (uint16_t *) &ptr[bp], nbbits - bp );
    1021             : 
    1022             :     /* return (bp+nbbits_lsbs);*/ /*return only for debug plot*/
    1023    14519543 :     return;
    1024             : }
    1025             : 
    1026             : /*-------------------------------------------------------------------*
    1027             :  * RCcontextMapping_encode2_estimate_no_mem_s17_LCS()
    1028             :  *
    1029             :  * Range coder bit-estimation
    1030             :  *-------------------------------------------------------------------*/
    1031             : 
    1032    64303743 : int16_t RCcontextMapping_encode2_estimate_no_mem_s17_LCS(
    1033             :     int16_t *x,       /* Spectral coefficients */
    1034             :     const int16_t nt, /* L - size of spectrum (no. of spectral coefficients) */
    1035             :     int16_t *lastnz_out,
    1036             :     int16_t *nEncoded,    /* No. of spectral coefficients that can be coded without an overflow occuring */
    1037             :     const int16_t target, /* Target bits */
    1038             :     int16_t *stop,
    1039             :     int16_t mode,
    1040             :     CONTEXT_HM_CONFIG *hm_cfg /* context-based harmonic model configuration */
    1041             : )
    1042             : {
    1043             :     /* Common variables */
    1044             :     int16_t a1, b1;
    1045             :     int16_t k, pki, lev1;
    1046             :     uint16_t t;
    1047             :     int16_t lastnz, lastnz2;
    1048             :     int16_t rateFlag;
    1049             :     float bit_estimate;
    1050             :     int16_t symbol;
    1051             :     const uint8_t *lookup;
    1052             :     float nbits2;
    1053             : 
    1054             :     /* Initialization */
    1055    64303743 :     bit_estimate = 2.0f;
    1056    64303743 :     nbits2 = 0.f;
    1057             : 
    1058             :     /* bits to encode lastnz */
    1059    64303743 :     k = 1;
    1060             : 
    1061   627947812 :     while ( k < nt / 2 )
    1062             :     {
    1063   563644069 :         bit_estimate++;
    1064   563644069 :         k = k << 1;
    1065             :         /* check while condition */
    1066             :     }
    1067             : 
    1068    64303743 :     nbits2 = bit_estimate;
    1069             : 
    1070    64303743 :     if ( hm_cfg )
    1071             :     {
    1072             :         int16_t a1_i, b1_i;
    1073             :         int16_t stop2;
    1074             :         int16_t total_output_bits;
    1075             :         int16_t nt_half;
    1076             :         int32_t c[2], *ctx;
    1077             :         int32_t p1, p2;
    1078             :         int16_t ii[2];
    1079             :         int16_t idx1, idx2, idx;
    1080     4886019 :         int16_t numPeakIndicesOrig = 0, numHoleIndices = 0; /* only to avoid compiler warning */
    1081             : 
    1082             :         /* Rate flag */
    1083     4886019 :         if ( target > 400 )
    1084             :         {
    1085     2637781 :             rateFlag = 2 << NBITS_CONTEXT; /* Select context-A for higher bitrates */
    1086             :         }
    1087             :         else
    1088             :         {
    1089     2248238 :             rateFlag = 0; /* Select context-B for lower bitrates */
    1090             :         }
    1091             : 
    1092     4886019 :         nt_half = nt >> 1;
    1093     4886019 :         stop2 = 0;
    1094     4886019 :         c[0] = c[1] = 0;
    1095             : 
    1096             :         /* Find last non-zero tuple in the mapped domain signal */
    1097     4886019 :         lastnz = find_last_nz_pair( x, nt, hm_cfg );
    1098             : 
    1099     4886019 :         lastnz2 = 2;
    1100             : 
    1101             :         /* mapped domain */
    1102     4886019 :         numPeakIndicesOrig = hm_cfg->numPeakIndices;
    1103     4886019 :         hm_cfg->numPeakIndices = min( hm_cfg->numPeakIndices, lastnz );
    1104     4886019 :         numHoleIndices = lastnz - hm_cfg->numPeakIndices;
    1105             : 
    1106             :         /* Mark hole indices beyond lastnz as pruned */
    1107  1675598178 :         for ( k = numHoleIndices; k < hm_cfg->numHoleIndices; ++k )
    1108             :         {
    1109  1670712159 :             hm_cfg->holeIndices[k] = hm_cfg->holeIndices[k] + nt;
    1110             :         }
    1111             : 
    1112     4886019 :         ii[0] = numPeakIndicesOrig;
    1113     4886019 :         ii[1] = 0;
    1114             : 
    1115     4886019 :         p1 = p2 = 0; /* to avoid compilation warnings */
    1116             : 
    1117             :         /* Main Loop through the 2-tuples */
    1118   858962345 :         for ( k = 0; k < lastnz; k += 2 )
    1119             :         {
    1120   855685548 :             a1_i = get_next_coeff_mapped( ii, &p1, &idx1, hm_cfg );
    1121   855685548 :             b1_i = get_next_coeff_mapped( ii, &p2, &idx2, hm_cfg );
    1122             : 
    1123   855685548 :             idx = min( idx1, idx2 );
    1124             : 
    1125             :             /* Get context */
    1126   855685548 :             ctx = &c[p1 | p2];
    1127             : 
    1128   855685548 :             t = (uint16_t) ( *ctx + rateFlag );
    1129   855685548 :             t += ( nt_half >= idx ) ? 0 : ( 1 << NBITS_CONTEXT );
    1130             : 
    1131             :             /* Init current 2-tuple encoding */
    1132   855685548 :             a1 = (int16_t) abs( x[a1_i] );
    1133   855685548 :             b1 = (int16_t) abs( x[b1_i] );
    1134   855685548 :             lev1 = -( 1 << ( NBITS_CONTEXT + NBITS_RATEQ ) );
    1135             : 
    1136             :             /* Signs Bits */
    1137   855685548 :             bit_estimate += min( a1, 1 );
    1138   855685548 :             bit_estimate += min( b1, 1 );
    1139             : 
    1140             :             /* pre-compute address of ari_pk_s17_LC_ext[0][Val_esc] to avoid doing it multiple times inside the loop */
    1141   855685548 :             lookup = &ari_lookup_s17_LC[t] + ( 1 << ( NBITS_CONTEXT + NBITS_RATEQ ) );
    1142             : 
    1143             :             /* check while condition */
    1144             :             /* MSBs coding */
    1145   950114235 :             while ( max( a1, b1 ) >= A_THRES )
    1146             :             {
    1147    94428687 :                 pki = lookup[lev1]; /* ESC symbol */
    1148             : 
    1149    94428687 :                 bit_estimate = bit_estimate + ari_bit_estimate_s17_LC[pki][VAL_ESC];
    1150    94428687 :                 bit_estimate += 2; /* Add 2 LSB bits corresponding to the bit-plane */
    1151             : 
    1152    94428687 :                 ( a1 ) >>= 1;
    1153    94428687 :                 ( b1 ) >>= 1;
    1154             : 
    1155    94428687 :                 lev1 = min( lev1 + ( 1 << ( NBITS_CONTEXT + NBITS_RATEQ ) ), 2 << ( NBITS_CONTEXT + NBITS_RATEQ ) );
    1156             : 
    1157             :                 /* check while condition */
    1158             :             }
    1159             : 
    1160   855685548 :             pki = lookup[lev1];
    1161             : 
    1162   855685548 :             symbol = a1 + A_THRES * b1;
    1163   855685548 :             bit_estimate = bit_estimate + ari_bit_estimate_s17_LC[pki][symbol];
    1164             : 
    1165             :             /* Should we truncate? */
    1166   855685548 :             if ( bit_estimate > target )
    1167             :             {
    1168   119250484 :                 stop2 = 1;
    1169             : 
    1170   119250484 :                 if ( *stop )
    1171             :                 {
    1172     1609222 :                     break;
    1173             :                 }
    1174             :             }
    1175             :             else
    1176             :             {
    1177   736435064 :                 lastnz2 = b1_i + 1;
    1178   736435064 :                 nbits2 = bit_estimate;
    1179             :             }
    1180             : 
    1181             :             /* Update context for next 2-tuple */
    1182   854076326 :             if ( p1 == p2 ) /* peak-peak or hole-hole context */
    1183             :             {
    1184   716649184 :                 lev1 >>= NBITS_CONTEXT + NBITS_RATEQ;
    1185             : 
    1186   716649184 :                 if ( lev1 <= 0 )
    1187             :                 {
    1188   699443792 :                     t = 1 + ( a1 + b1 ) * ( lev1 + 2 );
    1189             :                 }
    1190             :                 else
    1191             :                 {
    1192    17205392 :                     t = 13 + lev1;
    1193             :                 }
    1194             : 
    1195   716649184 :                 *ctx = ( *ctx & 0xf ) * 16 + t;
    1196             :             }
    1197             :             else
    1198             :             {
    1199             :                 /* mixed context */
    1200             : 
    1201   137427142 :                 if ( idx1 & 1 )
    1202             :                 {
    1203             :                     /* update first context */
    1204    68427985 :                     c[p1] = update_mixed_context( c[p1], (int16_t) abs( x[a1_i] ) );
    1205             :                 }
    1206             : 
    1207   137427142 :                 if ( idx2 & 1 )
    1208             :                 {
    1209             :                     /* update second context */
    1210    68737356 :                     c[p2] = update_mixed_context( c[p2], (int16_t) abs( x[b1_i] ) );
    1211             :                 }
    1212             :             }
    1213             : 
    1214             :         } /*end of the 2-tuples loop*/
    1215             : 
    1216     4886019 :         total_output_bits = (int16_t) ( bit_estimate + 0.5f );
    1217     4886019 :         if ( *stop )
    1218             :         {
    1219     2106247 :             total_output_bits = (int16_t) ( nbits2 + 0.5f );
    1220             :         }
    1221             : 
    1222     4886019 :         if ( stop2 )
    1223             :         {
    1224     3221960 :             stop2 = total_output_bits;
    1225             :         }
    1226     4886019 :         *nEncoded = lastnz2;
    1227     4886019 :         *stop = stop2; /* If zero, it means no overflow occured during bit-estimation */
    1228     4886019 :         *lastnz_out = lastnz;
    1229             : 
    1230             :         /* Restore hole indices beyond lastnz */
    1231  1675598178 :         for ( k = numHoleIndices; k < hm_cfg->numHoleIndices; ++k )
    1232             :         {
    1233  1670712159 :             hm_cfg->holeIndices[k] = hm_cfg->holeIndices[k] - nt;
    1234             :         }
    1235     4886019 :         hm_cfg->numPeakIndices = numPeakIndicesOrig;
    1236             : 
    1237     4886019 :         return (int16_t) ( nbits2 + 0.5f );
    1238             :     }
    1239             :     else /* if (!hm_cfg) */
    1240             :     {
    1241             :         int16_t esc_nb, cp, rateQ;
    1242             :         uint16_t s;
    1243             :         int16_t tot_bits2;
    1244    59417724 :         int16_t overflow_flag = 0;
    1245             : 
    1246             :         /* Rate flag */
    1247    59417724 :         if ( target > 400 )
    1248             :         {
    1249    44248788 :             rateFlag = 2;
    1250             :         }
    1251             :         else
    1252             :         {
    1253    15168936 :             rateFlag = 0; /* Select context-B for lower bitrates */
    1254             :         }
    1255             : 
    1256    59417724 :         t = 0;
    1257    59417724 :         s = 0;
    1258    59417724 :         cp = 0;
    1259    59417724 :         lastnz = 1;
    1260    59417724 :         lastnz2 = 0;
    1261    59417724 :         tot_bits2 = 0;
    1262             : 
    1263             :         /* Find last non-zero tuple in the mapped domain signal */
    1264  9888971471 :         for ( lastnz = ( nt - 2 ); lastnz >= 0; lastnz -= 2 )
    1265             :         {
    1266  9887158805 :             if ( ( x[lastnz] != 0 ) || ( x[lastnz + 1] != 0 ) )
    1267             :             {
    1268             :                 break;
    1269             :             }
    1270             :         }
    1271    59417724 :         lastnz += 2;
    1272    59417724 :         if ( lastnz < 2 )
    1273             :         {
    1274     1812666 :             lastnz = 2; /* At least one tuple is coded */
    1275             :         }
    1276             : 
    1277    59417724 :         lastnz2 = 2;
    1278             : 
    1279             :         /* Main Loop through the 2-tuples */
    1280 12640217283 :         for ( k = 0; k < lastnz; k += 2 )
    1281             :         {
    1282             :             /* Init current 2-tuple encoding */
    1283 12580799559 :             a1 = (int16_t) abs( x[k] );
    1284 12580799559 :             b1 = (int16_t) abs( x[k + 1] );
    1285 12580799559 :             lev1 = 0;
    1286 12580799559 :             esc_nb = 0;
    1287 12580799559 :             rateQ = rateFlag + ( k > ( nt >> 1 ) );
    1288             : 
    1289             :             /* Signs Bits */
    1290 12580799559 :             bit_estimate += min( a1, 1 );
    1291 12580799559 :             bit_estimate += min( b1, 1 );
    1292             : 
    1293             :             /* pre-compute address of ari_pk_s17_LC_ext[0][Val_esc] to avoid doing it multiple times inside the loop */
    1294 12580799559 :             lookup = &ari_lookup_s17_LC[t + ( rateQ << NBITS_CONTEXT )];
    1295             : 
    1296             :             /* check while condition */
    1297             :             /* MSBs coding */
    1298 15317703538 :             while ( max( a1, b1 ) >= A_THRES )
    1299             :             {
    1300  2736903979 :                 pki = lookup[( esc_nb << ( NBITS_CONTEXT + NBITS_RATEQ ) )];
    1301             : 
    1302  2736903979 :                 bit_estimate = bit_estimate + ari_bit_estimate_s17_LC[pki][VAL_ESC];
    1303  2736903979 :                 bit_estimate += 2; /* Add 2 LSB bits corresponding to the bit-plane */
    1304             : 
    1305  2736903979 :                 ( a1 ) >>= 1;
    1306  2736903979 :                 ( b1 ) >>= 1;
    1307             : 
    1308  2736903979 :                 lev1++;
    1309  2736903979 :                 esc_nb = min( lev1, 3 );
    1310             : 
    1311             :                 /* check while condition */
    1312             :             }
    1313             : 
    1314 12580799559 :             pki = lookup[( esc_nb << ( NBITS_CONTEXT + NBITS_RATEQ ) )];
    1315             : 
    1316 12580799559 :             symbol = a1 + A_THRES * b1;
    1317 12580799559 :             bit_estimate = bit_estimate + ari_bit_estimate_s17_LC[pki][symbol];
    1318             : 
    1319             :             /* Should we truncate? */
    1320 12580799559 :             if ( bit_estimate > target ) /* Overflow occured */
    1321             :             {
    1322   480675286 :                 overflow_flag = 1;
    1323             :             }
    1324             :             else
    1325             :             {
    1326 12100124273 :                 if ( abs( x[k] ) || abs( x[k + 1] ) ) /* No overflow & non-zero tuple */
    1327             :                 {
    1328  7058899891 :                     nbits2 = bit_estimate;
    1329  7058899891 :                     lastnz2 = k + 2;
    1330             :                 }
    1331             :             }
    1332             : 
    1333             :             /* Update context for next 2-tuple */
    1334 12580799559 :             if ( esc_nb < 2 )
    1335             :             {
    1336 11895449882 :                 cp = 1 + ( a1 + b1 ) * ( esc_nb + 1 );
    1337             :             }
    1338             :             else
    1339             :             {
    1340   685349677 :                 cp = 12 + esc_nb;
    1341             :             }
    1342             : 
    1343             :             /*shift old bits and replace last 4 bits*/
    1344             : #ifdef FIX_1464_UBSAN_RC_CONTEXT_MAP
    1345 12580799559 :             s = s & 0x0F;
    1346             : #endif
    1347 12580799559 :             s = ( s << 4 ) + cp;
    1348 12580799559 :             t = s & 0xFF;
    1349             : 
    1350             :         } /*end of the 2-tuples loop*/
    1351             : 
    1352    59417724 :         tot_bits2 = (int16_t) ( nbits2 + 0.5f );
    1353    59417724 :         if ( lastnz2 < lastnz ) /* Overflow occured because unable to code all tuples */
    1354             :         {
    1355    22660560 :             overflow_flag = 1;
    1356             :         }
    1357    59417724 :         if ( mode == -1 )
    1358             :         {
    1359           0 :             tot_bits2 = (int16_t) ( bit_estimate + 0.5f );
    1360             :         }
    1361    59417724 :         if ( overflow_flag == 0 ) /* No overflow */
    1362             :         {
    1363    36757164 :             *stop = 0;
    1364             :         }
    1365             :         else /* Overflow */
    1366             :         {
    1367    22660560 :             if ( *stop )
    1368             :             {
    1369      101117 :                 *stop = tot_bits2;
    1370             :             }
    1371             :             else
    1372             :             {
    1373    22559443 :                 *stop = (int16_t) ( bit_estimate + 0.5f );
    1374             :             }
    1375             :         }
    1376             : 
    1377    59417724 :         *lastnz_out = lastnz;
    1378    59417724 :         *nEncoded = lastnz2;
    1379             :         /* Safety mechanism to avoid overflow */
    1380    59417724 :         if ( lastnz2 == 2 && overflow_flag == 1 )
    1381             :         {
    1382      125937 :             for ( k = 0; k < lastnz2; k++ )
    1383             :             {
    1384       83958 :                 x[k] = 0;
    1385             :             }
    1386             :         }
    1387             : 
    1388    59417724 :         return tot_bits2;
    1389             :     }
    1390             : }
    1391             : 
    1392             : /*-------------------------------------------------------------------*
    1393             :  * RCcontextMapping_encode2_estimate_bandWise_start()
    1394             :  *
    1395             :  * Range coder - start bandwise bit-estimation
    1396             :  *-------------------------------------------------------------------*/
    1397             : 
    1398    11022416 : int16_t RCcontextMapping_encode2_estimate_bandWise_start(
    1399             :     int16_t *x,
    1400             :     const int16_t nt,
    1401             :     const int16_t target,
    1402             :     HANDLE_RC_CONTEXT_MEM hContextMem )
    1403             : {
    1404             :     int16_t i, k;
    1405             : 
    1406             :     /* Rate flag */
    1407    11022416 :     if ( target > 400 )
    1408             :     {
    1409    10806620 :         hContextMem->rateFlag = 2 << NBITS_CONTEXT;
    1410             :     }
    1411             :     else
    1412             :     {
    1413      215796 :         hContextMem->rateFlag = 0;
    1414             :     }
    1415             : 
    1416    11022416 :     hContextMem->bit_estimate = 2.0f;
    1417             : 
    1418             :     /* Init */
    1419    11022416 :     hContextMem->nt_half = nt >> 1;
    1420             : 
    1421             :     /* bits to encode lastnz */
    1422    11022416 :     k = 1;
    1423             : 
    1424   102725616 :     while ( k < hContextMem->nt_half )
    1425             :     {
    1426    91703200 :         hContextMem->bit_estimate++;
    1427             : 
    1428    91703200 :         k = k << 1;
    1429             :         /* check while condition */
    1430             :     }
    1431             : 
    1432             :     /* bits to encode lastnz */
    1433    11022416 :     hContextMem->nbits_old = (int16_t) hContextMem->bit_estimate;
    1434             : 
    1435    11022416 :     hContextMem->ctx = 0;
    1436    11022416 :     hContextMem->lastnz = 2;
    1437             : 
    1438             :     /* Find last non-zero tuple  */
    1439             : 
    1440   211308040 :     for ( i = nt; i >= 4; i -= 2 )
    1441             :     {
    1442             : 
    1443   211113369 :         if ( x[i - 2] != 0 || x[i - 1] != 0 )
    1444             :         {
    1445    10827745 :             hContextMem->lastnz = i;
    1446    10827745 :             break;
    1447             :         }
    1448             :     }
    1449             : 
    1450    11022416 :     return (int16_t) hContextMem->bit_estimate;
    1451             : }
    1452             : 
    1453             : /*-------------------------------------------------------------------*
    1454             :  * RCcontextMapping_encode2_estimate_bandWise()
    1455             :  *
    1456             :  * Range coder - bandwise bit-estimation
    1457             :  *-------------------------------------------------------------------*/
    1458             : 
    1459   424840780 : int16_t RCcontextMapping_encode2_estimate_bandWise(
    1460             :     int16_t *x,
    1461             :     const int16_t start_line,
    1462             :     const int16_t end_line,
    1463             :     HANDLE_RC_CONTEXT_MEM hContextMem )
    1464             : {
    1465             :     int16_t a1, b1, a1_i, b1_i;
    1466             :     int16_t k, pki, lev1;
    1467             :     uint16_t t;
    1468   424840780 :     int16_t bandBits = 0;
    1469             :     int16_t total_output_bits; /* No. of bits after finalization */
    1470             :     int16_t symbol;
    1471             :     const uint8_t *lookup;
    1472             :     int16_t idx;
    1473             : 
    1474             :     /* Main Loop through the 2-tuples */
    1475             :     /*hContextMem->nt_half = end_line >> 1;*/
    1476  3191986755 :     for ( k = start_line; k < min( hContextMem->lastnz, end_line ); k += 2 )
    1477             :     {
    1478  2767145975 :         a1_i = k;
    1479  2767145975 :         b1_i = k + 1;
    1480             : 
    1481  2767145975 :         idx = k;
    1482             : 
    1483             :         /* Get context */
    1484  2767145975 :         t = hContextMem->ctx + hContextMem->rateFlag;
    1485  2767145975 :         t += ( hContextMem->nt_half >= idx ) ? 0 : ( 1 << NBITS_CONTEXT );
    1486             : 
    1487             :         /* Init current 2-tuple encoding */
    1488  2767145975 :         a1 = (int16_t) abs( x[a1_i] );
    1489  2767145975 :         b1 = (int16_t) abs( x[b1_i] );
    1490  2767145975 :         lev1 = -( 1 << ( NBITS_CONTEXT + NBITS_RATEQ ) );
    1491             : 
    1492             :         /* Signs Bits */
    1493  2767145975 :         hContextMem->bit_estimate += min( a1, 1 );
    1494  2767145975 :         hContextMem->bit_estimate += min( b1, 1 );
    1495             : 
    1496             :         /* pre-compute address of ari_pk_s17_LC_ext[0][Val_esc] to avoid doing it multiple times inside the loop */
    1497  2767145975 :         lookup = &ari_lookup_s17_LC[t] + ( 1 << ( NBITS_CONTEXT + NBITS_RATEQ ) );
    1498             : 
    1499             :         /* check while condition */
    1500             :         /* MSBs coding */
    1501  3402874463 :         while ( max( a1, b1 ) >= A_THRES )
    1502             :         {
    1503   635728488 :             pki = lookup[lev1];
    1504   635728488 :             hContextMem->bit_estimate = hContextMem->bit_estimate + ari_bit_estimate_s17_LC[pki][VAL_ESC];
    1505   635728488 :             hContextMem->bit_estimate += 2; /* Add the 2 LSB bits that were shifted out */
    1506             : 
    1507   635728488 :             ( a1 ) >>= 1;
    1508   635728488 :             ( b1 ) >>= 1;
    1509             : 
    1510   635728488 :             lev1 = min( lev1 + ( 1 << ( NBITS_CONTEXT + NBITS_RATEQ ) ), 2 << ( NBITS_CONTEXT + NBITS_RATEQ ) );
    1511             :             /* check while condition */
    1512             :         }
    1513             : 
    1514  2767145975 :         pki = lookup[lev1];
    1515  2767145975 :         symbol = a1 + A_THRES * b1; /* MSB symbol */
    1516  2767145975 :         hContextMem->bit_estimate = hContextMem->bit_estimate + ari_bit_estimate_s17_LC[pki][symbol];
    1517             : 
    1518             :         /* Update context */
    1519  2767145975 :         lev1 >>= NBITS_CONTEXT + NBITS_RATEQ;
    1520             : 
    1521  2767145975 :         if ( lev1 <= 0 )
    1522             :         {
    1523  2608830485 :             t = 1 + ( a1 + b1 ) * ( lev1 + 2 );
    1524             :         }
    1525             :         else
    1526             :         {
    1527   158315490 :             t = 13 + lev1;
    1528             :         }
    1529             : 
    1530  2767145975 :         hContextMem->ctx = ( hContextMem->ctx & 0xf ) * 16 + t;
    1531             : 
    1532             :     } /*end of the 2-tuples loop*/
    1533   424840780 :     total_output_bits = (int16_t) ( hContextMem->bit_estimate + 0.5f );
    1534             : 
    1535   424840780 :     bandBits = total_output_bits - hContextMem->nbits_old;
    1536   424840780 :     hContextMem->nbits_old = total_output_bits;
    1537             : 
    1538   424840780 :     return bandBits;
    1539             : }

Generated by: LCOV version 1.14