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

Generated by: LCOV version 1.14