LCOV - code coverage report
Current view: top level - lib_dec - avq_dec_fx.c (source / functions) Hit Total Coverage
Test: Coverage on main enc/dec/rend @ 3b2f07138c61dcf997bbf4165d0882f794b2995f Lines: 228 236 96.6 %
Date: 2025-05-03 01:55:50 Functions: 3 3 100.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" /* Compilation switches                   */
       8             : #include "cnst.h"    /* Common constants                       */
       9             : #include "rom_com.h" /* Static table prototypes                */
      10             : #include "prot_fx.h" /* Function prototypes                    */
      11             : 
      12             : /*-------------------------------------------------------------------*
      13             :  * Local prototypes
      14             :  *-------------------------------------------------------------------*/
      15             : 
      16             : static void read_cv_fx( Decoder_State *st, UWord16 *I, Word16 *kv, Word16 nq, Word16 *nbits );
      17             : 
      18             : /*-----------------------------------------------------------------*
      19             :  * AVQ_demuxdec()
      20             :  *
      21             :  * Demultiplex and decode subvectors using
      22             :  * split algebraic vector dequantizer based on RE8 latice.
      23             :  *-----------------------------------------------------------------*/
      24             : 
      25       61968 : void AVQ_demuxdec_fx(
      26             :     Decoder_State *st,    /* i/o: decoder state structure                         */
      27             :     Word16 xriq[],        /* o  :   decoded subvectors [0..8*Nsv-1]     Q0*/
      28             :     Word16 *nb_bits,      /* i/o: number of allocated bits                      Q0*/
      29             :     const Word16 Nsv,     /* i  :   number of subvectors                        Q0*/
      30             :     Word16 nq[],          /* i/o: AVQ nq index                                          Q0*/
      31             :     Word16 avq_bit_sFlag, /* i  : flag for AVQ bit saving solution      Q0*/
      32             :     Word16 trgtSvPos      /* i  : target SV for AVQ bit savings         Q0*/
      33             : )
      34             : {
      35             :     Word16 i, j, bits, tmp;
      36             :     UWord16 I[NSV_MAX];
      37             :     Word16 code[8];
      38             :     Word16 *kv;
      39             :     Word16 nq_est, unused_bits_idx;
      40             :     Word16 bitsMod;
      41             :     Word16 underflow;
      42             :     Word16 unusedbitsFlag;
      43             :     Word16 svOrder[NSV_MAX], k, nullVec, dummy_bits;
      44             : 
      45       61968 :     kv = xriq; /* reuse vector to save memory */
      46       61968 :     bits = *nb_bits;
      47       61968 :     move16();
      48       61968 :     bitsMod = 0;
      49       61968 :     move16();
      50       61968 :     underflow = 0;
      51       61968 :     move16();
      52       61968 :     unusedbitsFlag = 0;
      53       61968 :     move16();
      54       61968 :     nullVec = 0;
      55       61968 :     move16();
      56       61968 :     dummy_bits = 0;
      57       61968 :     move16();
      58       61968 :     svOrder[Nsv - 1] = trgtSvPos;
      59       61968 :     move16();
      60       61968 :     svOrder[0] = 0;
      61       61968 :     move16();
      62       61968 :     svOrder[1] = 1;
      63       61968 :     move16();
      64       61968 :     i = 2;
      65       61968 :     move16();
      66       61968 :     j = i;
      67       61968 :     move16();
      68       61968 :     IF( EQ_16( avq_bit_sFlag, 2 ) )
      69             :     {
      70       16724 :         j = i + 1;
      71             :     }
      72             : 
      73      380208 :     WHILE( LT_16( i, sub( Nsv, 1 ) ) )
      74             :     {
      75      318240 :         move16();
      76      318240 :         svOrder[i] = j;
      77      318240 :         i = 1 + i;
      78      318240 :         j = 1 + j;
      79             :     }
      80             : 
      81     2168880 :     FOR( i = 0; i < NSV_MAX; i++ )
      82             :     {
      83     2106912 :         I[i] = (UWord16) -1;
      84     2106912 :         move16();
      85             :     }
      86             : 
      87      528295 :     FOR( i = 0; i < Nsv; i++ )
      88             :     {
      89      503996 :         k = svOrder[i];
      90      503996 :         move16();
      91      503996 :         test();
      92      503996 :         test();
      93      503996 :         test();
      94      503996 :         test();
      95      503996 :         test();
      96      503996 :         IF( EQ_16( avq_bit_sFlag, 2 ) && EQ_16( ( bits % 5 ), 4 ) && GT_16( bits, 8 ) && LT_16( bits, 30 ) && GE_16( k, trgtSvPos ) && LT_16( i, sub( Nsv, 1 ) ) )
      97             :         {
      98        2503 :             ordr_esti( sub( Nsv, i ), &trgtSvPos, &svOrder[i], Nsv );
      99        2503 :             k = svOrder[i];
     100        2503 :             move16();
     101        2503 :             avq_bit_sFlag = 1;
     102        2503 :             move16();
     103             :         }
     104      503996 :         test();
     105      503996 :         IF( EQ_16( k, trgtSvPos ) && avq_bit_sFlag > 0 )
     106             :         {
     107       57170 :             test();
     108       57170 :             test();
     109       57170 :             IF( EQ_16( sub( *nb_bits, bits ), 7 ) || LT_16( bits, BIT_SAVING_LOW_THR ) || GE_16( bits, BIT_SAVING_HIGH_THR ) )
     110             :             {
     111       19501 :                 avq_bit_sFlag = 0;
     112       19501 :                 move16();
     113             :             }
     114             :             ELSE
     115             :             {
     116             :                 BREAK;
     117             :             }
     118             :         }
     119             : 
     120      466327 :         nq[k] = 0;
     121      466327 :         move16(); /* initialization and also forced if the budget is exceeded */
     122             : 
     123      466327 :         IF( GT_16( bits, 8 ) )
     124             :         {
     125             :             /* read the unary code including the stop bit for nq[i] */
     126      443267 :             nq[k] = -1;
     127      443267 :             move16();
     128             :             DO
     129             :             {
     130      927650 :                 nq[k] = add( nq[k], 1 );
     131      927650 :                 move16();
     132             : 
     133             :                 // IF ( 5 * nq[k] + 4 == bits )
     134      927650 :                 IF( EQ_16( add( add( shl( nq[k], 2 ), nq[k] ), 4 ), bits ) )
     135             :                 {
     136        5230 :                     BREAK;
     137             :                 }
     138             :             }
     139      922420 :             WHILE( get_next_indice_1_fx( st ) );
     140             : 
     141      443267 :             if ( EQ_16( add( add( shl( nq[k], 2 ), nq[k] ), 4 ), bits ) ) /* check the overflow */
     142             :             {
     143        5230 :                 bits = add( bits, 1 ); /* overflow stop bit */
     144             :             }
     145             : 
     146             :             /* check for potential bit errors */
     147      443267 :             IF( GT_16( nq[k], NB_SPHERE ) )
     148             :             {
     149           0 :                 st->BER_detect = 1;
     150           0 :                 move16();
     151           0 :                 set16_fx( xriq, 0, shl( Nsv, 3 ) );
     152           0 :                 set16_fx( nq, 0, Nsv );
     153           0 :                 *nb_bits = 0;
     154           0 :                 move16();
     155             : 
     156           0 :                 return;
     157             :             }
     158             : 
     159      443267 :             bits = sub( bits, nq[k] );
     160      443267 :             bits = sub( bits, 1 ); /* count the stop bit */
     161             : 
     162      443267 :             IF( GT_16( nq[k], 0 ) )
     163             :             {
     164      328781 :                 nq[k] = add( nq[k], 1 );
     165      328781 :                 move16();
     166             :             }
     167             : 
     168             :             /* read codebook indices (rank I and event. Voronoi index kv) */
     169      443267 :             read_cv_fx( st, &I[k], &kv[k * 8], nq[k], &bits );
     170             :         }
     171             :     } /* for */
     172             : 
     173             :     /* Bit Saving Solution */
     174       61968 :     IF( ( avq_bit_sFlag > 0 ) && GT_16( bits, 8 ) )
     175             :     {
     176       37669 :         i = svOrder[Nsv - 1];
     177       37669 :         nq[i] = 0;
     178       37669 :         move16();
     179       37669 :         bitsMod = bits % 5;
     180       37669 :         IF( NE_16( i, sub( Nsv, 1 ) ) )
     181             :         {
     182       13032 :             nullVec = 0;
     183       13032 :             move16();
     184       78192 :             FOR( j = i; j < Nsv - 1; j++ )
     185             :             {
     186       65160 :                 if ( nq[svOrder[j]] == 0 )
     187             :                 {
     188        9027 :                     nullVec = add( nullVec, 1 );
     189             :                 }
     190             :             }
     191       13032 :             nq_est = idiv1616( bits, 5 );
     192       13032 :             test();
     193       13032 :             test();
     194       13032 :             test();
     195       13032 :             test();
     196       13032 :             test();
     197       13032 :             test();
     198       13032 :             test();
     199       13032 :             test();
     200       13032 :             test();
     201       13032 :             test();
     202       13032 :             test();
     203       13032 :             test();
     204       13032 :             IF( ( ( bitsMod > 0 ) || ( EQ_16( nullVec, 4 ) && EQ_16( nq_est, 5 ) ) ) && NE_16( bitsMod, 4 ) && GE_16( add( bits, nullVec ), ( add( add( shl( nq_est, 2 ), nq_est ), 4 ) ) ) && ( nq[svOrder[Nsv - 2]] == 0 ) ) /* dummy bits */
     205             :             {
     206          95 :                 dummy_bits = sub( 5, bitsMod );
     207          95 :                 bits = add( bits, dummy_bits ); /* add dummy bits */
     208          95 :                 bitsMod = 0;
     209          95 :                 move16();
     210             :             }
     211       12937 :             ELSE IF( GT_16( nq_est, 4 ) && ( ( ( bitsMod == 0 ) && GT_16( nullVec, 3 ) && LT_16( nullVec, 6 ) ) || ( EQ_16( bitsMod, 4 ) && EQ_16( nullVec, 5 ) ) ) && ( nq[svOrder[Nsv - 2]] == 0 ) ) /* wasted bits 4, 5 for nq 6,7..*/
     212             :             {
     213           4 :                 underflow = 0;
     214           4 :                 move16();
     215           4 :                 IF( NE_16( ( add( bitsMod, nullVec ) % 5 ), 0 ) )
     216             :                 {
     217           4 :                     underflow = 1;
     218           4 :                     move16();
     219             :                 }
     220           4 :                 dummy_bits = add( nullVec, underflow );
     221           4 :                 bits = add( bits, dummy_bits ); /* add dummy bits */
     222           4 :                 bitsMod = 0;
     223           4 :                 move16();
     224             :             }
     225             :         }
     226       37669 :         underflow = 1;
     227       37669 :         move16();
     228       37669 :         IF( NE_16( bitsMod, 4 ) )
     229             :         {
     230       31555 :             underflow = 0;
     231       31555 :             move16();
     232       31555 :             bits = sub( bits, bitsMod );
     233             :         }
     234       37669 :         bits = add( bits, underflow );
     235             : 
     236             :         /* read the unary code for unused bit*/
     237       37669 :         unused_bits_idx = -1;
     238       37669 :         move16();
     239             :         DO
     240             :         {
     241       50517 :             unused_bits_idx = add( unused_bits_idx, 1 );
     242       50517 :             IF( EQ_16( add( add( shl( unused_bits_idx, 2 ), unused_bits_idx ), 4 ), sub( bits, 1 ) ) )
     243             :             {
     244         177 :                 BREAK;
     245             :             }
     246             :         }
     247       50340 :         WHILE( get_next_indice_1_fx( st ) );
     248             : 
     249       37669 :         unusedbitsFlag = 0;
     250       37669 :         move16();
     251             : 
     252       37669 :         IF( ( dummy_bits == 0 ) )
     253             :         {
     254       37570 :             test();
     255       37570 :             test();
     256       37570 :             test();
     257       37570 :             test();
     258       37570 :             IF( ( unused_bits_idx == 0 ) && GT_16( bits, BIT_SAVING_LOW_THR ) )
     259             :             {
     260       17227 :                 unusedbitsFlag = 1;
     261       17227 :                 move16();
     262             :             }
     263       20343 :             ELSE IF( EQ_16( unused_bits_idx, 1 ) && GT_16( bits, BIT_SAVING_LOW_THR ) )
     264             :             {
     265        7365 :                 unusedbitsFlag = -1;
     266        7365 :                 move16();
     267             :             }
     268             :         }
     269             : 
     270             :         /*Compute AVQ code book number from unused Bits */
     271       37669 :         tmp = (Word16) ( sub( bits, add( add( shl( add( unusedbitsFlag, unused_bits_idx ), 2 ), unusedbitsFlag ), unused_bits_idx ) ) );
     272       37669 :         nq_est = idiv1616( tmp, 5 );
     273       37669 :         IF( ( ( tmp % 5 ) != 0 ) )
     274             :         {
     275           0 :             nq_est = add( nq_est, 1 );
     276             :         }
     277       37669 :         if ( EQ_16( nq_est, 1 ) )
     278             :         {
     279         177 :             nq_est = 0;
     280         177 :             move16();
     281             :         }
     282       37669 :         bits = sub( bits, underflow );
     283             : 
     284       37669 :         bits = sub( bits, unused_bits_idx );
     285             : 
     286       37669 :         if ( ( nq_est != 0 ) )
     287             :         {
     288       37492 :             bits = sub( bits, 1 );
     289             :         }
     290             : 
     291       37669 :         nq[i] = nq_est;
     292       37669 :         move16();
     293             :         /* read codebook indices (rank I and event. Voronoi index kv) */
     294       37669 :         read_cv_fx( st, &I[i], &kv[i * 8], nq[i], &bits );
     295             : 
     296       37669 :         bits = sub( bits, dummy_bits );
     297             : 
     298       37669 :         if ( NE_16( bitsMod, 4 ) )
     299             :         {
     300       31555 :             bits = add( bits, bitsMod );
     301             :         }
     302             :     }
     303             : 
     304             :     /* decode all subvectors */
     305      565964 :     FOR( i = 0; i < Nsv; i++ )
     306             :     {
     307             :         /* multi-rate RE8 decoder */
     308      503996 :         re8_dec_fx( nq[i], I[i], &kv[8 * i], code );
     309             : 
     310             :         /* write decoded RE8 vector to decoded subvector #i */
     311     4535964 :         FOR( j = 0; j < 8; j++ )
     312             :         {
     313     4031968 :             xriq[i * 8 + j] = code[j];
     314     4031968 :             move16();
     315             :         }
     316             :     }
     317       61968 :     move16();
     318       61968 :     *nb_bits = bits;
     319             : 
     320       61968 :     return;
     321             : }
     322             : 
     323             : 
     324             : /*-----------------------------------------------------------------*
     325             :  * AVQ_dec_lpc()
     326             :  *
     327             :  * Demultiplex and decode subvectors for LPC dequantization
     328             :  * using split algebraic vector dequantizer
     329             :  *-----------------------------------------------------------------*/
     330             : 
     331      566943 : void AVQ_dec_lpc(
     332             :     Word16 *indx,  /* input:  index[] (4 bits per words)                Q0*/
     333             :     Word16 *nvecq, /* output: vector quantized                                  Q0*/
     334             :     Word16 Nsv     /* input:  number of subvectors (lg=Nsv*8)   Q0*/
     335             : )
     336             : {
     337             :     Word16 i, l, n, nq, nk, pos, ival, c[8], kv[8];
     338             :     Word32 I;
     339             :     UWord16 I16;
     340             : 
     341             :     /* last index word */
     342      566943 :     pos = sub( Nsv, 1 );
     343             : 
     344     1700829 :     FOR( l = 0; l < Nsv; l++ )
     345             :     {
     346     1133886 :         pos = add( pos, indx[l] );
     347             :     }
     348             : 
     349             :     /* decode all subvectors */
     350             : 
     351     1700829 :     FOR( l = Nsv - 1; l >= 0; l-- )
     352             :     {
     353     1133886 :         nq = indx[l]; /* quantizer number (0,2,3..n) */
     354     1133886 :         move16();
     355             : 
     356     1133886 :         nk = 0;
     357     1133886 :         move16();
     358     1133886 :         n = nq;
     359     1133886 :         move16();
     360             : 
     361     1133886 :         IF( GT_16( nq, 4 ) )
     362             :         {
     363       75369 :             nk = shr( sub( nq, 3 ), 1 );
     364       75369 :             n = sub( nq, shl( nk, 1 ) );
     365             :         }
     366             : 
     367             :         /* read n groups of 4-bit for Voronoi index (k[]) */
     368             : 
     369    10204974 :         FOR( i = 0; i < 8; i++ )
     370             :         {
     371     9071088 :             kv[i] = 0;
     372     9071088 :             move16();
     373             :         }
     374             : 
     375     1210319 :         FOR( ; nk > 0; nk-- )
     376             :         {
     377       76433 :             ival = s_and( indx[pos--], 0x0F );
     378       76433 :             ival = shl( ival, 4 );
     379       76433 :             ival = add( ival, s_and( indx[pos--], 0x0F ) );
     380             : 
     381      687897 :             FOR( i = 7; i >= 0; i-- )
     382             :             {
     383      611464 :                 kv[i] = add( shl( kv[i], 1 ), s_and( ival, 0x01 ) );
     384      611464 :                 move16();
     385      611464 :                 ival = shr( ival, 1 );
     386             :             }
     387             :         }
     388             : 
     389             :         /* read n groups of 4-bit for base codebook index (I) */
     390     1133886 :         I = L_deposit_l( 0 );
     391     4152908 :         FOR( ; n > 0; n-- )
     392             :         {
     393     3019022 :             I = L_shl( I, 4 );
     394     3019022 :             I = L_add( I, (Word32) s_and( indx[pos--], 0x0F ) );
     395             :         }
     396             : 
     397             :         /* multi-rate RE8 decoder */
     398     1133886 :         I16 = (UWord16) extract_l( I );
     399     1133886 :         cast16();
     400     1133886 :         re8_dec_fx( nq, I16, kv, c );
     401             : 
     402             :         /* write decoded RE8 vector */
     403    10204974 :         FOR( i = 0; i < 8; i++ )
     404             :         {
     405     9071088 :             nvecq[( l * 8 ) + i] = c[i];
     406     9071088 :             move16();
     407             :         }
     408             :     }
     409             : 
     410      566943 :     return;
     411             : }
     412             : 
     413             : /*-----------------------------------------------------------------*
     414             :  * read_cv_fx()
     415             :  *
     416             :  * read codebook indices (rank I and event. Voronoi index kv)
     417             :  *-----------------------------------------------------------------*/
     418             : 
     419      480936 : static void read_cv_fx(
     420             :     Decoder_State *st, /* i/o: decoder state structure    */
     421             :     UWord16 *I,        /* o  : rank I code book index   Q0*/
     422             :     Word16 *kv,        /* o  : Voronoi index kv         Q0*/
     423             :     Word16 nq,         /* i  : AVQ nq index             Q0*/
     424             :     Word16 *nbits      /* i/o: bits available           Q0*/
     425             : )
     426             : 
     427             : {
     428             :     Word16 j, bits, order_v;
     429             : 
     430      480936 :     bits = *nbits;
     431      480936 :     move16();
     432             :     /* read codebook indices (rank I and event. Voronoi index kv) */
     433      480936 :     IF( ( nq == 0 ) ) /* Q0 */
     434             :     {
     435             :         /* nothing to read */
     436             :     }
     437      366273 :     ELSE IF( LT_16( nq, 5 ) ) /* Q2, Q3, Q4 */
     438             :     {
     439      361979 :         *I = get_next_indice_fx( st, shl( nq, 2 ) );
     440      361979 :         move32();
     441      361979 :         bits = sub( bits, shl( nq, 2 ) );
     442             :     }
     443        4294 :     ELSE IF( ( s_and( nq, 1 ) == 0 ) ) /* Q4 + Voronoi extensions r=1,2,3,... */
     444             :     {
     445        1513 :         *I = get_next_indice_fx( st, 16 );
     446        1513 :         move32();
     447        1513 :         bits = sub( bits, 16 );
     448        1513 :         order_v = (Word16) sub( shr( nq, 1 ), 2 );
     449        1513 :         move32();
     450             : 
     451       13617 :         FOR( j = 0; j < 8; j++ )
     452             :         {
     453       12104 :             kv[j] = get_next_indice_fx( st, order_v );
     454       12104 :             move16();
     455             :         }
     456        1513 :         bits = sub( bits, ( shl( order_v, 3 ) ) );
     457             :     }
     458             :     ELSE /* Q3 + Voronoi extensions r=1,2,3,... */
     459             :     {
     460        2781 :         *I = get_next_indice_fx( st, 12 );
     461        2781 :         move32();
     462        2781 :         bits = sub( bits, 12 );
     463        2781 :         order_v = (Word16) sub( shr( nq, 1 ), 1 );
     464             : 
     465       25029 :         FOR( j = 0; j < 8; j++ )
     466             :         {
     467       22248 :             kv[j] = get_next_indice_fx( st, order_v );
     468       22248 :             move32();
     469             :         }
     470        2781 :         bits = sub( bits, shl( order_v, 3 ) );
     471             :     }
     472      480936 :     *nbits = bits;
     473      480936 :     move16();
     474             : 
     475      480936 :     return;
     476             : }

Generated by: LCOV version 1.14