LCOV - code coverage report
Current view: top level - lib_dec - dec_acelp_tcx_main.c (source / functions) Hit Total Coverage
Test: Coverage on main @ fec202a8f89be4a2f278a9fc377bfb58b58fab11 Lines: 131 169 77.5 %
Date: 2025-09-14 08:49:17 Functions: 2 2 100.0 %

          Line data    Source code
       1             : /******************************************************************************************************
       2             : 
       3             :    (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB,
       4             :    Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
       5             :    Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
       6             :    Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
       7             :    contributors to this repository. All Rights Reserved.
       8             : 
       9             :    This software is protected by copyright law and by international treaties.
      10             :    The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB,
      11             :    Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
      12             :    Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
      13             :    Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
      14             :    contributors to this repository retain full ownership rights in their respective contributions in
      15             :    the software. This notice grants no license of any kind, including but not limited to patent
      16             :    license, nor is any license granted by implication, estoppel or otherwise.
      17             : 
      18             :    Contributors are required to enter into the IVAS codec Public Collaboration agreement before making
      19             :    contributions.
      20             : 
      21             :    This software is provided "AS IS", without any express or implied warranties. The software is in the
      22             :    development stage. It is intended exclusively for experts who have experience with such software and
      23             :    solely for the purpose of inspection. All implied warranties of non-infringement, merchantability
      24             :    and fitness for a particular purpose are hereby disclaimed and excluded.
      25             : 
      26             :    Any dispute, controversy or claim arising under or in relation to providing this software shall be
      27             :    submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in
      28             :    accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and
      29             :    the United Nations Convention on Contracts on the International Sales of Goods.
      30             : 
      31             : *******************************************************************************************************/
      32             : 
      33             : /*====================================================================================
      34             :     EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0
      35             :   ====================================================================================*/
      36             : 
      37             : #include <assert.h>
      38             : #include "prot.h"
      39             : #include "rom_com.h"
      40             : #include <stdint.h>
      41             : #include "options.h"
      42             : #ifdef DEBUGGING
      43             : #include "debug.h"
      44             : #endif
      45             : #include "stat_dec.h"
      46             : #include "wmc_auto.h"
      47             : 
      48             : /*-------------------------------------------------------------------*
      49             :  * decode_frame_type()
      50             :  *
      51             :  *
      52             :  *--------------------------------------------------------------------*/
      53             : 
      54       52667 : static void decode_frame_type(
      55             :     Decoder_State *st,               /* i/o: decoder state structure    */
      56             :     STEREO_CNG_DEC_HANDLE hStereoCng /* i/o: Stereo CNG data structure  */
      57             : )
      58             : {
      59             :     int16_t frame_size_index, n;
      60             :     int32_t total_brate;
      61             : 
      62       52667 :     frame_size_index = 0;
      63       52667 :     total_brate = st->total_brate;
      64             : 
      65             :     /* Get Frame Type (NULL,SID,ACTIVE) and Frame Mode (2kbps, 4kbps,...) */
      66             : 
      67       52667 :     if ( st->mdct_sw == MODE1 )
      68             :     {
      69        5873 :         st->m_frame_type = ACTIVE_FRAME;
      70             : 
      71       35613 :         for ( n = 0; n < FRAME_SIZE_NB; n++ )
      72             :         {
      73       35613 :             if ( FrameSizeConfig[n].frame_bits == st->total_brate / FRAMES_PER_SEC )
      74             :             {
      75        5873 :                 frame_size_index = n;
      76        5873 :                 break;
      77             :             }
      78             :         }
      79             :     }
      80             :     else
      81             :     {
      82             :         /* ZERO Frame */
      83       46794 :         if ( st->total_brate == FRAME_NO_DATA )
      84             :         {
      85         554 :             st->bwidth = st->last_bwidth;
      86         554 :             st->m_frame_type = ZERO_FRAME;
      87             :         }
      88             : 
      89             :         /* SID frame */
      90       46240 :         else if ( st->total_brate == SID_2k40 )
      91             :         {
      92             :             uint16_t frame_len_indicator;
      93             : 
      94          72 :             st->cng_type = get_next_indice( st, 1 );
      95             : 
      96          72 :             if ( st->cng_type != FD_CNG )
      97             :             {
      98           0 :                 st->BER_detect = 1;
      99           0 :                 st->cng_type = FD_CNG;
     100             :             }
     101          72 :             st->m_frame_type = SID_FRAME;
     102          72 :             frame_size_index = 1;
     103          72 :             st->bwidth = get_next_indice( st, 2 );
     104             : 
     105          72 :             frame_len_indicator = get_next_indice( st, 1 );
     106          72 :             if ( st->bwidth == NB )
     107             :             {
     108          72 :                 if ( frame_len_indicator )
     109             :                 {
     110           0 :                     st->BER_detect = 1;
     111             :                 }
     112          72 :                 frame_len_indicator = 0;
     113             :             }
     114          72 :             if ( frame_len_indicator == 0 )
     115             :             {
     116          72 :                 st->L_frame = L_FRAME;
     117          72 :                 st->total_brate = ACELP_9k60;
     118             :             }
     119             :             else
     120             :             {
     121           0 :                 st->L_frame = L_FRAME16k;
     122           0 :                 if ( st->last_total_brate == ACELP_16k40 || st->last_total_brate == ACELP_24k40 )
     123             :                 {
     124           0 :                     st->total_brate = st->last_total_brate;
     125             :                 }
     126             :                 else
     127             :                 {
     128           0 :                     st->total_brate = 16400;
     129             :                 }
     130             :             }
     131             : 
     132         360 :             for ( n = 0; n < FRAME_SIZE_NB; n++ )
     133             :             {
     134         360 :                 if ( FrameSizeConfig[n].frame_bits == st->total_brate / FRAMES_PER_SEC )
     135             :                 {
     136          72 :                     frame_size_index = n;
     137          72 :                     break;
     138             :                 }
     139             :             }
     140             :         }
     141             :         /* EVS MODES */
     142             :         else
     143             :         {
     144             :             /* Get Frame mode */
     145       46168 :             st->m_frame_type = ACTIVE_FRAME;
     146             : 
     147      382244 :             for ( n = 0; n < FRAME_SIZE_NB; n++ )
     148             :             {
     149      382244 :                 if ( FrameSizeConfig[n].frame_bits == st->total_brate / FRAMES_PER_SEC )
     150             :                 {
     151       46168 :                     frame_size_index = n;
     152       46168 :                     break;
     153             :                 }
     154             :             }
     155             : 
     156       46168 :             if ( st->rf_flag == 0 )
     157             :             {
     158             :                 /* Get bandwidth info */
     159       43168 :                 st->bwidth = get_next_indice( st, FrameSizeConfig[frame_size_index].bandwidth_bits );
     160       43168 :                 st->bwidth += FrameSizeConfig[frame_size_index].bandwidth_min;
     161             :             }
     162             :             else
     163             :             {
     164        3000 :                 st->bwidth += FrameSizeConfig[frame_size_index].bandwidth_min;
     165             :             }
     166             : 
     167       46168 :             if ( st->bwidth > FB )
     168             :             {
     169           0 :                 st->bwidth = FB;
     170           0 :                 st->BER_detect = 1;
     171             :             }
     172             : 
     173       46168 :             if ( st->bwidth > SWB && st->total_brate < ACELP_16k40 )
     174             :             {
     175           0 :                 st->bwidth = SWB;
     176           0 :                 st->BER_detect = 1;
     177             :             }
     178             : 
     179             :             /* Get reserved bit */
     180       46168 :             if ( FrameSizeConfig[frame_size_index].reserved_bits && st->rf_flag == 0 )
     181             :             {
     182       37792 :                 if ( get_next_indice( st, 1 ) != 0 )
     183             :                 {
     184           0 :                     st->BER_detect = 1;
     185             :                 }
     186       37792 :                 assert( FrameSizeConfig[frame_size_index].reserved_bits == 1 );
     187             :             }
     188             :         }
     189             :     }
     190             : 
     191       52667 :     st->rate_switching_init = 0;
     192             : 
     193       52667 :     if ( st->last_codec_mode != MODE2 || !st->BER_detect )
     194             :     {
     195             :         /* Mode  or Rate Change */
     196       52667 :         if ( ( st->m_frame_type == ACTIVE_FRAME || st->m_frame_type == SID_FRAME ) && ( ( st->total_brate != st->last_total_brate ) || ( st->bwidth != st->last_bwidth ) || ( st->last_codec_mode == MODE1 ) || ( st->rf_flag != st->rf_flag_last ) || st->force_lpd_reset ) )
     197             :         {
     198        1264 :             st->rate_switching_init = 1;
     199             : 
     200             :             /* Reconf Core */
     201        1264 :             mode_switch_decoder_LPD( st, st->bwidth, st->total_brate, st->last_total_brate, frame_size_index, 0, st->element_mode );
     202             : 
     203             :             /* Reconf. CLDFB: check if the CLDFB works on the right sample rate */
     204        1264 :             if ( ( st->cldfbAna->no_channels * st->cldfbAna->no_col ) != st->L_frame )
     205             :             {
     206         407 :                 resampleCldfb( st->cldfbAna, ( st->L_frame * FRAMES_PER_SEC ) );
     207         407 :                 if ( st->L_frame <= L_FRAME16k )
     208             :                 {
     209         226 :                     resampleCldfb( st->cldfbBPF, ( st->L_frame * FRAMES_PER_SEC ) );
     210             :                 }
     211             :             }
     212        1264 :             if ( st->bwidth == NB )
     213             :             {
     214         130 :                 int16_t nBand_nb = (int16_t) ( 8000 * st->cldfbSyn->no_channels / st->output_Fs );
     215         130 :                 st->cldfbSyn->bandsToZero = st->cldfbSyn->no_channels - nBand_nb;
     216             :             }
     217             :             else
     218             :             {
     219        1134 :                 st->cldfbSyn->bandsToZero = 0;
     220             :             }
     221             : 
     222             :             /*Reconf Frequency-domain based CNG*/
     223        1264 :             configureFdCngDec( st->hFdCngDec, st->bwidth, st->rf_flag == 1 && st->total_brate == ACELP_13k20 ? ACELP_9k60 : st->total_brate, st->L_frame, st->last_L_frame, st->element_mode );
     224        1264 :             if ( st->last_L_frame != st->L_frame && st->L_frame <= L_FRAME16k && st->last_L_frame <= L_FRAME16k )
     225             :             {
     226         137 :                 lerp( st->hFdCngDec->hFdCngCom->olapBufferSynth2, st->hFdCngDec->hFdCngCom->olapBufferSynth2, st->L_frame * 2, st->last_L_frame * 2 );
     227         137 :                 if ( st->m_frame_type == SID_FRAME && st->hFdCngDec->hFdCngCom->frame_type_previous != ACTIVE_FRAME )
     228             :                 {
     229           0 :                     lerp( st->hFdCngDec->hFdCngCom->olapBufferSynth, st->hFdCngDec->hFdCngCom->olapBufferSynth, st->L_frame * 2, st->last_L_frame * 2 );
     230           0 :                     lerp( hStereoCng->olapBufferSynth22, hStereoCng->olapBufferSynth22, st->L_frame * 2, st->last_L_frame * 2 );
     231             : 
     232           0 :                     if ( st->L_frame == L_FRAME )
     233             :                     {
     234           0 :                         for ( n = 0; n < st->L_frame * 2; n++ )
     235             :                         {
     236           0 :                             st->hFdCngDec->hFdCngCom->olapBufferSynth[n] = st->hFdCngDec->hFdCngCom->olapBufferSynth[n] * 1.25f;
     237             :                         }
     238             :                     }
     239             :                     else
     240             :                     {
     241           0 :                         for ( n = 0; n < st->L_frame * 2; n++ )
     242             :                         {
     243           0 :                             st->hFdCngDec->hFdCngCom->olapBufferSynth[n] = st->hFdCngDec->hFdCngCom->olapBufferSynth[n] / 1.25f;
     244             :                         }
     245             :                     }
     246             :                 }
     247             :             }
     248             : 
     249        1264 :             if ( st->bwidth != st->last_bwidth )
     250             :             {
     251         305 :                 st->hFdCngDec->hFdCngCom->msFrCnt_init_counter = 0;
     252         305 :                 st->hFdCngDec->hFdCngCom->init_old = FLT_MAX;
     253             :             }
     254             : 
     255        1264 :             if ( st->tcxonly )
     256             :             {
     257         269 :                 st->p_bpf_noise_buf = NULL;
     258             :             }
     259             :             else
     260             :             {
     261         995 :                 st->p_bpf_noise_buf = st->bpf_noise_buf;
     262             :             }
     263             :         }
     264             :     }
     265             : 
     266       52667 :     st->total_brate = total_brate;
     267             : 
     268       52667 :     return;
     269             : }
     270             : 
     271             : 
     272             : /*-------------------------------------------------------------------*
     273             :  * dec_acelp_tcx_frame()
     274             :  *
     275             :  * Main decoding function
     276             :  *--------------------------------------------------------------------*/
     277             : 
     278       54320 : void dec_acelp_tcx_frame(
     279             :     Decoder_State *st,               /* i/o: decoder state structure             */
     280             :     int16_t *concealWholeFrame,      /* i/o: concealment flag                    */
     281             :     float *output,                   /* o  : synthesis                           */
     282             :     float *bpf_noise_buf,            /* i/o: BPF noise buffer                    */
     283             :     float *pcmbufFB,                 /* o  : synthesis @output_FS                */
     284             :     float bwe_exc_extended[],        /* i/o: bandwidth extended excitation       */
     285             :     float *voice_factors,            /* o  : voicing factors                     */
     286             :     float pitch_buf[],               /* o  : floating pitch for each subframe    */
     287             :     STEREO_CNG_DEC_HANDLE hStereoCng /* i  : stereo CNG handle                   */
     288             : )
     289             : {
     290             :     int16_t i;
     291             :     int16_t start_bit_pos;
     292             :     int16_t tmp;
     293             :     int16_t bitsRead;
     294             :     int16_t param[DEC_NPRM_DIV * NB_DIV];
     295             :     float old_bwe_exc[( PIT16k_MAX + ( L_FRAME16k + 1 ) + L_SUBFR16k ) * 2]; /* excitation buffer */
     296             :     float *ptr_bwe_exc;                                                      /* pointer to BWE excitation signal in the current frame */
     297             : 
     298       54320 :     push_wmops( "dec_acelp_tcx_frame" );
     299             : 
     300       54320 :     start_bit_pos = st->next_bit_pos;
     301       54320 :     if ( st->rf_flag == 1 )
     302             :     {
     303        3000 :         start_bit_pos -= 2;
     304             :     }
     305             : 
     306             :     /* -------------------------------------------------------------- */
     307             :     /* IDENTIFY FRAME TYPE                                            */
     308             :     /* -------------------------------------------------------------- */
     309             : 
     310       54320 :     st->m_old_frame_type = st->m_frame_type;
     311             : 
     312       54320 :     if ( *concealWholeFrame == 0 )
     313             :     {
     314       52667 :         uint8_t m_frame_type = st->m_frame_type;
     315       52667 :         int16_t bwidth = st->bwidth;
     316       52667 :         int16_t cng_type = st->cng_type;
     317       52667 :         int16_t L_frame = st->L_frame;
     318       52667 :         int32_t total_brate = st->last_total_brate;
     319             : 
     320       52667 :         decode_frame_type( st, hStereoCng );
     321             : 
     322       52667 :         st->force_lpd_reset = 0;
     323             : 
     324       52667 :         if ( ( st->last_codec_mode ) == MODE2 && ( st->BER_detect || ( st->prev_bfi && st->m_frame_type == ZERO_FRAME && st->m_old_frame_type == ACTIVE_FRAME ) ) )
     325             :         {
     326             :             /* Copy back parameters from previous frame, because there is a high risk they are corrupt
     327             :              * Do concealment with configuration used in previous frame                                */
     328           0 :             st->m_frame_type = m_frame_type;
     329           0 :             st->bwidth = bwidth;
     330           0 :             st->cng_type = cng_type;
     331           0 :             st->L_frame = L_frame;
     332           0 :             if ( st->ini_frame != 0 )
     333             :             {
     334           0 :                 st->total_brate = total_brate;
     335             :             }
     336             : 
     337           0 :             *concealWholeFrame = 1;
     338           0 :             st->m_decodeMode = DEC_CONCEALMENT_EXT;
     339           0 :             st->BER_detect = 0;
     340             : 
     341           0 :             if ( ( st->bwidth != st->last_bwidth ) || ( st->rf_flag != st->rf_flag_last ) || ( st->total_brate != st->last_total_brate ) )
     342             :             {
     343           0 :                 st->force_lpd_reset = 1;
     344             :             }
     345             : 
     346           0 :             st->core_brate = st->last_core_brate;
     347           0 :             st->bfi = 1;
     348           0 :             if ( st->ini_frame == 0 && st->hTcxCfg != NULL )
     349             :             {
     350           0 :                 st->hTcxCfg->tcx_coded_lines = getNumTcxCodedLines( SWB );
     351             :             }
     352             :         }
     353             :         else
     354             :         {
     355       52667 :             st->core_brate = st->total_brate;
     356       52667 :             bpf_noise_buf = st->p_bpf_noise_buf;
     357             :         }
     358             :     }
     359             : 
     360       54320 :     if ( *concealWholeFrame != 0 )
     361             :     {
     362             :         /* add two zero bytes for arithmetic coder flush */
     363       28101 :         for ( i = 0; i < 8 * 2; i++ )
     364             :         {
     365       26448 :             st->bit_stream[i] = 0;
     366             :         }
     367             :     }
     368             : 
     369       54320 :     if ( !( st->m_frame_type == SID_FRAME || st->m_frame_type == ZERO_FRAME ) )
     370       53694 :     {
     371             : 
     372             :         /* -------------------------------------------------------------- */
     373             :         /* DECODE CORE                                                    */
     374             :         /* -------------------------------------------------------------- */
     375             :         int32_t nbits_total;
     376       53694 :         nbits_total = st->total_brate / FRAMES_PER_SEC;
     377       53694 :         if ( *concealWholeFrame )
     378             :         {
     379             : 
     380        1653 :             tmp = 0; /*to avoid empty counting */
     381             :         }
     382             : 
     383             : 
     384       53694 :         tmp = (int16_t) ( nbits_total - ( st->next_bit_pos - start_bit_pos ) );
     385             : 
     386       53694 :         bitsRead = 0;
     387             : 
     388             :         /* update old BWE excitation buffer */
     389       53694 :         if ( st->hBWE_TD != NULL )
     390             :         {
     391       53694 :             set_f( old_bwe_exc + PIT16k_MAX * 2, 0.f, ( ( L_FRAME16k + 1 ) + L_SUBFR16k ) * 2 );
     392       53694 :             ptr_bwe_exc = old_bwe_exc + PIT16k_MAX * 2;
     393       53694 :             mvr2r( st->hBWE_TD->old_bwe_exc, old_bwe_exc, PIT16k_MAX * 2 );
     394             :         }
     395             :         else
     396             :         {
     397           0 :             ptr_bwe_exc = NULL;
     398             :         }
     399             : 
     400             :         /* Decode the LPD data */
     401       53694 :         if ( st->m_decodeMode == DEC_NO_FRAM_LOSS )
     402             :         {
     403       52041 :             decoder_LPD( st, output, pcmbufFB, &tmp, bpf_noise_buf, 0, &bitsRead, param, pitch_buf, voice_factors, ptr_bwe_exc );
     404             : 
     405       52041 :             if ( !st->rate_switching_init && ( st->last_codec_mode ) == MODE2 && !( st->use_partial_copy && st->rf_frame_type >= RF_TCXFD && st->rf_frame_type <= RF_TCXTD2 ) && st->bfi )
     406             :             {
     407           0 :                 *concealWholeFrame = 1;
     408           0 :                 st->m_decodeMode = DEC_CONCEALMENT_EXT;
     409           0 :                 st->BER_detect = 0;
     410             :             }
     411             :         }
     412        1653 :         else if ( st->m_decodeMode == DEC_CONCEALMENT_EXT )
     413             :         {
     414        1653 :             decoder_LPD( st, output, pcmbufFB, NULL, bpf_noise_buf, 1, /* bfi - st->bfi can be 0 here - MODE2 stays in PLC when DTX appears after a loss */
     415             :                          &bitsRead, NULL, pitch_buf, voice_factors, ptr_bwe_exc );
     416             :         }
     417             : 
     418       53694 :         if ( st->hBWE_TD != NULL )
     419             :         {
     420       53694 :             if ( ( !st->bfi && ( st->prev_bfi || st->prev_use_partial_copy ) ) || ( ( st->last_vbr_hw_BWE_disable_dec == 1 ) && ( st->vbr_hw_BWE_disable_dec == 0 ) ) )
     421             :             {
     422        1007 :                 st->hBWE_TD->bwe_non_lin_prev_scale = 0.0f;
     423        1007 :                 set_f( st->hBWE_TD->old_bwe_exc_extended, 0.0f, NL_BUFF_OFFSET );
     424             :             }
     425             : 
     426       53694 :             if ( st->core == ACELP_CORE && st->igf && st->con_tcx == 0 )
     427             :             {
     428       15691 :                 non_linearity( ptr_bwe_exc, bwe_exc_extended, st->hBWE_TD->old_bwe_exc_extended, L_FRAME32k, &st->hBWE_TD->bwe_non_lin_prev_scale, st->coder_type, voice_factors, st->L_frame
     429             : #ifdef NONBE_1328_FIX_NON_LINEARITY
     430             :                                ,
     431       15691 :                                st->element_mode
     432             : #endif
     433             :                 );
     434             : 
     435             :                 /* update the old BWE exe memory */
     436       15691 :                 mvr2r( &old_bwe_exc[L_FRAME32k], st->hBWE_TD->old_bwe_exc, PIT16k_MAX * 2 );
     437             :             }
     438             :             else
     439             :             {
     440       38003 :                 set_f( st->hBWE_TD->old_bwe_exc_extended, 0, NL_BUFF_OFFSET );
     441       38003 :                 set_f( st->hBWE_TD->old_bwe_exc, 0, PIT16k_MAX * 2 ); /* reset old non_linear exc during igf frames */
     442       38003 :                 st->hBWE_TD->bwe_non_lin_prev_scale = 0.0f;
     443             :             }
     444             :         }
     445             : 
     446             :         /* for ACELP mode, skip core data to read TD-BWE side info */
     447       53694 :         if ( ( !st->bfi ) && st->core == ACELP_CORE && st->total_brate > 0 )
     448             :         {
     449       18908 :             nbits_total = st->total_brate / FRAMES_PER_SEC;
     450             :             /* target bs-position "-2", because of earlier "start_bit_pos -= 2;", which are included in "st->rf_target_bits"*/
     451             :             /* from "-2" to "-3" as flag-bit not considered in rf_target_bits */
     452       18908 :             if ( st->rf_flag )
     453             :             {
     454        2620 :                 get_next_indice_tmp( st, (int16_t) ( start_bit_pos + nbits_total - st->rf_target_bits - 3 - get_tbe_bits( st->total_brate, st->bwidth, st->rf_flag ) - st->next_bit_pos ) );
     455             :             }
     456             :             else
     457             :             {
     458       16288 :                 get_next_indice_tmp( st, (int16_t) ( start_bit_pos + nbits_total - st->rf_target_bits - get_tbe_bits( st->total_brate, st->bwidth, st->rf_flag ) - st->next_bit_pos ) );
     459             :             }
     460       18908 :             tbe_read_bitstream( st );
     461             :         }
     462             : 
     463       53694 :         if ( *concealWholeFrame )
     464             :         {
     465             :             /*"LPD dec - All BFI"*/
     466             : 
     467        1653 :             tmp = 0; /*to avoid empty counting */
     468             :         }
     469             : 
     470             :         /* updates */
     471       53694 :         st->last_voice_factor = voice_factors[st->nb_subfr - 1];
     472       53694 :         st->last_coder_type = st->coder_type;
     473             :     }
     474             :     else
     475             :     {
     476         626 :         if ( st->m_frame_type == SID_FRAME )
     477             :         {
     478             :             /* Decode the FD-CNG bitstream */
     479          72 :             FdCng_decodeSID( st );
     480             :         }
     481             : 
     482             :         /* updates */
     483         626 :         st->last_voice_factor = 0;
     484         626 :         st->last_coder_type = INACTIVE;
     485             :     }
     486             : 
     487       54320 :     pop_wmops();
     488       54320 :     return;
     489             : }

Generated by: LCOV version 1.14