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

Generated by: LCOV version 1.14