LCOV - code coverage report
Current view: top level - lib_dec - ACcontextMapping_dec_fx.c (source / functions) Hit Total Coverage
Test: Coverage on main enc/dec/rend @ 3b2f07138c61dcf997bbf4165d0882f794b2995f Lines: 310 356 87.1 %
Date: 2025-05-03 01:55:50 Functions: 2 2 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 "rom_com.h"
       9             : #include "rom_dec.h"
      10             : #include "basop_util.h"
      11             : #include "cnst.h"
      12             : #include "prot_fx.h"
      13             : #include "ivas_prot_fx.h"
      14             : 
      15             : #include "ivas_rom_com.h"
      16             : /*-------------------------------------------------------------------*
      17             :  * ACcontextMapping_decode2_no_mem_s17_LC()
      18             :  *
      19             :  * Arithmetic decoder
      20             :  *-------------------------------------------------------------------*/
      21             : 
      22         638 : Word16 ACcontextMapping_decode2_no_mem_s17_LC(
      23             :     Decoder_State *st,        /* i/o: decoder state */
      24             :     Word16 *x,                /* o: decoded spectrum Q0*/
      25             :     Word16 nt,                /* i: size of spectrum */
      26             :     Word16 nbbits,            /* i: bit budget */
      27             :     Word16 resQMaxBits,       /* i: residual coding maximum bits*/
      28             :     CONTEXT_HM_CONFIG *hm_cfg /* i: context-based harmonic model configuration */
      29             : )
      30             : {
      31             :     Tastat as;
      32             :     Word16 start_bit_pos, lsbs_bit_pos, overflow_bit_pos;
      33             :     Word16 a, b, a1, b1, a1_i, b1_i, k, L;
      34             :     UWord16 t;
      35             :     Word16 lev, pki, esc_nb;
      36             :     Word16 rateFlag;
      37             :     Word16 lastnz, n;
      38             :     UWord16 r;
      39             :     Word16 resQBits;
      40             :     Word16 rest_bits, rest_bits_overflow;
      41         638 :     Word16 tmp = 0; /* initialize just to avoid compiler warning */
      42         638 :     move16();
      43             :     Word16 nt_half;
      44             :     Word16 c[2], *ctx;
      45             :     Word16 p1, p2;
      46             :     Word16 ii[2], idx1, idx2, idx;
      47             :     Word16 numPeakIndicesOrig, numHoleIndices;
      48             :     get_next_coeff_function get_next_coeff;
      49             :     Word16 nbbits_m2;
      50             :     Word32 La, Lb;
      51             : 
      52         638 :     r = 0; /* to avoid compilation warnings */
      53         638 :     move16();
      54         638 :     esc_nb = 0; /* to avoid compilation warnings */
      55         638 :     move16();
      56             : 
      57         638 :     set16_fx( x, 0, nt );
      58             : 
      59             :     /* Rate flag */
      60         638 :     rateFlag = 0;
      61         638 :     move16();
      62         638 :     if ( GT_16( nbbits, 400 ) )
      63             :     {
      64          42 :         rateFlag = 2 << NBITS_CONTEXT;
      65          42 :         move16();
      66             :     }
      67             : 
      68             :     /*Decode number of ntuples*/
      69         638 :     start_bit_pos = st->next_bit_pos;
      70         638 :     move16();
      71         638 :     lsbs_bit_pos = add( start_bit_pos, sub( nbbits, 1 ) );
      72             : 
      73         638 :     n = 0;
      74         638 :     move16();
      75             : 
      76         638 :     L = sub( 14, norm_s( negate( nt ) ) );
      77         638 :     n = add( get_next_indice_fx( st, L ), 1 );
      78             : 
      79             :     /* Init */
      80         638 :     nt_half = shr( nt, 1 );
      81         638 :     c[0] = c[1] = 0;
      82         638 :     move16();
      83         638 :     move16();
      84             : 
      85         638 :     t = 0;
      86         638 :     move16();
      87             : 
      88         638 :     lastnz = shl( n, 1 );
      89         638 :     test();
      90         638 :     IF( GT_16( lastnz, nt ) || st->BER_detect )
      91             :     {
      92           0 :         st->BER_detect = 1;
      93           0 :         move16();
      94           0 :         return 0;
      95             :     }
      96             : 
      97         638 :     IF( hm_cfg ) /* mapped domain */
      98             :     {
      99          55 :         numPeakIndicesOrig = hm_cfg->numPeakIndices;
     100          55 :         move16();
     101          55 :         hm_cfg->numPeakIndices = s_min( hm_cfg->numPeakIndices, lastnz );
     102          55 :         move16();
     103          55 :         numHoleIndices = sub( lastnz, hm_cfg->numPeakIndices );
     104             : 
     105             :         /* Mark hole indices beyond lastnz as pruned */
     106       24287 :         FOR( k = numHoleIndices; k < hm_cfg->numHoleIndices; ++k )
     107             :         {
     108       24232 :             hm_cfg->holeIndices[k] = add( hm_cfg->holeIndices[k], nt );
     109       24232 :             move16();
     110             :         }
     111             : 
     112          55 :         ii[0] = numPeakIndicesOrig;
     113          55 :         move16();
     114          55 :         ii[1] = 0;
     115          55 :         move16();
     116          55 :         p1 = p2 = 0; /* to avoid compilation warnings */
     117          55 :         move16();
     118          55 :         move16();
     119             : 
     120          55 :         get_next_coeff = get_next_coeff_mapped;
     121             :     }
     122             :     ELSE /* unmapped domain */
     123             :     {
     124         583 :         ii[0] = 0;
     125         583 :         move16();
     126             : 
     127         583 :         p1 = p2 = 0;
     128         583 :         move16();
     129         583 :         move16();
     130             : 
     131         583 :         get_next_coeff = get_next_coeff_unmapped;
     132             :     }
     133             : 
     134             :     /* Start Decoding */
     135         638 :     ari_start_decoding_14bits_fx( st, &as );
     136             : 
     137         638 :     overflow_bit_pos = st->next_bit_pos;
     138         638 :     move16();
     139         638 :     nbbits_m2 = add( nbbits, cbitsnew - 2 );
     140         638 :     rest_bits_overflow = rest_bits = negate( nbbits_m2 );
     141         638 :     move16();
     142             : 
     143             :     /*Main Loop through the 2-tuples*/
     144       66168 :     FOR( k = 0; k < lastnz; k += 2 )
     145             :     {
     146             :         /* First coefficient */
     147       65530 :         a1_i = get_next_coeff( ii, &p1, &idx1, hm_cfg );
     148             : 
     149             :         /* Second coefficient */
     150       65530 :         b1_i = get_next_coeff( ii, &p2, &idx2, hm_cfg );
     151             : 
     152       65530 :         idx = s_min( idx1, idx2 );
     153             : 
     154             :         /* Get context */
     155       65530 :         ctx = &c[s_or( p1, p2 )];
     156             : 
     157       65530 :         t = add( *ctx, rateFlag );
     158       65530 :         IF( GT_16( idx, nt_half ) )
     159             :         {
     160          81 :             t = add( t, 1 << NBITS_CONTEXT );
     161             :         }
     162             : 
     163       65530 :         test();
     164             :         /* BER detection: Check max value of context t leading to out-of-bound access to ari_lookup_s17_LC[]*/
     165       65530 :         IF( GE_16( t, ( 1 << ( NBITS_CONTEXT + NBITS_RATEQ ) ) ) || lsbs_bit_pos <= 0 )
     166             :         {
     167           0 :             st->BER_detect = 1;
     168           0 :             move16();
     169           0 :             return 0;
     170             :         }
     171             : 
     172       65530 :         La = L_deposit_l( 0 );
     173       65530 :         Lb = L_deposit_l( 0 );
     174             :         /* MSBs decoding */
     175             : 
     176       69328 :         FOR( lev = 0; lev < 15 && lsbs_bit_pos > 0; lev++ )
     177             :         {
     178             : 
     179       69328 :             esc_nb = s_min( lev, 3 );
     180       69328 :             tmp = add( t, Tab_esc_nb[esc_nb] );
     181       69328 :             assert( tmp >= 0 && tmp < 4096 );
     182       69328 :             pki = ari_lookup_s17_LC[tmp];
     183       69328 :             move16();
     184       69328 :             r = ari_decode_14bits_s17_ext_fx( st, &as, ari_pk_s17_LC_ext[pki] );
     185             : 
     186       69328 :             IF( LT_16( r, VAL_ESC ) )
     187             :             {
     188       65530 :                 BREAK;
     189             :             }
     190             : 
     191             :             /*LSBs decoding*/
     192        3798 :             La = L_mac0( La, pow2tab[lev], get_indice_1_fx( st, lsbs_bit_pos-- ) );
     193        3798 :             Lb = L_mac0( Lb, pow2tab[lev], get_indice_1_fx( st, lsbs_bit_pos-- ) );
     194             :         }
     195             : 
     196       65530 :         test();
     197       65530 :         test();
     198       65530 :         IF( ( ( LT_16( lsbs_bit_pos, -1 ) && GE_16( r, VAL_ESC ) ) ) || ( GT_16( lev, 14 ) ) )
     199             :         {
     200           0 :             x[a1_i] = 0;
     201           0 :             move16();
     202           0 :             x[b1_i] = 0;
     203           0 :             move16();
     204           0 :             st->BER_detect = 1;
     205           0 :             move16();
     206           0 :             return 0;
     207             :         }
     208             : 
     209             :         /*MSBs contributions*/
     210       65530 :         b1 = shr( r, 2 );
     211       65530 :         a1 = s_and( r, 0x3 );
     212       65530 :         a = extract_l( L_mac0( La, pow2tab[lev], a1 ) );
     213       65530 :         b = extract_l( L_mac0( Lb, pow2tab[lev], b1 ) );
     214             : 
     215             :         /*lsbs bits sign bits*/
     216       65530 :         rest_bits = add( rest_bits, shl( lev, 1 ) );
     217             : 
     218       65530 :         if ( a > 0 )
     219             :         {
     220       17155 :             rest_bits = add( rest_bits, 1 );
     221             :         }
     222       65530 :         if ( b > 0 )
     223             :         {
     224       16983 :             rest_bits = add( rest_bits, 1 );
     225             :         }
     226             : 
     227             :         /*Dectect overflow*/
     228       65530 :         IF( add( sub( st->next_bit_pos, start_bit_pos ), rest_bits ) > 0 )
     229             :         {
     230             :             /* Roll back bitstream position to overflow_bit_pos */
     231           0 :             get_next_indice_tmp_fx( st, sub( overflow_bit_pos, st->next_bit_pos ) );
     232           0 :             rest_bits = rest_bits_overflow;
     233           0 :             move16();
     234           0 :             x[a1_i] = 0;
     235           0 :             move16();
     236           0 :             x[b1_i] = 0;
     237           0 :             move16();
     238           0 :             BREAK;
     239             :         }
     240             : 
     241       65530 :         overflow_bit_pos = st->next_bit_pos;
     242       65530 :         move16();
     243       65530 :         rest_bits_overflow = rest_bits;
     244       65530 :         move16();
     245             : 
     246             :         /* Store decoded data */
     247       65530 :         x[a1_i] = a;
     248       65530 :         move16();
     249       65530 :         x[b1_i] = b;
     250       65530 :         move16();
     251             : 
     252             :         /* Update context for next 2-tuple */
     253       65530 :         IF( EQ_32( p1, p2 ) ) /* peak-peak or hole-hole context */
     254             :         {
     255       65280 :             lev = sub( esc_nb, 1 );
     256       65280 :             IF( lev > 0 )
     257         884 :             t = add( 12, lev );
     258       65280 :             IF( lev <= 0 )
     259       64396 :             t = add( a1, b1 );
     260       65280 :             IF( lev == 0 )
     261        1706 :             t = add( t, t );
     262             : 
     263       65280 :             *ctx = add( shl( s_and( *ctx, 0xf ), 4 ), add( t, 1 ) );
     264       65280 :             move16();
     265             :         }
     266             :         ELSE /* mixed context */
     267             :         {
     268         250 :             IF( s_and( idx1, 1 ) ) /* update first context */
     269             :             {
     270         122 :                 c[p1] = update_mixed_context( c[p1], a );
     271         122 :                 move16();
     272             :             }
     273             : 
     274         250 :             IF( s_and( idx2, 1 ) ) /* update second context */
     275             :             {
     276         128 :                 c[p2] = update_mixed_context( c[p2], b );
     277         128 :                 move16();
     278             :             }
     279             :         }
     280             :     }
     281             : 
     282             :     /* Total number of decoded AC bits */
     283         638 :     get_next_indice_tmp_fx( st, -( cbitsnew - 2 ) );
     284             : 
     285             :     /*detect overflow*/
     286         638 :     IF( NE_16( k, lastnz ) )
     287             :     {
     288           0 :         rest_bits = add( rest_bits, nbbits_m2 );
     289             :         /* Set bitstream position to (start_bit_pos+nbbits-rest_bits) */
     290           0 :         get_next_indice_tmp_fx( st, sub( ( sub( add( start_bit_pos, nbbits ), rest_bits ) ), st->next_bit_pos ) );
     291             :     }
     292             : 
     293             :     /*Decode signs*/
     294         638 :     if ( hm_cfg )
     295             :     {
     296          55 :         tmp = nt;
     297          55 :         move16();
     298             :     }
     299         638 :     if ( !hm_cfg )
     300             :     {
     301         583 :         tmp = lastnz;
     302         583 :         move16();
     303             :     }
     304      155930 :     FOR( k = 0; k < tmp; k++ )
     305             :     {
     306      155292 :         IF( x[k] > 0 )
     307             :         {
     308       34138 :             IF( get_next_indice_1_fx( st ) != 0 )
     309             :             {
     310       17088 :                 x[k] = negate( x[k] );
     311       17088 :                 move16();
     312             :             }
     313             :         }
     314             :     }
     315             : 
     316             :     /*Decode Residual Q*/
     317         638 :     resQBits = s_min( resQMaxBits, sub( add( lsbs_bit_pos, 1 ), st->next_bit_pos ) );
     318        7295 :     FOR( k = 0; k < resQBits; ++k )
     319             :     {
     320        6657 :         x[nt + k] = get_indice_1_fx( st, sub( lsbs_bit_pos, k ) );
     321        6657 :         move16();
     322             :     }
     323             : 
     324             :     /* Set bitstream pointer to end of buffer */
     325         638 :     get_next_indice_tmp_fx( st, sub( add( start_bit_pos, nbbits ), st->next_bit_pos ) );
     326             : 
     327             : 
     328         638 :     return resQBits;
     329             : }
     330             : 
     331             : #define IVAS_CONTEXT_MAPPING
     332             : #ifdef IVAS_CONTEXT_MAPPING
     333             : 
     334             : /*-------------------------------------------------------------------*
     335             :  * RCcontextMapping_decode2_no_mem_s17_LCS()
     336             :  *
     337             :  * Range decoder
     338             :  *-------------------------------------------------------------------*/
     339             : 
     340             : /*! r: resQBits */
     341      773840 : Word16 RCcontextMapping_decode2_no_mem_s17_LCS_fx(
     342             :     Decoder_State *st,        /* i/o: decoder state                             */
     343             :     Word16 *x,                /* o  : decoded spectrum                        Q0*/
     344             :     const Word16 nt,          /* i  : size of spectrum                          */
     345             :     const Word16 nbbits,      /* i  : bit budget                                */
     346             :     const Word16 resQMaxBits, /* i  : residual coding maximum bits              */
     347             :     CONTEXT_HM_CONFIG *hm_cfg /* i  : context-based harmonic model configuration*/
     348             : )
     349             : {
     350             :     RangeUniDecState rc_st_dec; /* State of the range decoder */
     351             :     Word16 start_bit_pos, lsbs_bit_pos;
     352             :     Word16 a, b, a1, b1, k;
     353             :     UWord16 t;
     354             :     Word16 lev, pki, esc_nb;
     355             :     Word16 rateFlag;
     356             :     Word16 lastnz, n;
     357             :     UWord16 r;
     358             :     Word16 resQBits;
     359             :     Word16 rest_bits;
     360             :     Word16 nt_half;
     361             :     Word16 nbbits_m2;
     362             :     Word16 bits_tups; /* No. of bits for coding the no. of tuples */
     363             : 
     364      773840 :     set16_fx( x, 0, nt );
     365             : 
     366             :     /*Decode number of ntuples*/
     367      773840 :     start_bit_pos = st->next_bit_pos;
     368      773840 :     move16();
     369      773840 :     lsbs_bit_pos = add( start_bit_pos, sub( nbbits, 1 ) );
     370      773840 :     n = 0;
     371      773840 :     move16();
     372      773840 :     k = 1;
     373      773840 :     move16();
     374      773840 :     nt_half = shr( nt, 1 );
     375     7652086 :     WHILE( k < nt_half )
     376             :     {
     377     6878246 :         n = add( n, 1 );
     378     6878246 :         k = shl( k, 1 );
     379             :     }
     380             : 
     381      773840 :     bits_tups = n;
     382      773840 :     move16();
     383      773840 :     n = add( get_next_indice_fx( st, n ), 1 );
     384             : 
     385      773840 :     t = 0;
     386      773840 :     move16();
     387      773840 :     lastnz = shl( n, 1 );
     388             : 
     389      773840 :     IF( GT_16( lastnz, nt ) )
     390             :     {
     391           0 :         st->BER_detect = 1;
     392           0 :         move16();
     393           0 :         return 0;
     394             :     }
     395             : 
     396      773840 :     IF( hm_cfg )
     397             :     {
     398             :         Word16 a1_i, b1_i;
     399             :         Word16 c[2], *ctx;
     400             :         Word16 p1, p2;
     401             :         Word16 ii[2];
     402             :         Word16 idx1, idx2, idx;
     403             :         Word16 numPeakIndicesOrig, numHoleIndices;
     404             : 
     405             :         /* Rate flag */
     406       11959 :         IF( GT_16( nbbits, 400 ) )
     407             :         {
     408        5776 :             rateFlag = 2 << NBITS_CONTEXT;
     409        5776 :             move16();
     410             :         }
     411             :         ELSE
     412             :         {
     413        6183 :             rateFlag = 0;
     414        6183 :             move16();
     415             :         }
     416             : 
     417             :         /* Init */
     418       11959 :         c[0] = c[1] = 0;
     419       11959 :         move16();
     420       11959 :         move16();
     421             :         /* mapped domain */
     422       11959 :         numPeakIndicesOrig = hm_cfg->numPeakIndices;
     423       11959 :         move16();
     424       11959 :         hm_cfg->numPeakIndices = s_min( hm_cfg->numPeakIndices, lastnz );
     425       11959 :         move16();
     426       11959 :         numHoleIndices = sub( lastnz, hm_cfg->numPeakIndices );
     427             : 
     428             :         /* Mark hole indices beyond lastnz as pruned */
     429     5144729 :         FOR( k = numHoleIndices; k < hm_cfg->numHoleIndices; ++k )
     430             :         {
     431     5132770 :             hm_cfg->holeIndices[k] = add( hm_cfg->holeIndices[k], nt );
     432     5132770 :             move16();
     433             :         }
     434             : 
     435       11959 :         ii[0] = numPeakIndicesOrig;
     436       11959 :         move16();
     437       11959 :         ii[1] = 0;
     438       11959 :         move16();
     439       11959 :         p1 = p2 = 0; /* to avoid compilation warnings */
     440       11959 :         move16();
     441       11959 :         move16();
     442             :         /* Start Decoding */
     443             :         /* Initialize range decoder */
     444       11959 :         rc_uni_dec_init_fx( &rc_st_dec, &st->bit_stream[st->next_bit_pos], nbbits ); /* (nbbits + 30) entries are read by the decoder */
     445             : 
     446       11959 :         nbbits_m2 = nbbits;
     447       11959 :         move16();
     448       11959 :         rest_bits = negate( nbbits_m2 );
     449             : 
     450             :         /* Main Loop through the 2-tuples */
     451     2249141 :         FOR( k = 0; k < lastnz; k += 2 )
     452             :         {
     453     2237182 :             a1_i = get_next_coeff_mapped( ii, &p1, &idx1, hm_cfg );
     454     2237182 :             b1_i = get_next_coeff_mapped( ii, &p2, &idx2, hm_cfg );
     455     2237182 :             idx = s_min( idx1, idx2 );
     456             : 
     457             :             /* Get context */
     458     2237182 :             ctx = &c[s_or( p1, p2 )];
     459     2237182 :             t = add( *ctx, rateFlag );
     460     2237182 :             IF( LT_16( nt_half, idx ) )
     461             :             {
     462      270556 :                 t = add( t, ( 1 << NBITS_CONTEXT ) );
     463             :             }
     464             : 
     465     2237182 :             esc_nb = 0;
     466     2237182 :             move16();
     467     2237182 :             r = 0;
     468     2237182 :             move16();
     469     2237182 :             test();
     470             :             /* BER detection: Check max value of context t leading to out-of-bound access to ari_lookup_s17_LC[]*/
     471     2237182 :             IF( ( GE_16( t, ( 1 << ( NBITS_CONTEXT + NBITS_RATEQ ) ) ) ) || ( lsbs_bit_pos <= 0 ) )
     472             :             {
     473           0 :                 st->BER_detect = 1;
     474           0 :                 move16();
     475           0 :                 return 0;
     476             :             }
     477             : 
     478     2237182 :             a = b = 0;
     479     2237182 :             move16();
     480     2237182 :             move16();
     481             :             /* MSBs decoding */
     482     2539486 :             FOR( lev = 0; lev < 15 && lsbs_bit_pos > 0; ++lev )
     483             :             {
     484     2539486 :                 esc_nb = s_min( lev, 3 );
     485     2539486 :                 pki = ari_lookup_s17_LC[t + Tab_esc_nb[esc_nb]];
     486     2539486 :                 move16();
     487     2539486 :                 r = rc_uni_dec_read_symbol_fastS_fx( &rc_st_dec, cum_freq_ari_pk_s17_LC_ext[pki], sym_freq_ari_pk_s17_LC_ext[pki], 17, 14 ); /*Alphabet size = 17 (2^4 = 16 MSB symbols + 1 ESC symbol) */
     488             :                                                                                                                                              /* r is the symbol read, the possible values are {0,1,....alphabet_size - 1}  */
     489             : 
     490     2539486 :                 IF( LT_16( r, VAL_ESC ) ) /* If symbol read corresponds to MSB */
     491             :                 {
     492     2237182 :                     BREAK;
     493             :                 }
     494             : 
     495             :                 /* LSBs decoding */
     496      302304 :                 a = add( a, shl( get_indice_1_fx( st, lsbs_bit_pos-- ), lev ) );
     497      302304 :                 b = add( b, shl( get_indice_1_fx( st, lsbs_bit_pos-- ), lev ) );
     498             :             }
     499     2237182 :             test();
     500     2237182 :             test();
     501     2237182 :             IF( ( LT_16( lsbs_bit_pos, -1 ) && GE_16( r, VAL_ESC ) ) || GT_16( lev, 14 ) )
     502             :             {
     503           0 :                 x[a1_i] = 0;
     504           0 :                 move16();
     505           0 :                 x[b1_i] = 0;
     506           0 :                 move16();
     507           0 :                 st->BER_detect = 1;
     508           0 :                 move16();
     509           0 :                 return 0;
     510             :             }
     511             : 
     512             :             /* MSBs contributions */
     513     2237182 :             b1 = shr( r, 2 );
     514     2237182 :             a1 = s_and( r, 0x3 );
     515     2237182 :             a = add( a, shl( a1, lev ) );
     516     2237182 :             b = add( b, shl( b1, lev ) );
     517             : 
     518             :             /* Add 2 LSB bits per bit-plane */
     519     2237182 :             rest_bits = add( rest_bits, shl( lev, 1 ) );
     520             :             /* Sign bits */
     521     2237182 :             rest_bits = add( rest_bits, s_min( a, 1 ) );
     522     2237182 :             rest_bits = add( rest_bits, s_min( b, 1 ) );
     523             : 
     524             :             /* Update bitstream pointer */
     525     2237182 :             st->next_bit_pos = add( start_bit_pos, add( bits_tups, rc_uni_dec_virtual_finish_fx( &rc_st_dec ) ) );
     526     2237182 :             move16();
     527             : 
     528             :             /* Confirm that there is no overflow */
     529             : #ifdef DEBUGGING
     530             :             assert( st->next_bit_pos - start_bit_pos + rest_bits <= 0 );
     531             : #endif
     532             : 
     533             :             /* Store decoded data */
     534     2237182 :             x[a1_i] = a;
     535     2237182 :             move16();
     536     2237182 :             x[b1_i] = b;
     537     2237182 :             move16();
     538             :             /* Update context for next 2-tuple */
     539     2237182 :             IF( EQ_32( p1, p2 ) )
     540             :             {
     541             :                 /* peak-peak or hole-hole context */
     542     2031403 :                 lev = sub( esc_nb, 1 );
     543             : 
     544     2031403 :                 IF( lev <= 0 )
     545             :                 {
     546     1974235 :                     t = add( 1, imult1616( add( a1, b1 ), add( lev, 2 ) ) );
     547             :                 }
     548             :                 ELSE
     549             :                 {
     550       57168 :                     t = add( 13, lev );
     551             :                 }
     552             : 
     553     2031403 :                 *ctx = add( shl( s_and( *ctx, 0xf ), 4 ), t );
     554     2031403 :                 move16();
     555             :             }
     556             :             ELSE
     557             :             {
     558             :                 /* mixed context */
     559             : 
     560      205779 :                 IF( s_and( idx1, 1 ) )
     561             :                 {
     562             :                     /* update first context */
     563       97838 :                     c[p1] = update_mixed_context( c[p1], a );
     564       97838 :                     move16();
     565             :                 }
     566             : 
     567      205779 :                 IF( s_and( idx2, 1 ) )
     568             :                 {
     569             :                     /* update second context */
     570      107941 :                     c[p2] = update_mixed_context( c[p2], b );
     571      107941 :                     move16();
     572             :                 }
     573             :             }
     574             :         }
     575             : 
     576             :         /* We don't need to finish because virtual_finish() already does the same */
     577             :         /*st->next_bit_pos = rc_uni_dec_finish(&rc_st_dec);*/
     578             : 
     579             :         /* Check for bitstream errors */
     580       11959 :         assert( rc_st_dec.bit_error_detected == 0 );
     581             : 
     582             :         /* Cross-check: No overflow */
     583             : #ifdef DEBUGGING
     584             :         assert( k == lastnz );
     585             : #endif
     586             : 
     587             :         /* Decode signs */
     588       11959 :         n = nt;
     589       11959 :         move16();
     590             :     }
     591             :     ELSE /* if(!hm_cfg) */
     592             :     {
     593             :         Word16 c, rateQ;
     594             :         UWord16 s;
     595             : 
     596             :         /* Rate flag */
     597      761881 :         IF( GT_16( nbbits, 400 ) )
     598             :         {
     599      557633 :             rateFlag = 2;
     600      557633 :             move16();
     601             :         }
     602             :         ELSE
     603             :         {
     604      204248 :             rateFlag = 0;
     605      204248 :             move16();
     606             :         }
     607             : 
     608             :         /* Start Decoding */
     609             :         /* Initialize range decoder */
     610      761881 :         rc_uni_dec_init_fx( &rc_st_dec, &st->bit_stream[st->next_bit_pos], nbbits ); /* (nbbits + 30) entries are read by the decoder */
     611             : 
     612      761881 :         nbbits_m2 = nbbits;
     613      761881 :         move16();
     614      761881 :         rest_bits = negate( nbbits_m2 );
     615             : 
     616      761881 :         t = 0;
     617      761881 :         move16();
     618      761881 :         s = 0;
     619      761881 :         move16();
     620             :         /* Main Loop through the 2-tuples */
     621   164788266 :         FOR( k = 0; k < lastnz; k += 2 )
     622             :         {
     623   164026385 :             rateQ = add( rateFlag, (Word16) GT_16( k, ( nt_half ) ) );
     624   164026385 :             test();
     625             :             /* BER detection: Check max value of context t leading to out-of-bound access to ari_lookup_s17_LC[]*/
     626   164026385 :             IF( ( GE_16( t, ( 1 << ( NBITS_CONTEXT ) ) ) ) || ( lsbs_bit_pos <= 0 ) )
     627             :             {
     628           0 :                 st->BER_detect = 1;
     629           0 :                 move16();
     630           0 :                 return 0;
     631             :             }
     632             : 
     633   164026385 :             a = b = 0;
     634   164026385 :             move16();
     635   164026385 :             move16();
     636   164026385 :             esc_nb = 0;
     637   164026385 :             move16();
     638   164026385 :             r = 0;
     639   164026385 :             move16();
     640             :             /* MSBs decoding */
     641   194156732 :             FOR( lev = 0; lev < 15 && lsbs_bit_pos > 0; ++lev )
     642             :             {
     643   194156732 :                 esc_nb = s_min( lev, 3 );
     644   194156732 :                 pki = ari_lookup_s17_LC[t + ( ( rateQ << NBITS_CONTEXT ) + Tab_esc_nb[esc_nb] )];
     645   194156732 :                 move16();
     646   194156732 :                 r = rc_uni_dec_read_symbol_fastS_fx( &rc_st_dec, cum_freq_ari_pk_s17_LC_ext[pki], sym_freq_ari_pk_s17_LC_ext[pki], 17, 14 ); /*Alphabet size = 17 (2^4 = 16 MSB symbols + 1 ESC symbol) */
     647             :                                                                                                                                              /* r is the symbol read, the possible values are {0,1,....alphabet_size - 1}  */
     648             : 
     649   194156732 :                 IF( LT_16( r, VAL_ESC ) ) /* If symbol read corresponds to MSB */
     650             :                 {
     651   164026385 :                     BREAK;
     652             :                 }
     653             : 
     654             :                 /* LSBs decoding */
     655    30130347 :                 a = add( a, shl( get_indice_1_fx( st, lsbs_bit_pos-- ), lev ) );
     656    30130347 :                 b = add( b, shl( get_indice_1_fx( st, lsbs_bit_pos-- ), lev ) );
     657             :             }
     658   164026385 :             test();
     659   164026385 :             test();
     660   164026385 :             IF( ( LT_16( lsbs_bit_pos, -1 ) && GE_16( r, VAL_ESC ) ) || GT_16( lev, 14 ) )
     661             :             {
     662           0 :                 x[k + 0] = 0;
     663           0 :                 move16();
     664           0 :                 x[k + 1] = 0;
     665           0 :                 move16();
     666           0 :                 st->BER_detect = 1;
     667           0 :                 move16();
     668           0 :                 return 0;
     669             :             }
     670             : 
     671             :             /* MSBs contributions */
     672   164026385 :             b1 = shr( r, 2 );
     673   164026385 :             a1 = s_and( r, 0x3 );
     674   164026385 :             a = add( a, shl( a1, lev ) );
     675   164026385 :             b = add( b, shl( b1, lev ) );
     676             : 
     677             :             /* Add 2 LSB bits per bit-plane */
     678   164026385 :             rest_bits = add( rest_bits, shl( lev, 1 ) );
     679             :             /* Sign bits */
     680   164026385 :             rest_bits = add( rest_bits, s_min( a, 1 ) );
     681   164026385 :             rest_bits = add( rest_bits, s_min( b, 1 ) );
     682             : 
     683             :             /* Update bitstream pointer */
     684   164026385 :             st->next_bit_pos = add( start_bit_pos, add( bits_tups, rc_uni_dec_virtual_finish_fx( &rc_st_dec ) ) );
     685   164026385 :             move16();
     686             : 
     687             :             /* Confirm that there is no overflow */
     688             : #ifdef DEBUGGING
     689             :             assert( st->next_bit_pos - start_bit_pos + rest_bits <= 0 );
     690             : #endif
     691             : 
     692             :             /* Store decoded data */
     693   164026385 :             x[k + 0] = a;
     694   164026385 :             move16();
     695   164026385 :             x[k + 1] = b;
     696   164026385 :             move16();
     697             :             /* Update context for next 2-tuple */
     698   164026385 :             IF( LT_16( esc_nb, 2 ) )
     699             :             {
     700   156569002 :                 c = add( 1, imult1616( add( a1, b1 ), add( esc_nb, 1 ) ) );
     701             :             }
     702             :             ELSE
     703             :             {
     704     7457383 :                 c = add( 12, esc_nb );
     705             :             }
     706             : 
     707   164026385 :             s = (UWord16) L_shl( s, 4 ); /*Shift old 4 bits*/
     708   164026385 :             s = (UWord16) L_add( s, c ); /*replace last 4 bits*/
     709   164026385 :             t = (UWord16) L_and( s, 0xFF );
     710             :         }
     711             : 
     712             :         /* Decode signs */
     713      761881 :         n = lastnz;
     714      761881 :         move16();
     715             :     } /* end of if(hm_cfg) */
     716             : 
     717   338450930 :     FOR( k = 0; k < n; k++ )
     718             :     {
     719   337677090 :         IF( x[k] > 0 )
     720             :         {
     721   135505349 :             x[k] = imult1616( x[k], sub( 1, shl( get_next_indice_1_fx( st ), 1 ) ) );
     722   135505349 :             move16();
     723             :         }
     724             :     }
     725             : 
     726             :     /* Decode Residual Q */
     727      773840 :     resQBits = s_min( resQMaxBits, sub( add( lsbs_bit_pos, 1 ), st->next_bit_pos ) );
     728             : 
     729     4282970 :     FOR( k = 0; k < resQBits; ++k )
     730             :     {
     731     3509130 :         x[nt + k] = get_indice_1_fx( st, sub( lsbs_bit_pos, k ) );
     732     3509130 :         move16();
     733             :     }
     734             : 
     735             :     /* Set bitstream pointer to end of buffer */
     736      773840 :     get_next_indice_tmp_fx( st, sub( add( start_bit_pos, nbbits ), st->next_bit_pos ) );
     737             : 
     738      773840 :     return resQBits;
     739             : }
     740             : 
     741             : #endif
     742             : #undef IVAS_CONTEXT_MAPPING

Generated by: LCOV version 1.14