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

          Line data    Source code
       1             : /*====================================================================================
       2             :     EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0
       3             :   ====================================================================================*/
       4             : 
       5             : #include <stdint.h>
       6             : #include <string.h>
       7             : #include "options.h"
       8             : #include "cnst.h"
       9             : #include "prot_fx.h"
      10             : #include "basop_util.h"
      11             : #include "rom_com.h"
      12             : 
      13             : #ifndef swap
      14             : #define swap( x, y, type ) \
      15             :     {                      \
      16             :         type u__p;         \
      17             :         u__p = x;          \
      18             :         x = y;             \
      19             :         y = u__p;          \
      20             :     }
      21             : #endif
      22             : /*---------------------------------------------------------------------*
      23             :  * lsf_msvq_ma_decprm()
      24             :  *
      25             :  *
      26             :  *---------------------------------------------------------------------*/
      27             : 
      28       98189 : Word16 lsf_msvq_ma_decprm(
      29             :     Decoder_State *st,
      30             :     Word16 *param_lpc /* Q0 */
      31             : )
      32             : {
      33             :     Word16 i, nbits_lpc, tmp;
      34             :     Word16 bits_midlpc;
      35             :     Word16 bits0[MAX_VQ_STAGES], bits1[MAX_VQ_STAGES], stages0, stages1, stages,
      36             :         levels0[MAX_VQ_STAGES], levels1[MAX_VQ_STAGES], *bits;
      37             :     Word16 predmode, mode_lvq, mode_lvq_p, safety_net;
      38             : 
      39       98189 :     bits_midlpc = 5; /* Q0 */
      40       98189 :     move16();
      41             : 
      42       98189 :     test();
      43       98189 :     IF( ( EQ_32( st->sr_core, INT_FS_16k ) ) && ( EQ_16( st->coder_type, UNVOICED ) ) )
      44             :     {
      45        3627 :         find_pred_mode( &predmode, GENERIC, sub( 1, st->narrowBand ) /*st->bwidth*/, st->sr_core,
      46             :                         &mode_lvq, &mode_lvq_p, st->total_brate );
      47             :     }
      48             :     ELSE
      49             :     {
      50       94562 :         IF( EQ_16( st->core, TCX_20_CORE ) )
      51             :         {
      52       94246 :             find_pred_mode( &predmode, AUDIO, sub( 1, st->narrowBand ) /*st->bwidth*/, st->sr_core, &mode_lvq, &mode_lvq_p, st->total_brate );
      53             :         }
      54             :         ELSE
      55             :         {
      56         316 :             find_pred_mode( &predmode, st->coder_type, sub( 1, st->narrowBand ) /*st->bwidth*/, st->sr_core, &mode_lvq, &mode_lvq_p, st->total_brate );
      57             :         }
      58             :     }
      59       98189 :     lsf_allocate_fx( sub( ENDLSF_NBITS, shr( predmode, 1 ) ), mode_lvq, mode_lvq_p, &stages0, &stages1, levels0, levels1, bits0, bits1 );
      60             : 
      61             : 
      62       98189 :     nbits_lpc = 0;
      63       98189 :     move16();
      64             : 
      65       98189 :     IF( EQ_16( predmode, 2 ) )
      66             :     {
      67             :         /* there is choice between SN and AR prediction */
      68       31865 :         safety_net = get_next_indice_fx( st, 1 ); /* Q0 */
      69             : 
      70       31865 :         IF( EQ_16( safety_net, 1 ) )
      71             :         {
      72       10786 :             stages = stages0; /* Q0 */
      73       10786 :             move16();
      74       10786 :             bits = bits0; /* Q0 */
      75       10786 :             move16();
      76             :         }
      77             :         ELSE
      78             :         {
      79       21079 :             stages = stages1; /* Q0 */
      80       21079 :             move16();
      81       21079 :             bits = bits1; /* Q0 */
      82       21079 :             move16();
      83             :         }
      84       31865 :         *param_lpc = safety_net; /* Q0 */
      85       31865 :         move16();
      86       31865 :         param_lpc++;
      87       31865 :         nbits_lpc = add( nbits_lpc, 1 );
      88             :     }
      89             :     ELSE
      90             :     {
      91       66324 :         stages = stages1; /* Q0 */
      92       66324 :         move16();
      93       66324 :         bits = bits1; /* Q0 */
      94       66324 :         move16();
      95             :     }
      96             : 
      97             : 
      98       98189 :     tmp = sub( stages, 1 ); /* Q0 */
      99      175299 :     FOR( i = 0; i < tmp; i++ )
     100             :     {
     101       77110 :         *param_lpc = get_next_indice_fx( st, bits[i] ); /* Q0 */
     102       77110 :         move16();
     103       77110 :         param_lpc++;
     104       77110 :         nbits_lpc = add( nbits_lpc, bits[i] ); /* Q0 */
     105             :     }
     106       98189 :     *param_lpc = get_next_indice_fx( st, LEN_INDICE ); /* Q0 */
     107       98189 :     move16();
     108       98189 :     param_lpc++;
     109       98189 :     nbits_lpc = add( nbits_lpc, LEN_INDICE ); /* Q0 */
     110             : 
     111             : 
     112       98189 :     *param_lpc = get_next_indice_fx( st, sub( bits[i], LEN_INDICE ) ); /* Q0 */
     113       98189 :     move16();
     114       98189 :     param_lpc++;
     115       98189 :     nbits_lpc = add( nbits_lpc, sub( bits[i], LEN_INDICE ) ); /* Q0 */
     116             : 
     117             : 
     118       98189 :     test();
     119       98189 :     test();
     120       98189 :     IF( NE_16( st->coder_type, VOICED ) && st->core == 0 && st->acelp_cfg.midLpc )
     121             :     {
     122             : 
     123         342 :         *param_lpc = get_next_indice_fx( st, bits_midlpc ); /* Q0 */
     124         342 :         move16();
     125         342 :         nbits_lpc = add( nbits_lpc, bits_midlpc ); /* Q0 */
     126             :     }
     127             : 
     128       98189 :     return nbits_lpc;
     129             : }
     130             : 
     131             : 
     132         268 : Word16 lsf_bctcvq_decprm(
     133             :     Decoder_State *st,
     134             :     Word16 *param_lpc /* Q0 */
     135             : )
     136             : {
     137             :     Word16 i, nbits_lpc;
     138             :     Word16 num_par;
     139             :     const Word16 *bits1;
     140             : 
     141         268 :     num_par = 10; /* Q0 */
     142         268 :     move16();
     143         268 :     bits1 = BC_TCVQ_BIT_ALLOC_40B; /* Q0 */
     144             : 
     145         268 :     nbits_lpc = 0;
     146         268 :     move16();
     147             : 
     148             : 
     149        2948 :     FOR( i = 0; i < num_par; i++ )
     150             :     {
     151        2680 :         *param_lpc = get_next_indice_fx( st, bits1[i] ); /* Q0 */
     152        2680 :         move16();
     153        2680 :         param_lpc++;
     154        2680 :         nbits_lpc = add( nbits_lpc, bits1[i] ); /* Q0 */
     155             :     }
     156             : 
     157         268 :     return nbits_lpc;
     158             : }
     159             : 
     160             : /* Returns: number of indices */
     161       13989 : Word16 D_lsf_tcxlpc(
     162             :     const Word16 indices[], /* i  : VQ indices                  Q0*/
     163             :     Word16 lsf_q[],         /* o  : quantized LSF               Q1*/
     164             :     Word16 lsp_q_ind[],     /* o  :quantized LSP (w/o MA prediction)    Q1*/
     165             :     Word16 narrowband,      /* i  : narrowband flag             Q0*/
     166             :     Word16 cdk,             /* i  : codebook selector   Q0*/
     167             :     Word16 mem_MA[]         /* i  : MA memory                   Q1*/
     168             : )
     169             : {
     170             :     Word16 i;
     171             :     Word16 NumIndices;
     172             :     Word16 lsf_q_ind[M16k];
     173             :     Word16 pred[M16k];
     174             :     const Word16 *means;
     175             :     Word16 lsf_rem_q_ind[M];
     176             : 
     177       13989 :     NumIndices = 1; /* Q0 */
     178       13989 :     move16();
     179             : 
     180       13989 :     msvq_dec(
     181       13989 :         lsf_codebook[narrowband][cdk],
     182             :         lsf_dims,
     183             :         lsf_offs,
     184             :         TCXLPC_NUMSTAGES,
     185             :         M,
     186             :         M,
     187       13989 :         indices + NumIndices,
     188             : #ifdef IVAS_MSVQ
     189             :         0, NULL,
     190             : #endif
     191             :         lsf_q );
     192             : 
     193       13989 :     NumIndices = add( NumIndices, TCXLPC_NUMSTAGES ); /* Q0 */
     194             : 
     195      237813 :     FOR( i = 0; i < M; ++i )
     196             :     {
     197      223824 :         lsf_q_ind[i] = lsf_q[i];
     198      223824 :         move16();
     199             :     }
     200             : 
     201       13989 :     IF( indices[0] ) /* Only add contribution if flag is enabled */
     202             :     {
     203        4359 :         msvq_dec(
     204        4359 :             lsf_ind_codebook[narrowband][cdk],
     205             :             lsf_ind_dims,
     206             :             lsf_ind_offs,
     207             :             TCXLPC_IND_NUMSTAGES,
     208             :             M,
     209             :             M,
     210        4359 :             indices + NumIndices,
     211             : #ifdef IVAS_MSVQ
     212             :             0, NULL,
     213             : #endif
     214             :             lsf_rem_q_ind );
     215        4359 :         NumIndices = add( NumIndices, TCXLPC_IND_NUMSTAGES ); /* Q0 */
     216             : 
     217             :         /* Add to MA-removed vector */
     218       74103 :         FOR( i = 0; i < M; ++i )
     219             :         {
     220       69744 :             lsf_q_ind[i] = add( lsf_q_ind[i], lsf_rem_q_ind[i] ); /* Q1 */
     221       69744 :             move16();
     222             :         }
     223             :     }
     224             : 
     225             :     /* Inter-frame prediction */
     226       13989 :     move16();
     227       13989 :     means = lsf_means[narrowband]; /* Q1 */
     228             : 
     229      237813 :     FOR( i = 0; i < M; ++i )
     230             :     {
     231      223824 :         pred[i] = add( means[i], mult_r( MU_MA_FX, mem_MA[i] ) ); /* Q1 */
     232      223824 :         move16();
     233             :     }
     234             : 
     235             :     /* Add prediction */
     236      237813 :     FOR( i = 0; i < M; ++i )
     237             :     {
     238      223824 :         lsf_q[i] = add( lsf_q[i], pred[i] ); /* Q1 */
     239      223824 :         move16();
     240      223824 :         lsf_q_ind[i] = add( lsf_q_ind[i], means[i] ); /* Q1 */
     241      223824 :         move16();
     242             :     }
     243             : 
     244       13989 :     reorder_lsf_fx( lsf_q, TCXLPC_LSF_GAP, M, INT_FS_FX );
     245             : 
     246       13989 :     reorder_lsf_fx( lsf_q_ind, TCXLPC_LSF_GAP, M, INT_FS_FX );
     247       13989 :     IF( lsp_q_ind )
     248             :     {
     249       13989 :         E_LPC_lsf_lsp_conversion /*lsf2lsp*/ ( lsf_q_ind, lsp_q_ind, M );
     250             :     }
     251             : 
     252       13989 :     return NumIndices;
     253             : }
     254             : 
     255             : /* Returns: number of bits read */
     256       13989 : Word16 dec_lsf_tcxlpc(
     257             :     Decoder_State *st, /* i/o: Decoder state         */
     258             :     Word16 **indices,  /* o  : Ptr to VQ indices   Q0*/
     259             :     Word16 narrowband, /* i  : narrowband flag     Q0*/
     260             :     Word16 cdk         /* i  : codebook selector   Q0*/
     261             : )
     262             : {
     263             :     Word16 i, start_bit_pos;
     264             :     Word16 lsf_q_ind[M];
     265             :     Word16 *flag;
     266             : 
     267       13989 :     flag = *indices; /* Save pointer    Q0*/
     268       13989 :     *flag = 0;
     269       13989 :     move16(); /* Set flag to disabled */
     270       13989 :     ++*indices;
     271             : 
     272       13989 :     start_bit_pos = st->next_bit_pos; /* Q0 */
     273       13989 :     move16();
     274       55956 :     FOR( i = 0; i < TCXLPC_NUMSTAGES; ++i )
     275             :     {
     276       41967 :         **indices = get_next_indice_fx( st, lsf_numbits[i] ); /* Q0 */
     277       41967 :         ++*indices;
     278       41967 :         move16();
     279             :     }
     280             : 
     281             :     /* Decode independent lsf */
     282       13989 :     msvq_dec(
     283       13989 :         lsf_codebook[narrowband][cdk],
     284             :         lsf_dims,
     285             :         lsf_offs,
     286             :         TCXLPC_NUMSTAGES,
     287             :         M,
     288             :         M,
     289       13989 :         flag + 1,
     290             : #ifdef IVAS_MSVQ
     291             :         0, NULL,
     292             : #endif
     293             :         lsf_q_ind );
     294             : 
     295             :     /* Update flag */
     296       13989 :     *flag = lsf_ind_is_active( lsf_q_ind, lsf_means[narrowband], narrowband, cdk ); /* Q0 */
     297       13989 :     move16();
     298       13989 :     IF( *flag )
     299             :     {
     300        8718 :         FOR( i = 0; i < TCXLPC_IND_NUMSTAGES; ++i )
     301             :         {
     302        4359 :             **indices = get_next_indice_fx( st, lsf_ind_numbits[i] ); /* Q0 */
     303        4359 :             ++*indices;
     304        4359 :             move16();
     305             :         }
     306             :     }
     307       13989 :     return sub( st->next_bit_pos, start_bit_pos );
     308             : }

Generated by: LCOV version 1.14