LCOV - code coverage report
Current view: top level - lib_dec - hdecnrm_fx.c (source / functions) Hit Total Coverage
Test: Coverage on main enc/dec/rend @ 3b2f07138c61dcf997bbf4165d0882f794b2995f Lines: 139 159 87.4 %
Date: 2025-05-03 01:55:50 Functions: 6 6 100.0 %

          Line data    Source code
       1             : /*====================================================================================
       2             :     EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0
       3             :   ====================================================================================*/
       4             : #include <stdint.h>
       5             : #include "options.h" /* Compilation switches                   */
       6             : #include "prot_fx.h"
       7             : #include "rom_dec.h"
       8             : /*--------------------------------------------------------------------------*/
       9             : /*  Function  hdecnrm_fx                                                    */
      10             : /*  ~~~~~~~~~~~~~~~~~~~~                                                    */
      11             : /*                                                                          */
      12             : /*  Huffman decoding for indices of quantized norms                         */
      13             : /*--------------------------------------------------------------------------*/
      14         927 : void hdecnrm_fx(
      15             :     Decoder_State *st_fx,  /* i/o: decoder state structure                */
      16             :     const Word16 numNorms, /* i  : number of norms                              Q0*/
      17             :     Word16 *index )        /* o  : indices of quantized norms   Q0*/
      18             : {
      19             :     Word16 i, j, k, n, m;
      20             :     Word16 temp;
      21             :     Word16 *pidx;
      22             : 
      23             : 
      24         927 :     pidx = index; /* Q0 */
      25             : 
      26         927 :     m = sub( numNorms, 1 ); /* Q0 */
      27       26184 :     FOR( i = 0; i < m; i++ )
      28             :     {
      29       25257 :         j = (Word16) 0;
      30       25257 :         move16();
      31       25257 :         k = (Word16) 0;
      32       25257 :         move16();
      33             : 
      34       25257 :         if ( get_next_indice_1_fx( st_fx ) != 0 )
      35             :         {
      36       12303 :             j = (Word16) 1; /* Q0 */
      37       12303 :             move16();
      38             :         }
      39       25257 :         if ( get_next_indice_1_fx( st_fx ) != 0 )
      40             :         {
      41       12765 :             k = (Word16) 1; /* Q0 */
      42       12765 :             move16();
      43             :         }
      44       25257 :         n = add( shl( j, 1 ), k );     /* Q0 */
      45       25257 :         j = shl( j, 2 );               /* Q0 */
      46       25257 :         temp = sub( add( 16, n ), j ); /* Q0 */
      47       25257 :         IF( get_next_indice_1_fx( st_fx ) != 0 )
      48             :         {
      49       14164 :             temp = add( add( 12, n ), j ); /* Q0 */
      50       14164 :             IF( get_next_indice_1_fx( st_fx ) != 0 )
      51             :             {
      52        6406 :                 j = (Word16) 0;
      53        6406 :                 move16();
      54        6406 :                 if ( get_next_indice_1_fx( st_fx ) != 0 )
      55             :                 {
      56        2816 :                     j = 1; /* Q0 */
      57        2816 :                     move16();
      58             :                 }
      59        6406 :                 temp = add( 8, n ); /* Q0 */
      60        6406 :                 if ( j != 0 )
      61             :                 {
      62        2816 :                     temp = add( temp, 12 ); /* Q0 */
      63             :                 }
      64        6406 :                 IF( get_next_indice_1_fx( st_fx ) != 0 )
      65             :                 {
      66        1113 :                     temp = n; /* Q0 */
      67        1113 :                     move16();
      68             : 
      69        1113 :                     if ( get_next_indice_1_fx( st_fx ) != 0 )
      70             :                     {
      71         485 :                         temp = add( 4, n ); /* Q0 */
      72             :                     }
      73        1113 :                     if ( j != 0 )
      74             :                     {
      75         599 :                         temp = add( temp, 24 ); /* Q0 */
      76             :                     }
      77             :                 }
      78             :             }
      79             :         }
      80       25257 :         *pidx++ = temp; /* Q0 */
      81       25257 :         move16();
      82             :     }
      83             : 
      84         927 :     return;
      85             : }
      86             : 
      87             : /*--------------------------------------------------------------------------*/
      88             : /*  Function  decode_huff_context                                           */
      89             : /*  ~~~~~~~~~~~~~~~~~                                                       */
      90             : /*                                                                          */
      91             : /*  Context based Huffman decoding for indices of quantized norms           */
      92             : /*--------------------------------------------------------------------------*/
      93             : /*  const Word16 *hufftab,   (i)    Huffman table                           */
      94             : /*  Word16       *rbits      (i/o)  the number of read bits                 */
      95             : /*--------------------------------------------------------------------------*/
      96             : 
      97      130180 : Word16 decode_huff_context_fx(
      98             :     Decoder_State *st_fx,  /* i/o: decoder state structure */
      99             :     const Word16 *hufftab, /* Q0 */
     100             :     Word16 *rbits          /* Q0 */
     101             : )
     102             : {
     103             :     Word16 tmp_l, tmp_h;
     104             :     Word32 hufftab_idx;
     105             : 
     106      130180 :     hufftab_idx = L_deposit_l( 0 );
     107      399210 :     WHILE( hufftab[hufftab_idx] > 0 )
     108             :     {
     109      269030 :         tmp_h = shr( hufftab[hufftab_idx], 4 );               /* Q0 */
     110      269030 :         tmp_l = sub( hufftab[hufftab_idx], shl( tmp_h, 4 ) ); /* Q0 */
     111      269030 :         *rbits = add( *rbits, tmp_l );                        /* Q0 */
     112      269030 :         move16();
     113      269030 :         hufftab_idx = L_add( hufftab_idx, L_add( L_deposit_l( tmp_h ), get_next_indice_fx( st_fx, tmp_l ) ) ); /* Q0 */
     114             :     }
     115      130180 :     return negate( hufftab[hufftab_idx] );
     116             : }
     117             : 
     118             : 
     119             : /*--------------------------------------------------------------------------*/
     120             : /*  hdecnrm_context_fx()                                                    */
     121             : /*  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~                                          */
     122             : /*                                                                          */
     123             : /*  Huffman decoding for indices of quantized norms                         */
     124             : /*--------------------------------------------------------------------------*/
     125             : /*  Word16       N           (i)    number of norms                         */
     126             : /*  Word16       *index      (o)    indices of quantized norms              */
     127             : /*  Word16       *n_length   (o)    decoded stream length                   */
     128             : /*--------------------------------------------------------------------------*/
     129             : 
     130        4515 : void hdecnrm_context_fx(
     131             :     Decoder_State *st_fx, /* i/o: decoder state structure */
     132             :     const Word16 N,       /* Q0 */
     133             :     Word16 *index,        /* Q0 */
     134             :     Word16 *n_length      /* Q0 */
     135             : )
     136             : {
     137             :     Word16 i, prevj, tmp;
     138             : 
     139        4515 :     prevj = add( index[0], OFFSET_NORM ); /* Q0 */
     140      134695 :     FOR( i = 1; i < N; i++ )
     141             :     {
     142      130180 :         IF( GT_16( prevj, HTH_NORM ) )
     143             :         {
     144             :             /* above */
     145       27351 :             tmp = decode_huff_context_fx( st_fx, hntable, n_length ); /* Q0 */
     146       27351 :             index[i] = sub( 31, tmp );                                /* Q0 */
     147       27351 :             move16();
     148             :         }
     149             :         ELSE
     150             :         {
     151      102829 :             IF( LT_16( prevj, LTH_NORM ) )
     152             :             {
     153             :                 /* less */
     154       16647 :                 index[i] = decode_huff_context_fx( st_fx, hntable, n_length ); /* Q0 */
     155       16647 :                 move16();
     156             :             }
     157             :             ELSE
     158             :             {
     159             :                 /* equal */
     160       86182 :                 index[i] = decode_huff_context_fx( st_fx, hetable, n_length ); /* Q0 */
     161       86182 :                 move16();
     162             :             }
     163             :         }
     164      130180 :         prevj = index[i]; /* Q0 */
     165      130180 :         move16();
     166             :     }
     167        4515 :     return;
     168             : }
     169             : 
     170        2193 : void hdecnrm_resize_fx(
     171             :     Decoder_State *st_fx, /* i/o: decoder state structure */
     172             :     const Word16 N,       /* (i)  number of SFMs        Q0*/
     173             :     Word16 *index         /* (o)  norm quantization index vector        Q0*/
     174             : )
     175             : {
     176             :     Word16 i, j, k, m;
     177             :     Word16 temp;
     178             :     Word16 *pidx;
     179             : 
     180        2193 :     pidx = index; /* Q0 */
     181             : 
     182        2193 :     m = sub( N, 1 ); /* Q0 */
     183        2193 :     move16();
     184       65105 :     FOR( i = 0; i < m; i++ )
     185             :     {
     186       62912 :         j = 0;
     187       62912 :         move16();
     188       62912 :         k = 0;
     189       62912 :         move16();
     190             : 
     191      139748 :         FOR( j = 0; j < 11; j++ )
     192             :         {
     193      139744 :             IF( get_next_indice_1_fx( st_fx ) != 0 )
     194             :             {
     195       76836 :                 k = add( k, 1 ); /* Q0 */
     196       76836 :                 move16();
     197             :             }
     198             :             ELSE
     199             :             {
     200       62908 :                 BREAK;
     201             :             }
     202             :         }
     203             : 
     204       62912 :         IF( EQ_16( k, 11 ) )
     205             :         {
     206           4 :             temp = 25; /* Q0 */
     207           4 :             move16();
     208             :         }
     209       62908 :         ELSE IF( EQ_16( k, 10 ) )
     210             :         {
     211          13 :             temp = 5; /* Q0 */
     212          13 :             move16();
     213             :         }
     214       62895 :         ELSE IF( EQ_16( k, 9 ) )
     215             :         {
     216          17 :             temp = 6; /* Q0 */
     217          17 :             move16();
     218             :         }
     219             :         ELSE{
     220       62878 :             IF( get_next_indice_1_fx( st_fx ) != 0 ){
     221       30689 :                 temp = add( 16, k ); /* Q0 */
     222             :     }
     223             :     ELSE
     224             :     {
     225       32189 :         temp = sub( 15, k ); /* Q0 */
     226       32189 :         move16();
     227             :     }
     228             : }
     229             : 
     230       62912 : *pidx++ = temp; /* Q0 */
     231       62912 : move16();
     232             : }
     233             : 
     234        2193 : return;
     235             : }
     236             : 
     237             : /*--------------------------------------------------------------------------
     238             :  *  huff_dec()
     239             :  *
     240             :  *  Huffman decoding
     241             :  *--------------------------------------------------------------------------*/
     242             : 
     243        2281 : void huff_dec_fx(
     244             :     Decoder_State *st_fx,     /* i/o: decoder state structure                         */
     245             :     const Word16 N,           /* i  : Number of codewords to decode                   Q0*/
     246             :     const Word16 buffer_len,  /* i  : Number of bits to read                          Q0*/
     247             :     const Word16 num_lengths, /* i  : Number of different huffman codeword lengths    Q0*/
     248             :     const Word16 *thres,      /* i  : Threshold of first codeword of each length      Q0*/
     249             :     const Word16 *offset,     /* i  : Offset for first codeword                       Q0*/
     250             :     const Word16 *huff_tab,   /* i  : Huffman table order by codeword lengths         Q0*/
     251             :     Word16 *index             /* o  : Decoded index                                   Q0*/
     252             : )
     253             : {
     254             :     Word16 i, j, k;
     255             :     UWord16 val;
     256             :     Word16 last_bits;
     257             : 
     258        2281 :     last_bits = buffer_len; /* Q0 */
     259        2281 :     move16();
     260             : 
     261        2281 :     val = 0;
     262        2281 :     move16();
     263        2281 :     j = 0;
     264        2281 :     move16();
     265       40554 :     FOR( i = 0; i < N; i++ )
     266             :     {
     267       38273 :         last_bits = sub( buffer_len, j );                                    /* Q0 */
     268       38273 :         val = (UWord16) L_shl( val, last_bits );                             /* Q0 */
     269       38273 :         val = (UWord16) L_and( val, sub( lshl( 1, buffer_len ), 1 ) );       /* Q0 */
     270       38273 :         val = (UWord16) L_or( val, get_next_indice_fx( st_fx, last_bits ) ); /* Q0 */
     271             : 
     272             :         /* Find codeword length */
     273       38273 :         j = sub( num_lengths, 1 ); /* Q0 */
     274       84279 :         WHILE( LT_16( val, thres[j] ) )
     275             :         {
     276       46006 :             j = sub( j, 1 ); /* Q0 */
     277             :         }
     278       38273 :         k = lshr( sub( val, thres[j] ), j ); /* Q0 */
     279       38273 :         *index++ = huff_tab[offset[j] + k];  /* Q0 */
     280       38273 :         move16();
     281             :     }
     282             : 
     283             :     /* Put back unused bits */
     284        2281 :     st_fx->next_bit_pos = sub( st_fx->next_bit_pos, j ); /* Q0 */
     285        2281 :     move16();
     286             : 
     287        2281 :     return;
     288             : }
     289             : 
     290             : /*--------------------------------------------------------------------------
     291             :  * hdecnrm_trans()
     292             :  *
     293             :  * Huffman decoding for indices of quantized norms
     294             :  *--------------------------------------------------------------------------*/
     295             : 
     296           1 : void hdecnrm_tran_fx(
     297             :     Decoder_State *st_fx, /* i/o: decoder state structure                 */
     298             :     const Word16 N,       /* i  : number of norms                               Q0*/
     299             :     Word16 *index         /* o  : indices of quantized norms    Q0*/
     300             : )
     301             : {
     302             :     Word16 i, j, k, n, m;
     303             :     Word16 temp;
     304             :     Word16 *pidx;
     305             :     Word16 l;
     306             : 
     307           1 :     pidx = index; /* Q0 */
     308             : 
     309           1 :     m = sub( N, 1 ); /* Q0 */
     310          32 :     FOR( i = 0; i < m; i++ )
     311             :     {
     312          31 :         j = 0;
     313          31 :         move16();
     314          31 :         k = 0;
     315          31 :         move16();
     316          31 :         if ( get_next_indice_1_fx( st_fx ) != 0 )
     317             :         {
     318          16 :             j = 1; /* Q0 */
     319          16 :             move16();
     320             :         }
     321             : 
     322          31 :         if ( get_next_indice_1_fx( st_fx ) != 0 )
     323             :         {
     324           8 :             k = 1; /* Q0 */
     325           8 :             move16();
     326             :         }
     327             : 
     328             :         /*n = k * 2 + j; */
     329          31 :         n = add( shl( k, 1 ), j ); /* Q0 */
     330             :         /*l = k * 4; */
     331          31 :         l = shl( k, 2 ); /* Q0 */
     332          31 :         test();
     333          31 :         test();
     334          31 :         test();
     335          31 :         test();
     336          31 :         test();
     337          31 :         IF( ( j == 0 && k == 0 ) || ( EQ_16( j, 1 ) && k == 0 ) || ( EQ_16( j, 1 ) && EQ_16( k, 1 ) ) )
     338             :         {
     339          31 :             temp = sub( add( 15, l ), n ); /* Q0 */
     340             :         }
     341             :         ELSE{
     342           0 :             IF( get_next_indice_1_fx( st_fx ) != 0 ){
     343           0 :                 temp = sub( add( 15, n ), l ); /* Q0 */
     344             :     }
     345             :     ELSE
     346             :     {
     347           0 :         temp = sub( add( 15, l ), n ); /* Q0 */
     348           0 :         IF( get_next_indice_1_fx( st_fx ) != 0 )
     349             :         {
     350           0 :             FOR( k = 0; k < 3; )
     351             :             {
     352           0 :                 IF( get_next_indice_1_fx( st_fx ) != 0 )
     353             :                 {
     354           0 :                     k++; /* Q0 */
     355             :                 }
     356             :                 ELSE
     357             :                 {
     358           0 :                     BREAK;
     359             :                 }
     360             :             }
     361             : 
     362           0 :             test();
     363           0 :             IF( k == 0 || EQ_16( k, 3 ) )
     364             :             {
     365           0 :                 temp = sub( temp, 5 );
     366           0 :                 if ( EQ_16( k, 3 ) )
     367             :                 {
     368           0 :                     temp = sub( temp, 1 ); /* Q0 */
     369             :                 }
     370             :             }
     371           0 :             ELSE IF( EQ_16( k, 1 ) )
     372             :             {
     373           0 :                 temp = add( temp, 1 ); /* Q0 */
     374             :             }
     375             :             ELSE
     376             :             {
     377           0 :                 temp = add( temp, 2 ); /* Q0 */
     378           0 :                 IF( get_next_indice_1_fx( st_fx ) != 0 )
     379             :                 {
     380           0 :                     temp = add( temp, 1 );
     381           0 :                     if ( get_next_indice_1_fx( st_fx ) != 0 )
     382             :                     {
     383           0 :                         temp = add( temp, 1 ); /* Q0 */
     384             :                     }
     385             :                 }
     386             :             }
     387             :         }
     388             :     }
     389             : }
     390             : 
     391          31 : *pidx++ = temp; /* Q0 */
     392          31 : move16();
     393             : }
     394             : 
     395           1 : return;
     396             : }

Generated by: LCOV version 1.14