LCOV - code coverage report
Current view: top level - lib_dec - hq_env_dec_fx.c (source / functions) Hit Total Coverage
Test: Coverage on main enc/dec/rend @ 3b2f07138c61dcf997bbf4165d0882f794b2995f Lines: 95 104 91.3 %
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 "options.h" /* Compilation switches                   */
       7             : #include "prot_fx.h" /* Function prototypes                    */
       8             : #include "rom_com.h" /* Static table prototypes                */
       9             : 
      10             : /*------------------------------------------------------------------------*
      11             :  * decode_envelope_indices_fx()
      12             :  *
      13             :  * Decode envelope indices
      14             :  *------------------------------------------------------------------------*/
      15             : 
      16        7758 : Word16 decode_envelope_indices_fx(                           /* o  : Number of bits                    Q0*/
      17             :                                    Decoder_State *st_fx,     /* i/o: decoder state structure */
      18             :                                    const Word16 start_norm,  /* i  : starting band index               Q0*/
      19             :                                    const Word16 num_sfm,     /* i  : Number of subbands                Q0*/
      20             :                                    const Word16 numnrmibits, /* i  : Bitrate of fall-back coding mode  Q0*/
      21             :                                    Word16 *difidx,           /* o  : Diff indices/encoded diff indices Q0*/
      22             :                                    const Word16 flag_HQ2     /* i  : indicator of HQ2 core             Q0*/
      23             :                                    ,
      24             :                                    const Word16 is_transient /* i  : indicator of HQ_TRANSIENT         Q0*/
      25             : )
      26             : {
      27             :     Word16 hcode_l;
      28             :     Word16 i, j;
      29             :     Word16 LCmode;
      30             :     Word16 startNormPlus1, numSfmMinus1, numSfmMinus2, offset;
      31             :     Word16 *pDifidx, *pDifidx1;
      32             : 
      33        7758 :     test();
      34        7758 :     IF( EQ_16( flag_HQ2, LOW_RATE_HQ_CORE ) || EQ_16( flag_HQ2, LOW_RATE_HQ_CORE_TRAN ) )
      35             :     {
      36          30 :         LCmode = (Word16) get_next_indice_fx( st_fx, BITS_DE_HMODE );             /* Q0 */
      37          30 :         difidx[start_norm] = (Word16) get_next_indice_fx( st_fx, BITS_DE_FCOMP ); /* Q0 */
      38          30 :         move16();
      39             :     }
      40             :     ELSE
      41             :     {
      42        7728 :         LCmode = (Word16) get_next_indice_fx( st_fx, 2 );                      /* Q0 */
      43        7728 :         difidx[start_norm] = (Word16) get_next_indice_fx( st_fx, NORM0_BITS ); /* Q0 */
      44        7728 :         move16();
      45             :     }
      46             : 
      47        7758 :     test();
      48        7758 :     IF( is_transient && EQ_16( flag_HQ2, LOW_RATE_HQ_CORE_TRAN ) )
      49             :     {
      50           1 :         hcode_l = 0;
      51           1 :         move16();
      52           1 :         IF( EQ_16( LCmode, 1 ) )
      53             :         {
      54           1 :             hdecnrm_tran_fx( st_fx, num_sfm, &difidx[start_norm + 1] );
      55           1 :             j = add( start_norm, num_sfm ); /* Q0 */
      56          32 :             FOR( i = start_norm + 1; i < j; i++ )
      57             :             {
      58          31 :                 hcode_l = add( hcode_l, huffsizn_tran[difidx[i]] ); /* Q0 */
      59             :             }
      60             :         }
      61             :         ELSE
      62             :         {
      63           0 :             hdecnrm_context_fx( st_fx, num_sfm, &difidx[start_norm], &hcode_l );
      64             :         }
      65             :     }
      66             :     ELSE
      67             :     {
      68        7757 :         hcode_l = 0;
      69        7757 :         move16();
      70        7757 :         IF( LCmode == 0 )
      71             :         {
      72        4515 :             hdecnrm_context_fx( st_fx, num_sfm, &difidx[start_norm], &hcode_l );
      73             :         }
      74        3242 :         ELSE IF( EQ_16( LCmode, 1 ) )
      75             :         {
      76        2193 :             startNormPlus1 = add( start_norm, 1 ); /* Q0 */
      77        2193 :             hdecnrm_resize_fx( st_fx, num_sfm, &difidx[startNormPlus1] );
      78             : 
      79        2193 :             pDifidx = &difidx[startNormPlus1]; /* Q0 */
      80        2193 :             move16();
      81        2193 :             numSfmMinus1 = sub( num_sfm, 1 ); /* Q0 */
      82       65105 :             FOR( i = 0; i < numSfmMinus1; i++ )
      83             :             {
      84       62912 :                 j = *pDifidx++;
      85       62912 :                 move16();
      86       62912 :                 hcode_l = add( hcode_l, resize_huffsizn[j] ); /* Q0 */
      87             :             }
      88             : 
      89        2193 :             pDifidx1 = &difidx[startNormPlus1]; /* Q0 */
      90        2193 :             move16();
      91        2193 :             numSfmMinus2 = sub( num_sfm, 2 ); /* Q0 */
      92       62912 :             FOR( i = 0; i < numSfmMinus2; i++ )
      93             :             {
      94       60719 :                 pDifidx = pDifidx1++; /* Q0 */
      95       60719 :                 move16();
      96       60719 :                 IF( GT_16( *pDifidx, 17 ) )
      97             :                 {
      98       10905 :                     offset = sub( *pDifidx, 17 );         /* Q0 */
      99       10905 :                     offset = s_min( offset, 3 );          /* Q0 */
     100       10905 :                     *pDifidx1 = sub( *pDifidx1, offset ); /* Q0 */
     101       10905 :                     move16();
     102             :                 }
     103       49814 :                 ELSE IF( LT_16( *pDifidx, 13 ) )
     104             :                 {
     105        6674 :                     offset = sub( *pDifidx, 13 );         /* Q0 */
     106        6674 :                     offset = s_max( offset, -3 );         /* Q0 */
     107        6674 :                     *pDifidx1 = sub( *pDifidx1, offset ); /* Q0 */
     108        6674 :                     move16();
     109             :                 }
     110             :             }
     111             :         }
     112        1049 :         ELSE IF( EQ_16( LCmode, 2 ) )
     113             :         {
     114         927 :             startNormPlus1 = add( start_norm, 1 ); /* Q0 */
     115         927 :             hdecnrm_fx( st_fx, num_sfm, &difidx[start_norm + 1] );
     116             : 
     117         927 :             pDifidx = &difidx[startNormPlus1]; /* Q0 */
     118         927 :             move16();
     119         927 :             numSfmMinus1 = sub( num_sfm, 1 ); /* Q0 */
     120       26184 :             FOR( i = 0; i < numSfmMinus1; i++ )
     121             :             {
     122       25257 :                 j = *pDifidx++; /* Q0 */
     123       25257 :                 move16();
     124       25257 :                 hcode_l = add( hcode_l, huffsizn[j] ); /* Q0 */
     125             :             }
     126             :         }
     127             :         ELSE
     128             :         {
     129         122 :             startNormPlus1 = add( start_norm, 1 ); /* Q0 */
     130         122 :             numSfmMinus1 = sub( num_sfm, 1 );      /* Q0 */
     131         122 :             pDifidx = &difidx[startNormPlus1];     /* Q0 */
     132        2821 :             FOR( i = 0; i < numSfmMinus1; i++ )
     133             :             {
     134        2699 :                 *pDifidx++ = (Word16) get_next_indice_fx( st_fx, NORMI_BITS ); /* Q0 */
     135        2699 :                 move16();
     136             :             }
     137         122 :             hcode_l = numnrmibits; /* Q0 */
     138         122 :             move16();
     139             :         }
     140             :     }
     141             : 
     142        7758 :     return hcode_l;
     143             : }
     144             : 
     145             : /*------------------------------------------------------------------------*
     146             :  * dequantize_norms_fx()
     147             :  *
     148             :  * De-quantization of norms
     149             :  *------------------------------------------------------------------------*/
     150             : 
     151        7728 : void dequantize_norms_fx(
     152             :     Decoder_State *st_fx,      /* i/o: decoder state structure             */
     153             :     const Word16 start_norm,   /* i  : First SDE encoded norm            Q0*/
     154             :     const Word16 num_sfm,      /* i  : Number of norms                   Q0*/
     155             :     const Word16 is_transient, /* i  : Transient flag                    Q0*/
     156             :     Word16 *ynrm,              /* o  : Decoded norm indices              Q0*/
     157             :     Word16 *normqlg2           /* o  : Log2 of decoded norms             Q0*/
     158             : )
     159             : {
     160             :     Word16 i, j;
     161             :     Word16 idxbuf[NB_SFM];
     162             :     Word16 *pYnrm, *pNormqlg2;
     163             : 
     164             :     /* First sub-frame */
     165        7728 :     i = ynrm[start_norm]; /* Q0 */
     166        7728 :     move16();
     167        7728 :     normqlg2[start_norm] = dicnlg2[i]; /* Q0 */
     168        7728 :     move16();
     169             : 
     170             :     /* Other sub-frames */
     171        7728 :     IF( is_transient )
     172             :     {
     173             :         /* Recover quantization indices and quantized norms */
     174         512 :         idxbuf[0] = ynrm[0]; /* Q0 */
     175         512 :         move16();
     176       21521 :         FOR( i = 1; i < num_sfm; i++ )
     177             :         {
     178       21009 :             idxbuf[i] = sub( add( ynrm[i], idxbuf[i - 1] ), 15 ); /* Q0 */
     179       21009 :             move16();
     180             :             /* safety check in case of bit errors */
     181       21009 :             test();
     182       21009 :             IF( idxbuf[i] < 0 || GT_16( idxbuf[i], 39 ) )
     183             :             {
     184           0 :                 idxbuf[i] = 39; /* Q0 */
     185           0 :                 move16();
     186           0 :                 st_fx->BER_detect = 1; /* Q0 */
     187           0 :                 move16();
     188             :             }
     189             :         }
     190             : 
     191         512 :         recovernorm_fx( idxbuf, ynrm, normqlg2, num_sfm );
     192             :     }
     193             :     ELSE
     194             :     {
     195        7216 :         pYnrm = &ynrm[start_norm]; /* Q0 */
     196        7216 :         move16();
     197        7216 :         pNormqlg2 = &normqlg2[start_norm + 1]; /* Q0 */
     198        7216 :         move16();
     199      206646 :         FOR( i = 1; i < num_sfm; i++ )
     200             :         {
     201      199430 :             j = sub( *pYnrm++, 15 ); /* Q0 */
     202      199430 :             move16();
     203      199430 :             *pYnrm = add( *pYnrm, j ); /* Q0 */
     204      199430 :             move16();
     205             :             /* safety check in case of bit errors */
     206      199430 :             test();
     207      199430 :             IF( *pYnrm < 0 || GT_16( *pYnrm, 39 ) )
     208             :             {
     209           0 :                 *pYnrm = 39; /* Q0 */
     210           0 :                 move16();
     211           0 :                 st_fx->BER_detect = 1; /* Q0 */
     212           0 :                 move16();
     213             :             }
     214      199430 :             *pNormqlg2++ = dicnlg2[*pYnrm]; /* Q0 */
     215      199430 :             move16();
     216             :         }
     217             :     }
     218             : 
     219        7728 :     return;
     220             : }

Generated by: LCOV version 1.14