LCOV - code coverage report
Current view: top level - lib_dec - hq_hr_dec_fx.c (source / functions) Hit Total Coverage
Test: Coverage on main enc/dec/rend @ 3b2f07138c61dcf997bbf4165d0882f794b2995f Lines: 244 273 89.4 %
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             : #include <stdint.h>
       5             : #include "options.h" /* Compilation switches                   */
       6             : #include "prot_fx.h" /* Function prototypes                   */
       7             : #include "rom_com.h" /* Static table prototypes                */
       8             : #include "ivas_prot_fx.h"
       9             : 
      10             : /*--------------------------------------------------------------------------*
      11             :  * hq_pred_hb_bws()
      12             :  *
      13             :  * HQ core HB band-width switching handling
      14             :  *--------------------------------------------------------------------------*/
      15             : 
      16        7331 : void ivas_hq_pred_hb_bws_fx(
      17             :     Decoder_State *st_fx,    /* i/o: decoder state structure                 */
      18             :     const Word16 *ynrm,      /* i  : norm quantization index vector          Q0*/
      19             :     const Word16 length,     /* i  : frame length                            Q0*/
      20             :     const Word16 hqswb_clas, /* i  : HQ SWB class                            Q0*/
      21             :     const Word16 *SWB_fenv   /* i  : SWB frequency envelopes                             Q1*/
      22             : )
      23             : {
      24             :     Word16 i;
      25             :     Word32 L_tmp;
      26             : 
      27        7331 :     IF( GE_16( length, L_FRAME32k ) )
      28             :     {
      29             :         /* calculate the switching parameters */
      30        6702 :         test();
      31        6702 :         test();
      32        6702 :         IF( ( NE_16( hqswb_clas, HQ_GEN_SWB ) && LE_32( st_fx->core_brate, HQ_32k ) ) || GT_32( st_fx->core_brate, HQ_32k ) )
      33             :         {
      34        6029 :             st_fx->prev_ener_shb_fx = 0;
      35        6029 :             move16();
      36        6029 :             L_tmp = L_deposit_l( 0 );
      37       42203 :             FOR( i = 25; i < SFM_N_HARM; i++ )
      38             :             {
      39       36174 :                 L_tmp = L_add( L_tmp, dicn_fx[ynrm[i]] ); /*Q14*/
      40             :             }
      41        6029 :             L_tmp = L_min( 8191, L_shr( L_tmp, 13 ) );                       /* Q1 */
      42        6029 :             st_fx->prev_ener_shb_fx = extract_l( L_tmp );                    /*Q1*/
      43        6029 :             st_fx->prev_ener_shb_fx = mult( st_fx->prev_ener_shb_fx, 5461 ); /*Q1*/
      44        6029 :             move16();
      45        6029 :             move16();
      46             :         }
      47             :         ELSE
      48             :         {
      49         673 :             st_fx->prev_ener_shb_fx = 0;
      50         673 :             move16();
      51         673 :             L_tmp = L_deposit_l( 0 );
      52        8076 :             FOR( i = 0; i < SWB_FENV - 3; i++ )
      53             :             {
      54        7403 :                 L_tmp = L_add( L_tmp, SWB_fenv[i] ); /*Q1*/
      55             :             }
      56         673 :             L_tmp = Mpy_32_16_1( L_tmp, 2979 );           // Q1
      57         673 :             st_fx->prev_ener_shb_fx = extract_l( L_tmp ); /*Q1*/
      58             :         }
      59             :     }
      60             : 
      61        7331 :     IF( GE_16( st_fx->last_inner_frame, L_FRAME32k ) && st_fx->hBWE_FD != NULL )
      62             :     {
      63        6703 :         set16_fx( st_fx->hBWE_FD->prev_SWB_fenv_fx, st_fx->prev_ener_shb_fx, SWB_FENV );
      64             :     }
      65             : 
      66        7331 :     return;
      67             : }
      68             : 
      69         397 : void hq_pred_hb_bws_fx(
      70             :     Decoder_State *st_fx,    /* i/o: decoder state structure                   */
      71             :     const Word16 *ynrm,      /* i  : norm quantization index vector          Q0*/
      72             :     const Word16 length,     /* i  : frame length                            Q0*/
      73             :     const Word16 hqswb_clas, /* i  : HQ SWB class                            Q0*/
      74             :     const Word16 *SWB_fenv   /* i  : SWB frequency envelopes                             Q1*/
      75             : )
      76             : {
      77             :     Word16 i;
      78             :     Word32 L_tmp;
      79             : 
      80         397 :     IF( GE_16( length, L_FRAME32k ) )
      81             :     {
      82             :         /* calculate the switching parameters */
      83         397 :         test();
      84         397 :         test();
      85         397 :         IF( ( NE_16( hqswb_clas, HQ_GEN_SWB ) && LE_32( st_fx->core_brate, HQ_32k ) ) || GT_32( st_fx->core_brate, HQ_32k ) )
      86             :         {
      87         351 :             st_fx->prev_ener_shb_fx = 0;
      88         351 :             move16();
      89         351 :             L_tmp = L_deposit_l( 0 );
      90        2457 :             FOR( i = 25; i < SFM_N_HARM; i++ )
      91             :             {
      92        2106 :                 L_tmp = L_add_sat( L_tmp, dicn_fx[ynrm[i]] ); /*Q14*/
      93             :             }
      94         351 :             L_tmp = L_min( 8191, L_shr( L_tmp, 13 ) );                       /* Q1 */
      95         351 :             st_fx->prev_ener_shb_fx = extract_l( L_tmp );                    /*Q1*/
      96         351 :             st_fx->prev_ener_shb_fx = mult( st_fx->prev_ener_shb_fx, 5461 ); /*Q1*/
      97         351 :             move16();
      98         351 :             move16();
      99             :         }
     100             :         ELSE
     101             :         {
     102          46 :             st_fx->prev_ener_shb_fx = 0;
     103          46 :             move16();
     104          46 :             L_tmp = L_deposit_l( 0 );
     105         552 :             FOR( i = 0; i < SWB_FENV - 3; i++ )
     106             :             {
     107         506 :                 L_tmp = L_add( L_tmp, SWB_fenv[i] ); /*Q1*/
     108             :             }
     109          46 :             L_tmp = Mpy_32_16_1( L_tmp, 2979 );           // Q1
     110          46 :             st_fx->prev_ener_shb_fx = extract_l( L_tmp ); /*Q1*/
     111          46 :             move16();
     112             :         }
     113             :     }
     114             : 
     115         397 :     IF( GE_16( st_fx->last_inner_frame, L_FRAME32k ) )
     116             :     {
     117         396 :         set16_fx( st_fx->hBWE_FD->prev_SWB_fenv_fx, st_fx->prev_ener_shb_fx, SWB_FENV );
     118             :     }
     119             : 
     120         397 :     return;
     121             : }
     122             : /*--------------------------------------------------------------------------*
     123             :  * hq_hr_dec_fx()
     124             :  *
     125             :  * HQ High rate decoding routine
     126             :  *--------------------------------------------------------------------------*/
     127        7331 : void ivas_hq_hr_dec_fx(
     128             :     Decoder_State *st_fx,            /* i/o: decoder state structure fx                     */
     129             :     Word32 *t_audio_q,               /* o  : transform-domain coefficients              Q12 */
     130             :     const Word16 length,             /* i  : frame length                               Q0  */
     131             :     Word16 num_bits,                 /* i  : number of available bits                   Q0  */
     132             :     Word16 *ynrm,                    /* o  : norm quantization index vector             Q0  */
     133             :     Word16 *is_transient,            /* o  : transient flag                             Q0  */
     134             :     Word16 *hqswb_clas,              /* o  : HQ SWB class                               Q0  */
     135             :     Word16 *SWB_fenv,                /* o  : SWB frequency envelopes                    Q1  */
     136             :     const Word16 core_switching_flag /* i : Core switching flag                                                 Q0      */
     137             : )
     138             : {
     139             :     Word16 nb_sfm;
     140             :     Word16 sum, hcode_l;
     141             :     Word16 sfmsize[NB_SFM], sfm_start[NB_SFM], sfm_end[NB_SFM];
     142             :     Word16 num_sfm, numnrmibits;
     143             :     Word16 nf_idx;
     144             :     Word16 normqlg2[NB_SFM], R[NB_SFM];
     145             :     Word16 pulses[NB_SFM], maxpulse[NB_SFM];
     146             :     Word16 env_stab;         /*Q15*/
     147             :     Word16 Rsubband[NB_SFM]; /*Q3*/
     148        7331 :     Word16 start_norm, Npeaks = 0;
     149             :     Word16 noise_level[HVQ_BWE_NOISE_BANDS]; /*Q15*/
     150             :     Word16 peak_idx[HVQ_MAX_PEAKS];
     151             :     Word16 hq_generic_offset;
     152             :     Word16 num_env_bands;
     153        7331 :     Word16 hq_generic_exc_clas = 0;
     154             :     Word16 core_sfm;
     155             :     Word16 har_freq_est1, har_freq_est2;
     156             :     Word16 flag_dis;
     157             :     const Word16 *subband_search_offset;
     158             :     Word16 wBands[2];
     159             :     Word16 bits, i;
     160             :     Word16 t_audio_q_norm[L_FRAME48k_EXT];
     161             :     Word16 Q_audio;
     162             :     Word16 b_delta_env;
     163             :     Word16 tmp, n_band;
     164             :     Word16 Q_shift;
     165             :     Word16 bits_left;
     166             :     Word16 csw_flag1, csw_flag2;
     167             : 
     168        7331 :     HQ_DEC_HANDLE hHQ_core = st_fx->hHQ_core;
     169             : 
     170        7331 :     move16();
     171        7331 :     move16();
     172             : 
     173        7331 :     Q_audio = 0; /* to avoid compilation warnings */
     174        7331 :     move16();
     175             : 
     176             :     /*------------------------------------------------------------------*
     177             :      * Initializations
     178             :      *------------------------------------------------------------------*/
     179             : 
     180        7331 :     set16_fx( pulses, 0, NB_SFM );
     181        7331 :     set16_fx( maxpulse, 0, NB_SFM );
     182        7331 :     flag_dis = 1;
     183        7331 :     move16();
     184        7331 :     har_freq_est1 = 0;
     185        7331 :     move16();
     186        7331 :     har_freq_est2 = 0;
     187        7331 :     move16();
     188        7331 :     set16_fx( peak_idx, 0, HVQ_MAX_PEAKS );
     189             : 
     190             :     /*------------------------------------------------------------------*
     191             :      * Decode classification
     192             :      *------------------------------------------------------------------*/
     193             : 
     194        7331 :     bits = ivas_hq_classifier_dec_fx( st_fx, st_fx->core_brate, length, is_transient, hqswb_clas ); /* Q0 */
     195        7331 :     bits_left = sub( num_bits, bits );                                                              /* Q0 */
     196             : 
     197             :     /*------------------------------------------------------------------*
     198             :      * set quantization parameters
     199             :      *------------------------------------------------------------------*/
     200        7331 :     ivas_hq_configure_fx( length, *hqswb_clas, st_fx->core_brate, &num_sfm, &nb_sfm, &start_norm,
     201             :                           &num_env_bands, &numnrmibits, &hq_generic_offset, sfmsize, sfm_start, sfm_end );
     202             : 
     203             :     /*------------------------------------------------------------------*
     204             :      * Unpacking bitstream
     205             :      *------------------------------------------------------------------*/
     206             : 
     207        7331 :     nf_idx = 0;
     208        7331 :     move16();
     209        7331 :     test();
     210        7331 :     test();
     211        7331 :     test();
     212        7331 :     IF( !*is_transient && NE_16( *hqswb_clas, HQ_HVQ ) && !( EQ_16( length, L_FRAME16k ) && LE_32( st_fx->core_brate, HQ_32k ) ) )
     213             :     {
     214        5160 :         nf_idx = get_next_indice_fx( st_fx, 2 ); /* Q0 */
     215             :     }
     216             : 
     217             :     /*------------------------------------------------------------------*
     218             :      * Decode envelope
     219             :      *------------------------------------------------------------------*/
     220             : 
     221        7331 :     hcode_l = decode_envelope_indices_fx( st_fx, start_norm, num_env_bands, numnrmibits, ynrm, NORMAL_HQ_CORE, *is_transient ); /* Q0 */
     222        7331 :     bits_left = sub( bits_left, add( hcode_l, NORM0_BITS + FLAGS_BITS ) );                                                      /* Q0 */
     223             : 
     224        7331 :     dequantize_norms_fx( st_fx, start_norm, num_env_bands, *is_transient, ynrm, normqlg2 );
     225             : 
     226        7331 :     test();
     227        7331 :     IF( EQ_16( *hqswb_clas, HQ_GEN_SWB ) || EQ_16( *hqswb_clas, HQ_GEN_FB ) )
     228             :     {
     229        2743 :         hq_generic_exc_clas = swb_bwe_gain_deq_fx( st_fx, HQ_CORE, NULL, SWB_fenv, st_fx->core_brate >= HQ_32k, *hqswb_clas ); /* Use (st->core_brate >= HQ_32k) to be consistent with hq_configure */
     230        2743 :         IF( EQ_16( hq_generic_exc_clas, HQ_GENERIC_SP_EXC ) )
     231             :         {
     232         109 :             bits_left = add( bits_left, 1 ); /* conditional 1 bit saving for representing HQ GENERIC excitation class   Q0*/
     233             :         }
     234        2743 :         map_hq_generic_fenv_norm_fx( *hqswb_clas, SWB_fenv, ynrm, normqlg2, num_env_bands, nb_sfm, hq_generic_offset );
     235             :     }
     236             : 
     237        7331 :     env_stab = 0;
     238        7331 :     move16();
     239             : 
     240        7331 :     csw_flag1 = s_and( core_switching_flag, (Word16) ( st_fx->element_mode != EVS_MONO ) ); /* Q0 */
     241        7331 :     csw_flag2 = s_and( csw_flag1, (Word16) EQ_16( length, L_SPEC32k_EXT ) );                /* Q0 */
     242        7331 :     test();
     243        7331 :     IF( EQ_16( *hqswb_clas, HQ_HVQ ) )
     244             :     {
     245        1229 :         hHQ_core->mem_env_delta = 0;
     246        1229 :         move16();
     247             :     }
     248        6102 :     ELSE IF( EQ_16( length, L_FRAME32k ) || csw_flag2 )
     249             :     {
     250         970 :         env_stab = env_stability_fx( ynrm, SFM_N_ENV_STAB, hHQ_core->mem_norm, &hHQ_core->mem_env_delta, csw_flag1 ); /* Q15 */
     251             :     }
     252             :     ELSE
     253             :     {
     254        5132 :         hHQ_core->mem_norm[0] = 31;
     255        5132 :         move16();
     256        5132 :         hHQ_core->mem_env_delta = 0;
     257        5132 :         move16();
     258             :     }
     259             : 
     260        7331 :     IF( EQ_16( *hqswb_clas, HQ_HVQ ) )
     261             :     {
     262        1229 :         hHQ_core->env_stab_fx = 32767;
     263        1229 :         move16(); /* 1 in Q15, stable by definition */
     264             :     }
     265             :     ELSE
     266             :     {
     267        6102 :         IF( EQ_16( length, L_FRAME32k ) || csw_flag2 )
     268             :         {
     269         970 :             move16();                         /* calculated stability */
     270         970 :             hHQ_core->env_stab_fx = env_stab; /* Q15 */
     271             :         }
     272             :         ELSE
     273             :         {
     274        5132 :             hHQ_core->env_stab_fx = env_stability_fx( ynrm, SFM_N_ENV_STAB_WB, hHQ_core->mem_norm_hqfec, &hHQ_core->mem_env_delta_hqfec, csw_flag1 ); /* Q15 */
     275        5132 :             move16();
     276             :         }
     277             :     }
     278        7331 :     hHQ_core->env_stab_plc_fx = env_stab_smo_fx( s_min( hHQ_core->env_stab_fx, sub( 32767 /* 1.0f in Q15 */, stab_trans_fx[L_STAB_TBL - 1] ) ), hHQ_core->env_stab_state_p_fx, &hHQ_core->envstabplc_hocnt ); /* Q0 */
     279        7331 :     move16();
     280             : 
     281             :     /*------------------------------------------------------------------*
     282             :      * Bit allocation
     283             :      *------------------------------------------------------------------*/
     284             : 
     285        7331 :     ivas_hq_bit_allocation_fx( st_fx->core_brate, length, *hqswb_clas, &bits_left, normqlg2, nb_sfm, sfmsize, noise_level,
     286             :                                R, Rsubband, &sum, &core_sfm, num_env_bands );
     287             : 
     288        7331 :     test();
     289        7331 :     test();
     290        7331 :     IF( EQ_16( *hqswb_clas, HQ_GEN_SWB ) && st_fx->bws_cnt1 > 0 && LT_32( st_fx->core_brate, HQ_32k ) )
     291             :     {
     292           0 :         tmp = i_mult( st_fx->bws_cnt1, 1638 /* 1/20 in Q15 */ );
     293           0 :         move16();
     294           0 :         IF( EQ_16( st_fx->L_frame, L_FRAME16k ) )
     295             :         {
     296           0 :             FOR( n_band = 0; n_band < 4; n_band++ )
     297             :             {
     298           0 :                 SWB_fenv[n_band] = mult_r( SWB_fenv[n_band], tmp ); /* Q1 */
     299           0 :                 move16();
     300             :             }
     301             :         }
     302             : 
     303           0 :         FOR( n_band = 4; n_band < SWB_FENV; n_band++ )
     304             :         {
     305           0 :             SWB_fenv[n_band] = mult_r( SWB_fenv[n_band], tmp ); /* Q1 */
     306           0 :             move16();
     307             :         }
     308             :     }
     309             : 
     310        7331 :     test();
     311        7331 :     IF( EQ_16( *hqswb_clas, HQ_GEN_SWB ) || EQ_16( *hqswb_clas, HQ_GEN_FB ) )
     312             :     {
     313        2743 :         b_delta_env = get_nor_delta_hf_fx( st_fx, ynrm, Rsubband, num_env_bands, nb_sfm, core_sfm ); /* Q0 */
     314        2743 :         sum = sub( sum, b_delta_env );                                                               /* Q0 */
     315             :     }
     316             : 
     317             :     /*------------------------------------------------------------------*
     318             :      * Decode spectral fine structure using HVQ/PVQ
     319             :      *------------------------------------------------------------------*/
     320             : 
     321        7331 :     IF( EQ_16( *hqswb_clas, HQ_HVQ ) )
     322             :     {
     323        1229 :         hvq_dec_fx( st_fx, bits_left, st_fx->core_brate, ynrm, R, noise_level, peak_idx, &Npeaks, t_audio_q, st_fx->core );
     324             :     }
     325             :     ELSE
     326             :     {
     327        6102 :         ivas_pvq_core_dec_fx( st_fx, sfm_start, sfm_end, sfmsize, t_audio_q_norm, &Q_audio, sum, nb_sfm, Rsubband, R, pulses, maxpulse, HQ_CORE );
     328             :     }
     329             : 
     330        7331 :     test();
     331        7331 :     IF( EQ_16( *hqswb_clas, HQ_HVQ ) || EQ_16( *hqswb_clas, HQ_HARMONIC ) )
     332             :     {
     333        1937 :         subband_search_offset = subband_search_offsets_13p2kbps_Har; /* Q0 */
     334        1937 :         wBands[0] = SWB_SB_BW_LEN0_16KBPS_HAR;                       /* Q0 */
     335        1937 :         move16();
     336        1937 :         wBands[1] = SWB_SB_BW_LEN1_16KBPS_HAR; /* Q0 */
     337        1937 :         move16();
     338             : 
     339        1937 :         IF( EQ_16( *hqswb_clas, HQ_HARMONIC ) )
     340             :         {
     341         708 :             Q_shift = sub( SWB_BWE_LR_Qs, Q_audio );
     342      213108 :             FOR( i = 0; i < 300; i++ )
     343             :             {
     344      212400 :                 t_audio_q[i] = L_shl( L_deposit_l( t_audio_q_norm[i] ), Q_shift ); /* Q12 */
     345      212400 :                 move32();
     346             :             }
     347             :         }
     348             : 
     349        1937 :         har_est_fx( t_audio_q, 300, &har_freq_est1, &har_freq_est2, &flag_dis, &hHQ_core->prev_frm_hfe2, subband_search_offset, wBands, &hHQ_core->prev_stab_hfe2 );
     350             : 
     351        1937 :         hHQ_core->prev_frm_hfe2 = har_freq_est2;
     352        1937 :         move16();
     353             :     }
     354             : 
     355        7331 :     test();
     356        7331 :     test();
     357             :     {
     358        7331 :         hHQ_core->prev_frm_hfe2 = 0; /*reset*/
     359        7331 :         move16();
     360        7331 :         hHQ_core->prev_stab_hfe2 = 0; /*reset*/
     361        7331 :         move16();
     362             :     }
     363             : 
     364             :     /*------------------------------------------------------------------*
     365             :      * Spectral filling
     366             :      *------------------------------------------------------------------*/
     367        7331 :     ivas_fill_spectrum_fx( t_audio_q_norm, t_audio_q, R, *is_transient, ynrm, SWB_fenv, hq_generic_offset, nf_idx, length, env_stab,
     368             :                            &hHQ_core->no_att_hangover, &hHQ_core->energy_lt_fx, &hHQ_core->hq_generic_seed, hq_generic_exc_clas,
     369        7331 :                            core_sfm, *hqswb_clas, noise_level, st_fx->core_brate, hHQ_core->prev_noise_level_fx, &hHQ_core->prev_R, hHQ_core->prev_coeff_out_fx, peak_idx, Npeaks, pulses, hHQ_core->old_is_transient[0],
     370        7331 :                            hHQ_core->prev_normq_fx, hHQ_core->prev_env_fx, st_fx->prev_bfi, sfmsize, sfm_start, sfm_end,
     371        7331 :                            &st_fx->hBWE_FD->prev_L_swb_norm, hHQ_core->prev_hqswb_clas, num_sfm, hHQ_core->prev_env_Q, num_env_bands, st_fx->element_mode );
     372             : 
     373        7331 :     enforce_zero_for_min_envelope_fx( *hqswb_clas, ynrm, t_audio_q, nb_sfm, sfm_start, sfm_end );
     374             : 
     375             : 
     376        7331 :     IF( EQ_16( *is_transient, 1 ) )
     377             :     {
     378         477 :         ivas_de_interleave_spectrum_fx( t_audio_q, length );
     379             :     }
     380             : 
     381             :     /*------------------------------------------------------------------*
     382             :      * WB/SWB bandwidth switching
     383             :      *------------------------------------------------------------------*/
     384        7331 :     ivas_hq_pred_hb_bws_fx( st_fx, ynrm, length, *hqswb_clas, SWB_fenv );
     385             : 
     386             :     /* update */
     387        7331 :     hHQ_core->prev_hqswb_clas = *hqswb_clas; /* Q0 */
     388        7331 :     move16();
     389             : 
     390        7331 :     return;
     391             : }
     392             : 
     393         397 : void hq_hr_dec_fx(
     394             :     Decoder_State *st_fx,            /* i/o: decoder state structure fx                     */
     395             :     Word32 *t_audio_q,               /* o  : transform-domain coefficients              Q12 */
     396             :     const Word16 length,             /* i  : frame length                               Q0  */
     397             :     Word16 num_bits,                 /* i  : number of available bits                   Q0  */
     398             :     Word16 *ynrm,                    /* o  : norm quantization index vector             Q0  */
     399             :     Word16 *is_transient,            /* o  : transient flag                             Q0  */
     400             :     Word16 *hqswb_clas,              /* o  : HQ SWB class                               Q0  */
     401             :     Word16 *SWB_fenv,                /* o  : SWB frequency envelopes                    Q1  */
     402             :     const Word16 core_switching_flag /* i : Core switching flag                                                 Q0      */
     403             : )
     404             : {
     405             :     Word16 nb_sfm;
     406             :     Word16 sum, hcode_l;
     407             :     Word16 sfmsize[NB_SFM], sfm_start[NB_SFM], sfm_end[NB_SFM];
     408             :     Word16 num_sfm, numnrmibits;
     409             :     Word16 nf_idx;
     410             :     Word16 normqlg2[NB_SFM], R[NB_SFM];
     411             :     Word16 pulses[NB_SFM], maxpulse[NB_SFM];
     412             :     Word16 env_stab;         /*Q15*/
     413             :     Word16 Rsubband[NB_SFM]; /*Q3*/
     414         397 :     Word16 start_norm, Npeaks = 0;
     415             :     Word16 noise_level[HVQ_BWE_NOISE_BANDS]; /*Q15*/
     416             :     Word16 peak_idx[HVQ_MAX_PEAKS];
     417             :     Word16 hq_generic_offset;
     418             :     Word16 num_env_bands;
     419         397 :     Word16 hq_generic_exc_clas = 0;
     420             :     Word16 core_sfm;
     421             :     Word16 har_freq_est1, har_freq_est2;
     422             :     Word16 flag_dis;
     423             :     const Word16 *subband_search_offset;
     424             :     Word16 wBands[2];
     425             :     Word16 bits, i;
     426             :     Word16 t_audio_q_norm[L_FRAME48k];
     427             :     Word16 Q_audio;
     428             :     Word16 b_delta_env;
     429             :     Word16 tmp, n_band;
     430             :     Word16 Q_shift;
     431             :     Word16 bits_left;
     432             :     Word16 csw_flag1, csw_flag2;
     433         397 :     move16();
     434         397 :     move16();
     435             : 
     436         397 :     HQ_DEC_HANDLE hHQ_core = st_fx->hHQ_core;
     437             : 
     438         397 :     move16();
     439             : 
     440         397 :     Q_audio = 0; /* to avoid compilation warnings */
     441             : 
     442             :     /*------------------------------------------------------------------*
     443             :      * Initializations
     444             :      *------------------------------------------------------------------*/
     445             : 
     446         397 :     set16_fx( pulses, 0, NB_SFM );
     447         397 :     set16_fx( maxpulse, 0, NB_SFM );
     448         397 :     flag_dis = 1;
     449         397 :     move16();
     450         397 :     har_freq_est1 = 0;
     451         397 :     move16();
     452         397 :     har_freq_est2 = 0;
     453         397 :     move16();
     454         397 :     set16_fx( peak_idx, 0, HVQ_MAX_PEAKS );
     455             : 
     456             :     /*------------------------------------------------------------------*
     457             :      * Decode classification
     458             :      *------------------------------------------------------------------*/
     459             : 
     460         397 :     bits = hq_classifier_dec_fx( st_fx, st_fx->core_brate, length, is_transient, hqswb_clas );
     461         397 :     bits_left = sub( num_bits, bits );
     462             : 
     463             :     /*------------------------------------------------------------------*
     464             :      * set quantization parameters
     465             :      *------------------------------------------------------------------*/
     466         397 :     hq_configure_evs_fx( length, *hqswb_clas, st_fx->core_brate, &num_sfm, &nb_sfm, &start_norm,
     467             :                          &num_env_bands, &numnrmibits, &hq_generic_offset, sfmsize, sfm_start, sfm_end );
     468             : 
     469             :     /*------------------------------------------------------------------*
     470             :      * Unpacking bitstream
     471             :      *------------------------------------------------------------------*/
     472             : 
     473         397 :     nf_idx = 0;
     474         397 :     move16();
     475         397 :     test();
     476         397 :     test();
     477         397 :     test();
     478         397 :     IF( !*is_transient && NE_16( *hqswb_clas, HQ_HVQ ) && !( EQ_16( length, L_FRAME16k ) && LE_32( st_fx->core_brate, HQ_32k ) ) )
     479             :     {
     480         362 :         nf_idx = get_next_indice( st_fx, 2 ); /* Q0 */
     481             :     }
     482             : 
     483             :     /*------------------------------------------------------------------*
     484             :      * Decode envelope
     485             :      *------------------------------------------------------------------*/
     486             : 
     487         397 :     hcode_l = decode_envelope_indices_fx( st_fx, start_norm, num_env_bands, numnrmibits, ynrm, NORMAL_HQ_CORE, *is_transient ); /* Q0 */
     488         397 :     bits_left = sub( bits_left, add( hcode_l, NORM0_BITS + FLAGS_BITS ) );                                                      /* Q0 */
     489             : 
     490         397 :     dequantize_norms_fx( st_fx, start_norm, num_env_bands, *is_transient, ynrm, normqlg2 );
     491             : 
     492         397 :     test();
     493         397 :     IF( EQ_16( *hqswb_clas, HQ_GEN_SWB ) || EQ_16( *hqswb_clas, HQ_GEN_FB ) )
     494             :     {
     495          46 :         hq_generic_exc_clas = swb_bwe_gain_deq_fx( st_fx, HQ_CORE, NULL, SWB_fenv, st_fx->core_brate >= HQ_32k, *hqswb_clas ); /* Use (st->core_brate >= HQ_32k) to be consistent with hq_configure         Q0*/
     496          46 :         if ( EQ_16( hq_generic_exc_clas, HQ_GENERIC_SP_EXC ) )
     497             :         {
     498          27 :             bits_left = add( bits_left, 1 ); /* conditional 1 bit saving for representing HQ GENERIC excitation class   Q0*/
     499             :         }
     500          46 :         map_hq_generic_fenv_norm_fx( *hqswb_clas, SWB_fenv, ynrm, normqlg2, num_env_bands, nb_sfm, hq_generic_offset );
     501             :     }
     502             : 
     503         397 :     env_stab = 0;
     504         397 :     move16();
     505             : 
     506         397 :     csw_flag1 = s_and( core_switching_flag, (Word16) ( st_fx->element_mode != EVS_MONO ) ); /* Q0 */
     507         397 :     csw_flag2 = s_and( csw_flag1, (Word16) EQ_16( length, L_SPEC32k_EXT ) );                /* Q0 */
     508         397 :     test();
     509         397 :     IF( EQ_16( *hqswb_clas, HQ_HVQ ) )
     510             :     {
     511           0 :         hHQ_core->mem_env_delta = 0;
     512           0 :         move16();
     513             :     }
     514         397 :     ELSE IF( EQ_16( length, L_FRAME32k ) || csw_flag2 )
     515             :     {
     516         397 :         env_stab = env_stability_fx( ynrm, SFM_N_ENV_STAB, hHQ_core->mem_norm, &hHQ_core->mem_env_delta, csw_flag1 ); /* Q0 */
     517             :     }
     518             :     ELSE
     519             :     {
     520           0 :         hHQ_core->mem_norm[0] = 31;
     521           0 :         move16();
     522           0 :         hHQ_core->mem_env_delta = 0;
     523           0 :         move16();
     524             :     }
     525             : 
     526         397 :     IF( EQ_16( *hqswb_clas, HQ_HVQ ) )
     527             :     {
     528           0 :         hHQ_core->env_stab_fx = 32767;
     529           0 :         move16(); /* 1 in Q15, stable by definition */
     530             :     }
     531             :     ELSE
     532             :     {
     533         397 :         test();
     534         397 :         IF( EQ_16( length, L_FRAME32k ) || csw_flag2 )
     535             :         {
     536         397 :             move16();                         /* calculated stability */
     537         397 :             hHQ_core->env_stab_fx = env_stab; /* Q15 */
     538             :         }
     539             :         ELSE
     540             :         {
     541           0 :             hHQ_core->env_stab_fx = env_stability_fx( ynrm, SFM_N_ENV_STAB_WB, hHQ_core->mem_norm_hqfec, &hHQ_core->mem_env_delta_hqfec, csw_flag1 ); /* Q15 */
     542           0 :             move16();
     543             :         }
     544             :     }
     545         397 :     hHQ_core->env_stab_plc_fx = env_stab_smo_fx( s_min( hHQ_core->env_stab_fx, sub( 32767, stab_trans_fx[L_STAB_TBL - 1] ) ), hHQ_core->env_stab_state_p_fx, &hHQ_core->envstabplc_hocnt ); /* Q0 */
     546             : 
     547             :     /*------------------------------------------------------------------*
     548             :      * Bit allocation
     549             :      *------------------------------------------------------------------*/
     550             : 
     551         397 :     hq_bit_allocation_fx( st_fx->core_brate, length, *hqswb_clas, &bits_left, normqlg2, nb_sfm, sfmsize, noise_level,
     552             :                           R, Rsubband, &sum, &core_sfm, num_env_bands );
     553             : 
     554         397 :     test();
     555         397 :     test();
     556         397 :     IF( EQ_16( *hqswb_clas, HQ_GEN_SWB ) && st_fx->bws_cnt1 > 0 && LT_32( st_fx->core_brate, HQ_32k ) )
     557             :     {
     558           0 :         tmp = i_mult( st_fx->bws_cnt1, 1638 /* 1/20 in Q15 */ ); /* Q15 */
     559           0 :         move16();
     560           0 :         IF( EQ_16( st_fx->L_frame, L_FRAME16k ) )
     561             :         {
     562           0 :             FOR( n_band = 0; n_band < 4; n_band++ )
     563             :             {
     564           0 :                 SWB_fenv[n_band] = mult_r( SWB_fenv[n_band], tmp ); /* Q1 */
     565           0 :                 move16();
     566             :             }
     567             :         }
     568             : 
     569           0 :         FOR( n_band = 4; n_band < SWB_FENV; n_band++ )
     570             :         {
     571           0 :             SWB_fenv[n_band] = mult_r( SWB_fenv[n_band], tmp ); /* Q1 */
     572           0 :             move16();
     573             :         }
     574             :     }
     575             : 
     576         397 :     test();
     577         397 :     IF( EQ_16( *hqswb_clas, HQ_GEN_SWB ) || EQ_16( *hqswb_clas, HQ_GEN_FB ) )
     578             :     {
     579          46 :         b_delta_env = get_nor_delta_hf_fx( st_fx, ynrm, Rsubband, num_env_bands, nb_sfm, core_sfm ); /* Q0 */
     580          46 :         sum = sub( sum, b_delta_env );                                                               /* Q0 */
     581             :     }
     582             : 
     583             :     /*------------------------------------------------------------------*
     584             :      * Decode spectral fine structure using HVQ/PVQ
     585             :      *------------------------------------------------------------------*/
     586             : 
     587         397 :     IF( EQ_16( *hqswb_clas, HQ_HVQ ) )
     588             :     {
     589           0 :         hvq_dec_fx( st_fx, bits_left, st_fx->core_brate, ynrm, R, noise_level, peak_idx, &Npeaks, t_audio_q, st_fx->core );
     590             :     }
     591             :     ELSE
     592             :     {
     593         397 :         pvq_core_dec_fx( st_fx, sfm_start, sfm_end, sfmsize, t_audio_q_norm, &Q_audio, sum, nb_sfm, Rsubband, R, pulses, maxpulse, HQ_CORE );
     594             :     }
     595             : 
     596         397 :     test();
     597         397 :     IF( EQ_16( *hqswb_clas, HQ_HVQ ) || EQ_16( *hqswb_clas, HQ_HARMONIC ) )
     598             :     {
     599          20 :         subband_search_offset = subband_search_offsets_13p2kbps_Har; /* Q0 */
     600          20 :         wBands[0] = SWB_SB_BW_LEN0_16KBPS_HAR;                       /* Q0 */
     601          20 :         move16();
     602          20 :         wBands[1] = SWB_SB_BW_LEN1_16KBPS_HAR; /* Q0 */
     603          20 :         move16();
     604             : 
     605          20 :         IF( EQ_16( *hqswb_clas, HQ_HARMONIC ) )
     606             :         {
     607          20 :             Q_shift = sub( SWB_BWE_LR_Qs, Q_audio );
     608        6020 :             FOR( i = 0; i < 300; i++ )
     609             :             {
     610        6000 :                 t_audio_q[i] = L_shl( L_deposit_l( t_audio_q_norm[i] ), Q_shift ); /* Q12 */
     611        6000 :                 move32();
     612             :             }
     613             :         }
     614             : 
     615          20 :         har_est_fx( t_audio_q, 300, &har_freq_est1, &har_freq_est2, &flag_dis, &hHQ_core->prev_frm_hfe2, subband_search_offset, wBands, &hHQ_core->prev_stab_hfe2 );
     616             : 
     617          20 :         hHQ_core->prev_frm_hfe2 = har_freq_est2;
     618          20 :         move16();
     619             :     }
     620             : 
     621             :     {
     622         397 :         hHQ_core->prev_frm_hfe2 = 0; /*reset*/
     623         397 :         move16();
     624         397 :         hHQ_core->prev_stab_hfe2 = 0; /*reset*/
     625         397 :         move16();
     626             :     }
     627             : 
     628             :     /*------------------------------------------------------------------*
     629             :      * Spectral filling
     630             :      *------------------------------------------------------------------*/
     631         397 :     fill_spectrum_fx( t_audio_q_norm, t_audio_q, R, *is_transient, ynrm, SWB_fenv, hq_generic_offset, nf_idx, length, env_stab,
     632             :                       &hHQ_core->no_att_hangover, &hHQ_core->energy_lt_fx, &hHQ_core->hq_generic_seed, hq_generic_exc_clas,
     633         397 :                       core_sfm, *hqswb_clas, noise_level, st_fx->core_brate, hHQ_core->prev_noise_level_fx, &hHQ_core->prev_R, hHQ_core->prev_coeff_out_fx, peak_idx, Npeaks, pulses, hHQ_core->old_is_transient[0],
     634         397 :                       hHQ_core->prev_normq_fx, hHQ_core->prev_env_fx, st_fx->prev_bfi, sfmsize, sfm_start, sfm_end,
     635         397 :                       &st_fx->hBWE_FD->prev_L_swb_norm, hHQ_core->prev_hqswb_clas, num_sfm, hHQ_core->prev_env_Q, num_env_bands, st_fx->element_mode );
     636             : 
     637         397 :     enforce_zero_for_min_envelope_fx( *hqswb_clas, ynrm, t_audio_q, nb_sfm, sfm_start, sfm_end );
     638             : 
     639             : 
     640         397 :     IF( EQ_16( *is_transient, 1 ) )
     641             :     {
     642          35 :         de_interleave_spectrum_fx( t_audio_q, length );
     643             :     }
     644             : 
     645             :     /*------------------------------------------------------------------*
     646             :      * WB/SWB bandwidth switching
     647             :      *------------------------------------------------------------------*/
     648         397 :     hq_pred_hb_bws_fx( st_fx, ynrm, length, *hqswb_clas, SWB_fenv );
     649             : 
     650             :     /* update */
     651         397 :     hHQ_core->prev_hqswb_clas = *hqswb_clas; /* Q0 */
     652         397 :     move16();
     653             : 
     654         397 :     return;
     655             : }

Generated by: LCOV version 1.14