LCOV - code coverage report
Current view: top level - lib_dec - dlpc_avq_fx.c (source / functions) Hit Total Coverage
Test: Coverage on main enc/dec/rend @ 3b2f07138c61dcf997bbf4165d0882f794b2995f Lines: 148 221 67.0 %
Date: 2025-05-03 01:55:50 Functions: 4 5 80.0 %

          Line data    Source code
       1             : /*====================================================================================
       2             :     EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0
       3             :   ====================================================================================*/
       4             : 
       5             : 
       6             : #include <stdint.h>
       7             : #include "options.h"
       8             : #include <assert.h>
       9             : #include "prot_fx.h"
      10             : /* Constants */
      11             : 
      12             : #define M       16    /* length of LPC */
      13             : #define BFI_FAC 29491 /*0.9f Q15*/
      14             : 
      15             : /***********************************************/
      16             : /* Variable bit-rate multiple LPC un-quantizer */
      17             : /***********************************************/
      18             : 
      19      101170 : Word16 dlpc_avq_fx(
      20             :     Word16 *index, /* i  : Quantization indices        */
      21             :     Word16 *LSF_Q, /* o  : Quantized LSF vectors       */
      22             :     Word16 numlpc, /* i  : Number of sets of lpc       */
      23             :     Word32 sr_core /* i  : Core sampling rate          */
      24             : )
      25             : {
      26             :     Word16 i, nbi, last;
      27             :     Word16 *p_index, q_type;
      28             : 
      29             : 
      30             :     /* Last LPC index */
      31             : 
      32      101170 :     move16();
      33      101170 :     last = 0;
      34      101170 :     IF( NE_16( numlpc, 1 ) )
      35             :     {
      36        1942 :         move16();
      37        1942 :         last = M;
      38             :     }
      39             : 
      40      101170 :     move16();
      41      101170 :     p_index = index;
      42             : 
      43             :     /* Decode last LPC */
      44             : 
      45     1719890 :     FOR( i = 0; i < M; i++ )
      46             :     {
      47     1618720 :         move16();
      48     1618720 :         LSF_Q[last + i] = 0;
      49             :     }
      50      101170 :     vlpc_1st_dec( p_index[0], &LSF_Q[last] ); // LSF_Q[last] -> Q2.56
      51      101170 :     p_index++;
      52      101170 :     vlpc_2st_dec( &LSF_Q[last], &p_index[0], 0, sr_core ); // Q2.56
      53      101170 :     nbi = add( 2, add( p_index[0], p_index[1] ) );
      54      101170 :     p_index += nbi;
      55             : 
      56             :     /* Decode intermediate LPC (512 framing) */
      57             : 
      58      101170 :     IF( EQ_16( numlpc, 2 ) )
      59             :     {
      60        1942 :         move16();
      61        1942 :         q_type = p_index[0];
      62        1942 :         p_index++;
      63             : 
      64        1942 :         IF( q_type == 0 )
      65             :         {
      66             : 
      67       18275 :             FOR( i = 0; i < M; i++ )
      68             :             {
      69       17200 :                 move16();
      70       17200 :                 LSF_Q[i] = 0;
      71             :             }
      72        1075 :             vlpc_1st_dec( p_index[0], &LSF_Q[0] ); ////Q2.56
      73        1075 :             p_index++;
      74        1075 :             vlpc_2st_dec( &LSF_Q[0], &p_index[0], 0, sr_core );
      75             :         }
      76         867 :         ELSE IF( EQ_16( q_type, 1 ) )
      77             :         {
      78             : 
      79       14739 :             FOR( i = 0; i < M; i++ )
      80             :             {
      81       13872 :                 move16();
      82       13872 :                 LSF_Q[i] = LSF_Q[M + i];
      83             :             }
      84         867 :             vlpc_2st_dec( &LSF_Q[0], &p_index[0], 3, sr_core ); ////Q2.56
      85             :         }
      86        1942 :         nbi = add( 2, add( p_index[0], p_index[1] ) );
      87        1942 :         p_index += nbi;
      88             :     }
      89             : 
      90      101170 :     return (Word16) ( p_index - index );
      91             : }
      92             : 
      93      156174 : static Word16 unary_decode_fx(
      94             :     Decoder_State *st,
      95             :     Word16 *ind )
      96             : {
      97             : 
      98             :     Word16 start_bit_pos;
      99             : 
     100             : 
     101      156174 :     move16();
     102      156174 :     start_bit_pos = st->next_bit_pos;
     103             : 
     104             :     /* Index bits */
     105             : 
     106      156174 :     move16();
     107      156174 :     *ind = 0;
     108      156174 :     test();
     109      350411 :     WHILE( ( get_next_indice_1_fx( st ) != 0 ) && !st->BER_detect )
     110             :     {
     111      194237 :         move16();
     112      194237 :         *ind = add( *ind, 1 );
     113             :     }
     114             : 
     115      156174 :     if ( *ind != 0 )
     116             :     {
     117      111264 :         move16();
     118      111264 :         *ind = add( *ind, 1 );
     119             :     }
     120             : 
     121      156174 :     return sub( st->next_bit_pos, start_bit_pos );
     122             : }
     123             : 
     124     1133296 : static Word16 pack4bits_fx(
     125             :     Word16 nbits,
     126             :     Decoder_State *st,
     127             :     Word16 *prm )
     128             : {
     129             :     Word16 i;
     130             : 
     131             : 
     132     1133296 :     move16();
     133     1133296 :     i = 0;
     134             : 
     135     3252693 :     FOR( ; nbits > 4; nbits -= 4 )
     136             :     {
     137     2119397 :         move16();
     138     2119397 :         prm[i] = get_next_indice_fx( st, 4 );
     139     2119397 :         i = add( i, 1 );
     140             :     }
     141     1133296 :     prm[i] = get_next_indice_fx( st, nbits );
     142     1133296 :     move16();
     143     1133296 :     i = add( i, 1 );
     144             : 
     145     1133296 :     return ( i );
     146             : }
     147             : 
     148           0 : Word16 decode_lpc_avq_fx(
     149             :     Decoder_State *st,   /* i/o: decoder state structure     */
     150             :     const Word16 numlpc, /* i  : Number of sets of lpc       */
     151             :     Word16 *param_lpc    /* o  : lpc parameters              */
     152             : #ifdef IVAS_CODE_AVQ_LPC
     153             :     ,
     154             :     const Word16 ch,             /* i  : channel                     */
     155             :     const Word16 element_mode,   /* i  : element mode                */
     156             :     const Word16 sns_low_br_mode /* i  : SNS low-bitrate mode        */
     157             : #endif
     158             : )
     159             : {
     160             :     Word16 k, j;
     161             :     Word16 nb, qn1, qn2, avqBits, q_type;
     162             :     Word16 start_bit_pos;
     163             : #ifdef IVAS_CODE_AVQ_LPC
     164             :     Word16 stereo_mode = 0;
     165             : #endif
     166           0 :     move16();
     167           0 :     move16();
     168           0 :     move16();
     169           0 :     j = 0;
     170           0 :     start_bit_pos = st->next_bit_pos;
     171             : 
     172           0 :     FOR( k = 0; k < numlpc; k++ )
     173             :     {
     174             :         /* Decode quantizer type */
     175             : 
     176           0 :         IF( k == 0 )
     177             :         {
     178           0 :             move16();
     179           0 :             move16();
     180           0 :             q_type = 0;
     181           0 :             nb = 0;
     182             :         }
     183             :         ELSE
     184             :         {
     185           0 :             move16();
     186           0 :             nb = 1;
     187           0 :             q_type = get_next_indice_fx( st, nb );
     188           0 :             move16();
     189           0 :             param_lpc[j] = q_type;
     190           0 :             j = add( j, 1 );
     191             :         }
     192             : #ifdef IVAS_CODE_AVQ_LPC
     193             :         test();
     194             :         IF( EQ_16( element_mode, IVAS_CPE_MDCT ) && k == 0 )
     195             :         {
     196             :             stereo_mode = ch;
     197             :             move16();
     198             :             if ( ch == 0 )
     199             :             {
     200             :                 stereo_mode = param_lpc[j];
     201             :                 move16();
     202             :             }
     203             :             param_lpc[j++] = stereo_mode;
     204             :             move16();
     205             :         }
     206             : #endif
     207             :         /* Decode quantization indices */
     208             : 
     209           0 :         IF( q_type == 0 )
     210             :         {
     211             :             /* Absolute quantizer with 1st stage stochastic codebook */
     212             : #ifdef IVAS_CODE_AVQ_LPC
     213             :             IF( EQ_16( element_mode, IVAS_CPE_MDCT ) )
     214             :             {
     215             :                 IF( NE_16( stereo_mode, 3 ) )
     216             :                 {
     217             :                     param_lpc[j] = get_next_indice_fx( st, SNS_ABS_QUANT_BITS );
     218             :                 }
     219             :                 ELSE
     220             :                 {
     221             :                     param_lpc[j] = sub( get_next_indice_fx( st, 1 ), 2 );
     222             :                 }
     223             :                 move16();
     224             :             }
     225             :             ELSE
     226             : #endif
     227             :             {
     228           0 :                 move16();
     229           0 :                 param_lpc[j] = get_next_indice_fx( st, 8 );
     230             :             }
     231           0 :             j = add( j, 1 );
     232             :         }
     233             :         /*
     234             :          * 2nd stage decoding is skipped if:
     235             :          *   - we are in low bitrate mode and no joint SNS coding is used
     236             :          *   - OR the side-SNS-is-zero flag is set for joint SNS
     237             :          */
     238             : #ifdef IVAS_CODE_AVQ_LPC
     239             :         IF( NE_16( element_mode, IVAS_CPE_MDCT ) || ( !( sns_low_br_mode && ( EQ_16( stereo_mode, 0 ) || EQ_16( stereo_mode, 1 ) ) && !( EQ_16( q_type, 0 ) && EQ_16( param_lpc[j - 1], -2 ) ) ) ) )
     240             : #endif
     241             :         {
     242             :             /* 2 bits to specify Q2,Q3,Q4,ext */
     243           0 :             qn1 = add( 2, get_next_indice_fx( st, 2 ) );
     244           0 :             qn2 = add( 2, get_next_indice_fx( st, 2 ) );
     245             : 
     246             :             /* Unary code */
     247             :             /* Q5 = 0, Q6=10, Q0=110, Q7=1110, ... */
     248             : 
     249           0 :             IF( GT_16( qn1, 4 ) )
     250             :             {
     251           0 :                 nb = unary_decode_fx( st, &qn1 );
     252             : 
     253           0 :                 if ( EQ_16( nb, 1 ) )
     254             :                 {
     255           0 :                     qn1 = add( qn1, 5 );
     256             :                 }
     257           0 :                 if ( EQ_16( nb, 2 ) )
     258             :                 {
     259           0 :                     qn1 = add( qn1, 4 );
     260             :                 }
     261           0 :                 if ( EQ_16( nb, 3 ) )
     262             :                 {
     263           0 :                     move16();
     264           0 :                     qn1 = 0;
     265             :                 }
     266           0 :                 if ( GT_16( nb, 3 ) )
     267             :                 {
     268           0 :                     qn1 = add( qn1, 3 );
     269             :                 }
     270             :             }
     271             : 
     272           0 :             IF( GT_16( qn2, 4 ) )
     273             :             {
     274           0 :                 nb = unary_decode_fx( st, &qn2 );
     275             : 
     276           0 :                 if ( EQ_16( nb, 1 ) )
     277             :                 {
     278           0 :                     qn2 = add( qn2, 5 );
     279             :                 }
     280           0 :                 if ( EQ_16( nb, 2 ) )
     281             :                 {
     282           0 :                     qn2 = add( qn2, 4 );
     283             :                 }
     284           0 :                 if ( EQ_16( nb, 3 ) )
     285             :                 {
     286           0 :                     move16();
     287           0 :                     qn2 = 0;
     288             :                 }
     289           0 :                 if ( GT_16( nb, 3 ) )
     290             :                 {
     291           0 :                     qn2 = add( qn2, 3 );
     292             :                 }
     293             :             }
     294             : 
     295             :             /* check for potential bit errors */
     296           0 :             test();
     297           0 :             IF( ( GT_16( qn1, NB_SPHERE ) ) || ( GT_16( qn2, NB_SPHERE ) ) )
     298             :             {
     299           0 :                 qn1 = 0;
     300           0 :                 move16();
     301           0 :                 qn2 = 0;
     302           0 :                 move16();
     303           0 :                 st->BER_detect = 1;
     304           0 :                 move16();
     305             :             }
     306             : 
     307           0 :             move16();
     308           0 :             param_lpc[j] = qn1;
     309           0 :             j = add( j, 1 );
     310           0 :             move16();
     311           0 :             param_lpc[j] = qn2;
     312           0 :             j = add( j, 1 );
     313             : 
     314             :             /* Decode Split-by-2 algebraic VQ */
     315           0 :             avqBits = shl( qn1, 2 );
     316             : 
     317           0 :             pack4bits_fx( avqBits, st, &param_lpc[j] );
     318           0 :             j = add( j, qn1 );
     319             : 
     320           0 :             avqBits = shl( qn2, 2 );
     321           0 :             pack4bits_fx( avqBits, st, &param_lpc[j] );
     322           0 :             j = add( j, qn2 );
     323             :         }
     324             : #ifdef IVAS_CODE_AVQ_LPC
     325             :         ELSE
     326             :         {
     327             :             param_lpc[j] = 0;
     328             :             j = add( j, 1 );
     329             :             param_lpc[j] = 0;
     330             :             j = add( j, 1 );
     331             :             move16();
     332             :             move16();
     333             :         }
     334             : #endif
     335             :     }
     336             : 
     337           0 :     return sub( st->next_bit_pos, start_bit_pos );
     338             : }
     339      573176 : Word16 decode_lpc_avq_ivas_fx(
     340             :     Decoder_State *st,   /* i/o: decoder state structure     */
     341             :     const Word16 numlpc, /* i  : Number of sets of lpc       */
     342             :     Word16 *param_lpc    /* o  : lpc parameters              */
     343             :     ,
     344             :     const Word16 ch,             /* i  : channel                     */
     345             :     const Word16 element_mode,   /* i  : element mode                */
     346             :     const Word16 sns_low_br_mode /* i  : SNS low-bitrate mode        */
     347             : )
     348             : {
     349             :     Word16 k, j;
     350             :     Word16 nb, qn1, qn2, avqBits, q_type;
     351             :     Word16 start_bit_pos;
     352      573176 :     Word16 stereo_mode = 0;
     353             : 
     354      573176 :     move16();
     355      573176 :     move16();
     356      573176 :     move16();
     357      573176 :     j = 0;
     358      573176 :     start_bit_pos = st->next_bit_pos;
     359             : 
     360     1158763 :     FOR( k = 0; k < numlpc; k++ )
     361             :     {
     362             :         /* Decode quantizer type */
     363             : 
     364      585587 :         IF( k == 0 )
     365             :         {
     366      573176 :             move16();
     367      573176 :             move16();
     368      573176 :             q_type = 0;
     369      573176 :             nb = 0;
     370             :         }
     371             :         ELSE
     372             :         {
     373       12411 :             move16();
     374       12411 :             nb = 1;
     375       12411 :             q_type = get_next_indice_fx( st, nb );
     376       12411 :             move16();
     377       12411 :             param_lpc[j] = q_type;
     378       12411 :             j = add( j, 1 );
     379             :         }
     380      585587 :         test();
     381      585587 :         IF( EQ_16( element_mode, IVAS_CPE_MDCT ) && k == 0 )
     382             :         {
     383      472006 :             stereo_mode = ch;
     384      472006 :             move16();
     385      472006 :             if ( ch == 0 )
     386             :             {
     387      262512 :                 stereo_mode = param_lpc[j];
     388      262512 :                 move16();
     389             :             }
     390      472006 :             param_lpc[j] = stereo_mode;
     391      472006 :             j = add( j, 1 );
     392      472006 :             move16();
     393             :         }
     394             :         /* Decode quantization indices */
     395             : 
     396      585587 :         IF( q_type == 0 )
     397             :         {
     398             :             /* Absolute quantizer with 1st stage stochastic codebook */
     399      578178 :             IF( EQ_16( element_mode, IVAS_CPE_MDCT ) )
     400             :             {
     401      475933 :                 IF( NE_16( stereo_mode, 3 ) )
     402             :                 {
     403      304877 :                     param_lpc[j] = get_next_indice_fx( st, SNS_ABS_QUANT_BITS );
     404             :                 }
     405             :                 ELSE
     406             :                 {
     407      171056 :                     param_lpc[j] = sub( get_next_indice_fx( st, 1 ), 2 );
     408             :                 }
     409      475933 :                 move16();
     410             :             }
     411             :             ELSE
     412             :             {
     413      102245 :                 move16();
     414      102245 :                 param_lpc[j] = get_next_indice_fx( st, LPC_ABS_QUANT_BITS );
     415             :             }
     416      578178 :             j = add( j, 1 );
     417             :         }
     418             :         /*
     419             :          * 2nd stage decoding is skipped if:
     420             :          *   - we are in low bitrate mode and no joint SNS coding is used
     421             :          *   - OR the side-SNS-is-zero flag is set for joint SNS
     422             :          */
     423      585587 :         test();
     424      585587 :         test();
     425      585587 :         test();
     426      585587 :         test();
     427      585587 :         test();
     428      585587 :         IF( NE_16( element_mode, IVAS_CPE_MDCT ) || ( !( sns_low_br_mode && ( ( stereo_mode == 0 ) || EQ_16( stereo_mode, 1 ) ) ) && !( ( q_type == 0 ) && EQ_16( param_lpc[j - 1], -2 ) ) ) )
     429             :         {
     430             :             /* 2 bits to specify Q2,Q3,Q4,ext */
     431      566648 :             qn1 = add( 2, get_next_indice_fx( st, 2 ) );
     432      566648 :             qn2 = add( 2, get_next_indice_fx( st, 2 ) );
     433             :             /* Unary code */
     434             :             /* Q5 = 0, Q6=10, Q0=110, Q7=1110, ... */
     435             : 
     436      566648 :             IF( GT_16( qn1, 4 ) )
     437             :             {
     438       72241 :                 nb = unary_decode_fx( st, &qn1 );
     439             : 
     440       72241 :                 if ( EQ_16( nb, 1 ) )
     441             :                 {
     442       35839 :                     qn1 = add( qn1, 5 );
     443             :                 }
     444       72241 :                 if ( EQ_16( nb, 2 ) )
     445             :                 {
     446       24777 :                     qn1 = add( qn1, 4 );
     447             :                 }
     448       72241 :                 if ( EQ_16( nb, 3 ) )
     449             :                 {
     450       10702 :                     move16();
     451       10702 :                     qn1 = 0;
     452             :                 }
     453       72241 :                 if ( GT_16( nb, 3 ) )
     454             :                 {
     455         923 :                     qn1 = add( qn1, 3 );
     456             :                 }
     457             :             }
     458             : 
     459      566648 :             IF( GT_16( qn2, 4 ) )
     460             :             {
     461       83933 :                 nb = unary_decode_fx( st, &qn2 );
     462             : 
     463       83933 :                 if ( EQ_16( nb, 1 ) )
     464             :                 {
     465        9071 :                     qn2 = add( qn2, 5 );
     466             :                 }
     467       83933 :                 if ( EQ_16( nb, 2 ) )
     468             :                 {
     469        4618 :                     qn2 = add( qn2, 4 );
     470             :                 }
     471       83933 :                 if ( EQ_16( nb, 3 ) )
     472             :                 {
     473       70103 :                     move16();
     474       70103 :                     qn2 = 0;
     475             :                 }
     476       83933 :                 if ( GT_16( nb, 3 ) )
     477             :                 {
     478         141 :                     qn2 = add( qn2, 3 );
     479             :                 }
     480             :             }
     481             : 
     482             :             /* check for potential bit errors */
     483      566648 :             test();
     484      566648 :             IF( ( GT_16( qn1, NB_SPHERE ) ) || ( GT_16( qn2, NB_SPHERE ) ) )
     485             :             {
     486           0 :                 qn1 = 0;
     487           0 :                 move16();
     488           0 :                 qn2 = 0;
     489           0 :                 move16();
     490           0 :                 st->BER_detect = 1;
     491           0 :                 move16();
     492             :             }
     493             : 
     494      566648 :             move16();
     495      566648 :             param_lpc[j] = qn1;
     496      566648 :             j = add( j, 1 );
     497      566648 :             move16();
     498      566648 :             param_lpc[j] = qn2;
     499      566648 :             j = add( j, 1 );
     500             : 
     501             :             /* Decode Split-by-2 algebraic VQ */
     502      566648 :             avqBits = shl( qn1, 2 );
     503             : 
     504      566648 :             pack4bits_fx( avqBits, st, &param_lpc[j] );
     505      566648 :             j = add( j, qn1 );
     506             : 
     507      566648 :             avqBits = shl( qn2, 2 );
     508      566648 :             pack4bits_fx( avqBits, st, &param_lpc[j] );
     509      566648 :             j = add( j, qn2 );
     510             :         }
     511             :         ELSE
     512             :         {
     513       18939 :             param_lpc[j] = 0;
     514       18939 :             j = add( j, 1 );
     515       18939 :             param_lpc[j] = 0;
     516       18939 :             j = add( j, 1 );
     517       18939 :             move16();
     518       18939 :             move16();
     519             :         }
     520             :     }
     521             : 
     522      573176 :     return sub( st->next_bit_pos, start_bit_pos );
     523             : }

Generated by: LCOV version 1.14