LCOV - code coverage report
Current view: top level - lib_dec - hq_env_dec_fx.c (source / functions) Hit Total Coverage
Test: Coverage on main -- dec/rend @ 633e3f2e309758d10805ef21e0436356fe719b7a Lines: 95 104 91.3 %
Date: 2025-08-23 01:22:27 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        7870 : 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        7870 :     test();
      34        7870 :     IF( EQ_16( flag_HQ2, LOW_RATE_HQ_CORE ) || EQ_16( flag_HQ2, LOW_RATE_HQ_CORE_TRAN ) )
      35             :     {
      36          32 :         LCmode = (Word16) get_next_indice_fx( st_fx, BITS_DE_HMODE );             /* Q0 */
      37          32 :         difidx[start_norm] = (Word16) get_next_indice_fx( st_fx, BITS_DE_FCOMP ); /* Q0 */
      38          32 :         move16();
      39             :     }
      40             :     ELSE
      41             :     {
      42        7838 :         LCmode = (Word16) get_next_indice_fx( st_fx, 2 );                      /* Q0 */
      43        7838 :         difidx[start_norm] = (Word16) get_next_indice_fx( st_fx, NORM0_BITS ); /* Q0 */
      44        7838 :         move16();
      45             :     }
      46             : 
      47        7870 :     test();
      48        7870 :     IF( is_transient && EQ_16( flag_HQ2, LOW_RATE_HQ_CORE_TRAN ) )
      49             :     {
      50           2 :         hcode_l = 0;
      51           2 :         move16();
      52           2 :         IF( EQ_16( LCmode, 1 ) )
      53             :         {
      54           2 :             hdecnrm_tran_fx( st_fx, num_sfm, &difidx[start_norm + 1] );
      55           2 :             j = add( start_norm, num_sfm ); /* Q0 */
      56          64 :             FOR( i = start_norm + 1; i < j; i++ )
      57             :             {
      58          62 :                 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        7868 :         hcode_l = 0;
      69        7868 :         move16();
      70        7868 :         IF( LCmode == 0 )
      71             :         {
      72        4592 :             hdecnrm_context_fx( st_fx, num_sfm, &difidx[start_norm], &hcode_l );
      73             :         }
      74        3276 :         ELSE IF( EQ_16( LCmode, 1 ) )
      75             :         {
      76        2220 :             startNormPlus1 = add( start_norm, 1 ); /* Q0 */
      77        2220 :             hdecnrm_resize_fx( st_fx, num_sfm, &difidx[startNormPlus1] );
      78             : 
      79        2220 :             pDifidx = &difidx[startNormPlus1]; /* Q0 */
      80        2220 :             move16();
      81        2220 :             numSfmMinus1 = sub( num_sfm, 1 ); /* Q0 */
      82       65909 :             FOR( i = 0; i < numSfmMinus1; i++ )
      83             :             {
      84       63689 :                 j = *pDifidx++;
      85       63689 :                 move16();
      86       63689 :                 hcode_l = add( hcode_l, resize_huffsizn[j] ); /* Q0 */
      87             :             }
      88             : 
      89        2220 :             pDifidx1 = &difidx[startNormPlus1]; /* Q0 */
      90        2220 :             move16();
      91        2220 :             numSfmMinus2 = sub( num_sfm, 2 ); /* Q0 */
      92       63689 :             FOR( i = 0; i < numSfmMinus2; i++ )
      93             :             {
      94       61469 :                 pDifidx = pDifidx1++; /* Q0 */
      95       61469 :                 move16();
      96       61469 :                 IF( GT_16( *pDifidx, 17 ) )
      97             :                 {
      98       11022 :                     offset = sub( *pDifidx, 17 );         /* Q0 */
      99       11022 :                     offset = s_min( offset, 3 );          /* Q0 */
     100       11022 :                     *pDifidx1 = sub( *pDifidx1, offset ); /* Q0 */
     101       11022 :                     move16();
     102             :                 }
     103       50447 :                 ELSE IF( LT_16( *pDifidx, 13 ) )
     104             :                 {
     105        6767 :                     offset = sub( *pDifidx, 13 );         /* Q0 */
     106        6767 :                     offset = s_max( offset, -3 );         /* Q0 */
     107        6767 :                     *pDifidx1 = sub( *pDifidx1, offset ); /* Q0 */
     108        6767 :                     move16();
     109             :                 }
     110             :             }
     111             :         }
     112        1056 :         ELSE IF( EQ_16( LCmode, 2 ) )
     113             :         {
     114         934 :             startNormPlus1 = add( start_norm, 1 ); /* Q0 */
     115         934 :             hdecnrm_fx( st_fx, num_sfm, &difidx[start_norm + 1] );
     116             : 
     117         934 :             pDifidx = &difidx[startNormPlus1]; /* Q0 */
     118         934 :             move16();
     119         934 :             numSfmMinus1 = sub( num_sfm, 1 ); /* Q0 */
     120       26415 :             FOR( i = 0; i < numSfmMinus1; i++ )
     121             :             {
     122       25481 :                 j = *pDifidx++; /* Q0 */
     123       25481 :                 move16();
     124       25481 :                 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        7870 :     return hcode_l;
     143             : }
     144             : 
     145             : /*------------------------------------------------------------------------*
     146             :  * dequantize_norms_fx()
     147             :  *
     148             :  * De-quantization of norms
     149             :  *------------------------------------------------------------------------*/
     150             : 
     151        7838 : 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        7838 :     i = ynrm[start_norm]; /* Q0 */
     166        7838 :     move16();
     167        7838 :     normqlg2[start_norm] = dicnlg2[i]; /* Q0 */
     168        7838 :     move16();
     169             : 
     170             :     /* Other sub-frames */
     171        7838 :     IF( is_transient )
     172             :     {
     173             :         /* Recover quantization indices and quantized norms */
     174         523 :         idxbuf[0] = ynrm[0]; /* Q0 */
     175         523 :         move16();
     176       21995 :         FOR( i = 1; i < num_sfm; i++ )
     177             :         {
     178       21472 :             idxbuf[i] = sub( add( ynrm[i], idxbuf[i - 1] ), 15 ); /* Q0 */
     179       21472 :             move16();
     180             :             /* safety check in case of bit errors */
     181       21472 :             test();
     182       21472 :             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         523 :         recovernorm_fx( idxbuf, ynrm, normqlg2, num_sfm );
     192             :     }
     193             :     ELSE
     194             :     {
     195        7315 :         pYnrm = &ynrm[start_norm]; /* Q0 */
     196        7315 :         move16();
     197        7315 :         pNormqlg2 = &normqlg2[start_norm + 1]; /* Q0 */
     198        7315 :         move16();
     199      209490 :         FOR( i = 1; i < num_sfm; i++ )
     200             :         {
     201      202175 :             j = sub( *pYnrm++, 15 ); /* Q0 */
     202      202175 :             move16();
     203      202175 :             *pYnrm = add( *pYnrm, j ); /* Q0 */
     204      202175 :             move16();
     205             :             /* safety check in case of bit errors */
     206      202175 :             test();
     207      202175 :             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      202175 :             *pNormqlg2++ = dicnlg2[*pYnrm]; /* Q0 */
     215      202175 :             move16();
     216             :         }
     217             :     }
     218             : 
     219        7838 :     return;
     220             : }

Generated by: LCOV version 1.14