LCOV - code coverage report
Current view: top level - lib_enc - qlpc_avq_fx.c (source / functions) Hit Total Coverage
Test: Coverage on main enc/dec/rend @ 3b2f07138c61dcf997bbf4165d0882f794b2995f Lines: 182 319 57.1 %
Date: 2025-05-03 01:55:50 Functions: 4 7 57.1 %

          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 <assert.h>
       8             : #include "options.h"
       9             : #include "cnst.h"
      10             : //#include "prot_fx.h"
      11             : #include "rom_com.h"
      12             : #include "prot_fx.h"     /* Function prototypes                    */
      13             : #include "prot_fx_enc.h" /* Function prototypes                    */
      14             : 
      15             : 
      16             : /*-------------------------------------------------------------------*
      17             :  * qlpc_avq_fx()
      18             :  *
      19             :  *
      20             :  * --------------------------------------------------------------------*/
      21      106874 : void qlpc_avq_fx(
      22             :     const Word16 *lsf,    /* i  : Input LSF vectors             (14Q1*1.28)    */
      23             :     const Word16 *lsfmid, /* i  : Input LSF vectors             (14Q1*1.28)    */
      24             :     Word16 *lsf_q,        /* o  : Quantized LFS vectors         (14Q1*1.28)    */
      25             :     Word16 *lsfmid_q,     /* o  : Quantized LFS vectors         (14Q1*1.28)    */
      26             :     Word16 *index,        /* o  : Quantization indices                 Q0      */
      27             :     Word16 *nb_indices,   /* o  : Number of quantization indices       Q0      */
      28             :     Word16 *nbbits,       /* o  : Number of quantization bits          Q0      */
      29             :     const Word16 core,    /* i  : TCX10 or TCX20                       Q0      */
      30             :     const Word32 sr_core  /* i  : internal sampling rate                           Q0      */
      31             : )
      32             : {
      33             :     Word16 i;
      34             :     Word16 lsfmid_q0[M];
      35             :     Word16 *tmp_index, indxt[256], nit, nbits, nbt;
      36             :     Word16 dummy[M];
      37             : 
      38             : 
      39             :     /* Init */
      40      106874 :     tmp_index = &index[0]; // Q0
      41      106874 :     *nb_indices = 0;
      42      106874 :     move16();
      43             : 
      44      106874 :     tmp_index[0] = vlpc_1st_cod_fx( lsf, lsf_q, dummy, 0 ); // Q0
      45             : 
      46      106874 :     nbt = vlpc_2st_cod_fx( lsf, lsf_q, &tmp_index[1], 0, sr_core ); // Q0
      47             : 
      48             :     /*nit = 1 + 2 + index[1] + index[2]; nit < NPRM_LPC_NEW(=50) */
      49      106874 :     nit = add( add( 3, index[1] ), index[2] ); // Q0
      50      106874 :     assert( nit < NPRM_LPC_NEW );
      51             : 
      52             :     /*tmp_index += nit;*/
      53      106874 :     tmp_index = tmp_index + nit;
      54             :     /**nb_indices += nit;*/
      55      106874 :     *nb_indices = add( *nb_indices, nit ); // Q0
      56      106874 :     move16();
      57             :     /*nbbits[0] = 8 + nbt;*/
      58      106874 :     nbbits[0] = add( 8, nbt ); // Q0
      59      106874 :     move16();
      60             : 
      61      106874 :     *tmp_index = 0;
      62      106874 :     move16();
      63             : 
      64      106874 :     IF( EQ_16( core, TCX_20_CORE ) )
      65             :     {
      66             : 
      67      104815 :         return;
      68             :     }
      69             : 
      70             :     /* Quantize intermediate LPC (512 framing) */
      71        2059 :     tmp_index++;
      72             :     /**nb_indices +=1;*/
      73        2059 :     *nb_indices = add( *nb_indices, 1 ); // Q0
      74        2059 :     move16();
      75             : 
      76             :     /* LPC2: Abs? */
      77        2059 :     tmp_index[0] = vlpc_1st_cod_fx( lsfmid, lsfmid_q, dummy, 0 ); // Q0
      78             : 
      79        2059 :     nbits = vlpc_2st_cod_fx( lsfmid, lsfmid_q, &tmp_index[1], 0, sr_core ); // Q0
      80             :     /*nbt = 8 + nbits;*/
      81        2059 :     nbt = add( 8, nbits );
      82             :     /*nit = 1 + 2 + tmp_index[1] + tmp_index[2];*/
      83        2059 :     nit = add( add( 3, tmp_index[1] ), tmp_index[2] ); // Q0
      84             : 
      85             :     /* LPC2: RelR? */
      86       35003 :     FOR( i = 0; i < M; i++ )
      87             :     {
      88       32944 :         lsfmid_q0[i] = lsf_q[i]; /* 14Q1*1.28 */
      89       32944 :         move16();
      90             :     }
      91        2059 :     nbits = vlpc_2st_cod_fx( lsfmid, lsfmid_q0, indxt, 3, sr_core ); // Q0
      92             : 
      93        2059 :     IF( LT_16( nbits, nbt ) )
      94             :     {
      95        1689 :         nbt = nbits; // Q0
      96        1689 :         move16();
      97             :         /*nit = 2 + indxt[0] + indxt[1];*/
      98        1689 :         nit = add( add( 2, indxt[0] ), indxt[1] ); // Q0
      99        1689 :         tmp_index[-1] = 1;
     100        1689 :         move16();
     101             : 
     102       28713 :         FOR( i = 0; i < M; i++ )
     103             :         {
     104       27024 :             lsfmid_q[i] = lsfmid_q0[i]; /* 14Q1*1.28 */
     105       27024 :             move16();
     106             :         }
     107             : 
     108       20994 :         FOR( i = 0; i < nit; i++ )
     109             :         {
     110       19305 :             tmp_index[i] = indxt[i]; // Q0
     111       19305 :             move16();
     112             :         }
     113             :     }
     114             : 
     115        2059 :     tmp_index += nit;
     116             :     /**nb_indices += nit;*/
     117        2059 :     *nb_indices = add( *nb_indices, nit ); // Q0
     118        2059 :     move16();
     119             :     /*nbbits[1] = 1 + nbt;*/
     120        2059 :     nbbits[1] = add( 1, nbt );
     121        2059 :     move16();
     122             : 
     123             : 
     124        2059 :     return;
     125             : }
     126             : /*-------------------------------------------------------------------*
     127             :  * unary_code()
     128             :  *
     129             :  *
     130             :  *--------------------------------------------------------------------*/
     131             : 
     132           0 : static Word16 unary_code(
     133             :     Word16 ind, /* Q0 */
     134             :     BSTR_ENC_HANDLE hBstr )
     135             : {
     136             :     Word16 nb_bits;
     137             : 
     138           0 :     move16();
     139           0 :     nb_bits = 1;
     140             : 
     141             :     /* Index bits */
     142           0 :     ind = sub( ind, 1 );
     143             : 
     144           0 :     FOR( ; ind > 0; ind-- )
     145             :     {
     146           0 :         push_next_indice( hBstr, 1, 1 );
     147           0 :         nb_bits = add( nb_bits, 1 ); // Q0
     148             :     }
     149             : 
     150             :     /* Stop bit */
     151           0 :     push_next_indice( hBstr, 0, 1 );
     152             : 
     153           0 :     return ( nb_bits );
     154             : }
     155      271518 : static Word16 unary_code_ivas_fx(
     156             :     Word16 ind, /* Q0 */
     157             :     BSTR_ENC_HANDLE hBstr )
     158             : {
     159             :     Word16 nb_bits;
     160             : 
     161      271518 :     move16();
     162      271518 :     nb_bits = 1;
     163             : 
     164             :     /* Index bits */
     165      271518 :     ind = sub( ind, 1 ); // Q0
     166             : 
     167      271518 :     WHILE( ind >= 16 )
     168             :     {
     169           0 :         push_next_indice( hBstr, 0xffffU, 16 );
     170           0 :         nb_bits = add( nb_bits, 16 ); // Q0
     171           0 :         ind = sub( ind, 16 );
     172             :     }
     173      271518 :     IF( ind > 0 )
     174             :     {
     175      215227 :         push_next_indice( hBstr, ( 1U << ind ) - 1, ind );
     176      215227 :         nb_bits = add( nb_bits, ind ); // Q0
     177             :     }
     178             : 
     179             :     /* Stop bit */
     180      271518 :     push_next_indice( hBstr, 0, 1 );
     181             : 
     182      271518 :     return ( nb_bits );
     183             : }
     184             : /*-------------------------------------------------------------------*
     185             :  * unpack4bits()
     186             :  *
     187             :  *
     188             :  *--------------------------------------------------------------------*/
     189           0 : static Word16 unpack4bits(
     190             :     Word16 nbits,      /* Q0 */
     191             :     const Word16 *prm, /* Q0 */
     192             :     BSTR_ENC_HANDLE hBstr )
     193             : {
     194             :     Word16 i;
     195             : 
     196           0 :     IF( nbits == 0 )
     197             :     {
     198           0 :         push_next_indice( hBstr, 0, 0 );
     199           0 :         i = 1;
     200           0 :         move16();
     201             :     }
     202             :     ELSE
     203             :     {
     204           0 :         move16();
     205           0 :         i = 0;
     206             : 
     207           0 :         FOR( ; nbits > 4; nbits -= 4 )
     208             :         {
     209           0 :             push_next_indice( hBstr, prm[i], 4 );
     210           0 :             i = add( i, 1 );
     211             :         }
     212           0 :         push_next_indice( hBstr, prm[i], nbits );
     213           0 :         i = add( i, 1 );
     214             :     }
     215             : 
     216           0 :     return ( i );
     217             : }
     218     1227970 : static Word16 unpack4bits_ivas_fx(
     219             :     Word16 nbits,      /* Q0 */
     220             :     const Word16 *prm, /* Q0 */
     221             :     BSTR_ENC_HANDLE hBstr )
     222             : {
     223             :     Word16 i;
     224             : 
     225     1227970 :     IF( nbits == 0 )
     226             :     {
     227       73198 :         push_next_indice( hBstr, 0, 0 );
     228       73198 :         i = 1;
     229       73198 :         move16();
     230             :     }
     231             :     ELSE
     232             :     {
     233     1154772 :         move16();
     234     1154772 :         i = 0;
     235             : 
     236     3925813 :         FOR( ; nbits > 4; nbits -= 4 )
     237             :         {
     238     2771041 :             push_next_indice( hBstr, prm[i], 4 );
     239     2771041 :             i = add( i, 1 );
     240             :         }
     241     1154772 :         push_next_indice( hBstr, prm[i], nbits );
     242     1154772 :         i = add( i, 1 );
     243             :     }
     244             : 
     245     1227970 :     return ( i );
     246             : }
     247             : /*-------------------------------------------------------------------*
     248             :  * encode_lpc_avq_fx()
     249             :  *
     250             :  *
     251             :  *--------------------------------------------------------------------*/
     252             : 
     253           0 : Word16 encode_lpc_avq_fx(
     254             :     BSTR_ENC_HANDLE hBstr,    /* i/o: bitstream handle                                  */
     255             :     const Word16 numlpc,      /* i  : Number of sets of lpc                             Q0*/
     256             :     const Word16 *param_lpc,  /* i  : lpc parameters                                    Q0*/
     257             :     const Word16 core,        /* i  : core                                              Q0*/
     258             :     const Word16 element_mode /* i  : element mode - decides between SNS and LPC coding Q0*/
     259             : )
     260             : {
     261             :     Word16 k, j;
     262             :     Word16 q_type, nb_ind;
     263             :     Word16 i, qn1, qn2, nb, avqBits, st1;
     264             :     Word16 nb_bits;
     265             :     Word16 stereo_mode, bits_for_abs_quant;
     266             : 
     267           0 :     stereo_mode = 0;
     268           0 :     move16();
     269           0 :     bits_for_abs_quant = LPC_ABS_QUANT_BITS;
     270           0 :     move16();
     271           0 :     if ( EQ_16( element_mode, IVAS_CPE_MDCT ) )
     272             :     {
     273           0 :         bits_for_abs_quant = SNS_ABS_QUANT_BITS;
     274           0 :         move16();
     275             :     }
     276             : 
     277           0 :     move16();
     278           0 :     move16();
     279           0 :     move16();
     280           0 :     st1 = 0;
     281           0 :     j = 0;
     282           0 :     nb_bits = 0;
     283             : 
     284           0 :     FOR( k = 0; k < numlpc; k++ )
     285             :     {
     286             :         /* Retrieve quantizer type */
     287             : 
     288             : 
     289           0 :         move16();
     290           0 :         q_type = 0;
     291           0 :         if ( k != 0 )
     292             :         {
     293           0 :             move16();
     294           0 :             q_type = param_lpc[j]; // Q0
     295           0 :             j = add( j, 1 );
     296             :         }
     297           0 :         test();
     298           0 :         if ( EQ_16( element_mode, IVAS_CPE_MDCT ) && k == 0 )
     299             :         {
     300           0 :             stereo_mode = param_lpc[j]; // Q0
     301           0 :             move16();
     302           0 :             j = add( j, 1 );
     303             :         }
     304             :         /* Determine number of AVQ indices */
     305           0 :         move16();
     306           0 :         nb_ind = 0;
     307             : 
     308           0 :         if ( q_type == 0 )
     309             :         {
     310           0 :             move16();
     311           0 :             st1 = param_lpc[j++]; // Q0
     312             :         }
     313           0 :         move16();
     314           0 :         move16();
     315           0 :         qn1 = param_lpc[j++]; // Q0
     316           0 :         qn2 = param_lpc[j++]; // Q0
     317           0 :         IF( EQ_16( qn1, SNS_LOW_BR_MODE ) )
     318             :         {
     319           0 :             nb_ind = add( qn1, qn2 );
     320             :         }
     321             : 
     322           0 :         test();
     323           0 :         test();
     324           0 :         IF( k == 0 || ( EQ_16( k, 1 ) && NE_16( core, TCX_20_CORE ) ) )
     325             :         {
     326             :             /* Encode quantizer type */
     327           0 :             move16();
     328           0 :             nb = 0;
     329           0 :             IF( k != 0 )
     330             :             {
     331           0 :                 nb = 1;
     332           0 :                 move16();
     333           0 :                 push_next_indice( hBstr, q_type, nb );
     334             :             }
     335           0 :             nb_bits = add( nb_bits, nb ); // Q0
     336             : 
     337             :             /* Encode quantizer data */
     338           0 :             test();
     339           0 :             test();
     340           0 :             test();
     341           0 :             test();
     342           0 :             IF( ( ( q_type == 0 ) && NE_16( element_mode, IVAS_CPE_MDCT ) ) || ( ( q_type == 0 ) && ( GE_16( st1, 0 ) ) && EQ_16( element_mode, IVAS_CPE_MDCT ) ) )
     343             :             {
     344             :                 /* Absolute quantizer with 1st stage stochastic codebook */
     345           0 :                 push_next_indice( hBstr, st1, bits_for_abs_quant );
     346           0 :                 nb_bits = add( nb_bits, bits_for_abs_quant ); // Q0
     347             :             }
     348             : 
     349           0 :             test();
     350           0 :             test();
     351           0 :             IF( EQ_16( element_mode, IVAS_CPE_MDCT ) && EQ_16( stereo_mode, 3 ) && st1 < 0 )
     352             :             {
     353           0 :                 push_next_indice( hBstr, add( st1, 2 ), 1 );
     354           0 :                 nb_bits = add( nb_bits, 1 ); // Q0
     355             :             }
     356             : 
     357           0 :             test();
     358           0 :             test();
     359           0 :             IF( NE_16( element_mode, IVAS_CPE_MDCT ) || ( NE_16( st1, -2 ) && NE_16( qn1, SNS_LOW_BR_MODE ) ) )
     360             :             {
     361             : 
     362             :                 /* 2 bits to specify Q2,Q3,Q4,ext */
     363           0 :                 nb_bits = add( nb_bits, 4 ); // Q0
     364           0 :                 i = sub( qn1, 2 );
     365             : 
     366           0 :                 if ( s_or( i < 0, (Word16) GT_16( i, 3 ) ) )
     367             :                 {
     368           0 :                     move16();
     369           0 :                     i = 3;
     370             :                 }
     371           0 :                 push_next_indice( hBstr, i, 2 );
     372             : 
     373           0 :                 i = sub( qn2, 2 );
     374             : 
     375           0 :                 if ( s_or( i < 0, (Word16) GT_16( i, 3 ) ) )
     376             :                 {
     377           0 :                     move16();
     378           0 :                     i = 3;
     379             :                 }
     380           0 :                 push_next_indice( hBstr, i, 2 );
     381             : 
     382             :                 /* Unary code for abs and rel LPC0/LPC2 */
     383             :                 /* Q5 = 0, Q6=10, Q0=110, Q7=1110, ... */
     384           0 :                 move16();
     385           0 :                 nb = qn1;
     386             : 
     387           0 :                 IF( GT_16( nb, 6 ) )
     388             :                 {
     389           0 :                     nb = sub( nb, 3 );
     390             :                 }
     391           0 :                 ELSE IF( GT_16( nb, 4 ) )
     392             :                 {
     393           0 :                     nb = sub( nb, 4 );
     394             :                 }
     395           0 :                 ELSE IF( nb == 0 )
     396             :                 {
     397           0 :                     move16();
     398           0 :                     nb = 3;
     399             :                 }
     400             :                 ELSE
     401             :                 {
     402           0 :                     move16();
     403           0 :                     nb = 0;
     404             :                 }
     405             : 
     406           0 :                 IF( nb > 0 )
     407             :                 {
     408           0 :                     unary_code( nb, hBstr );
     409             :                 }
     410           0 :                 nb_bits = add( nb_bits, nb ); // Q0
     411             : 
     412           0 :                 move16();
     413           0 :                 nb = qn2;
     414             : 
     415           0 :                 IF( GT_16( nb, 6 ) )
     416             :                 {
     417           0 :                     nb = sub( nb, 3 ); // Q0
     418             :                 }
     419           0 :                 ELSE IF( GT_16( nb, 4 ) )
     420             :                 {
     421           0 :                     nb = sub( nb, 4 ); // Q0
     422             :                 }
     423           0 :                 ELSE IF( nb == 0 )
     424             :                 {
     425           0 :                     move16();
     426           0 :                     nb = 3;
     427             :                 }
     428             :                 ELSE
     429             :                 {
     430           0 :                     move16();
     431           0 :                     nb = 0;
     432             :                 }
     433             : 
     434           0 :                 IF( nb > 0 )
     435             :                 {
     436           0 :                     unary_code( nb, hBstr );
     437             :                 }
     438           0 :                 nb_bits = add( nb_bits, nb ); // Q0
     439             : 
     440           0 :                 avqBits = shl( qn1, 2 );
     441           0 :                 unpack4bits( avqBits, &param_lpc[j], hBstr );
     442           0 :                 j = add( j, qn1 );
     443           0 :                 nb_bits = add( nb_bits, avqBits ); // Q0
     444             : 
     445           0 :                 avqBits = shl( qn2, 2 );
     446           0 :                 unpack4bits( avqBits, &param_lpc[j], hBstr );
     447           0 :                 j = add( j, qn2 );
     448           0 :                 nb_bits = add( nb_bits, avqBits ); // Q0
     449             :             }
     450             :         }
     451             :         ELSE
     452             :         {
     453           0 :             j = add( j, nb_ind );
     454             :         }
     455             :     }
     456             : 
     457           0 :     return ( nb_bits );
     458             : }
     459             : 
     460      620636 : Word16 encode_lpc_avq_ivas_fx(
     461             :     BSTR_ENC_HANDLE hBstr,    /* i/o: bitstream handle                                  */
     462             :     const Word16 numlpc,      /* i  : Number of sets of lpc                             Q0*/
     463             :     const Word16 *param_lpc,  /* i  : lpc parameters                                    Q0*/
     464             :     const Word16 core,        /* i  : core                                              Q0*/
     465             :     const Word16 element_mode /* i  : element mode - decides between SNS and LPC coding Q0*/
     466             : )
     467             : {
     468             :     Word16 k, j;
     469             :     Word16 q_type, nb_ind;
     470             :     Word16 i, qn1, qn2, nb, avqBits, st1;
     471             :     Word16 nb_bits;
     472             :     Word16 stereo_mode, bits_for_abs_quant;
     473             : 
     474      620636 :     stereo_mode = 0;
     475      620636 :     move16();
     476      620636 :     bits_for_abs_quant = LPC_ABS_QUANT_BITS;
     477      620636 :     move16();
     478      620636 :     if ( EQ_16( element_mode, IVAS_CPE_MDCT ) )
     479             :     {
     480      513762 :         bits_for_abs_quant = SNS_ABS_QUANT_BITS;
     481      513762 :         move16();
     482             :     }
     483             : 
     484      620636 :     move16();
     485      620636 :     move16();
     486      620636 :     move16();
     487      620636 :     st1 = 0;
     488      620636 :     j = 0;
     489      620636 :     nb_bits = 0;
     490             : 
     491     1254725 :     FOR( k = 0; k < numlpc; k++ )
     492             :     {
     493             :         /* Retrieve quantizer type */
     494             : 
     495             : 
     496      634089 :         move16();
     497      634089 :         q_type = 0;
     498      634089 :         IF( k != 0 )
     499             :         {
     500       13453 :             move16();
     501       13453 :             q_type = param_lpc[j]; // Q0
     502       13453 :             j = add( j, 1 );
     503             :         }
     504      634089 :         test();
     505      634089 :         IF( EQ_16( element_mode, IVAS_CPE_MDCT ) && k == 0 )
     506             :         {
     507      513762 :             stereo_mode = param_lpc[j]; // Q0
     508      513762 :             move16();
     509      513762 :             j = add( j, 1 );
     510             :         }
     511             :         /* Determine number of AVQ indices */
     512      634089 :         move16();
     513      634089 :         nb_ind = 0;
     514             : 
     515      634089 :         IF( q_type == 0 )
     516             :         {
     517      625222 :             move16();
     518      625222 :             st1 = param_lpc[j]; // Q0
     519      625222 :             j = add( j, 1 );
     520             :         }
     521      634089 :         move16();
     522      634089 :         move16();
     523      634089 :         qn1 = param_lpc[j]; // Q0
     524      634089 :         j = add( j, 1 );
     525      634089 :         qn2 = param_lpc[j]; // Q0
     526      634089 :         j = add( j, 1 );
     527      634089 :         IF( NE_16( qn1, SNS_LOW_BR_MODE ) )
     528             :         {
     529      633794 :             nb_ind = add( nb_ind, add( qn1, qn2 ) ); // Q0
     530             :         }
     531             : 
     532      634089 :         test();
     533      634089 :         test();
     534      634089 :         IF( k == 0 || ( EQ_16( k, 1 ) && NE_16( core, TCX_20_CORE ) ) )
     535             :         {
     536             :             /* Encode quantizer type */
     537      634089 :             move16();
     538      634089 :             nb = 0;
     539      634089 :             IF( k != 0 )
     540             :             {
     541       13453 :                 nb = 1;
     542       13453 :                 move16();
     543       13453 :                 push_next_indice( hBstr, q_type, nb );
     544             :             }
     545      634089 :             nb_bits = add( nb_bits, nb ); // Q0
     546             : 
     547             :             /* Encode quantizer data */
     548      634089 :             test();
     549      634089 :             test();
     550      634089 :             test();
     551      634089 :             test();
     552      634089 :             IF( ( ( q_type == 0 ) && NE_16( element_mode, IVAS_CPE_MDCT ) ) || ( ( q_type == 0 ) && ( st1 >= 0 ) && EQ_16( element_mode, IVAS_CPE_MDCT ) ) )
     553             :             {
     554             :                 /* Absolute quantizer with 1st stage stochastic codebook */
     555      441167 :                 push_next_indice( hBstr, st1, bits_for_abs_quant );
     556      441167 :                 nb_bits = add( nb_bits, bits_for_abs_quant ); // Q0
     557             :             }
     558             : 
     559      634089 :             test();
     560      634089 :             test();
     561      634089 :             IF( EQ_16( element_mode, IVAS_CPE_MDCT ) && EQ_16( stereo_mode, 3 ) && st1 < 0 )
     562             :             {
     563      184055 :                 push_next_indice( hBstr, add( st1, 2 ), 1 );
     564      184055 :                 nb_bits = add( nb_bits, 1 ); // Q0
     565             :             }
     566             : 
     567      634089 :             test();
     568      634089 :             test();
     569      634089 :             IF( NE_16( element_mode, IVAS_CPE_MDCT ) || ( NE_16( st1, -2 ) && NE_16( qn1, SNS_LOW_BR_MODE ) ) )
     570             :             {
     571             : 
     572             :                 /* 2 bits to specify Q2,Q3,Q4,ext */
     573      613985 :                 nb_bits = add( nb_bits, 4 );
     574      613985 :                 i = sub( qn1, 2 );
     575             : 
     576      613985 :                 if ( s_or( i < 0, (Word16) GT_16( i, 3 ) ) )
     577             :                 {
     578      108753 :                     move16();
     579      108753 :                     i = 3;
     580             :                 }
     581      613985 :                 push_next_indice( hBstr, i, 2 );
     582             : 
     583      613985 :                 i = sub( qn2, 2 );
     584             : 
     585      613985 :                 if ( s_or( i < 0, (Word16) GT_16( i, 3 ) ) )
     586             :                 {
     587      106474 :                     move16();
     588      106474 :                     i = 3;
     589             :                 }
     590      613985 :                 push_next_indice( hBstr, i, 2 );
     591             : 
     592             :                 /* Unary code for abs and rel LPC0/LPC2 */
     593             :                 /* Q5 = 0, Q6=10, Q0=110, Q7=1110, ... */
     594      613985 :                 move16();
     595      613985 :                 nb = qn1;
     596             : 
     597      613985 :                 IF( GT_16( nb, 6 ) )
     598             :                 {
     599       60421 :                     nb = sub( nb, 3 );
     600             :                 }
     601      553564 :                 ELSE IF( GT_16( nb, 4 ) )
     602             :                 {
     603       67826 :                     nb = sub( nb, 4 );
     604             :                 }
     605      485738 :                 ELSE IF( nb == 0 )
     606             :                 {
     607        8159 :                     move16();
     608        8159 :                     nb = 3;
     609             :                 }
     610             :                 ELSE
     611             :                 {
     612      477579 :                     move16();
     613      477579 :                     nb = 0;
     614             :                 }
     615             : 
     616      613985 :                 IF( nb > 0 )
     617             :                 {
     618      136406 :                     unary_code_ivas_fx( nb, hBstr );
     619             :                 }
     620      613985 :                 nb_bits = add( nb_bits, nb );
     621             : 
     622      613985 :                 move16();
     623      613985 :                 nb = qn2;
     624             : 
     625      613985 :                 IF( GT_16( nb, 6 ) )
     626             :                 {
     627       11083 :                     nb = sub( nb, 3 );
     628             :                 }
     629      602902 :                 ELSE IF( GT_16( nb, 4 ) )
     630             :                 {
     631       58990 :                     nb = sub( nb, 4 );
     632             :                 }
     633      543912 :                 ELSE IF( nb == 0 )
     634             :                 {
     635       65039 :                     move16();
     636       65039 :                     nb = 3;
     637             :                 }
     638             :                 ELSE
     639             :                 {
     640      478873 :                     move16();
     641      478873 :                     nb = 0;
     642             :                 }
     643             : 
     644      613985 :                 IF( nb > 0 )
     645             :                 {
     646      135112 :                     unary_code_ivas_fx( nb, hBstr );
     647             :                 }
     648      613985 :                 nb_bits = add( nb_bits, nb );
     649             : 
     650      613985 :                 avqBits = shl( qn1, 2 );
     651      613985 :                 unpack4bits_ivas_fx( avqBits, &param_lpc[j], hBstr );
     652      613985 :                 j = add( j, qn1 );
     653      613985 :                 nb_bits = add( nb_bits, avqBits ); // Q0
     654             : 
     655      613985 :                 avqBits = shl( qn2, 2 );
     656      613985 :                 unpack4bits_ivas_fx( avqBits, &param_lpc[j], hBstr );
     657      613985 :                 j = add( j, qn2 );
     658      613985 :                 nb_bits = add( nb_bits, avqBits ); // Q0
     659             :             }
     660             :         }
     661             :         ELSE
     662             :         {
     663           0 :             j = add( j, nb_ind );
     664             :         }
     665             :     }
     666             : 
     667      620636 :     return ( nb_bits );
     668             : }

Generated by: LCOV version 1.14