LCOV - code coverage report
Current view: top level - lib_enc - hq_lr_enc_fx.c (source / functions) Hit Total Coverage
Test: Coverage on main @ cede165d26d1b794bfc5f5f6f9ec19d4d64a9a3b Lines: 556 1948 28.5 %
Date: 2025-11-01 03:16:20 Functions: 8 16 50.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 "options.h"
       7             : #include "cnst.h"
       8             : #include "rom_enc.h"
       9             : #include "rom_com.h"     /* Common constants                       */
      10             : #include "prot_fx.h"     /* Function prototypes                    */
      11             : #include "prot_fx_enc.h" /* Function prototypes                    */
      12             : #include "basop_util.h"  /* Function prototypes                    */
      13             : 
      14             : 
      15             : /*--------------------------------------------------------------------------*
      16             :  * Local function prototypes
      17             :  *--------------------------------------------------------------------------*/
      18             : 
      19             : static Word16 band_energy_quant_fx( BSTR_ENC_HANDLE hBstr, const Word32 *L_t_audio /*Q12*/, const Word16 band_start_fx[], const Word16 band_end_fx[], Word32 L_band_energy[] /*Q14*/, const Word16 bands_fx, const Word32 L_qint /*Q29*/, const Word16 eref_fx /*Q10*/, const Word16 is_transient_fx );
      20             : 
      21             : static Word16 p2a_threshold_quant_fx( BSTR_ENC_HANDLE hBstr, const Word32 *L_t_audio /*Q12*/, const Word16 band_start[], const Word16 band_end[], const Word16 band_width[], const Word16 bands, const Word16 p2a_bands, const Word16 p2a_th /*Q11*/, Word16 *p2a_flags );
      22             : 
      23             : static void mdct_spectrum_fine_gain_enc_fx( Encoder_State *st_fx, const Word32 L_ybuf[] /*Q12*/, Word32 L_y2[] /*Q12*/, const Word16 band_start[], const Word16 band_end[], const Word16 k_sort[], const Word16 bands, const Word32 L_qint /*Q29*/, const Word16 Ngq, const Word16 gqlevs, const Word16 gqbits );
      24             : 
      25             : 
      26             : static Word16 p2a_threshold_quant_ivas_fx( BSTR_ENC_HANDLE hBstr, const Word32 *L_t_audio /*Q12*/, const Word16 band_start[], const Word16 band_end[], const Word16 band_width[], const Word16 bands, const Word16 p2a_bands, const Word16 p2a_th /*Q11*/, Word16 *p2a_flags );
      27             : static void mdct_spectrum_fine_gain_enc_ivas_fx(
      28             :     Encoder_State *st_fx,      /* i/o: encoder state structure                     */
      29             :     const Word32 L_ybuf[],     /* i  : Q12 : input spectrum                        */
      30             :     Word32 L_y2[],             /* i/o: Q12 : decoded spectrum                      */
      31             :     const Word16 band_start[], /* i  : Q0  : table of start freq for every subband */
      32             :     const Word16 band_end[],   /* i  : Q0  : table of end freq for every subband   */
      33             :     const Word16 k_sort[],     /* i  : Q0  : sort table by band_energy             */
      34             :     const Word16 bands,        /* i  : Q0  : nubmber of subbands                   */
      35             :     const Word32 L_qint,       /* i  : Q29 :                                       */
      36             :     const Word16 Ngq,          /* i  : Q0  :                                       */
      37             :     const Word16 gqlevs,       /* i  : Q0  : quantized level                       */
      38             :     const Word16 gqbits        /* i  : Q0  : quantized bits                        */
      39             : );
      40             : 
      41             : static Word16 band_energy_quant_ivas_fx(
      42             :     BSTR_ENC_HANDLE hBstr,     /* i/o: encoder bitstream handle    */
      43             :     const Word32 *L_t_audio,   /* Q12 */
      44             :     const Word16 band_start[], /* Q0 */
      45             :     const Word16 band_end[],   /* Q0 */
      46             :     Word32 L_band_energy[],    /* Q14 */
      47             :     const Word16 bands_fx,     /* Q0 */
      48             :     const Word32 L_qint,       /* Q29 */
      49             :     const Word16 eref_fx,      /* Q10 */
      50             :     const Word16 is_transient /* Q0 */ );
      51             : 
      52             : /*--------------------------------------------------------------------------*
      53             :  * spt_shorten_domain_set()
      54             :  *
      55             :  * Track the spectral peak based on peak -avg analysis
      56             :  *--------------------------------------------------------------------------*/
      57             : 
      58          38 : static void spt_shorten_domain_set_fx(
      59             :     Encoder_State *st_fx,          /* i:   encoder state structure             */
      60             :     const Word32 L_t_audio[],      /* i:   input spectrum                      Q12*/
      61             :     const Word16 p2a_flags[],      /* i:   p2a anlysis information             Q0*/
      62             :     const Word16 new_band_start[], /* i:   new band start position             Q0*/
      63             :     const Word16 new_band_end[],   /* i:   new band end position               Q0*/
      64             :     const Word16 new_band_width[], /* i:   new subband band width              Q0*/
      65             :     const Word16 bands,            /* i:   total number of subbands            Q0*/
      66             :     Word16 band_start[],           /* i/o: band start position                 Q0*/
      67             :     Word16 band_end[],             /* i/o: band end position                   Q0*/
      68             :     Word16 band_width[],           /* i:   sub band band width                 Q0*/
      69             :     Word16 *bit_budget             /* i/o: bit budget                          Q0*/
      70             : )
      71             : {
      72             :     Word16 i, j, k;
      73             :     Word16 kpos;
      74             :     Word32 L_max_y2;
      75             :     Word16 max_y2_pos;
      76             :     Word16 spt_shorten_flag[SPT_SHORTEN_SBNUM];
      77          38 :     HQ_ENC_HANDLE hHQ_core = st_fx->hHQ_core;
      78             : 
      79          38 :     kpos = 0;
      80          38 :     j = 0;
      81          38 :     move16();
      82          38 :     move16();
      83         190 :     FOR( k = ( bands - SPT_SHORTEN_SBNUM ); k < bands; k++ )
      84             :     {
      85         152 :         IF( EQ_16( p2a_flags[k], 1 ) )
      86             :         {
      87           7 :             spt_shorten_flag[j] = 0;
      88           7 :             move16();
      89           7 :             IF( hHQ_core->prev_SWB_peak_pos[kpos] != 0 )
      90             :             {
      91           2 :                 L_max_y2 = L_deposit_l( 0 );
      92           2 :                 max_y2_pos = 0;
      93           2 :                 move16();
      94         212 :                 FOR( i = band_start[k]; i <= band_end[k]; i++ )
      95             :                 {
      96         210 :                     IF( LT_32( L_max_y2, L_abs( L_t_audio[i] ) ) )
      97             :                     {
      98          12 :                         L_max_y2 = L_abs( L_t_audio[i] ); /* Q12 */
      99          12 :                         move32();
     100          12 :                         max_y2_pos = i;
     101          12 :                         move16();
     102             :                     }
     103             :                 }
     104           2 :                 test();
     105           2 :                 IF( GE_16( max_y2_pos, new_band_start[j] ) && LE_16( max_y2_pos, new_band_end[j] ) )
     106             :                 {
     107           2 :                     band_start[k] = new_band_start[j]; /* Q0 */
     108           2 :                     move16();
     109           2 :                     band_end[k] = new_band_end[j]; /* Q0 */
     110           2 :                     move16();
     111           2 :                     band_width[k] = new_band_width[j]; /* Q0 */
     112           2 :                     move16();
     113           2 :                     spt_shorten_flag[j] = 1;
     114           2 :                     move16();
     115             :                 }
     116             :             }
     117           7 :             push_indice( st_fx->hBstr, IND_HQ2_SPT_SHORTEN, spt_shorten_flag[j], 1 );
     118           7 :             *bit_budget = sub( *bit_budget, 1 ); /* Q0 */
     119           7 :             move16();
     120             :         }
     121             : 
     122         152 :         kpos += 1;
     123         152 :         j += 1;
     124             :     }
     125             : 
     126          38 :     return;
     127             : }
     128             : 
     129           0 : static void spt_shorten_domain_set_ivas_fx(
     130             :     Encoder_State *st_fx,          /* i:   encoder state structure             */
     131             :     const Word32 L_t_audio[],      /* i:   input spectrum                      Q12*/
     132             :     const Word16 p2a_flags[],      /* i:   p2a anlysis information             Q0*/
     133             :     const Word16 new_band_start[], /* i:   new band start position             Q0*/
     134             :     const Word16 new_band_end[],   /* i:   new band end position               Q0*/
     135             :     const Word16 new_band_width[], /* i:   new subband band width              Q0*/
     136             :     const Word16 bands,            /* i:   total number of subbands            Q0*/
     137             :     Word16 band_start[],           /* i/o: band start position                 Q0*/
     138             :     Word16 band_end[],             /* i/o: band end position                   Q0*/
     139             :     Word16 band_width[],           /* i:   sub band band width                 Q0*/
     140             :     Word16 *bit_budget             /* i/o: bit budget                          Q0*/
     141             : )
     142             : {
     143             :     Word16 i, j, k;
     144             :     Word16 kpos;
     145             :     Word32 L_max_y2;
     146             :     Word16 max_y2_pos;
     147             :     Word16 spt_shorten_flag[SPT_SHORTEN_SBNUM];
     148           0 :     HQ_ENC_HANDLE hHQ_core = st_fx->hHQ_core;
     149             : 
     150           0 :     kpos = 0;
     151           0 :     j = 0;
     152           0 :     move16();
     153           0 :     move16();
     154           0 :     FOR( k = ( bands - SPT_SHORTEN_SBNUM ); k < bands; k++ )
     155             :     {
     156           0 :         IF( EQ_16( p2a_flags[k], 1 ) )
     157             :         {
     158           0 :             spt_shorten_flag[j] = 0;
     159           0 :             move16();
     160           0 :             IF( hHQ_core->prev_SWB_peak_pos[kpos] != 0 )
     161             :             {
     162           0 :                 L_max_y2 = L_deposit_l( 0 );
     163           0 :                 max_y2_pos = 0;
     164           0 :                 move16();
     165           0 :                 FOR( i = band_start[k]; i <= band_end[k]; i++ )
     166             :                 {
     167           0 :                     IF( LT_32( L_max_y2, L_abs( L_t_audio[i] ) ) )
     168             :                     {
     169           0 :                         L_max_y2 = L_abs( L_t_audio[i] ); /* Q12 */
     170           0 :                         move32();
     171           0 :                         max_y2_pos = i;
     172           0 :                         move16();
     173             :                     }
     174             :                 }
     175           0 :                 test();
     176           0 :                 IF( GE_16( max_y2_pos, new_band_start[j] ) && LE_16( max_y2_pos, new_band_end[j] ) )
     177             :                 {
     178           0 :                     band_start[k] = new_band_start[j]; /* Q0 */
     179           0 :                     move16();
     180           0 :                     band_end[k] = new_band_end[j]; /* Q0 */
     181           0 :                     move16();
     182           0 :                     band_width[k] = new_band_width[j]; /* Q0 */
     183           0 :                     move16();
     184           0 :                     spt_shorten_flag[j] = 1;
     185           0 :                     move16();
     186             :                 }
     187             :             }
     188           0 :             push_indice( st_fx->hBstr, IND_HQ2_SPT_SHORTEN, spt_shorten_flag[j], 1 );
     189           0 :             *bit_budget = sub( *bit_budget, 1 ); /* Q0 */
     190           0 :             move16();
     191             :         }
     192             : 
     193           0 :         kpos += 1;
     194           0 :         j += 1;
     195             :     }
     196             : 
     197           0 :     return;
     198             : }
     199             : 
     200             : 
     201             : /*--------------------------------------------------------------------------*
     202             :  * hq_lr_enc_fx()
     203             :  *
     204             :  * HQ Low rate encoding routine
     205             :  *--------------------------------------------------------------------------*/
     206             : 
     207          39 : void hq_lr_enc_fx(
     208             :     Encoder_State *st_fx,        /* i/o:     : encoder state structure    */
     209             :     Word32 L_t_audio[],          /* i/o: Q12 : transform-domain coefs.    */
     210             :     const Word16 inner_frame_fx, /* i  : Q0  : inner frame length         */
     211             :     Word16 *num_bits_fx,         /* i/o: Q0  : number of available bits   */
     212             :     const Word16 is_transient_fx /* i  : Q0  : transient flag             */
     213             : )
     214             : {
     215             :     Word16 i, k1_fx, k2_fx;
     216             :     Word16 bit_budget_fx, pbits_fx;
     217             :     Word16 bands_fx, length_fx, ni_seed_fx, gqlevs_fx, gqbits_fx, Ngq_fx, p2a_bands_fx;
     218             :     Word16 p2a_flags_fx[BANDS_MAX];
     219             :     Word16 band_start[BANDS_MAX], band_end[BANDS_MAX], band_width[BANDS_MAX];
     220             :     Word32 L_band_energy[BANDS_MAX], L_Rk[BANDS_MAX];
     221             :     Word16 ebits_fx;
     222             : 
     223             :     Word32 L_qint;
     224             :     /*Word16 Qqint=29;*/
     225             :     Word16 eref_fx /*, Qeref=10*/;
     226             :     Word16 bit_alloc_weight_fx /*, Qbaw=13*/;
     227             :     Word16 ld_slope_fx /*, Qldslope=15*/;
     228             :     Word16 p2a_th_fx /*, Qp2ath=11*/;
     229             :     Word16 pd_thresh_fx /*, Qpdth=15*/;
     230             :     Word16 ni_coef_fx /*, Qnicoef=14*/;
     231             : 
     232             :     Word16 k_sort_fx[BANDS_MAX];
     233             :     Word16 npulses_fx[BANDS_MAX];
     234             :     Word16 inp_vector_fx[L_FRAME48k];
     235             :     Word32 L_y2[L_FRAME48k];
     236             :     Word32 L_y2_ni[L_FRAME48k];
     237             :     Word16 hqswb_clas_fx;
     238             :     Word16 lowlength_fx;
     239             :     Word16 highlength_fx;
     240             :     Word32 L_m[L_FRAME32k];
     241             :     Word16 har_bands_fx;
     242             :     Word16 bw_low, bw_high;
     243             :     Word32 L_band_energy_tmp[BANDS_MAX];
     244             :     Word32 L_bwe_br;
     245             :     Word16 trans_bit;
     246             :     Word16 adjustFlag;
     247             :     Word16 prev_SWB_peak_pos_tmp_fx[SPT_SHORTEN_SBNUM];
     248             :     Word16 k, j;
     249             :     Word16 flag_spt_fx;
     250             :     Word16 org_band_start[SPT_SHORTEN_SBNUM];
     251             :     Word16 org_band_end[SPT_SHORTEN_SBNUM];
     252             :     Word16 org_band_width[SPT_SHORTEN_SBNUM];
     253             :     Word16 new_band_start[SPT_SHORTEN_SBNUM];
     254             :     Word16 new_band_end[SPT_SHORTEN_SBNUM];
     255             :     Word16 new_band_width[SPT_SHORTEN_SBNUM];
     256             : 
     257             :     Word16 k1_step_fx, k2_step_fx;
     258             :     Word16 exp_norm;
     259             : 
     260             :     Word16 lowband, highband, p2a_flags_tmp[BANDS_MAX];
     261             :     Word32 L_tmp, L_tmp2, L_tmp3;
     262             :     Word16 exp, exp2, tmp, tmp1, tmp2, tmp3, frac1, alpha_fx, Q_band_energy;
     263             :     Word32 enerH_fx;
     264             :     Word32 enerL_fx;
     265             :     Word32 Ep_fx[BANDS_MAX];
     266             :     Word32 Ep_avrg_fx, Ep_vari_fx;
     267             :     Word32 Ep_avrgL_fx;
     268             :     Word32 Ep_peak_fx;
     269             :     Word32 Ep_tmp_fx[BANDS_MAX];
     270             :     Word16 gama_fx; /*Q15 0.85f;// */
     271             :     Word16 beta_fx; /*Q14 1.05f; */
     272          39 :     HQ_ENC_HANDLE hHQ_core = st_fx->hHQ_core;
     273          39 :     BSTR_ENC_HANDLE hBstr = st_fx->hBstr;
     274             : 
     275          39 :     set32_fx( L_y2, 0x0L, L_FRAME48k );
     276          39 :     set16_fx( inp_vector_fx, 0, inner_frame_fx );
     277          39 :     flag_spt_fx = 0;
     278          39 :     move16();
     279          39 :     set16_fx( prev_SWB_peak_pos_tmp_fx, 0, SPT_SHORTEN_SBNUM );
     280          39 :     adjustFlag = 0;
     281          39 :     move16();
     282          39 :     bw_low = 0;
     283          39 :     move16();
     284          39 :     bw_high = 20;
     285          39 :     move16();
     286          39 :     enerL_fx = L_deposit_l( 0 );
     287          39 :     enerH_fx = L_deposit_l( 0 );
     288             : 
     289          39 :     tmp2 = 0; /* to avoid compilation warnings */
     290          39 :     move16();
     291             : 
     292          39 :     L_bwe_br = L_add( st_fx->core_brate, 0 );
     293          39 :     hqswb_clas_fx = HQ_NORMAL;
     294          39 :     move16();
     295          39 :     test();
     296          39 :     test();
     297          39 :     IF( EQ_16( st_fx->bwidth, SWB ) && ( EQ_32( L_bwe_br, HQ_16k40 ) || EQ_32( L_bwe_br, HQ_13k20 ) ) )
     298             :     {
     299          39 :         IF( EQ_16( is_transient_fx, 1 ) )
     300             :         {
     301           1 :             hqswb_clas_fx = HQ_TRANSIENT;
     302           1 :             move16();
     303             :         }
     304             :         ELSE
     305             :         {
     306          38 :             hqswb_clas_fx = peak_avrg_ratio_fx( st_fx->total_brate, L_t_audio, NUMC_N, &hHQ_core->mode_count, &hHQ_core->mode_count1, SWB_BWE_LR_Qs ); /* Q0 */
     307             :         }
     308             : 
     309             :         /* write the classification information into the bitstream */
     310          39 :         push_indice( hBstr, IND_HQ2_SWB_CLAS, hqswb_clas_fx, 2 );
     311          39 :         ( *num_bits_fx ) = sub( *num_bits_fx, 2 );
     312          39 :         move16();
     313          39 :         IF( EQ_16( hqswb_clas_fx, HQ_NORMAL ) )
     314             :         {
     315          38 :             flag_spt_fx = 1;
     316          38 :             move16();
     317             :         }
     318             :     }
     319             :     ELSE
     320             :     {
     321             :         /* write the transient bit into the bitstream */
     322           0 :         push_indice( st_fx->hBstr, IND_HQ2_SWB_CLAS, is_transient_fx, 1 );
     323             : 
     324             :         /* subtract one bit for the transient flag */
     325           0 :         ( *num_bits_fx ) = sub( ( *num_bits_fx ), 1 );
     326           0 :         move16();
     327             :     }
     328             : 
     329          39 :     hq2_core_configure_fx( inner_frame_fx, *num_bits_fx, is_transient_fx, &bands_fx, &length_fx, band_width, band_start, band_end,
     330             :                            &L_qint, &eref_fx, &bit_alloc_weight_fx, &gqlevs_fx, &Ngq_fx, &p2a_bands_fx, &p2a_th_fx, &pd_thresh_fx, &ld_slope_fx, &ni_coef_fx, L_bwe_br );
     331             : 
     332          39 :     highlength_fx = band_end[( bands_fx - 1 )]; /* Q0 */
     333          39 :     move16();
     334          39 :     har_bands_fx = bands_fx; /* Q0 */
     335          39 :     move16();
     336             : 
     337          39 :     test();
     338          39 :     test();
     339          39 :     test();
     340          39 :     IF( EQ_16( st_fx->bwidth, SWB ) && is_transient_fx == 0 && ( EQ_32( L_bwe_br, HQ_16k40 ) || EQ_32( L_bwe_br, HQ_13k20 ) ) )
     341             :     {
     342             :         /* reserve bits for HQ_NORMAL2 and HQ_HARMONIC modes */
     343          38 :         test();
     344          38 :         IF( EQ_16( hqswb_clas_fx, HQ_NORMAL ) || EQ_16( hqswb_clas_fx, HQ_HARMONIC ) )
     345             :         {
     346          38 :             ( *num_bits_fx ) = sub( *num_bits_fx, get_usebit_npswb_fx( hqswb_clas_fx ) );
     347          38 :             move16();
     348             :         }
     349             :     }
     350             : 
     351          39 :     test();
     352          39 :     test();
     353          39 :     IF( ( EQ_32( L_bwe_br, HQ_16k40 ) || EQ_32( L_bwe_br, HQ_13k20 ) ) && EQ_16( st_fx->bwidth, SWB ) )
     354             :     {
     355          39 :         IF( NE_16( hHQ_core->prev_hqswb_clas, HQ_NORMAL ) )
     356             :         {
     357           1 :             j = 0;
     358           1 :             move16();
     359           5 :             FOR( k = ( bands_fx - SPT_SHORTEN_SBNUM ); k < bands_fx; k++ )
     360             :             {
     361           4 :                 hHQ_core->prev_SWB_peak_pos[j] = 0;
     362           4 :                 move16();
     363           4 :                 j = add( j, 1 );
     364             :             }
     365             :         }
     366             :     }
     367             : 
     368             :     /* Check if input frame is larger than coded bandwidth */
     369          39 :     test();
     370          39 :     IF( GT_16( inner_frame_fx, length_fx ) && is_transient_fx )
     371             :     {
     372             :         /* If so, collapse transient frame (4 short transforms) to remove uncoded coefficients */
     373             : 
     374           1 :         k1_step_fx = shr( length_fx, 2 );      /* k1 = length/NUM_TIME_SWITCHING_BLOCKS Q0*/
     375           1 :         k2_step_fx = shr( inner_frame_fx, 2 ); /* k2 = inner_frame/NUM_TIME_SWITCHING_BLOCKS Q0*/
     376           1 :         k1_fx = k1_step_fx;                    /* Q0 */
     377           1 :         k2_fx = k2_step_fx;                    /* Q0 */
     378           1 :         move16();
     379           1 :         move16();
     380           4 :         FOR( i = 1; i < NUM_TIME_SWITCHING_BLOCKS; i++ )
     381             :         {
     382             :             /*k1 = i*length/NUM_TIME_SWITCHING_BLOCKS; */
     383             :             /*k2 = i*inner_frame/NUM_TIME_SWITCHING_BLOCKS; */
     384             : 
     385           3 :             Copy32( &L_t_audio[k2_fx], &L_t_audio[k1_fx], k1_step_fx ); /* Q12 */
     386             : 
     387           3 :             k1_fx = add( k1_fx, k1_step_fx );
     388           3 :             k2_fx = add( k2_fx, k2_step_fx );
     389             :         }
     390             :     }
     391             : 
     392             :     /* Spectral energy calculation/quantization */
     393          39 :     ebits_fx = band_energy_quant_fx( hBstr, L_t_audio, band_start, band_end, L_band_energy, bands_fx,
     394             :                                      L_qint, eref_fx, is_transient_fx ); /* Q0 */
     395             : 
     396             :     /* First pass bit budget for TCQ of spectral band information */
     397          39 :     exp_norm = norm_s( gqlevs_fx ); /* gqbits_fx = (short int) log2_f ((float) gqlevs_fx); */
     398          39 :     gqbits_fx = sub( 14, exp_norm );
     399             : 
     400          39 :     bit_budget_fx = sub( sub( *num_bits_fx, ebits_fx ), round_fx( L_shl( L_mult( Ngq_fx, gqbits_fx ), 15 ) ) ); /* (*num_bits) - (short) ceil (ebits) - Ngq * gqbits; Q0*/
     401             : 
     402             : 
     403          39 :     pbits_fx = 0;
     404          39 :     move16();
     405             : 
     406          39 :     test();
     407          39 :     test();
     408          39 :     IF( EQ_16( st_fx->bwidth, SWB ) && ( EQ_32( L_bwe_br, HQ_16k40 ) || EQ_32( L_bwe_br, HQ_13k20 ) ) )
     409             :     {
     410          39 :         IF( EQ_16( hqswb_clas_fx, HQ_HARMONIC ) )
     411             :         {
     412           0 :             set16_fx( p2a_flags_fx, 1, har_bands_fx );
     413             :         }
     414             :         ELSE
     415             :         {
     416             :             /* High band tonality detector based on per band peak-to-average ratio */
     417          39 :             pbits_fx = p2a_threshold_quant_fx( hBstr, L_t_audio, band_start, band_end, band_width, bands_fx, p2a_bands_fx, p2a_th_fx, p2a_flags_fx ); /* Q0 */
     418          39 :             bit_budget_fx = sub( bit_budget_fx, pbits_fx );
     419             : 
     420          39 :             IF( EQ_16( hqswb_clas_fx, HQ_NORMAL ) )
     421             :             {
     422          38 :                 return_bits_normal2_fx( &bit_budget_fx, p2a_flags_fx, bands_fx, bits_lagIndices_modeNormal );
     423             :             }
     424             :         }
     425             :     }
     426             :     ELSE
     427             :     {
     428             :         /* High band tonality detector based on per band peak-to-average ratio */
     429           0 :         pbits_fx = p2a_threshold_quant_fx( hBstr, L_t_audio, band_start, band_end, band_width, bands_fx, p2a_bands_fx, p2a_th_fx, p2a_flags_fx ); /* Q0 */
     430           0 :         bit_budget_fx = sub( bit_budget_fx, pbits_fx );
     431             :     }
     432             : 
     433          39 :     IF( EQ_16( flag_spt_fx, 1 ) )
     434             :     {
     435          38 :         spt_shorten_domain_band_save_fx( bands_fx, band_start, band_end, band_width, org_band_start, org_band_end, org_band_width );
     436          38 :         spt_shorten_domain_pre_fx( band_start, band_end, hHQ_core->prev_SWB_peak_pos, bands_fx, L_bwe_br, new_band_start, new_band_end, new_band_width );
     437          38 :         spt_shorten_domain_set_fx( st_fx, L_t_audio, p2a_flags_fx, new_band_start, new_band_end, new_band_width, bands_fx, band_start, band_end, band_width, &bit_budget_fx );
     438             :     }
     439             : 
     440             :     /* Estimate number of bits per band */
     441          39 :     Q_band_energy = SWB_BWE_LR_Qbe;
     442          39 :     move16();
     443             : 
     444         907 :     FOR( i = 0; i < bands_fx; i++ )
     445             :     {
     446         868 :         L_tmp = L_shl( L_band_energy[i], sub( 16, Q_band_energy ) ); /*Q16 */
     447             : 
     448         868 :         frac1 = L_Extract_lc( L_tmp, &exp ); /* Extract exponent of L_tmp */
     449         868 :         L_tmp = Pow2( 30, frac1 );
     450         868 :         exp = sub( exp, 30 );
     451         868 :         Ep_fx[i] = L_shl_sat( L_tmp, s_max( sub( exp, 6 ), -31 ) ); /* Q -6 */
     452             :     }
     453             : 
     454         907 :     FOR( i = 0; i < bands_fx; i++ )
     455             :     {
     456         868 :         L_tmp2 = Ep_fx[i];          /* Q -6 */
     457         868 :         L_tmp = L_max( 1, L_tmp2 ); /* Q -6 */
     458         868 :         exp = norm_l( L_tmp );
     459         868 :         tmp = extract_h( L_shl( L_tmp, exp ) ); /* Q -6 + exp - 16 */
     460             : 
     461         868 :         L_tmp3 = L_deposit_l( band_width[i] ); /* Q0 */
     462         868 :         exp2 = norm_l( L_tmp3 );
     463         868 :         tmp2 = extract_h( L_shl( L_tmp3, exp2 ) ); /* exp2 - 16 */
     464             : 
     465         868 :         exp2 = sub( exp, exp2 ); /* Denormalize and substract */
     466             : 
     467         868 :         tmp3 = sub( tmp2, tmp );
     468         868 :         IF( tmp3 > 0 )
     469             :         {
     470         390 :             tmp2 = shr( tmp2, 1 );
     471             :         }
     472         868 :         IF( tmp3 > 0 )
     473             :         {
     474         390 :             exp2 = add( exp2, 1 );
     475             :         }
     476         868 :         tmp = div_s( tmp2, tmp );
     477         868 :         L_tmp = L_deposit_h( tmp );
     478         868 :         L_tmp = Isqrt_lc( L_tmp, &exp2 );               /*Q(31-exp2) */
     479         868 :         Ep_tmp_fx[i] = L_shr( L_tmp, sub( 15, exp2 ) ); /*Q13 */
     480         868 :         move32();
     481             :     }
     482             : 
     483          39 :     test();
     484          39 :     test();
     485          39 :     test();
     486          39 :     test();
     487          39 :     test();
     488          39 :     test();
     489          39 :     IF( is_transient_fx == 0 && EQ_16( inner_frame_fx, L_FRAME8k ) && LE_32( st_fx->core_brate, ACELP_13k20 ) )
     490             :     {
     491           0 :         lowband = 6;
     492           0 :         move16();
     493           0 :         trans_bit = 2;
     494           0 :         move16();
     495           0 :         bit_budget_fx = sub( bit_budget_fx, trans_bit );
     496           0 :         gama_fx = 27852; /*Q15 0.85f;// */
     497           0 :         beta_fx = 17203; /*Q14 1.05f; */
     498           0 :         move16();
     499           0 :         move16();
     500             : 
     501           0 :         set16_fx( &p2a_flags_tmp[( bands_fx - trans_bit )], 0, 2 );
     502             : 
     503           0 :         IF( EQ_32( st_fx->core_brate, ACELP_13k20 ) )
     504             :         {
     505           0 :             beta_fx = 13107; /*14 1.25f; */
     506           0 :             move16();
     507           0 :             gama_fx = 31130; /*0.95f; */
     508           0 :             move16();
     509           0 :             Copy( &p2a_flags_fx[( bands_fx - trans_bit )], &p2a_flags_tmp[( bands_fx - trans_bit )], trans_bit ); /* Q0 */
     510             :         }
     511             :         /* calculate the the low band/high band energy and the variance/avrage of the envelopes */
     512           0 :         Ep_vari_fx = L_deposit_l( 0 );
     513           0 :         Ep_avrg_fx = L_deposit_l( 0 );
     514           0 :         Ep_avrgL_fx = L_deposit_l( 0 );
     515           0 :         Ep_peak_fx = L_deposit_l( 0 );
     516           0 :         FOR( i = 0; i < bands_fx; i++ )
     517             :         {
     518           0 :             IF( GE_16( i, lowband ) )
     519             :             {
     520           0 :                 Ep_vari_fx = L_add_sat( Ep_vari_fx, L_abs( L_sub( Ep_tmp_fx[i], Ep_tmp_fx[sub( i, 1 )] ) ) ); /*Q15 */
     521           0 :                 Ep_avrg_fx = L_add_sat( Ep_avrg_fx, Ep_tmp_fx[i] );                                           /*Q15 */
     522           0 :                 move32();
     523             :             }
     524             :             ELSE
     525             :             {
     526           0 :                 Ep_avrgL_fx = L_add_sat( Ep_avrgL_fx, Ep_tmp_fx[i] ); /*Q15 */
     527           0 :                 IF( GT_32( Ep_tmp_fx[i], Ep_peak_fx ) )
     528             :                 {
     529           0 :                     Ep_peak_fx = L_add( Ep_tmp_fx[i], 0 ); /*Q15 */
     530             :                 }
     531             :             }
     532             :         }
     533             :         /* modify the last p2a_bands subbands band_energies */
     534           0 :         Copy32( L_band_energy, L_band_energy_tmp, bands_fx );                  /*Q_band_energy */
     535           0 :         L_tmp = Mult_32_16( Ep_peak_fx, 24576 );                               /*Q(13+14-15 = 12) 1.5 lowband = 6; */
     536           0 :         L_tmp2 = Mult_32_16( Ep_peak_fx, shl( sub( bands_fx, lowband ), 9 ) ); /*Q(13+9-15 = 7) */
     537           0 :         L_tmp3 = Mult_32_16( Ep_avrg_fx, 1126 );                               /*Q(13+9-15 = 7) */
     538             : 
     539           0 :         test();
     540           0 :         test();
     541           0 :         test();
     542           0 :         test();
     543           0 :         IF( ( ( LT_32( L_tmp, L_shr( Ep_avrgL_fx, 1 ) ) && EQ_32( st_fx->core_brate, ACELP_13k20 ) ) || LT_32( st_fx->core_brate, ACELP_13k20 ) ) &&
     544             :             LT_32( L_tmp2, L_tmp3 ) && GT_32( L_tmp2, L_shr( Ep_avrg_fx, 7 ) ) )
     545             :         {
     546           0 :             FOR( i = lowband; i < bands_fx; i++ )
     547             :             {
     548           0 :                 L_tmp = Mult_32_16( Ep_avrg_fx, 24576 ); /*Q(13+14-15 = 12) 1.5  */
     549           0 :                 IF( LT_32( L_shr( Ep_tmp_fx[i], 1 ), L_tmp ) )
     550             :                 {
     551           0 :                     L_tmp = Mult_32_16( Ep_peak_fx, sub( bands_fx, lowband ) ); /*Q(13+0-15 = -2) */
     552           0 :                     tmp = extract_h( L_shl( L_tmp, 14 ) );                      /*Q-4 */
     553           0 :                     IF( tmp != 0 )
     554             :                     {
     555           0 :                         exp = norm_s( tmp );
     556           0 :                         tmp = shl( tmp, exp );     /*Q(exp) */
     557           0 :                         tmp = div_s( 16384, tmp ); /*Q(15+14-exp=29-exp) */
     558           0 :                         exp = sub( 29, exp );
     559             :                     }
     560             :                     ELSE
     561             :                     {
     562             :                         /*when the divisor is zero, happens rarely*/
     563           0 :                         tmp = 0x7fff;
     564           0 :                         move16();
     565           0 :                         exp = 0;
     566           0 :                         move16();
     567             :                     }
     568           0 :                     L_tmp = L_shl( Mult_32_16( Ep_avrg_fx, tmp ), sub( 13, exp ) );  /*Q(13+exp-15 +13-exp +4 = 15) */
     569           0 :                     L_tmp2 = L_add( L_tmp, 13107 );                                  /*15 */
     570           0 :                     tmp2 = extract_l( L_min( L_max( L_tmp2, 16384 ), gama_fx ) );    /*15 = 15 */
     571           0 :                     L_band_energy_tmp[i] = Mult_32_16( L_band_energy_tmp[i], tmp2 ); /*Q(Q_band_energy+15-15 = Q_band_energy) */
     572           0 :                     move32();
     573             :                 }
     574             :             }
     575             :         }
     576             :         ELSE
     577             :         {
     578           0 :             j = 0;
     579           0 :             move16();
     580           0 :             FOR( i = ( bands_fx - trans_bit ); i < bands_fx; i++ )
     581             :             {
     582           0 :                 alpha_fx = 16384; /*Q14 */
     583           0 :                 move16();
     584           0 :                 IF( EQ_16( p2a_flags_tmp[i], 1 ) )
     585             :                 {
     586           0 :                     L_tmp = Mult_32_16( Ep_tmp_fx[i], sub( bands_fx, lowband ) ); /*Q(13+0-15 = -2) */
     587           0 :                     tmp = extract_h( L_shl( L_tmp, 14 ) );                        /*Q-4 */
     588           0 :                     IF( tmp != 0 )
     589             :                     {
     590           0 :                         exp = norm_s( tmp );
     591           0 :                         tmp = shl( tmp, exp );     /*Q(exp) */
     592           0 :                         tmp = div_s( 16384, tmp ); /*Q(15+14-exp=29-exp) */
     593           0 :                         exp = sub( 29, exp );
     594             :                     }
     595             :                     ELSE
     596             :                     {
     597             :                         /*when the divisor is zero, happens rarely*/
     598           0 :                         tmp = 0x7fff;
     599           0 :                         move16();
     600           0 :                         exp = 0;
     601           0 :                         move16();
     602             :                     }
     603           0 :                     L_tmp = Mult_32_16( Ep_vari_fx, 3277 );                        /*13+15-15=13 */
     604           0 :                     L_tmp = L_shl_sat( Mult_32_16( L_tmp, tmp ), sub( 12, exp ) ); /*Q(13+exp-15 +12-exp +4 = 14) */
     605           0 :                     tmp2 = extract_h( Ep_avrg_fx );                                /*Q13-16=-3 */
     606           0 :                     IF( tmp2 != 0 )
     607             :                     {
     608           0 :                         exp = norm_s( tmp2 );
     609           0 :                         tmp2 = shl( tmp2, exp );     /*Q(exp) */
     610           0 :                         tmp2 = div_s( 16384, tmp2 ); /*Q(15+14-exp=29-exp) */
     611           0 :                         exp = sub( 29, exp );
     612             :                     }
     613             :                     ELSE
     614             :                     {
     615           0 :                         tmp2 = 0x7fff;
     616           0 :                         move16();
     617           0 :                         exp = 0;
     618           0 :                         move16();
     619             :                     }
     620           0 :                     L_tmp2 = Mult_32_16( Ep_vari_fx, 6554 );                          /*13+15-15=13 */
     621           0 :                     L_tmp2 = L_shl_sat( Mult_32_16( L_tmp2, tmp2 ), sub( 13, exp ) ); /*Q(13+exp-15 +13-exp +3 = 14) */
     622           0 :                     L_tmp = L_min( L_tmp, L_tmp2 );                                   /*Q14 */
     623           0 :                     tmp = extract_l( L_min( L_tmp, 13107 ) );                         /*Q14 */
     624           0 :                     alpha_fx = add( 16384, tmp );
     625             :                 }
     626           0 :                 IF( EQ_16( hHQ_core->last_bitalloc_max_band[j++], 1 ) )
     627             :                 {
     628           0 :                     L_tmp = Mult_32_16( Ep_tmp_fx[i], sub( bands_fx, lowband ) ); /*Q(13+0-15 = -2) */
     629           0 :                     tmp = extract_h( L_shl_sat( L_tmp, 14 ) );                    /*Q-4 */
     630           0 :                     IF( tmp != 0 )
     631             :                     {
     632           0 :                         exp = norm_s( tmp );
     633           0 :                         tmp = shl( tmp, exp );     /*Q(exp) */
     634           0 :                         tmp = div_s( 16384, tmp ); /*Q(15+14-exp=29-exp) */
     635           0 :                         exp = sub( 29, exp );
     636             :                     }
     637             :                     ELSE
     638             :                     {
     639           0 :                         tmp = 0x7fff;
     640           0 :                         move16();
     641           0 :                         exp = 0;
     642           0 :                         move16();
     643             :                     }
     644           0 :                     L_tmp = L_shl_sat( Mult_32_16( Ep_avrg_fx, tmp ), sub( 14, exp ) ); /*Q(13+exp-15 +14-exp+2 = 14) */
     645           0 :                     L_tmp = L_max( L_tmp, 16384 );                                      /*Q14 */
     646           0 :                     tmp = extract_l( L_min( L_tmp, beta_fx ) );                         /*Q14 */
     647           0 :                     alpha_fx = shl( mult( alpha_fx, tmp ), 1 );                         /*14+14-15 +1=Q14 */
     648             :                 }
     649             :                 ELSE
     650             :                 {
     651           0 :                     tmp2 = extract_h( Ep_avrg_fx ); /*13 -16 =-3 */
     652           0 :                     IF( tmp2 != 0 )
     653             :                     {
     654           0 :                         exp = norm_s( tmp2 );
     655           0 :                         tmp2 = shl( tmp2, exp );     /*Q(exp) */
     656           0 :                         tmp2 = div_s( 16384, tmp2 ); /*Q(15+14-exp=29-exp) */
     657           0 :                         exp = sub( 29, exp );
     658             :                     }
     659             :                     ELSE
     660             :                     {
     661             :                         /*when the divisor is zero, happens rarely*/
     662           0 :                         tmp2 = 0x7fff;
     663           0 :                         move16();
     664           0 :                         exp = 0;
     665           0 :                         move16();
     666             :                     }
     667           0 :                     L_tmp = L_shl_sat( Mult_32_16( Ep_tmp_fx[i], tmp2 ), sub( 19, exp ) ); /*Q(13+exp-15 +19-exp +3 = 20) */
     668           0 :                     L_tmp = Mult_32_16( L_tmp, shl( sub( bands_fx, lowband ), 9 ) );       /*20 +9 -15 =Q14 */
     669           0 :                     L_tmp = L_max( L_tmp, 13926 );                                         /*Q14 */
     670           0 :                     tmp2 = extract_l( L_min( L_tmp, 16384 ) );                             /*Q14 */
     671           0 :                     alpha_fx = shl( mult( alpha_fx, tmp2 ), 1 );                           /*14+14-15+1 =Q14 */
     672             :                 }
     673           0 :                 L_band_energy_tmp[i] = L_shl( Mult_32_16( L_band_energy_tmp[i], alpha_fx ), 1 ); /*Q(Q_band_energy+14-15 +1= Q_band_energy) */
     674           0 :                 move32();
     675             :             }
     676             :         }
     677           0 :         lowband = 3;
     678           0 :         move16();
     679           0 :         Ep_avrg_fx = L_deposit_l( 0 );
     680           0 :         Ep_avrgL_fx = L_deposit_l( 0 );
     681           0 :         Ep_peak_fx = L_deposit_l( 0 );
     682           0 :         FOR( i = 0; i < bands_fx; i++ )
     683             :         {
     684           0 :             IF( GE_16( i, lowband ) )
     685             :             {
     686           0 :                 Ep_avrg_fx = L_add_sat( Ep_avrg_fx, Ep_tmp_fx[i] ); /*Q15 */
     687             :             }
     688             :             ELSE
     689             :             {
     690           0 :                 Ep_avrgL_fx = L_add_sat( Ep_avrgL_fx, L_shr( Ep_tmp_fx[i], 1 ) ); /*Q12 */
     691           0 :                 IF( GT_32( Ep_tmp_fx[i], Ep_peak_fx ) )
     692             :                 {
     693           0 :                     Ep_peak_fx = L_add( Ep_tmp_fx[i], 0 ); /*Q13 */
     694             :                 }
     695             :             }
     696             :         }
     697           0 :         L_tmp = Mult_32_16( Ep_peak_fx, 28262 );   /*Q(13+14-15 = 12) 1.725 lowband = 3; */
     698           0 :         L_tmp2 = Mult_32_16( Ep_avrgL_fx, 24576 ); /*Q(12+14-15 = 11) */
     699           0 :         test();
     700           0 :         test();
     701           0 :         IF( GT_32( L_shr( Ep_avrg_fx, 2 ), L_tmp2 ) && LT_32( L_shr( Ep_avrg_fx, 4 ), L_tmp2 ) && GT_32( L_tmp, Ep_avrgL_fx ) )
     702             :         {
     703           0 :             adjustFlag = 1;
     704           0 :             move16();
     705           0 :             FOR( i = 0; i < lowband; i++ )
     706             :             {
     707           0 :                 tmp = extract_h( Ep_avrgL_fx ); /*Q-4 */
     708           0 :                 IF( tmp != 0 )
     709             :                 {
     710           0 :                     exp = norm_s( tmp );
     711           0 :                     tmp = shl( tmp, exp );     /*Q(exp) */
     712           0 :                     tmp = div_s( 16384, tmp ); /*Q(15+14-exp=29-exp) */
     713           0 :                     exp = sub( 29, exp );
     714             :                 }
     715             :                 ELSE
     716             :                 {
     717             :                     /*when the divisor is zero, happens rarely*/
     718           0 :                     tmp = 0x7fff;
     719           0 :                     move16();
     720           0 :                     exp = 0;
     721           0 :                     move16();
     722             :                 }
     723           0 :                 L_tmp = Mult_32_16( Ep_peak_fx, tmp );            /*Q(13+exp-15+4 = exp+2) */
     724           0 :                 L_tmp = Mult_32_16( L_tmp, lowband );             /*Q(exp+2+0-15 = exp-13) */
     725           0 :                 L_tmp = Mult_32_16( L_tmp, 18842 );               /*Q(exp-13+16-16 = exp-13) */
     726           0 :                 L_tmp = L_shl( L_tmp, sub( 27, exp ) );           /*Q14 0.5 */
     727           0 :                 tmp2 = extract_l( L_min( L_tmp, 19661 ) );        /*Q14 */
     728           0 :                 L_tmp = Mult_32_16( L_band_energy_tmp[i], tmp2 ); /*Q(Q_band_energy+14-15 = Q_band_energy-1) */
     729           0 :                 L_band_energy_tmp[i] = L_shl( L_tmp, 1 );         /*Q_band_energy  */
     730             :             }
     731             :         }
     732           0 :         hq2_bit_alloc_fx( L_band_energy_tmp, bands_fx, L_Rk, &bit_budget_fx, p2a_flags_fx, bit_alloc_weight_fx, band_width,
     733           0 :                           *num_bits_fx, hqswb_clas_fx, st_fx->bwidth, is_transient_fx );
     734             : 
     735             :         /* encode the last p2a_bands-1 subbands bit-allocation index of the previous frame */
     736           0 :         FOR( i = 0; i < 2; i++ )
     737             :         {
     738           0 :             push_indice( st_fx->hBstr, IND_HQ2_LAST_BA_MAX_BAND, hHQ_core->last_bitalloc_max_band[i], 1 );
     739             :         }
     740             :     }
     741          39 :     ELSE IF( is_transient_fx == 0 && EQ_16( inner_frame_fx, L_FRAME16k ) )
     742             :     {
     743           0 :         bit_budget_fx = sub( bit_budget_fx, 2 ); /* bits in high bands to indicate the last 2 subbands is allocated bits or not Q0*/
     744           0 :         FOR( i = 0; i < bands_fx; i++ )
     745             :         {
     746           0 :             Ep_tmp_fx[i] = L_shl_sat( Ep_tmp_fx[i], 2 ); /* Q15 */
     747           0 :             move32();
     748             :         }
     749           0 :         IF( EQ_32( st_fx->core_brate, ACELP_13k20 ) )
     750             :         {
     751           0 :             lowband = 8;
     752           0 :             move16();
     753           0 :             highband = 15;
     754           0 :             move16();
     755           0 :             bw_low = sub( band_start[highband], band_start[lowband] );                   /* Q0 */
     756           0 :             bw_high = sub( add( band_end[( bands_fx - 1 )], 1 ), band_start[highband] ); /* Q0 */
     757             :         }
     758             :         ELSE
     759             :         {
     760           0 :             lowband = 8;
     761           0 :             move16();
     762           0 :             highband = 16;
     763           0 :             move16();
     764           0 :             bw_low = sub( band_start[highband], band_start[lowband] );                   /* Q0 */
     765           0 :             bw_high = sub( add( band_end[( bands_fx - 1 )], 1 ), band_start[highband] ); /* Q0 */
     766             :         }
     767             :         /* calculate the the low band/high band energy and the variance/avrage of the envelopes */
     768           0 :         enerL_fx = L_deposit_l( 0 );
     769           0 :         enerH_fx = L_deposit_l( 0 );
     770           0 :         Ep_vari_fx = L_deposit_l( 0 );
     771           0 :         Ep_avrg_fx = L_deposit_l( 0 );
     772           0 :         FOR( i = 0; i < bands_fx; i++ )
     773             :         {
     774           0 :             test();
     775           0 :             IF( GE_16( i, lowband ) && add( sub( i, bands_fx ), p2a_bands_fx ) < 0 )
     776             :             {
     777           0 :                 Ep_vari_fx = L_add_sat( Ep_vari_fx, L_abs( L_sub_sat( Ep_tmp_fx[i], Ep_tmp_fx[( i - 1 )] ) ) ); /*Q15 */
     778           0 :                 Ep_avrg_fx = L_add_sat( Ep_avrg_fx, Ep_tmp_fx[i] );                                             /*Q15 */
     779             :             }
     780             : 
     781           0 :             IF( GE_16( i, highband ) )
     782             :             {
     783           0 :                 enerH_fx = L_add_sat( enerH_fx, L_shl_sat( Ep_fx[i], 2 ) ); /*Q0 */
     784             :             }
     785           0 :             ELSE IF( GE_16( i, lowband ) )
     786             :             {
     787           0 :                 enerL_fx = L_add_sat( enerL_fx, L_shl_sat( Ep_fx[i], 2 ) ); /*Q0 */
     788             :             }
     789             :         }
     790             : 
     791             :         /* modify the last p2a_bands subbands band_energies */
     792           0 :         Copy32( L_band_energy, L_band_energy_tmp, bands_fx ); /*Q_band_energy */
     793           0 :         L_tmp = L_max( enerH_fx, enerL_fx );
     794           0 :         tmp = s_max( bw_low, bw_high );
     795           0 :         i = norm_l( L_tmp );
     796           0 :         j = norm_s( tmp );
     797           0 :         L_tmp = Mult_32_16( L_shl( enerH_fx, i ), shl( bw_low, j ) );   /* i + j -15 */
     798           0 :         L_tmp2 = Mult_32_16( L_shl( enerL_fx, i ), shl( bw_high, j ) ); /*i + j -15 */
     799           0 :         L_tmp2 = L_sub( L_tmp, L_tmp2 );
     800           0 :         FOR( i = ( bands_fx - p2a_bands_fx ); i < bands_fx; i++ )
     801             :         {
     802           0 :             test();
     803           0 :             IF( EQ_16( p2a_flags_fx[i], 1 ) || L_tmp2 > 0 )
     804             :             {
     805           0 :                 tmp = sub( bands_fx, p2a_bands_fx );
     806           0 :                 tmp = sub( tmp, lowband ); /*Q0 */
     807             : 
     808           0 :                 tmp1 = extract_h( L_shl_sat( Ep_avrg_fx, 1 ) ); /*Q0 */
     809           0 :                 IF( tmp1 != 0 )
     810             :                 {
     811           0 :                     exp = norm_s( tmp1 );
     812           0 :                     tmp1 = shl( tmp1, exp );     /*Q(exp) */
     813           0 :                     tmp1 = div_s( 16384, tmp1 ); /*Q(15+14-exp = 29-exp) */
     814           0 :                     exp = sub( 29, exp );
     815             :                 }
     816             :                 ELSE
     817             :                 {
     818           0 :                     tmp1 = 0x7fff;
     819           0 :                     move16();
     820           0 :                     exp = 0;
     821           0 :                     move16();
     822             :                 }
     823           0 :                 L_tmp = Mult_32_16( Ep_tmp_fx[i], tmp1 );             /*Q(15+exp-15 = exp) */
     824           0 :                 L_tmp = Mult_32_16( L_tmp, tmp );                     /*Q(exp+0-15 = exp-15) */
     825           0 :                 L_tmp = Mult_32_16( L_tmp, 16384 );                   /*Q(exp-15+13-15 = exp-17) */
     826           0 :                 L_tmp = L_shl( L_tmp, sub( 32, exp ) );               /*Q15 */
     827           0 :                 tmp = extract_l( L_min( L_tmp, 6554 ) );              /*Q15 */
     828           0 :                 L_tmp = Mult_32_16( Ep_vari_fx, tmp1 );               /*Q(15+exp-15 = exp) */
     829           0 :                 L_tmp = Mult_32_16( L_tmp, tmp );                     /*Q(exp+15-15 = exp) */
     830           0 :                 L_tmp = L_shl( L_tmp, sub( 15, exp ) );               /*Q15 */
     831           0 :                 tmp = extract_l( L_shr( L_min( L_tmp, 13107 ), 1 ) ); /*Q14 */
     832           0 :                 alpha_fx = add( tmp, 16384 );                         /*Q14 */
     833             :             }
     834             :             ELSE
     835             :             {
     836           0 :                 alpha_fx = 16384; /*Q14 */
     837           0 :                 move16();
     838             :             }
     839             : 
     840           0 :             IF( add( sub( i, bands_fx ), p2a_bands_fx ) > 0 )
     841             :             {
     842           0 :                 tmp = sub( bands_fx, p2a_bands_fx );
     843           0 :                 IF( EQ_16( hHQ_core->last_bitalloc_max_band[sub( i, add( tmp, 1 ) )], 1 ) )
     844             :                 {
     845           0 :                     tmp = sub( tmp, lowband );
     846           0 :                     L_tmp = Mult_32_16( Ep_tmp_fx[i], tmp );   /*Q(15+0-15 = 0) */
     847           0 :                     tmp = extract_h( L_shl_sat( L_tmp, 16 ) ); /*Q0 */
     848           0 :                     IF( tmp != 0 )
     849             :                     {
     850           0 :                         exp = norm_s( tmp );
     851           0 :                         tmp = shl( tmp, exp );     /*Q(exp) */
     852           0 :                         tmp = div_s( 16384, tmp ); /*Q(15+14-exp=29-exp) */
     853           0 :                         exp = sub( 29, exp );
     854             :                     }
     855             :                     ELSE
     856             :                     {
     857           0 :                         tmp = 0x7fff;
     858           0 :                         move16();
     859           0 :                         exp = 0;
     860           0 :                         move16();
     861             :                     }
     862           0 :                     L_tmp = Mult_32_16( Ep_avrg_fx, tmp );                    /*Q(15+exp-15 = exp) */
     863           0 :                     L_tmp = L_shl( L_tmp, sub( 14, exp ) );                   /*Q14 */
     864           0 :                     tmp = extract_l( L_min( L_max( L_tmp, 16384 ), 20480 ) ); /*Q14 */
     865           0 :                     L_tmp = L_mult( alpha_fx, tmp );                          /*Q(14+14+1=29) */
     866           0 :                     alpha_fx = extract_l( L_shr( L_tmp, 15 ) );               /*Q14                    */
     867             :                 }
     868             :                 ELSE
     869             :                 {
     870           0 :                     tmp = sub( tmp, lowband );
     871             : 
     872           0 :                     tmp1 = extract_h( L_shl_sat( Ep_avrg_fx, 1 ) ); /*Q0 */
     873           0 :                     IF( tmp1 != 0 )
     874             :                     {
     875           0 :                         exp = norm_s( tmp1 );
     876           0 :                         tmp1 = shl( tmp1, exp );     /*Q(exp) */
     877           0 :                         tmp1 = div_s( 16384, tmp1 ); /*Q(15+14-exp=29-exp) */
     878           0 :                         exp = sub( 29, exp );
     879             :                     }
     880             :                     ELSE
     881             :                     {
     882           0 :                         tmp1 = 0x7fff;
     883           0 :                         move16();
     884           0 :                         exp = 0;
     885           0 :                         move16();
     886             :                     }
     887           0 :                     L_tmp = Mult_32_16( Ep_tmp_fx[i], tmp1 );                 /*Q(15+exp-15 = exp) */
     888           0 :                     L_tmp = Mult_32_16( L_tmp, tmp );                         /*Q(exp+0-15 = exp-15) */
     889           0 :                     L_tmp = L_shl( L_tmp, sub( 29, exp ) );                   /*Q14 */
     890           0 :                     tmp = extract_l( L_min( L_max( L_tmp, 13926 ), 16384 ) ); /*Q14 */
     891           0 :                     L_tmp = L_mult( alpha_fx, tmp );                          /*Q(14+14+1=29) */
     892           0 :                     alpha_fx = extract_l( L_shr( L_tmp, 15 ) );               /*Q14  */
     893             :                 }
     894             :             }
     895           0 :             L_tmp = Mult_32_16( L_band_energy_tmp[i], alpha_fx ); /*Q(Q_band_energy+14-15=Q_band_energy-1) */
     896           0 :             L_band_energy_tmp[i] = L_shl( L_tmp, 1 );             /*Q Q_band_energy */
     897           0 :             move32();
     898             :         }
     899           0 :         lowband = 6;
     900           0 :         move16();
     901           0 :         Ep_avrg_fx = L_deposit_l( 0 );
     902           0 :         Ep_avrgL_fx = L_deposit_l( 0 );
     903           0 :         Ep_peak_fx = L_deposit_l( 0 );
     904           0 :         FOR( i = 0; i < bands_fx; i++ )
     905             :         {
     906           0 :             IF( GE_16( i, lowband ) )
     907             :             {
     908           0 :                 Ep_avrg_fx = L_add_sat( Ep_avrg_fx, Ep_tmp_fx[i] ); /*Q15 */
     909             :             }
     910             :             ELSE
     911             :             {
     912           0 :                 Ep_avrgL_fx = L_add_sat( Ep_avrgL_fx, Ep_tmp_fx[i] ); /*Q15 */
     913           0 :                 IF( GT_32( Ep_tmp_fx[i], Ep_peak_fx ) )
     914             :                 {
     915           0 :                     Ep_peak_fx = L_add( Ep_tmp_fx[i], 0 ); /*Q15 */
     916             :                 }
     917             :             }
     918             :         }
     919             : 
     920           0 :         L_tmp = Mult_32_16( Ep_peak_fx, 24576 );   /*Q(15+12-15 = 12) lowband = 6; */
     921           0 :         L_tmp2 = Mult_32_16( Ep_peak_fx, 19661 );  /*Q(15+14-15 = 14) */
     922           0 :         L_tmp3 = Mult_32_16( Ep_avrgL_fx, 24576 ); /*Q(15+12-15 = 12) */
     923             : 
     924           0 :         test();
     925           0 :         test();
     926           0 :         test();
     927           0 :         test();
     928           0 :         test();
     929           0 :         IF( ( GT_32( L_shr( Ep_avrgL_fx, 1 ), Ep_avrg_fx ) && GT_32( L_tmp, L_shr( Ep_avrgL_fx, 2 ) ) && LT_32( L_shr( Ep_avrgL_fx, 1 ), L_tmp2 ) ) ||
     930             :             ( GT_32( L_shr( Ep_avrg_fx, 1 ), Ep_avrgL_fx ) && LT_32( L_shr( Ep_avrg_fx, 3 ), L_tmp3 ) && GT_32( L_tmp, L_shr( Ep_avrgL_fx, 2 ) ) ) )
     931             :         {
     932           0 :             adjustFlag = 1;
     933           0 :             move16();
     934           0 :             FOR( i = 0; i < lowband; i++ )
     935             :             {
     936           0 :                 tmp = extract_h( L_shl_sat( Ep_avrgL_fx, 1 ) ); /*Q0 */
     937           0 :                 IF( tmp != 0 )
     938             :                 {
     939           0 :                     exp = norm_s( tmp );
     940           0 :                     tmp = shl( tmp, exp );     /*Q(exp) */
     941           0 :                     tmp = div_s( 16384, tmp ); /*Q(15+14-exp=29-exp) */
     942           0 :                     exp = sub( 29, exp );
     943             :                 }
     944             :                 ELSE
     945             :                 {
     946           0 :                     tmp = 0x7fff;
     947           0 :                     move16();
     948           0 :                     exp = 0;
     949           0 :                     move16();
     950             :                 }
     951           0 :                 L_tmp = Mult_32_16( Ep_peak_fx, tmp );           /*Q(15+exp-15 = exp) */
     952           0 :                 L_tmp = Mult_32_16( L_tmp, lowband );            /*Q(exp+0-15 = exp-15) */
     953           0 :                 L_tmp = L_shl( L_tmp, sub( 28, exp ) );          /*Q14 0.5 */
     954           0 :                 tmp = extract_l( L_min( L_tmp, 19661 ) );        /*//Q14 */
     955           0 :                 L_tmp = Mult_32_16( L_band_energy_tmp[i], tmp ); /*Q(Q_band_energy+14-15 = Q_band_energy-1) */
     956           0 :                 L_band_energy_tmp[i] = L_shl( L_tmp, 1 );        /*Q_band_energy  */
     957           0 :                 move32();
     958             :             }
     959             :         }
     960             : 
     961           0 :         hq2_bit_alloc_fx( L_band_energy_tmp, bands_fx, L_Rk, &bit_budget_fx, p2a_flags_fx, bit_alloc_weight_fx, band_width,
     962           0 :                           *num_bits_fx, hqswb_clas_fx, st_fx->bwidth, is_transient_fx );
     963             : 
     964             :         /* encode the last p2a_bands-1 subbands bit-allocation index of the previous frame */
     965           0 :         FOR( i = 0; i < 2; i++ )
     966             :         {
     967           0 :             push_indice( st_fx->hBstr, IND_HQ2_LAST_BA_MAX_BAND, hHQ_core->last_bitalloc_max_band[i], 1 );
     968             :         }
     969             :     }
     970          39 :     ELSE IF( EQ_16( st_fx->bwidth, SWB ) && EQ_16( hqswb_clas_fx, HQ_HARMONIC ) && ( EQ_32( L_bwe_br, HQ_16k40 ) || EQ_32( L_bwe_br, HQ_13k20 ) ) )
     971             :     {
     972             :         /* bit allocation for harmonic mode */
     973           0 :         hq2_bit_alloc_har_fx( L_band_energy, bit_budget_fx, bands_fx, L_Rk, p2a_bands_fx, L_bwe_br, p2a_flags_fx, band_width );
     974             :     }
     975             :     ELSE
     976             :     {
     977             : 
     978             :         /* estimate number of bits per band */
     979          39 :         hq2_bit_alloc_fx(
     980             :             L_band_energy, bands_fx, L_Rk, &bit_budget_fx, p2a_flags_fx, bit_alloc_weight_fx, band_width,
     981          39 :             *num_bits_fx, hqswb_clas_fx, st_fx->bwidth, is_transient_fx );
     982             :     }
     983             : 
     984          39 :     tcq_core_LR_enc_fx( hBstr, /*st_fx->idchan, */ inp_vector_fx, /*t_audio, */ L_t_audio, /*y2, */ L_y2, bit_budget_fx, bands_fx, band_start, band_end, band_width, /*Rk*/ L_Rk, npulses_fx, k_sort_fx,
     985          39 :                         p2a_flags_fx, p2a_bands_fx, hHQ_core->last_bitalloc_max_band, inner_frame_fx, adjustFlag, is_transient_fx );
     986             : 
     987          39 :     test();
     988          39 :     test();
     989          39 :     IF( ( EQ_16( inner_frame_fx, L_FRAME8k ) && LE_32( st_fx->core_brate, ACELP_13k20 ) ) || EQ_16( inner_frame_fx, L_FRAME16k ) )
     990             :     {
     991           0 :         j = 0;
     992           0 :         move16();
     993           0 :         FOR( i = 2; i > 0; i-- )
     994             :         {
     995           0 :             IF( npulses_fx[bands_fx - i] > 0 )
     996             :             {
     997           0 :                 hHQ_core->last_bitalloc_max_band[j] = 1; /* Q0 */
     998           0 :                 move16();
     999             :             }
    1000             :             ELSE
    1001             :             {
    1002           0 :                 hHQ_core->last_bitalloc_max_band[j] = 0; /* Q0 */
    1003           0 :                 move16();
    1004             :             }
    1005           0 :             j += 1;
    1006             :         }
    1007             :     }
    1008             : 
    1009             :     /* Denormalize the coded MDCT spectrum */
    1010          39 :     mdct_spectrum_denorm_fx( inp_vector_fx, L_y2, band_start, band_end, band_width, L_band_energy, npulses_fx, bands_fx, ld_slope_fx, pd_thresh_fx );
    1011             : 
    1012             :     /* Apply fine gain quantization to denormalized coded spectrum */
    1013          39 :     mdct_spectrum_fine_gain_enc_fx( st_fx, L_t_audio, L_y2, band_start, band_end, k_sort_fx, bands_fx,
    1014             :                                     L_qint, Ngq_fx, gqlevs_fx, gqbits_fx );
    1015             : 
    1016             : 
    1017             :     /* Restore the band information */
    1018          39 :     IF( EQ_16( flag_spt_fx, 1 ) )
    1019             :     {
    1020          38 :         spt_shorten_domain_band_restore_fx( bands_fx, band_start, band_end, band_width, org_band_start, org_band_end, org_band_width );
    1021             :     }
    1022             : 
    1023             :     /* Inject noise into components having relatively low pulse energy per band */
    1024          39 :     ni_seed_fx = add( add( add( npulses_fx[0], npulses_fx[1] ), npulses_fx[2] ), npulses_fx[3] );
    1025             : 
    1026          39 :     Copy32( L_y2, L_y2_ni, band_end[bands_fx - 1] + 1 ); /* Q12 */
    1027          39 :     hq2_noise_inject_fx( L_y2_ni, band_start, band_end, band_width, Ep_fx, L_Rk, npulses_fx, ni_seed_fx, bands_fx, 0, bw_low, bw_high, enerL_fx, enerH_fx,
    1028          39 :                          hHQ_core->last_ni_gain_fx, hHQ_core->last_env_fx, &hHQ_core->last_max_pos_pulse, p2a_flags_fx, p2a_bands_fx,
    1029          39 :                          hqswb_clas_fx, st_fx->bwidth, L_bwe_br );
    1030             : 
    1031          39 :     test();
    1032          39 :     test();
    1033          39 :     IF( EQ_16( st_fx->bwidth, SWB ) && ( EQ_32( L_bwe_br, HQ_16k40 ) || EQ_32( L_bwe_br, HQ_13k20 ) ) )
    1034             :     {
    1035          39 :         test();
    1036          39 :         IF( EQ_16( hqswb_clas_fx, HQ_NORMAL ) || EQ_16( hqswb_clas_fx, HQ_HARMONIC ) )
    1037             :         {
    1038          38 :             preset_hq2_swb_fx( hqswb_clas_fx, band_end, &har_bands_fx, p2a_bands_fx, length_fx, bands_fx, &lowlength_fx, &highlength_fx, L_m );
    1039             : 
    1040          38 :             swb_bwe_enc_lr_fx( st_fx, L_y2, SWB_BWE_LR_Qs, L_t_audio, L_m, L_bwe_br,
    1041             :                                bands_fx, band_start, band_end, L_band_energy, SWB_BWE_LR_Qbe, p2a_flags_fx, hqswb_clas_fx, lowlength_fx, highlength_fx,
    1042          38 :                                hHQ_core->prev_frm_index, har_bands_fx, &hHQ_core->prev_frm_hfe2, &hHQ_core->prev_stab_hfe2, band_width, L_y2_ni, &ni_seed_fx );
    1043             : 
    1044          38 :             post_hq2_swb_fx( L_m, lowlength_fx, highlength_fx, hqswb_clas_fx, har_bands_fx, bands_fx, p2a_flags_fx, band_start, band_end, L_y2, npulses_fx );
    1045             : 
    1046          38 :             IF( EQ_16( hqswb_clas_fx, HQ_NORMAL ) )
    1047             :             {
    1048          38 :                 spt_swb_peakpos_tmp_save_fx( L_y2, bands_fx, band_start, band_end, prev_SWB_peak_pos_tmp_fx );
    1049         190 :                 FOR( k = 0; k < SPT_SHORTEN_SBNUM; k++ )
    1050             :                 {
    1051         152 :                     test();
    1052         152 :                     IF( p2a_flags_fx[bands_fx - SPT_SHORTEN_SBNUM + k] == 0 || npulses_fx[bands_fx - SPT_SHORTEN_SBNUM + k] == 0 )
    1053             :                     {
    1054         147 :                         prev_SWB_peak_pos_tmp_fx[k] = 0;
    1055         147 :                         move16();
    1056             :                     }
    1057             :                 }
    1058             :             }
    1059          38 :             Copy32( L_y2_ni, L_y2, lowlength_fx ); /* Q12 */
    1060             :         }
    1061             :         ELSE
    1062             :         {
    1063           1 :             Copy32( L_y2_ni, L_y2, add( band_end[bands_fx - 1], 1 ) ); /* HQ_TRANSIENT Q12*/
    1064             :         }
    1065             :     }
    1066             : 
    1067          39 :     updat_prev_frm_fx( L_y2, L_t_audio, L_bwe_br, length_fx, inner_frame_fx, bands_fx, st_fx->bwidth, is_transient_fx, hqswb_clas_fx, &hHQ_core->prev_hqswb_clas,
    1068          39 :                        hHQ_core->prev_SWB_peak_pos, prev_SWB_peak_pos_tmp_fx, &hHQ_core->prev_frm_hfe2, &hHQ_core->prev_stab_hfe2, 0 );
    1069             : 
    1070          39 :     IF( NE_16( st_fx->bwidth, SWB ) )
    1071             :     {
    1072             :         /* reset HQ classifier memories */
    1073           0 :         hHQ_core->mode_count = 0;
    1074           0 :         move16();
    1075           0 :         hHQ_core->mode_count1 = 0;
    1076           0 :         move16();
    1077             :     }
    1078             : 
    1079          39 :     test();
    1080          39 :     test();
    1081          39 :     test();
    1082          39 :     IF( NE_16( hqswb_clas_fx, HQ_HARMONIC ) && ( EQ_32( L_bwe_br, HQ_16k40 ) || EQ_32( L_bwe_br, HQ_13k20 ) ) && EQ_16( st_fx->bwidth, SWB ) )
    1083             :     {
    1084          39 :         hHQ_core->prev_frm_index[0] = -1;
    1085          39 :         move16();
    1086          39 :         hHQ_core->prev_frm_index[1] = -1;
    1087          39 :         move16();
    1088             :     }
    1089             : 
    1090             :     /* update number of unused bits */
    1091          39 :     *num_bits_fx = 0;
    1092          39 :     move16();
    1093             : 
    1094          39 :     hHQ_core->hvq_hangover = 0;
    1095          39 :     move16();
    1096             : 
    1097          39 :     return;
    1098             : }
    1099             : 
    1100           0 : void hq_lr_enc_ivas_fx(
    1101             :     Encoder_State *st,        /* i/o: encoder state structure             */
    1102             :     Word32 L_t_audio[],       /* i/o: transform-domain coefs.             Q12*/
    1103             :     const Word16 inner_frame, /* i  : inner frame length                  Q0*/
    1104             :     Word16 *num_bits,         /* i/o: number of available bits            Q0*/
    1105             :     const Word16 is_transient /* i  : transient flag                      Q0*/
    1106             : )
    1107             : {
    1108             :     Word16 i;
    1109             :     Word16 bit_budget, pbits;
    1110             :     Word16 bands, length, ni_seed, gqlevs, gqbits, Ngq, p2a_bands;
    1111             :     Word16 p2a_flags[BANDS_MAX];
    1112             :     Word16 band_start[BANDS_MAX], band_end[BANDS_MAX], band_width[BANDS_MAX];
    1113             :     Word32 L_band_energy[BANDS_MAX];
    1114             :     Word16 ebits_fx;
    1115             : 
    1116             :     Word32 Rk_fx[BANDS_MAX];
    1117             :     Word16 k1_step_fx, k2_step_fx;
    1118             :     Word16 k1_fx, k2_fx;
    1119             : 
    1120             :     Word32 L_qint;              /* Q29 */
    1121             :     Word16 eref_fx;             /* Q10 */
    1122             :     Word16 bit_alloc_weight_fx; /* Q13 */
    1123             :     Word16 k_sort[BANDS_MAX];
    1124             :     Word16 npulses[BANDS_MAX];
    1125             :     Word32 inp_vector[L_FRAME48k];
    1126             : 
    1127             :     Word16 ld_slope_fx /*, Qldslope=15*/;
    1128             :     Word16 p2a_th_fx /*, Qp2ath=11*/;
    1129             :     Word16 pd_thresh_fx /*, Qpdth=15*/;
    1130             :     Word16 ni_coef_fx /*, Qnicoef=14*/;
    1131             : 
    1132             :     Word32 L_y2[L_FRAME48k];
    1133             :     Word32 L_y2_ni[L_FRAME48k];
    1134             : 
    1135             :     Word16 hqswb_clas;
    1136             :     Word16 lowlength;
    1137             :     Word16 highlength;
    1138             :     Word16 exp_norm;
    1139             :     Word32 L_m[L_FRAME32k];
    1140             : 
    1141             :     Word16 har_bands;
    1142             : 
    1143           0 :     Word16 lowband, highband, bw_low = 0, bw_high = 20;
    1144           0 :     move16();
    1145           0 :     move16();
    1146             : 
    1147             :     Word32 bwe_br;
    1148             :     Word16 trans_bit, p2a_flags_tmp[BANDS_MAX];
    1149           0 :     Word16 adjustFlag = 0;
    1150           0 :     move16();
    1151             :     Word16 prev_SWB_peak_pos_tmp[SPT_SHORTEN_SBNUM];
    1152             :     Word16 k, j;
    1153             :     Word16 flag_spt;
    1154             :     Word16 org_band_start[SPT_SHORTEN_SBNUM];
    1155             :     Word16 org_band_end[SPT_SHORTEN_SBNUM];
    1156             :     Word16 org_band_width[SPT_SHORTEN_SBNUM];
    1157             :     Word16 new_band_start[SPT_SHORTEN_SBNUM];
    1158             :     Word16 new_band_end[SPT_SHORTEN_SBNUM];
    1159             :     Word16 new_band_width[SPT_SHORTEN_SBNUM];
    1160           0 :     Word16 bws_cnt = 0;
    1161           0 :     move16();
    1162             :     Word32 L_tmp, L_tmp2, L_tmp3;
    1163             :     Word16 exp, tmp, exp2, tmp1, tmp2, tmp3, alpha_fx, frac1;
    1164             :     Word32 enerH_fx;
    1165             :     Word32 enerL_fx;
    1166             :     Word32 Ep_fx[BANDS_MAX];
    1167             :     Word32 Ep_avrg_fx, Ep_vari_fx;
    1168             :     Word32 Ep_avrgL_fx;
    1169             :     Word32 Ep_peak_fx;
    1170             :     Word32 Ep_tmp_fx[BANDS_MAX];
    1171             :     Word16 gama_fx; /*Q15 0.85f; */
    1172             :     Word16 beta_fx; /*Q14 1.05f; */
    1173             :     Word32 L_band_energy_tmp[BANDS_MAX];
    1174             :     UWord16 lo;
    1175             :     Word16 Q_band_energy;
    1176           0 :     BSTR_ENC_HANDLE hBstr = st->hBstr;
    1177           0 :     HQ_ENC_HANDLE hHQ_core = st->hHQ_core;
    1178             : 
    1179           0 :     set32_fx( L_y2, 0x0L, L_FRAME48k );
    1180           0 :     set32_fx( inp_vector, 0, inner_frame );
    1181           0 :     flag_spt = 0;
    1182           0 :     move16();
    1183           0 :     set16_fx( prev_SWB_peak_pos_tmp, 0, SPT_SHORTEN_SBNUM );
    1184           0 :     adjustFlag = 0;
    1185           0 :     move16();
    1186           0 :     bw_low = 0;
    1187           0 :     move16();
    1188           0 :     bw_high = 20;
    1189           0 :     move16();
    1190           0 :     enerL_fx = L_deposit_l( 0 );
    1191           0 :     enerH_fx = L_deposit_l( 0 );
    1192             : 
    1193             : 
    1194           0 :     bwe_br = st->core_brate;
    1195           0 :     hqswb_clas = HQ_NORMAL;
    1196           0 :     move16();
    1197             : 
    1198           0 :     test();
    1199           0 :     test();
    1200           0 :     IF( EQ_16( st->bwidth, SWB ) && ( EQ_32( bwe_br, HQ_16k40 ) || EQ_32( bwe_br, HQ_13k20 ) ) )
    1201             :     {
    1202           0 :         IF( EQ_16( is_transient, 1 ) )
    1203             :         {
    1204           0 :             hqswb_clas = HQ_TRANSIENT; /* Q0 */
    1205           0 :             move16();
    1206             :         }
    1207             :         ELSE
    1208             :         {
    1209           0 :             hqswb_clas = peak_avrg_ratio_fx( st->total_brate, L_t_audio, NUMC_N, &hHQ_core->mode_count, &hHQ_core->mode_count1, SWB_BWE_LR_Qs ); /* Q0 */
    1210             :         }
    1211             : 
    1212             :         /* write the classification information into the bitstream */
    1213           0 :         push_indice( hBstr, IND_HQ2_SWB_CLAS, hqswb_clas, 2 );
    1214           0 :         ( *num_bits ) = sub( *num_bits, 2 );
    1215           0 :         move16();
    1216           0 :         IF( EQ_16( hqswb_clas, HQ_NORMAL ) )
    1217             :         {
    1218           0 :             flag_spt = 1;
    1219           0 :             move16();
    1220             :         }
    1221             :     }
    1222             :     ELSE
    1223             :     {
    1224             :         /* write the transient bit into the bitstream */
    1225           0 :         push_indice( st->hBstr, IND_HQ2_SWB_CLAS, is_transient, 1 );
    1226             : 
    1227             :         /* subtract one bit for the transient flag */
    1228           0 :         ( *num_bits ) = sub( *num_bits, 1 );
    1229           0 :         move16();
    1230             :     }
    1231             : 
    1232             :     /* Configure encoder for different bandwidths, bitrates, etc. */
    1233             : 
    1234           0 :     hq2_core_configure_fx( inner_frame, *num_bits, is_transient, &bands, &length, band_width, band_start, band_end,
    1235             :                            &L_qint, &eref_fx, &bit_alloc_weight_fx, &gqlevs, &Ngq, &p2a_bands, &p2a_th_fx, &pd_thresh_fx, &ld_slope_fx, &ni_coef_fx, bwe_br );
    1236             : 
    1237             : 
    1238           0 :     highlength = band_end[( bands - 1 )]; /* Q0 */
    1239           0 :     move16();
    1240           0 :     har_bands = bands; /* Q0 */
    1241           0 :     move16();
    1242             : 
    1243             : 
    1244           0 :     test();
    1245           0 :     test();
    1246           0 :     test();
    1247           0 :     IF( EQ_16( st->bwidth, SWB ) && is_transient == 0 && ( EQ_32( bwe_br, HQ_16k40 ) || EQ_32( bwe_br, HQ_13k20 ) ) )
    1248             :     {
    1249             :         /* reserve bits for HQ_NORMAL2 and HQ_HARMONIC modes */
    1250           0 :         test();
    1251           0 :         IF( EQ_16( hqswb_clas, HQ_NORMAL ) || EQ_16( hqswb_clas, HQ_HARMONIC ) )
    1252             :         {
    1253           0 :             ( *num_bits ) = sub( *num_bits, get_usebit_npswb_fx( hqswb_clas ) );
    1254           0 :             move16();
    1255             :         }
    1256             :     }
    1257             : 
    1258           0 :     test();
    1259           0 :     test();
    1260           0 :     IF( ( EQ_32( bwe_br, HQ_16k40 ) || EQ_32( bwe_br, HQ_13k20 ) ) && EQ_16( st->bwidth, SWB ) )
    1261             :     {
    1262           0 :         IF( NE_16( hHQ_core->prev_hqswb_clas, HQ_NORMAL ) )
    1263             :         {
    1264           0 :             j = 0;
    1265           0 :             move16();
    1266           0 :             FOR( k = ( bands - SPT_SHORTEN_SBNUM ); k < bands; k++ )
    1267             :             {
    1268           0 :                 hHQ_core->prev_SWB_peak_pos[j] = 0;
    1269           0 :                 move16();
    1270           0 :                 j += 1;
    1271             :             }
    1272             :         }
    1273             :     }
    1274             : 
    1275           0 :     test();
    1276           0 :     IF( GT_16( inner_frame, length ) && is_transient )
    1277             :     {
    1278             :         /* If so, collapse transient frame (4 short transforms) to remove uncoded coefficients */
    1279             : 
    1280           0 :         k1_step_fx = shr( length, 2 );      /* k1 = length/NUM_TIME_SWITCHING_BLOCKS Q0*/
    1281           0 :         k2_step_fx = shr( inner_frame, 2 ); /* k2 = inner_frame/NUM_TIME_SWITCHING_BLOCKS Q0*/
    1282           0 :         k1_fx = k1_step_fx;                 /* Q0 */
    1283           0 :         k2_fx = k2_step_fx;                 /* Q0 */
    1284           0 :         move16();
    1285           0 :         move16();
    1286           0 :         FOR( i = 1; i < NUM_TIME_SWITCHING_BLOCKS; i++ )
    1287             :         {
    1288             :             /*k1 = i*length/NUM_TIME_SWITCHING_BLOCKS; */
    1289             :             /*k2 = i*inner_frame/NUM_TIME_SWITCHING_BLOCKS; */
    1290             : 
    1291           0 :             Copy32( &L_t_audio[k2_fx], &L_t_audio[k1_fx], k1_step_fx ); /* Q12 */
    1292             : 
    1293           0 :             k1_fx = add( k1_fx, k1_step_fx );
    1294           0 :             k2_fx = add( k2_fx, k2_step_fx );
    1295             :         }
    1296             :     }
    1297             : 
    1298             :     /* Spectral energy calculation/quantization */
    1299             : 
    1300           0 :     ebits_fx = band_energy_quant_ivas_fx( hBstr, L_t_audio, band_start, band_end, L_band_energy, bands,
    1301             :                                           L_qint, eref_fx, is_transient ); /* Q0 */
    1302             : 
    1303             :     /* First pass bit budget for TCQ of spectral band information */
    1304           0 :     exp_norm = norm_s( gqlevs ); /* gqbits_fx = (short int) log2_f ((float) gqlevs_fx); */
    1305           0 :     gqbits = sub( 14, exp_norm );
    1306             : 
    1307           0 :     bit_budget = sub( sub( *num_bits, ebits_fx ), round_fx( L_shl( L_mult( Ngq, gqbits ), 15 ) ) ); /* (*num_bits) - (short) ceil (ebits) - Ngq * gqbits; Q0*/
    1308             : 
    1309             : 
    1310           0 :     pbits = 0;
    1311           0 :     move16();
    1312             : 
    1313           0 :     test();
    1314           0 :     test();
    1315           0 :     IF( EQ_16( st->bwidth, SWB ) && ( EQ_32( bwe_br, HQ_16k40 ) || EQ_32( bwe_br, HQ_13k20 ) ) )
    1316             :     {
    1317           0 :         IF( EQ_16( hqswb_clas, HQ_HARMONIC ) )
    1318             :         {
    1319           0 :             set16_fx( p2a_flags, 1, har_bands );
    1320             :         }
    1321             :         ELSE
    1322             :         {
    1323             :             /* High band tonality detector based on per band peak-to-average ratio */
    1324           0 :             pbits = p2a_threshold_quant_ivas_fx( hBstr, L_t_audio, band_start, band_end, band_width, bands, p2a_bands, p2a_th_fx, p2a_flags ); /* Q0 */
    1325           0 :             bit_budget = sub( bit_budget, pbits );
    1326             : 
    1327           0 :             IF( EQ_16( hqswb_clas, HQ_NORMAL ) )
    1328             :             {
    1329           0 :                 return_bits_normal2_fx( &bit_budget, p2a_flags, bands, bits_lagIndices_modeNormal );
    1330             :             }
    1331             :         }
    1332             :     }
    1333             :     ELSE
    1334             :     {
    1335             :         /* High band tonality detector based on per band peak-to-average ratio */
    1336           0 :         pbits = p2a_threshold_quant_ivas_fx( hBstr, L_t_audio, band_start, band_end, band_width, bands, p2a_bands, p2a_th_fx, p2a_flags ); /* Q0 */
    1337           0 :         bit_budget = sub( bit_budget, pbits );
    1338             :     }
    1339             : 
    1340           0 :     IF( EQ_16( flag_spt, 1 ) )
    1341             :     {
    1342             :         /* initialize the desired parameters for SPT */
    1343           0 :         spt_shorten_domain_band_save_fx( bands, band_start, band_end, band_width, org_band_start, org_band_end, org_band_width );
    1344           0 :         spt_shorten_domain_pre_fx( band_start, band_end, hHQ_core->prev_SWB_peak_pos, bands, bwe_br, new_band_start, new_band_end, new_band_width );
    1345           0 :         spt_shorten_domain_set_ivas_fx( st, L_t_audio, p2a_flags, new_band_start, new_band_end, new_band_width, bands, band_start, band_end, band_width, &bit_budget );
    1346             :     }
    1347             : 
    1348             : #define WMC_TOOL_SKIP
    1349             :     /* Estimate number of bits per band */
    1350           0 :     Q_band_energy = SWB_BWE_LR_Qbe;
    1351           0 :     move16();
    1352           0 :     FOR( i = 0; i < bands; i++ )
    1353             :     {
    1354           0 :         L_tmp = L_shl( L_band_energy[i], sub( 16, Q_band_energy ) ); /*Q16 */
    1355             : 
    1356           0 :         frac1 = L_Extract_lc( L_tmp, &exp ); /* Extract exponent of L_tmp */
    1357           0 :         L_tmp = Pow2( 30, frac1 );
    1358           0 :         exp = sub( exp, 30 );
    1359           0 :         Ep_fx[i] = L_shl( L_tmp, sub( exp, 6 ) ); /* Q -6 */
    1360           0 :         move32();
    1361             :     }
    1362             : 
    1363           0 :     FOR( i = 0; i < bands; i++ )
    1364             :     {
    1365           0 :         L_tmp2 = Ep_fx[i]; /* Q -6 */
    1366           0 :         L_tmp = L_max( 1, L_tmp2 );
    1367           0 :         exp = norm_l( L_tmp );
    1368           0 :         tmp = extract_h( L_shl( L_tmp, exp ) ); /* Q -6 + exp - 16 */
    1369             : 
    1370           0 :         L_tmp3 = L_deposit_l( band_width[i] ); /* Q0 */
    1371           0 :         exp2 = norm_l( L_tmp3 );
    1372           0 :         tmp2 = extract_h( L_shl( L_tmp3, exp2 ) ); /* exp2 - 16 */
    1373             : 
    1374           0 :         exp2 = sub( exp, exp2 ); /* Denormalize and substract */
    1375             : 
    1376           0 :         tmp3 = sub( tmp2, tmp );
    1377           0 :         IF( tmp3 > 0 )
    1378             :         {
    1379           0 :             tmp2 = shr( tmp2, 1 );
    1380             :         }
    1381           0 :         IF( tmp3 > 0 )
    1382             :         {
    1383           0 :             exp2 = add( exp2, 1 );
    1384             :         }
    1385           0 :         tmp = div_s( tmp2, tmp );          /* Q15 */
    1386           0 :         L_tmp = L_deposit_h( tmp );        /* Q31 */
    1387           0 :         L_tmp = Isqrt_lc1( L_tmp, &exp2 ); /*Q(31-exp2) */
    1388           0 :         move32();
    1389           0 :         Ep_tmp_fx[i] = L_shr( L_tmp, sub( 15, exp2 ) ); /*Q16 */
    1390           0 :         move32();
    1391             :     }
    1392             : #undef WMC_TOOL_SKIP
    1393             : 
    1394           0 :     test();
    1395           0 :     test();
    1396           0 :     test();
    1397           0 :     test();
    1398           0 :     test();
    1399           0 :     test();
    1400           0 :     IF( is_transient == 0 && EQ_16( inner_frame, L_FRAME8k ) && LE_32( st->core_brate, ACELP_13k20 ) )
    1401             :     {
    1402             : #define WMC_TOOL_SKIP
    1403           0 :         lowband = 6;
    1404           0 :         move16();
    1405           0 :         trans_bit = 2;
    1406           0 :         move16();
    1407           0 :         bit_budget = sub( bit_budget, trans_bit );
    1408           0 :         gama_fx = 27852; /*Q15 0.85f */
    1409           0 :         beta_fx = 17203; /*Q14 1.05f */
    1410           0 :         move16();
    1411           0 :         move16();
    1412           0 :         set_s( &p2a_flags_tmp[bands - trans_bit], 0, 2 );
    1413             : 
    1414           0 :         IF( EQ_32( st->core_brate, ACELP_13k20 ) )
    1415             :         {
    1416           0 :             beta_fx = 13107; /* Q14 1.25f */
    1417           0 :             move16();
    1418           0 :             gama_fx = 31130; /* 0.95f Q15 */
    1419           0 :             move16();
    1420           0 :             mvs2s( &p2a_flags[( bands - trans_bit )], &p2a_flags_tmp[( bands - trans_bit )], trans_bit );
    1421             :         }
    1422             : 
    1423             :         /* calculate the the low band/high band energy and the variance/avrage of the envelopes */
    1424           0 :         Ep_vari_fx = 0;
    1425           0 :         move32();
    1426           0 :         Ep_avrg_fx = 0;
    1427           0 :         move32();
    1428           0 :         Ep_avrgL_fx = 0;
    1429           0 :         move32();
    1430           0 :         Ep_peak_fx = 0;
    1431           0 :         move32();
    1432           0 :         FOR( i = 0; i < bands; i++ )
    1433             :         {
    1434           0 :             IF( sub( i, lowband ) >= 0 )
    1435             :             {
    1436           0 :                 Ep_vari_fx = L_add( Ep_vari_fx, L_abs( L_sub( Ep_tmp_fx[i], Ep_tmp_fx[( i - 1 )] ) ) ); /*Q15 */
    1437           0 :                 Ep_avrg_fx = L_add( Ep_avrg_fx, Ep_tmp_fx[i] );                                         /*Q15 */
    1438             :             }
    1439             :             ELSE
    1440             :             {
    1441           0 :                 Ep_avrgL_fx = L_add_sat( Ep_avrgL_fx, Ep_tmp_fx[i] ); /*Q15 */
    1442           0 :                 IF( L_sub( Ep_tmp_fx[i], Ep_peak_fx ) > 0 )
    1443             :                 {
    1444           0 :                     Ep_peak_fx = Ep_tmp_fx[i]; /*Q15 */
    1445           0 :                     move32();
    1446             :                 }
    1447             :             }
    1448             :         }
    1449             :         /* modify the last p2a_bands subbands band_energies */
    1450           0 :         k = bands;
    1451           0 :         move16();
    1452           0 :         mvl2l( L_band_energy, L_band_energy_tmp, k ); /*Q_band_energy */
    1453           0 :         Mpy_32_16_ss( Ep_peak_fx, 24576, &L_tmp, &lo );
    1454           0 :         Mpy_32_16_ss( Ep_peak_fx, shl( sub( bands, lowband ), 9 ), &L_tmp2, &lo );
    1455           0 :         Mpy_32_16_ss( Ep_avrg_fx, 1126, &L_tmp3, &lo );
    1456             : 
    1457           0 :         test();
    1458           0 :         test();
    1459           0 :         test();
    1460           0 :         IF( ( ( L_sub( L_tmp, L_shr( Ep_avrgL_fx, 1 ) ) < 0 && EQ_32( st->core_brate, ACELP_13k20 ) ) || LT_32( st->core_brate, ACELP_13k20 ) ) &&
    1461             :             L_sub( L_tmp2, L_tmp3 ) < 0 && L_sub( L_tmp2, L_shr( Ep_avrg_fx, 7 ) ) > 0 )
    1462             :         {
    1463           0 :             FOR( i = lowband; i < bands; i++ )
    1464             :             {
    1465           0 :                 Mpy_32_16_ss( Ep_avrg_fx, 24576, &L_tmp, &lo );
    1466           0 :                 IF( L_sub( L_shr( Ep_tmp_fx[i], 1 ), L_tmp ) < 0 )
    1467             :                 {
    1468           0 :                     Mpy_32_16_ss( Ep_peak_fx, sub( bands, lowband ), &L_tmp, &lo );
    1469           0 :                     tmp = extract_h( L_shl( L_tmp, 14 ) ); /*Q-4 */
    1470           0 :                     IF( tmp != 0 )
    1471             :                     {
    1472           0 :                         exp = norm_s( tmp );
    1473           0 :                         tmp = shl( tmp, exp );     /*Q(exp) */
    1474           0 :                         tmp = div_s( 16384, tmp ); /*Q(15+14-exp=29-exp) */
    1475           0 :                         exp = sub( 29, exp );
    1476             :                     }
    1477             :                     ELSE
    1478             :                     {
    1479             :                         /*when the divisor is zero, happens rarely*/
    1480           0 :                         tmp = 0x7fff;
    1481           0 :                         move16();
    1482           0 :                         exp = 0;
    1483           0 :                         move16();
    1484             :                     }
    1485           0 :                     Mpy_32_16_ss( Ep_avrg_fx, tmp, &L_tmp, &lo );
    1486           0 :                     L_tmp = L_shl( L_tmp, sub( 13, exp ) );                       /*Q(13+exp-15 +13-exp +4 = 15) */
    1487           0 :                     L_tmp2 = L_add( L_tmp, 13107 );                               /*15 */
    1488           0 :                     tmp2 = extract_l( L_min( L_max( L_tmp2, 16384 ), gama_fx ) ); /*15 = 15 */
    1489           0 :                     Mpy_32_16_ss( L_band_energy_tmp[i], tmp2, &L_band_energy_tmp[i], &lo );
    1490             :                 }
    1491             :             }
    1492             :         }
    1493             :         ELSE
    1494             :         {
    1495           0 :             j = 0;
    1496           0 :             move16();
    1497           0 :             FOR( i = ( bands - trans_bit ); i < bands; i++ )
    1498             :             {
    1499           0 :                 alpha_fx = 16384; /*Q14 */
    1500           0 :                 move16();
    1501           0 :                 IF( sub( p2a_flags_tmp[i], 1 ) == 0 )
    1502             :                 {
    1503           0 :                     Mpy_32_16_ss( Ep_tmp_fx[i], sub( bands, lowband ), &L_tmp, &lo );
    1504           0 :                     tmp = extract_h( L_shl( L_tmp, 14 ) ); /*Q-4 */
    1505           0 :                     IF( tmp != 0 )
    1506             :                     {
    1507           0 :                         exp = norm_s( tmp );
    1508           0 :                         tmp = shl( tmp, exp );     /*Q(exp) */
    1509           0 :                         tmp = div_s( 16384, tmp ); /*Q(15+14-exp=29-exp) */
    1510           0 :                         exp = sub( 29, exp );
    1511             :                     }
    1512             :                     ELSE
    1513             :                     {
    1514             :                         /*when the divisor is zero, happens rarely*/
    1515           0 :                         tmp = 0x7fff;
    1516           0 :                         move16();
    1517           0 :                         exp = 0;
    1518           0 :                         move16();
    1519             :                     }
    1520           0 :                     Mpy_32_16_ss( Ep_vari_fx, 3277, &L_tmp, &lo );
    1521           0 :                     Mpy_32_16_ss( L_tmp, tmp, &L_tmp, &lo );
    1522           0 :                     L_tmp = L_shl( L_tmp, sub( 12, exp ) ); /*Q(13+exp-15 +12-exp +4 = 14) */
    1523             : 
    1524           0 :                     tmp2 = extract_h( Ep_avrg_fx ); /*Q13-16=-3 */
    1525           0 :                     IF( tmp2 != 0 )
    1526             :                     {
    1527           0 :                         exp = norm_s( tmp2 );
    1528           0 :                         tmp2 = shl( tmp2, exp );     /*Q(exp) */
    1529           0 :                         tmp2 = div_s( 16384, tmp2 ); /*Q(15+14-exp=29-exp) */
    1530           0 :                         exp = sub( 29, exp );
    1531             :                     }
    1532             :                     ELSE
    1533             :                     {
    1534           0 :                         tmp2 = 0x7fff;
    1535           0 :                         move16();
    1536           0 :                         exp = 0;
    1537           0 :                         move16();
    1538             :                     }
    1539           0 :                     Mpy_32_16_ss( Ep_vari_fx, 6554, &L_tmp2, &lo );
    1540           0 :                     Mpy_32_16_ss( L_tmp2, tmp2, &L_tmp2, &lo );
    1541           0 :                     L_tmp2 = L_shl( L_tmp2, sub( 13, exp ) ); /*Q(13+exp-15 +13-exp +3 = 14) */
    1542           0 :                     L_tmp = L_min( L_tmp, L_tmp2 );           /*14 */
    1543           0 :                     tmp = extract_l( L_min( L_tmp, 13107 ) ); /*14 */
    1544           0 :                     alpha_fx = add( 16384, tmp );             /* Q14 */
    1545             :                 }
    1546           0 :                 IF( sub( hHQ_core->last_bitalloc_max_band[j++], 1 ) == 0 )
    1547             :                 {
    1548           0 :                     Mpy_32_16_ss( Ep_tmp_fx[i], sub( bands, lowband ), &L_tmp, &lo );
    1549           0 :                     tmp = extract_h( L_shl( L_tmp, 14 ) ); /*Q-2 */
    1550           0 :                     IF( tmp != 0 )
    1551             :                     {
    1552           0 :                         exp = norm_s( tmp );
    1553           0 :                         tmp = shl( tmp, exp );     /*Q(exp) */
    1554           0 :                         tmp = div_s( 16384, tmp ); /*Q(15+14-exp=29-exp) */
    1555           0 :                         exp = sub( 29, exp );
    1556             :                     }
    1557             :                     ELSE
    1558             :                     {
    1559           0 :                         tmp = 0x7fff;
    1560           0 :                         move16();
    1561           0 :                         exp = 0;
    1562           0 :                         move16();
    1563             :                     }
    1564           0 :                     Mpy_32_16_ss( Ep_avrg_fx, tmp, &L_tmp, &lo );
    1565           0 :                     L_tmp = L_shl_sat( L_tmp, sub( 14, exp ) ); /*Q(13+exp-15 +14-exp+2 = 14) */
    1566           0 :                     L_tmp = L_max( L_tmp, 16384 );              /*14 */
    1567           0 :                     tmp = extract_l( L_min( L_tmp, beta_fx ) ); /*14 */
    1568           0 :                     alpha_fx = shl( mult( alpha_fx, tmp ), 1 ); /*14+14-15 +1=14 */
    1569             :                 }
    1570             :                 ELSE
    1571             :                 {
    1572           0 :                     tmp2 = extract_h( Ep_avrg_fx ); /*13 -16 =-3 */
    1573           0 :                     IF( tmp2 != 0 )
    1574             :                     {
    1575           0 :                         exp = norm_s( tmp2 );
    1576           0 :                         tmp2 = shl( tmp2, exp );     /*Q(exp) */
    1577           0 :                         tmp2 = div_s( 16384, tmp2 ); /*Q(15+14-exp=29-exp) */
    1578           0 :                         exp = sub( 29, exp );
    1579             :                     }
    1580             :                     ELSE
    1581             :                     {
    1582             :                         /*when the divisor is zero, happens rarely*/
    1583           0 :                         tmp2 = 0x7fff;
    1584           0 :                         move16();
    1585           0 :                         exp = 0;
    1586           0 :                         move16();
    1587             :                     }
    1588           0 :                     Mpy_32_16_ss( Ep_tmp_fx[i], tmp2, &L_tmp, &lo );
    1589           0 :                     L_tmp = L_shl( L_tmp, sub( 19, exp ) ); /*Q(13+exp-15 +19-exp +3 = 20) */
    1590           0 :                     Mpy_32_16_ss( L_tmp, shl( sub( bands, lowband ), 9 ), &L_tmp, &lo );
    1591           0 :                     L_tmp = L_max( L_tmp, 13926 );               /*14 */
    1592           0 :                     tmp2 = extract_l( L_min( L_tmp, 16384 ) );   /*14 */
    1593           0 :                     alpha_fx = shl( mult( alpha_fx, tmp2 ), 1 ); /*14+14-15+1 =14 */
    1594             :                 }
    1595           0 :                 Mpy_32_16_ss( L_band_energy_tmp[i], alpha_fx, &L_tmp, &lo );
    1596           0 :                 L_band_energy_tmp[i] = L_shl( L_tmp, 1 ); /*Q(Q_band_energy+14-15 +1= Q_band_energy) */
    1597           0 :                 move32();
    1598             :             }
    1599             :         }
    1600           0 :         lowband = 3;
    1601           0 :         move16();
    1602           0 :         Ep_avrg_fx = 0;
    1603           0 :         move32();
    1604           0 :         Ep_avrgL_fx = 0;
    1605           0 :         move32();
    1606           0 :         Ep_peak_fx = 0;
    1607           0 :         move32();
    1608           0 :         FOR( i = 0; i < bands; i++ )
    1609             :         {
    1610           0 :             IF( sub( i, lowband ) >= 0 )
    1611             :             {
    1612           0 :                 Ep_avrg_fx = L_add_sat( Ep_avrg_fx, Ep_tmp_fx[i] ); /*Q15 */
    1613             :             }
    1614             :             ELSE
    1615             :             {
    1616           0 :                 Ep_avrgL_fx = L_add( Ep_avrgL_fx, L_shr( Ep_tmp_fx[i], 1 ) ); /*Q12 */
    1617           0 :                 IF( L_sub( Ep_tmp_fx[i], Ep_peak_fx ) > 0 )
    1618             :                 {
    1619           0 :                     Ep_peak_fx = Ep_tmp_fx[i]; /*Q13 */
    1620           0 :                     move32();
    1621             :                 }
    1622             :             }
    1623             :         }
    1624           0 :         Mpy_32_16_ss( Ep_peak_fx, 28262, &L_tmp, &lo );
    1625           0 :         Mpy_32_16_ss( Ep_avrgL_fx, 24576, &L_tmp2, &lo );
    1626             : 
    1627           0 :         test();
    1628           0 :         test();
    1629           0 :         IF( L_sub( L_shr( Ep_avrg_fx, 2 ), L_tmp2 ) > 0 && L_sub( L_shr( Ep_avrg_fx, 4 ), L_tmp2 ) < 0 && L_sub( L_tmp, Ep_avrgL_fx ) > 0 )
    1630             :         {
    1631           0 :             adjustFlag = 1;
    1632           0 :             move16();
    1633           0 :             FOR( i = 0; i < lowband; i++ )
    1634             :             {
    1635           0 :                 tmp = extract_h( Ep_avrgL_fx ); /*Q-4 */
    1636           0 :                 IF( tmp != 0 )
    1637             :                 {
    1638           0 :                     exp = norm_s( tmp );
    1639           0 :                     tmp = shl( tmp, exp );     /*Q(exp) */
    1640           0 :                     tmp = div_s( 16384, tmp ); /*Q(15+14-exp=29-exp) */
    1641           0 :                     exp = sub( 29, exp );
    1642             :                 }
    1643             :                 ELSE
    1644             :                 {
    1645             :                     /*when the divisor is zero, happens rarely*/
    1646           0 :                     tmp = 0x7fff;
    1647           0 :                     move16();
    1648           0 :                     exp = 0;
    1649           0 :                     move16();
    1650             :                 }
    1651           0 :                 Mpy_32_16_ss( Ep_peak_fx, tmp, &L_tmp, &lo );
    1652           0 :                 Mpy_32_16_ss( L_tmp, lowband, &L_tmp, &lo );
    1653           0 :                 Mpy_32_16_ss( L_tmp, 18842, &L_tmp, &lo );
    1654           0 :                 L_tmp = L_shl_sat( L_tmp, sub( 27, exp ) ); /*Q14 0.5 */
    1655           0 :                 tmp2 = extract_l( L_min( L_tmp, 19661 ) );  /*14 */
    1656           0 :                 Mpy_32_16_ss( L_band_energy_tmp[i], tmp2, &L_tmp, &lo );
    1657           0 :                 L_band_energy_tmp[i] = L_shl( L_tmp, 1 ); /*Q_band_energy  */
    1658           0 :                 move32();
    1659             :             }
    1660             :         }
    1661             : #undef WMC_TOOL_SKIP
    1662             : 
    1663             : 
    1664           0 :         hq2_bit_alloc_fx( L_band_energy_tmp, bands, Rk_fx, &bit_budget, p2a_flags, bit_alloc_weight_fx, band_width, *num_bits, hqswb_clas, st->bwidth, is_transient );
    1665             : 
    1666             :         /* encode the last p2a_bands-1 subbands bit-allocation index of the previous frame */
    1667           0 :         FOR( i = 0; i < 2; i++ )
    1668             :         {
    1669           0 :             push_indice( hBstr, IND_HQ2_LAST_BA_MAX_BAND, hHQ_core->last_bitalloc_max_band[i], 1 );
    1670             :         }
    1671             :     }
    1672           0 :     ELSE IF( is_transient == 0 && EQ_16( inner_frame, L_FRAME16k ) )
    1673             :     {
    1674             : #define WMC_TOOL_SKIP
    1675           0 :         bit_budget = sub( bit_budget, 2 ); /* bits in high bands to indicate the last 2 subbands is allocated bits or not */
    1676           0 :         FOR( i = 0; i < bands; i++ )
    1677             :         {
    1678           0 :             Ep_tmp_fx[i] = L_shl_sat( Ep_tmp_fx[i], 2 ); /* Q15 */
    1679           0 :             move32();
    1680             :         }
    1681           0 :         IF( EQ_32( st->core_brate, ACELP_13k20 ) )
    1682             :         {
    1683           0 :             lowband = 8;
    1684           0 :             move16();
    1685           0 :             highband = 15;
    1686           0 :             move16();
    1687           0 :             bw_low = sub( band_start[highband], band_start[lowband] );                /* Q0 */
    1688           0 :             bw_high = sub( add( band_end[( bands - 1 )], 1 ), band_start[highband] ); /* Q0 */
    1689             :         }
    1690             :         ELSE
    1691             :         {
    1692           0 :             lowband = 8;
    1693           0 :             move16();
    1694           0 :             highband = 16;
    1695           0 :             move16();
    1696           0 :             bw_low = sub( band_start[highband], band_start[lowband] );                /* Q0 */
    1697           0 :             bw_high = sub( add( band_end[( bands - 1 )], 1 ), band_start[highband] ); /* Q0 */
    1698             :         }
    1699             :         /* calculate the the low band/high band energy and the variance/avrage of the envelopes */
    1700           0 :         enerL_fx = 0;
    1701           0 :         move32();
    1702           0 :         enerH_fx = 0;
    1703           0 :         move32();
    1704           0 :         Ep_vari_fx = 0;
    1705           0 :         move32();
    1706           0 :         Ep_avrg_fx = 0;
    1707           0 :         move32();
    1708           0 :         FOR( i = 0; i < bands; i++ )
    1709             :         {
    1710           0 :             test();
    1711           0 :             IF( sub( i, lowband ) >= 0 && add( sub( i, bands ), p2a_bands ) < 0 )
    1712             :             {
    1713           0 :                 Ep_vari_fx = L_add( Ep_vari_fx, L_abs( L_sub( Ep_tmp_fx[i], Ep_tmp_fx[sub( i, 1 )] ) ) ); /*Q15 */
    1714           0 :                 Ep_avrg_fx = L_add_sat( Ep_avrg_fx, Ep_tmp_fx[i] );                                       /*Q15 */
    1715             :             }
    1716             : 
    1717           0 :             IF( sub( i, highband ) >= 0 )
    1718             :             {
    1719           0 :                 enerH_fx = L_add( enerH_fx, L_shl( Ep_fx[i], 2 ) ); /*Q0 */
    1720             :             }
    1721           0 :             ELSE IF( sub( i, lowband ) >= 0 )
    1722             :             {
    1723           0 :                 enerL_fx = L_add( enerL_fx, L_shl( Ep_fx[i], 2 ) ); /*Q0 */
    1724             :             }
    1725             :         }
    1726             :         /* modify the last p2a_bands subbands band_energies */
    1727           0 :         k = bands;
    1728           0 :         move16();
    1729           0 :         mvl2l( L_band_energy, L_band_energy_tmp, k ); /*Q_band_energy */
    1730             : 
    1731           0 :         L_tmp = L_max( enerH_fx, enerL_fx );
    1732           0 :         tmp = s_max( bw_low, bw_high );
    1733           0 :         i = norm_l( L_tmp );
    1734           0 :         j = norm_s( tmp );
    1735           0 :         Mpy_32_16_ss( L_shl( enerH_fx, i ), shl( bw_low, j ), &L_tmp, &lo );
    1736           0 :         Mpy_32_16_ss( L_shl( enerL_fx, i ), shl( bw_high, j ), &L_tmp2, &lo );
    1737           0 :         L_tmp2 = L_sub( L_tmp, L_tmp2 );
    1738             : 
    1739           0 :         FOR( i = ( bands - p2a_bands ); i < bands; i++ )
    1740             :         {
    1741           0 :             test();
    1742           0 :             IF( sub( p2a_flags[i], 1 ) == 0 || L_tmp2 > 0 )
    1743             :             {
    1744           0 :                 tmp = sub( bands, p2a_bands );
    1745           0 :                 tmp = sub( tmp, lowband ); /*Q0 */
    1746             : 
    1747           0 :                 tmp1 = extract_h( L_shl_sat( Ep_avrg_fx, 1 ) ); /*Q0 */
    1748           0 :                 IF( tmp1 != 0 )
    1749             :                 {
    1750           0 :                     exp = norm_s( tmp1 );
    1751           0 :                     tmp1 = shl( tmp1, exp );     /*Q(exp) */
    1752           0 :                     tmp1 = div_s( 16384, tmp1 ); /*Q(15+14-exp = 29-exp) */
    1753           0 :                     exp = sub( 29, exp );
    1754             :                 }
    1755             :                 ELSE
    1756             :                 {
    1757           0 :                     tmp1 = 0x7fff;
    1758           0 :                     move16();
    1759           0 :                     exp = 0;
    1760           0 :                     move16();
    1761             :                 }
    1762           0 :                 Mpy_32_16_ss( Ep_tmp_fx[i], tmp1, &L_tmp, &lo );
    1763           0 :                 Mpy_32_16_ss( L_tmp, tmp, &L_tmp, &lo );
    1764           0 :                 Mpy_32_16_ss( L_tmp, 16384, &L_tmp, &lo );
    1765           0 :                 L_tmp = L_shl( L_tmp, sub( 32, exp ) );  /*Q15 */
    1766           0 :                 tmp = extract_l( L_min( L_tmp, 6554 ) ); /*Q15 */
    1767           0 :                 Mpy_32_16_ss( Ep_vari_fx, tmp1, &L_tmp, &lo );
    1768           0 :                 Mpy_32_16_ss( L_tmp, tmp, &L_tmp, &lo );
    1769           0 :                 L_tmp = L_shl( L_tmp, sub( 15, exp ) );               /*Q15 */
    1770           0 :                 tmp = extract_l( L_shr( L_min( L_tmp, 13107 ), 1 ) ); /*Q14 */
    1771           0 :                 alpha_fx = add( tmp, 16384 );                         /*Q14 */
    1772             :             }
    1773             :             ELSE
    1774             :             {
    1775           0 :                 alpha_fx = 16384; /* Q14 */
    1776           0 :                 move16();
    1777             :             }
    1778             : 
    1779           0 :             IF( add( sub( i, bands ), p2a_bands ) > 0 )
    1780             :             {
    1781           0 :                 tmp = sub( bands, p2a_bands );
    1782           0 :                 IF( sub( hHQ_core->last_bitalloc_max_band[( i - ( tmp + 1 ) )], 1 ) == 0 )
    1783             :                 {
    1784           0 :                     tmp = sub( tmp, lowband );
    1785           0 :                     Mpy_32_16_ss( Ep_tmp_fx[i], tmp, &L_tmp, &lo );
    1786           0 :                     tmp = extract_h( L_shl_sat( L_tmp, 16 ) ); /*Q0 */
    1787           0 :                     IF( tmp != 0 )
    1788             :                     {
    1789           0 :                         exp = norm_s( tmp );
    1790           0 :                         tmp = shl( tmp, exp );     /*Q(exp) */
    1791           0 :                         tmp = div_s( 16384, tmp ); /*Q(15+14-exp=29-exp) */
    1792           0 :                         exp = sub( 29, exp );
    1793             :                     }
    1794             :                     ELSE
    1795             :                     {
    1796           0 :                         tmp = 0x7fff;
    1797           0 :                         move16();
    1798           0 :                         exp = 0;
    1799           0 :                         move16();
    1800             :                     }
    1801           0 :                     Mpy_32_16_ss( Ep_avrg_fx, tmp, &L_tmp, &lo );
    1802           0 :                     L_tmp = L_shl( L_tmp, sub( 14, exp ) );                   /*Q14 */
    1803           0 :                     tmp = extract_l( L_min( L_max( L_tmp, 16384 ), 20480 ) ); /*Q14 */
    1804           0 :                     L_tmp = L_mult( alpha_fx, tmp );                          /*Q(14+14+1=29) */
    1805           0 :                     alpha_fx = extract_l( L_shr( L_tmp, 15 ) );               /*Q14*/
    1806             :                 }
    1807             :                 ELSE
    1808             :                 {
    1809           0 :                     tmp = sub( tmp, lowband );
    1810           0 :                     tmp1 = extract_h( L_shl_sat( Ep_avrg_fx, 1 ) ); /*Q0 */
    1811           0 :                     IF( tmp1 != 0 )
    1812             :                     {
    1813           0 :                         exp = norm_s( tmp1 );
    1814           0 :                         tmp1 = shl( tmp1, exp );     /*Q(exp) */
    1815           0 :                         tmp1 = div_s( 16384, tmp1 ); /*Q(15+14-exp=29-exp) */
    1816           0 :                         exp = sub( 29, exp );
    1817             :                     }
    1818             :                     ELSE
    1819             :                     {
    1820           0 :                         tmp1 = 0x7fff;
    1821           0 :                         move16();
    1822           0 :                         exp = 0;
    1823           0 :                         move16();
    1824             :                     }
    1825           0 :                     Mpy_32_16_ss( Ep_tmp_fx[i], tmp1, &L_tmp, &lo );
    1826           0 :                     Mpy_32_16_ss( L_tmp, tmp, &L_tmp, &lo );
    1827           0 :                     L_tmp = L_shl( L_tmp, sub( 29, exp ) );                   /*Q14 */
    1828           0 :                     tmp = extract_l( L_min( L_max( L_tmp, 13926 ), 16384 ) ); /*Q14 */
    1829           0 :                     L_tmp = L_mult( alpha_fx, tmp );                          /*Q(14+14+1=29) */
    1830           0 :                     alpha_fx = extract_l( L_shr( L_tmp, 15 ) );               /*Q14  */
    1831             :                 }
    1832             :             }
    1833           0 :             Mpy_32_16_ss( L_band_energy_tmp[i], alpha_fx, &L_tmp, &lo );
    1834           0 :             L_band_energy_tmp[i] = L_shl( L_tmp, 1 ); /*Q Q_band_energy */
    1835           0 :             move32();
    1836             :         }
    1837           0 :         lowband = 6;
    1838           0 :         move16();
    1839           0 :         Ep_avrg_fx = 0;
    1840           0 :         move32();
    1841           0 :         Ep_avrgL_fx = 0;
    1842           0 :         move32();
    1843           0 :         Ep_peak_fx = 0;
    1844           0 :         move32();
    1845           0 :         FOR( i = 0; i < bands; i++ )
    1846             :         {
    1847           0 :             IF( sub( i, lowband ) >= 0 )
    1848             :             {
    1849           0 :                 Ep_avrg_fx = L_add_sat( Ep_avrg_fx, Ep_tmp_fx[i] ); /*Q15 */
    1850             :             }
    1851             :             ELSE
    1852             :             {
    1853           0 :                 Ep_avrgL_fx = L_add_sat( Ep_avrgL_fx, Ep_tmp_fx[i] ); /*Q15 */
    1854           0 :                 IF( L_sub( Ep_tmp_fx[i], Ep_peak_fx ) > 0 )
    1855             :                 {
    1856           0 :                     Ep_peak_fx = Ep_tmp_fx[i]; /* Q15 */
    1857           0 :                     move32();
    1858             :                 }
    1859             :             }
    1860             :         }
    1861             : 
    1862           0 :         Mpy_32_16_ss( Ep_peak_fx, 24576, &L_tmp, &lo );
    1863           0 :         Mpy_32_16_ss( Ep_peak_fx, 19661, &L_tmp2, &lo );
    1864           0 :         Mpy_32_16_ss( Ep_avrgL_fx, 24576, &L_tmp3, &lo );
    1865             : 
    1866           0 :         test();
    1867           0 :         test();
    1868           0 :         test();
    1869           0 :         test();
    1870           0 :         test();
    1871           0 :         IF( ( L_sub( L_shr( Ep_avrgL_fx, 1 ), Ep_avrg_fx ) > 0 && L_sub( L_tmp, L_shr( Ep_avrgL_fx, 2 ) ) > 0 && L_sub( L_shr( Ep_avrgL_fx, 1 ), L_tmp2 ) < 0 ) ||
    1872             :             ( L_sub( L_shr( Ep_avrg_fx, 1 ), Ep_avrgL_fx ) > 0 && L_sub( L_shr( Ep_avrg_fx, 3 ), L_tmp3 ) < 0 && L_sub( L_tmp, L_shr( Ep_avrgL_fx, 2 ) ) > 0 ) )
    1873             :         {
    1874           0 :             adjustFlag = 1;
    1875           0 :             move16();
    1876           0 :             FOR( i = 0; i < lowband; i++ )
    1877             :             {
    1878           0 :                 tmp = extract_h( L_shl_sat( Ep_avrgL_fx, 1 ) ); /*Q0 */
    1879           0 :                 IF( tmp != 0 )
    1880             :                 {
    1881           0 :                     exp = norm_s( tmp );
    1882           0 :                     tmp = shl( tmp, exp );     /*Q(exp) */
    1883           0 :                     tmp = div_s( 16384, tmp ); /*Q(15+14-exp=29-exp) */
    1884           0 :                     exp = sub( 29, exp );
    1885             :                 }
    1886             :                 ELSE
    1887             :                 {
    1888           0 :                     tmp = 0x7fff;
    1889           0 :                     move16();
    1890           0 :                     exp = 0;
    1891           0 :                     move16();
    1892             :                 }
    1893           0 :                 Mpy_32_16_ss( Ep_peak_fx, tmp, &L_tmp, &lo );
    1894           0 :                 Mpy_32_16_ss( L_tmp, lowband, &L_tmp, &lo );
    1895           0 :                 L_tmp = L_shl( L_tmp, sub( 28, exp ) );   /*Q14 0.5 */
    1896           0 :                 tmp = extract_l( L_min( L_tmp, 19661 ) ); /*Q14 */
    1897           0 :                 Mpy_32_16_ss( L_band_energy_tmp[i], tmp, &L_tmp, &lo );
    1898           0 :                 L_band_energy_tmp[i] = L_shl( L_tmp, 1 ); /*Q_band_energy  */
    1899           0 :                 move32();
    1900             :             }
    1901             :         }
    1902             : #undef WMC_TOOL_SKIP
    1903             : 
    1904           0 :         hq2_bit_alloc_fx( L_band_energy_tmp, bands, Rk_fx, &bit_budget, p2a_flags, bit_alloc_weight_fx, band_width, *num_bits, hqswb_clas, st->bwidth, is_transient );
    1905             : 
    1906             :         /* encode the last p2a_bands-1 subbands bit-allocation index of the previous frame */
    1907           0 :         FOR( i = 0; i < 2; i++ )
    1908             :         {
    1909           0 :             push_indice( hBstr, IND_HQ2_LAST_BA_MAX_BAND, hHQ_core->last_bitalloc_max_band[i], 1 );
    1910             :         }
    1911             :     }
    1912           0 :     ELSE IF( EQ_16( st->bwidth, SWB ) && EQ_16( hqswb_clas, HQ_HARMONIC ) && ( EQ_32( bwe_br, HQ_16k40 ) || EQ_32( bwe_br, HQ_13k20 ) ) )
    1913             :     {
    1914             :         /* bit allocation for harmonic mode */
    1915           0 :         hq2_bit_alloc_har_fx( L_band_energy, bit_budget, bands, Rk_fx, p2a_bands, bwe_br, p2a_flags, band_width );
    1916             :     }
    1917             :     ELSE
    1918             :     {
    1919             : 
    1920             :         /* estimate number of bits per band */
    1921           0 :         hq2_bit_alloc_fx( L_band_energy, bands, Rk_fx, &bit_budget, p2a_flags, bit_alloc_weight_fx, band_width, *num_bits, hqswb_clas, st->bwidth, is_transient );
    1922             :     }
    1923             : 
    1924           0 :     tcq_core_LR_enc_ivas_fx( hBstr, inp_vector, L_t_audio, L_y2, bit_budget, bands, band_start, band_end, band_width, Rk_fx, npulses, k_sort, p2a_flags, p2a_bands, hHQ_core->last_bitalloc_max_band, inner_frame, adjustFlag, is_transient );
    1925             : 
    1926           0 :     test();
    1927           0 :     test();
    1928           0 :     IF( ( EQ_16( inner_frame, L_FRAME8k ) && LE_32( st->core_brate, ACELP_13k20 ) ) || EQ_16( inner_frame, L_FRAME16k ) )
    1929             :     {
    1930           0 :         j = 0;
    1931           0 :         FOR( i = 2; i > 0; i-- )
    1932             :         {
    1933           0 :             IF( npulses[bands - i] > 0 )
    1934             :             {
    1935           0 :                 hHQ_core->last_bitalloc_max_band[j] = 1;
    1936           0 :                 move16();
    1937             :             }
    1938             :             ELSE
    1939             :             {
    1940           0 :                 hHQ_core->last_bitalloc_max_band[j] = 0;
    1941           0 :                 move16();
    1942             :             }
    1943           0 :             j++;
    1944             :         }
    1945             :     }
    1946             : 
    1947             :     /* Denormalize the coded MDCT spectrum */
    1948           0 :     mdct_spectrum_denorm_ivas_fx( inp_vector, L_y2, band_start, band_end, band_width, L_band_energy, npulses, bands, ld_slope_fx, pd_thresh_fx );
    1949             : 
    1950             :     /* Apply fine gain quantization to denormalized coded spectrum */
    1951           0 :     mdct_spectrum_fine_gain_enc_ivas_fx( st, L_t_audio, L_y2, band_start, band_end, k_sort, bands, L_qint, Ngq, gqlevs, gqbits );
    1952             : 
    1953             :     /* reStore the subband information*/
    1954           0 :     IF( EQ_16( flag_spt, 1 ) )
    1955             :     {
    1956           0 :         spt_shorten_domain_band_restore_fx( bands, band_start, band_end, band_width, org_band_start, org_band_end, org_band_width );
    1957             :     }
    1958             : 
    1959             :     /* Inject noise into components having relatively low pulse energy per band */
    1960           0 :     ni_seed = add( add( add( npulses[0], npulses[1] ), npulses[2] ), npulses[3] ); /* Q0 */
    1961             : 
    1962           0 :     Copy32( L_y2, L_y2_ni, band_end[bands - 1] + 1 ); /* Q12 */
    1963           0 :     test();
    1964           0 :     test();
    1965           0 :     IF( EQ_16( st->bwidth, SWB ) && ( EQ_32( bwe_br, HQ_16k40 ) || EQ_32( bwe_br, HQ_13k20 ) ) )
    1966             :     {
    1967           0 :         test();
    1968           0 :         IF( EQ_16( hqswb_clas, HQ_NORMAL ) || EQ_16( hqswb_clas, HQ_HARMONIC ) )
    1969             :         {
    1970           0 :             preset_hq2_swb_fx( hqswb_clas, band_end, &har_bands, p2a_bands, length, bands, &lowlength, &highlength, L_m );
    1971             : 
    1972           0 :             swb_bwe_enc_lr_ivas_fx( st, L_y2, SWB_BWE_LR_Qs, L_t_audio, L_m, bwe_br,
    1973             :                                     bands, band_start, band_end, L_band_energy, SWB_BWE_LR_Qbe, p2a_flags, hqswb_clas, lowlength, highlength,
    1974           0 :                                     hHQ_core->prev_frm_index, har_bands, &hHQ_core->prev_frm_hfe2, &hHQ_core->prev_stab_hfe2, band_width, L_y2_ni, &ni_seed );
    1975             : 
    1976           0 :             post_hq2_swb_fx( L_m, lowlength, highlength, hqswb_clas, har_bands, bands, p2a_flags, band_start, band_end, L_y2, npulses );
    1977             : 
    1978           0 :             IF( EQ_16( hqswb_clas, HQ_NORMAL ) )
    1979             :             {
    1980           0 :                 spt_swb_peakpos_tmp_save_fx( L_y2, bands, band_start, band_end, prev_SWB_peak_pos_tmp );
    1981           0 :                 FOR( k = 0; k < SPT_SHORTEN_SBNUM; k++ )
    1982             :                 {
    1983           0 :                     test();
    1984           0 :                     IF( p2a_flags[bands - SPT_SHORTEN_SBNUM + k] == 0 || npulses[bands - SPT_SHORTEN_SBNUM + k] == 0 )
    1985             :                     {
    1986           0 :                         prev_SWB_peak_pos_tmp[k] = 0;
    1987           0 :                         move16();
    1988             :                     }
    1989             :                 }
    1990             :             }
    1991           0 :             Copy32( L_y2_ni, L_y2, lowlength ); /* Q12 */
    1992             :         }
    1993             :         ELSE
    1994             :         {
    1995           0 :             Copy32( L_y2_ni, L_y2, band_end[bands - 1] + 1 ); /* HQ_TRANSIENT Q12*/
    1996             :         }
    1997             :     }
    1998             :     ELSE
    1999             :     {
    2000           0 :         Copy32( L_y2_ni, L_y2, band_end[bands - 1] + 1 ); /* NB, WB Q12*/
    2001             :     }
    2002             : 
    2003           0 :     updat_prev_frm_fx( L_y2, L_t_audio, bwe_br, length, inner_frame, bands, st->bwidth, is_transient, hqswb_clas, &hHQ_core->prev_hqswb_clas, hHQ_core->prev_SWB_peak_pos, prev_SWB_peak_pos_tmp, &hHQ_core->prev_frm_hfe2, &hHQ_core->prev_stab_hfe2, bws_cnt );
    2004             : 
    2005           0 :     IF( NE_16( st->bwidth, SWB ) )
    2006             :     {
    2007             :         /* reset HQ classifier memories */
    2008           0 :         hHQ_core->mode_count = 0;
    2009           0 :         move16();
    2010           0 :         hHQ_core->mode_count1 = 0;
    2011           0 :         move16();
    2012             :     }
    2013             : 
    2014             : 
    2015           0 :     test();
    2016           0 :     test();
    2017           0 :     test();
    2018           0 :     IF( NE_16( hqswb_clas, HQ_HARMONIC ) && ( EQ_32( bwe_br, HQ_16k40 ) || EQ_32( bwe_br, HQ_13k20 ) ) && EQ_16( st->bwidth, SWB ) )
    2019             :     {
    2020           0 :         hHQ_core->prev_frm_index[0] = -1;
    2021           0 :         move16();
    2022           0 :         hHQ_core->prev_frm_index[1] = -1;
    2023           0 :         move16();
    2024             :     }
    2025             : 
    2026             :     /* update number of unused bits */
    2027           0 :     *num_bits = 0;
    2028           0 :     move16();
    2029             : 
    2030           0 :     hHQ_core->hvq_hangover = 0;
    2031           0 :     move16();
    2032             : 
    2033           0 :     return;
    2034             : }
    2035             : 
    2036             : 
    2037             : /*--------------------------------------------------------------------------*
    2038             :  * small_symbol_enc_tran()
    2039             :  *
    2040             :  * Huffman encoding of differential energies, estimating or packing bits
    2041             :  * if flag_pack = 0, LC mode info. is output else LC mode info. is input
    2042             :  * if flag_pack = 0, estimatng else packing bits
    2043             :  *--------------------------------------------------------------------------*/
    2044             : 
    2045           2 : static Word16 small_symbol_enc_tran_fx(                         /* o  : bits                                     */
    2046             :                                         BSTR_ENC_HANDLE hBstr,  /* i  : handle to the bitstream                  */
    2047             :                                         const Word16 *qbidx,    /* i  : input of dequantized differential energy Q0*/
    2048             :                                         const Word16 BANDS,     /* i  : number of bands                          Q0*/
    2049             :                                         Word16 *hLCmode,        /* i/o: LC mode info                             Q0*/
    2050             :                                         const Word16 flag_pack, /* i  : indicator of packing or estimating bits  Q0*/
    2051             :                                         const Word16 is_transient /* Q0 */ )
    2052             : {
    2053             :     Word16 i, bits;
    2054             :     Word16 difidx[BANDS_MAX];
    2055             : 
    2056          66 :     FOR( i = 0; i < BANDS; i++ )
    2057             :     {
    2058          64 :         difidx[i] = add( qbidx[i], LRMDCT_BE_OFFSET ); /* Q0 */
    2059          64 :         move16();
    2060             :     }
    2061             : 
    2062          66 :     FOR( i = 0; i < BANDS; ++i )
    2063             :     {
    2064          64 :         test();
    2065          64 :         IF( GT_16( difidx[i], LRMDCT_BE_LIMIT ) || difidx[i] < 0 )
    2066             :         {
    2067             :             /* Huffman cannot encode this vector */
    2068           0 :             return -1;
    2069             :         }
    2070             :     }
    2071             : 
    2072             :     /* Preparing lossless coding input */
    2073           2 :     IF( flag_pack == 0 )
    2074             :     {
    2075             :         /* estimating # of bits */
    2076           1 :         bits = encode_envelope_indices_fx( hBstr, BANDS, -1, difidx, hLCmode, flag_pack, LOW_RATE_HQ_CORE_TRAN, is_transient ); /* Q0 */
    2077           1 :         bits = add( bits, BITS_DE_FCOMP );                                                                                      /* xx bits for diff. energies + BITS_DE_FCOMP bits for first energies */
    2078             :     }
    2079             :     ELSE
    2080             :     {
    2081           1 :         bits = 0;
    2082           1 :         move16();
    2083           1 :         encode_envelope_indices_fx( hBstr, BANDS, -1, difidx, hLCmode, flag_pack, LOW_RATE_HQ_CORE_TRAN, is_transient );
    2084             :     }
    2085             : 
    2086           2 :     return add( bits, BITS_DE_HMODE ); /* xx bits for diff. energies + 1 bit for LC coding mode Q0*/
    2087             : }
    2088             : 
    2089             : 
    2090           0 : static Word16 small_symbol_enc_tran_ivas_fx(                         /* o  : bits                                     */
    2091             :                                              BSTR_ENC_HANDLE hBstr,  /* i  : handle to the bitstream                  */
    2092             :                                              const Word16 *qbidx,    /* i  : input of dequantized differential energy Q0*/
    2093             :                                              const Word16 BANDS,     /* i  : number of bands                          Q0*/
    2094             :                                              Word16 *hLCmode,        /* i/o: LC mode info                             Q0*/
    2095             :                                              const Word16 flag_pack, /* i  : indicator of packing or estimating bits  Q0*/
    2096             :                                              const Word16 is_transient /* Q0 */ )
    2097             : {
    2098             :     Word16 i, bits;
    2099             :     Word16 difidx[BANDS_MAX];
    2100             : 
    2101           0 :     FOR( i = 0; i < BANDS; i++ )
    2102             :     {
    2103           0 :         difidx[i] = add( qbidx[i], LRMDCT_BE_OFFSET ); /* Q0 */
    2104           0 :         move16();
    2105             :     }
    2106             : 
    2107           0 :     FOR( i = 0; i < BANDS; ++i )
    2108             :     {
    2109           0 :         test();
    2110           0 :         IF( GT_16( difidx[i], LRMDCT_BE_LIMIT ) || difidx[i] < 0 )
    2111             :         {
    2112             :             /* Huffman cannot encode this vector */
    2113           0 :             return -1;
    2114             :         }
    2115             :     }
    2116             : 
    2117             :     /* Preparing lossless coding input */
    2118           0 :     IF( flag_pack == 0 )
    2119             :     {
    2120             :         /* estimating # of bits */
    2121           0 :         bits = encode_envelope_indices_ivas_fx( hBstr, BANDS, -1, difidx, hLCmode, flag_pack, LOW_RATE_HQ_CORE_TRAN, is_transient ); /* Q0 */
    2122           0 :         bits = add( bits, BITS_DE_FCOMP );                                                                                           /* xx bits for diff. energies + BITS_DE_FCOMP bits for first energies */
    2123             :     }
    2124             :     ELSE
    2125             :     {
    2126           0 :         bits = 0;
    2127           0 :         move16();
    2128           0 :         encode_envelope_indices_ivas_fx( hBstr, BANDS, -1, difidx, hLCmode, flag_pack, LOW_RATE_HQ_CORE_TRAN, is_transient );
    2129             :     }
    2130             : 
    2131           0 :     return add( bits, BITS_DE_HMODE ); /* xx bits for diff. energies + 1 bit for LC coding mode Q0*/
    2132             : }
    2133             : 
    2134             : 
    2135             : /*--------------------------------------------------------------------------*
    2136             :  * small_symbol_enc()
    2137             :  *
    2138             :  * Huffman encoding of differential energies, estimating or packing bits
    2139             :  * if flag_pack = 0, LC mode info. is output else LC mode info. is input
    2140             :  * if flag_pack = 0, estimatng else packing bits
    2141             :  *--------------------------------------------------------------------------*/
    2142             : 
    2143             : /* o  : bits  */
    2144          76 : static Word16 small_symbol_enc_fx(
    2145             :     BSTR_ENC_HANDLE hBstr,  /* i  : handle to the bitstream                  */
    2146             :     const Word16 *qbidx,    /* i  : input of dequantized differential energy Q0*/
    2147             :     const Word16 BANDS,     /* i  : number of bands                          Q0*/
    2148             :     Word16 *hLCmode,        /* i/o: LC mode info                             Q0*/
    2149             :     const Word16 flag_pack, /* i  : indicator of packing or estimating bits  Q0*/
    2150             :     const Word16 is_transient /* Q0 */ )
    2151             : {
    2152             :     Word16 i, bits;
    2153             :     Word16 difidx[BANDS_MAX], LSB[BANDS_MAX];
    2154             : 
    2155             :     /* Preparing lossless coding input */
    2156          76 :     difidx[0] = add( qbidx[0], DE_OFFSET0 ); /* Q0 */
    2157          76 :     move16();
    2158             : 
    2159        1672 :     FOR( i = 1; i < BANDS; ++i )
    2160             :     {
    2161        1596 :         difidx[i] = add( qbidx[i], DE_OFFSET1 ); /* Q0 */
    2162        1596 :         move16();
    2163             :     }
    2164             : 
    2165        1748 :     FOR( i = 0; i < BANDS; ++i )
    2166             :     {
    2167        1672 :         test();
    2168        1672 :         IF( GE_16( difidx[i], DE_LIMIT ) || difidx[i] < 0 )
    2169             :         {
    2170             :             /* Huffman cannot encode this vector */
    2171           0 :             return -1;
    2172             :         }
    2173             :     }
    2174             : 
    2175             :     /* splitting MSB and LSB */
    2176        1748 :     FOR( i = 0; i < BANDS; ++i )
    2177             :     {
    2178        1672 :         LSB[i] = s_and( difidx[i], 1 ); /* Q0 */
    2179        1672 :         move16();
    2180        1672 :         difidx[i] = shr( difidx[i], 1 ); /* Q0 */
    2181        1672 :         move16();
    2182             :     }
    2183             : 
    2184             :     /* Preparing lossless coding input */
    2185          76 :     IF( flag_pack == 0 )
    2186             :     {
    2187             :         /* estimating # of bits */
    2188             :         /* Encoding MSB bits */
    2189          38 :         bits = encode_envelope_indices_fx( hBstr, BANDS, -1, difidx, hLCmode, flag_pack, LOW_RATE_HQ_CORE, is_transient ); /* Q0 */
    2190          38 :         bits = add( bits, BITS_DE_FCOMP );                                                                                 /* xx bits for diff. energies + BITS_DE_FCOMP bits for first energies */
    2191             : 
    2192             :         /* Encoding LSB bit packing */
    2193          38 :         bits = add( bits, BANDS ); /* Q0 */
    2194             :     }
    2195             :     ELSE
    2196             :     {
    2197             :         /* Encoding MSB bits */
    2198          38 :         bits = 0;
    2199          38 :         move16();
    2200          38 :         encode_envelope_indices_fx( hBstr, BANDS, -1, difidx, hLCmode, flag_pack, LOW_RATE_HQ_CORE, is_transient );
    2201             : 
    2202             :         /* Encoding LSB bit packing */
    2203         874 :         FOR( i = 0; i < BANDS; ++i )
    2204             :         {
    2205         836 :             push_indice( hBstr, IND_HQ2_DIFF_ENERGY, LSB[i], BITS_DE_LSB );
    2206             :         }
    2207             :     }
    2208             : 
    2209          76 :     return add( bits, BITS_DE_HMODE ); /* xx bits for diff. energies + 1 bit for LC coding mode Q0*/
    2210             : }
    2211             : 
    2212           0 : static Word16 small_symbol_enc_ivas_fx(
    2213             :     BSTR_ENC_HANDLE hBstr,  /* i/o: encoder bitstream handle                 */
    2214             :     const Word16 *qbidx,    /* i  : input of dequantized differential energy Q0*/
    2215             :     const Word16 BANDS,     /* i  : number of bands                          Q0*/
    2216             :     Word16 *hLCmode,        /* i/o: LC mode info                             Q0*/
    2217             :     const Word16 flag_pack, /* i  : indicator of packing or estimating bits  Q0*/
    2218             :     const Word16 is_transient /* Q0 */ )
    2219             : {
    2220             :     Word16 i, bits;
    2221             :     Word16 difidx[BANDS_MAX], LSB[BANDS_MAX];
    2222             : 
    2223             :     /* Preparing lossless coding input */
    2224           0 :     difidx[0] = add( qbidx[0], DE_OFFSET0 ); /* Q0 */
    2225           0 :     move16();
    2226             : 
    2227           0 :     FOR( i = 1; i < BANDS; ++i )
    2228             :     {
    2229           0 :         difidx[i] = add( qbidx[i], DE_OFFSET1 ); /* Q0 */
    2230           0 :         move16();
    2231             :     }
    2232             : 
    2233           0 :     FOR( i = 0; i < BANDS; ++i )
    2234             :     {
    2235           0 :         test();
    2236           0 :         IF( GE_16( difidx[i], DE_LIMIT ) || difidx[i] < 0 )
    2237             :         {
    2238             :             /* Huffman cannot encode this vector */
    2239           0 :             return -1;
    2240             :         }
    2241             :     }
    2242             : 
    2243             :     /* splitting MSB and LSB */
    2244           0 :     FOR( i = 0; i < BANDS; ++i )
    2245             :     {
    2246           0 :         LSB[i] = s_and( difidx[i], 1 ); /* Q0 */
    2247           0 :         move16();
    2248           0 :         difidx[i] = shr( difidx[i], 1 ); /* Q0 */
    2249           0 :         move16();
    2250             :     }
    2251             : 
    2252             :     /* Preparing lossless coding input */
    2253           0 :     IF( flag_pack == 0 )
    2254             :     {
    2255             :         /* estimating # of bits */
    2256             :         /* Encoding MSB bits */
    2257           0 :         bits = encode_envelope_indices_ivas_fx( hBstr, BANDS, -1, difidx, hLCmode, flag_pack, LOW_RATE_HQ_CORE, is_transient ); /* Q0 */
    2258           0 :         bits = add( bits, BITS_DE_FCOMP );                                                                                      /* xx bits for diff. energies + BITS_DE_FCOMP bits for first energies Q0*/
    2259             : 
    2260             :         /* Encoding LSB bit packing */
    2261           0 :         bits = add( bits, BANDS ); /* Q0 */
    2262             :     }
    2263             :     ELSE
    2264             :     {
    2265             :         /* Encoding MSB bits */
    2266           0 :         bits = 0;
    2267           0 :         move16();
    2268           0 :         encode_envelope_indices_ivas_fx( hBstr, BANDS, -1, difidx, hLCmode, flag_pack, LOW_RATE_HQ_CORE, is_transient );
    2269             : 
    2270             :         /* Encoding LSB bit packing */
    2271           0 :         FOR( i = 0; i < BANDS; ++i )
    2272             :         {
    2273           0 :             push_indice( hBstr, IND_HQ2_DIFF_ENERGY, LSB[i], BITS_DE_LSB );
    2274             :         }
    2275             :     }
    2276             : 
    2277           0 :     return add( bits, BITS_DE_HMODE ); /* xx bits for diff. energies + 1 bit for LC coding mode Q0*/
    2278             : }
    2279             : 
    2280             : 
    2281             : /* o  : bits  Q0 */
    2282          39 : static Word16 large_symbol_enc_fx(
    2283             :     BSTR_ENC_HANDLE hBstr, /* i  : handle to the bitstream                  */
    2284             :     Word16 *qbidx,         /* i  : input of dequantized differential energy Q0*/
    2285             :     const Word16 BANDS,    /* i  : number of bands                          Q0*/
    2286             :     Word16 *hLCmode0,      /* i/o: LC mode info                             Q0*/
    2287             :     const Word16 flag_pack /* i  : indicator of packing or estimating bits  Q0*/
    2288             : )
    2289             : {
    2290             :     Word16 i, bits, tmp;
    2291             :     Word16 LSB1[BANDS_MAX];
    2292             :     Word16 min_q, max_q, offset0;
    2293             :     Word16 min_bits, min_bits_pos;
    2294             :     Word16 tdifidx0[BANDS_MAX], tdifidx1[BANDS_MAX];
    2295             :     Word16 basic_shift;
    2296             :     Word16 bitsmode0, bitsmode1;
    2297             :     Word16 lsbdepth1;
    2298             :     Word16 cnt_outlyer, pos_outlyer, cnt_outlyer0;
    2299             : 
    2300          39 :     min_q = 513; /* Q0 */
    2301          39 :     move16();
    2302          39 :     max_q = -1;
    2303          39 :     move16();
    2304             : 
    2305          39 :     cnt_outlyer0 = 0;
    2306          39 :     move16();
    2307          39 :     cnt_outlyer = 0;
    2308          39 :     move16();
    2309          39 :     bitsmode0 = 0;
    2310          39 :     move16();
    2311          39 :     bitsmode1 = 0;
    2312          39 :     move16();
    2313          39 :     pos_outlyer = 0;
    2314          39 :     move16();
    2315          39 :     lsbdepth1 = 0;
    2316          39 :     move16();
    2317             : 
    2318          39 :     test();
    2319          39 :     test();
    2320          39 :     IF( flag_pack == 0 || ( EQ_16( flag_pack, 1 ) && *hLCmode0 == 0 ) )
    2321             :     {
    2322          39 :         test();
    2323          39 :         test();
    2324          39 :         IF( GT_16( qbidx[0], sub( ABS_ENG_OFFSET, 1 ) ) || LT_16( qbidx[0], -ABS_ENG_OFFSET ) )
    2325             :         {
    2326           0 :             cnt_outlyer0 = 2;
    2327           0 :             move16();
    2328             :         }
    2329          39 :         ELSE IF( GT_16( qbidx[0], 3 ) || LT_16( qbidx[0], -4 ) )
    2330             :         {
    2331          35 :             cnt_outlyer0 = 1;
    2332          35 :             move16();
    2333             :         }
    2334             :         ELSE
    2335             :         {
    2336           4 :             cnt_outlyer0 = 0;
    2337           4 :             move16();
    2338             :         }
    2339             : 
    2340          39 :         cnt_outlyer = 0;
    2341          39 :         move16();
    2342          39 :         pos_outlyer = -1;
    2343          39 :         move16();
    2344         868 :         FOR( i = 1; i < BANDS; ++i )
    2345             :         {
    2346         829 :             test();
    2347         829 :             IF( GT_16( qbidx[i], 3 ) || LT_16( qbidx[i], -4 ) )
    2348             :             {
    2349         237 :                 cnt_outlyer = add( cnt_outlyer, 1 ); /* Q0 */
    2350         237 :                 pos_outlyer = i;
    2351         237 :                 move16();
    2352             :             }
    2353             : 
    2354         829 :             test();
    2355         829 :             IF( GT_16( qbidx[i], ( ABS_ENG_OFFSET - 1 ) ) || LT_16( qbidx[i], -ABS_ENG_OFFSET ) )
    2356             :             {
    2357           0 :                 cnt_outlyer = add( cnt_outlyer, 1 ); /* Q0 */
    2358             :             }
    2359             :         }
    2360             : 
    2361          39 :         test();
    2362          39 :         test();
    2363          39 :         IF( cnt_outlyer0 == 0 && LE_16( cnt_outlyer, 1 ) )
    2364             :         {
    2365           2 :             bitsmode0 = ( BITS_DE_8SMODE + BITS_DE_8SMODE_N0 ) + BITS_DE_8SMODE_N1; /* Q0 */
    2366           2 :             move16();
    2367           2 :             IF( EQ_16( cnt_outlyer, 1 ) )
    2368             :             {
    2369             :                 /* 01 */
    2370           1 :                 bitsmode0 = add( bitsmode0, ( BITS_DE_8SPOS + BITS_ABS_ENG ) ); /* Q0 */
    2371             :             }
    2372             : 
    2373           3 :             FOR( i = 0; i < pos_outlyer; ++i )
    2374             :             {
    2375           1 :                 tdifidx0[i] = qbidx[i]; /* Q0 */
    2376           1 :                 move16();
    2377           1 :                 bitsmode0 = add( bitsmode0, hessize[tdifidx0[i] + 4] ); /* Q0 */
    2378             :             }
    2379             : 
    2380          54 :             FOR( i = add( pos_outlyer, 1 ); i < BANDS; ++i )
    2381             :             {
    2382          52 :                 tdifidx0[i] = qbidx[i]; /* Q0 */
    2383          52 :                 move16();
    2384          52 :                 bitsmode0 = add( bitsmode0, hessize[tdifidx0[i] + 4] ); /* Q0 */
    2385             :             }
    2386             :         }
    2387          37 :         ELSE IF( EQ_16( cnt_outlyer0, 1 ) && LE_16( cnt_outlyer, 1 ) )
    2388             :         {
    2389           5 :             bitsmode0 = ( BITS_DE_8SMODE + BITS_DE_8SMODE_N0 ) + BITS_DE_8SMODE_N1; /* Q0 */
    2390           5 :             move16();
    2391           5 :             tdifidx0[0] = qbidx[0]; /* Q0 */
    2392           5 :             move16();
    2393           5 :             bitsmode0 = add( bitsmode0, BITS_ABS_ENG );
    2394           5 :             IF( EQ_16( cnt_outlyer, 1 ) )
    2395             :             {
    2396             :                 /* 11 */
    2397           5 :                 bitsmode0 = add( bitsmode0, ( BITS_DE_8SPOS + BITS_ABS_ENG ) ); /* Q0 */
    2398             :             }
    2399             :             ELSE
    2400             :             {
    2401           0 :                 pos_outlyer = 0;
    2402           0 :                 move16();
    2403             :             }
    2404             : 
    2405          11 :             FOR( i = 1; i < pos_outlyer; ++i )
    2406             :             {
    2407           6 :                 tdifidx0[i] = qbidx[i]; /* Q0 */
    2408           6 :                 move16();
    2409           6 :                 bitsmode0 = add( bitsmode0, hessize[tdifidx0[i] + 4] ); /* Q0 */
    2410             :             }
    2411             : 
    2412          99 :             FOR( i = add( pos_outlyer, 1 ); i < BANDS; ++i )
    2413             :             {
    2414          94 :                 tdifidx0[i] = qbidx[i]; /* Q0 */
    2415          94 :                 move16();
    2416          94 :                 bitsmode0 = add( bitsmode0, hessize[tdifidx0[i] + 4] ); /* Q0 */
    2417             :             }
    2418             :         }
    2419             :         ELSE
    2420             :         {
    2421          32 :             bitsmode0 = 20000;
    2422          32 :             move16();
    2423             :         }
    2424             :     }
    2425             : 
    2426          39 :     test();
    2427          39 :     IF( flag_pack == 0 || EQ_16( *hLCmode0, 1 ) )
    2428             :     {
    2429             :         /* components 0 range : -256~255 */
    2430          39 :         max_q = MINIMUM_ENERGY_LOWBRATE;
    2431          39 :         move16();
    2432          39 :         min_q = MAXIMUM_ENERGY_LOWBRATE;
    2433          39 :         move16();
    2434         907 :         FOR( i = 0; i < BANDS; ++i )
    2435             :         {
    2436         868 :             max_q = s_max( qbidx[i], max_q );
    2437         868 :             min_q = s_min( qbidx[i], min_q );
    2438             :         }
    2439             : 
    2440             :         /* Counting bits for transmitting all components using same method */
    2441         126 :         FOR( i = 0;; ++i )
    2442             :         {
    2443             :             /*if (max_q <= ((2<<(i+1))-1) && min_q >= -(2<<(i+1))) */
    2444         126 :             test();
    2445         126 :             IF( LE_16( max_q, sub( shl( 2, add( i, 1 ) ), 1 ) ) && GE_16( min_q, -shl( 2, add( i, 1 ) ) ) )
    2446             :             {
    2447          39 :                 BREAK;
    2448             :             }
    2449             :         }
    2450          39 :         basic_shift = i;
    2451          39 :         move16();
    2452             : 
    2453          39 :         min_bits = 1000; /* Q0 */
    2454          39 :         move16();
    2455          39 :         min_bits_pos = basic_shift; /* Q0 */
    2456          39 :         move16();
    2457          39 :         tmp = add( basic_shift, 3 );
    2458         156 :         FOR( offset0 = basic_shift; offset0 < tmp; offset0++ )
    2459             :         {
    2460         117 :             max_q = MINIMUM_ENERGY_LOWBRATE;
    2461         117 :             move16();
    2462         117 :             min_q = MAXIMUM_ENERGY_LOWBRATE;
    2463         117 :             move16();
    2464             : 
    2465         117 :             bitsmode1 = add( BITS_DE_8SMODE, BITS_MAX_DEPTH ); /* Q0 */
    2466        2721 :             FOR( i = 0; i < BANDS; ++i )
    2467             :             {
    2468        2604 :                 bitsmode1 = add( bitsmode1, add( hessize[( ( qbidx[i] >> offset0 ) + 4 )], offset0 ) );
    2469             :             }
    2470             : 
    2471         117 :             IF( GT_16( min_bits, bitsmode1 ) )
    2472             :             {
    2473          49 :                 min_bits_pos = offset0; /* Q0 */
    2474          49 :                 move16();
    2475          49 :                 min_bits = bitsmode1; /* Q0 */
    2476          49 :                 move16();
    2477             :             }
    2478             :         }
    2479             : 
    2480          39 :         bitsmode1 = min_bits;
    2481          39 :         move16();
    2482          39 :         lsbdepth1 = min_bits_pos;
    2483          39 :         move16();
    2484             : 
    2485         907 :         FOR( i = 0; i < BANDS; ++i )
    2486             :         {
    2487         868 :             LSB1[i] = s_and( qbidx[i], sub( shl( 1, lsbdepth1 ), 1 ) );
    2488         868 :             tdifidx1[i] = shr( qbidx[i], lsbdepth1 );
    2489         868 :             move16();
    2490         868 :             move16();
    2491             :         }
    2492             :     }
    2493             : 
    2494             :     /* Preparing lossless coding input */
    2495          39 :     IF( flag_pack == 0 )
    2496             :     {
    2497             :         /* estimating # of bits */
    2498             :         /* Encoding MSB bits */
    2499          39 :         IF( LT_16( bitsmode0, bitsmode1 ) )
    2500             :         {
    2501           5 :             bits = bitsmode0; /* Q0 */
    2502           5 :             move16();
    2503           5 :             *hLCmode0 = 0;
    2504           5 :             move16();
    2505             :         }
    2506             :         ELSE
    2507             :         {
    2508          34 :             bits = bitsmode1; /* Q0 */
    2509          34 :             move16();
    2510          34 :             *hLCmode0 = 1;
    2511          34 :             move16();
    2512             :         }
    2513             :     }
    2514             :     ELSE
    2515             :     {
    2516             :         /* Encoding MSB bits */
    2517           0 :         IF( *hLCmode0 == 0 )
    2518             :         {
    2519           0 :             push_indice( hBstr, IND_HQ2_DENG_8SMODE, 0, BITS_DE_8SMODE );
    2520           0 :             bits = BITS_DE_8SMODE;
    2521           0 :             move16();
    2522           0 :             IF( cnt_outlyer0 == 0 )
    2523             :             {
    2524           0 :                 push_indice( hBstr, IND_HQ2_DENG_8SMODE_N0, 0, BITS_DE_8SMODE_N0 );
    2525           0 :                 bits = add( bits, BITS_DE_8SMODE_N0 );
    2526           0 :                 IF( EQ_16( cnt_outlyer, 1 ) )
    2527             :                 {
    2528             :                     /* 01 */
    2529           0 :                     push_indice( hBstr, IND_HQ2_DENG_8SMODE_N1, 1, BITS_DE_8SMODE_N1 );
    2530           0 :                     bits = add( bits, BITS_DE_8SMODE_N1 ); /* Q0 */
    2531           0 :                     push_indice( hBstr, IND_HQ2_DENG_8SPOS, pos_outlyer, BITS_DE_8SPOS );
    2532           0 :                     bits = add( bits, BITS_DE_8SPOS );
    2533           0 :                     push_indice( hBstr, IND_HQ2_DIFF_ENERGY, qbidx[pos_outlyer] + ABS_ENG_OFFSET, BITS_ABS_ENG );
    2534           0 :                     bits = add( bits, BITS_ABS_ENG );
    2535             :                 }
    2536             :                 ELSE
    2537             :                 {
    2538             :                     /* 00 */
    2539           0 :                     push_indice( hBstr, IND_HQ2_DENG_8SMODE_N1, 0, BITS_DE_8SMODE_N1 );
    2540           0 :                     bits = add( bits, BITS_DE_8SMODE_N1 ); /* Q0 */
    2541             :                 }
    2542             : 
    2543           0 :                 FOR( i = 0; i < pos_outlyer; ++i )
    2544             :                 {
    2545           0 :                     push_indice( hBstr, IND_HQ2_DIFF_ENERGY, hescode[tdifidx0[i] + 4], hessize[tdifidx0[i] + 4] );
    2546           0 :                     bitsmode0 = add( bitsmode0, hessize[tdifidx0[i] + 4] ); /* Q0 */
    2547             :                 }
    2548             : 
    2549           0 :                 FOR( i = ( pos_outlyer + 1 ); i < BANDS; ++i )
    2550             :                 {
    2551           0 :                     push_indice( hBstr, IND_HQ2_DIFF_ENERGY, hescode[tdifidx0[i] + 4], hessize[tdifidx0[i] + 4] );
    2552           0 :                     bitsmode0 = add( bitsmode0, hessize[tdifidx0[i] + 4] ); /* Q0 */
    2553             :                 }
    2554             :             }
    2555           0 :             ELSE IF( EQ_16( cnt_outlyer0, 1 ) )
    2556             :             {
    2557           0 :                 push_indice( hBstr, IND_HQ2_DENG_8SMODE_N0, 1, BITS_DE_8SMODE_N0 );
    2558           0 :                 bits = add( bits, BITS_DE_8SMODE_N0 );
    2559           0 :                 IF( EQ_16( cnt_outlyer, 1 ) )
    2560             :                 {
    2561           0 :                     push_indice( hBstr, IND_HQ2_DENG_8SMODE_N1, 1, BITS_DE_8SMODE_N1 );
    2562           0 :                     bits = add( bits, BITS_DE_8SMODE_N1 ); /* Q0 */
    2563           0 :                     push_indice( hBstr, IND_HQ2_DENG_8SPOS, pos_outlyer, BITS_DE_8SPOS );
    2564           0 :                     bits = add( bits, BITS_DE_8SPOS );
    2565           0 :                     push_indice( hBstr, IND_HQ2_DIFF_ENERGY, qbidx[0] + ABS_ENG_OFFSET, BITS_ABS_ENG );
    2566           0 :                     bits = add( bits, BITS_ABS_ENG );
    2567           0 :                     push_indice( hBstr, IND_HQ2_DIFF_ENERGY, qbidx[pos_outlyer] + ABS_ENG_OFFSET, BITS_ABS_ENG );
    2568           0 :                     bits = add( bits, BITS_ABS_ENG );
    2569             :                 }
    2570             :                 ELSE
    2571             :                 {
    2572           0 :                     push_indice( hBstr, IND_HQ2_DENG_8SMODE_N1, 0, BITS_DE_8SMODE_N1 );
    2573           0 :                     bits = add( bits, BITS_DE_8SMODE_N1 ); /* Q0 */
    2574           0 :                     push_indice( hBstr, IND_HQ2_DIFF_ENERGY, qbidx[0] + ABS_ENG_OFFSET, BITS_ABS_ENG );
    2575           0 :                     bits = add( bits, BITS_ABS_ENG ); /* Q0 */
    2576             :                 }
    2577             : 
    2578           0 :                 FOR( i = 1; i < pos_outlyer; ++i )
    2579             :                 {
    2580           0 :                     push_indice( hBstr, IND_HQ2_DIFF_ENERGY, hescode[tdifidx0[i] + 4], hessize[tdifidx0[i] + 4] );
    2581           0 :                     bits = add( bits, hessize[tdifidx0[i] + 4] ); /* Q0 */
    2582             :                 }
    2583             : 
    2584           0 :                 FOR( i = pos_outlyer + 1; i < BANDS; ++i )
    2585             :                 {
    2586           0 :                     push_indice( hBstr, IND_HQ2_DIFF_ENERGY, hescode[tdifidx0[i] + 4], hessize[tdifidx0[i] + 4] );
    2587           0 :                     bits = add( bits, hessize[tdifidx0[i] + 4] ); /* Q0 */
    2588             :                 }
    2589             :             }
    2590             :         }
    2591             :         ELSE
    2592             :         {
    2593           0 :             bits = add( BITS_DE_8SMODE, BITS_MAX_DEPTH ); /* Q0 */
    2594           0 :             push_indice( hBstr, IND_HQ2_DENG_8SMODE, 1, BITS_DE_8SMODE );
    2595           0 :             push_indice( hBstr, IND_HQ2_DENG_8SDEPTH, lsbdepth1, BITS_MAX_DEPTH );
    2596             : 
    2597           0 :             FOR( i = 0; i < BANDS; ++i )
    2598             :             {
    2599           0 :                 push_indice( hBstr, IND_HQ2_DIFF_ENERGY, hescode[tdifidx1[i] + 4], hessize[tdifidx1[i] + 4] );
    2600           0 :                 bits = add( bits, hessize[tdifidx1[i] + 4] ); /* Q0 */
    2601             :             }
    2602             : 
    2603           0 :             IF( lsbdepth1 > 0 )
    2604             :             {
    2605           0 :                 FOR( i = 0; i < BANDS; ++i )
    2606             :                 {
    2607           0 :                     push_indice( hBstr, IND_HQ2_DIFF_ENERGY, LSB1[i], lsbdepth1 );
    2608             :                 }
    2609             :                 /*bits += BANDS * lsbdepth1; */
    2610           0 :                 bits = add( bits, extract_h( L_shl( L_mult( BANDS, lsbdepth1 ), 15 ) ) ); /* Q0 */
    2611             :             }
    2612             :         }
    2613             :     }
    2614             : 
    2615          39 :     return bits; /* xx bits for diff. energies + 1 bit for LC coding mode Q0*/
    2616             : }
    2617             : 
    2618             : 
    2619           0 : static Word16 large_symbol_enc_ivas_fx(
    2620             :     BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle                 */
    2621             :     Word16 *qbidx,         /* i  : input of dequantized differential energy Q0*/
    2622             :     const Word16 BANDS,    /* i  : number of bands                          Q0*/
    2623             :     Word16 *hLCmode0,      /* i/o: LC mode info                             Q0*/
    2624             :     const Word16 flag_pack /* i  : indicator of packing or estimating bits  Q0*/
    2625             : )
    2626             : {
    2627             :     Word16 i, bits, tmp;
    2628             :     Word16 LSB1[BANDS_MAX];
    2629             :     Word16 min_q, max_q, offset0;
    2630             :     Word16 min_bits, min_bits_pos;
    2631             :     Word16 tdifidx0[BANDS_MAX], tdifidx1[BANDS_MAX];
    2632             :     Word16 basic_shift;
    2633             :     Word16 bitsmode0, bitsmode1;
    2634             :     Word16 lsbdepth1;
    2635             :     Word16 cnt_outlyer, pos_outlyer, cnt_outlyer0;
    2636             : 
    2637           0 :     min_q = 513; /* Q0 */
    2638           0 :     move16();
    2639           0 :     max_q = -1;
    2640           0 :     move16();
    2641             : 
    2642           0 :     cnt_outlyer0 = 0;
    2643           0 :     move16();
    2644           0 :     cnt_outlyer = 0;
    2645           0 :     move16();
    2646           0 :     bitsmode0 = 0;
    2647           0 :     move16();
    2648           0 :     bitsmode1 = 0;
    2649           0 :     move16();
    2650           0 :     pos_outlyer = 0;
    2651           0 :     move16();
    2652           0 :     lsbdepth1 = 0;
    2653           0 :     move16();
    2654             : 
    2655           0 :     test();
    2656           0 :     test();
    2657           0 :     IF( flag_pack == 0 || ( EQ_16( flag_pack, 1 ) && *hLCmode0 == 0 ) )
    2658             :     {
    2659           0 :         test();
    2660           0 :         test();
    2661           0 :         IF( GT_16( qbidx[0], sub( ABS_ENG_OFFSET, 1 ) ) || LT_16( qbidx[0], -ABS_ENG_OFFSET ) )
    2662             :         {
    2663           0 :             cnt_outlyer0 = 2;
    2664           0 :             move16();
    2665             :         }
    2666           0 :         ELSE IF( GT_16( qbidx[0], 3 ) || LT_16( qbidx[0], -4 ) )
    2667             :         {
    2668           0 :             cnt_outlyer0 = 1;
    2669           0 :             move16();
    2670             :         }
    2671             :         ELSE
    2672             :         {
    2673           0 :             cnt_outlyer0 = 0;
    2674           0 :             move16();
    2675             :         }
    2676             : 
    2677           0 :         cnt_outlyer = 0;
    2678           0 :         move16();
    2679           0 :         pos_outlyer = -1;
    2680           0 :         move16();
    2681           0 :         FOR( i = 1; i < BANDS; ++i )
    2682             :         {
    2683           0 :             test();
    2684           0 :             IF( GT_16( qbidx[i], 3 ) || LT_16( qbidx[i], -4 ) )
    2685             :             {
    2686           0 :                 cnt_outlyer = add( cnt_outlyer, 1 ); /* Q0 */
    2687           0 :                 pos_outlyer = i;
    2688           0 :                 move16();
    2689             :             }
    2690             : 
    2691           0 :             test();
    2692           0 :             IF( GT_16( qbidx[i], ( ABS_ENG_OFFSET - 1 ) ) || LT_16( qbidx[i], -ABS_ENG_OFFSET ) )
    2693             :             {
    2694           0 :                 cnt_outlyer = add( cnt_outlyer, 1 ); /* Q0 */
    2695             :             }
    2696             :         }
    2697             : 
    2698           0 :         test();
    2699           0 :         test();
    2700           0 :         IF( cnt_outlyer0 == 0 && LE_16( cnt_outlyer, 1 ) )
    2701             :         {
    2702           0 :             bitsmode0 = ( BITS_DE_8SMODE + BITS_DE_8SMODE_N0 ) + BITS_DE_8SMODE_N1; /* Q0 */
    2703           0 :             move16();
    2704           0 :             IF( EQ_16( cnt_outlyer, 1 ) )
    2705             :             {
    2706             :                 /* 01 */
    2707           0 :                 bitsmode0 = add( bitsmode0, add( BITS_DE_8SPOS, BITS_ABS_ENG ) ); /* Q0 */
    2708             :             }
    2709             : 
    2710           0 :             FOR( i = 0; i < pos_outlyer; ++i )
    2711             :             {
    2712           0 :                 tdifidx0[i] = qbidx[i]; /* Q0 */
    2713           0 :                 move16();
    2714           0 :                 bitsmode0 = add( bitsmode0, hessize[tdifidx0[i] + 4] ); /* Q0 */
    2715             :             }
    2716             : 
    2717           0 :             FOR( i = ( pos_outlyer + 1 ); i < BANDS; ++i )
    2718             :             {
    2719           0 :                 tdifidx0[i] = qbidx[i]; /* Q0 */
    2720           0 :                 move16();
    2721           0 :                 bitsmode0 = add( bitsmode0, hessize[tdifidx0[i] + 4] ); /* Q0 */
    2722             :             }
    2723             :         }
    2724           0 :         ELSE IF( EQ_16( cnt_outlyer0, 1 ) && LE_16( cnt_outlyer, 1 ) )
    2725             :         {
    2726           0 :             bitsmode0 = ( BITS_DE_8SMODE + BITS_DE_8SMODE_N0 ) + BITS_DE_8SMODE_N1; /* Q0 */
    2727           0 :             move16();
    2728           0 :             tdifidx0[0] = qbidx[0]; /* Q0 */
    2729           0 :             move16();
    2730           0 :             bitsmode0 = add( bitsmode0, BITS_ABS_ENG ); /* Q0 */
    2731           0 :             IF( EQ_16( cnt_outlyer, 1 ) )
    2732             :             {
    2733             :                 /* 11 */
    2734           0 :                 bitsmode0 = add( bitsmode0, ( BITS_DE_8SPOS + BITS_ABS_ENG ) ); /* Q0 */
    2735             :             }
    2736             :             ELSE
    2737             :             {
    2738           0 :                 pos_outlyer = 0;
    2739           0 :                 move16();
    2740             :             }
    2741             : 
    2742           0 :             FOR( i = 1; i < pos_outlyer; ++i )
    2743             :             {
    2744           0 :                 tdifidx0[i] = qbidx[i]; /* Q0 */
    2745           0 :                 move16();
    2746           0 :                 bitsmode0 = add( bitsmode0, hessize[tdifidx0[i] + 4] ); /* Q0 */
    2747             :             }
    2748             : 
    2749           0 :             FOR( i = ( pos_outlyer + 1 ); i < BANDS; ++i )
    2750             :             {
    2751           0 :                 tdifidx0[i] = qbidx[i]; /* Q0 */
    2752           0 :                 move16();
    2753           0 :                 bitsmode0 = add( bitsmode0, hessize[tdifidx0[i] + 4] ); /* Q0 */
    2754             :             }
    2755             :         }
    2756             :         ELSE
    2757             :         {
    2758           0 :             bitsmode0 = 20000; /* Q0 */
    2759           0 :             move16();
    2760             :         }
    2761             :     }
    2762             : 
    2763           0 :     test();
    2764           0 :     IF( flag_pack == 0 || EQ_16( *hLCmode0, 1 ) )
    2765             :     {
    2766             :         /* components 0 range : -256~255 */
    2767           0 :         max_q = MINIMUM_ENERGY_LOWBRATE;
    2768           0 :         move16();
    2769           0 :         min_q = MAXIMUM_ENERGY_LOWBRATE;
    2770           0 :         move16();
    2771           0 :         FOR( i = 0; i < BANDS; ++i )
    2772             :         {
    2773           0 :             max_q = s_max( qbidx[i], max_q );
    2774           0 :             min_q = s_min( qbidx[i], min_q );
    2775             :         }
    2776             : 
    2777             :         /* Counting bits for transmitting all components using same method */
    2778           0 :         FOR( i = 0;; ++i )
    2779             :         {
    2780             :             /*if (max_q <= ((2<<(i+1))-1) && min_q >= -(2<<(i+1))) */
    2781           0 :             test();
    2782           0 :             IF( LE_16( max_q, sub( shl( 2, add( i, 1 ) ), 1 ) ) && GE_16( min_q, -shl( 2, add( i, 1 ) ) ) )
    2783             :             {
    2784           0 :                 BREAK;
    2785             :             }
    2786             :         }
    2787           0 :         basic_shift = i;
    2788           0 :         move16();
    2789             : 
    2790           0 :         min_bits = 1000; /* Q0 */
    2791           0 :         move16();
    2792           0 :         min_bits_pos = basic_shift; /* Q0 */
    2793           0 :         move16();
    2794           0 :         tmp = add( basic_shift, 3 );
    2795           0 :         FOR( offset0 = basic_shift; offset0 < tmp; offset0++ )
    2796             :         {
    2797           0 :             max_q = MINIMUM_ENERGY_LOWBRATE;
    2798           0 :             move16();
    2799           0 :             min_q = MAXIMUM_ENERGY_LOWBRATE;
    2800           0 :             move16();
    2801             : 
    2802           0 :             bitsmode1 = ( BITS_DE_8SMODE + BITS_MAX_DEPTH ); /* Q0 */
    2803           0 :             move16();
    2804           0 :             FOR( i = 0; i < BANDS; ++i )
    2805             :             {
    2806           0 :                 bitsmode1 = add( bitsmode1, add( hessize[( ( qbidx[i] >> offset0 ) + 4 )], offset0 ) ); /* Q0 */
    2807             :             }
    2808             : 
    2809           0 :             IF( GT_16( min_bits, bitsmode1 ) )
    2810             :             {
    2811           0 :                 min_bits_pos = offset0; /* Q0 */
    2812           0 :                 move16();
    2813           0 :                 min_bits = bitsmode1; /* Q0 */
    2814           0 :                 move16();
    2815             :             }
    2816             :         }
    2817             : 
    2818           0 :         bitsmode1 = min_bits; /* Q0 */
    2819           0 :         move16();
    2820           0 :         lsbdepth1 = min_bits_pos; /* Q0 */
    2821           0 :         move16();
    2822             : 
    2823           0 :         FOR( i = 0; i < BANDS; ++i )
    2824             :         {
    2825           0 :             LSB1[i] = s_and( qbidx[i], sub( shl( 1, lsbdepth1 ), 1 ) );
    2826           0 :             tdifidx1[i] = shr( qbidx[i], lsbdepth1 );
    2827           0 :             move16();
    2828           0 :             move16();
    2829             :         }
    2830             :     }
    2831             : 
    2832             :     /* Preparing lossless coding input */
    2833           0 :     IF( flag_pack == 0 )
    2834             :     {
    2835             :         /* estimating # of bits */
    2836             :         /* Encoding MSB bits */
    2837           0 :         IF( LT_16( bitsmode0, bitsmode1 ) )
    2838             :         {
    2839           0 :             bits = bitsmode0; /* Q0 */
    2840           0 :             move16();
    2841           0 :             *hLCmode0 = 0;
    2842           0 :             move16();
    2843             :         }
    2844             :         ELSE
    2845             :         {
    2846           0 :             bits = bitsmode1; /* Q0 */
    2847           0 :             move16();
    2848           0 :             *hLCmode0 = 1;
    2849           0 :             move16();
    2850             :         }
    2851             :     }
    2852             :     ELSE
    2853             :     {
    2854             :         /* Encoding MSB bits */
    2855           0 :         IF( *hLCmode0 == 0 )
    2856             :         {
    2857           0 :             push_indice( hBstr, IND_HQ2_DENG_8SMODE, 0, BITS_DE_8SMODE );
    2858           0 :             bits = BITS_DE_8SMODE;
    2859           0 :             move16();
    2860           0 :             IF( cnt_outlyer0 == 0 )
    2861             :             {
    2862           0 :                 push_indice( hBstr, IND_HQ2_DENG_8SMODE_N0, 0, BITS_DE_8SMODE_N0 );
    2863           0 :                 bits = add( bits, BITS_DE_8SMODE_N0 );
    2864           0 :                 IF( EQ_16( cnt_outlyer, 1 ) )
    2865             :                 {
    2866             :                     /* 01 */
    2867           0 :                     push_indice( hBstr, IND_HQ2_DENG_8SMODE_N1, 1, BITS_DE_8SMODE_N1 );
    2868           0 :                     bits = add( bits, BITS_DE_8SMODE_N1 ); /* Q0 */
    2869           0 :                     push_indice( hBstr, IND_HQ2_DENG_8SPOS, pos_outlyer, BITS_DE_8SPOS );
    2870           0 :                     bits = add( bits, BITS_DE_8SPOS );
    2871           0 :                     push_indice( hBstr, IND_HQ2_DIFF_ENERGY, qbidx[pos_outlyer] + ABS_ENG_OFFSET, BITS_ABS_ENG );
    2872           0 :                     bits = add( bits, BITS_ABS_ENG );
    2873             :                 }
    2874             :                 ELSE
    2875             :                 {
    2876             :                     /* 00 */
    2877           0 :                     push_indice( hBstr, IND_HQ2_DENG_8SMODE_N1, 0, BITS_DE_8SMODE_N1 );
    2878           0 :                     bits = add( bits, BITS_DE_8SMODE_N1 ); /* Q0 */
    2879             :                 }
    2880             : 
    2881           0 :                 FOR( i = 0; i < pos_outlyer; ++i )
    2882             :                 {
    2883           0 :                     push_indice( hBstr, IND_HQ2_DIFF_ENERGY, hescode[tdifidx0[i] + 4], hessize[tdifidx0[i] + 4] );
    2884           0 :                     bitsmode0 = add( bitsmode0, hessize[tdifidx0[i] + 4] ); /* Q0 */
    2885             :                 }
    2886             : 
    2887           0 :                 FOR( i = ( pos_outlyer + 1 ); i < BANDS; ++i )
    2888             :                 {
    2889           0 :                     push_indice( hBstr, IND_HQ2_DIFF_ENERGY, hescode[tdifidx0[i] + 4], hessize[tdifidx0[i] + 4] );
    2890           0 :                     bitsmode0 = add( bitsmode0, hessize[tdifidx0[i] + 4] ); /* Q0 */
    2891             :                 }
    2892             :             }
    2893           0 :             ELSE IF( EQ_16( cnt_outlyer0, 1 ) )
    2894             :             {
    2895           0 :                 push_indice( hBstr, IND_HQ2_DENG_8SMODE_N0, 1, BITS_DE_8SMODE_N0 );
    2896           0 :                 bits = add( bits, BITS_DE_8SMODE_N0 ); /* Q0 */
    2897           0 :                 IF( EQ_16( cnt_outlyer, 1 ) )
    2898             :                 {
    2899           0 :                     push_indice( hBstr, IND_HQ2_DENG_8SMODE_N1, 1, BITS_DE_8SMODE_N1 );
    2900           0 :                     bits = add( bits, BITS_DE_8SMODE_N1 ); /* Q0 */
    2901           0 :                     push_indice( hBstr, IND_HQ2_DENG_8SPOS, pos_outlyer, BITS_DE_8SPOS );
    2902           0 :                     bits = add( bits, BITS_DE_8SPOS );
    2903           0 :                     push_indice( hBstr, IND_HQ2_DIFF_ENERGY, qbidx[0] + ABS_ENG_OFFSET, BITS_ABS_ENG );
    2904           0 :                     bits = add( bits, BITS_ABS_ENG );
    2905           0 :                     push_indice( hBstr, IND_HQ2_DIFF_ENERGY, qbidx[pos_outlyer] + ABS_ENG_OFFSET, BITS_ABS_ENG );
    2906           0 :                     bits = add( bits, BITS_ABS_ENG );
    2907             :                 }
    2908             :                 ELSE
    2909             :                 {
    2910           0 :                     push_indice( hBstr, IND_HQ2_DENG_8SMODE_N1, 0, BITS_DE_8SMODE_N1 );
    2911           0 :                     bits = add( bits, BITS_DE_8SMODE_N1 ); /* Q0 */
    2912           0 :                     push_indice( hBstr, IND_HQ2_DIFF_ENERGY, qbidx[0] + ABS_ENG_OFFSET, BITS_ABS_ENG );
    2913           0 :                     bits = add( bits, BITS_ABS_ENG ); /* Q0 */
    2914             :                 }
    2915             : 
    2916           0 :                 FOR( i = 1; i < pos_outlyer; ++i )
    2917             :                 {
    2918           0 :                     push_indice( hBstr, IND_HQ2_DIFF_ENERGY, hescode[tdifidx0[i] + 4], hessize[tdifidx0[i] + 4] );
    2919           0 :                     bits = add( bits, hessize[tdifidx0[i] + 4] ); /* Q0 */
    2920             :                 }
    2921             : 
    2922           0 :                 FOR( i = pos_outlyer + 1; i < BANDS; ++i )
    2923             :                 {
    2924           0 :                     push_indice( hBstr, IND_HQ2_DIFF_ENERGY, hescode[tdifidx0[i] + 4], hessize[tdifidx0[i] + 4] );
    2925           0 :                     bits = add( bits, hessize[tdifidx0[i] + 4] ); /* Q0 */
    2926             :                 }
    2927             :             }
    2928             :         }
    2929             :         ELSE
    2930             :         {
    2931           0 :             bits = add( BITS_DE_8SMODE, BITS_MAX_DEPTH );
    2932           0 :             push_indice( hBstr, IND_HQ2_DENG_8SMODE, 1, BITS_DE_8SMODE );
    2933           0 :             push_indice( hBstr, IND_HQ2_DENG_8SDEPTH, lsbdepth1, BITS_MAX_DEPTH );
    2934             : 
    2935           0 :             FOR( i = 0; i < BANDS; ++i )
    2936             :             {
    2937           0 :                 push_indice( hBstr, IND_HQ2_DIFF_ENERGY, hescode[tdifidx1[i] + 4], hessize[tdifidx1[i] + 4] );
    2938           0 :                 bits = add( bits, hessize[tdifidx1[i] + 4] ); /* Q0 */
    2939             :             }
    2940             : 
    2941           0 :             IF( lsbdepth1 > 0 )
    2942             :             {
    2943           0 :                 FOR( i = 0; i < BANDS; ++i )
    2944             :                 {
    2945           0 :                     push_indice( hBstr, IND_HQ2_DIFF_ENERGY, LSB1[i], lsbdepth1 );
    2946             :                 }
    2947             :                 /*bits += BANDS * lsbdepth1; */
    2948           0 :                 bits = add( bits, extract_h( L_shl( L_mult( BANDS, lsbdepth1 ), 15 ) ) ); /* Q0 */
    2949             :             }
    2950             :         }
    2951             :     }
    2952             : 
    2953           0 :     return bits; /* xx bits for diff. energies + 1 bit for LC coding mode Q0*/
    2954             : }
    2955             : 
    2956             : /*-------------------------------------------------------------------*
    2957             :  * band_energy_quant()
    2958             :  *
    2959             :  *
    2960             :  *-------------------------------------------------------------------*/
    2961             : 
    2962          39 : static Word16 band_energy_quant_fx(
    2963             :     BSTR_ENC_HANDLE hBstr,       /* i/o: encoder bitstream handle    */
    2964             :     const Word32 *L_t_audio,     /* i  : Q12 : input MDCT signal (Qs)      */
    2965             :     const Word16 band_start[],   /* i  : Q0  : band start table            */
    2966             :     const Word16 band_end[],     /* i  : Q0  : band end table              */
    2967             :     Word32 L_band_energy[],      /* i  : Q14 : band energy       (Qbe)     */
    2968             :     const Word16 bands_fx,       /* i  : Q0  : number of bands             */
    2969             :     const Word32 L_qint,         /* i  : Q29 */
    2970             :     const Word16 eref_fx,        /* i  : Q10 */
    2971             :     const Word16 is_transient_fx /* i  : Q0  : indicator for HQ_TRANSIENT */
    2972             : )
    2973             : {
    2974             :     Word16 i, k;
    2975             :     Word16 ebits;
    2976             :     Word16 hLCmode0, hLCmode1, deng_bits;
    2977          39 :     Word16 deng_cmode = 0;
    2978             :     Word16 hbits;
    2979          39 :     move16();
    2980             : 
    2981             :     Word32 L_E;
    2982             :     Word16 QE;
    2983             : 
    2984             :     Word16 rev_qint_fx; /* 1/qint */
    2985             :     Word16 Qrev_qint;   /* Q value for 1/qint */
    2986             : 
    2987             :     Word16 bq0_fx;
    2988             :     Word16 bq1_fx[BANDS_MAX];
    2989             :     Word16 bq2_fx[BANDS_MAX];
    2990             : 
    2991             :     Word16 bq1_temp_fx[BANDS_MAX];
    2992             :     Word16 bq2_temp_fx[BANDS_MAX];
    2993             : 
    2994             :     Word32 L_tmp;
    2995             :     Word16 temp_fx;
    2996             :     Word16 frac, exp;
    2997             :     Word16 exp_safe;
    2998             :     Word16 exp_norm;
    2999             :     Word16 exp_norm2;
    3000             :     Word16 exp_normd;
    3001             : 
    3002             :     /* Calculate the band energies */
    3003          39 :     exp_safe = 4;
    3004          39 :     move16(); /* 4: never overflow happen at L_E */
    3005         907 :     FOR( k = 0; k < bands_fx; k++ )
    3006             :     {
    3007         868 :         L_tmp = L_deposit_l( 1295 ); /* 1295 = sqrt(0.1) (Qs) */
    3008       23020 :         FOR( i = band_start[k]; i <= band_end[k]; i++ )
    3009             :         {
    3010       22152 :             L_tmp = L_or( L_tmp, L_abs( L_t_audio[i] ) ); /* Qs */
    3011             :         }
    3012         868 :         exp_norm = norm_l( L_tmp );
    3013         868 :         exp_norm = sub( exp_norm, exp_safe ); /* safe_shift */
    3014             : 
    3015         868 :         QE = add( shl( sub( add( SWB_BWE_LR_Qs, exp_norm ), 16 ), 1 ), 1 );
    3016         868 :         L_E = L_shl( 590L, sub( QE, 15 ) ); /* 590   0.018f(Q15 -> QE) */
    3017       23020 :         FOR( i = band_start[k]; i <= band_end[k]; i++ )
    3018             :         {
    3019             :             /*E += yos[i] * yos[i]; */
    3020       22152 :             temp_fx = round_fx( L_shl( L_t_audio[i], exp_norm ) ); /* Qs+exp_norm-16 */
    3021       22152 :             L_E = L_mac( L_E, temp_fx, temp_fx );                  /* (Qs+exp_norm-16)*2+1 */
    3022             :         }
    3023             : 
    3024             :         /*band_energy[k] = (float) log2_f (E + 1.0e-1f); */
    3025         868 :         exp_norm2 = norm_l( L_E );
    3026         868 :         exp = add( add( shl( sub( add( SWB_BWE_LR_Qs, exp_norm ), 16 ), 1 ), 1 ), exp_norm2 );
    3027         868 :         L_E = L_shl( L_E, exp_norm2 ); /* (Qs+exp_norm-16)*2 + 1 + exp_norm2 */
    3028         868 :         frac = Log2_norm_lc( L_E );
    3029         868 :         exp = sub( 30, exp );
    3030         868 :         L_tmp = L_Comp( exp, frac );
    3031         868 :         L_band_energy[k] = L_shr( L_tmp, 2 ); /* Q16->Qbe(Q14) */
    3032         868 :         move32();
    3033             :     }
    3034             : 
    3035          39 :     IF( is_transient_fx )
    3036             :     {
    3037           1 :         reverse_transient_frame_energies_fx( L_band_energy, bands_fx );
    3038             :     }
    3039             : 
    3040             : 
    3041             :     /* Quantize the reference and band energies */
    3042          39 :     exp_normd = norm_l( L_qint );
    3043          39 :     rev_qint_fx = div_s( 0x4000, round_fx( L_shl( L_qint, exp_normd ) ) ); /* Q14-(29+exp_normd-16)+15 */
    3044          39 :     Qrev_qint = sub( 14 - ( 29 - 16 ) + 15, exp_normd );
    3045             : 
    3046          39 :     bq0_fx = round_fx( L_shl( L_mult( eref_fx, rev_qint_fx ), sub( 5, Qrev_qint ) ) ); /* 16-(10+Qrev_qint+1) */
    3047         907 :     FOR( k = 0; k < bands_fx; k++ )
    3048             :     {
    3049             :         /*bq1[k] = round_f (band_energy[k] / qint); */
    3050         868 :         L_tmp = Mpy_32_16_1( L_band_energy[k], rev_qint_fx );         /* Q14+Qrev_qint-15 */
    3051         868 :         bq1_fx[k] = round_fx( L_shl( L_tmp, sub( 17, Qrev_qint ) ) ); /* Q0 */
    3052         868 :         move16();
    3053             :     }
    3054             : 
    3055          39 :     IF( is_transient_fx )
    3056             :     {
    3057             : 
    3058           1 :         Copy( bq1_fx, bq1_temp_fx, bands_fx ); /* Q0 */
    3059             : 
    3060             :         /* Calculate the differential energies */
    3061           1 :         diffcod_lrmdct_fx( bands_fx, bq0_fx, bq1_temp_fx, bq2_temp_fx, is_transient_fx );
    3062             :     }
    3063             : 
    3064             :     /* Calculate the differential energies */
    3065          39 :     bq2_fx[0] = sub( bq1_fx[0], bq0_fx ); /* Q0 */
    3066          39 :     move16();
    3067         868 :     FOR( k = 1; k < bands_fx; k++ )
    3068             :     {
    3069         829 :         bq2_fx[k] = sub( bq1_fx[k], bq1_fx[k - 1] ); /* Q0 */
    3070         829 :         move16();
    3071             :     }
    3072             : 
    3073             :     /* Modifying qbidx to be located in the range -256~255 */
    3074         907 :     FOR( i = 0; i < bands_fx; ++i )
    3075             :     {
    3076         868 :         IF( GT_16( bq2_fx[i], MAXIMUM_ENERGY_LOWBRATE ) )
    3077             :         {
    3078           0 :             bq2_fx[i] = MAXIMUM_ENERGY_LOWBRATE; /* Q0 */
    3079           0 :             move16();
    3080             :         }
    3081         868 :         IF( LT_16( bq2_fx[i], MINIMUM_ENERGY_LOWBRATE ) )
    3082             :         {
    3083           0 :             bq2_fx[i] = MINIMUM_ENERGY_LOWBRATE; /* Q0 */
    3084           0 :             move16();
    3085             :         }
    3086             :     }
    3087             : 
    3088             :     /* Get number of bits by Huffman0 coding */
    3089          39 :     ebits = large_symbol_enc_fx( hBstr, bq2_fx, bands_fx, &hLCmode0, 0 ); /* Q0 */
    3090             : 
    3091          39 :     IF( is_transient_fx )
    3092             :     {
    3093             :         /* Get number of bits by Huffman coding */
    3094           1 :         hbits = small_symbol_enc_tran_fx( hBstr, bq2_temp_fx, bands_fx, &hLCmode1, 0, is_transient_fx ); /* Q0 */
    3095             :     }
    3096             :     ELSE
    3097             :     {
    3098             :         /* Get number of bits by Huffman coding */
    3099          38 :         hbits = small_symbol_enc_fx( hBstr, bq2_fx, bands_fx, &hLCmode1, 0, is_transient_fx ); /* Q0 */
    3100             :     }
    3101             : 
    3102             :     /* comparing used bits */
    3103          39 :     test();
    3104          39 :     IF( LT_16( ebits, hbits ) || EQ_16( hbits, -1 ) )
    3105             :     {
    3106           0 :         deng_cmode = 0;
    3107           0 :         move16();
    3108           0 :         push_indice( hBstr, IND_HQ2_DENG_MODE, deng_cmode, BITS_DE_CMODE );
    3109           0 :         large_symbol_enc_fx( hBstr, bq2_fx, bands_fx, &hLCmode0, 1 );
    3110           0 :         deng_bits = add( ebits, BITS_DE_CMODE ); /* Q0 */
    3111             :     }
    3112             :     ELSE
    3113             :     {
    3114             :         /* setting energy difference coding mode and storing it */
    3115          39 :         deng_cmode = 1;
    3116          39 :         move16();
    3117          39 :         push_indice( hBstr, IND_HQ2_DENG_MODE, deng_cmode, BITS_DE_CMODE );
    3118             : 
    3119          39 :         deng_bits = add( hbits, BITS_DE_CMODE ); /* Q0 */
    3120             : 
    3121             :         /* packing indice */
    3122          39 :         IF( is_transient_fx )
    3123             :         {
    3124           1 :             Copy( bq2_temp_fx, bq2_fx, bands_fx ); /* Q0 */
    3125           1 :             small_symbol_enc_tran_fx( hBstr, bq2_fx, bands_fx, &hLCmode1, 1, is_transient_fx );
    3126             :         }
    3127             :         ELSE
    3128             :         {
    3129          38 :             small_symbol_enc_fx( hBstr, bq2_fx, bands_fx, &hLCmode1, 1, is_transient_fx );
    3130             :         }
    3131             :     }
    3132             : 
    3133             :     /* Reconstruct quantized spectrum */
    3134          39 :     bq1_fx[0] = add( bq2_fx[0], bq0_fx ); /* Q0 */
    3135          39 :     move16();
    3136         868 :     FOR( k = 1; k < bands_fx; k++ )
    3137             :     {
    3138         829 :         bq1_fx[k] = add( bq2_fx[k], bq1_fx[k - 1] ); /* Q0 */
    3139         829 :         move16();
    3140             :     }
    3141             : 
    3142         907 :     FOR( k = 0; k < bands_fx; k++ )
    3143             :     {
    3144         868 :         L_band_energy[k] = Mpy_32_16_1( L_qint, bq1_fx[k] ); /* 29+0-15 -> Qbe(Q14) */
    3145         868 :         move32();
    3146             :     }
    3147             : 
    3148          39 :     IF( is_transient_fx )
    3149             :     {
    3150           1 :         reverse_transient_frame_energies_fx( L_band_energy, bands_fx );
    3151             :     }
    3152             : 
    3153          39 :     return ( deng_bits ); /* Q0 */
    3154             : }
    3155             : 
    3156             : 
    3157           0 : static Word16 band_energy_quant_ivas_fx(
    3158             :     BSTR_ENC_HANDLE hBstr,     /* i/o: encoder bitstream handle          */
    3159             :     const Word32 *L_t_audio,   /* i  : Q12 : input MDCT signal (Qs)      */
    3160             :     const Word16 band_start[], /* i  : Q0  : band start table            */
    3161             :     const Word16 band_end[],   /* i  : Q0  : band end table              */
    3162             :     Word32 L_band_energy[],    /* i  : Q14 : band energy       (Qbe)     */
    3163             :     const Word16 bands,        /* i  : Q0  : number of bands             */
    3164             :     const Word32 L_qint,       /* i  : Q29 */
    3165             :     const Word16 eref_fx,      /* i  : Q10 */
    3166             :     const Word16 is_transient  /* i  : Q0  : indicator for HQ_TRANSIENT */
    3167             : )
    3168             : {
    3169             :     Word16 i, k;
    3170             :     Word16 ebits;
    3171             :     Word16 hLCmode0, hLCmode1, deng_bits;
    3172           0 :     Word16 deng_cmode = 0;
    3173           0 :     move16();
    3174             :     Word16 hbits;
    3175             :     Word32 L_E;
    3176             :     Word16 QE;
    3177             : 
    3178             :     Word16 rev_qint_fx; /* 1/qint */
    3179             :     Word16 Qrev_qint;   /* Q value for 1/qint */
    3180             : 
    3181             :     Word16 bq0_fx;
    3182             :     Word16 bq1_fx[BANDS_MAX];
    3183             :     Word16 bq2_fx[BANDS_MAX];
    3184             : 
    3185             :     Word16 bq1_temp_fx[BANDS_MAX];
    3186             :     Word16 bq2_temp_fx[BANDS_MAX];
    3187             : 
    3188             :     Word32 L_tmp;
    3189             :     Word16 temp_fx;
    3190             :     Word16 frac, exp;
    3191             :     Word16 exp_safe;
    3192             :     Word16 exp_norm;
    3193             :     Word16 exp_norm2;
    3194             : 
    3195             :     Word16 exp_normd;
    3196             :     /* Calculate the band energies */
    3197             :     /* Calculate the band energies */
    3198           0 :     exp_safe = 4;
    3199           0 :     move16(); /* 4: never overflow happen at L_E */
    3200           0 :     FOR( k = 0; k < bands; k++ )
    3201             :     {
    3202           0 :         L_tmp = L_deposit_l( 1295 ); /* 1295 = sqrt(0.1) (Qs) */
    3203           0 :         FOR( i = band_start[k]; i <= band_end[k]; i++ )
    3204             :         {
    3205           0 :             L_tmp = L_or( L_tmp, L_abs( L_t_audio[i] ) ); /* Qs */
    3206             :         }
    3207           0 :         exp_norm = norm_l( L_tmp );
    3208           0 :         exp_norm = sub( exp_norm, exp_safe ); /* safe_shift */
    3209             : 
    3210           0 :         QE = add( shl( sub( add( SWB_BWE_LR_Qs, exp_norm ), 16 ), 1 ), 1 );
    3211           0 :         L_E = L_shl( 590L, sub( QE, 15 ) ); /* 590   0.018f(Q15 -> QE) */
    3212           0 :         FOR( i = band_start[k]; i <= band_end[k]; i++ )
    3213             :         {
    3214             :             /*E += yos[i] * yos[i]; */
    3215           0 :             temp_fx = round_fx( L_shl( L_t_audio[i], exp_norm ) ); /* Qs+exp_norm-16 */
    3216           0 :             L_E = L_mac( L_E, temp_fx, temp_fx );                  /* (Qs+exp_norm-16)*2+1 */
    3217             :         }
    3218             : 
    3219             :         /*band_energy[k] = (float) log2_f (E + 1.0e-1f); */
    3220           0 :         exp_norm2 = norm_l( L_E );
    3221           0 :         exp = add( add( shl( sub( add( SWB_BWE_LR_Qs, exp_norm ), 16 ), 1 ), 1 ), exp_norm2 );
    3222           0 :         L_E = L_shl( L_E, exp_norm2 ); /* (Qs+exp_norm-16)*2 + 1 + exp_norm2 */
    3223           0 :         frac = Log2_norm_lc( L_E );
    3224           0 :         exp = sub( 30, exp );
    3225           0 :         L_tmp = L_Comp( exp, frac );
    3226           0 :         L_band_energy[k] = L_shr( L_tmp, 2 ); /* Q16->Qbe(Q14) */
    3227           0 :         move32();
    3228             :     }
    3229             : 
    3230           0 :     IF( is_transient )
    3231             :     {
    3232           0 :         reverse_transient_frame_energies_fx( L_band_energy, bands );
    3233             :     }
    3234             : 
    3235             : #define WMC_TOOL_SKIP
    3236           0 :     exp_normd = norm_l( L_qint );
    3237           0 :     rev_qint_fx = div_s( 0x4000, round_fx( L_shl( L_qint, exp_normd ) ) ); /* Q14-(29+exp_normd-16)+15 */
    3238           0 :     Qrev_qint = sub( 14 - ( 29 - 16 ) + 15, exp_normd );
    3239             : 
    3240           0 :     bq0_fx = round_fx( L_shl( L_mult( eref_fx, rev_qint_fx ), sub( 5, Qrev_qint ) ) ); /* 16-(10+Qrev_qint+1) */
    3241           0 :     FOR( k = 0; k < bands; k++ )
    3242             :     {
    3243             :         /*bq1[k] = round_f (band_energy[k] / qint); */
    3244           0 :         L_tmp = L_mls( L_band_energy[k], rev_qint_fx );               /* Q14+Qrev_qint-15 */
    3245           0 :         bq1_fx[k] = round_fx( L_shl( L_tmp, sub( 17, Qrev_qint ) ) ); /* Q0 */
    3246           0 :         move16();
    3247             :     }
    3248             : #undef WMC_TOOL_SKIP
    3249             : 
    3250           0 :     IF( is_transient )
    3251             :     {
    3252             : 
    3253           0 :         Copy( bq1_fx, bq1_temp_fx, bands ); /* Q0 */
    3254             : 
    3255             :         /* Calculate the differential energies */
    3256           0 :         diffcod_lrmdct_fx( bands, bq0_fx, bq1_temp_fx, bq2_temp_fx, is_transient ); /* Q0 */
    3257             :     }
    3258             : 
    3259             :     /* Calculate the differential energies */
    3260           0 :     bq2_fx[0] = sub( bq1_fx[0], bq0_fx ); /* Q0 */
    3261           0 :     move16();
    3262           0 :     FOR( k = 1; k < bands; k++ )
    3263             :     {
    3264           0 :         bq2_fx[k] = sub( bq1_fx[k], bq1_fx[k - 1] ); /* Q0 */
    3265           0 :         move16();
    3266             :     }
    3267             : 
    3268             : 
    3269             :     /* Modifying qbidx to be located in the range -256~255 */
    3270           0 :     FOR( i = 0; i < bands; ++i )
    3271             :     {
    3272           0 :         IF( GT_16( bq2_fx[i], MAXIMUM_ENERGY_LOWBRATE ) )
    3273             :         {
    3274           0 :             bq2_fx[i] = MAXIMUM_ENERGY_LOWBRATE; /* Q0 */
    3275           0 :             move16();
    3276             :         }
    3277           0 :         IF( LT_16( bq2_fx[i], MINIMUM_ENERGY_LOWBRATE ) )
    3278             :         {
    3279           0 :             bq2_fx[i] = MINIMUM_ENERGY_LOWBRATE; /* Q0 */
    3280           0 :             move16();
    3281             :         }
    3282             :     }
    3283             : 
    3284             :     /* Get number of bits by Huffman0 coding */
    3285           0 :     ebits = large_symbol_enc_ivas_fx( hBstr, bq2_fx, bands, &hLCmode0, 0 ); /* Q0 */
    3286             : 
    3287           0 :     IF( is_transient )
    3288             :     {
    3289             :         /* Get number of bits by Huffman coding */
    3290           0 :         hbits = small_symbol_enc_tran_ivas_fx( hBstr, bq2_temp_fx, bands, &hLCmode1, 0, is_transient ); /* Q0 */
    3291             :     }
    3292             :     ELSE
    3293             :     {
    3294             :         /* Get number of bits by Huffman coding */
    3295           0 :         hbits = small_symbol_enc_ivas_fx( hBstr, bq2_fx, bands, &hLCmode1, 0, is_transient ); /* Q0 */
    3296             :     }
    3297             : 
    3298           0 :     test();
    3299           0 :     IF( LT_16( ebits, hbits ) || EQ_16( hbits, -1 ) )
    3300             :     {
    3301           0 :         deng_cmode = 0;
    3302           0 :         move16();
    3303           0 :         push_indice( hBstr, IND_HQ2_DENG_MODE, deng_cmode, BITS_DE_CMODE );
    3304           0 :         large_symbol_enc_ivas_fx( hBstr, bq2_fx, bands, &hLCmode0, 1 );
    3305           0 :         deng_bits = add( ebits, BITS_DE_CMODE ); /* Q0 */
    3306             :     }
    3307             :     ELSE
    3308             :     {
    3309             :         /* setting energy difference coding mode and storing it */
    3310           0 :         deng_cmode = 1;
    3311           0 :         move16();
    3312           0 :         push_indice( hBstr, IND_HQ2_DENG_MODE, deng_cmode, BITS_DE_CMODE );
    3313             : 
    3314           0 :         deng_bits = add( hbits, BITS_DE_CMODE ); /* Q0 */
    3315             : 
    3316             :         /* packing indice */
    3317           0 :         IF( is_transient )
    3318             :         {
    3319           0 :             Copy( bq2_temp_fx, bq2_fx, bands ); /* Q0 */
    3320           0 :             small_symbol_enc_tran_ivas_fx( hBstr, bq2_fx, bands, &hLCmode1, 1, is_transient );
    3321             :         }
    3322             :         ELSE
    3323             :         {
    3324           0 :             small_symbol_enc_ivas_fx( hBstr, bq2_fx, bands, &hLCmode1, 1, is_transient );
    3325             :         }
    3326             :     }
    3327             : 
    3328             :     /* Reconstruct quantized spectrum */
    3329           0 :     bq1_fx[0] = add( bq2_fx[0], bq0_fx ); /* Q0 */
    3330           0 :     move16();
    3331           0 :     FOR( k = 1; k < bands; k++ )
    3332             :     {
    3333           0 :         bq1_fx[k] = add( bq2_fx[k], bq1_fx[k - 1] ); /* Q0 */
    3334           0 :         move16();
    3335             :     }
    3336             : 
    3337           0 :     FOR( k = 0; k < bands; k++ )
    3338             :     {
    3339             : #define WMC_TOOL_SKIP
    3340           0 :         L_band_energy[k] = L_mls( L_qint, (Word16) bq1_fx[k] ); /* 29+0-15 -> Qbe(Q14) */
    3341           0 :         move32();
    3342             : #undef WMC_TOOL_SKIP
    3343             :     }
    3344             : 
    3345           0 :     IF( is_transient )
    3346             :     {
    3347           0 :         reverse_transient_frame_energies_fx( L_band_energy, bands );
    3348             :     }
    3349             : 
    3350           0 :     return ( deng_bits ); /* Q0 */
    3351             : }
    3352             : 
    3353             : 
    3354             : /*-------------------------------------------------------------------*
    3355             :  * p2a_threshold_quant()
    3356             :  *
    3357             :  *
    3358             :  *-------------------------------------------------------------------*/
    3359             : 
    3360          39 : static Word16 p2a_threshold_quant_fx(
    3361             :     BSTR_ENC_HANDLE hBstr,     /* i/o:     : bit stream */
    3362             :     const Word32 *L_t_audio,   /* i  : Q12 : input spectrum          */
    3363             :     const Word16 band_start[], /* i  : Q0  : table of start freq for every subband */
    3364             :     const Word16 band_end[],   /* i  : Q0  : table of end freq for every subband   */
    3365             :     const Word16 band_width[], /* i  : Q0  : table of bandwidth for every subband  */
    3366             :     const Word16 bands,        /* i  : Q0  : number of subbands                    */
    3367             :     const Word16 p2a_bands,    /* i  : Q0  : tonality indicator                    */
    3368             :     const Word16 p2a_th_fx,    /* i  : Q11 : threshold tonal or not                */
    3369             :     Word16 *p2a_flags_fx       /* i/o: Q0  : tonality flag                         */
    3370             : )
    3371             : {
    3372             :     Word16 i, j, k;
    3373             :     Word32 L_a, L_p, L_e;
    3374             :     Word16 Qa;
    3375             :     Word32 L_tmp;
    3376             :     Word16 temp_fx;
    3377             :     Word16 exp_norm;
    3378             :     Word16 exp_safe;
    3379             :     Word16 exp_normn, exp_normd;
    3380             : 
    3381             :     Word16 norm_a_fx, Qnorm_a;
    3382             :     Word16 pa_fx, Qpa;
    3383             : 
    3384             :     Word16 exp, frac;
    3385             : 
    3386             :     Word32 L_p2a;
    3387             :     Word16 p2a_fx;
    3388             : 
    3389          39 :     exp_safe = 4; /* never happen overflow. */
    3390          39 :     move16();
    3391             : 
    3392          39 :     set16_fx( p2a_flags_fx, 1, bands );
    3393          39 :     move16();
    3394             : 
    3395          39 :     j = 0;
    3396          39 :     move16();
    3397         229 :     FOR( k = ( bands - p2a_bands ); k < bands; k++ )
    3398             :     {
    3399         190 :         L_a = L_deposit_l( 0 );
    3400         190 :         L_p = L_deposit_l( 0 );
    3401             : 
    3402         190 :         L_tmp = L_deposit_l( 0 );
    3403       13642 :         FOR( i = band_start[k]; i <= band_end[k]; i++ )
    3404             :         {
    3405       13452 :             L_tmp = L_or( L_tmp, L_abs( L_t_audio[i] ) ); /* Q12 */
    3406             :         }
    3407         190 :         exp_norm = norm_l( L_tmp );
    3408         190 :         exp_norm = sub( exp_norm, exp_safe );
    3409             : 
    3410       13642 :         FOR( i = band_start[k]; i <= band_end[k]; i++ )
    3411             :         {
    3412       13452 :             temp_fx = round_fx( L_shl( L_t_audio[i], exp_norm ) ); /* Q12+exp_norm-16  -> exp_norm-4 */
    3413       13452 :             L_e = L_mult( temp_fx, temp_fx );                      /* 2*(exp_norm-4)+1 */
    3414             : 
    3415       13452 :             IF( GT_32( L_e, L_p ) )
    3416             :             {
    3417         974 :                 L_p = L_add( L_e, 0 );
    3418             :             }
    3419       13452 :             L_a = L_add( L_a, L_e );
    3420             :         }
    3421         190 :         Qa = sub( shl( exp_norm, 1 ), 7 ); /* (exp_norm-4)*2+1 */
    3422             : 
    3423         190 :         IF( L_a > 0x0L )
    3424             :         {
    3425             :             /* a /= band_width[k]; */
    3426         190 :             exp_normn = norm_l( L_a );
    3427         190 :             exp_normn = sub( exp_normn, 1 );
    3428         190 :             exp_normd = norm_s( band_width[k] );
    3429         190 :             norm_a_fx = div_l( L_shl( L_a, exp_normn ), shl( band_width[k], exp_normd ) ); /* (Qa+exp_normn)-exp_normd-1); */
    3430         190 :             Qnorm_a = sub( sub( add( Qa, exp_normn ), exp_normd ), 1 );
    3431             : 
    3432             :             /*p2a = 10.0f * (float) log10 (p / a); */
    3433         190 :             p2a_fx = 0;
    3434         190 :             move16();
    3435         190 :             IF( norm_a_fx > 0 )
    3436             :             {
    3437         190 :                 exp_normn = norm_l( L_p );
    3438         190 :                 exp_normn = sub( exp_normn, 1 );
    3439         190 :                 exp_normd = norm_s( norm_a_fx );
    3440         190 :                 pa_fx = div_l( L_shl( L_p, exp_normn ), shl( norm_a_fx, exp_normd ) ); /* Qpa + exp_normn + Qnorm_a + exp_normd - 1 */
    3441         190 :                 Qpa = sub( sub( add( Qa, exp_normn ), add( Qnorm_a, exp_normd ) ), 1 );
    3442             : 
    3443         190 :                 L_tmp = L_deposit_h( pa_fx );
    3444         190 :                 Qpa = add( Qpa, 16 );
    3445         190 :                 exp = norm_l( L_tmp );
    3446         190 :                 frac = Log2_norm_lc( L_shl( L_tmp, exp ) );
    3447         190 :                 exp = sub( 30, exp );
    3448         190 :                 exp = sub( exp, Qpa );
    3449         190 :                 L_tmp = L_Comp( exp, frac );
    3450             : 
    3451             :                 /* 10/( log(10)/log(2) ) = 3.01029995663981195211  24660(Q13) */
    3452         190 :                 L_p2a = Mpy_32_16_1( L_tmp, 24660 ); /* 16+13-15 -> Q14 */
    3453             : 
    3454         190 :                 p2a_fx = round_fx_sat( L_shl_sat( L_p2a, 13 ) ); /*  27 -16  -> 11 */
    3455             :             }
    3456             : 
    3457         190 :             IF( LE_16( p2a_fx, p2a_th_fx ) )
    3458             :             {
    3459         177 :                 p2a_flags_fx[k] = 0;
    3460         177 :                 move16();
    3461             :             }
    3462             :         }
    3463             :         ELSE
    3464             :         {
    3465           0 :             p2a_flags_fx[k] = 0;
    3466           0 :             move16();
    3467             :         }
    3468             : 
    3469         190 :         push_indice( hBstr, IND_HQ2_P2A_FLAGS, p2a_flags_fx[k], 1 );
    3470         190 :         j = add( j, 1 );
    3471             :     }
    3472             : 
    3473          39 :     return ( j ); /* Q0 */
    3474             : }
    3475             : 
    3476           0 : static Word16 p2a_threshold_quant_ivas_fx(
    3477             :     BSTR_ENC_HANDLE hBstr,     /* i/o:     : bit stream */
    3478             :     const Word32 *L_t_audio,   /* i  : Q12 : input spectrum          */
    3479             :     const Word16 band_start[], /* i  : Q0  : table of start freq for every subband */
    3480             :     const Word16 band_end[],   /* i  : Q0  : table of end freq for every subband   */
    3481             :     const Word16 band_width[], /* i  : Q0  : table of bandwidth for every subband  */
    3482             :     const Word16 bands,        /* i  : Q0  : number of subbands                    */
    3483             :     const Word16 p2a_bands,    /* i  : Q0  : tonality indicator                    */
    3484             :     const Word16 p2a_th_fx,    /* i  : Q11 : threshold tonal or not                */
    3485             :     Word16 *p2a_flags_fx       /* i/o: Q0  : tonality flag                         */
    3486             : )
    3487             : {
    3488             :     Word16 i, j, k;
    3489             :     Word32 L_a, L_p, L_e;
    3490             :     Word16 Qa;
    3491             :     Word32 L_tmp;
    3492             :     Word16 temp_fx;
    3493             :     Word16 exp_norm;
    3494             :     Word16 exp_safe;
    3495             :     Word16 exp_normn, exp_normd;
    3496             : 
    3497             :     Word16 norm_a_fx, Qnorm_a;
    3498             :     Word16 pa_fx, Qpa;
    3499             : 
    3500             :     Word16 exp, frac;
    3501             : 
    3502             :     Word32 L_p2a;
    3503             :     Word16 p2a_fx;
    3504             : 
    3505           0 :     exp_safe = 4; /* never happen overflow. */
    3506           0 :     move16();
    3507             : 
    3508           0 :     set16_fx( p2a_flags_fx, 1, bands );
    3509             : 
    3510           0 :     j = 0;
    3511           0 :     move16();
    3512           0 :     FOR( k = ( bands - p2a_bands ); k < bands; k++ )
    3513             :     {
    3514           0 :         L_a = L_deposit_l( 0 );
    3515           0 :         L_p = L_deposit_l( 0 );
    3516             : 
    3517           0 :         L_tmp = L_deposit_l( 0 );
    3518           0 :         FOR( i = band_start[k]; i <= band_end[k]; i++ )
    3519             :         {
    3520           0 :             L_tmp = L_or( L_tmp, L_abs( L_t_audio[i] ) ); /* Q12 */
    3521             :         }
    3522           0 :         exp_norm = norm_l( L_tmp );
    3523           0 :         exp_norm = sub( exp_norm, exp_safe );
    3524             : 
    3525           0 :         FOR( i = band_start[k]; i <= band_end[k]; i++ )
    3526             :         {
    3527           0 :             temp_fx = round_fx( L_shl( L_t_audio[i], exp_norm ) ); /* Q12+exp_norm-16  -> exp_norm-4 */
    3528           0 :             L_e = L_mult( temp_fx, temp_fx );                      /* (exp_norm-4)*2 + 1 */
    3529             : 
    3530           0 :             IF( GT_32( L_e, L_p ) )
    3531             :             {
    3532           0 :                 L_p = L_add( L_e, 0 );
    3533             :             }
    3534           0 :             L_a = L_add( L_a, L_e );
    3535             :         }
    3536           0 :         Qa = sub( shl( exp_norm, 1 ), 7 ); /* (exp_norm-4)*2+1 */
    3537             : 
    3538           0 :         IF( L_a > 0x0L )
    3539             :         {
    3540             :             /* a /= band_width[k]; */
    3541           0 :             exp_normn = norm_l( L_a );
    3542           0 :             exp_normn = sub( exp_normn, 1 );
    3543           0 :             exp_normd = norm_s( band_width[k] );
    3544           0 :             norm_a_fx = div_l( L_shl( L_a, exp_normn ), shl( band_width[k], exp_normd ) ); /* (Qa+exp_normn)-exp_normd-1); */
    3545           0 :             Qnorm_a = sub( sub( add( Qa, exp_normn ), exp_normd ), 1 );
    3546             : 
    3547             :             /*p2a = 10.0f * (float) log10 (p / a); */
    3548           0 :             p2a_fx = 0;
    3549           0 :             move16();
    3550           0 :             IF( norm_a_fx > 0 )
    3551             :             {
    3552           0 :                 exp_normn = norm_l( L_p );
    3553           0 :                 exp_normn = sub( exp_normn, 1 );
    3554           0 :                 exp_normd = norm_s( norm_a_fx );
    3555           0 :                 pa_fx = div_l( L_shl( L_p, exp_normn ), shl( norm_a_fx, exp_normd ) ); /* Qpa + exp_normn + Qnorm_a + exp_normd - 1 */
    3556           0 :                 Qpa = sub( sub( add( Qa, exp_normn ), add( Qnorm_a, exp_normd ) ), 1 );
    3557             : 
    3558           0 :                 L_tmp = L_deposit_h( pa_fx );
    3559           0 :                 Qpa = add( Qpa, 16 );
    3560           0 :                 exp = norm_l( L_tmp );
    3561           0 :                 frac = Log2_norm_lc( L_shl( L_tmp, exp ) );
    3562           0 :                 exp = sub( 30, exp );
    3563           0 :                 exp = sub( exp, Qpa );
    3564           0 :                 L_tmp = L_Comp( exp, frac );
    3565             : 
    3566             :                 /* 10/( log(10)/log(2) ) = 3.01029995663981195211  24660(Q13) */
    3567           0 :                 L_p2a = Mpy_32_16_1( L_tmp, 24660 ); /* 16+13-15 -> Q14 */
    3568             : 
    3569           0 :                 p2a_fx = round_fx_sat( L_shl_sat( L_p2a, 13 ) ); /*  27 -16  -> 11 */
    3570             :             }
    3571             : 
    3572           0 :             IF( LE_16( p2a_fx, p2a_th_fx ) )
    3573             :             {
    3574           0 :                 p2a_flags_fx[k] = 0;
    3575           0 :                 move16();
    3576             :             }
    3577             :         }
    3578             :         ELSE
    3579             :         {
    3580           0 :             p2a_flags_fx[k] = 0;
    3581           0 :             move16();
    3582             :         }
    3583             : 
    3584           0 :         push_indice( hBstr, IND_HQ2_P2A_FLAGS, p2a_flags_fx[k], 1 );
    3585           0 :         j = add( j, 1 );
    3586             :     }
    3587             : 
    3588           0 :     return ( j ); /* Q0 */
    3589             : }
    3590             : 
    3591             : 
    3592             : /*-------------------------------------------------------------------*
    3593             :  * mdct_spectrum_fine_gain_enc()
    3594             :  *
    3595             :  *
    3596             :  *-------------------------------------------------------------------*/
    3597             : 
    3598          39 : static void mdct_spectrum_fine_gain_enc_fx(
    3599             :     Encoder_State *st_fx,      /* i/o: encoder state structure                     */
    3600             :     const Word32 L_ybuf[],     /* i  : Q12 : input spectrum                        */
    3601             :     Word32 L_y2[],             /* i/o: Q12 : decoded spectrum                      */
    3602             :     const Word16 band_start[], /* i  : Q0  : table of start freq for every subband */
    3603             :     const Word16 band_end[],   /* i  : Q0  : table of end freq for every subband   */
    3604             :     const Word16 k_sort[],     /* i  : Q0  : sort table by band_energy             */
    3605             :     const Word16 bands,        /* i  : Q0  : nubmber of subbands                   */
    3606             :     const Word32 L_qint,       /* i  : Q29 :                                       */
    3607             :     const Word16 Ngq,          /* i  : Q0  :                                       */
    3608             :     const Word16 gqlevs,       /* i  : Q0  : quantized level                       */
    3609             :     const Word16 gqbits        /* i  : Q0  : quantized bits                        */
    3610             : )
    3611             : {
    3612             :     Word16 i, k;
    3613             : 
    3614             :     Word16 delta_fx, Qdelta;
    3615             :     Word32 L_delta;
    3616             :     Word32 L_q;
    3617             : 
    3618             :     Word16 gain_table_fx[MAX_GQLEVS];
    3619             :     Word16 Qgt;
    3620             :     Word16 gamma_fx;
    3621             :     Word16 Qgamma;
    3622             : 
    3623             :     Word16 exp_safe;
    3624             :     Word16 exp_normn, exp_normd;
    3625             :     Word16 exp_norm;
    3626             : 
    3627             :     Word32 L_temp;
    3628             :     Word16 temp_lo_fx, temp_hi_fx, temp_fx, temp2_fx;
    3629             : 
    3630             :     Word32 L_Eyy, L_Exy;
    3631             :     /*Word16 QE; */
    3632             : 
    3633             :     Word16 d_fx;
    3634             :     Word16 dmin_fx;
    3635             :     Word16 imin_fx;
    3636             : 
    3637             :     /* Fine gain quantization on only the most significant energy bands */
    3638             : 
    3639             :     /*delta = qint / gqlevs; */
    3640          39 :     exp_normn = norm_l( L_qint );
    3641          39 :     exp_normn = sub( exp_normn, 1 );
    3642          39 :     exp_normd = norm_s( gqlevs );
    3643          39 :     delta_fx = div_l( L_shl( L_qint, exp_normn ), shl( gqlevs, exp_normd ) ); /* 29+exp_normn-(exp_normd)-1; */
    3644          39 :     Qdelta = add( sub( exp_normn, exp_normd ), 28 );
    3645          39 :     L_delta = L_shl( L_deposit_h( delta_fx ), sub( 13, Qdelta ) ); /* Q29 */
    3646             :     /*q = (-qint + delta) / 2.0f; */
    3647          39 :     L_q = L_shr( L_sub( L_delta, L_qint ), 1 ); /* Q29 */
    3648             : 
    3649         117 :     FOR( i = 0; i < gqlevs; i++ )
    3650             :     {
    3651             :         /*gain_table[i] = (float) pow (2.0f, q * 0.5f); */
    3652          78 :         L_temp = L_shr( L_shr( L_q, 1 ), sub( 29, 16 ) ); /* Q16 */
    3653          78 :         temp_lo_fx = L_Extract_lc( L_temp, &temp_hi_fx );
    3654          78 :         Qgt = sub( 14, temp_hi_fx );
    3655          78 :         gain_table_fx[i] = extract_l( Pow2( 14, temp_lo_fx ) ); /* Qgt */
    3656          78 :         move16();
    3657             : 
    3658             :         /*q += delta; */
    3659          78 :         L_q = L_add( L_q, L_delta );
    3660          78 :         gain_table_fx[i] = shl( gain_table_fx[i], sub( 14, Qgt ) ); /* Qgt -> Q14 */
    3661          78 :         move16();
    3662             :     }
    3663             : 
    3664         195 :     FOR( k = sub( bands, Ngq ); k < bands; k++ )
    3665             :     {
    3666             :         /*Eyy = 0.0f; */
    3667             :         /*Exy = 0.0f; */
    3668             :         /*for (i = band_start[k_sort[k]]; i <= band_end[k_sort[k]]; i++) */
    3669             :         /*{ */
    3670             :         /*    Eyy += y2[i] * y2[i]; */
    3671             :         /*    Exy += ybuf[i] * y2[i]; */
    3672             :         /*} */
    3673         156 :         exp_safe = 4;
    3674         156 :         move16(); /* 4 is too large. but never happen overflow */
    3675         156 :         L_temp = L_deposit_l( 0 );
    3676        2986 :         FOR( i = band_start[k_sort[k]]; i <= band_end[k_sort[k]]; i++ )
    3677             :         {
    3678        2830 :             L_temp = L_or( L_temp, L_abs( L_y2[i] ) );   /* Q12 */
    3679        2830 :             L_temp = L_or( L_temp, L_abs( L_ybuf[i] ) ); /* Q12 */
    3680             :         }
    3681         156 :         exp_norm = norm_l( L_temp );
    3682         156 :         exp_norm = sub( exp_norm, exp_safe ); /* safe_shift */
    3683             : 
    3684         156 :         L_Eyy = L_deposit_l( 0 );
    3685         156 :         L_Exy = L_deposit_l( 0 );
    3686             :         /*QE = add(shl(add(Qs-16, exp_norm), 1), 1); //(Qs+exp_norm-16)*2+1; */
    3687        2986 :         FOR( i = band_start[k_sort[k]]; i <= band_end[k_sort[k]]; i++ )
    3688             :         {
    3689             :             /*Eyy += y2[i] * y2[i]; */
    3690        2830 :             temp_fx = round_fx( L_shl( L_y2[i], exp_norm ) ); /* Q12 + exp_norm - 16 */
    3691        2830 :             L_Eyy = L_mac( L_Eyy, temp_fx, temp_fx );         /* (Q12 + exp_norm - 16)*2 + 1 */
    3692             : 
    3693             :             /*Exy += ybuf[i] * y2[i]; */
    3694        2830 :             temp2_fx = round_fx( L_shl( L_ybuf[i], exp_norm ) ); /* Q12 + exp_norm - 16 */
    3695        2830 :             L_Exy = L_mac( L_Exy, temp2_fx, temp_fx );           /* (Q12 + exp_norm - 16)*2 + 1 */
    3696             :         }
    3697             : 
    3698         156 :         test();
    3699         156 :         IF( L_Eyy > 0x0L && L_Exy > 0x0L )
    3700             :         {
    3701             :             /*gamma = Exy / Eyy; */
    3702         156 :             exp_normn = norm_l( L_Exy );
    3703         156 :             exp_normn = sub( exp_normn, 1 );
    3704         156 :             exp_normd = norm_l( L_Eyy );
    3705         156 :             gamma_fx = div_l( L_shl( L_Exy, exp_normn ), round_fx_sat( L_shl( L_Eyy, exp_normd ) ) ); /* Qgamma */
    3706         156 :             Qgamma = add( sub( exp_normn, exp_normd ), 15 );                                          /* exp_normn - (exp_normd-16) - 1; */
    3707         156 :             gamma_fx = shl( gamma_fx, sub( 14, Qgamma ) );                                            /* Qgamma -> Q14 */
    3708             : 
    3709         156 :             dmin_fx = 32767;
    3710         156 :             move16();
    3711         156 :             imin_fx = -1;
    3712         156 :             move16();
    3713         468 :             FOR( i = 0; i < gqlevs; i++ )
    3714             :             {
    3715         312 :                 d_fx = abs_s( sub( gamma_fx, gain_table_fx[i] ) ); /* Q14 */
    3716         312 :                 IF( LT_16( d_fx, dmin_fx ) )
    3717             :                 {
    3718         194 :                     dmin_fx = d_fx; /* Q14 */
    3719         194 :                     move16();
    3720         194 :                     imin_fx = i;
    3721         194 :                     move16();
    3722             :                 }
    3723             :             }
    3724             : 
    3725         156 :             gamma_fx = gain_table_fx[imin_fx]; /* Q14 */
    3726         156 :             move16();
    3727             : 
    3728        2986 :             FOR( i = band_start[k_sort[k]]; i <= band_end[k_sort[k]]; i++ )
    3729             :             {
    3730             :                 /*y2[i] *= gamma; */
    3731             :                 /* This IF statement for keeping same mantissa evenif y2 is plus or minus */
    3732        2830 :                 IF( L_y2[i] >= 0x0 )
    3733             :                 {
    3734        2609 :                     L_y2[i] = L_shl( Mpy_32_16_1( L_y2[i], gamma_fx ), 1 ); /* Q12 */
    3735        2609 :                     move32();
    3736             :                 }
    3737             :                 ELSE
    3738             :                 {
    3739         221 :                     L_y2[i] = L_negate( L_shl( Mpy_32_16_1( L_abs( L_y2[i] ), gamma_fx ), 1 ) ); /* Q12 */
    3740         221 :                     move32();
    3741             :                 }
    3742             :             }
    3743             :         }
    3744             :         ELSE
    3745             :         {
    3746           0 :             imin_fx = 0;
    3747           0 :             move16();
    3748             :         }
    3749             : 
    3750         156 :         push_indice( st_fx->hBstr, IND_HQ2_SUBBAND_GAIN, imin_fx, gqbits );
    3751             :     }
    3752             : 
    3753          39 :     return;
    3754             : }
    3755             : 
    3756           0 : static void mdct_spectrum_fine_gain_enc_ivas_fx(
    3757             :     Encoder_State *st_fx,      /* i/o: encoder state structure                     */
    3758             :     const Word32 L_ybuf[],     /* i  : Q12 : input spectrum                        */
    3759             :     Word32 L_y2[],             /* i/o: Q12 : decoded spectrum                      */
    3760             :     const Word16 band_start[], /* i  : Q0  : table of start freq for every subband */
    3761             :     const Word16 band_end[],   /* i  : Q0  : table of end freq for every subband   */
    3762             :     const Word16 k_sort[],     /* i  : Q0  : sort table by band_energy             */
    3763             :     const Word16 bands,        /* i  : Q0  : nubmber of subbands                   */
    3764             :     const Word32 L_qint,       /* i  : Q29 :                                       */
    3765             :     const Word16 Ngq,          /* i  : Q0  :                                       */
    3766             :     const Word16 gqlevs,       /* i  : Q0  : quantized level                       */
    3767             :     const Word16 gqbits        /* i  : Q0  : quantized bits                        */
    3768             : )
    3769             : {
    3770             :     Word16 i, k;
    3771             : 
    3772             :     Word16 delta_fx, Qdelta;
    3773             :     Word32 L_delta;
    3774             :     Word32 L_q;
    3775             : 
    3776             :     Word16 gain_table_fx[MAX_GQLEVS];
    3777             :     Word16 Qgt;
    3778             :     Word16 gamma_fx;
    3779             :     Word16 Qgamma;
    3780             : 
    3781             :     Word16 exp_safe;
    3782             :     Word16 exp_normn, exp_normd;
    3783             :     Word16 exp_norm;
    3784             : 
    3785             :     Word32 L_temp;
    3786             :     Word16 temp_lo_fx, temp_hi_fx, temp_fx, temp2_fx;
    3787             : 
    3788             :     Word32 L_Eyy, L_Exy;
    3789             :     /*Word16 QE; */
    3790             : 
    3791             :     Word16 d_fx;
    3792             :     Word16 dmin_fx;
    3793             :     Word16 imin_fx;
    3794             : 
    3795             :     /* Fine gain quantization on only the most significant energy bands */
    3796             : 
    3797             :     /*delta = qint / gqlevs; */
    3798           0 :     exp_normn = norm_l( L_qint );
    3799           0 :     exp_normn = sub( exp_normn, 1 );
    3800           0 :     exp_normd = norm_s( gqlevs );
    3801           0 :     delta_fx = div_l( L_shl( L_qint, exp_normn ), shl( gqlevs, exp_normd ) );
    3802           0 :     Qdelta = add( sub( exp_normn, exp_normd ), 28 );               /* 29+exp_normn-(exp_normd)-1; */
    3803           0 :     L_delta = L_shl( L_deposit_h( delta_fx ), sub( 13, Qdelta ) ); /* Q29 */
    3804             :     /*q = (-qint + delta) / 2.0f; */
    3805           0 :     L_q = L_shr( L_sub( L_delta, L_qint ), 1 ); /* Q29 */
    3806             : 
    3807           0 :     FOR( i = 0; i < gqlevs; i++ )
    3808             :     {
    3809             :         /*gain_table[i] = (float) pow (2.0f, q * 0.5f); */
    3810           0 :         L_temp = L_shr( L_shr( L_q, 1 ), sub( 29, 16 ) ); /* Q16 */
    3811           0 :         temp_lo_fx = L_Extract_lc( L_temp, &temp_hi_fx );
    3812           0 :         Qgt = sub( 14, temp_hi_fx );
    3813           0 :         gain_table_fx[i] = extract_l( Pow2( 14, temp_lo_fx ) ); /* Qgt */
    3814           0 :         move16();
    3815             : 
    3816             :         /*q += delta; */
    3817           0 :         L_q = L_add( L_q, L_delta );
    3818           0 :         gain_table_fx[i] = shl( gain_table_fx[i], sub( 14, Qgt ) ); /* Qgt -> Q14 */
    3819           0 :         move16();
    3820             :     }
    3821             : 
    3822           0 :     FOR( k = sub( bands, Ngq ); k < bands; k++ )
    3823             :     {
    3824             :         /*Eyy = 0.0f; */
    3825             :         /*Exy = 0.0f; */
    3826             :         /*for (i = band_start[k_sort[k]]; i <= band_end[k_sort[k]]; i++) */
    3827             :         /*{ */
    3828             :         /*    Eyy += y2[i] * y2[i]; */
    3829             :         /*    Exy += ybuf[i] * y2[i]; */
    3830             :         /*} */
    3831           0 :         exp_safe = 4;
    3832           0 :         move16(); /* 4 is too large. but never happen overflow */
    3833           0 :         L_temp = L_deposit_l( 0 );
    3834           0 :         FOR( i = band_start[k_sort[k]]; i <= band_end[k_sort[k]]; i++ )
    3835             :         {
    3836           0 :             L_temp = L_or( L_temp, L_abs( L_y2[i] ) );   /* Q12 */
    3837           0 :             L_temp = L_or( L_temp, L_abs( L_ybuf[i] ) ); /* Q12 */
    3838             :         }
    3839           0 :         exp_norm = norm_l( L_temp );
    3840           0 :         exp_norm = sub( exp_norm, exp_safe ); /* safe_shift */
    3841             : 
    3842           0 :         L_Eyy = L_deposit_l( 0 );
    3843           0 :         L_Exy = L_deposit_l( 0 );
    3844             :         /*QE = add(shl(add(Qs-16, exp_norm), 1), 1); //(Qs+exp_norm-16)*2+1; */
    3845           0 :         FOR( i = band_start[k_sort[k]]; i <= band_end[k_sort[k]]; i++ )
    3846             :         {
    3847             :             /*Eyy += y2[i] * y2[i]; */
    3848           0 :             temp_fx = round_fx( L_shl( L_y2[i], exp_norm ) ); /* Q12 + exp_norm - 16 */
    3849           0 :             L_Eyy = L_mac( L_Eyy, temp_fx, temp_fx );         /* (Q12 + exp_norm - 16)*2 + 1 */
    3850             : 
    3851             :             /*Exy += ybuf[i] * y2[i]; */
    3852           0 :             temp2_fx = round_fx( L_shl( L_ybuf[i], exp_norm ) ); /* Q12 + exp_norm - 16 */
    3853           0 :             L_Exy = L_mac( L_Exy, temp2_fx, temp_fx );           /* (Q12 + exp_norm - 16)*2 + 1 */
    3854             :         }
    3855             : 
    3856           0 :         test();
    3857           0 :         IF( L_Eyy > 0x0L && L_Exy > 0x0L )
    3858             :         {
    3859             :             /*gamma = Exy / Eyy; */
    3860           0 :             exp_normn = norm_l( L_Exy );
    3861           0 :             exp_normn = sub( exp_normn, 1 );
    3862           0 :             exp_normd = norm_l( L_Eyy );
    3863           0 :             gamma_fx = div_l( L_shl( L_Exy, exp_normn ), round_fx_sat( L_shl( L_Eyy, exp_normd ) ) ); /* Qgamma */
    3864           0 :             Qgamma = add( sub( exp_normn, exp_normd ), 15 );                                          /* exp_normn - (exp_normd-16) - 1; */
    3865           0 :             gamma_fx = shl( gamma_fx, sub( 14, Qgamma ) );                                            /* Qgamma -> Q14 */
    3866             : 
    3867           0 :             dmin_fx = 32767;
    3868           0 :             move16();
    3869           0 :             imin_fx = -1;
    3870           0 :             move16();
    3871           0 :             FOR( i = 0; i < gqlevs; i++ )
    3872             :             {
    3873           0 :                 d_fx = abs_s( sub( gamma_fx, gain_table_fx[i] ) ); /* Q14 */
    3874           0 :                 IF( LT_16( d_fx, dmin_fx ) )
    3875             :                 {
    3876           0 :                     dmin_fx = d_fx; /* Q14 */
    3877           0 :                     move16();
    3878           0 :                     imin_fx = i; /* Q0 */
    3879           0 :                     move16();
    3880             :                 }
    3881             :             }
    3882             : 
    3883           0 :             gamma_fx = gain_table_fx[imin_fx]; /* Q14 */
    3884           0 :             move16();
    3885             : 
    3886           0 :             FOR( i = band_start[k_sort[k]]; i <= band_end[k_sort[k]]; i++ )
    3887             :             {
    3888             :                 /*y2[i] *= gamma; */
    3889             :                 /* This IF statement for keeping same mantissa evenif y2 is plus or minus */
    3890           0 :                 IF( L_y2[i] >= 0x0 )
    3891             :                 {
    3892           0 :                     L_y2[i] = L_shl( Mpy_32_16_1( L_y2[i], gamma_fx ), 1 ); /* Q12 */
    3893           0 :                     move32();
    3894             :                 }
    3895             :                 ELSE
    3896             :                 {
    3897           0 :                     L_y2[i] = L_negate( L_shl( Mpy_32_16_1( L_abs( L_y2[i] ), gamma_fx ), 1 ) ); /* Q12 */
    3898           0 :                     move32();
    3899             :                 }
    3900             :             }
    3901             :         }
    3902             :         ELSE
    3903             :         {
    3904           0 :             imin_fx = 0;
    3905           0 :             move16();
    3906             :         }
    3907             : 
    3908           0 :         push_indice( st_fx->hBstr, IND_HQ2_SUBBAND_GAIN, imin_fx, gqbits );
    3909             :     }
    3910             : 
    3911           0 :     return;
    3912             : }

Generated by: LCOV version 1.14