LCOV - code coverage report
Current view: top level - lib_dec - ivas_stereo_dft_dec_fx.c (source / functions) Hit Total Coverage
Test: Coverage on main enc/dec/rend @ 3b2f07138c61dcf997bbf4165d0882f794b2995f Lines: 1971 2074 95.0 %
Date: 2025-05-03 01:55:50 Functions: 17 17 100.0 %

          Line data    Source code
       1             : /******************************************************************************************************
       2             : 
       3             :    (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB,
       4             :    Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
       5             :    Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
       6             :    Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
       7             :    contributors to this repository. All Rights Reserved.
       8             : 
       9             :    This software is protected by copyright law and by international treaties.
      10             :    The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB,
      11             :    Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
      12             :    Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
      13             :    Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
      14             :    contributors to this repository retain full ownership rights in their respective contributions in
      15             :    the software. This notice grants no license of any kind, including but not limited to patent
      16             :    license, nor is any license granted by implication, estoppel or otherwise.
      17             : 
      18             :    Contributors are required to enter into the IVAS codec Public Collaboration agreement before making
      19             :    contributions.
      20             : 
      21             :    This software is provided "AS IS", without any express or implied warranties. The software is in the
      22             :    development stage. It is intended exclusively for experts who have experience with such software and
      23             :    solely for the purpose of inspection. All implied warranties of non-infringement, merchantability
      24             :    and fitness for a particular purpose are hereby disclaimed and excluded.
      25             : 
      26             :    Any dispute, controversy or claim arising under or in relation to providing this software shall be
      27             :    submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in
      28             :    accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and
      29             :    the United Nations Convention on Contracts on the International Sales of Goods.
      30             : 
      31             : *******************************************************************************************************/
      32             : 
      33             : #include <assert.h>
      34             : #include <stdint.h>
      35             : #include "options.h"
      36             : #include <math.h>
      37             : #include "cnst.h"
      38             : #include "rom_com.h"
      39             : #include "rom_dec.h"
      40             : #include "prot_fx.h"
      41             : #include "ivas_prot_fx.h"
      42             : #include "ivas_cnst.h"
      43             : #include "ivas_rom_com.h"
      44             : #include "ivas_rom_com_fx.h"
      45             : #include "ivas_rom_dec.h"
      46             : #include "wmc_auto.h"
      47             : #include "ivas_prot_fx.h"
      48             : #include "basop_util.h"
      49             : #ifdef DEBUGGING
      50             : #include "debug.h"
      51             : #endif
      52             : 
      53             : 
      54             : /*-------------------------------------------------------------------*
      55             :  * Local constants
      56             :  *-------------------------------------------------------------------*/
      57             : 
      58             : #define STEFI_DELAY_IND( d, buf_ind ) ( ( buf_ind ) + STEREO_DFT_PAST_MAX - ( d ) + 1 ) % STEREO_DFT_PAST_MAX
      59             : 
      60             : #define STEREO_DFT_RES_RATIO_LIMIT_FX        ( Word32 )( 0x170A3D71 )
      61             : #define STEREO_DFT_RES_RATIO_LIMIT_FX_3_BY_2 ( Word32 )( 0x228F5C28 )
      62             : #define ONE_STEREO_DFT_RES_RATIO_LIMIT_Q12   ( Word16 )( 0x58E4 )
      63             : #define STEREO_DFT_LT_PREDGAIN_UPD_FX        ( Word16 )( 0x0CCD )
      64             : #define STEREO_DFT_VR_PREDGAIN_UPD_FX        ( Word16 )( 0x0CCD )
      65             : #define STEREO_DFT_STEFFI_PG_THRESHOLD_FX    ( Word32 )( 0x4CCCCCCD )
      66             : #define STEREO_DFT_STEFFI_RATIO_UP_HIGH_FX   ( Word32 )( 0x03D70A3D )
      67             : #define STEREO_DFT_STEFFI_RATIO_DOWN_HIGH_FX ( Word32 )( 0x06666666 )
      68             : #define STEREO_DFT_STEFFI_RATIO_UP_LOW_FX    ( Word32 )( 0x0CCCCCCC )
      69             : #define STEREO_DFT_STEFFI_RATIO_DOWN_LOW_FX  ( Word32 )( 0x0020C49C )
      70             : #define STEREO_DFT_STEFFI_DELAY_SHORT        2
      71             : #define STEREO_DFT_STEFFI_DELAY_LONG         4
      72             : #define STEREO_DFT_STEFFI_DELAY_OFFSET       2
      73             : #define STEREO_DFT_STEFFI_GAIN_REST_AMT_FX   ( Word16 )( 0x4CCD )
      74             : #define STEREO_DFT_STEFFI_GAIN_AMP_FX        ( Word16 )( 0x7FFF )
      75             : 
      76             : 
      77             : #define STEREO_DFT_BPF_SIZE 40 /* BPF: Number of weights for BPF in DFT: 40*40Hz=1.6kHz*/
      78             : 
      79             : /*-------------------------------------------------------------------------
      80             :  * Local function prototypes
      81             :  *-------------------------------------------------------------------------*/
      82             : 
      83             : static void stereo_dft_compute_td_stefi_params_fx( STEREO_DFT_DEC_DATA_HANDLE hStereoDft, const Word16 samp_ratio );
      84             : 
      85             : static void stereo_dft_adapt_sf_delay_fx( STEREO_DFT_DEC_DATA_HANDLE hStereoDft, Word32 *pPredGain );
      86             : 
      87             : /*-------------------------------------------------------------------------
      88             :  * stereo_dft_dec_reset_fx()
      89             :  *
      90             :  * Reset DFT stereo memories
      91             :  *------------------------------------------------------------------------*/
      92             : 
      93         908 : void stereo_dft_dec_reset_fx(
      94             :     STEREO_DFT_DEC_DATA_HANDLE hStereoDft /* i/o: decoder DFT stereo handle   */
      95             : )
      96             : {
      97             :     Word16 i;
      98             :     Word16 j, b;
      99         908 :     set_zero_fx( hStereoDft->buff_LBTCX_mem_fx, NS2SA( 16000, STEREO_DFT32MS_OVL_NS ) );
     100             : 
     101             :     /*Configuration*/
     102         908 :     set16_fx( hStereoDft->prm_res, hStereoDft->hConfig->prm_res, STEREO_DFT_DEC_DFT_NB );
     103             : 
     104             :     /* SIDE_GAIN */
     105         908 :     set16_fx( hStereoDft->side_gain_index, 15, STEREO_DFT_BAND_MAX );
     106         908 :     set16_fx( hStereoDft->side_gain_index_previous, 15, STEREO_DFT_BAND_MAX );
     107             : 
     108             :     /*residual prediction*/
     109         908 :     set16_fx( hStereoDft->res_pred_mode, hStereoDft->hConfig->res_pred_mode, STEREO_DFT_DEC_DFT_NB );
     110        4540 :     FOR( i = 0; i < STEREO_DFT_PAST_MAX; i++ )
     111             :     {
     112        3632 :         set32_fx( hStereoDft->DFT_past_DMX_fx[i], 0, STEREO_DFT32MS_N_32k );
     113        3632 :         set32_fx( hStereoDft->past_res_pred_gain_fx[i], 0, STEREO_DFT_BAND_MAX );
     114        3632 :         hStereoDft->q_DFT_past_DMX_fx[i] = 0;
     115        3632 :         move16();
     116             :     }
     117             : 
     118         908 :     hStereoDft->past_DMX_pos = 0;
     119         908 :     move16();
     120             : 
     121         908 :     set16_fx( hStereoDft->res_pred_index_previous, 0, STEREO_DFT_BAND_MAX );
     122             : 
     123       24516 :     FOR( i = 0; i < STEREO_DFT_BAND_MAX * 2; i++ )
     124             :     {
     125       23608 :         hStereoDft->res_gains_ind_fx[0][i] = 1006632960; /* 15.0f in Q26 */
     126       23608 :         move32();
     127             :     }
     128             : 
     129         908 :     set32_fx( hStereoDft->res_gains_ind_fx[1], 0, STEREO_DFT_BAND_MAX * 2 );
     130             : 
     131             :     /*residual coding*/
     132         908 :     set16_fx( hStereoDft->res_cod_mode, hStereoDft->hConfig->res_cod_mode, STEREO_DFT_DEC_DFT_NB );
     133         908 :     hStereoDft->res_cod_band_max = dft_band_res_cod[hStereoDft->hConfig->band_res][hStereoDft->hConfig->res_cod_mode];
     134         908 :     set32_fx( hStereoDft->res_cod_mem_fx, 0, STEREO_DFT_OVL_8k );
     135         908 :     hStereoDft->q_res_cod_mem_fx = Q15;
     136         908 :     move16();
     137             : 
     138         908 :     hStereoDft->res_pred_band_min = s_max( STEREO_DFT_RES_PRED_BAND_MIN, hStereoDft->res_cod_band_max );
     139         908 :     move32();
     140             : 
     141         908 :     hStereoDft->stab_fac_smooth_res_fx = 0;
     142         908 :     move16();
     143         908 :     bass_psfilter_init_fx( hStereoDft->hBpf );
     144             : 
     145         908 :     tcxltp_dec_init_fx( hStereoDft->hTcxLtpDec, 0, MODE1, IVAS_CPE_DFT, PIT_MAX, 12800 );
     146             : 
     147         908 :     hStereoDft->reverb_flag = 0;
     148         908 :     move16();
     149             : 
     150         908 :     hStereoDft->res_hb_nrg_mem_fx = 0;
     151         908 :     move32();
     152         908 :     hStereoDft->bpf_error_signal_last_fx = 0;
     153         908 :     move32();
     154         908 :     hStereoDft->bpf_error_ratio_mem_fx = ONE_IN_Q13;
     155         908 :     move16();
     156             : 
     157             :     /*reset parameters*/
     158         908 :     set32_fx( hStereoDft->side_gain_fx, 0, STEREO_DFT_DEC_DFT_NB * STEREO_DFT_BAND_MAX );
     159         908 :     set32_fx( hStereoDft->gipd_fx, 0, STEREO_DFT_DEC_DFT_NB );
     160         908 :     set32_fx( hStereoDft->itd_fx, 0, STEREO_DFT_DEC_DFT_NB );
     161         908 :     set32_fx( hStereoDft->res_pred_gain_fx, 0, STEREO_DFT_DEC_DFT_NB * STEREO_DFT_BAND_MAX );
     162             : 
     163         908 :     hStereoDft->wasTransient = 0;
     164         908 :     move16();
     165         908 :     hStereoDft->attackPresent = 0;
     166         908 :     move16();
     167             : 
     168         908 :     hStereoDft->lt_pred_gain_fx = 0;
     169         908 :     move32();
     170         908 :     hStereoDft->lt_pred_gain_variation_fx = 0;
     171         908 :     move32();
     172         908 :     hStereoDft->lt_var_mean_ratio_fx = STEREO_DFT_RES_RATIO_LIMIT_FX;
     173         908 :     move32();
     174         908 :     hStereoDft->stefi_short_gain_fx = MAX_16;
     175         908 :     move16();
     176         908 :     hStereoDft->stefi_long_gain_fx = 0;
     177         908 :     move16();
     178         908 :     hStereoDft->q_lt_pred_gain = 0;
     179         908 :     move16();
     180             : 
     181         908 :     set16_fx( &hStereoDft->g_state_fx[0], 0, STEREO_DFT_BAND_MAX );
     182             : 
     183         908 :     init_basic_allpass_fx( &hStereoDft->ap1, dft_ap_gains_fx[0], dft_ap_delays[0] );
     184         908 :     init_basic_allpass_fx( &hStereoDft->ap2, dft_ap_gains_fx[1], dft_ap_delays[1] );
     185         908 :     init_basic_allpass_fx( &hStereoDft->ap3, dft_ap_gains_fx[2], dft_ap_delays[2] );
     186             : 
     187         908 :     set32_fx( hStereoDft->ap_delay_mem_fx, 0, NS2SA( 16000, DELAY_BWE_TOTAL_NS ) );
     188         908 :     set32_fx( hStereoDft->ap_fade_mem_fx, 0, STEREO_DFT_ALLPASS_FADELEN_16k );
     189         908 :     hStereoDft->q_ap_delay_mem_fx = Q11;
     190         908 :     move16();
     191         908 :     hStereoDft->ap_wasTransient = 0;
     192         908 :     move16();
     193         908 :     set32_fx( hStereoDft->smooth_dmx_nrg_fx, 0, STEREO_DFT_BAND_MAX );
     194         908 :     set32_fx( hStereoDft->smooth_res_nrg_fx, 0, STEREO_DFT_BAND_MAX );
     195         908 :     hStereoDft->q_smoothed_nrg = 0;
     196         908 :     move16();
     197             : 
     198         908 :     set16_fx( hStereoDft->core_hist, ACELP_CORE, STEREO_DFT_CORE_HIST_MAX );
     199             : 
     200         908 :     set32_fx( hStereoDft->hb_stefi_sig_fx, 0, L_FRAME48k + NS2SA( 48000, STEREO_DFT_TD_STEFI_DELAY_NS ) );
     201         908 :     set32_fx( hStereoDft->hb_nrg_fx, 0, STEREO_DFT_CORE_HIST_MAX );
     202         908 :     set32_fx( hStereoDft->td_gain_fx, 0, STEREO_DFT_CORE_HIST_MAX );
     203         908 :     set16_fx( hStereoDft->q_td_gain, 0, STEREO_DFT_CORE_HIST_MAX );
     204         908 :     hStereoDft->q_dft = 0;
     205         908 :     move16();
     206             : 
     207             :     /* PLC parameters */
     208         908 :     set32_fx( hStereoDft->res_mem_fx, 0, STEREO_DFT_RES_BW_MAX );
     209         908 :     hStereoDft->time_offs = 0;
     210         908 :     move16();
     211         908 :     hStereoDft->past_dmx_nrg_fx = 0;
     212         908 :     move32();
     213         908 :     hStereoDft->sg_mean_fx = 0;
     214         908 :     move32();
     215         908 :     hStereoDft->sg_mem_corrupt = 0;
     216         908 :     move16();
     217         908 :     hStereoDft->recovery_flg = 0;
     218         908 :     move16();
     219             : 
     220       11804 :     FOR( i = 0; i < SBA_DIRAC_STEREO_NUM_BANDS; i++ )
     221             :     {
     222       10896 :         set32_fx( hStereoDft->smooth_buf_fx[i], 0, SBA_DIRAC_NRG_SMOOTH_LONG + 1 );
     223             :     }
     224         908 :     hStereoDft->q_smooth_buf_fx = Q7;
     225         908 :     move16();
     226         908 :     set16_fx( hStereoDft->smooth_fac_fx[0], 0, SBA_DIRAC_STEREO_NUM_BANDS );
     227         908 :     set16_fx( hStereoDft->smooth_fac_fx[1], 0, SBA_DIRAC_STEREO_NUM_BANDS );
     228             : 
     229         908 :     hStereoDft->itd_xfade_target_fx = 0;
     230         908 :     move32();
     231         908 :     hStereoDft->itd_xfade_step_fx = 0;
     232         908 :     move32();
     233         908 :     hStereoDft->itd_xfade_counter = 0;
     234         908 :     move16();
     235         908 :     hStereoDft->itd_xfade_prev_fx = 0;
     236         908 :     move32();
     237         908 :     hStereoDft->last_active_element_brate = 0;
     238         908 :     move32();
     239         908 :     hStereoDft->ipd_xfade_target_fx = 0;
     240         908 :     move32();
     241         908 :     hStereoDft->ipd_xfade_step_fx = 0;
     242         908 :     move32();
     243         908 :     hStereoDft->ipd_xfade_counter = 0;
     244         908 :     move16();
     245         908 :     hStereoDft->ipd_xfade_prev_fx = 0;
     246         908 :     move32();
     247         908 :     hStereoDft->frame_sid_nodata = 0;
     248         908 :     move16();
     249       22700 :     FOR( b = 0; b < 2 * IVAS_MAX_NUM_BANDS; b++ )
     250             :     {
     251       65376 :         FOR( i = 0; i < 2; i++ )
     252             :         {
     253      217920 :             FOR( j = 0; j < 4; j++ )
     254             :             {
     255      174336 :                 hStereoDft->mixer_mat_smooth_fx[i][j][b] = 0;
     256      174336 :                 move32();
     257             :             }
     258             :         }
     259             :     }
     260         908 :     hStereoDft->first_frame = 1;
     261         908 :     move16();
     262         908 :     hStereoDft->g_L_prev_fx = 0;
     263         908 :     move32();
     264         908 :     hStereoDft->g_R_prev_fx = 0;
     265         908 :     move32();
     266             : 
     267         908 :     return;
     268             : }
     269             : 
     270             : /*-------------------------------------------------------------------------
     271             :  * stereo_dft_dec_open()
     272             :  *
     273             :  * Open DFT decoder stereo handle
     274             :  *-------------------------------------------------------------------------*/
     275             : 
     276         908 : static void stereo_dft_dec_open_fx(
     277             :     STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle              */
     278             :     const Word32 output_Fs,                /* i  : output sampling rate                         Q0*/
     279             :     const Word16 nchan_transport           /* i  : number of transport channels         Q0*/
     280             : )
     281             : {
     282             :     /*Sizes*/
     283             :     // hStereoDft->N = (Word16) ( STEREO_DFT_HOP_MAX * output_Fs / 48000 );
     284         908 :     hStereoDft->N = extract_l( Mpy_32_32( imult3216( output_Fs, STEREO_DFT_HOP_MAX ), 44740 /* 1/48000 in Q31 */ ) ); /* Q0 */
     285         908 :     move16();
     286             : 
     287             :     /*Init. DFT sizes*/
     288         908 :     hStereoDft->NFFT = extract_l( Mpy_32_32( imult3216( output_Fs, STEREO_DFT32MS_N_MAX ), 44740 /* 1/48000 in Q31 */ ) ); /* Q0 */
     289         908 :     move16();
     290             : 
     291         908 :     hStereoDft->dft_trigo_8k_fx = dft_trigo_32k_fx;    /* Q15 */
     292         908 :     hStereoDft->dft_trigo_12k8_fx = dft_trigo_12k8_fx; /* Q15 */
     293         908 :     hStereoDft->dft_trigo_16k_fx = dft_trigo_32k_fx;   /* Q15 */
     294             : 
     295         908 :     hStereoDft->dft32ms_ovl = extract_l( Mpy_32_32( imult3216( output_Fs, STEREO_DFT32MS_OVL_MAX ), 44740 /* 1/48000 in Q31 */ ) ); /* Q0 */
     296         908 :     hStereoDft->win232ms_8k_fx = dft_win232ms_8k_fx;                                                                                /* Q15 */
     297         908 :     hStereoDft->win232ms_12k8_fx = dft_win232ms_12k8_fx;                                                                            /* Q15 */
     298         908 :     hStereoDft->win232ms_16k_fx = dft_win232ms_16k_fx;                                                                              /* Q15 */
     299             : 
     300         908 :     hStereoDft->dft32ms_ovl2 = extract_l( Mpy_32_32( imult3216( output_Fs, STEREO_DFT32MS_OVL2_MAX ), 44740 /* 1/48000 in Q31 */ ) ); /* Q0 */
     301         908 :     hStereoDft->win32ms_8k_fx = dft_win232ms_8k_fx + 1;                                                                               /* Q15 */
     302         908 :     hStereoDft->win32ms_12k8_fx = dft_win232ms_12k8_fx + 1;                                                                           /* Q15 */
     303         908 :     hStereoDft->win32ms_16k_fx = dft_win232ms_16k_fx + 1;                                                                             /* Q15 */
     304             : 
     305         908 :     IF( EQ_32( output_Fs, 16000 ) )
     306             :     {
     307          89 :         hStereoDft->dft_trigo_fx = dft_trigo_32k_fx;                  /* Q15 */
     308          89 :         hStereoDft->dft_trigo_step = STEREO_DFT_TRIGO_SRATE_16k_STEP; /* Q0 */
     309          89 :         move16();
     310          89 :         hStereoDft->win232ms_fx = dft_win232ms_16k_fx;    /* Q15 */
     311          89 :         hStereoDft->win32ms_fx = dft_win232ms_16k_fx + 1; /* Q15 */
     312             :     }
     313         819 :     ELSE IF( EQ_32( output_Fs, 32000 ) )
     314             :     {
     315         212 :         hStereoDft->dft_trigo_fx = dft_trigo_32k_fx;                  /* Q15 */
     316         212 :         hStereoDft->dft_trigo_step = STEREO_DFT_TRIGO_SRATE_32k_STEP; /* Q0 */
     317         212 :         move16();
     318         212 :         hStereoDft->win232ms_fx = dft_win232ms_32k_fx;    /* Q15 */
     319         212 :         hStereoDft->win32ms_fx = dft_win232ms_32k_fx + 1; /* Q15 */
     320             :     }
     321             :     ELSE
     322             :     {
     323         607 :         assert( output_Fs == 48000 );
     324         607 :         hStereoDft->dft_trigo_fx = dft_trigo_48k_fx;                  /* Q15 */
     325         607 :         hStereoDft->dft_trigo_step = STEREO_DFT_TRIGO_SRATE_48k_STEP; /* Q0 */
     326         607 :         move16();
     327         607 :         hStereoDft->win232ms_fx = dft_win232ms_48k_fx;    /* Q15 */
     328         607 :         hStereoDft->win32ms_fx = dft_win232ms_48k_fx + 1; /* Q15 */
     329             :     }
     330             : 
     331         908 :     hStereoDft->win_8k_fx = dft_win_8k_fx; /* Q15 */
     332             : 
     333             :     /*Bands: find the number of bands, Nyquist freq. is not taken into account*/
     334         908 :     set16_fx( hStereoDft->band_res, hStereoDft->hConfig->band_res, STEREO_DFT_DEC_DFT_NB );
     335             : 
     336         908 :     hStereoDft->nbands = stereo_dft_band_config_fx( hStereoDft->band_limits, hStereoDft->band_res[0], hStereoDft->NFFT, DEC ); /* Q0 */
     337         908 :     move16();
     338         908 :     hStereoDft->hb_stefi_delay = NS2SA_FX2( output_Fs, STEREO_DFT_TD_STEFI_DELAY_NS ); /* Q0 */
     339         908 :     move16();
     340             : 
     341         908 :     IF( GT_16( nchan_transport, 2 ) )
     342             :     {
     343          44 :         hStereoDft->min_smooth_gains_fx = min_smooth_gains2_fx; /* Q15 */
     344          44 :         hStereoDft->max_smooth_gains_fx = max_smooth_gains2_fx; /* Q15 */
     345             :     }
     346             :     ELSE
     347             :     {
     348         864 :         hStereoDft->min_smooth_gains_fx = min_smooth_gains1_fx; /* Q15 */
     349         864 :         hStereoDft->max_smooth_gains_fx = max_smooth_gains1_fx; /* Q15 */
     350             :     }
     351         908 :     hStereoDft->q_hb_stefi_sig_fx = Q31;
     352         908 :     move16();
     353         908 :     hStereoDft->q_ap_fade_mem_fx = Q31;
     354         908 :     move16();
     355             : 
     356             :     /* reset DFT stereo memories */
     357         908 :     stereo_dft_dec_reset_fx( hStereoDft );
     358             : 
     359         908 :     return;
     360             : }
     361             : 
     362             : 
     363             : /*-------------------------------------------------------------------------
     364             :  * stereo_dft_dec_create_fx()
     365             :  *
     366             :  * Create DFT stereo handle
     367             :  *------------------------------------------------------------------------*/
     368             : 
     369         908 : ivas_error stereo_dft_dec_create_fx(
     370             :     STEREO_DFT_DEC_DATA_HANDLE *hStereoDft, /* i/o: decoder DFT stereo handle                     */
     371             :     const Word32 element_brate,             /* i  : element bitrate                                             Q0*/
     372             :     const Word32 output_Fs,                 /* i  : output sampling rate                                Q0*/
     373             :     const Word16 sba_dirac_stereo_flag,     /* i  : signal stereo output for SBA DirAC  Q0*/
     374             :     const Word16 nchan_transport            /* i  : number of transport channels                Q0*/
     375             : )
     376             : {
     377             :     STEREO_DFT_DEC_DATA_HANDLE hStereoDft_loc;
     378             :     Word16 tmpS;
     379             : 
     380         908 :     IF( *hStereoDft != NULL )
     381             :     {
     382           0 :         return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error: DFT Stereo memory already allocated\n" );
     383             :     }
     384             : 
     385         908 :     IF( ( hStereoDft_loc = (STEREO_DFT_DEC_DATA_HANDLE) malloc( sizeof( STEREO_DFT_DEC_DATA ) ) ) == NULL )
     386             :     {
     387           0 :         return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DFT Stereo\n" ) );
     388             :     }
     389             : 
     390         908 :     IF( ( hStereoDft_loc->hConfig = (STEREO_DFT_CONFIG_DATA_HANDLE) malloc( sizeof( STEREO_DFT_CONFIG_DATA ) ) ) == NULL )
     391             :     {
     392           0 :         return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DFT Stereo Config\n" ) );
     393             :     }
     394             : 
     395         908 :     IF( ( hStereoDft_loc->hBpf = (BPF_DEC_HANDLE) malloc( sizeof( BPF_DEC_DATA ) ) ) == NULL )
     396             :     {
     397           0 :         return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for BPF handle\n" ) );
     398             :     }
     399             : 
     400         908 :     IF( ( hStereoDft_loc->hTcxLtpDec = (TCX_LTP_DEC_HANDLE) malloc( sizeof( TCX_LTP_DEC_DATA ) ) ) == NULL )
     401             :     {
     402           0 :         return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TCX-LTP handle\n" ) );
     403             :     }
     404         908 :     set_zero_fx( hStereoDft_loc->hb_nrg_subr_fx, STEREO_DFT_NBDIV ); /*Setting hb_nrg_subr_fx to zero*/
     405             : 
     406         908 :     hStereoDft_loc->hConfig->force_mono_transmission = 0;
     407         908 :     move16();
     408             : 
     409         908 :     IF( sba_dirac_stereo_flag )
     410             :     {
     411          96 :         ivas_sba_dirac_stereo_config( hStereoDft_loc->hConfig );
     412             :     }
     413             :     ELSE
     414             :     {
     415         812 :         stereo_dft_config_fx( hStereoDft_loc->hConfig, element_brate, &tmpS, &tmpS );
     416             :     }
     417             : 
     418         908 :     stereo_dft_dec_open_fx( hStereoDft_loc, output_Fs, nchan_transport );
     419             : 
     420         908 :     *hStereoDft = hStereoDft_loc;
     421             : 
     422         908 :     return IVAS_ERR_OK;
     423             : }
     424             : 
     425             : 
     426             : /*-------------------------------------------------------------------------
     427             :  * stereo_dft_dequantize_res_gains_fx()
     428             :  *
     429             :  * joint dequantizer for side channel prediction gain and residual energy
     430             :  *-------------------------------------------------------------------------*/
     431             : 
     432      412899 : static void stereo_dft_dequantize_res_gains_fx(
     433             :     Word16 *ind1,  /* Q0 */
     434             :     Word16 *ind2,  /* Q0 */
     435             :     Word32 *gout,  /* Q31 */
     436             :     Word32 *rout,  /* Q31 */
     437             :     const Word16 N /* Q0 */
     438             : )
     439             : {
     440             :     Word16 i, index;
     441             :     Word16 tmp;
     442             : 
     443      825798 :     FOR( i = 0; i < N; i++ )
     444             :     {
     445             :         /* Ensure the indices are within range -- may go out of range due to frame loss */
     446      412899 :         ind1[i] = check_bounds_s_fx( ind1[i], 0, 30 ); /* Q0 */
     447      412899 :         move16();
     448      412899 :         ind2[i] = check_bounds_s_fx( ind2[i], 0, 7 ); /* Q0 */
     449      412899 :         move16();
     450      412899 :         IF( LE_16( ind1[i], 15 ) )
     451             :         {
     452      318379 :             tmp = sub( 15, ind1[i] );
     453             :         }
     454             :         ELSE
     455             :         {
     456       94520 :             tmp = sub( ind1[i], 15 );
     457             :         }
     458             :         // index = add( shl( LE_16( ind1[i], 15 ) ? sub( 15, ind1[i] ) : sub( ind1[i], 15 ), 3 ), ind2[i] );
     459      412899 :         index = add( shl( tmp, 3 ), ind2[i] );
     460             :         // gout[i] = LE_16( ind1[i], 15 ) ? L_negate( dft_res_gains_q_fx[index][0] ) : dft_res_gains_q_fx[index][0];
     461      412899 :         IF( LE_16( ind1[i], 15 ) )
     462             :         {
     463      318379 :             gout[i] = L_negate( dft_res_gains_q_fx[index][0] ); /* Q31 */
     464      318379 :             move16();
     465             :         }
     466             :         ELSE
     467             :         {
     468       94520 :             gout[i] = dft_res_gains_q_fx[index][0]; /* Q31 */
     469       94520 :             move16();
     470             :         }
     471      412899 :         rout[i] = dft_res_gains_q_fx[index][1]; /* Q31 */
     472      412899 :         move16();
     473             :     }
     474             : 
     475      412899 :     return;
     476             : }
     477             : 
     478             : /*---------------------------------------------------------------------------
     479             :  * stereo_dft_dequantize_res_gains_f_fx()
     480             :  *
     481             :  * returns interepolated values for non-integer indices
     482             :  *---------------------------------------------------------------------------*/
     483             : 
     484      258886 : static void stereo_dft_dequantize_res_gains_f_fx(
     485             :     Word32 *ind1,  /* Q26 */
     486             :     Word32 *ind2,  /* Q26 */
     487             :     Word32 *gout,  /* Q31 */
     488             :     Word32 *rout,  /* Q31 */
     489             :     const Word16 N /* Q0 */
     490             : )
     491             : {
     492             :     Word16 i, i1, j1, sign, ji, ij;
     493             :     Word32 L_tmp;
     494             :     Word32 fi, fj;
     495             : 
     496      517772 :     FOR( i = 0; i < N; i++ )
     497             :     {
     498             :         /* Ensure the indices are within range -- may go out of range due to frame loss */
     499      258886 :         ind1[i] = check_bounds_l( ind1[i], 0, 31 << Q26 ); /* Q26 */
     500      258886 :         move32();
     501      258886 :         ind2[i] = check_bounds_l( ind2[i], 0, 7 << Q26 ); /* Q26 */
     502      258886 :         move32();
     503             : 
     504             :         /* compensate for the offset and extract/remove sign of first index */
     505             :         // sign = LT_32( ind1[i], L_shl( 15, Q26 ) ) ? -1 : 1;
     506      258886 :         IF( LT_32( ind1[i], L_shl( 15, Q26 ) ) )
     507             :         {
     508      151745 :             sign = -1;
     509      151745 :             move16();
     510             :         }
     511             :         ELSE
     512             :         {
     513      107141 :             sign = 1;
     514      107141 :             move16();
     515             :         }
     516      258886 :         IF( LT_32( ind1[i], L_shl( 15, Q26 ) ) )
     517             :         {
     518      151745 :             L_tmp = L_sub( L_shl( 15, Q26 ), ind1[i] ); /* Q26 */
     519             :         }
     520             :         ELSE
     521             :         {
     522      107141 :             L_tmp = L_sub( ind1[i], L_shl( 15, Q26 ) ); /* Q26 */
     523             :         }
     524      258886 :         i1 = extract_l( L_shr( ( L_tmp ), Q26 ) ); /* Q0 */
     525      258886 :         IF( LT_32( ind1[i], L_shl( 15, Q26 ) ) )
     526             :         {
     527      151745 :             L_tmp = L_sub( L_shl( 15, Q26 ), ind1[i] ); /* Q26 */
     528             :         }
     529             :         ELSE
     530             :         {
     531      107141 :             L_tmp = L_sub( ind1[i], L_shl( 15, Q26 ) ); /* Q26 */
     532             :         }
     533      258886 :         fi = L_sub( ( L_tmp ), L_shl( i1, Q26 ) ); /* Q26 */
     534      258886 :         move16();
     535      258886 :         j1 = extract_l( L_shr( ind2[i], Q26 ) ); /* Q0 */
     536      258886 :         fj = L_sub( ind2[i], L_shl( j1, Q26 ) ); /* Q26 */
     537             : 
     538             :         /* choose base indices for interpolation */
     539      258886 :         IF( LT_32( fj, ONE_IN_Q25 ) )
     540             :         {
     541      109241 :             ji = extract_l( L_min( j1, 7 ) ); /* Q0 */
     542             :         }
     543             :         ELSE
     544             :         {
     545      149645 :             ji = extract_l( L_min( add( j1, 1 ), 7 ) ); /* Q0 */
     546             :         }
     547             : 
     548      258886 :         IF( LT_32( fi, ONE_IN_Q25 ) )
     549             :         {
     550      212924 :             ij = extract_l( L_min( i1, 15 ) ); /* Q0 */
     551             :         }
     552             :         ELSE
     553             :         {
     554       45962 :             ij = extract_l( L_min( add( i1, 1 ), 15 ) ); /* Q0 */
     555             :         }
     556             : 
     557             :         /* interpolate values from table */
     558      258886 :         IF( LT_16( i1, 15 ) )
     559             :         {
     560      258240 :             gout[i] = Madd_32_32( Mpy_32_32( L_sub( MAX_32, L_shl( fi, Q5 ) ), dft_res_gains_q_fx[( i1 << 3 ) + ji][0] ), dft_res_gains_q_fx[( ( i1 + 1 ) << 3 ) + ji][0], L_shl( fi, Q5 ) ); /* Q31 */
     561      258240 :             move32();
     562      258240 :             IF( EQ_16( sign, -1 ) )
     563             :             {
     564      151131 :                 gout[i] = L_negate( gout[i] );
     565      151131 :                 move32();
     566             :             }
     567             :         }
     568             :         ELSE
     569             :         {
     570         646 :             gout[i] = dft_res_gains_q_fx[120 + ji][0]; /* Q31 */
     571         646 :             move32();
     572         646 :             IF( EQ_16( sign, -1 ) )
     573             :             {
     574         614 :                 gout[i] = L_negate( gout[i] );
     575         614 :                 move32();
     576             :             }
     577             :         }
     578             : 
     579      258886 :         IF( LT_16( j1, 7 ) )
     580             :         {
     581      258886 :             rout[i] = Madd_32_32( Mpy_32_32( L_sub( MAX_32, L_shl( fj, Q5 ) ), dft_res_gains_q_fx[( ij << 3 ) + j1][1] ), L_shl( fj, Q5 ), dft_res_gains_q_fx[( ij << 3 ) + j1 + 1][1] ); /* Q31 */
     582      258886 :             move32();
     583             :         }
     584             :         ELSE
     585             :         {
     586           0 :             rout[i] = dft_res_gains_q_fx[( ij << 3 ) + 7][1]; /* Q31 */
     587           0 :             move32();
     588             :         }
     589             :     }
     590      258886 :     return;
     591             : }
     592             : 
     593             : /*-------------------------------------------------------------------------
     594             :  * stereo_dft_dec_update_fx()
     595             :  *
     596             :  * Update DFT memories for new frame
     597             :  *-------------------------------------------------------------------------*/
     598             : 
     599       68949 : void stereo_dft_dec_update_fx(
     600             :     STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle                      */
     601             :     const Word16 output_frame,             /* i  : output frame length                                  Q0*/
     602             :     const Word16 sba_dirac_stereo_flag     /* i  : signal stereo output for SBA DirAC   Q0*/
     603             : )
     604             : {
     605             :     Word16 b, i, k_offset;
     606             : 
     607             :     /* Initialization */
     608       68949 :     k_offset = STEREO_DFT_OFFSET; /*Add an offset*/
     609       68949 :     move16();
     610             :     /* Update parameters */
     611      965286 :     FOR( i = 0; i < k_offset * STEREO_DFT_BAND_MAX; i++ )
     612             :     {
     613      896337 :         hStereoDft->side_gain_fx[i] = hStereoDft->side_gain_fx[STEREO_DFT_NBDIV * STEREO_DFT_BAND_MAX + i]; /* Q31 */
     614      896337 :         move32();
     615      896337 :         hStereoDft->res_pred_gain_fx[i] = hStereoDft->res_pred_gain_fx[STEREO_DFT_NBDIV * STEREO_DFT_BAND_MAX + i]; /* Q31 */
     616      896337 :         move32();
     617             :     }
     618             : 
     619      137898 :     FOR( i = 0; i < k_offset; i++ )
     620             :     {
     621       68949 :         hStereoDft->gipd_fx[i] = hStereoDft->gipd_fx[STEREO_DFT_NBDIV + i]; /* Q27 */
     622       68949 :         move32();
     623             :     }
     624             : 
     625             :     /* Update configuration memories */
     626      137898 :     FOR( i = 0; i < k_offset; i++ )
     627             :     {
     628       68949 :         hStereoDft->band_res[i] = hStereoDft->band_res[i + STEREO_DFT_NBDIV]; /* Q0 */
     629       68949 :         move16();
     630       68949 :         hStereoDft->prm_res[i] = hStereoDft->prm_res[i + STEREO_DFT_NBDIV]; /* Q0 */
     631       68949 :         move16();
     632       68949 :         hStereoDft->itd_fx[i] = hStereoDft->itd_fx[STEREO_DFT_NBDIV + i]; /* Q15 */
     633       68949 :         move32();
     634       68949 :         hStereoDft->res_cod_mode[i] = hStereoDft->res_cod_mode[i + STEREO_DFT_NBDIV]; /* Q0 */
     635       68949 :         move16();
     636       68949 :         hStereoDft->res_pred_mode[i] = hStereoDft->res_pred_mode[i + STEREO_DFT_NBDIV]; /* Q0 */
     637       68949 :         move16();
     638             :     }
     639             : 
     640             :     /* Load new configurations */
     641       68949 :     set16_fx( hStereoDft->band_res + k_offset, hStereoDft->hConfig->band_res, STEREO_DFT_NBDIV );
     642       68949 :     set16_fx( hStereoDft->prm_res + k_offset, hStereoDft->hConfig->prm_res, STEREO_DFT_NBDIV );
     643       68949 :     set16_fx( hStereoDft->res_pred_mode + k_offset, hStereoDft->hConfig->res_pred_mode, STEREO_DFT_NBDIV );
     644       68949 :     set16_fx( hStereoDft->res_cod_mode + k_offset, hStereoDft->hConfig->res_cod_mode, STEREO_DFT_NBDIV );
     645             : 
     646             :     /*Update attack info*/
     647       68949 :     IF( hStereoDft->attackPresent )
     648             :     {
     649        1576 :         hStereoDft->wasTransient = 1;
     650        1576 :         move16();
     651             :     }
     652       67373 :     ELSE IF( hStereoDft->wasTransient )
     653             :     {
     654        1362 :         hStereoDft->wasTransient = 0;
     655        1362 :         move16();
     656             :     }
     657             : 
     658      206847 :     FOR( i = STEREO_DFT_CORE_HIST_MAX - 1; i > 0; i-- )
     659             :     {
     660      137898 :         hStereoDft->core_hist[i] = hStereoDft->core_hist[i - 1]; /* Q0 */
     661      137898 :         move16();
     662             :     }
     663             : 
     664       68949 :     Copy32( hStereoDft->hb_stefi_sig_fx + output_frame, hStereoDft->hb_stefi_sig_fx, hStereoDft->hb_stefi_delay ); /* Qx */
     665       68949 :     Copy32( hStereoDft->hb_nrg_fx, hStereoDft->hb_nrg_fx + 1, STEREO_DFT_CORE_HIST_MAX - 1 );                      /* Qx */
     666       68949 :     Copy32( hStereoDft->td_gain_fx, hStereoDft->td_gain_fx + 1, STEREO_DFT_CORE_HIST_MAX - 1 );                    /* q_td_gain */
     667       68949 :     Copy( hStereoDft->q_td_gain, hStereoDft->q_td_gain + 1, STEREO_DFT_CORE_HIST_MAX - 1 );
     668             : 
     669       68949 :     IF( sba_dirac_stereo_flag )
     670             :     {
     671             :         /* buffer update, push back by 2 because of 2 subframes */
     672      126010 :         FOR( b = 0; b < hStereoDft->nbands; b++ )
     673             :         {
     674     1152200 :             FOR( i = SBA_DIRAC_NRG_SMOOTH_LONG; i > 1; i-- )
     675             :             {
     676     1036980 :                 hStereoDft->smooth_buf_fx[b][i] = hStereoDft->smooth_buf_fx[b][i - 2]; /* q_smooth_buf_fx */
     677     1036980 :                 move32();
     678             :             }
     679             :         }
     680             :     }
     681             : 
     682       68949 :     return;
     683             : }
     684             : 
     685             : /*-------------------------------------------------------------------------
     686             :  * stereo_dft_dec_synthesize_fx()
     687             :  *
     688             :  * Inverse DFT on a 20ms frame
     689             :  *-------------------------------------------------------------------------*/
     690             : 
     691       99717 : void stereo_dft_dec_synthesize_fx(
     692             :     CPE_DEC_HANDLE hCPE,                          /* i/o: CPE decoder structure                 */
     693             :     Word32 DFT[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* i  : DFT buffers                           qDFT*/
     694             :     const Word16 chan,                            /* i  : channel number                          Q0*/
     695             :     Word32 output[L_FRAME48k],                    /* o  : output synthesis signal       qDFT*/
     696             :     const Word16 output_frame                     /* i  : output frame length             Q0*/
     697             : )
     698             : {
     699             :     Word16 i, k;
     700             :     Word16 offset;
     701             :     STEREO_DFT_DEC_DATA_HANDLE hStereoDft;
     702             :     Word32 *p_DFT;
     703             :     const Word16 *win, *win2;
     704             :     Word16 trigo_dec[STEREO_DFT32MS_N_MAX / 2 + 1];
     705             :     Word16 trigo_step;
     706             :     Word16 ovl, zp, NFFT;
     707             :     Word32 outputFs;
     708             :     Word16 ovl2, flat_portion_end;
     709             :     Word32 ola_buff[STEREO_DFT32MS_OVL2_MAX];
     710             :     Word16 moffset;
     711             :     Word16 scale_dft;
     712       99717 :     push_wmops( "DFT_synthesis" );
     713             : 
     714             :     /*-----------------------------------------------------------------*
     715             :      * Initialization
     716             :      *-----------------------------------------------------------------*/
     717             : 
     718       99717 :     hStereoDft = hCPE->hStereoDft;
     719             : 
     720       99717 :     hCPE->lt_es_em_fx = L_shr( hCPE->lt_es_em_fx, 9 ); // Q24 -> Q15
     721             : 
     722       99717 :     outputFs = L_mult0( output_frame, FRAMES_PER_SEC ); /* Q0 */
     723             : 
     724       99717 :     zp = NS2SA_FX2( outputFs, STEREO_DFT32MS_ZP_NS );
     725       99717 :     move16();
     726       99717 :     ovl = NS2SA_FX2( outputFs, STEREO_DFT32MS_OVL_NS );
     727       99717 :     move16();
     728       99717 :     win = hStereoDft->win32ms_fx; /* Q15 */
     729       99717 :     NFFT = NS2SA_FX2( outputFs, STEREO_DFT32MS_N_NS );
     730       99717 :     move16();
     731       99717 :     ovl2 = NS2SA_FX2( outputFs, STEREO_DFT32MS_OVL2_NS );
     732       99717 :     move16();
     733       99717 :     flat_portion_end = NS2SA_FX2( outputFs, L_sub( STEREO_DFT32MS_WIN_CENTER_NS, L_shr( STEREO_DFT32MS_OVL2_NS, 1 ) ) );
     734       99717 :     move16();
     735       99717 :     win2 = hStereoDft->win232ms_fx; /* Q15 */
     736             : 
     737       99717 :     p_DFT = DFT[chan];
     738       99717 :     set32_fx( output, 0, NS2SA_FX2( outputFs, FRAME_SIZE_NS ) );
     739             : 
     740             :     /* deactivating the spectrum scrambling on active speech */
     741       99717 :     test();
     742       99717 :     test();
     743       99717 :     test();
     744       99717 :     if ( ( chan == 0 && GT_16( hCPE->hCoreCoder[0]->last_coder_type, UNVOICED ) ) || EQ_16( hCPE->last_element_mode, IVAS_CPE_MDCT ) || LT_16( hCPE->last_element_mode, IVAS_CPE_DFT ) )
     745             :     {
     746       58688 :         hCPE->stereo_switching_counter = 10; /* Q0 */
     747       58688 :         move16();
     748             :     }
     749             : 
     750       99717 :     IF( hCPE->stereo_switching_counter == 0 )
     751             :     {
     752             :         /* Set the level of dispersion */
     753           0 :         Word16 tmp = extract_l( L_max( (Word16) 0xF333, L_min( (Word16) 0x3333, hCPE->lt_es_em_fx ) ) );
     754           0 :         hCPE->NbFrameMod = extract_h( L_add( L_mult0( 12, tmp ), 0x0000D99A ) ); /* -0.1: -0.4 ; -0.1 -> 0, 0.4 -> 6*/ /* Q0 */
     755           0 :         move16();
     756             :     }
     757       99717 :     moffset = s_max( 0, sub( 6, hCPE->NbFrameMod ) );
     758             : 
     759             :     /*-----------------------------------------------------------------*
     760             :      * Synthesis
     761             :      *-----------------------------------------------------------------*/
     762             : 
     763       99717 :     trigo_step = i_mult( hStereoDft->dft_trigo_step, STEREO_DFT_TRIGO_DEC_STEP ); /* Q0 */
     764    16911797 :     FOR( i = 0; i < NFFT / 4; i++ )
     765             :     {
     766    16812080 :         trigo_dec[i] = hStereoDft->dft_trigo_fx[i * trigo_step]; /* Q15 */
     767    16812080 :         move16();
     768    16812080 :         trigo_dec[NFFT / 2 - i] = hStereoDft->dft_trigo_fx[i * trigo_step]; /* Q15 */
     769    16812080 :         move16();
     770             :     }
     771       99717 :     trigo_dec[NFFT / 4] = hStereoDft->dft_trigo_fx[NFFT / 4 * trigo_step]; /* Q15 */
     772       99717 :     move16();
     773             : 
     774      299151 :     FOR( k = 0; k < STEREO_DFT_NBDIV; k++ )
     775             :     {
     776             :         /* scrambling the spectrum */
     777      199434 :         test();
     778      199434 :         test();
     779      199434 :         test();
     780      199434 :         test();
     781      199434 :         test();
     782      199434 :         IF( LE_16( hCPE->stereo_switching_counter, 6 ) && EQ_16( chan, 1 ) && ( GT_32( hCPE->lt_es_em_fx, (Word16) 0xCCCD ) || GT_16( hCPE->NbFrameMod, 4 ) ) )
     783             :         {
     784           0 :             FOR( i = 3; i < NFFT - moffset - 1; i++ )
     785             :             {
     786           0 :                 p_DFT[i] = L_negate( p_DFT[i + moffset + 1] ); /* q_DFT */
     787           0 :                 move32();
     788             :             }
     789             :         }
     790      199434 :         ELSE IF( LT_16( hCPE->stereo_switching_counter, 7 ) && ( GT_32( hCPE->lt_es_em_fx, (Word16) 0x199A ) || GT_16( hCPE->NbFrameMod, 4 ) ) )
     791             :         {
     792           0 :             FOR( i = 16 - hCPE->NbFrameMod; i < NFFT - moffset - 1; i++ )
     793             :             {
     794           0 :                 p_DFT[i - 2] = L_negate( p_DFT[i + moffset + 1] ); /* q_DFT */
     795           0 :                 move32();
     796             :             }
     797             :         }
     798             : 
     799             :         /*IFFT*/
     800      199434 :         scale_dft = getScaleFactor32( p_DFT, NFFT );
     801      199434 :         scale_dft = sub( find_guarded_bits_fx( NFFT ), scale_dft );
     802      199434 :         v_shr( p_DFT, scale_dft, p_DFT, NFFT );
     803      199434 :         rfft_fx( p_DFT, trigo_dec, NFFT, 1 );
     804      199434 :         v_shr( p_DFT, negate( scale_dft ), p_DFT, NFFT );
     805             : 
     806      199434 :         IF( k == 0 )
     807             :         {
     808       99717 :             offset = 0;
     809       99717 :             move16();
     810             : 
     811             :             /* Left OLA - 3.125ms */
     812    10607267 :             FOR( i = 0; i < ovl; i++ )
     813             :             {
     814    10507550 :                 output[offset + i] = Madd_32_16( L_shr( hCPE->output_mem_fx[chan][i], sub( hCPE->q_output_mem_fx[chan], hCPE->hStereoDft->q_dft ) ), p_DFT[zp + i], win[STEREO_DFT32MS_STEP * i] ); /* hCPE->hStereoDft->q_dft */
     815    10507550 :                 move32();
     816             :             }
     817             :             /* Flat Portion */
     818    12708777 :             FOR( i = ovl; i < flat_portion_end; i++ )
     819             :             {
     820    12609060 :                 output[offset + i] = p_DFT[zp + i]; /* hCPE->hStereoDft->q_dft */
     821    12609060 :                 move32();
     822             :             }
     823             :             /* Right OLA */
     824    31622367 :             FOR( i = 0; i < ovl2; i++ )
     825             :             {
     826    31522650 :                 ola_buff[i] = Mpy_32_16_1( p_DFT[NFFT - zp - ovl2 + i], win2[ovl2 - 1 - i] ); /* hCPE->hStereoDft->q_dft */
     827    31522650 :                 move32();
     828             :             }
     829             :         }
     830             :         ELSE
     831             :         {
     832             :             /* If OVL2 = OVL offset = 10ms */
     833       99717 :             offset = flat_portion_end;
     834       99717 :             move16();
     835             :             /* Left OLA */
     836    31622367 :             FOR( i = 0; i < ovl2; i++ )
     837             :             {
     838    31522650 :                 output[offset + i] = Madd_32_16( ola_buff[i], p_DFT[zp + i], win2[i] ); /* hCPE->hStereoDft->q_dft */
     839    31522650 :                 move32();
     840             :             }
     841             :             /* Flat Portion */
     842    12708777 :             FOR( i = ovl2; i < NFFT - 2 * zp - ovl; i++ )
     843             :             {
     844    12609060 :                 output[offset + i] = p_DFT[zp + i]; /* hCPE->hStereoDft->q_dft */
     845    12609060 :                 move32();
     846             :             }
     847             :             /* Right OLA - 3.125ms */
     848    10607267 :             FOR( i = 0; i < ovl; i++ )
     849             :             {
     850    10507550 :                 hCPE->output_mem_fx[chan][i] = Mpy_32_16_1( p_DFT[NFFT - zp - ovl + i], win[STEREO_DFT32MS_STEP * ( ovl - 1 - i )] ); /* hCPE->hStereoDft->q_dft */
     851    10507550 :                 move32();
     852             :             }
     853       99717 :             hCPE->q_output_mem_fx[chan] = hCPE->hStereoDft->q_dft;
     854       99717 :             move16();
     855             :         }
     856      199434 :         p_DFT += STEREO_DFT32MS_N_MAX;
     857             :     }
     858             : 
     859       99717 :     hCPE->lt_es_em_fx = L_shl( hCPE->lt_es_em_fx, 9 ); // Q15 -> Q24
     860       99717 :     move32();
     861             : 
     862       99717 :     pop_wmops();
     863       99717 :     return;
     864             : }
     865             : 
     866             : /*---------------------------------------------------------------
     867             :  * stereo_dft_dec_smooth_parameters_fx()
     868             :  *
     869             :  *
     870             :  * ---------------------------------------------------------------*/
     871             : 
     872       41500 : void stereo_dft_dec_smooth_parameters_fx(
     873             :     STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle           */
     874             :     const Word16 prev_sid_nodata,          /* i  : Previous SID/No data indicator    Q0*/
     875             :     const Word16 active_frame_counter,     /* i  : Active frame counter              Q0*/
     876             :     const Word32 element_brate             /* i  : Element bitrate                   Q0*/
     877             : )
     878             : {
     879             :     Word16 k_offset, k, k2, b, N_div;
     880             :     Word32 *pIpd, *pInterpol;
     881             :     Word32 *pgIpd;
     882             :     Word32 *pSideGain;
     883             :     Word32 diff_ipd;
     884             :     Word16 nbands;
     885             :     Word32 max_res_pred_ind;
     886             :     Word32 PI_round;
     887             : 
     888       41500 :     N_div = STEREO_DFT_NBDIV;
     889       41500 :     move16();
     890       41500 :     k_offset = STEREO_DFT_OFFSET;
     891       41500 :     move16();
     892       41500 :     PI_round = EVS_PI_FX_Q27 + EPSILLON_FX; /*add error corrections when comparing ipds with exactly a difference of pi*/
     893       41500 :     move32();
     894             : 
     895       41500 :     test();
     896       41500 :     IF( hStereoDft->frame_sid_nodata || prev_sid_nodata )
     897             :     {
     898        5706 :         k = 1;
     899       38266 :         FOR( b = 0; b < hStereoDft->nbands; b++ )
     900             :         {
     901       32560 :             *( hStereoDft->side_gain_fx + add( i_mult( sub( add( k, k_offset ), 1 ), STEREO_DFT_BAND_MAX ), b ) ) = *( hStereoDft->side_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ) ); /* Q31 */
     902       32560 :             move32();
     903             :         }
     904             : 
     905        5706 :         IF( hStereoDft->frame_sid_nodata )
     906             :         {
     907             :             /* set new xfade target if new itd received */
     908        5470 :             IF( LT_16( hStereoDft->ipd_xfade_counter, STEREO_DFT_ITD_CNG_XFADE ) )
     909             :             {
     910             :                 Word16 q_val;
     911        5349 :                 IF( GT_32( L_sub( hStereoDft->gipd_fx[k + k_offset], hStereoDft->ipd_xfade_prev_fx ), EVS_PI_FX_Q27 ) )
     912             :                 {
     913           0 :                     hStereoDft->ipd_xfade_target_fx = L_sub( hStereoDft->gipd_fx[k + k_offset], EVS_PI_FX_Q27 << 1 ); /* Q27 */
     914           0 :                     move32();
     915           0 :                     hStereoDft->ipd_xfade_step_fx = BASOP_Util_Divide3232_Scale( L_sub( hStereoDft->ipd_xfade_target_fx, hStereoDft->ipd_xfade_prev_fx ), L_shl( L_sub( STEREO_DFT_ITD_CNG_XFADE, hStereoDft->ipd_xfade_counter ), Q24 ), &q_val ); /* Q27 */
     916           0 :                     move32();
     917             : 
     918           0 :                     q_val = add( q_val, Q9 ); /* Q27 - (Q15 - q_val + (-3))*/
     919           0 :                     move32();
     920           0 :                     IF( GT_16( q_val, 32 ) )
     921             :                     {
     922           0 :                         assert( 0 );
     923             :                     }
     924             :                     ELSE
     925             :                     {
     926           0 :                         hStereoDft->ipd_xfade_step_fx = L_shl( hStereoDft->ipd_xfade_step_fx, q_val ); /* Q27 */
     927           0 :                         move32();
     928             :                     }
     929             :                 }
     930        5349 :                 ELSE IF( GT_32( L_sub( hStereoDft->ipd_xfade_prev_fx, hStereoDft->gipd_fx[k + k_offset] ), EVS_PI_FX_Q27 ) )
     931             :                 {
     932          34 :                     hStereoDft->ipd_xfade_target_fx = L_add( hStereoDft->gipd_fx[k + k_offset], EVS_PI_FX_Q27 << 1 ); /* Q27 */
     933          34 :                     move32();
     934          34 :                     hStereoDft->ipd_xfade_step_fx = BASOP_Util_Divide3232_Scale( L_sub( hStereoDft->ipd_xfade_target_fx, hStereoDft->ipd_xfade_prev_fx ), L_shl( L_sub( STEREO_DFT_ITD_CNG_XFADE, hStereoDft->ipd_xfade_counter ), Q24 ), &q_val ); /* Q27 */
     935          34 :                     q_val = add( q_val, Q9 );                                                                                                                                                                                                       /* Q27 - (Q15 - q_val + (-3))*/
     936          34 :                     move32();
     937          34 :                     IF( GT_16( q_val, 32 ) )
     938             :                     {
     939           0 :                         assert( 0 );
     940             :                     }
     941             :                     ELSE
     942             :                     {
     943          34 :                         hStereoDft->ipd_xfade_step_fx = L_shl( hStereoDft->ipd_xfade_step_fx, q_val ); /* Q27 */
     944          34 :                         move32();
     945             :                     }
     946             :                 }
     947             :                 ELSE
     948             :                 {
     949        5315 :                     hStereoDft->ipd_xfade_target_fx = hStereoDft->gipd_fx[k + k_offset]; /* Q27 */
     950        5315 :                     move32();
     951        5315 :                     hStereoDft->ipd_xfade_step_fx = BASOP_Util_Divide3232_Scale( L_sub( hStereoDft->ipd_xfade_target_fx, hStereoDft->ipd_xfade_prev_fx ), L_shl( L_sub( STEREO_DFT_ITD_CNG_XFADE, hStereoDft->ipd_xfade_counter ), Q24 ), &q_val );
     952        5315 :                     q_val = add( q_val, Q9 ); /* Q27 - (Q15 - q_val + (-3))*/
     953        5315 :                     move32();
     954        5315 :                     IF( GT_16( q_val, 32 ) )
     955             :                     {
     956           0 :                         assert( 0 );
     957             :                     }
     958             :                     ELSE
     959             :                     {
     960        5315 :                         hStereoDft->ipd_xfade_step_fx = L_shl( hStereoDft->ipd_xfade_step_fx, q_val ); /* Q27 */
     961        5315 :                         move32();
     962             :                     }
     963             :                 }
     964             :             }
     965             : 
     966             :             /* xfade */
     967        5470 :             test();
     968        5470 :             test();
     969        5470 :             IF( NE_32( hStereoDft->ipd_xfade_prev_fx, hStereoDft->ipd_xfade_target_fx ) && LT_16( hStereoDft->ipd_xfade_counter, STEREO_DFT_ITD_CNG_XFADE ) && LE_32( hStereoDft->last_active_element_brate, 24400 ) )
     970             :             {
     971        3354 :                 hStereoDft->gipd_fx[k + k_offset] = L_add( hStereoDft->ipd_xfade_prev_fx, hStereoDft->ipd_xfade_step_fx ); /* Q27 */
     972        3354 :                 move32();
     973        3354 :                 hStereoDft->ipd_xfade_prev_fx = hStereoDft->gipd_fx[k + k_offset]; /* Q27 */
     974        3354 :                 move32();
     975        3354 :                 hStereoDft->ipd_xfade_counter = add( hStereoDft->ipd_xfade_counter, 1 ); /* Q27 */
     976        3354 :                 move16();
     977             :             }
     978             :         }
     979             :         ELSE
     980             :         {
     981             :             /* First active frame, "reset" everything if long enough active encoding, only triggered if STEREO_DFT_ITD_CNG_XFADE_RESET = -1 */
     982         236 :             IF( GT_16( active_frame_counter, STEREO_DFT_ITD_CNG_XFADE_RESET ) )
     983             :             {
     984           0 :                 hStereoDft->ipd_xfade_target_fx = hStereoDft->gipd_fx[k + k_offset]; /* Q27 */
     985           0 :                 move32();
     986           0 :                 hStereoDft->ipd_xfade_prev_fx = hStereoDft->gipd_fx[k + k_offset]; /* Q27 */
     987           0 :                 move32();
     988           0 :                 hStereoDft->ipd_xfade_counter = 0;
     989           0 :                 move16();
     990             :             }
     991             :         }
     992             : 
     993       11412 :         FOR( k2 = 1; k2 < hStereoDft->prm_res[k + k_offset]; k2++ )
     994             :         {
     995        5706 :             hStereoDft->gipd_fx[( k + k_offset ) - k2] = hStereoDft->gipd_fx[k + k_offset]; /* Q27 */
     996        5706 :             move32();
     997             :         }
     998             : 
     999        5706 :         IF( hStereoDft->frame_sid_nodata )
    1000             :         {
    1001             :             /* set new xfade target if new itd received */
    1002        5470 :             IF( LT_16( hStereoDft->itd_xfade_counter, STEREO_DFT_ITD_CNG_XFADE ) )
    1003             :             {
    1004             :                 Word16 q_val;
    1005        5470 :                 hStereoDft->itd_xfade_target_fx = hStereoDft->itd_fx[k + k_offset]; /* Q15 */
    1006        5470 :                 move32();
    1007        5470 :                 hStereoDft->itd_xfade_step_fx = BASOP_Util_Divide3232_Scale( L_sub( hStereoDft->itd_xfade_target_fx, hStereoDft->itd_xfade_prev_fx ), L_shl( sub( STEREO_DFT_ITD_CNG_XFADE, hStereoDft->itd_xfade_counter ), Q15 ), &q_val );
    1008        5470 :                 IF( GT_16( q_val, 16 ) )
    1009             :                 {
    1010           0 :                     assert( 0 );
    1011             :                 }
    1012             :                 ELSE
    1013             :                 {
    1014        5470 :                     hStereoDft->itd_xfade_step_fx = L_shl( hStereoDft->itd_xfade_step_fx, q_val ); /* Q15 */
    1015        5470 :                     move32();
    1016             :                 }
    1017        5470 :                 move32();
    1018             :             }
    1019             : 
    1020             :             /* xfade */
    1021        5470 :             IF( NE_32( hStereoDft->itd_xfade_prev_fx, hStereoDft->itd_xfade_target_fx ) && LT_16( hStereoDft->itd_xfade_counter, STEREO_DFT_ITD_CNG_XFADE ) && LE_32( hStereoDft->last_active_element_brate, 24400 ) )
    1022             :             {
    1023         640 :                 hStereoDft->itd_fx[k + k_offset] = L_add( hStereoDft->itd_xfade_prev_fx, hStereoDft->itd_xfade_step_fx ); /* Q15 */
    1024         640 :                 move32();
    1025         640 :                 hStereoDft->itd_xfade_prev_fx = hStereoDft->itd_fx[k + k_offset]; /* Q15 */
    1026         640 :                 move32();
    1027         640 :                 hStereoDft->itd_xfade_counter = add( hStereoDft->itd_xfade_counter, 1 ); /* Q0 */
    1028             :             }
    1029             :         }
    1030             :         ELSE
    1031             :         {
    1032             :             /* First active frame, "reset" everything if long enough active encoding, only triggered if STEREO_DFT_ITD_CNG_XFADE_RESET = -1 */
    1033         236 :             IF( GT_16( active_frame_counter, STEREO_DFT_ITD_CNG_XFADE_RESET ) )
    1034             :             {
    1035           0 :                 hStereoDft->itd_xfade_target_fx = hStereoDft->itd_fx[k + k_offset]; /* Q15 */
    1036           0 :                 move32();
    1037           0 :                 hStereoDft->itd_xfade_prev_fx = hStereoDft->itd_fx[k + k_offset]; /* Q15 */
    1038           0 :                 move32();
    1039           0 :                 hStereoDft->itd_xfade_counter = 0; /* Q0 */
    1040           0 :                 move32();
    1041             :             }
    1042             : 
    1043         236 :             hStereoDft->last_active_element_brate = element_brate;
    1044         236 :             move32();
    1045             :         }
    1046       11412 :         FOR( k2 = 1; k2 < hStereoDft->prm_res[k + k_offset]; k2++ )
    1047             :         {
    1048        5706 :             hStereoDft->itd_fx[( k + k_offset ) - k2] = hStereoDft->itd_fx[k + k_offset]; /* Q15 */
    1049        5706 :             move32();
    1050             :         }
    1051             : 
    1052        5706 :         return;
    1053             :     }
    1054             : 
    1055             :     /* Active frame, "reset" everything "reset" everything if long enough active encoding */
    1056       35794 :     IF( GT_16( active_frame_counter, STEREO_DFT_ITD_CNG_XFADE_RESET ) )
    1057             :     {
    1058       34683 :         hStereoDft->itd_xfade_counter = 0;
    1059       34683 :         move16();
    1060       34683 :         hStereoDft->itd_xfade_target_fx = hStereoDft->itd_fx[STEREO_DFT_NBDIV - 1]; /* Q15 */
    1061       34683 :         move32();
    1062       34683 :         hStereoDft->itd_xfade_prev_fx = hStereoDft->itd_fx[STEREO_DFT_NBDIV - 1]; /* Q15 */
    1063       34683 :         move32();
    1064       34683 :         hStereoDft->ipd_xfade_counter = 0;
    1065       34683 :         move16();
    1066       34683 :         hStereoDft->ipd_xfade_target_fx = hStereoDft->gipd_fx[STEREO_DFT_NBDIV - 1]; /* Q27 */
    1067       34683 :         move32();
    1068       34683 :         hStereoDft->ipd_xfade_prev_fx = hStereoDft->gipd_fx[STEREO_DFT_NBDIV - 1]; /* Q27 */
    1069       34683 :         move32();
    1070             :     }
    1071             : 
    1072       35794 :     hStereoDft->last_active_element_brate = element_brate;
    1073       35794 :     move32();
    1074             : 
    1075       71588 :     FOR( k = sub( hStereoDft->prm_res[k_offset], 1 ); k < N_div; k += hStereoDft->prm_res[k + k_offset] )
    1076             :     {
    1077       35794 :         max_res_pred_ind = 0;
    1078       35794 :         move32();
    1079       35794 :         IF( EQ_16( hStereoDft->reverb_flag, 1 ) )
    1080             :         {
    1081        4922 :             nbands = s_min( 10, hStereoDft->nbands_respred );
    1082        4922 :             move16();
    1083             :             /*Shift 2 last bands residual prediction gains for SWB/FB*/
    1084        4922 :             IF( EQ_16( hStereoDft->band_res[k_offset], STEREO_DFT_BAND_RES_HIGH ) )
    1085             :             {
    1086        5290 :                 FOR( b = sub( hStereoDft->nbands_respred, 1 ); b >= nbands; b-- )
    1087             :                 {
    1088        3282 :                     hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX] =
    1089        3282 :                         hStereoDft->res_gains_ind_fx[1][b - STEREO_DFT_RES_PRED_BAND_MIN_RED + hStereoDft->res_pred_band_min + STEREO_DFT_BAND_MAX]; /* Q26 */
    1090        3282 :                     move32();
    1091        3282 :                     hStereoDft->res_gains_ind_fx[1][b - STEREO_DFT_RES_PRED_BAND_MIN_RED + hStereoDft->res_pred_band_min + STEREO_DFT_BAND_MAX] = 0; /* Q26 */
    1092        3282 :                     move32();
    1093             :                 }
    1094             :             }
    1095             : 
    1096             :             /* Get maximal index */
    1097       26903 :             FOR( b = hStereoDft->res_pred_band_min; b < nbands - STEREO_DFT_RES_PRED_BAND_MIN_CONST; b++ )
    1098             :             {
    1099       21981 :                 IF( LT_32( max_res_pred_ind, hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX] ) )
    1100             :                 {
    1101        8781 :                     max_res_pred_ind = hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX]; /* Q26 */
    1102        8781 :                     move32();
    1103             :                 }
    1104             :             }
    1105             : 
    1106             :             /* predictive values */
    1107       19688 :             FOR( ; b < nbands; b++ )
    1108             :             {
    1109       14766 :                 assert( hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX] == 0 );
    1110       14766 :                 hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX] = max_res_pred_ind; /* Q26 */
    1111       14766 :                 move32();
    1112             :             }
    1113             :         }
    1114             : 
    1115       35794 :         FOR( b = hStereoDft->res_pred_band_min; b < hStereoDft->res_cod_band_max; b++ )
    1116             :         {
    1117             :             Word32 tmp;
    1118             :             Word16 tmps1, tmps2;
    1119             : 
    1120           0 :             hStereoDft->res_gains_ind_fx[0][b] = hStereoDft->res_gains_ind_fx[0][b + STEREO_DFT_BAND_MAX]; /* Q26 */
    1121           0 :             move32();
    1122             :             /*stereo_dft_dequantize_res_gains_f(&hStereoDft->res_gains_ind[0][b], &hStereoDft->res_gains_ind[1][b+STEREO_DFT_BAND_MAX],hStereoDft->side_gain+(k+k_offset)*STEREO_DFT_BAND_MAX+b, hStereoDft->res_pred_gain+(k+k_offset)*STEREO_DFT_BAND_MAX+b, 1);*/
    1123           0 :             tmps1 = (Word16) L_shr( hStereoDft->res_gains_ind_fx[0][b], Q26 ); /* Q0 */
    1124           0 :             move16();
    1125           0 :             tmps2 = (Word16) L_shr( hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX], Q26 ); /* Q0 */
    1126           0 :             move16();
    1127           0 :             stereo_dft_dequantize_res_gains_fx( &tmps1, &tmps2, hStereoDft->side_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), hStereoDft->res_pred_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), 1 );
    1128             : 
    1129           0 :             test();
    1130           0 :             test();
    1131           0 :             IF( hStereoDft->attackPresent )
    1132             :             {
    1133           0 :                 hStereoDft->res_gains_ind_fx[1][b] = Mpy_32_16_1( hStereoDft->res_gains_ind_fx[1][b], (Word16) 0x6666 ); /* Q26 */
    1134           0 :                 move32();
    1135             :             }
    1136           0 :             ELSE IF( hStereoDft->trans || ( hStereoDft->res_pred_mode[k] && ( LT_32( hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX], ONE_IN_Q27 ) ) ) ) /* Assuming Maximum Q of res_gains_ind_fx is Q26 */
    1137             :             {
    1138           0 :                 hStereoDft->res_gains_ind_fx[1][b] = Madd_32_16( Mpy_32_16_1( hStereoDft->res_gains_ind_fx[1][b], (Word16) 0x4CCD ),
    1139           0 :                                                                  hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX], (Word16) 0x3333 ); /* Q26 */
    1140           0 :                 move32();
    1141             :             }
    1142             :             ELSE
    1143             :             {
    1144           0 :                 hStereoDft->res_gains_ind_fx[1][b] = Madd_32_16( Mpy_32_16_1( hStereoDft->res_gains_ind_fx[1][b], dft_alpha_s2_fx[b] ),
    1145           0 :                                                                  hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX],
    1146           0 :                                                                  sub( (Word16) 0x7FFF, dft_alpha_s2_fx[b] ) ); /* Q26 */
    1147           0 :                 move32();
    1148             :             }
    1149             : 
    1150           0 :             stereo_dft_dequantize_res_gains_f_fx( &hStereoDft->res_gains_ind_fx[0][b], &hStereoDft->res_gains_ind_fx[1][b], &tmp, hStereoDft->res_pred_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), 1 );
    1151             :         }
    1152             : 
    1153             :         /* Smoothing of prediction gains between ftrames */
    1154      294725 :         FOR( ; b < hStereoDft->nbands; b++ )
    1155             :         {
    1156      258931 :             test();
    1157      258931 :             test();
    1158      258931 :             IF( hStereoDft->attackPresent )
    1159             :             {
    1160        9264 :                 hStereoDft->res_gains_ind_fx[0][b] = hStereoDft->res_gains_ind_fx[0][b + STEREO_DFT_BAND_MAX]; /* Q26 */
    1161        9264 :                 move32();
    1162        9264 :                 hStereoDft->res_gains_ind_fx[1][b] = Mpy_32_16_1( hStereoDft->res_gains_ind_fx[1][b], (Word16) 0x6666 ); /* Q26 */
    1163        9264 :                 move32();
    1164             :             }
    1165      249667 :             ELSE IF( hStereoDft->trans || ( hStereoDft->res_pred_mode[k] && LT_32( hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX], ONE_IN_Q27 ) ) )
    1166             :             {
    1167      142503 :                 hStereoDft->res_gains_ind_fx[0][b] = hStereoDft->res_gains_ind_fx[0][b + STEREO_DFT_BAND_MAX]; /* Q26 */
    1168      142503 :                 move32();
    1169      142503 :                 IF( EQ_16( hStereoDft->hConfig->band_res, STEREO_DFT_BAND_RES_LOW ) )
    1170             :                 {
    1171       32053 :                     hStereoDft->res_gains_ind_fx[1][b] = Madd_32_16( Mpy_32_16_1( hStereoDft->res_gains_ind_fx[1][b], dft_alpha_w_b2_fx[b] ),
    1172       32053 :                                                                      hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX], sub( (Word16) 0x7FFF, dft_alpha_w_b2_fx[b] ) ); /* Q26 */
    1173       32053 :                     move32();
    1174             :                 }
    1175             :                 ELSE
    1176             :                 {
    1177      110450 :                     hStereoDft->res_gains_ind_fx[1][b] = Madd_32_16( Mpy_32_16_1( hStereoDft->res_gains_ind_fx[1][b], dft_alpha_w_fx[b] ),
    1178      110450 :                                                                      hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX], sub( (Word16) 0x7FFF, dft_alpha_w_fx[b] ) ); /* Q26 */
    1179      110450 :                     move32();
    1180             :                 }
    1181             :             }
    1182             :             ELSE
    1183             :             {
    1184      107164 :                 IF( EQ_16( hStereoDft->hConfig->band_res, STEREO_DFT_BAND_RES_LOW ) )
    1185             :                 {
    1186       30826 :                     hStereoDft->res_gains_ind_fx[0][b] = Madd_32_16( Mpy_32_16_1( hStereoDft->res_gains_ind_fx[0][b], dft_alpha_s_b2_fx[b] ),
    1187       30826 :                                                                      hStereoDft->res_gains_ind_fx[0][b + STEREO_DFT_BAND_MAX],
    1188       30826 :                                                                      sub( (Word16) 0x7FFF, dft_alpha_s_b2_fx[b] ) ); /* Q26 */
    1189       30826 :                     move32();
    1190       30826 :                     hStereoDft->res_gains_ind_fx[1][b] = Madd_32_16( Mpy_32_16_1( hStereoDft->res_gains_ind_fx[1][b], dft_alpha_s2_b2_fx[b] ),
    1191       30826 :                                                                      hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX],
    1192       30826 :                                                                      sub( (Word16) 0x7FFF, dft_alpha_s2_b2_fx[b] ) ); /* Q26 */
    1193       30826 :                     move32();
    1194             :                 }
    1195             :                 ELSE
    1196             :                 {
    1197       76338 :                     hStereoDft->res_gains_ind_fx[0][b] = Madd_32_16( Mpy_32_16_1( hStereoDft->res_gains_ind_fx[0][b], dft_alpha_s_fx[b] ),
    1198       76338 :                                                                      hStereoDft->res_gains_ind_fx[0][b + STEREO_DFT_BAND_MAX],
    1199       76338 :                                                                      sub( (Word16) ( 0x7FFF ), dft_alpha_s_fx[b] ) ); /* Q26 */
    1200       76338 :                     move32();
    1201       76338 :                     hStereoDft->res_gains_ind_fx[1][b] = Madd_32_16( Mpy_32_16_1( hStereoDft->res_gains_ind_fx[1][b], dft_alpha_s2_fx[b] ),
    1202       76338 :                                                                      hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX],
    1203       76338 :                                                                      sub( (Word16) ( 0x7FFF ), dft_alpha_s2_fx[b] ) ); /* Q26 */
    1204       76338 :                     move32();
    1205             :                 }
    1206             :             }
    1207             : 
    1208      258931 :             IF( !hStereoDft->recovery_flg )
    1209             :             {
    1210      258886 :                 stereo_dft_dequantize_res_gains_f_fx( &hStereoDft->res_gains_ind_fx[0][b], &hStereoDft->res_gains_ind_fx[1][b], hStereoDft->side_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), hStereoDft->res_pred_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), 1 );
    1211             :             }
    1212             :         }
    1213             : 
    1214             :         /* Smoothing of IPDs*/
    1215       35794 :         pgIpd = hStereoDft->gipd_fx + ( add( k, k_offset ) );
    1216       35794 :         diff_ipd = L_sub( pgIpd[0], pgIpd[-hStereoDft->prm_res[k + k_offset]] ); /* Q27 */
    1217       35794 :         IF( LT_32( diff_ipd, -PI_round ) )
    1218             :         {
    1219         727 :             pgIpd[0] = L_add( pgIpd[0], EVS_2PI_FX_Q27 ); /* Q27 */
    1220         727 :             move32();
    1221             :         }
    1222       35067 :         ELSE IF( GT_32( diff_ipd, PI_round ) )
    1223             :         {
    1224         238 :             pgIpd[0] = L_sub( pgIpd[0], EVS_2PI_FX_Q27 ); /* Q27 */
    1225         238 :             move32();
    1226             :         }
    1227             : 
    1228       35794 :         IF( !hStereoDft->attackPresent )
    1229             :         {
    1230       34509 :             IF( hStereoDft->wasTransient )
    1231             :             {
    1232        1251 :                 pgIpd[0] = L_add( Mpy_32_16_1( pgIpd[0], (Word16) 0x6666 ), Mpy_32_16_1( pgIpd[-hStereoDft->prm_res[k + k_offset]], (Word16) ( 0x199A ) ) ); /* Q27 */
    1233        1251 :                 move32();
    1234             :             }
    1235             :             ELSE
    1236             :             {
    1237       33258 :                 pgIpd[0] = L_add( L_shr( pgIpd[0], 1 ), L_shr( pgIpd[-hStereoDft->prm_res[k + k_offset]], 1 ) ); /* Q27 */
    1238       33258 :                 move32();
    1239             :             }
    1240             :         }
    1241             : 
    1242             : 
    1243       35794 :         IF( !hStereoDft->attackPresent )
    1244             :         {
    1245       34509 :             pSideGain = hStereoDft->side_gain_fx + i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ); /* Q31 */
    1246      116034 :             FOR( b = 0; b < hStereoDft->res_cod_band_max; b++ )
    1247             :             {
    1248       81525 :                 pSideGain[b] = Madd_32_16( Mpy_32_16_1( pSideGain[b], dft_res_cod_alpha_fx[b] ),
    1249       81525 :                                            pSideGain[b - hStereoDft->prm_res[k + k_offset] * STEREO_DFT_BAND_MAX],
    1250       81525 :                                            sub( (Word16) 0x7FFF, dft_res_cod_alpha_fx[b] ) ); /* Q31 */
    1251       81525 :                 move32();
    1252             :             }
    1253             :         }
    1254             : 
    1255             :         /*Interpolation between DFT slots*/
    1256       71588 :         FOR( k2 = 1; k2 < hStereoDft->prm_res[k + k_offset]; k2++ )
    1257             :         {
    1258       35794 :             pInterpol = hStereoDft->gipd_fx + sub( add( k, k_offset ), k2 ); /* Q27 */
    1259       35794 :             pIpd = hStereoDft->gipd_fx + add( k, k_offset );                 /* Q27 */
    1260       35794 :             IF( hStereoDft->attackPresent )
    1261             :             {
    1262        1285 :                 *( pInterpol ) = *( pIpd );
    1263        1285 :                 move32();
    1264             :             }
    1265             :             ELSE
    1266             :             {
    1267       34509 :                 *( pInterpol ) = *( hStereoDft->gipd_fx + sub( add( k, k_offset ), hStereoDft->prm_res[k + k_offset] ) );
    1268       34509 :                 move32();
    1269             :             }
    1270             : 
    1271      379085 :             FOR( b = 0; b < hStereoDft->nbands; b++ )
    1272             :             {
    1273      343291 :                 *( hStereoDft->res_pred_gain_fx + add( i_mult( sub( add( k, k_offset ), k2 ), STEREO_DFT_BAND_MAX ), b ) ) = *( hStereoDft->res_pred_gain_fx + add( i_mult( sub( add( k, k_offset ), hStereoDft->prm_res[k + k_offset] ), STEREO_DFT_BAND_MAX ), b ) ); /* Q31 */
    1274      343291 :                 move32();
    1275      343291 :                 test();
    1276      343291 :                 test();
    1277      343291 :                 test();
    1278      343291 :                 test();
    1279      343291 :                 IF( b < hStereoDft->res_cod_band_max || hStereoDft->attackPresent || hStereoDft->trans || ( hStereoDft->res_pred_mode[k] && LT_32( hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX], ONE_IN_Q27 ) ) )
    1280             :                 {
    1281      236127 :                     *( hStereoDft->side_gain_fx + add( i_mult( sub( add( k, k_offset ), k2 ), STEREO_DFT_BAND_MAX ), b ) ) = *( hStereoDft->side_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ) ); /* Q31 */
    1282      236127 :                     move32();
    1283             :                 }
    1284             :                 ELSE
    1285             :                 {
    1286      107164 :                     *( hStereoDft->side_gain_fx + add( i_mult( sub( add( k, k_offset ), k2 ), STEREO_DFT_BAND_MAX ), b ) ) = *( hStereoDft->side_gain_fx + add( i_mult( sub( add( k, k_offset ), hStereoDft->prm_res[k + k_offset] ), STEREO_DFT_BAND_MAX ), b ) ); /* Q31 */
    1287      107164 :                     move32();
    1288             :                 }
    1289             :             }
    1290             : 
    1291       35794 :             hStereoDft->itd_fx[k + k_offset - k2] = hStereoDft->itd_fx[k + k_offset]; /* Q15 */
    1292       35794 :             move32();
    1293             :         } /*end of interpolation*/
    1294             :     }
    1295             : 
    1296       35794 :     return;
    1297             : }
    1298             : 
    1299             : /*-------------------------------------------------------------------------
    1300             :  * stereo_dft_dec_res_fx()
    1301             :  *
    1302             :  * Decode the residual signal
    1303             :  *-------------------------------------------------------------------------*/
    1304             : 
    1305       16830 : void stereo_dft_dec_res_fx(
    1306             :     CPE_DEC_HANDLE hCPE,             /* i/o: decoder CPE handle                                                 */
    1307             :     Word32 res_buf[STEREO_DFT_N_8k], /* i  : residual buffer                       q_res*/
    1308             :     Word16 q_res,                    /* i  : q fact of residural buffer                                 */
    1309             :     Word32 *output                   /* o  : output                                                                      Q16*/
    1310             : )
    1311             : {
    1312             :     Word16 i;
    1313             :     Word16 win[L_FRAME8k + STEREO_DFT_OVL_8k];
    1314             :     Word16 out_16[L_FRAME8k + STEREO_DFT_OVL_8k];
    1315             :     Word16 bpf_error_signal_8k_16[L_FRAME8k];
    1316             :     Word32 bpf_error_signal_8k[L_FRAME8k];
    1317             :     Word16 prev_bfi;
    1318             :     Word16 fac, step;
    1319             :     Word16 res_bpf_flag;
    1320             : 
    1321       16830 :     prev_bfi = hCPE->hCoreCoder[0]->prev_old_bfi; /* The core decoding is already completed here and the prev_bfi has been updated for the next frame.
    1322             :                                                      The prev_old_bfi still holds the prev_bfi for the current frame. */
    1323             :                                                   /* Q0 */
    1324       16830 :     move16();
    1325             : 
    1326             :     /* flush memories when switching residual coding on */
    1327       16830 :     IF( EQ_16( hCPE->hStereoDft->res_cod_mode[STEREO_DFT_OFFSET - 1], STEREO_DFT_RES_COD_OFF ) )
    1328             :     {
    1329         133 :         set32_fx( hCPE->hStereoDft->res_cod_mem_fx, 0, STEREO_DFT_OVL_8k );
    1330         133 :         hCPE->hStereoDft->q_res_cod_mem_fx = Q15;
    1331         133 :         move16();
    1332         133 :         set32_fx( hCPE->input_mem_fx[1], 0, NS2SA( 8000, STEREO_DFT32MS_OVL_NS ) );
    1333         133 :         set16_fx( hCPE->hStereoDft->hBpf->pst_old_syn_fx, 0, STEREO_DFT_NBPSF_PIT_MAX_8k );
    1334         133 :         hCPE->hStereoDft->hBpf->pst_mem_deemp_err_fx = 0;
    1335         133 :         move16();
    1336             :     }
    1337             : 
    1338             :     /*Inverse MDCT*/
    1339       16830 :     TCX_MDCT_Inverse( res_buf, q_res, win, STEREO_DFT_OVL_8k, L_FRAME8k - STEREO_DFT_OVL_8k, STEREO_DFT_OVL_8k, IVAS_CPE_DFT );
    1340             : 
    1341       16830 :     scale_sig( win, L_FRAME8k + STEREO_DFT_OVL_8k, -1 );
    1342             : 
    1343       16830 :     Word16 q_shift = sub( hCPE->hStereoDft->q_res_cod_mem_fx, Q15 );
    1344       16830 :     IF( !prev_bfi )
    1345             :     {
    1346             :         /*OLA*/
    1347             :         /*overlapping parts*/
    1348             : 
    1349     1174766 :         FOR( i = 0; i < STEREO_DFT_OVL_8k; i++ )
    1350             :         {
    1351     1158220 :             win[i] = extract_h( L_add( hCPE->hStereoDft->res_cod_mem_fx[i], L_shl( L_mult( win[i], hCPE->hStereoDft->win_8k_fx[i] ), q_shift ) ) ); /* q_res_cod_mem_fx -17 (q_shift -1)*/
    1352     1158220 :             move16();
    1353     1158220 :             hCPE->hStereoDft->res_cod_mem_fx[i] = L_mult( win[L_FRAME8k + i], hCPE->hStereoDft->win_8k_fx[STEREO_DFT_OVL_8k - 1 - i] ); /* -1 +15 +1 */
    1354     1158220 :             move32();
    1355             :         }
    1356             : 
    1357             : 
    1358       16546 :         move16();
    1359             :     }
    1360             :     ELSE
    1361             :     {
    1362             :         /* For first good frame, ola memory contains extended ECU buffer -- need to crossfade instead of OLA */
    1363         284 :         step = 468; /* 1 / STEREO_DFT_OVL_8k in Q15 */
    1364         284 :         move16();
    1365         284 :         fac = 0;
    1366         284 :         move16();
    1367       20164 :         FOR( i = 0; i < STEREO_DFT_OVL_8k; i++ )
    1368             :         {
    1369       19880 :             win[i] = extract_h( Madd_32_16( Mpy_32_16_1( hCPE->hStereoDft->res_cod_mem_fx[i], sub( MAX_16, mult( fac, fac ) ) ),
    1370       19880 :                                             L_shl( L_mult( hCPE->hStereoDft->win_8k_fx[i], win[i] ), q_shift ),
    1371       19880 :                                             sub( MAX_16, mult( sub( MAX_16, fac ), sub( MAX_16, fac ) ) ) ) ); /* Q(q_shift -1) */
    1372       19880 :             move16();
    1373       19880 :             hCPE->hStereoDft->res_cod_mem_fx[i] = L_mult( win[L_FRAME8k + i], hCPE->hStereoDft->win_8k_fx[STEREO_DFT_OVL_8k - 1 - i] ); /* Q15 */
    1374       19880 :             move32();
    1375       19880 :             fac = add( fac, step );
    1376             :         }
    1377             :     }
    1378             : 
    1379       16830 :     IF( q_shift != 0 )
    1380             :     {
    1381           0 :         v_shr_16( &win[STEREO_DFT_OVL_8k], negate( q_shift ), &win[STEREO_DFT_OVL_8k], L_FRAME8k );
    1382             :     }
    1383             : 
    1384       16830 :     hCPE->hStereoDft->q_res_cod_mem_fx = Q15;
    1385             : 
    1386       16830 :     Copy( win, out_16, L_FRAME8k ); /* Q(q_shift -1 ) */
    1387             : 
    1388       16830 :     IF( hCPE->hCoreCoder[0]->core == ACELP_CORE )
    1389             :     {
    1390             :         /* bass post-filter */
    1391       10899 :         bass_psfilter_fx( hCPE->hStereoDft->hBpf, hCPE->hCoreCoder[0]->Opt_AMR_WB, out_16, L_FRAME8k, hCPE->hCoreCoder[0]->old_pitch_buf_16_fx + ( L_FRAME8k / STEREO_DFT_L_SUBFR_8k ), hCPE->hCoreCoder[0]->bpf_off,
    1392       10899 :                           hCPE->hCoreCoder[0]->stab_fac_fx, &hCPE->hStereoDft->stab_fac_smooth_res_fx, hCPE->hCoreCoder[0]->last_coder_type, sub( q_shift, 1 ), bpf_error_signal_8k_16 );
    1393       10899 :         Copy_Scale_sig_16_32_DEPREC( bpf_error_signal_8k_16, bpf_error_signal_8k, L_FRAME8k, Q15 ); /* Q15 */
    1394       10899 :         res_bpf_flag = res_bpf_adapt_ivas_fx( hCPE->hStereoDft, bpf_error_signal_8k, res_buf, q_res );
    1395             : 
    1396       10899 :         IF( prev_bfi )
    1397             :         {
    1398             :             /* Ramp up BPF contribution for the first good frame */
    1399         173 :             step = (Word16) ( 0x00CD ); // ( 1.0f / L_FRAME8k );        /* Q15 */
    1400         173 :             move16();
    1401         173 :             fac = negate( step );
    1402       27853 :             FOR( i = 0; i < L_FRAME8k; i++ )
    1403             :             {
    1404       27680 :                 fac = add( fac, step );
    1405       27680 :                 bpf_error_signal_8k[i] = Mpy_32_16_1( bpf_error_signal_8k[i], fac ); /* Q15 */
    1406       27680 :                 move32();
    1407             :             }
    1408             :         }
    1409       10899 :         Copy_Scale_sig_16_32_no_sat( out_16, output, L_FRAME8k, sub( 15, sub( q_shift, 1 ) ) ); /* Q15 */
    1410       10899 :         IF( res_bpf_flag )
    1411             :         {
    1412       10523 :             v_sub_32( output, bpf_error_signal_8k, output, L_FRAME8k );
    1413             :         }
    1414             :     }
    1415        5931 :     ELSE IF( hCPE->hCoreCoder[0]->last_core == ACELP_CORE )
    1416             :     {
    1417           0 :         set16_fx( hCPE->hStereoDft->hBpf->pst_old_syn_fx, 0, STEREO_DFT_NBPSF_PIT_MAX_8k );
    1418           0 :         hCPE->hStereoDft->hBpf->pst_mem_deemp_err_fx = 0;
    1419           0 :         move16();
    1420           0 :         Copy_Scale_sig_16_32_no_sat( out_16, output, L_FRAME8k, sub( 15, sub( q_shift, 1 ) ) ); /* Q15 */
    1421             :     }
    1422             :     ELSE
    1423             :     {
    1424             :         /* This step is needed to ensure output is properly populated with scaled values in all cases*/
    1425        5931 :         Copy_Scale_sig_16_32_no_sat( out_16, output, L_FRAME8k, sub( 15, sub( q_shift, 1 ) ) ); /* Q15 */
    1426             :     }
    1427             : 
    1428       16830 :     return;
    1429             : }
    1430             : 
    1431             : 
    1432             : /*-------------------------------------------------------------------------
    1433             :  * stereo_dft_dec_fx()
    1434             :  *
    1435             :  * DFT-based stereo main processing function
    1436             :  *-------------------------------------------------------------------------*/
    1437             : 
    1438       47491 : void stereo_dft_dec_fx(
    1439             :     STEREO_DFT_DEC_DATA_HANDLE hStereoDft,        /* i/o: decoder DFT stereo handle                                */
    1440             :     Decoder_State *st0,                           /* i/o: decoder state structure                                  */
    1441             :     Word32 DFT[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* i/o: DFT buffers                                              qDFT*/
    1442             :     Word32 *input_mem,                            /* i/o: mem of buffer DFT analysis                       */
    1443             :     STEREO_CNG_DEC_HANDLE hStereoCng,             /* i/o: Stereo CNG data structure                              Q0*/
    1444             :     const Word16 sba_dirac_stereo_flag,           /* i  : signal stereo output for SBA DirAC     Q0*/
    1445             :     const Word16 sba_mono_flag,                   /* i  : signal mono output for SBA DirAC               Q0*/
    1446             :     ivas_spar_md_dec_state_t *hMdDec,             /* i  : SPAR MD handle for upmixing                      */
    1447             :     const Word16 cross_fade_start_offset,         /* i  : SPAR mixer delay compensation                  Q0*/
    1448             :     const Word32 output_Fs,                       /* i  : Fs for delay calculation                               Q0*/
    1449             :     const Word16 nchan_transport,                 /* i  : number of transpor channels                    Q0*/
    1450             :     const Word16 num_md_sub_frames                /* i  : number of MD subframes                                 Q0*/
    1451             : )
    1452             : {
    1453             :     Word16 i, k, b, N_div, stop;
    1454             :     Word32 DFT_L[STEREO_DFT32MS_N_MAX];
    1455             :     Word32 DFT_R[STEREO_DFT32MS_N_MAX];
    1456             :     Word32 DFT_PRED_RES[STEREO_DFT32MS_N_32k];
    1457             :     Word32 *pDFT_DMX;
    1458             :     Word32 *pDFT_DMX1;
    1459             :     Word32 *pDFT_RES;
    1460             :     Word16 g;
    1461             :     Word32 tmp;
    1462             :     Word32 *pPredGain;
    1463             :     Word32 *pSideGain;
    1464             :     Word16 c0, s0;
    1465             :     Word16 k_offset;
    1466             :     Word32 *pgIpd;
    1467             :     Word16 NFFT_inner;
    1468             :     Word16 gamma;
    1469             :     Word16 samp_ratio;
    1470             :     Word16 prev_bfi;
    1471             :     Word32 dmx_nrg;
    1472             :     Word16 idx_k0, idx_k1;
    1473             :     Word16 output_frame;
    1474             :     Word16 plocs[STEREO_DFT_RES_N_PEAKS_MAX];
    1475             :     Word16 num_plocs;
    1476             :     Word32 plocsi[STEREO_DFT_RES_N_PEAKS_MAX];
    1477             :     Word16 ftmp, coh;
    1478             :     Word32 N1, N2;
    1479             :     Word32 scale_fact0, scale_fact;
    1480             :     Word32 lev1, lev2, cna_level, *ptr_per;
    1481             :     Word16 q_cna_level;
    1482       47491 :     HANDLE_FD_CNG_DEC hFdCngDec = st0->hFdCngDec;
    1483       47491 :     HANDLE_FD_CNG_COM hFdCngCom = hFdCngDec->hFdCngCom;
    1484       47491 :     Word16 *cna_seed = &( hFdCngCom->seed );
    1485             :     Word32 DFT_W, DFT_Y;
    1486             : #ifndef OPT_STEREO_32KBPS_V1
    1487             :     Word16 q_samp_ratio = Q15;
    1488             :     move16();
    1489             : #endif /* OPT_STEREO_32KBPS_V1 */
    1490             :     Word16 len;
    1491             : 
    1492       47491 :     output_frame = (Word16) Mpy_32_32( L_add( st0->output_Fs, FRAMES_PER_SEC_BY_2 ), ONE_BY_FRAMES_PER_SEC_Q31 ); /* Q0 */
    1493             : 
    1494             :     /*------------------------------------------------------------------*
    1495             :      * Initialization
    1496             :      *-----------------------------------------------------------------*/
    1497             : 
    1498             : #ifdef OPT_STEREO_32KBPS_V1
    1499       47491 :     samp_ratio = divide3232( st0->sr_core, st0->output_Fs ); // Q15
    1500             : #else                                                        /* OPT_STEREO_32KBPS_V1 */
    1501             :     samp_ratio = (Word16) BASOP_Util_Divide3232_Scale( st0->sr_core, st0->output_Fs, &q_samp_ratio );
    1502             :     samp_ratio = shr( samp_ratio, sub( Q15 - Q12, q_samp_ratio ) );
    1503             : #endif                                                       /* OPT_STEREO_32KBPS_V1 */
    1504             : 
    1505             : 
    1506       47491 :     stop = shr( STEREO_DFT32MS_N_32k, 1 );
    1507             : 
    1508             :     /* Analyze nature of current frame */
    1509       47491 :     test();
    1510       47491 :     test();
    1511       47491 :     test();
    1512       47491 :     test();
    1513       47491 :     test();
    1514       47491 :     test();
    1515       47491 :     test();
    1516       47491 :     test();
    1517       86455 :     hStereoDft->trans = (Word16) ( ( EQ_16( st0->clas_dec, ONSET ) || EQ_16( st0->clas_dec, SIN_ONSET ) || EQ_16( st0->clas_dec, UNVOICED_CLAS ) || EQ_16( st0->clas_dec, UNVOICED_TRANSITION ) ) || LE_16( st0->stab_fac_fx, (Word16) 0x2000 ) ) ||
    1518       38964 :                         ( ( EQ_16( st0->core, TCX_20_CORE ) && ( EQ_16( st0->hTcxCfg->tcx_last_overlap_mode, MIN_OVERLAP ) || EQ_16( st0->hTcxCfg->tcx_last_overlap_mode, HALF_OVERLAP ) ) ) || EQ_16( st0->core, TCX_10_CORE ) ); /* Q0 */
    1519       47491 :     move16();
    1520             : 
    1521             :     /* Initialization */
    1522       47491 :     k_offset = 1;
    1523       47491 :     move16();
    1524       47491 :     N_div = STEREO_DFT_NBDIV;
    1525       47491 :     move16();
    1526       47491 :     prev_bfi = st0->prev_old_bfi; /* The core decoding is already completed here and the prev_bfi has been updated for the next frame.
    1527             :                                      The prev_old_bfi still holds the prev_bfi for the current frame. */
    1528             :     /* make sure number of bands corresponds to output bwidth in case it is lower than parameter bwidth */
    1529       47491 :     move16();
    1530       47491 :     test();
    1531       47491 :     IF( LT_16( output_frame, inner_frame_tbl[st0->bwidth] ) && ( sba_dirac_stereo_flag == 0 ) )
    1532             :     {
    1533        6785 :         hStereoDft->nbands = stereo_dft_band_config_fx( hStereoDft->band_limits, hStereoDft->band_res[k_offset], hStereoDft->NFFT, DEC ); /* Q0 */
    1534             :     }
    1535             : 
    1536       47491 :     IF( st0->bfi == 0 )
    1537             :     {
    1538             :         /* Smoothing for the current frame */
    1539       46908 :         IF( sba_dirac_stereo_flag )
    1540             :         {
    1541       10753 :             ivas_sba_dirac_stereo_smooth_parameters_fx( hStereoDft, hMdDec, cross_fade_start_offset, output_Fs, num_md_sub_frames );
    1542             :         }
    1543             :         ELSE
    1544             :         {
    1545       36155 :             stereo_dft_dec_smooth_parameters_fx( hStereoDft, hStereoCng->prev_sid_nodata, hStereoCng->active_frame_counter, st0->element_brate );
    1546             :         }
    1547             :     }
    1548             : 
    1549       47491 :     dmx_nrg = 0;
    1550       47491 :     move32();
    1551       47491 :     IF( prev_bfi )
    1552             :     {
    1553         577 :         dmx_nrg = stereo_dft_dmx_swb_nrg_fx( DFT[0], DFT[0] + STEREO_DFT32MS_N_MAX, s_min( hStereoDft->NFFT, STEREO_DFT32MS_N_32k ), 0, 0 ); /* Q0 */
    1554             :     }
    1555             : 
    1556      142473 :     FOR( k = 0; k < N_div; k++ )
    1557             :     {
    1558       94982 :         pDFT_DMX = DFT[0] + i_mult( k, STEREO_DFT32MS_N_MAX ); /* qDFT */
    1559       94982 :         pDFT_RES = DFT[1] + i_mult( k, STEREO_DFT32MS_N_MAX ); /* qDFT */
    1560       94982 :         pDFT_DMX1 = 0;
    1561       94982 :         move16();
    1562             : 
    1563       94982 :         IF( GT_16( nchan_transport, 1 ) )
    1564             :         {
    1565       12558 :             pDFT_DMX1 = DFT[1] + i_mult( k, STEREO_DFT32MS_N_MAX ); /* qDFT */
    1566             :         }
    1567             : 
    1568             :         /*Apply Stereo*/
    1569       94982 :         IF( hStereoDft->hConfig->dmx_active )
    1570             :         {
    1571       94982 :             g = MAX_16;
    1572       94982 :             move16();
    1573       94982 :             c0 = MAX_16;
    1574       94982 :             move16();
    1575       94982 :             s0 = 0;
    1576       94982 :             move16();
    1577             : 
    1578             :             /* since delay is just 3.125ms, the parameters received are used for the second window */
    1579       94982 :             pSideGain = hStereoDft->side_gain_fx + i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX );     /* Q31 */
    1580       94982 :             pgIpd = hStereoDft->gipd_fx + add( k, k_offset );                                             /* Q27 */
    1581       94982 :             pPredGain = hStereoDft->res_pred_gain_fx + i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ); /* Q31 */
    1582             : 
    1583             :             /* Use coarse band partition in inactive frames */
    1584       94982 :             test();
    1585       94982 :             IF( hStereoDft->frame_sid_nodata && !sba_dirac_stereo_flag )
    1586             :             {
    1587       10940 :                 NFFT_inner = i_mult( ( STEREO_DFT32MS_N_MAX / L_FRAME48k ), inner_frame_tbl[st0->bwidth] ); /* Q0 */
    1588       10940 :                 hStereoDft->nbands = stereo_dft_band_config_fx( hStereoDft->band_limits, 2, NFFT_inner, DEC );
    1589             :             }
    1590             : 
    1591             : 
    1592       94982 :             IF( st0->bfi )
    1593             :             {
    1594        1166 :                 hStereoDft->past_DMX_pos = ( sub( add( hStereoDft->past_DMX_pos, STEREO_DFT_PAST_MAX ), 1 ) ) % STEREO_DFT_PAST_MAX; /* Q0 */
    1595             :             }
    1596             : 
    1597       94982 :             test();
    1598       94982 :             IF( !( sba_dirac_stereo_flag && GE_16( nchan_transport, 2 ) ) )
    1599             :             {
    1600       82424 :                 stereo_dft_generate_res_pred_fx( hStereoDft, samp_ratio, pDFT_DMX, DFT_PRED_RES, pPredGain, k, DFT[1] + i_mult( k, STEREO_DFT32MS_N_MAX ), &stop, st0->bfi );
    1601             :             }
    1602             : 
    1603       94982 :             IF( hStereoDft->res_cod_band_max > 0 )
    1604             :             {
    1605       23908 :                 IF( !st0->bfi )
    1606             :                 {
    1607       23242 :                     IF( EQ_16( k, 1 ) )
    1608             :                     {
    1609       11621 :                         Copy32( pDFT_RES, hStereoDft->res_mem_fx, shl( hStereoDft->band_limits[hStereoDft->res_cod_band_max], 1 ) ); /* qDFT */
    1610       11621 :                         hStereoDft->time_offs = 0;
    1611       11621 :                         move16();
    1612             :                     }
    1613             :                 }
    1614             :                 ELSE
    1615             :                 {
    1616         666 :                     stereo_dft_res_ecu_fx( hStereoDft, pDFT_RES, DFT_PRED_RES, k, output_frame, prev_bfi, dmx_nrg, &num_plocs, plocs, plocsi, input_mem );
    1617             :                 }
    1618             :             }
    1619             : 
    1620             :             /* Apply active DMX */
    1621             :             /* pDFT_RES is used for the second channel in inactive frames */
    1622       94982 :             test();
    1623       94982 :             IF( hStereoDft->frame_sid_nodata && !sba_dirac_stereo_flag )
    1624             :             {
    1625       10940 :                 DFT_L[0] = pDFT_DMX[0]; /* qDFT */
    1626       10940 :                 move32();
    1627       10940 :                 DFT_R[0] = pDFT_RES[0]; /* qDFT */
    1628       10940 :                 move32();
    1629             :             }
    1630             :             ELSE
    1631             :             {
    1632       84042 :                 DFT_L[0] = pDFT_DMX[0]; /* qDFT */
    1633       84042 :                 move32();
    1634       84042 :                 DFT_R[0] = pDFT_DMX[0]; /* qDFT */
    1635       84042 :                 move32();
    1636             :             }
    1637             : 
    1638       94982 :             test();
    1639       94982 :             if ( hStereoDft->frame_sid_nodata || ( st0->VAD == 0 ) )
    1640             :             {
    1641       24302 :                 hFdCngDec->cna_nbands = 0;
    1642       24302 :                 move16();
    1643             :             }
    1644             : 
    1645      970736 :             FOR( b = 0; b < hStereoDft->nbands; b++ )
    1646             :             {
    1647      875754 :                 g = extract_h( pSideGain[b] );
    1648      875754 :                 move16();
    1649      875754 :                 test();
    1650      875754 :                 IF( hStereoDft->frame_sid_nodata && !sba_dirac_stereo_flag )
    1651             :                 {
    1652       63932 :                     g = hStereoDft->g_state_fx[b]; /* Q15 */
    1653       63932 :                     move16();
    1654             :                 }
    1655             : 
    1656             :                 /* store side gains from inactive frames for later use by the stereo CNA */
    1657      875754 :                 test();
    1658      875754 :                 test();
    1659      875754 :                 IF( LT_16( hStereoDft->band_limits[b], L_FRAME16k ) && ( hStereoDft->frame_sid_nodata || ( st0->VAD == 0 ) ) )
    1660             :                 {
    1661      206112 :                     hFdCngDec->cna_nbands = add( b, 1 ); /* Q0 */
    1662      206112 :                     move16();
    1663      206112 :                     hFdCngDec->cna_band_limits[b] = hStereoDft->band_limits[b]; /* Q0 */
    1664      206112 :                     move16();
    1665      206112 :                     hFdCngDec->cna_g_state_fx[b] = g; /* Q15 */
    1666      206112 :                     move16();
    1667             :                 }
    1668             : 
    1669             :                 /* No residual coding in inactive frames, instead pDFT_RES is used for the second channel */
    1670      875754 :                 test();
    1671      875754 :                 test();
    1672      875754 :                 IF( GE_16( b, hStereoDft->res_cod_band_max ) && !hStereoDft->frame_sid_nodata && !( sba_dirac_stereo_flag && hMdDec ) )
    1673             :                 {
    1674             :                     /*filter non-coded frequencies. It removes some MDCT frequency aliasing*/
    1675    19058980 :                     FOR( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ )
    1676             :                     {
    1677    18585338 :                         pDFT_RES[2 * i] = 0;
    1678    18585338 :                         move32();
    1679    18585338 :                         pDFT_RES[2 * i + 1] = 0;
    1680    18585338 :                         move32();
    1681             :                     }
    1682             :                 }
    1683             : 
    1684      875754 :                 test();
    1685      875754 :                 test();
    1686      875754 :                 IF( hStereoDft->frame_sid_nodata && !sba_dirac_stereo_flag )
    1687             :                 {
    1688             :                     /* Low pass filter coherence */
    1689             :                     /* store coherence from inactive frames for later use by the stereo CNA */
    1690       63932 :                     hFdCngDec->cna_cm_fx[b] = hStereoCng->cm_fx[b]; /* Q15 */
    1691       63932 :                     move16();
    1692             : 
    1693             :                     /* Calculate gamma */
    1694       63932 :                     IF( LT_16( hStereoCng->cm_fx[b], (Word16) 0x7333 ) )
    1695             :                     {
    1696             :                         Word32 op1, op2, l_gamma;
    1697             :                         Word16 q_loc1, q_loc2;
    1698       63932 :                         gamma = hStereoCng->cm_fx[b];
    1699       63932 :                         move16();
    1700       63932 :                         gamma = BASOP_Util_Divide3232_Scale( gamma, sub( MAX_16, gamma ), &q_loc1 ); /* q_loc1 */
    1701       63932 :                         l_gamma = L_deposit_l( gamma );
    1702       63932 :                         op1 = L_add( l_gamma, L_shr( L_deposit_l( sub( MAX_16, mult( g, g ) ) ), q_loc1 ) ); /* q_loc1 */
    1703       63932 :                         q_loc1 = add( Q16, q_loc1 );
    1704       63932 :                         q_loc2 = q_loc1;
    1705       63932 :                         op1 = Sqrt32( op1, &q_loc1 );
    1706       63932 :                         op2 = Sqrt32( l_gamma, &q_loc2 );
    1707       63932 :                         IF( NE_16( q_loc1, q_loc2 ) )
    1708             :                         {
    1709       51312 :                             op2 = L_shl( op2, sub( q_loc2, q_loc1 ) );
    1710       51312 :                             q_loc2 = q_loc1;
    1711             :                         }
    1712       63932 :                         gamma = extract_h( L_sub( op1, op2 ) ); /* q_loc1 - 16 */
    1713       63932 :                         gamma = shl( gamma, q_loc2 );           /* 2 * q_loc1 - 16 */
    1714             :                     }
    1715             :                     ELSE
    1716             :                     {
    1717           0 :                         gamma = 0;
    1718           0 :                         move16();
    1719             :                     }
    1720             : 
    1721     3280512 :                     FOR( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ )
    1722             :                     {
    1723             :                         /* Create L and R signals with the correct coherence by mixing channel 0 (pDFT_DMX) and channel 1 (pDFT_RES) */
    1724     3216580 :                         DFT_L[2 * i] = Madd_32_16( Madd_32_16( pDFT_DMX[2 * i], pDFT_DMX[2 * i], g ), pDFT_RES[2 * i], gamma ); /* qDFT */
    1725     3216580 :                         move32();
    1726     3216580 :                         DFT_R[2 * i] = Msub_32_16( Msub_32_16( pDFT_DMX[2 * i], pDFT_DMX[2 * i], g ), pDFT_RES[2 * i], gamma ); /* qDFT */
    1727     3216580 :                         move32();
    1728             : 
    1729     3216580 :                         DFT_L[2 * i + 1] = Madd_32_16( Madd_32_16( pDFT_DMX[2 * i + 1], pDFT_DMX[2 * i + 1], g ), pDFT_RES[2 * i + 1], gamma ); /* qDFt */
    1730     3216580 :                         move32();
    1731     3216580 :                         DFT_R[2 * i + 1] = Msub_32_16( Msub_32_16( pDFT_DMX[2 * i + 1], pDFT_DMX[2 * i + 1], g ), pDFT_RES[2 * i + 1], gamma ); /* qDFT */
    1732     3216580 :                         move32();
    1733             :                     }
    1734             : 
    1735       63932 :                     IF( pgIpd[0] != 0 )
    1736             :                     {
    1737       43302 :                         Word32 theta = pgIpd[0];
    1738       43806 :                         WHILE( GT_32( theta, EVS_2PI_FX_Q27 ) )
    1739             :                         {
    1740         504 :                             theta = L_sub( theta, EVS_2PI_FX_Q27 ); /* Q27 */
    1741             :                         }
    1742       43302 :                         WHILE( LT_32( theta, -EVS_2PI_FX_Q27 ) )
    1743             :                         {
    1744           0 :                             theta = L_add( theta, EVS_2PI_FX_Q27 ); /* Q27 */
    1745             :                         }
    1746       43302 :                         IF( GT_32( theta, EVS_PI_FX_Q27 ) )
    1747             :                         {
    1748        1946 :                             theta = L_sub( theta, EVS_2PI_FX_Q27 ); /* Q27 */
    1749             :                         }
    1750       41356 :                         ELSE IF( LT_32( theta, -EVS_PI_FX_Q27 ) )
    1751             :                         {
    1752           0 :                             theta = L_add( theta, EVS_2PI_FX_Q27 ); /* Q27 */
    1753             :                         }
    1754       43302 :                         c0 = getCosWord16( (Word16) L_shr( theta, 14 ) );
    1755       43302 :                         IF( EQ_16( c0, ONE_IN_Q14 ) )
    1756             :                         {
    1757       28212 :                             c0 = MAX_16;
    1758       28212 :                             move16();
    1759             :                         }
    1760             :                         ELSE
    1761             :                         {
    1762       15090 :                             c0 = shl( c0, 1 );
    1763             :                         }
    1764       43302 :                         s0 = getSinWord16( (Word16) L_shr( theta, 14 ) );
    1765     2166686 :                         FOR( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ )
    1766             :                         {
    1767             :                             /*rotate L*/
    1768     2123384 :                             tmp = Msub_32_16( Mpy_32_16_1( DFT_L[2 * i], c0 ), DFT_L[2 * i + 1], s0 );              /* qDFT */
    1769     2123384 :                             DFT_L[2 * i + 1] = Madd_32_16( Mpy_32_16_1( DFT_L[2 * i], s0 ), DFT_L[2 * i + 1], c0 ); /* qDFT */
    1770     2123384 :                             move32();
    1771     2123384 :                             DFT_L[2 * i] = tmp; /* qDFT */
    1772     2123384 :                             move32();
    1773             :                         }
    1774             :                     }
    1775             :                 }
    1776      811822 :                 ELSE IF( sba_dirac_stereo_flag && hMdDec )
    1777             :                 {
    1778             : 
    1779      218640 :                     IF( EQ_16( nchan_transport, 1 ) )
    1780             :                     {
    1781       75222 :                         IF( sba_mono_flag )
    1782             :                         {
    1783       14640 :                             IF( b == 0 )
    1784             :                             {
    1785        1220 :                                 i = 0;
    1786        1220 :                                 move16();
    1787        1220 :                                 DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ); /* qDFT */
    1788        1220 :                                 move32();
    1789        1220 :                                 DFT_L[2 * i] = DFT_W; /* qDFT */
    1790        1220 :                                 move32();
    1791        1220 :                                 DFT_R[2 * i] = 0;
    1792        1220 :                                 move32();
    1793        1220 :                                 DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ); /* qDFT */
    1794        1220 :                                 move32();
    1795        1220 :                                 DFT_L[2 * i + 1] = DFT_W; /* qDFT */
    1796        1220 :                                 move32();
    1797        1220 :                                 DFT_R[2 * i + 1] = 0;
    1798        1220 :                                 move32();
    1799             :                             }
    1800      323564 :                             FOR( i = hStereoDft->band_limits[b]; i < s_min( stop, hStereoDft->band_limits[b + 1] ); i++ )
    1801             :                             {
    1802      308924 :                                 DFT_W = Madd_32_32( Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ),
    1803      308924 :                                                     L_add( hStereoDft->mixer_mat_smooth_fx[0][1][b + k * IVAS_MAX_NUM_BANDS],
    1804      308924 :                                                            L_add( hStereoDft->mixer_mat_smooth_fx[0][2][b + k * IVAS_MAX_NUM_BANDS],
    1805      308924 :                                                                   hStereoDft->mixer_mat_smooth_fx[0][3][b + k * IVAS_MAX_NUM_BANDS] ) ),
    1806      308924 :                                                     DFT_PRED_RES[2 * i] ); /* qDFT */
    1807      308924 :                                 DFT_L[2 * i] = DFT_W;                      /* qDFT */
    1808      308924 :                                 move32();
    1809      308924 :                                 DFT_R[2 * i] = 0;
    1810      308924 :                                 move32();
    1811             : 
    1812      308924 :                                 DFT_W = Madd_32_32( Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ),
    1813      308924 :                                                     L_add( hStereoDft->mixer_mat_smooth_fx[0][1][b + k * IVAS_MAX_NUM_BANDS],
    1814      308924 :                                                            L_add( hStereoDft->mixer_mat_smooth_fx[0][2][b + k * IVAS_MAX_NUM_BANDS],
    1815      308924 :                                                                   hStereoDft->mixer_mat_smooth_fx[0][3][b + k * IVAS_MAX_NUM_BANDS] ) ),
    1816      308924 :                                                     DFT_PRED_RES[2 * i + 1] ); /* qDFT */
    1817      308924 :                                 DFT_L[2 * i + 1] = DFT_W;                      /* qDFT */
    1818      308924 :                                 move32();
    1819      308924 :                                 DFT_R[2 * i + 1] = 0;
    1820      308924 :                                 move32();
    1821             :                             }
    1822      290096 :                             FOR( ; i < hStereoDft->band_limits[b + 1]; i++ )
    1823             :                             {
    1824      275456 :                                 DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ); /* qDFT */
    1825      275456 :                                 DFT_L[2 * i] = DFT_W;                                                                                    /* qDFT */
    1826      275456 :                                 move32();
    1827      275456 :                                 DFT_R[2 * i] = 0;
    1828      275456 :                                 move32();
    1829             : 
    1830      275456 :                                 DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ); /* qDFT */
    1831      275456 :                                 DFT_L[2 * i + 1] = DFT_W;                                                                                    /* qDFT */
    1832      275456 :                                 move32();
    1833      275456 :                                 DFT_R[2 * i + 1] = 0;
    1834      275456 :                                 move32();
    1835             :                             }
    1836             :                         }
    1837             :                         ELSE
    1838             :                         {
    1839       60582 :                             IF( b == 0 )
    1840             :                             {
    1841        5442 :                                 i = 0;
    1842        5442 :                                 move16();
    1843        5442 :                                 DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ); /* qDFT */
    1844        5442 :                                 DFT_Y = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[1][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ); /* qDFT */
    1845             : 
    1846        5442 :                                 DFT_L[2 * i] = L_add( DFT_W, DFT_Y ); /* qDFT */
    1847        5442 :                                 move32();
    1848        5442 :                                 DFT_R[2 * i] = L_sub( DFT_W, DFT_Y ); /* qDFT */
    1849        5442 :                                 move32();
    1850             : 
    1851        5442 :                                 DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ); /* qDFT */
    1852        5442 :                                 DFT_Y = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[1][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ); /* qDFT */
    1853             : 
    1854        5442 :                                 DFT_L[2 * i + 1] = L_add( DFT_W, DFT_Y ); /* qDFT */
    1855        5442 :                                 move32();
    1856        5442 :                                 DFT_R[2 * i + 1] = L_sub( DFT_W, DFT_Y ); /* qDFT */
    1857        5442 :                                 move32();
    1858             :                             }
    1859       60582 :                             len = s_min( stop, hStereoDft->band_limits[b + 1] );
    1860     1276260 :                             FOR( i = hStereoDft->band_limits[b]; i < len; i++ )
    1861             :                             {
    1862     1215678 :                                 DFT_W = Madd_32_32( Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ),
    1863     1215678 :                                                     L_add( hStereoDft->mixer_mat_smooth_fx[0][1][b + k * IVAS_MAX_NUM_BANDS],
    1864     1215678 :                                                            L_add( hStereoDft->mixer_mat_smooth_fx[0][2][b + k * IVAS_MAX_NUM_BANDS],
    1865     1215678 :                                                                   hStereoDft->mixer_mat_smooth_fx[0][3][b + k * IVAS_MAX_NUM_BANDS] ) ),
    1866     1215678 :                                                     DFT_PRED_RES[2 * i] ); /* qDFT */
    1867     1215678 :                                 DFT_Y = Madd_32_32( Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[1][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ),
    1868     1215678 :                                                     L_add( hStereoDft->mixer_mat_smooth_fx[1][1][b + k * IVAS_MAX_NUM_BANDS],
    1869     1215678 :                                                            L_add( hStereoDft->mixer_mat_smooth_fx[1][2][b + k * IVAS_MAX_NUM_BANDS],
    1870     1215678 :                                                                   hStereoDft->mixer_mat_smooth_fx[1][3][b + k * IVAS_MAX_NUM_BANDS] ) ),
    1871     1215678 :                                                     DFT_PRED_RES[2 * i] ); /* qDFT */
    1872             : 
    1873     1215678 :                                 DFT_L[2 * i] = L_add( DFT_W, DFT_Y ); /* qDFT */
    1874     1215678 :                                 move32();
    1875     1215678 :                                 DFT_R[2 * i] = L_sub( DFT_W, DFT_Y ); /* qDFT */
    1876     1215678 :                                 move32();
    1877             : 
    1878     1215678 :                                 DFT_W = Madd_32_32( Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ),
    1879     1215678 :                                                     L_add( hStereoDft->mixer_mat_smooth_fx[0][1][b + k * IVAS_MAX_NUM_BANDS],
    1880     1215678 :                                                            L_add( hStereoDft->mixer_mat_smooth_fx[0][2][b + k * IVAS_MAX_NUM_BANDS],
    1881     1215678 :                                                                   hStereoDft->mixer_mat_smooth_fx[0][3][b + k * IVAS_MAX_NUM_BANDS] ) ),
    1882     1215678 :                                                     DFT_PRED_RES[2 * i + 1] ); /* qDFT */
    1883     1215678 :                                 DFT_Y = Madd_32_32( Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[1][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ),
    1884     1215678 :                                                     L_add( hStereoDft->mixer_mat_smooth_fx[1][1][b + k * IVAS_MAX_NUM_BANDS],
    1885     1215678 :                                                            L_add( hStereoDft->mixer_mat_smooth_fx[1][2][b + k * IVAS_MAX_NUM_BANDS],
    1886     1215678 :                                                                   hStereoDft->mixer_mat_smooth_fx[1][3][b + k * IVAS_MAX_NUM_BANDS] ) ),
    1887     1215678 :                                                     DFT_PRED_RES[2 * i + 1] ); /* qDFT */
    1888             : 
    1889     1215678 :                                 DFT_L[2 * i + 1] = L_add( DFT_W, DFT_Y ); /* qDFT */
    1890     1215678 :                                 move32();
    1891     1215678 :                                 DFT_R[2 * i + 1] = L_sub( DFT_W, DFT_Y ); /* qDFT */
    1892     1215678 :                                 move32();
    1893             :                             }
    1894      696102 :                             FOR( ; i < hStereoDft->band_limits[b + 1]; i++ )
    1895             :                             {
    1896      635520 :                                 DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ); /* qDFT */
    1897      635520 :                                 DFT_Y = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[1][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ); /* qDFT */
    1898             : 
    1899      635520 :                                 DFT_L[2 * i] = L_add( DFT_W, DFT_Y ); /* qDFT */
    1900      635520 :                                 move32();
    1901      635520 :                                 DFT_R[2 * i] = L_sub( DFT_W, DFT_Y ); /* qDFT */
    1902      635520 :                                 move32();
    1903             : 
    1904      635520 :                                 DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ); /* qDFT */
    1905      635520 :                                 DFT_Y = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[1][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ); /* qDFT */
    1906             : 
    1907      635520 :                                 DFT_L[2 * i + 1] = L_add( DFT_W, DFT_Y ); /* qDFT */
    1908      635520 :                                 move32();
    1909      635520 :                                 DFT_R[2 * i + 1] = L_sub( DFT_W, DFT_Y ); /* qDFT */
    1910      635520 :                                 move32();
    1911             :                             }
    1912             :                         }
    1913             :                     }
    1914      143418 :                     ELSE IF( GE_16( nchan_transport, 2 ) )
    1915             :                     {
    1916      143418 :                         IF( b == 0 )
    1917             :                         {
    1918       12558 :                             i = 0;
    1919       12558 :                             move32();
    1920             : 
    1921       12558 :                             DFT_W = pDFT_DMX[2 * i]; /* qDFT */
    1922       12558 :                             move32();
    1923       12558 :                             DFT_Y = Madd_32_32( pDFT_DMX1[2 * i], hStereoDft->mixer_mat_smooth_fx[1][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ); /* qDFT */
    1924             : 
    1925       12558 :                             DFT_L[2 * i] = L_add( DFT_W, DFT_Y ); /* qDFT */
    1926       12558 :                             move32();
    1927       12558 :                             DFT_R[2 * i] = L_sub( DFT_W, DFT_Y ); /* qDFT */
    1928       12558 :                             move32();
    1929             : 
    1930       12558 :                             DFT_W = pDFT_DMX[2 * i + 1]; /* qDFT */
    1931       12558 :                             move32();
    1932       12558 :                             DFT_Y = Madd_32_32( pDFT_DMX1[2 * i + 1], hStereoDft->mixer_mat_smooth_fx[1][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ); /* qDFT */
    1933             : 
    1934       12558 :                             DFT_L[2 * i + 1] = L_add( DFT_W, DFT_Y ); /* qDFT */
    1935       12558 :                             move32();
    1936       12558 :                             DFT_R[2 * i + 1] = L_sub( DFT_W, DFT_Y ); /* qDFT */
    1937       12558 :                             move32();
    1938             :                         }
    1939     4994220 :                         FOR( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ )
    1940             :                         {
    1941     4850802 :                             DFT_W = pDFT_DMX[2 * i]; /* qDFT */
    1942     4850802 :                             move32();
    1943     4850802 :                             DFT_Y = Madd_32_32( pDFT_DMX1[2 * i], hStereoDft->mixer_mat_smooth_fx[1][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ); /* qDFT */
    1944             : 
    1945     4850802 :                             DFT_L[2 * i] = L_add( DFT_W, DFT_Y ); /* qDFT */
    1946     4850802 :                             move32();
    1947     4850802 :                             DFT_R[2 * i] = L_sub( DFT_W, DFT_Y ); /* qDFT */
    1948     4850802 :                             move32();
    1949             : 
    1950     4850802 :                             DFT_W = pDFT_DMX[2 * i + 1]; /* qDFT */
    1951     4850802 :                             move32();
    1952     4850802 :                             DFT_Y = Madd_32_32( pDFT_DMX1[2 * i + 1], hStereoDft->mixer_mat_smooth_fx[1][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ); /* qDFT */
    1953             : 
    1954     4850802 :                             DFT_L[2 * i + 1] = L_add( DFT_W, DFT_Y ); /* qDFT */
    1955     4850802 :                             move32();
    1956     4850802 :                             DFT_R[2 * i + 1] = L_sub( DFT_W, DFT_Y ); /* qDFT */
    1957     4850802 :                             move32();
    1958             :                         }
    1959             :                     }
    1960             :                     ELSE
    1961             :                     {
    1962             :                         assert( "nhcan_transport must be 1 or 1!" );
    1963             :                     }
    1964             :                 }
    1965             :                 ELSE
    1966             :                 {
    1967      593182 :                     len = s_min( stop, hStereoDft->band_limits[b + 1] );
    1968    12776424 :                     FOR( i = hStereoDft->band_limits[b]; i < len; i++ )
    1969             :                     {
    1970    12183242 :                         tmp = L_add( Madd_32_16( pDFT_RES[2 * i], pDFT_DMX[2 * i], g ), DFT_PRED_RES[2 * i] ); /* qDFT */
    1971             : 
    1972    12183242 :                         DFT_L[2 * i] = L_add( pDFT_DMX[2 * i], tmp ); /* qDFT */
    1973    12183242 :                         move32();
    1974    12183242 :                         DFT_R[2 * i] = L_sub( pDFT_DMX[2 * i], tmp ); /* qDFT */
    1975    12183242 :                         move32();
    1976             : 
    1977    12183242 :                         tmp = L_add( Madd_32_16( pDFT_RES[2 * i + 1], pDFT_DMX[2 * i + 1], g ), DFT_PRED_RES[2 * i + 1] ); /* qDFT */
    1978             : 
    1979    12183242 :                         DFT_L[2 * i + 1] = L_add( pDFT_DMX[2 * i + 1], tmp ); /* qDFT */
    1980    12183242 :                         move32();
    1981    12183242 :                         DFT_R[2 * i + 1] = L_sub( pDFT_DMX[2 * i + 1], tmp ); /* qDFT */
    1982    12183242 :                         move32();
    1983             :                     }
    1984             : 
    1985     7473438 :                     FOR( ; i < hStereoDft->band_limits[b + 1]; i++ )
    1986             :                     {
    1987     6880256 :                         tmp = Madd_32_16( pDFT_RES[2 * i], pDFT_DMX[2 * i], g ); /* qDFT */
    1988             : 
    1989     6880256 :                         DFT_L[2 * i] = L_add( pDFT_DMX[2 * i], tmp ); /* qDFT */
    1990     6880256 :                         move32();
    1991     6880256 :                         DFT_R[2 * i] = L_sub( pDFT_DMX[2 * i], tmp ); /* qDFT */
    1992     6880256 :                         move32();
    1993             : 
    1994     6880256 :                         tmp = Madd_32_16( pDFT_RES[2 * i + 1], pDFT_DMX[2 * i + 1], g ); /* qDFT */
    1995             : 
    1996     6880256 :                         DFT_L[2 * i + 1] = L_add( pDFT_DMX[2 * i + 1], tmp ); /* qDFT */
    1997     6880256 :                         move32();
    1998     6880256 :                         DFT_R[2 * i + 1] = L_sub( pDFT_DMX[2 * i + 1], tmp ); /* qDFT */
    1999     6880256 :                         move32();
    2000             :                     }
    2001             : 
    2002             :                     /* Active Upmix */
    2003      593182 :                     IF( pgIpd[0] != 0 )
    2004             :                     {
    2005       94572 :                         Word32 theta = pgIpd[0];
    2006       94572 :                         move32();
    2007       96420 :                         WHILE( GT_32( theta, EVS_2PI_FX_Q27 ) )
    2008             :                         {
    2009        1848 :                             theta = L_sub( theta, EVS_2PI_FX_Q27 ); /* Q27 */
    2010             :                         }
    2011       97632 :                         WHILE( LT_32( theta, -EVS_2PI_FX_Q27 ) )
    2012             :                         {
    2013        3060 :                             theta = L_add( theta, EVS_2PI_FX_Q27 ); /* Q27 */
    2014             :                         }
    2015       94572 :                         IF( GT_32( theta, EVS_PI_FX_Q27 ) )
    2016             :                         {
    2017        5151 :                             theta = L_sub( theta, EVS_2PI_FX_Q27 ); /* Q27 */
    2018             :                         }
    2019       89421 :                         ELSE IF( LT_32( theta, -EVS_PI_FX_Q27 ) )
    2020             :                         {
    2021        2688 :                             theta = L_add( theta, EVS_2PI_FX_Q27 ); /* Q27 */
    2022             :                         }
    2023       94572 :                         c0 = getCosWord16( (Word16) L_shr( theta, 14 ) );
    2024       94572 :                         IF( EQ_16( c0, ONE_IN_Q14 ) )
    2025             :                         {
    2026       41162 :                             c0 = MAX_16;
    2027       41162 :                             move16();
    2028             :                         }
    2029             :                         ELSE
    2030             :                         {
    2031       53410 :                             c0 = shl( c0, 1 );
    2032             :                         }
    2033       94572 :                         s0 = getSinWord16( (Word16) L_shr( theta, 14 ) );
    2034     2906225 :                         FOR( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ )
    2035             :                         {
    2036             :                             /*rotate L*/
    2037     2811653 :                             tmp = Msub_32_16( Mpy_32_16_1( DFT_L[2 * i], c0 ), DFT_L[2 * i + 1], s0 );              /* qDFT */
    2038     2811653 :                             DFT_L[2 * i + 1] = Madd_32_16( Mpy_32_16_1( DFT_L[2 * i], s0 ), DFT_L[2 * i + 1], c0 ); /* qDFT */
    2039     2811653 :                             move32();
    2040     2811653 :                             DFT_L[2 * i] = tmp; /* qDFT */
    2041     2811653 :                             move32();
    2042             :                         }
    2043             :                     }
    2044             :                 }
    2045             :             }
    2046             : 
    2047       94982 :             test();
    2048       94982 :             if ( hStereoDft->frame_sid_nodata || ( st0->VAD == 0 ) )
    2049             :             {
    2050       24302 :                 hFdCngDec->cna_band_limits[hFdCngDec->cna_nbands] = hStereoDft->band_limits[hFdCngDec->cna_nbands]; /* Q0 */
    2051       24302 :                 move16();
    2052             :             }
    2053             : 
    2054       94982 :             test();
    2055       94982 :             IF( hStereoDft->frame_sid_nodata && !sba_dirac_stereo_flag )
    2056             :             {
    2057       10940 :                 hStereoCng->first_SID = 0;
    2058       10940 :                 move16();
    2059       10940 :                 hStereoCng->first_SID_after_TD = 0;
    2060       10940 :                 move16();
    2061             :             }
    2062             : 
    2063     2914822 :             FOR( i = hStereoDft->band_limits[b]; i < hStereoDft->NFFT / 2; i++ )
    2064             :             {
    2065     2819840 :                 DFT_L[2 * i] = 0;
    2066     2819840 :                 move32();
    2067     2819840 :                 DFT_L[2 * i + 1] = 0;
    2068     2819840 :                 move32();
    2069     2819840 :                 DFT_R[2 * i] = 0;
    2070     2819840 :                 move32();
    2071     2819840 :                 DFT_R[2 * i + 1] = 0;
    2072     2819840 :                 move32();
    2073             :             }
    2074             : 
    2075             :             /*Nyquist Freq.*/
    2076       94982 :             IF( EQ_16( hStereoDft->band_limits[b], shr( hStereoDft->NFFT, 1 ) ) )
    2077             :             {
    2078             : #ifdef OPT_STEREO_32KBPS_V1
    2079       76084 :                 DFT_L[1] = Madd_32_16( pDFT_DMX[1], pDFT_DMX[1], g ); /* qDFT */
    2080       76084 :                 move32();
    2081       76084 :                 DFT_R[1] = Msub_32_16( pDFT_DMX[1], pDFT_DMX[1], g ); /* qDFT */
    2082       76084 :                 move32();
    2083             : #else                                                                 /* OPT_STEREO_32KBPS_V1 */
    2084             :                 DFT_L[1] = L_add( pDFT_DMX[1], Mpy_32_16_1( pDFT_DMX[1], g ) ); /* qDFT */
    2085             :                 move32();
    2086             :                 DFT_R[1] = L_sub( pDFT_DMX[1], Mpy_32_16_1( pDFT_DMX[1], g ) ); /* qDFT */
    2087             :                 move32();
    2088             : #endif                                                                /* OPT_STEREO_32KBPS_V1 */
    2089       76084 :                 DFT_L[1] = Mpy_32_16_1( DFT_L[1], INV_SQRT2_FX_Q15 ); /* qDFT */
    2090       76084 :                 move32();
    2091       76084 :                 DFT_R[1] = Mpy_32_16_1( DFT_R[1], INV_SQRT2_FX_Q15 ); /* qDFT */
    2092       76084 :                 move32();
    2093             :             }
    2094             :             ELSE
    2095             :             {
    2096       18898 :                 DFT_L[1] = 0;
    2097       18898 :                 move32();
    2098       18898 :                 DFT_R[1] = 0;
    2099       18898 :                 move32();
    2100             :             }
    2101             :         }
    2102             :         ELSE
    2103             :         {
    2104           0 :             pPredGain = NULL; /* to avoid compilation warnings */
    2105           0 :             pSideGain = NULL;
    2106             : 
    2107             :             /* Dummy upmix-> mono binauralization */
    2108           0 :             FOR( i = 0; i < hStereoDft->NFFT; i++ )
    2109             :             {
    2110           0 :                 DFT_L[i] = L_add( pDFT_DMX[i], pDFT_RES[i] ); /* qDFT */
    2111           0 :                 move32();
    2112           0 :                 DFT_R[i] = L_sub( pDFT_DMX[i], pDFT_RES[i] ); /* qDFT */
    2113           0 :                 move32();
    2114             :             }
    2115             :         }
    2116             : 
    2117             :         /* Comfort Noise Addition */
    2118       94982 :         IF( st0->flag_cna )
    2119             :         {
    2120       78792 :             ptr_per = &hFdCngDec->smoothed_psd_fx[hFdCngCom->startBand]; /* hFdCngDec->smoothed_psd_exp */
    2121             : 
    2122       78792 :             scale_fact0 = 0;
    2123       78792 :             move16();
    2124       78792 :             IF( hFdCngDec->cna_rescale_fact_fx > 0 )
    2125             :             {
    2126       30856 :                 Word16 q_scale_fact0 = 0;
    2127       30856 :                 move16();
    2128       30856 :                 Word16 op = Sqrt16( shr( hFdCngDec->cna_rescale_fact_fx, 1 ), &q_scale_fact0 );
    2129       30856 :                 move16();
    2130       30856 :                 scale_fact0 = L_mult0( shr( output_frame, 1 ), op );
    2131       30856 :                 IF( q_scale_fact0 > 0 )
    2132             :                 {
    2133           0 :                     assert( 0 );
    2134             :                 }
    2135             :                 ELSE
    2136             :                 {
    2137       30856 :                     scale_fact0 = L_shl( scale_fact0, q_scale_fact0 );
    2138       30856 :                     move32();
    2139             :                 }
    2140             :             }
    2141             : 
    2142      588380 :             FOR( b = 0; b < hFdCngDec->cna_nbands; b++ )
    2143             :             {
    2144             :                 /* calculate gamma factor reflecting inter-channel correlation and side gain (ILD) */
    2145      509588 :                 coh = hFdCngDec->cna_cm_fx[b];
    2146      509588 :                 move16();
    2147      509588 :                 g = hFdCngDec->cna_g_state_fx[b];
    2148      509588 :                 move16();
    2149      509588 :                 IF( LT_16( coh, (Word16) ( 0x7333 ) ) )
    2150             :                 {
    2151             :                     Word32 op1, op2, l_gamma;
    2152             :                     Word16 q_loc1, q_loc2, q_gamma;
    2153      484416 :                     gamma = coh;
    2154      484416 :                     move16();
    2155      484416 :                     gamma = BASOP_Util_Divide3232_Scale( gamma, sub( (Word16) 0x7FFF, gamma ), &q_gamma );
    2156      484416 :                     if ( gamma == 0 )
    2157             :                     {
    2158      247076 :                         q_gamma = 0;
    2159      247076 :                         move16();
    2160             :                     }
    2161      484416 :                     l_gamma = L_deposit_l( gamma );
    2162      484416 :                     op1 = L_add( l_gamma, L_shr( L_deposit_l( sub( MAX_16, mult_sat( g, g ) ) ), q_gamma ) ); /*The mult_sat function is needed because -0.999979973 is being mapped to -32768. This value, when multiplied by -32768, is causing a crash.*/
    2163      484416 :                     q_loc2 = add( Q16, q_gamma );
    2164      484416 :                     q_loc1 = q_loc2;
    2165      484416 :                     move16();
    2166      484416 :                     op1 = Sqrt32( op1, &q_loc1 );
    2167      484416 :                     op2 = Sqrt32( l_gamma, &q_loc2 );
    2168      484416 :                     IF( op2 != 0 )
    2169             :                     {
    2170      237340 :                         IF( NE_16( q_loc1, q_loc2 ) )
    2171             :                         {
    2172      134698 :                             op2 = L_shl( op2, sub( q_loc2, q_loc1 ) ); /* qloc2 */
    2173      134698 :                             q_loc2 = q_loc1;
    2174      134698 :                             move16();
    2175             :                         }
    2176      237340 :                         gamma = extract_h( L_sub( op1, op2 ) ); /* qloc2 - 16 */
    2177      237340 :                         gamma = shl( gamma, q_loc2 );           /* 2 * qloc2 - 16 */
    2178             :                     }
    2179             :                     ELSE
    2180             :                     {
    2181      247076 :                         gamma = extract_h( L_shl( op1, q_loc1 ) ); /* 2 * qloc2 - 16 */
    2182             :                     }
    2183             :                 }
    2184             :                 ELSE
    2185             :                 {
    2186       25172 :                     gamma = 0;
    2187       25172 :                     move16();
    2188             :                 }
    2189      509588 :                 len = s_min( hFdCngDec->cna_band_limits[b + 1], ( L_FRAME16k ) >> 1 );
    2190    13037516 :                 FOR( i = s_max( hFdCngDec->cna_band_limits[b], ( hFdCngCom->startBand >> 1 ) ); i < len; i++ ) // i < min( hFdCngDec->cna_band_limits[b + 1], ( L_FRAME16k ) >> 1 );
    2191             :                 {
    2192             :                     Word32 l_tmp;
    2193    12527928 :                     lev1 = *ptr_per++;
    2194    12527928 :                     move32();
    2195    12527928 :                     lev2 = *ptr_per++;
    2196    12527928 :                     move32();
    2197             : 
    2198    12527928 :                     test();
    2199    12527928 :                     test();
    2200    12527928 :                     IF( ( lev1 > 0 ) && ( lev2 > 0 ) && GT_32( Mpy_32_16_1( L_max( lev1, lev2 ), (Word16) 0x6AAB ), L_min( lev1, lev2 ) ) )
    2201             :                     {
    2202             :                         /* take the minimum of two adjacent frequency bins */
    2203      458144 :                         cna_level = L_min( lev1, lev2 ); /* hFdCngDec->smoothed_psd_exp */
    2204             :                     }
    2205             :                     ELSE
    2206             :                     {
    2207             :                         /* take the average of two adjacent frequency bins */
    2208    12069784 :                         cna_level = L_add( L_shr( lev1, 1 ), L_shr( lev2, 1 ) ); /* hFdCngDec->smoothed_psd_exp */
    2209             :                     }
    2210    12527928 :                     q_cna_level = hFdCngDec->smoothed_psd_exp;
    2211    12527928 :                     move16();
    2212    12527928 :                     l_tmp = Sqrt32( cna_level, &q_cna_level );
    2213    12527928 :                     scale_fact = Mpy_32_32( l_tmp, scale_fact0 ); /* q_cna_level */
    2214             :                     /*
    2215             :                        scale_fact0 will be in Q15 by the time the above operation is performed
    2216             :                        so the q of scale_fact represented now by q_cna_level has to be updated
    2217             :                     */
    2218    12527928 :                     q_cna_level = sub( Q31, add( q_cna_level, Q16 ) );
    2219             : 
    2220             :                     /* generate comfort noise from gaussian noise and add to the decoded DFT spectrum */
    2221             : #ifdef OPT_STEREO_32KBPS_V1
    2222    12527928 :                     Word16 shift = sub( q_cna_level, hStereoDft->q_dft );
    2223             : #endif                                                                                              /* OPT_STEREO_32KBPS_V1 */
    2224    12527928 :                     N1 = L_shl( Mpy_32_16_1( scale_fact, rand_gauss_fix( &ftmp, cna_seed ) ), Q2 ); /* q_cna_level */
    2225    12527928 :                     N2 = L_shl( Mpy_32_16_1( scale_fact, rand_gauss_fix( &ftmp, cna_seed ) ), Q2 ); /* q_cna_level */
    2226             : #ifdef OPT_STEREO_32KBPS_V1
    2227    12527928 :                     l_tmp = Madd_32_16( Madd_32_16( N1, N1, g ), N2, gamma ); /* q_cna_level */
    2228    12527928 :                     l_tmp = L_shr( l_tmp, shift );                            /* q_dft */
    2229             : #else                                                                         /* OPT_STEREO_32KBPS_V1 */
    2230             :                     l_tmp = L_add( Madd_32_16( N1, N1, g ), Mpy_32_16_1( N2, gamma ) ); /* q_cna_level */
    2231             :                     l_tmp = L_shr( l_tmp, sub( q_cna_level, hStereoDft->q_dft ) );      /* q_dft */
    2232             : #endif                                                                        /* OPT_STEREO_32KBPS_V1 */
    2233    12527928 :                     DFT_L[2 * i] = L_add( DFT_L[2 * i], l_tmp );              /* q_dft */
    2234    12527928 :                     move32();
    2235             : #ifdef OPT_STEREO_32KBPS_V1
    2236    12527928 :                     l_tmp = Msub_32_16( Msub_32_16( N1, N1, g ), N2, gamma ); /* q_cna_level */
    2237    12527928 :                     l_tmp = L_shr( l_tmp, shift );                            /* q_dft */
    2238    12527928 :                     DFT_R[2 * i] = L_add( DFT_R[2 * i], l_tmp );              /* q_dft */
    2239             : #else                                                                         /* OPT_STEREO_32KBPS_V1 */
    2240             :                     l_tmp = L_sub( Msub_32_16( N1, N1, g ), Mpy_32_16_1( N2, gamma ) ); /* q_cna_level */
    2241             :                     l_tmp = L_shr( l_tmp, sub( q_cna_level, hStereoDft->q_dft ) );      /* q_dft */
    2242             :                     DFT_R[2 * i] = L_add( DFT_R[2 * i], l_tmp );                        /* q_dft */
    2243             : #endif                                                                        /* OPT_STEREO_32KBPS_V1 */
    2244    12527928 :                     move32();
    2245             : 
    2246    12527928 :                     N1 = L_shl( Mpy_32_16_1( scale_fact, rand_gauss_fix( &ftmp, cna_seed ) ), Q2 ); /* q_cna_level */
    2247    12527928 :                     N2 = L_shl( Mpy_32_16_1( scale_fact, rand_gauss_fix( &ftmp, cna_seed ) ), Q2 ); /* q_cna_level */
    2248             : #ifdef OPT_STEREO_32KBPS_V1
    2249    12527928 :                     l_tmp = Madd_32_16( Madd_32_16( N1, N1, g ), N2, gamma ); /* q_cna_level */
    2250    12527928 :                     l_tmp = L_shr( l_tmp, shift );                            /* q_dft */
    2251    12527928 :                     DFT_L[2 * i + 1] = L_add( DFT_L[2 * i + 1], l_tmp );      /* q_dft */
    2252    12527928 :                     move32();
    2253    12527928 :                     l_tmp = Msub_32_16( Msub_32_16( N1, N1, g ), N2, gamma ); /* q_cna_level */
    2254    12527928 :                     l_tmp = L_shr( l_tmp, shift );                            /* q_dft */
    2255    12527928 :                     DFT_R[2 * i + 1] = L_add( DFT_R[2 * i + 1], l_tmp );      /* q_dft */
    2256    12527928 :                     move32();
    2257             : #else  /* OPT_STEREO_32KBPS_V1 */
    2258             :                     l_tmp = L_add( Madd_32_16( N1, N1, g ), Mpy_32_16_1( N2, gamma ) ); /* q_cna_level */
    2259             :                     l_tmp = L_shr( l_tmp, sub( q_cna_level, hStereoDft->q_dft ) );      /* q_dft */
    2260             :                     DFT_L[2 * i + 1] = L_add( DFT_L[2 * i + 1], l_tmp );                /* q_dft */
    2261             :                     move32();
    2262             :                     l_tmp = L_sub( Msub_32_16( N1, N1, g ), Mpy_32_16_1( N2, gamma ) ); /* q_cna_level */
    2263             :                     l_tmp = L_shr( l_tmp, sub( q_cna_level, hStereoDft->q_dft ) );      /* q_dft */
    2264             :                     DFT_R[2 * i + 1] = L_add( DFT_R[2 * i + 1], l_tmp );                /* q_dft */
    2265             :                     move32();
    2266             : #endif /* OPT_STEREO_32KBPS_V1 */
    2267             :                 }
    2268             :             }
    2269             : 
    2270             :             /* update CNA re-scaling factor */
    2271       78792 :             hFdCngDec->cna_rescale_fact_fx = extract_l( L_shr( L_mult0( (Word16) 0x6666, hFdCngDec->cna_act_fact_fx ), Q15 ) ); /* q_cna_act */
    2272       78792 :             move16();
    2273             : 
    2274       78792 :             IF( !hFdCngDec->first_cna_noise_updated )
    2275             :             {
    2276       46762 :                 hFdCngDec->cna_rescale_fact_fx = 0;
    2277       46762 :                 move16();
    2278             :             }
    2279             :         }
    2280             : 
    2281             :         /* Update memories */
    2282       94982 :         hStereoDft->past_DMX_pos = s_and( ( add( hStereoDft->past_DMX_pos, 1 ) ), ( STEREO_DFT_PAST_MAX - 1 ) ); /* Q0 */
    2283       94982 :         move16();
    2284       94982 :         Copy32( pDFT_DMX, hStereoDft->DFT_past_DMX_fx[hStereoDft->past_DMX_pos], s_min( hStereoDft->NFFT, STEREO_DFT32MS_N_32k ) ); /* qDFT */
    2285       94982 :         hStereoDft->q_DFT_past_DMX_fx[hStereoDft->past_DMX_pos] = hStereoDft->q_dft;
    2286       94982 :         move16();
    2287       94982 :         IF( pPredGain )
    2288             :         {
    2289       94982 :             stereo_dft_adapt_sf_delay_fx( hStereoDft, pPredGain );
    2290             :         }
    2291             : 
    2292       94982 :         Copy32( DFT_L, DFT[0] + k * STEREO_DFT32MS_N_MAX, hStereoDft->NFFT ); /* qDFT */
    2293       94982 :         Copy32( DFT_R, DFT[1] + k * STEREO_DFT32MS_N_MAX, hStereoDft->NFFT ); /* qDFT */
    2294             :     }
    2295             : 
    2296       47491 :     IF( st0->bfi && !prev_bfi )
    2297             :     {
    2298             :         Word16 q_shift0;
    2299             :         Word16 q_shift1;
    2300         382 :         idx_k0 = add( hStereoDft->past_DMX_pos, STEREO_DFT_PAST_MAX - 1 ) & ( STEREO_DFT_PAST_MAX - 1 ); /* Q0 */
    2301         382 :         idx_k1 = add( idx_k0, 1 ) & ( STEREO_DFT_PAST_MAX - 1 );
    2302         382 :         q_shift0 = sub( hStereoDft->q_dft, hStereoDft->q_DFT_past_DMX_fx[idx_k0] );
    2303         382 :         q_shift1 = sub( hStereoDft->q_dft, hStereoDft->q_DFT_past_DMX_fx[idx_k1] );
    2304             :         /*dmx energy memory*/
    2305         382 :         hStereoDft->past_dmx_nrg_fx = stereo_dft_dmx_swb_nrg_fx( hStereoDft->DFT_past_DMX_fx[idx_k0], hStereoDft->DFT_past_DMX_fx[idx_k1], s_min( hStereoDft->NFFT, STEREO_DFT32MS_N_32k ), q_shift0, q_shift1 ); /* 2 * q_DFT */
    2306             :     }
    2307             : 
    2308       47491 :     stereo_dft_compute_td_stefi_params_fx( hStereoDft, samp_ratio );
    2309             : 
    2310       47491 :     return;
    2311             : }
    2312             : 
    2313             : /*-------------------------------------------------------------------------
    2314             :  * stereo_dft_compute_td_stefi_params_fx()
    2315             :  *
    2316             :  *
    2317             :  *-------------------------------------------------------------------------*/
    2318             : 
    2319       47491 : static void stereo_dft_compute_td_stefi_params_fx(
    2320             :     STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle    */
    2321             :     const Word16 samp_ratio                /* i  : sampling ratio            Q13*/
    2322             : )
    2323             : {
    2324             :     Word16 pdmx_ind;
    2325             :     Word32 g2;
    2326             :     Word16 bin0;
    2327             :     Word16 band0;
    2328             :     Word16 b;
    2329             :     Word16 nbands;
    2330             :     Word16 bres;
    2331             :     Word32 wsum;
    2332             :     Word32 pred_gain_avg, pred_g;
    2333             :     Word16 shift_g;
    2334             :     Word16 q_pred_gain_avg;
    2335             :     Word32 nrg_DMX, nrg_pred_DMX;
    2336             :     Word32 op1;
    2337             :     Word16 q_div, q_sqrt;
    2338             : 
    2339       47491 :     pdmx_ind = hStereoDft->past_DMX_pos; /* Q0 */
    2340       47491 :     move16();
    2341       47491 :     bres = hStereoDft->band_res[1]; /* Q0 */
    2342       47491 :     move16();
    2343             : 
    2344       47491 :     test();
    2345       47491 :     IF( ( hStereoDft->core_hist[1] != ACELP_CORE ) || hStereoDft->wasTransient )
    2346             :     {
    2347       23218 :         hStereoDft->td_gain_fx[0] = 0;
    2348       23218 :         move32();
    2349       23218 :         hStereoDft->q_td_gain[0] = 0;
    2350       23218 :         move16();
    2351       23218 :         return;
    2352             :     }
    2353             : 
    2354             : #ifdef OPT_STEREO_32KBPS_V1
    2355       24273 :     bin0 = round_fx( L_mult0( hStereoDft->NFFT, samp_ratio ) );
    2356             : #else                                                                  /* OPT_STEREO_32KBPS_V1 */
    2357             :     bin0 = extract_l( L_shr_r( Mpy_32_16_1( (Word32) hStereoDft->NFFT, samp_ratio ), 1 ) ); /* Q0 */
    2358             :     bin0 = shl( bin0, Q3 );
    2359             : #endif                                                                 /* OPT_STEREO_32KBPS_V1 */
    2360       24273 :     bin0 = s_min( bin0, hStereoDft->band_limits[hStereoDft->nbands] ); /* Q0 */
    2361       24273 :     b = hStereoDft->nbands;                                            /* Q0 */
    2362       24273 :     move16();
    2363       75653 :     WHILE( GT_16( hStereoDft->band_limits[b], bin0 ) )
    2364             :     {
    2365       51380 :         b--;
    2366             :     }
    2367       24273 :     band0 = b; /* Q0 */
    2368       24273 :     move16();
    2369             : 
    2370             :     /* calculate averages over high bands */
    2371       24273 :     pred_g = pred_gain_avg = 0;
    2372       24273 :     move32();
    2373       24273 :     move32();
    2374       24273 :     nbands = 0;
    2375       24273 :     move16();
    2376       24273 :     wsum = 0;
    2377       24273 :     move32();
    2378       24273 :     shift_g = sub( Q15, norm_s( sub( hStereoDft->nbands, band0 ) ) );
    2379       74124 :     FOR( b = band0; b < hStereoDft->nbands; b++ )
    2380             :     {
    2381       50509 :         IF( L_min( hStereoDft->past_res_pred_gain_fx[STEFI_DELAY_IND( STEREO_DFT_TD_STEFI_SUBFR_DELAY + 1, pdmx_ind )][b], hStereoDft->past_res_pred_gain_fx[STEFI_DELAY_IND( STEREO_DFT_TD_STEFI_SUBFR_DELAY + 2, pdmx_ind )][b] ) < 0 )
    2382             :         {
    2383         658 :             hStereoDft->td_gain_fx[0] = 0;
    2384         658 :             move32();
    2385         658 :             hStereoDft->q_td_gain[0] = 0;
    2386         658 :             move16();
    2387         658 :             return;
    2388             :         }
    2389       49851 :         pred_g = L_add( pred_g, L_shr( Mpy_32_16_1( L_add( L_shr( hStereoDft->res_pred_gain_fx[b + STEREO_DFT_BAND_MAX], 1 ),
    2390       49851 :                                                            L_shr( hStereoDft->res_pred_gain_fx[b + 2 * STEREO_DFT_BAND_MAX], 1 ) ),
    2391       49851 :                                                     dft_res_pred_weights_fx[bres][b - band0] ),
    2392             :                                        shift_g ) ); /* Q30 - shift_g */
    2393       49851 :         pred_gain_avg = L_add( pred_gain_avg, L_shr( Mpy_32_16_1( L_add( L_shr( hStereoDft->past_res_pred_gain_fx[STEFI_DELAY_IND( STEREO_DFT_TD_STEFI_SUBFR_DELAY + 2, pdmx_ind )][b], 1 ),
    2394       49851 :                                                                          L_shr( hStereoDft->past_res_pred_gain_fx[STEFI_DELAY_IND( STEREO_DFT_TD_STEFI_SUBFR_DELAY + 1, pdmx_ind )][b], 1 ) ),
    2395       49851 :                                                                   dft_res_pred_weights_fx[bres][b - band0] ),
    2396             :                                                      shift_g ) ); /* Q30 - shift_g */
    2397             : 
    2398       49851 :         nbands = add( nbands, 1 );
    2399       49851 :         wsum = L_add( wsum, dft_res_pred_weights_fx[bres][b - band0] );
    2400             : #ifdef DBG_TD_STEFI
    2401             :         printf( "frame: %d\tband: %-2d\tpred_gain1: %f\tpred_gain2: %f\tppg1: %f\tppg2: %f\n", frame, b, hStereoDft->res_pred_gain[b + STEREO_DFT_BAND_MAX], hStereoDft->res_pred_gain[b + 2 * STEREO_DFT_BAND_MAX], hStereoDft->past_res_pred_gain[STEREO_DFT_TD_STEFI_SUBFR_DELAY - 2][b], hStereoDft->past_res_pred_gain[d_short - 1][b] );
    2402             : #endif
    2403             :     }
    2404             : 
    2405       23615 :     IF( nbands == 0 )
    2406             :     {
    2407             :         /* apparently, there is nothing to do here */
    2408        2968 :         hStereoDft->td_gain_fx[0] = 0;
    2409        2968 :         move32();
    2410        2968 :         hStereoDft->q_td_gain[0] = 0;
    2411        2968 :         move16();
    2412        2968 :         return;
    2413             :     }
    2414       20647 :     wsum = L_shl( wsum, sub( Q16, shift_g ) );                    /* Q31 - shift_g */
    2415       20647 :     pred_g = BASOP_Util_Divide3232_Scale( pred_g, wsum, &q_div ); /* q_div */
    2416       20647 :     IF( GT_16( sub( 15, q_div ), 15 ) )
    2417             :     {
    2418        4921 :         pred_g = L_shl( pred_g, q_div );
    2419             :     }
    2420             : 
    2421       20647 :     pred_gain_avg = BASOP_Util_Divide3232_Scale( pred_gain_avg, wsum, &q_div ); /* q_div */
    2422       20647 :     IF( GT_16( sub( 15, q_div ), 15 ) )
    2423             :     {
    2424        4799 :         pred_gain_avg = L_shl( pred_gain_avg, q_div );
    2425        4799 :         q_pred_gain_avg = 15;
    2426        4799 :         move16();
    2427             :     }
    2428             :     ELSE
    2429             :     {
    2430       15848 :         q_pred_gain_avg = sub( 15, q_div );
    2431             :     }
    2432       20647 :     nrg_DMX = hStereoDft->hb_nrg_fx[0];
    2433       20647 :     move32();
    2434       20647 :     nrg_pred_DMX = hStereoDft->hb_nrg_fx[1];
    2435       20647 :     move32();
    2436             : 
    2437       20647 :     op1 = BASOP_Util_Divide3232_Scale( L_add( EPSILON_FIX, nrg_DMX ), L_add( EPSILON_FIX, nrg_pred_DMX ), &q_div ); /* q_div */
    2438       20647 :     q_sqrt = add( Q16, q_div );
    2439       20647 :     op1 = Sqrt32( op1, &q_sqrt );
    2440       20647 :     g2 = Mpy_32_32( pred_g, op1 ); /* q_div + q_sqrt - 31 */
    2441       20647 :     IF( LT_16( q_sqrt, 0 ) )
    2442             :     {
    2443         879 :         g2 = L_shl( g2, q_sqrt );
    2444         879 :         q_sqrt = 0;
    2445         879 :         move16();
    2446             :     }
    2447       19768 :     ELSE IF( q_sqrt != 0 )
    2448             :     {
    2449       11972 :         IF( LT_32( L_shr( pred_gain_avg, q_sqrt ), g2 ) )
    2450             :         {
    2451        7533 :             g2 = pred_gain_avg; /* q_pred_gain_avg */
    2452        7533 :             move32();
    2453             :         }
    2454             :         ELSE
    2455             :         {
    2456        4439 :             g2 = L_min( Mpy_32_16_1( L_shr( pred_gain_avg, q_sqrt ), STEREO_DFT_STEFFI_GAIN_AMP_FX ),
    2457        4439 :                         Madd_32_16( Mpy_32_16_1( L_shr( pred_gain_avg, q_sqrt ), sub( (Word16) 0x7FFF, STEREO_DFT_STEFFI_GAIN_REST_AMT_FX ) ),
    2458             :                                     g2, STEREO_DFT_STEFFI_GAIN_REST_AMT_FX ) ); /* q_pred_gain_avg - q_sqrt */
    2459        4439 :             g2 = L_shl( g2, q_sqrt );                                           /* q_pred_gain_avg */
    2460             :         }
    2461             :     }
    2462             :     ELSE
    2463             :     {
    2464        7796 :         g2 = L_min( Mpy_32_16_1( pred_gain_avg, STEREO_DFT_STEFFI_GAIN_AMP_FX ),
    2465        7796 :                     Madd_32_16( Mpy_32_16_1( pred_gain_avg, sub( (Word16) 0x7FFF, STEREO_DFT_STEFFI_GAIN_REST_AMT_FX ) ),
    2466             :                                 g2, STEREO_DFT_STEFFI_GAIN_REST_AMT_FX ) ); /* q_pred_gain_avg */
    2467             :     }
    2468             : 
    2469       20647 :     hStereoDft->td_gain_fx[0] = L_deposit_h( (Word16) g2 ); /* Q16 + q_pred_gain_avg */
    2470       20647 :     hStereoDft->q_td_gain[0] = add( 16, q_pred_gain_avg );
    2471       20647 :     move32();
    2472       20647 :     move16();
    2473             : 
    2474             : #ifdef DBG_TD_STEFI
    2475             :     printf( "frame: %d\tpred_gain: %f\tpred_gain_avg: %f\tg2_0: %f\tgain: %f\n", frame, pred_gain, pred_gain_avg, g2, hStereoDft->td_gain[0] );
    2476             :     printf( "nrg_DMX: %f\tnrd_pred_DMX: %f\tnbands: %d\tbin0: %d\n", nrg_DMX, nrg_pred_DMX, hStereoDft->nbands, bin0 );
    2477             :     /*printf( "td_gain: %f\n", hStereoDft->td_gain[0] );*/
    2478             : #endif
    2479             : 
    2480       20647 :     return;
    2481             : }
    2482             : 
    2483        4224 : static void stereo_dft_dequantize_ipd_fx(
    2484             :     Word16 *ind,      /* Q0 */
    2485             :     Word32 *out_fx,   /* Q27 */
    2486             :     const Word16 bits /* Q0 */
    2487             : )
    2488             : {
    2489             :     Word16 delta_fx;
    2490        4224 :     IF( EQ_16( bits, 2 ) ) /* 2-bit phase quantization for the highest frequency band only */
    2491             :     {
    2492         271 :         delta_fx = ( EVS_PI_FX ) >> 1; /* Q13 */
    2493         271 :         move16();
    2494             :     }
    2495        3953 :     ELSE IF( EQ_16( bits, 3 ) )
    2496             :     {
    2497           0 :         delta_fx = ( EVS_PI_FX ) >> 2; /* Q13 */
    2498           0 :         move16();
    2499             :     }
    2500        3953 :     ELSE IF( EQ_16( bits, 4 ) )
    2501             :     {
    2502        3953 :         delta_fx = ( EVS_PI_FX ) >> 3; /* Q13 */
    2503        3953 :         move16();
    2504             :     }
    2505             :     ELSE
    2506             :     {
    2507           0 :         delta_fx = ( EVS_PI_FX ) >> 2; /* Q13 */
    2508           0 :         move16();
    2509           0 :         assert( 0 );
    2510             :     }
    2511             : 
    2512        4224 :     *out_fx = L_sub( W_sat_l( W_mult_32_16( L_shl( ind[0], 13 ), delta_fx ) ), EVS_PI_FX_Q27 );
    2513        4224 :     move32();
    2514        4224 :     return;
    2515             : }
    2516             : 
    2517             : /*-------------------------------------------------------------------------
    2518             :  * stereo_dft_generate_res_pred_fx()
    2519             :  *
    2520             :  *
    2521             :  *-------------------------------------------------------------------------*/
    2522       82696 : void stereo_dft_generate_res_pred_fx(
    2523             :     STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle                */
    2524             : #ifdef OPT_STEREO_32KBPS_V1
    2525             :     const Word16 samp_ratio, /* i  : sampling ratio                    Q15*/
    2526             : #else                        /* OPT_STEREO_32KBPS_V1 */
    2527             :     const Word16 samp_ratio, /* i  : sampling ratio                    Q13*/
    2528             : #endif                       /* OPT_STEREO_32KBPS_V1 */
    2529             :     Word32 *pDFT_DMX,        /* i  : downmix signal                   qDFT*/
    2530             :     Word32 *DFT_PRED_RES,    /* o  : residual prediction signal       qDFT*/
    2531             :     Word32 *pPredGain,       /* i  : residual prediction gains         Q31*/
    2532             :     const Word16 k,          /* i  : subframe index                                       Q0*/
    2533             :     Word32 *ap_filt_DMX,     /* i  : enhanced stereo filling signal     qDFT*/
    2534             :     Word16 *stop,            /* o  : last FD stereo filling bin         Q0*/
    2535             :     const Word16 bfi         /* i  : BFI flag                           Q0*/
    2536             : )
    2537             : {
    2538             :     /* general variables */
    2539             :     Word16 i, b;
    2540             :     Word16 begin, end;
    2541             :     Word16 bin0, band0; /* ESF->Stefi crossover bin/band */
    2542             :     Word16 lb_stefi_start_band;
    2543             : 
    2544             :     /* variables for enhanced stereo filling */
    2545             :     Word16 norm_fac, q_norm_fac;
    2546             : #ifndef OPT_STEREO_32KBPS_V1
    2547             :     Word16 lim_norm_fac;
    2548             : #endif /* OPT_STEREO_32KBPS_V1 */
    2549             :     Word16 q_sqrt;
    2550             :     Word16 alpha; // gain_limit;
    2551             : 
    2552             :     /* variables for stereo filling */
    2553             :     Word16 d_long, d_short, d_long_ind, d_short_ind;
    2554             :     Word16 g_short, g_long;
    2555             :     Word32 dmx_nrg, rev_nrg;
    2556             :     Word64 dmx_nrg_64bit, rev_nrg_64bit;
    2557             :     Word16 q_shift, q_com, dmx_nrg_q, rev_nrg_q, q_smoothed_nrg_local[STEREO_DFT_BAND_MAX];
    2558             :     Word32 past_dmx_nrg;
    2559             :     Word32 pred_gain_avg;
    2560             :     Word32 g2;
    2561             :     Word16 nbands_respred;
    2562             : #ifdef OPT_STEREO_32KBPS_V1
    2563             :     Word16 q_new, diff;
    2564             : #else  /* OPT_STEREO_32KBPS_V1 */
    2565             :     q_norm_fac = 0;
    2566             :     move16();
    2567             : #endif /* OPT_STEREO_32KBPS_V1 */
    2568             :     Word16 len;
    2569       82696 :     push_wmops( "gen_respred" );
    2570             : 
    2571             :     /* smoothing and limiting parameters */
    2572             :     // alpha = hStereoDft->wasTransient ? 0 : (Word16) ( 0x199A ); /* no smoothing after transients */
    2573       82696 :     IF( hStereoDft->wasTransient )
    2574             :     {
    2575        2364 :         alpha = 0;
    2576        2364 :         move16();
    2577             :     }
    2578             :     ELSE
    2579             :     {
    2580       80332 :         alpha = (Word16) ( 0x199A ); /* Q15 */
    2581       80332 :         move16();
    2582             :     }
    2583             :     // gain_limit = 0x7FFF; // 2.0 in Q14
    2584             : 
    2585             :     /* residual prediction only used up to 16 kHz (SWB) */
    2586       82696 :     nbands_respred = s_min( hStereoDft->nbands, STEREO_DFT_RES_PRED_BAND_MAX ); /* Q0 */
    2587             : 
    2588             :     /* In ACELP mode the downmix signal is not available in bandwidth extension area. *
    2589             :      * Therefore, the downmix energy in the corresponding subbands is estimated.      */
    2590             : #ifdef OPT_STEREO_32KBPS_V1
    2591       82696 :     bin0 = round_fx( L_mult0( hStereoDft->NFFT, samp_ratio ) );
    2592             : #else                                                                  /* OPT_STEREO_32KBPS_V1 */
    2593             :     bin0 = (Word16) ( L_shr( L_add( L_mult0( hStereoDft->NFFT, samp_ratio ), ONE_IN_Q12 ), Q12 + 1 ) ); /* Q0 */
    2594             :     move16();
    2595             : #endif                                                                 /* OPT_STEREO_32KBPS_V1 */
    2596       82696 :     bin0 = s_min( bin0, hStereoDft->band_limits[hStereoDft->nbands] ); /* Q0 */
    2597       82696 :     b = hStereoDft->nbands;
    2598       82696 :     move16();
    2599      265800 :     WHILE( GE_16( hStereoDft->band_limits[b], bin0 ) )
    2600             :     {
    2601      183104 :         b--;
    2602             :     }
    2603       82696 :     band0 = b;
    2604       82696 :     move16();
    2605             : 
    2606       82696 :     IF( LT_16( hStereoDft->res_pred_mode[k + STEREO_DFT_OFFSET], STEREO_DFT_RESPRED_ESF ) )
    2607             :     {
    2608             :         /* no ESF signal available, use stereo filling over whole spectrum */
    2609       35120 :         lb_stefi_start_band = s_max( hStereoDft->res_pred_band_min, hStereoDft->res_cod_band_max ); /* Q0 */
    2610             :     }
    2611             :     ELSE
    2612             :     {
    2613             :         /* ESF signal available, use ESF in lowband, stereo filling in highband */
    2614       47576 :         lb_stefi_start_band = s_max( band0, hStereoDft->res_cod_band_max ); /* Q0 */
    2615             :     }
    2616             : 
    2617       82696 :     IF( bfi )
    2618             :     {
    2619        1404 :         lb_stefi_start_band = 0;
    2620        1404 :         move16();
    2621             :     }
    2622             : 
    2623             :     /* lowband: use ESF if available, else use stereo filling */
    2624       82696 :     IF( EQ_16( hStereoDft->res_pred_mode[k + STEREO_DFT_OFFSET], STEREO_DFT_RESPRED_ESF ) )
    2625             :     {
    2626             :         /* ESF in lowband */
    2627             :         /* main loop over core region*/
    2628       47576 :         set16_fx( q_smoothed_nrg_local, hStereoDft->q_smoothed_nrg, STEREO_DFT_BAND_MAX );
    2629      385724 :         FOR( b = hStereoDft->res_cod_band_max; b <= band0; b++ )
    2630             :         {
    2631      338148 :             dmx_nrg_64bit = EPSILLON_FX;
    2632      338148 :             move64();
    2633      338148 :             rev_nrg_64bit = EPSILLON_FX;
    2634      338148 :             move64();
    2635             : 
    2636             :             /* calculate band energies (low band only in case of ACELP) */
    2637      338148 :             len = s_min( hStereoDft->band_limits[b + 1], bin0 );
    2638     7010956 :             FOR( i = hStereoDft->band_limits[b]; i < len; i++ )
    2639             :             {
    2640             : #ifdef OPT_STEREO_32KBPS_V1
    2641     6672808 :                 dmx_nrg_64bit = W_mac_32_32( W_mac_32_32( dmx_nrg_64bit, pDFT_DMX[2 * i], pDFT_DMX[2 * i] ),
    2642     6672808 :                                              pDFT_DMX[2 * i + 1], pDFT_DMX[2 * i + 1] ); /* 2 * q_dft + 1 */
    2643     6672808 :                 rev_nrg_64bit = W_mac_32_32( W_mac_32_32( rev_nrg_64bit, ap_filt_DMX[2 * i], ap_filt_DMX[2 * i] ),
    2644     6672808 :                                              ap_filt_DMX[2 * i + 1], ap_filt_DMX[2 * i + 1] ); /* 2 * q_dft + 1 */
    2645             : #else                                                                                          /* OPT_STEREO_32KBPS_V1 */
    2646             :                 dmx_nrg_64bit = W_add( dmx_nrg_64bit,
    2647             :                                        W_add( W_mult0_32_32( pDFT_DMX[2 * i], pDFT_DMX[2 * i] ),
    2648             :                                               W_mult0_32_32( pDFT_DMX[2 * i + 1], pDFT_DMX[2 * i + 1] ) ) ); /* 2 * q_dft */
    2649             :                 rev_nrg_64bit = W_add( rev_nrg_64bit,
    2650             :                                        W_add( W_mult0_32_32( ap_filt_DMX[2 * i], ap_filt_DMX[2 * i] ),
    2651             :                                               W_mult0_32_32( ap_filt_DMX[2 * i + 1], ap_filt_DMX[2 * i + 1] ) ) ); /* 2 * q_dft */
    2652             : #endif                                                                                         /* OPT_STEREO_32KBPS_V1 */
    2653             :             }
    2654             : 
    2655             : #ifdef OPT_STEREO_32KBPS_V1
    2656      338148 :             q_new = add( shl( hStereoDft->q_dft, 1 ), 1 );
    2657      338148 :             q_shift = W_norm( dmx_nrg_64bit );
    2658      338148 :             dmx_nrg = W_shl_sat_l( dmx_nrg_64bit, sub( q_shift, 32 ) ); // 2 * hStereoDft->q_dft + 1 - (q_shift - 32)
    2659      338148 :             dmx_nrg_q = add( q_new, sub( q_shift, 32 ) );
    2660      338148 :             q_shift = W_norm( rev_nrg_64bit );
    2661      338148 :             rev_nrg = W_shl_sat_l( rev_nrg_64bit, sub( q_shift, 32 ) ); // 2 * hStereoDft->q_dft + 1 - (q_shift - 32)
    2662      338148 :             rev_nrg_q = add( q_new, sub( q_shift, 32 ) );
    2663      338148 :             move16();
    2664             : #else  /* OPT_STEREO_32KBPS_V1 */
    2665             :             q_shift = W_norm( dmx_nrg_64bit );
    2666             :             dmx_nrg = W_extract_l( W_shl( dmx_nrg_64bit, sub( q_shift, 32 ) ) ); // 2 * hStereoDft->q_dft + (q_shift - 32)
    2667             :             dmx_nrg_q = add( imult1616( 2, hStereoDft->q_dft ), sub( q_shift, 32 ) );
    2668             :             q_shift = W_norm( rev_nrg_64bit );
    2669             :             rev_nrg = W_extract_l( W_shl( rev_nrg_64bit, sub( q_shift, 32 ) ) ); // 2 * hStereoDft->q_dft + (q_shift - 32)
    2670             :             rev_nrg_q = add( imult1616( 2, hStereoDft->q_dft ), sub( q_shift, 32 ) );
    2671             : #endif /* OPT_STEREO_32KBPS_V1 */
    2672             : 
    2673             :             /* Reach a common Q for dmx_nrg and rev_nrg */
    2674      338148 :             q_com = s_min( dmx_nrg_q, rev_nrg_q );
    2675      338148 :             dmx_nrg = L_shl( dmx_nrg, sub( q_com, dmx_nrg_q ) ); /* q_com */
    2676      338148 :             rev_nrg = L_shl( rev_nrg, sub( q_com, rev_nrg_q ) ); /* q_com */
    2677             : 
    2678             : #ifdef OPT_STEREO_32KBPS_V1
    2679      338148 :             diff = sub( hStereoDft->q_smoothed_nrg, q_com );
    2680      338148 :             IF( diff < 0 )
    2681             : #else  /* OPT_STEREO_32KBPS_V1 */
    2682             :             IF( LT_16( hStereoDft->q_smoothed_nrg, q_com ) )
    2683             : #endif /* OPT_STEREO_32KBPS_V1 */
    2684             :             {
    2685             : #ifdef OPT_STEREO_32KBPS_V1
    2686      114873 :                 rev_nrg = L_shl( rev_nrg, shl( diff, 1 ) );
    2687      114873 :                 dmx_nrg = L_shl( dmx_nrg, shl( diff, 1 ) );
    2688             : #else  /* OPT_STEREO_32KBPS_V1 */
    2689             :                 rev_nrg = L_shr( rev_nrg, shl( sub( q_com, hStereoDft->q_smoothed_nrg ), 1 ) );
    2690             :                 dmx_nrg = L_shr( dmx_nrg, shl( sub( q_com, hStereoDft->q_smoothed_nrg ), 1 ) );
    2691             : #endif /* OPT_STEREO_32KBPS_V1 */
    2692      114873 :                 q_com = hStereoDft->q_smoothed_nrg;
    2693      114873 :                 move16();
    2694             :             }
    2695             : #ifdef OPT_STEREO_32KBPS_V1
    2696             :             ELSE
    2697             : #else  /* OPT_STEREO_32KBPS_V1 */
    2698             :             ELSE IF( GT_16( hStereoDft->q_smoothed_nrg, q_com ) )
    2699             : #endif /* OPT_STEREO_32KBPS_V1 */
    2700             :             {
    2701             : #ifdef OPT_STEREO_32KBPS_V1
    2702      223275 :                 hStereoDft->smooth_res_nrg_fx[b] = L_shr( hStereoDft->smooth_res_nrg_fx[b], shl( diff, 1 ) ); /* hStereoDft->q_smoothed_nrg */
    2703      223275 :                 move32();
    2704      223275 :                 hStereoDft->smooth_dmx_nrg_fx[b] = L_shr( hStereoDft->smooth_dmx_nrg_fx[b], shl( diff, 1 ) ); /* hStereoDft->q_smoothed_nrg */
    2705      223275 :                 move32();
    2706             : #else  /* OPT_STEREO_32KBPS_V1 */
    2707             :                 hStereoDft->smooth_res_nrg_fx[b] = L_shr( hStereoDft->smooth_res_nrg_fx[b], shl( sub( hStereoDft->q_smoothed_nrg, q_com ), 1 ) ); /* hStereoDft->q_smoothed_nrg */
    2708             :                 move32();
    2709             :                 hStereoDft->smooth_dmx_nrg_fx[b] = L_shr( hStereoDft->smooth_dmx_nrg_fx[b], shl( sub( hStereoDft->q_smoothed_nrg, q_com ), 1 ) ); /* hStereoDft->q_smoothed_nrg */
    2710             :                 move32();
    2711             : #endif /* OPT_STEREO_32KBPS_V1 */
    2712      223275 :                 q_smoothed_nrg_local[b] = q_com;
    2713      223275 :                 move16();
    2714             :             }
    2715             :             /* smoothing */
    2716      338148 :             hStereoDft->smooth_res_nrg_fx[b] = Madd_32_16( Mpy_32_16_1( hStereoDft->smooth_res_nrg_fx[b], alpha ), rev_nrg, sub( (Word16) ( 0x7FFF ), alpha ) ); /* hStereoDft->q_smoothed_nrg */
    2717      338148 :             move32();
    2718      338148 :             hStereoDft->smooth_dmx_nrg_fx[b] = Madd_32_16( Mpy_32_16_1( hStereoDft->smooth_dmx_nrg_fx[b], alpha ), dmx_nrg, sub( (Word16) ( 0x7FFF ), alpha ) ); /* hStereoDft->q_smoothed_nrg */
    2719      338148 :             move32();
    2720             : 
    2721             : #ifdef OPT_STEREO_32KBPS_V1
    2722             :             // Compute norm_fac in Q14
    2723      338148 :             norm_fac = MAX_16;
    2724      338148 :             move16();
    2725             : #endif /* OPT_STEREO_32KBPS_V1 */
    2726             :             /* normalization factor */
    2727      338148 :             IF( hStereoDft->smooth_res_nrg_fx[b] != 0 )
    2728             :             {
    2729             : #ifdef OPT_STEREO_32KBPS_V1
    2730      333895 :                 norm_fac = 0;
    2731      333895 :                 move16();
    2732      333895 :                 IF( hStereoDft->smooth_dmx_nrg_fx[b] != 0 )
    2733             :                 {
    2734             :                     Word16 quo, quo_e;
    2735             :                     Word32 prod;
    2736             : 
    2737      333033 :                     norm_fac = BASOP_Util_Divide3232_Scale( hStereoDft->smooth_dmx_nrg_fx[b], hStereoDft->smooth_res_nrg_fx[b], &q_norm_fac ); /* q_norm_fac */
    2738      333033 :                     norm_fac = Sqrt16( norm_fac, &q_norm_fac );
    2739             : 
    2740      333033 :                     quo = BASOP_Util_Divide1616_Scale( 32767, norm_fac, &quo_e ); /* q_norm_fac */
    2741      333033 :                     quo_e = sub( quo_e, q_norm_fac );
    2742      333033 :                     quo = shl_sat( quo, sub( quo_e, 1 ) ); // Q14
    2743      333033 :                     quo = s_max( 13107 /*0.8 in Q14 */, quo );
    2744      333033 :                     quo = s_min( quo, 20480 /* 1.25 in Q14*/ );
    2745             : 
    2746      333033 :                     prod = L_mult( norm_fac, quo ); // exp:q_norm_fac+1
    2747             :                     // Bring to Q30
    2748      333033 :                     prod = L_shl_sat( prod, q_norm_fac );
    2749             : 
    2750      333033 :                     norm_fac = extract_h( prod );
    2751             :                 }
    2752             : #else  /* OPT_STEREO_32KBPS_V1 */
    2753             :                 norm_fac = BASOP_Util_Divide3232_Scale( hStereoDft->smooth_dmx_nrg_fx[b], hStereoDft->smooth_res_nrg_fx[b], &q_norm_fac ); /* q_norm_fac */
    2754             :                 norm_fac = Sqrt16( norm_fac, &q_norm_fac );
    2755             :                 IF( norm_fac != 0 )
    2756             :                 {
    2757             :                     /* gain compressor */
    2758             :                     test();
    2759             :                     test();
    2760             :                     test();
    2761             :                     test();
    2762             :                     test();
    2763             :                     test();
    2764             :                     test();
    2765             :                     test();
    2766             :                     IF( LE_16( q_norm_fac, -Q1 ) || ( EQ_16( q_norm_fac, Q1 ) && GT_16( (Word16) 0x3333, norm_fac ) ) || ( ( q_norm_fac == 0 ) && GT_16( (Word16) 0x6666, norm_fac ) ) )
    2767             :                     {
    2768             :                         lim_norm_fac = (Word16) 0x5000;
    2769             :                         move16();
    2770             :                     }
    2771             :                     ELSE IF( GT_16( q_norm_fac, Q1 ) || ( EQ_16( q_norm_fac, Q1 ) && LT_16( (Word16) 0x5000, norm_fac ) ) || ( ( q_norm_fac == 0 ) && GT_16( (Word16) 0x6666, norm_fac ) ) )
    2772             :                     {
    2773             :                         lim_norm_fac = (Word16) 0x3333;
    2774             :                         move16();
    2775             :                     }
    2776             :                     ELSE
    2777             :                     {
    2778             :                         lim_norm_fac = norm_fac;
    2779             :                         move16();
    2780             :                     }
    2781             :                     IF( EQ_16( lim_norm_fac, norm_fac ) )
    2782             :                     {
    2783             :                         norm_fac = ONE_IN_Q14;
    2784             :                         move16();
    2785             :                         q_norm_fac = Q1;
    2786             :                         move16();
    2787             :                     }
    2788             :                     ELSE
    2789             :                     {
    2790             :                         norm_fac = extract_l( L_shr( L_mult0( norm_fac, lim_norm_fac ), Q15 ) ); /* q_norm_fac */
    2791             :                         q_norm_fac = add( q_norm_fac, 1 );
    2792             :                         test();
    2793             :                         IF( q_norm_fac < 0 )
    2794             :                         {
    2795             :                             norm_fac = shl( norm_fac, q_norm_fac );
    2796             :                             q_norm_fac = 0;
    2797             :                             move16();
    2798             :                         }
    2799             :                         ELSE IF( GT_16( q_norm_fac, 2 ) && LT_16( norm_s( norm_fac ), sub( q_norm_fac, Q1 ) ) )
    2800             :                         {
    2801             :                             norm_fac = MAX_16;
    2802             :                             move16();
    2803             :                             q_norm_fac = Q1;
    2804             :                             move16();
    2805             :                         }
    2806             :                     }
    2807             :                 }
    2808             : #endif /* OPT_STEREO_32KBPS_V1 */
    2809             :             }
    2810             : #ifndef OPT_STEREO_32KBPS_V1
    2811             :             ELSE
    2812             :             {
    2813             :                 norm_fac = MAX_16;
    2814             :                 move16();
    2815             :                 q_norm_fac = Q1;
    2816             :                 move16();
    2817             :             }
    2818             : #endif /* OPT_STEREO_32KBPS_V1 */
    2819             : 
    2820      338148 :             len = s_min( hStereoDft->band_limits[b + 1], bin0 );
    2821     7010956 :             FOR( i = hStereoDft->band_limits[b]; i < len; i++ )
    2822             :             {
    2823             : #ifdef OPT_STEREO_32KBPS_V1
    2824     6672808 :                 DFT_PRED_RES[2 * i] = L_shl( Mpy_32_32( Mpy_32_16_1( pPredGain[b], norm_fac ), ap_filt_DMX[2 * i] ), 1 ); /* q_dft */
    2825     6672808 :                 move32();
    2826     6672808 :                 DFT_PRED_RES[2 * i + 1] = L_shl( Mpy_32_32( Mpy_32_16_1( pPredGain[b], norm_fac ), ap_filt_DMX[2 * i + 1] ), 1 ); /* q_dft */
    2827     6672808 :                 move32();
    2828             : #else  /* OPT_STEREO_32KBPS_V1 */
    2829             :                 DFT_PRED_RES[2 * i] = L_shl( Mpy_32_32( Mpy_32_16_1( pPredGain[b], norm_fac ), ap_filt_DMX[2 * i] ), q_norm_fac ); /* q_dft */
    2830             :                 move32();
    2831             :                 DFT_PRED_RES[2 * i + 1] = L_shl( Mpy_32_32( Mpy_32_16_1( pPredGain[b], norm_fac ), ap_filt_DMX[2 * i + 1] ), q_norm_fac ); /* q_dft */
    2832             :                 move32();
    2833             : #endif /* OPT_STEREO_32KBPS_V1 */
    2834             :             }
    2835             :         }
    2836             : 
    2837             :         /* Reach a common Q for all the bands */
    2838       47576 :         q_com = Q31;
    2839       47576 :         move16();
    2840      666064 :         FOR( b = 0; b < STEREO_DFT_BAND_MAX; b++ )
    2841             :         {
    2842      618488 :             q_com = s_min( q_com, q_smoothed_nrg_local[b] );
    2843             :         }
    2844      666064 :         FOR( b = 0; b < STEREO_DFT_BAND_MAX; b++ )
    2845             :         {
    2846      618488 :             hStereoDft->smooth_dmx_nrg_fx[b] = L_shl( hStereoDft->smooth_dmx_nrg_fx[b], sub( q_com, q_smoothed_nrg_local[b] ) ); /* q_com */
    2847      618488 :             move32();
    2848             : 
    2849      618488 :             hStereoDft->smooth_res_nrg_fx[b] = L_shl( hStereoDft->smooth_res_nrg_fx[b], sub( q_com, q_smoothed_nrg_local[b] ) ); /* q_com */
    2850      618488 :             move32();
    2851             :         }
    2852       47576 :         IF( GT_16( q_com, hStereoDft->q_dft ) )
    2853             :         {
    2854          31 :             scale_sig32( hStereoDft->smooth_dmx_nrg_fx, STEREO_DFT_BAND_MAX, sub( hStereoDft->q_dft, q_com ) ); /* q_dft */
    2855          31 :             scale_sig32( hStereoDft->smooth_res_nrg_fx, STEREO_DFT_BAND_MAX, sub( hStereoDft->q_dft, q_com ) ); /* q_dft */
    2856          31 :             hStereoDft->q_smoothed_nrg = hStereoDft->q_dft;
    2857          31 :             move16();
    2858             :         }
    2859             :     }
    2860       35120 :     ELSE IF( EQ_16( hStereoDft->res_pred_mode[k + STEREO_DFT_OFFSET], STEREO_DFT_RESPRED_STEFI ) )
    2861             :     {
    2862             :         /* stefi in lowband */
    2863       24180 :         set32_fx( DFT_PRED_RES, 0, shl( hStereoDft->band_limits[lb_stefi_start_band], 1 ) );
    2864             : 
    2865      148410 :         FOR( b = lb_stefi_start_band; b <= band0; b++ )
    2866             :         {
    2867             :             Word16 temp, temp_e;
    2868      124230 :             d_short_ind = add( sub( STEREO_DFT_PAST_MAX, STEREO_DFT_STEFFI_DELAY_SHORT ), b & 1 ); /* Q0 */
    2869      124230 :             temp = BASOP_Util_Divide1616_Scale( b, sub( hStereoDft->nbands, 1 ), &temp_e );        /*(float) b / ( hStereoDft->nbands - 1 )*/
    2870      124230 :             IF( temp_e < 0 )
    2871             :             {
    2872        2270 :                 temp = shl( temp, temp_e );
    2873        2270 :                 temp_e = 0;
    2874        2270 :                 move16();
    2875             :             }
    2876      124230 :             temp = shr( temp, 3 ); /*adding 3 as guard bit*/
    2877      124230 :             temp_e = add( temp_e, 3 );
    2878      124230 :             temp = shr( add( imult1616( ( STEREO_DFT_PAST_MAX + 4 - 1 ), temp ), shl( 1, sub( 14, temp_e ) ) ), sub( 15, temp_e ) ); /*( (float) b / ( hStereoDft->nbands - 1 ) ) + 0.5f*/ /*Q0*/
    2879      124230 :             d_long_ind = sub( s_max( 4, temp ), 4 );
    2880             :             /* make sure d_short really corresponds to a shorter or equally long delay than d_long (e.g. not always the case for
    2881             :              * STEREO_DFT_STEFFI_DELAY_SHORT=3 and STEREO_DFT_STEFFI_DELAY_LONG=4)*/
    2882      124230 :             d_short_ind = s_max( d_short_ind, d_long_ind );
    2883      124230 :             move16();
    2884             : 
    2885             :             /* Even number of window sliding (assymmetric OLA) */
    2886      124230 :             d_short_ind = shl( shr( d_short_ind, 1 ), 1 ); /* Q0 */
    2887      124230 :             d_long_ind = shl( shr( d_long_ind, 1 ), 1 );   /* Q0 */
    2888             : 
    2889      124230 :             d_short = sub( STEREO_DFT_PAST_MAX, d_short_ind ); /* Q0 */
    2890      124230 :             d_long = sub( STEREO_DFT_PAST_MAX, d_long_ind );   /* Q0 */
    2891             : 
    2892      124230 :             d_short_ind = add( add( d_short_ind, hStereoDft->past_DMX_pos ), 1 ) % STEREO_DFT_PAST_MAX; /* Q0 */
    2893      124230 :             move16();
    2894      124230 :             d_long_ind = add( add( d_long_ind, hStereoDft->past_DMX_pos ), 1 ) % STEREO_DFT_PAST_MAX; /* Q0 */
    2895      124230 :             move16();
    2896             : 
    2897      124230 :             g_short = hStereoDft->stefi_short_gain_fx; /* Q15 */
    2898      124230 :             move16();
    2899      124230 :             g_long = hStereoDft->stefi_long_gain_fx; /* Q15 */
    2900      124230 :             move16();
    2901             : 
    2902             :             /* change mixing ratio if long and short delay are the same */
    2903      124230 :             IF( EQ_16( d_short, d_long ) )
    2904             :             {
    2905       20614 :                 g_short = MAX_16;
    2906       20614 :                 move16();
    2907       20614 :                 g_long = 0;
    2908       20614 :                 move16();
    2909             :             }
    2910             : 
    2911             :             /* Avoid transient components */
    2912      124230 :             test();
    2913      124230 :             IF( EQ_32( hStereoDft->past_res_pred_gain_fx[d_short_ind][b], EVS_LW_MIN ) && EQ_32( hStereoDft->past_res_pred_gain_fx[d_long_ind][b], EVS_LW_MIN ) )
    2914             :             {
    2915        4884 :                 g_long = 0;
    2916        4884 :                 move16();
    2917        4884 :                 g_short = 0;
    2918        4884 :                 move16();
    2919             :             }
    2920      119346 :             ELSE IF( EQ_32( hStereoDft->past_res_pred_gain_fx[d_short_ind][b], EVS_LW_MIN ) )
    2921             :             {
    2922        3004 :                 g_long = MAX_16;
    2923        3004 :                 move16();
    2924        3004 :                 g_short = 0;
    2925        3004 :                 move16();
    2926             :             }
    2927      116342 :             ELSE IF( EQ_32( hStereoDft->past_res_pred_gain_fx[d_long_ind][b], EVS_LW_MIN ) )
    2928             :             {
    2929        2944 :                 g_long = 0;
    2930        2944 :                 move16();
    2931        2944 :                 g_short = MAX_16;
    2932        2944 :                 move16();
    2933             :             }
    2934             : 
    2935      124230 :             IF( s_max( g_short, g_long ) > 0 )
    2936             :             {
    2937      119346 :                 Word16 q_shift0 = sub( hStereoDft->q_dft, hStereoDft->q_DFT_past_DMX_fx[d_short_ind] );
    2938      119346 :                 Word16 q_shift1 = sub( hStereoDft->q_dft, hStereoDft->q_DFT_past_DMX_fx[d_long_ind] );
    2939      119346 :                 past_dmx_nrg = EPSILON_FIX;
    2940      119346 :                 move32();
    2941      119346 :                 dmx_nrg = EPSILON_FIX;
    2942      119346 :                 move32();
    2943      119346 :                 len = s_min( bin0, hStereoDft->band_limits[b + 1] );
    2944     3308318 :                 FOR( i = hStereoDft->band_limits[b]; i < len; i++ )
    2945             :                 {
    2946     3188972 :                     dmx_nrg = Madd_32_32( Madd_32_32( dmx_nrg, pDFT_DMX[2 * i], pDFT_DMX[2 * i] ), pDFT_DMX[2 * i + 1], pDFT_DMX[2 * i + 1] ); /* 2 * q_dft - 31 */
    2947             : 
    2948     3188972 :                     DFT_PRED_RES[2 * i] = L_add( L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i], g_short ), q_shift0 ), L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_long_ind][2 * i], g_long ), q_shift1 ) ); /* q_dft */
    2949     3188972 :                     move32();
    2950     3188972 :                     DFT_PRED_RES[2 * i + 1] = L_add( L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i + 1], g_short ), q_shift0 ), L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_long_ind][2 * i + 1], g_long ), q_shift1 ) ); /* q_dft */
    2951     3188972 :                     move32();
    2952     3188972 :                     past_dmx_nrg = Madd_32_32( Madd_32_32( past_dmx_nrg, DFT_PRED_RES[2 * i], DFT_PRED_RES[2 * i] ), DFT_PRED_RES[2 * i + 1], DFT_PRED_RES[2 * i + 1] ); /* q_dft */
    2953             :                 }
    2954      119346 :                 test();
    2955      119346 :                 IF( !bfi || GE_16( b, hStereoDft->res_cod_band_max ) )
    2956             :                 {
    2957             :                     Word16 q_div;
    2958             :                     Word16 op;
    2959      114656 :                     op = BASOP_Util_Divide3232_Scale( L_add( 1, dmx_nrg ), L_add( 1, past_dmx_nrg ), &q_div ); /* q_sqrt */
    2960      114656 :                     q_sqrt = q_div;
    2961      114656 :                     move16();
    2962      114656 :                     norm_fac = Sqrt16( op, &q_sqrt );
    2963      114656 :                     g2 = Mpy_32_16_1( pPredGain[b], norm_fac ); /* Q31 */
    2964      114656 :                     IF( LE_32( q_sqrt, norm_l( g2 ) ) )
    2965             :                     {
    2966      103092 :                         g2 = L_shl( g2, q_sqrt );
    2967      103092 :                         pred_gain_avg = Madd_32_16( Mpy_32_16_1( hStereoDft->past_res_pred_gain_fx[d_short_ind][b], g_short ),
    2968             :                                                     hStereoDft->past_res_pred_gain_fx[d_long_ind][b], g_long ); /* Q31 */
    2969             : 
    2970      103092 :                         g2 = L_min( Mpy_32_16_1( pred_gain_avg, STEREO_DFT_STEFFI_GAIN_AMP_FX ),
    2971      103092 :                                     Madd_32_16( Mpy_32_16_1( pred_gain_avg, sub( MAX_16, STEREO_DFT_STEFFI_GAIN_REST_AMT_FX ) ),
    2972             :                                                 g2, STEREO_DFT_STEFFI_GAIN_REST_AMT_FX ) ); /* Q31 */
    2973      103092 :                         q_sqrt = 0;
    2974      103092 :                         move16();
    2975             :                     }
    2976             :                     ELSE
    2977             :                     {
    2978             :                         /* Multiplication with STEREO_DFT_STEFFI_GAIN_AMP_FX is avodided since the float value of
    2979             :                            this constant is 1.0f */
    2980       11564 :                         g2 = Madd_32_16( Mpy_32_16_1( hStereoDft->past_res_pred_gain_fx[d_short_ind][b], g_short ),
    2981             :                                          hStereoDft->past_res_pred_gain_fx[d_long_ind][b], g_long ); /* Q31 */
    2982       11564 :                         q_sqrt = 0;
    2983       11564 :                         move16();
    2984             :                     }
    2985      114656 :                     len = s_min( bin0, hStereoDft->band_limits[b + 1] );
    2986     3285140 :                     FOR( i = hStereoDft->band_limits[b]; i < len; i++ )
    2987             :                     {
    2988     3170484 :                         DFT_PRED_RES[2 * i] = L_shl( Mpy_32_32( g2, DFT_PRED_RES[2 * i] ), q_sqrt ); /* q_dft */
    2989     3170484 :                         move32();
    2990     3170484 :                         DFT_PRED_RES[2 * i + 1] = L_shl( Mpy_32_32( g2, DFT_PRED_RES[2 * i + 1] ), q_sqrt ); /* q_dft */
    2991     3170484 :                         move32();
    2992             :                     }
    2993             :                 }
    2994             :             }
    2995             :             ELSE
    2996             :             {
    2997        4884 :                 set32_fx( DFT_PRED_RES + shl( hStereoDft->band_limits[b], 1 ), 0, shl( sub( s_min( bin0, hStereoDft->band_limits[b + 1] ), hStereoDft->band_limits[b] ), 1 ) );
    2998             :             }
    2999             :         }
    3000             :     }
    3001             : 
    3002       82696 :     IF( GT_16( hStereoDft->band_limits[nbands_respred], bin0 ) )
    3003             :     {
    3004             :         /* apply stereo filling in ACELP BWE region */
    3005       71954 :         test();
    3006       71954 :         IF( ( hStereoDft->core_hist[0] == ACELP_CORE ) && ( hStereoDft->core_hist[STEREO_DFT_STEFFI_DELAY_SHORT / 2] == ACELP_CORE ) )
    3007             :         {
    3008             :             /* ACELP -> ACELP: nothing to do */
    3009       42262 :             *stop = bin0;
    3010       42262 :             move16();
    3011             :         }
    3012       29692 :         ELSE IF( hStereoDft->core_hist[STEREO_DFT_STEFFI_DELAY_SHORT / 2] == ACELP_CORE )
    3013             :         {
    3014             :             /* ACELP -> TCX/HQ core transition */
    3015             :             /* calculate high band energy only */
    3016        1990 :             dmx_nrg = EPSILON_FIX;
    3017        1990 :             move32();
    3018      454918 :             FOR( i = bin0; i < hStereoDft->NFFT / 2; i++ )
    3019             :             {
    3020      452928 :                 dmx_nrg = L_add( dmx_nrg, Madd_32_32( Mpy_32_32( pDFT_DMX[2 * i], pDFT_DMX[2 * i] ), pDFT_DMX[2 * i + 1], pDFT_DMX[2 * i + 1] ) ); /* 2 * q_dft - 31 */
    3021             :             }
    3022             : 
    3023        1990 :             hStereoDft->hb_nrg_fx[0] = L_add( hStereoDft->hb_nrg_fx[0], div_l( dmx_nrg, shr( hStereoDft->NFFT, 2 ) ) ); /* Q15 */
    3024        1990 :             move32();
    3025        1990 :             *stop = bin0;
    3026        1990 :             move16();
    3027             :         }
    3028       27702 :         ELSE IF( hStereoDft->core_hist[0] == ACELP_CORE )
    3029             :         {
    3030             :             /* TCX/HQ core -> ACELP transition */
    3031             :             /* apply short delay only and blend to long/short gain */
    3032        1496 :             dmx_nrg = hStereoDft->hb_nrg_subr_fx[k]; /* Q15 */
    3033        1496 :             move32();
    3034        1496 :             d_short_ind = STEREO_DFT_PAST_MAX - STEREO_DFT_TD_STEFI_SUBFR_DELAY;
    3035        1496 :             move16();
    3036             : 
    3037        1496 :             d_short_ind = s_and( add( d_short_ind, add( hStereoDft->past_DMX_pos, 1 ) ), ( STEREO_DFT_PAST_MAX - 1 ) ); /* Q0 */
    3038             : 
    3039             :             /* calculate high band energy of past dmx */
    3040             :             // past_dmx_nrg = EPSILON_FIX;
    3041        1496 :             past_dmx_nrg = 0;
    3042        1496 :             move32();
    3043        1496 :             len = s_min( shr( hStereoDft->NFFT, 1 ), ( STEREO_DFT32MS_N_32k >> 1 ) );
    3044      220768 :             FOR( i = bin0; i < len; i++ ) // i < min( ( hStereoDft->NFFT / 2 ), ( hStereoDft->NFFT / 2 ) )
    3045             :             {
    3046      219272 :                 past_dmx_nrg = L_add( past_dmx_nrg, Madd_32_32( Mpy_32_32( hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i], hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i] ), hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i + 1], hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i + 1] ) ); /* 2 * hStereoDft->q_DFT_past_DMX_fx[d_short_ind] - 31 */
    3047             :             }
    3048        1496 :             past_dmx_nrg = L_shl( past_dmx_nrg, shl( sub( hStereoDft->q_dft, hStereoDft->q_DFT_past_DMX_fx[d_short_ind] ), 1 ) ); /* 2 * hStereoDft->q_dft - 31*/
    3049        1496 :             IF( past_dmx_nrg == 0 )
    3050             :             {
    3051        1065 :                 past_dmx_nrg = EPSILON_FX;
    3052        1065 :                 move32();
    3053             :             }
    3054             : 
    3055        5168 :             FOR( b = band0; b < nbands_respred; b++ )
    3056             :             {
    3057             :                 // g_short = LT_32( hStereoDft->past_res_pred_gain_fx[d_short_ind][b], 0 ) ? 0 : add( ONE_IN_Q14, shr( hStereoDft->stefi_short_gain_fx, 1 ) );
    3058        3672 :                 IF( hStereoDft->past_res_pred_gain_fx[d_short_ind][b] < 0 )
    3059             :                 {
    3060         162 :                     g_short = 0;
    3061         162 :                     move16();
    3062             :                 }
    3063             :                 ELSE
    3064             :                 {
    3065        3510 :                     g_short = add( ONE_IN_Q14, shr( hStereoDft->stefi_short_gain_fx, 1 ) );
    3066             :                 }
    3067             : 
    3068        3672 :                 IF( g_short > 0 )
    3069             :                 {
    3070             :                     Word16 q_divide;
    3071        3510 :                     Word32 op = BASOP_Util_Divide3232_Scale( L_add( EPSILON_FIX, dmx_nrg ), L_add( EPSILON_FIX, past_dmx_nrg ), &q_divide );
    3072        3510 :                     q_norm_fac = add( add( Q16, q_divide ), hStereoDft->q_hb_nrg_subr );
    3073        3510 :                     op = Sqrt32( op, &q_norm_fac );
    3074        3510 :                     g2 = Mpy_32_32( pPredGain[b], op );                                                        /* Q31 */
    3075        3510 :                     pred_gain_avg = Mpy_32_16_1( hStereoDft->past_res_pred_gain_fx[d_short_ind][b], g_short ); /* Q31 */
    3076        3510 :                     IF( q_norm_fac < 0 )
    3077             :                     {
    3078        2597 :                         g2 = L_shl( g2, q_norm_fac );
    3079        2597 :                         q_norm_fac = 0;
    3080        2597 :                         move16();
    3081             :                     }
    3082         913 :                     ELSE IF( q_norm_fac != 0 )
    3083             :                     {
    3084         672 :                         IF( LT_32( L_shr( pred_gain_avg, q_norm_fac ), g2 ) )
    3085             :                         {
    3086         575 :                             g2 = pred_gain_avg;
    3087         575 :                             move32();
    3088             :                         }
    3089             :                         ELSE
    3090             :                         {
    3091          97 :                             g2 = L_min( Mpy_32_16_1( L_shr( pred_gain_avg, q_norm_fac ), STEREO_DFT_STEFFI_GAIN_AMP_FX ),
    3092          97 :                                         Madd_32_16( Mpy_32_16_1( L_shr( pred_gain_avg, q_norm_fac ), sub( (Word16) 0x7FFF, STEREO_DFT_STEFFI_GAIN_REST_AMT_FX ) ),
    3093             :                                                     g2, STEREO_DFT_STEFFI_GAIN_REST_AMT_FX ) ); /* Q31 - q_norm_fac */
    3094          97 :                             g2 = L_shl( g2, q_norm_fac );                                       /* Q31 */
    3095             :                         }
    3096             :                     }
    3097             :                     ELSE
    3098             :                     {
    3099         241 :                         g2 = L_min( Mpy_32_16_1( pred_gain_avg, STEREO_DFT_STEFFI_GAIN_AMP_FX ),
    3100         241 :                                     Madd_32_16( Mpy_32_16_1( pred_gain_avg, sub( (Word16) 0x7FFF, STEREO_DFT_STEFFI_GAIN_REST_AMT_FX ) ),
    3101             :                                                 g2, STEREO_DFT_STEFFI_GAIN_REST_AMT_FX ) ); /* Q31 */
    3102             :                     }
    3103        3510 :                     q_shift = sub( hStereoDft->q_dft, hStereoDft->q_DFT_past_DMX_fx[d_short_ind] );
    3104        3510 :                     move16();
    3105        3510 :                     len = s_min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k >> 1 );
    3106      209660 :                     FOR( i = s_max( hStereoDft->band_limits[b], bin0 ); i < len; i++ ) // i < min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k / 2 )
    3107             :                     {
    3108      206150 :                         DFT_PRED_RES[2 * i] = L_shl( Mpy_32_32( g2, hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i] ), q_shift ); /* q_dft */
    3109      206150 :                         move32();
    3110      206150 :                         DFT_PRED_RES[2 * i + 1] = L_shl( Mpy_32_32( g2, hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i + 1] ), q_shift ); /* q_dft */
    3111      206150 :                         move32();
    3112             :                     }
    3113             :                 }
    3114             :                 ELSE
    3115             :                 {
    3116         162 :                     begin = s_max( hStereoDft->band_limits[b], bin0 );                       /* Q0 */
    3117         162 :                     end = s_min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k / 2 ); /* Q0 */
    3118         162 :                     set32_fx( DFT_PRED_RES + shl( begin, 1 ), 0, shl( sub( end, begin ), 1 ) );
    3119             :                 }
    3120             :             }
    3121             :         }
    3122             :         ELSE
    3123             :         {
    3124       85286 :             FOR( b = band0; b < nbands_respred; b++ )
    3125             :             {
    3126             :                 /* TCX/HQ core -> TCX/HQ core: business as usual */
    3127       59080 :                 d_short_ind = add( sub( STEREO_DFT_PAST_MAX, STEREO_DFT_STEFFI_DELAY_SHORT ), b & 1 ); /* Q0 */
    3128             :                 Word16 temp, temp_e;
    3129       59080 :                 temp = BASOP_Util_Divide1616_Scale( b, sub( hStereoDft->nbands, 1 ), &temp_e ); /*(float) b / ( hStereoDft->nbands - 1 )*/
    3130       59080 :                 IF( temp_e < 0 )
    3131             :                 {
    3132           0 :                     temp = shl( temp, temp_e );
    3133           0 :                     temp_e = 0;
    3134           0 :                     move16();
    3135             :                 }
    3136       59080 :                 temp = shr( temp, 3 ); /*adding 3 as guard bit*/
    3137       59080 :                 temp_e = add( temp_e, 3 );
    3138       59080 :                 temp = shr( add( imult1616( ( STEREO_DFT_PAST_MAX + 4 - 1 ), temp ), shl( 1, sub( 14, temp_e ) ) ), sub( 15, temp_e ) ); /*( (float) b / ( hStereoDft->nbands - 1 ) ) + 0.5f*/ /*Q0*/
    3139       59080 :                 d_long_ind = sub( s_max( 4, temp ), 4 );                                                                                                                                       /* Q0 */
    3140             :                 /* make sure d_short really corresponds to a shorter or equally long delay than d_long (e.g. not always the case for
    3141             :                  * STEREO_DFT_STEFFI_DELAY_SHORT=3 and STEREO_DFT_STEFFI_DELAY_LONG=4)*/
    3142       59080 :                 d_short_ind = s_max( d_short_ind, d_long_ind ); /* Q0 */
    3143             : 
    3144             :                 /* Even number of window sliding (assymmetric OLA) */
    3145       59080 :                 d_short_ind = d_short_ind & (Word16) ( 0xFFFE ); /* Q0 */
    3146       59080 :                 move16();
    3147       59080 :                 d_long_ind = d_long_ind & (Word16) ( 0xFFFE ); /* Q0 */
    3148       59080 :                 move16();
    3149             : 
    3150       59080 :                 d_short = sub( STEREO_DFT_PAST_MAX, d_short_ind ); /* Q0 */
    3151       59080 :                 move16();
    3152       59080 :                 d_long = sub( STEREO_DFT_PAST_MAX, d_long_ind ); /* Q0 */
    3153       59080 :                 move16();
    3154             : 
    3155             :                 /* Works as long as STEREO_DFT_PAST_MAX is a power of 2*/
    3156       59080 :                 d_short_ind = ( add( d_short_ind, add( hStereoDft->past_DMX_pos, 1 ) ) ) & ( STEREO_DFT_PAST_MAX - 1 ); /* Q0 */
    3157       59080 :                 move16();
    3158       59080 :                 d_long_ind = ( add( d_long_ind, add( hStereoDft->past_DMX_pos, 1 ) ) ) & ( STEREO_DFT_PAST_MAX - 1 ); /* Q0 */
    3159       59080 :                 move16();
    3160             : 
    3161       59080 :                 g_short = hStereoDft->stefi_short_gain_fx; /* Q15 */
    3162       59080 :                 move16();
    3163       59080 :                 g_long = hStereoDft->stefi_long_gain_fx; /* Q15 */
    3164       59080 :                 move16();
    3165             : 
    3166             :                 /* change mixing ratio if long and short delay are the same */
    3167       59080 :                 IF( EQ_16( d_short, d_long ) )
    3168             :                 {
    3169       55244 :                     g_short = MAX_16;
    3170       55244 :                     move16();
    3171       55244 :                     g_long = 0;
    3172       55244 :                     move16();
    3173             :                 }
    3174             : 
    3175             :                 /* Avoid transient components */
    3176       59080 :                 test();
    3177       59080 :                 IF( EQ_32( hStereoDft->past_res_pred_gain_fx[d_short_ind][b], MIN_32 ) &&
    3178             :                     EQ_32( hStereoDft->past_res_pred_gain_fx[d_long_ind][b], MIN_32 ) )
    3179             :                 {
    3180        1822 :                     g_long = 0;
    3181        1822 :                     move16();
    3182        1822 :                     g_short = 0;
    3183        1822 :                     move16();
    3184             :                 }
    3185       57258 :                 ELSE IF( EQ_32( hStereoDft->past_res_pred_gain_fx[d_short_ind][b], MIN_32 ) )
    3186             :                 {
    3187          42 :                     g_long = MAX_16;
    3188          42 :                     move16();
    3189          42 :                     g_short = 0;
    3190          42 :                     move16();
    3191             :                 }
    3192       57216 :                 ELSE IF( EQ_32( hStereoDft->past_res_pred_gain_fx[d_long_ind][b], MIN_32 ) )
    3193             :                 {
    3194          52 :                     g_long = 0;
    3195          52 :                     move16();
    3196          52 :                     g_short = MAX_16;
    3197          52 :                     move16();
    3198             :                 }
    3199       59080 :                 IF( EQ_32( hStereoDft->core_hist[d_short / 2], ACELP_CORE ) )
    3200             :                 {
    3201           0 :                     g_short = 0;
    3202           0 :                     move16();
    3203             :                 }
    3204       59080 :                 IF( EQ_32( hStereoDft->core_hist[d_long / 2], ACELP_CORE ) )
    3205             :                 {
    3206         338 :                     g_long = 0;
    3207         338 :                     move16();
    3208             :                 }
    3209             : 
    3210       59080 :                 IF( s_max( g_short, g_long ) > 0 )
    3211             :                 {
    3212             :                     Word16 q_div;
    3213             :                     Word32 op1;
    3214       57174 :                     Word16 q_shift0 = sub( hStereoDft->q_dft, hStereoDft->q_DFT_past_DMX_fx[d_short_ind] );
    3215       57174 :                     Word16 q_shift1 = sub( hStereoDft->q_dft, hStereoDft->q_DFT_past_DMX_fx[d_long_ind] );
    3216       57174 :                     past_dmx_nrg = EPSILON_FIX;
    3217       57174 :                     move32();
    3218       57174 :                     dmx_nrg = EPSILON_FIX;
    3219       57174 :                     move32();
    3220       57174 :                     len = s_min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k >> 1 );
    3221     3718032 :                     FOR( i = s_max( hStereoDft->band_limits[b], bin0 ); i < len; i++ ) // i < min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k / 2 )
    3222             :                     {
    3223     3660858 :                         dmx_nrg = L_add( dmx_nrg, L_shr( Madd_32_32( Mpy_32_32( pDFT_DMX[2 * i], pDFT_DMX[2 * i] ), pDFT_DMX[2 * i + 1], pDFT_DMX[2 * i + 1] ), 1 ) ); /* 2 * q_dft - 31 - 1 */
    3224             : 
    3225     3660858 :                         DFT_PRED_RES[2 * i] = L_add( L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i], g_short ), q_shift0 ), L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_long_ind][2 * i], g_long ), q_shift1 ) ); /* q_dft */
    3226     3660858 :                         move32();
    3227     3660858 :                         DFT_PRED_RES[2 * i + 1] = L_add( L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i + 1], g_short ), q_shift0 ), L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_long_ind][2 * i + 1], g_long ), q_shift1 ) ); /* q_dft */
    3228     3660858 :                         move32();
    3229             : 
    3230     3660858 :                         past_dmx_nrg = L_add( past_dmx_nrg, L_shr( Madd_32_32( Mpy_32_32( DFT_PRED_RES[2 * i], DFT_PRED_RES[2 * i] ), DFT_PRED_RES[2 * i + 1], DFT_PRED_RES[2 * i + 1] ), 1 ) ); /* 2 * q_dft - 31 -1 */
    3231             :                     }
    3232       57174 :                     op1 = L_deposit_h( BASOP_Util_Divide3232_Scale( ( EPSILON_FIX + dmx_nrg ), ( EPSILON_FIX + past_dmx_nrg ), &q_div ) ); /* q_div + 16 */
    3233       57174 :                     q_norm_fac = q_div;
    3234       57174 :                     move16();
    3235       57174 :                     op1 = Sqrt32( op1, &q_norm_fac );
    3236       57174 :                     IF( GT_16( q_norm_fac, 16 ) )
    3237             :                     {
    3238           0 :                         assert( 0 );
    3239             :                     }
    3240       57174 :                     norm_fac = extract_h( op1 ); /* q_norm_fac - 16 */
    3241       57174 :                     q_norm_fac = sub( q_norm_fac, Q16 );
    3242       57174 :                     g2 = Mpy_32_16_1( pPredGain[b], norm_fac );                                                                                                                        /* Q31 */
    3243       57174 :                     pred_gain_avg = Madd_32_16( Mpy_32_16_1( hStereoDft->past_res_pred_gain_fx[d_short_ind][b], g_short ), hStereoDft->past_res_pred_gain_fx[d_long_ind][b], g_long ); /* Q31 */
    3244             : 
    3245       57174 :                     g2 = L_min( Mpy_32_16_1( pred_gain_avg, STEREO_DFT_STEFFI_GAIN_AMP_FX ),
    3246       57174 :                                 Madd_32_16( Mpy_32_16_1( pred_gain_avg, sub( (Word16) ( 0x7FFF ), STEREO_DFT_STEFFI_GAIN_REST_AMT_FX ) ), g2, STEREO_DFT_STEFFI_GAIN_REST_AMT_FX ) ); /* Q31 */
    3247       57174 :                     len = s_min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k >> 1 );
    3248     3718032 :                     FOR( i = s_max( hStereoDft->band_limits[b], bin0 ); i < len; i++ ) // i < min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k / 2 )
    3249             :                     {
    3250     3660858 :                         DFT_PRED_RES[2 * i] = Mpy_32_32( g2, DFT_PRED_RES[2 * i] ); /* Q31 */
    3251     3660858 :                         move32();
    3252     3660858 :                         DFT_PRED_RES[2 * i + 1] = Mpy_32_32( g2, DFT_PRED_RES[2 * i + 1] ); /* Q31 */
    3253     3660858 :                         move32();
    3254             :                     }
    3255             :                 }
    3256             :                 ELSE
    3257             :                 {
    3258        1906 :                     begin = s_max( hStereoDft->band_limits[b], bin0 );                       /* Q0 */
    3259        1906 :                     end = s_min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k / 2 ); /* Q0 */
    3260        1906 :                     set32_fx( DFT_PRED_RES + shl( begin, 1 ), 0, shl( sub( end, begin ), 1 ) );
    3261             :                 }
    3262             :             }
    3263             :         }
    3264             :     }
    3265             : 
    3266             :     /* update buffers */
    3267      695492 :     FOR( b = hStereoDft->res_pred_band_min; b < hStereoDft->nbands; b++ )
    3268             :     {
    3269      612796 :         test();
    3270      612796 :         IF( hStereoDft->attackPresent || hStereoDft->wasTransient )
    3271             :         {
    3272       32906 :             hStereoDft->past_res_pred_gain_fx[( hStereoDft->past_DMX_pos + 1 ) % STEREO_DFT_PAST_MAX][b] = MIN_32;
    3273       32906 :             move32();
    3274             :         }
    3275             :         ELSE
    3276             :         {
    3277      579890 :             hStereoDft->past_res_pred_gain_fx[( hStereoDft->past_DMX_pos + 1 ) % STEREO_DFT_PAST_MAX][b] = pPredGain[b];
    3278      579890 :             move32();
    3279             :         }
    3280             :     }
    3281             : 
    3282       82696 :     pop_wmops();
    3283       82696 :     return;
    3284             : }
    3285             : 
    3286             : /*---------------------------------------------------------------
    3287             :  * stereo_dft_adapt_sf_delay_fx()
    3288             :  *
    3289             :  *
    3290             :  * ---------------------------------------------------------------*/
    3291             : 
    3292       94982 : static void stereo_dft_adapt_sf_delay_fx(
    3293             :     STEREO_DFT_DEC_DATA_HANDLE hStereoDft,
    3294             :     Word32 *pPredGain )
    3295             : {
    3296             :     Word32 var_mean_ratio;
    3297             :     Word32 new_variation;
    3298             :     Word32 target_delay;
    3299             :     Word32 max_pg, sum_pg;
    3300             :     Word32 alpha_up, alpha_down;
    3301             :     Word16 b;
    3302             :     Word16 q_sqrt;
    3303             :     Word16 q_div;
    3304             :     Word16 q_guard;
    3305             :     Word16 op;
    3306             : 
    3307       94982 :     max_pg = 0;
    3308       94982 :     move32();
    3309       94982 :     sum_pg = 0;
    3310       94982 :     move32();
    3311       94982 :     q_sqrt = 0;
    3312       94982 :     move32();
    3313       94982 :     q_guard = sub( 15, norm_s( hStereoDft->nbands ) );
    3314             : 
    3315             :     /* find sum and maximum of prediction gains */
    3316      851196 :     FOR( b = hStereoDft->res_pred_band_min; b < hStereoDft->nbands; b++ )
    3317             :     {
    3318      756214 :         IF( GT_32( pPredGain[b], max_pg ) )
    3319             :         {
    3320      204223 :             max_pg = pPredGain[b];
    3321      204223 :             move16();
    3322             :         }
    3323      756214 :         sum_pg = L_add( sum_pg, L_shr( pPredGain[b], q_guard ) ); /* q_gurad */
    3324             :     }
    3325       94982 :     IF( GT_16( q_guard, hStereoDft->q_lt_pred_gain ) )
    3326             :     {
    3327         526 :         hStereoDft->lt_pred_gain_fx = L_shr( hStereoDft->lt_pred_gain_fx, sub( q_guard, hStereoDft->q_lt_pred_gain ) ); /* q_guard */
    3328         526 :         hStereoDft->q_lt_pred_gain = q_guard;
    3329         526 :         move16();
    3330             :     }
    3331             :     ELSE
    3332             :     {
    3333       94456 :         sum_pg = L_shr( sum_pg, sub( hStereoDft->q_lt_pred_gain, q_guard ) ); /* hStereoDft->q_lt_pred_gain */
    3334       94456 :         q_guard = hStereoDft->q_lt_pred_gain;
    3335       94456 :         move16();
    3336             :     }
    3337       94982 :     IF( sum_pg > 0 )
    3338             :     {
    3339             :         /* Calculate mean of the prediction gain */
    3340       87302 :         hStereoDft->lt_pred_gain_fx = Madd_32_16( Mpy_32_16_1( sum_pg, STEREO_DFT_LT_PREDGAIN_UPD_FX ), hStereoDft->lt_pred_gain_fx, sub( MAX_16, STEREO_DFT_LT_PREDGAIN_UPD_FX ) ); /* hStereoDft->q_lt_pred_gain */
    3341             : 
    3342             :         /* Calculate the variation of the prediction gain */
    3343       87302 :         new_variation = L_abs( L_sub( sum_pg, hStereoDft->lt_pred_gain_fx ) );                                                                                                                                  /* hStereoDft->q_lt_pred_gain */
    3344       87302 :         hStereoDft->lt_pred_gain_variation_fx = Madd_32_16( Mpy_32_16_1( new_variation, STEREO_DFT_VR_PREDGAIN_UPD_FX ), hStereoDft->lt_pred_gain_variation_fx, sub( MAX_16, STEREO_DFT_VR_PREDGAIN_UPD_FX ) ); /* hStereoDft->q_lt_pred_gain */
    3345             :     }
    3346             : 
    3347             :     /* Calculate ratio of variation and mean of prediction gain */
    3348       94982 :     var_mean_ratio = STEREO_DFT_RES_RATIO_LIMIT_FX; /* Q31 */
    3349       94982 :     move16();
    3350             : 
    3351       94982 :     IF( hStereoDft->lt_pred_gain_fx > 0 )
    3352             :     {
    3353       93288 :         Word32 opr2 = L_deposit_h( BASOP_Util_Divide3232_Scale( hStereoDft->lt_pred_gain_variation_fx, hStereoDft->lt_pred_gain_fx, &q_div ) );
    3354       93288 :         IF( q_div < 0 )
    3355             :         {
    3356       84043 :             opr2 = L_shl( opr2, q_div );
    3357       84043 :             q_div = 0;
    3358       84043 :             move16();
    3359             :         }
    3360       93288 :         IF( LT_32( L_shr( STEREO_DFT_RES_RATIO_LIMIT_FX_3_BY_2, q_div ), opr2 ) )
    3361             :         {
    3362       12923 :             var_mean_ratio = STEREO_DFT_RES_RATIO_LIMIT_FX_3_BY_2; /* Q31 */
    3363       12923 :             move32();
    3364             :         }
    3365             :         ELSE
    3366             :         {
    3367       80365 :             var_mean_ratio = L_shl( opr2, q_div ); /* Q31 */
    3368             :         }
    3369             :     }
    3370             : 
    3371       94982 :     IF( GT_32( max_pg, STEREO_DFT_STEFFI_PG_THRESHOLD_FX ) )
    3372             :     {
    3373             :         /* slow upwards */
    3374       51291 :         alpha_up = STEREO_DFT_STEFFI_RATIO_UP_HIGH_FX; /* Q31 */
    3375       51291 :         move16();
    3376       51291 :         alpha_down = STEREO_DFT_STEFFI_RATIO_DOWN_HIGH_FX; /* Q31 */
    3377       51291 :         move16();
    3378             :     }
    3379             :     ELSE
    3380             :     {
    3381             :         /* slow downwards */
    3382       43691 :         alpha_up = STEREO_DFT_STEFFI_RATIO_UP_LOW_FX; /* Q31 */
    3383       43691 :         move16();
    3384       43691 :         alpha_down = STEREO_DFT_STEFFI_RATIO_DOWN_LOW_FX; /* Q31 */
    3385       43691 :         move16();
    3386             :     }
    3387             : 
    3388       94982 :     IF( GT_16( extract_h( var_mean_ratio ), extract_h( hStereoDft->lt_var_mean_ratio_fx ) ) )
    3389             :     {
    3390       26536 :         hStereoDft->lt_var_mean_ratio_fx = Madd_32_32( Mpy_32_32( var_mean_ratio, alpha_up ), hStereoDft->lt_var_mean_ratio_fx, L_sub( MAX_32, alpha_up ) ); /* Q31 */
    3391       26536 :         move32();
    3392             :     }
    3393             :     ELSE
    3394             :     {
    3395       68446 :         hStereoDft->lt_var_mean_ratio_fx = Madd_32_32( Mpy_32_32( var_mean_ratio, alpha_down ), hStereoDft->lt_var_mean_ratio_fx, L_sub( MAX_32, alpha_down ) ); /* Q31 */
    3396       68446 :         move32();
    3397             :     }
    3398             : 
    3399             :     /* Calculate a target delay for the stereo filling. Set the stereo filling delay lower when the prediction gain
    3400             :        variation is relatively high compared to the mean */
    3401       94982 :     IF( GE_16( extract_h( hStereoDft->lt_var_mean_ratio_fx ), extract_h( STEREO_DFT_RES_RATIO_LIMIT_FX ) ) )
    3402             :     {
    3403       35352 :         target_delay = L_shl( STEREO_DFT_STEFFI_DELAY_SHORT, Q15 ); /* Q15 */
    3404       35352 :         move32();
    3405             :     }
    3406             :     ELSE
    3407             :     {
    3408       59630 :         target_delay = L_min( L_shl( STEREO_DFT_STEFFI_DELAY_LONG, Q15 ),
    3409             :                               L_add( L_shl( STEREO_DFT_STEFFI_DELAY_SHORT, Q15 ),
    3410             :                                      L_mult0( ( STEREO_DFT_STEFFI_DELAY_OFFSET + STEREO_DFT_STEFFI_DELAY_LONG - STEREO_DFT_STEFFI_DELAY_SHORT ),
    3411       59630 :                                               sub( MAX_16, extract_h( L_shl( Mpy_32_16_1( hStereoDft->lt_var_mean_ratio_fx, ONE_STEREO_DFT_RES_RATIO_LIMIT_Q12 ), Q3 ) ) ) ) ) ); /* Q15 */
    3412             :     }
    3413             : 
    3414             :     /* Adapt the stereo filling delay by interpolating between two delay taps, one at the shortest delay and one at the longest delay */
    3415       94982 :     hStereoDft->stefi_short_gain_fx = extract_l( L_shr( L_sub( L_shl( STEREO_DFT_STEFFI_DELAY_LONG, Q15 ), target_delay ), 1 ) ); /* Q15 */
    3416       94982 :     q_sqrt = 0;
    3417       94982 :     move16();
    3418       94982 :     IF( EQ_16( hStereoDft->stefi_short_gain_fx, MIN_16 ) )
    3419             :     {
    3420       35352 :         hStereoDft->stefi_short_gain_fx = MAX_16;
    3421       35352 :         move16();
    3422       35352 :         hStereoDft->stefi_long_gain_fx = 0;
    3423       35352 :         move16();
    3424             :     }
    3425             :     ELSE
    3426             :     {
    3427       59630 :         op = hStereoDft->stefi_short_gain_fx;
    3428       59630 :         move16();
    3429       59630 :         hStereoDft->stefi_long_gain_fx = Sqrt16( sub( MAX_16, mult( op, op ) ), &q_sqrt ); /* Q15 */
    3430       59630 :         IF( q_sqrt != 0 )
    3431             :         {
    3432        2669 :             hStereoDft->stefi_long_gain_fx = shl( hStereoDft->stefi_long_gain_fx, q_sqrt ); /* Q15 */
    3433             :         }
    3434             :     }
    3435             : 
    3436       94982 :     return;
    3437             : }
    3438        1418 : void stereo_dft_dec_sid_coh_fx(
    3439             :     Decoder_State *st,   /* i/o: decoder state structure     */
    3440             :     const Word16 nbands, /* i  : number of DFT stereo bands             Q0*/
    3441             :     Word16 *coh_fx,      /* i/o: coherence                                         Q15*/
    3442             :     Word16 *nb_bits      /* i/o: number of bits read                    Q0*/
    3443             : )
    3444             : {
    3445             :     Word16 alpha_fx;
    3446             :     Word16 pred_fx;
    3447             :     Word16 pred_err_fx;
    3448             :     Word16 cohBandq_fx[STEREO_DFT_BAND_MAX];
    3449             :     const Word16 *pptr_fx;
    3450             :     Word16 nr_of_sid_stereo_bits;
    3451             :     Word16 i;
    3452             :     Word16 alpha_index;
    3453             :     Word16 alpha_step;
    3454             :     Word16 coh_pred_index;
    3455             :     Word16 res_index;
    3456             :     Word16 bits_tmp;
    3457             :     Word16 b;
    3458             : 
    3459        1418 :     nr_of_sid_stereo_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; /* Q0 */
    3460        1418 :     move16();
    3461             :     /* If the coherence is not encoded due to lack of bits set alpha to zero which leads to that the coherence */
    3462             :     /* from the previous frame is used. */
    3463        1418 :     IF( sub( sub( nr_of_sid_stereo_bits, *nb_bits ), STEREO_DFT_N_COH_ALPHA_BITS - STEREO_DFT_PRED_NBITS ) > 0 )
    3464             :     {
    3465             :         /* Read coherence from bitstream  */
    3466        1418 :         coh_pred_index = get_next_indice_fx( st, STEREO_DFT_PRED_NBITS ); /* Read predictor index       Q0*/
    3467        1418 :         ( *nb_bits ) = add( ( *nb_bits ), STEREO_DFT_PRED_NBITS );
    3468             : 
    3469        1418 :         alpha_index = get_next_indice_fx( st, STEREO_DFT_N_COH_ALPHA_BITS ); /* Read alpha index        Q0*/
    3470        1418 :         ( *nb_bits ) = add( ( *nb_bits ), STEREO_DFT_N_COH_ALPHA_BITS );
    3471             : 
    3472        1418 :         alpha_step = 0;
    3473        1418 :         move16();
    3474        7090 :         FOR( i = 0; i < STEREO_DFT_N_COH_ALPHA_STEPS - 1; i++ )
    3475             :         {
    3476        5672 :             IF( GT_16( sub( nr_of_sid_stereo_bits, *nb_bits ), dft_cng_coh_alpha_start[i] ) )
    3477             :             {
    3478        5672 :                 alpha_step = i + 1;
    3479             :             }
    3480             :         }
    3481        1418 :         alpha_fx = dft_cng_alpha_bits_fx[alpha_step][alpha_index]; /* Q15 */
    3482        1418 :         move16();
    3483             :     }
    3484             :     ELSE
    3485             :     {
    3486           0 :         alpha_fx = 0;
    3487           0 :         coh_pred_index = 0;
    3488           0 :         move16();
    3489           0 :         move16();
    3490           0 :         FOR( i = *nb_bits; i < nr_of_sid_stereo_bits; i++ )
    3491             :         {
    3492           0 :             get_next_indice_fx( st, 1 );
    3493           0 :             ( *nb_bits )++;
    3494             :         }
    3495             :     }
    3496             : 
    3497        1418 :     pptr_fx = dft_cng_coh_pred_fx[coh_pred_index]; /*Q13*/
    3498        1418 :     pred_fx = 3276;                                /*Q13*/
    3499        1418 :     move16();
    3500        1418 :     move16();
    3501        9610 :     FOR( b = 0; b < nbands; b++ )
    3502             :     {
    3503             :         /* Intra-frame prediction */
    3504             : 
    3505       27882 :         FOR( i = 0; i < b; i++ )
    3506             :         {
    3507       19690 :             pred_fx = add( pred_fx, shl( mult( ( *pptr_fx++ ), cohBandq_fx[i] ), 2 ) ); /*q-13*/
    3508             :         }
    3509             :         /* Weighted intra/inter-frame prediction */
    3510        8192 :         pred_fx = add( mult( alpha_fx, pred_fx ), mult( sub( 32767, alpha_fx ), shr( coh_fx[b], 2 ) ) ); /*q-13*/
    3511             : 
    3512             :         /* Read residual index from bitstream */
    3513        8192 :         IF( LT_16( *nb_bits, nr_of_sid_stereo_bits ) ) /* If the bit limit is reached, res_index = 0 is assumed for remaining indices */
    3514             :         {
    3515        8192 :             bits_tmp = read_GR0( &st->bit_stream[st->next_bit_pos], &res_index, 1 ); /* Q0 */
    3516        8192 :             *nb_bits = add( *nb_bits, bits_tmp );                                    /* Q0 */
    3517        8192 :             st->next_bit_pos = add( st->next_bit_pos, bits_tmp );                    /* Q0 */
    3518        8192 :             move16();
    3519        8192 :             move16();
    3520             :         }
    3521             :         ELSE
    3522             :         {
    3523           0 :             res_index = 0;
    3524           0 :             move16();
    3525             :         }
    3526             : 
    3527             :         /* Reconstruct */
    3528        8192 :         res_index = dft_cng_coh_u2i[res_index]; /* Q0 */
    3529        8192 :         move16();
    3530        8192 :         pred_err_fx = shr( usdequant_fx( res_index, -13107 /*Q-15*/, 1638 /*Q-14*/ ), 2 ); /* Q15 */
    3531        8192 :         cohBandq_fx[b] = add( pred_fx, pred_err_fx );                                      /* Store for intra-frame prediction */
    3532        8192 :         IF( GT_16( cohBandq_fx[b], 8192 ) )
    3533             :         {
    3534           0 :             cohBandq_fx[b] = 8192; /* Q13 */
    3535           0 :             move16();
    3536             :         }
    3537        8192 :         ELSE IF( cohBandq_fx[b] < 0 )
    3538             :         {
    3539         178 :             cohBandq_fx[b] = 0;
    3540         178 :             move16();
    3541             :         }
    3542        8192 :         coh_fx[b] = shl_sat( cohBandq_fx[b], 2 ); /* Update memory for next frame */ /* Q15 */
    3543        8192 :         move16();
    3544        8192 :         pred_fx = 0;
    3545        8192 :         move16();
    3546             :     }
    3547             : 
    3548             :     /* Remove padding bits */
    3549       25160 :     FOR( i = *nb_bits; i < nr_of_sid_stereo_bits; i++ )
    3550             :     {
    3551       23742 :         get_next_indice_fx( st, 1 );
    3552       23742 :         ( *nb_bits )++;
    3553             :     }
    3554        1418 :     return;
    3555             : }
    3556       28950 : void stereo_dft_dequantize_itd_fx(
    3557             :     Word16 *ind,           /* Q0 */
    3558             :     Word32 *out_fx,        /* Q15 */
    3559             :     const Word32 output_Fs /* Q0 */
    3560             : )
    3561             : {
    3562             :     Word16 itd;
    3563             :     Word16 mask;
    3564       28950 :     mask = ( 1 << ( STEREO_DFT_ITD_NBITS - 1 ) ) - 1; /* Q0 */
    3565       28950 :     move16();
    3566       28950 :     itd = s_and( ind[0], mask ) + STEREO_DFT_ITD_MIN; /* Q0 */
    3567             : 
    3568       28950 :     IF( shr( ind[0], ( STEREO_DFT_ITD_NBITS - 1 ) ) )
    3569             :     {
    3570       18566 :         itd = imult1616( -1, itd ); /* Q0 */
    3571             :     }
    3572       28950 :     assert( ( ABSVAL( itd ) <= STEREO_DFT_ITD_MAX ) && ( ABSVAL( itd ) >= STEREO_DFT_ITD_MIN ) );
    3573             : 
    3574             :     /*Convert back @ fs*/
    3575       28950 :     *out_fx = L_mult( itd, divide3232( output_Fs, STEREO_DFT_ITD_FS << 1 ) ); /*Q15*/
    3576       28950 :     move32();
    3577       28950 :     return;
    3578             : }
    3579             : /*-------------------------------------------------------------------------
    3580             :  * stereo_dft_dec_read_BS()
    3581             :  *
    3582             :  * Read bitstream
    3583             :  *-------------------------------------------------------------------------*/
    3584             : 
    3585       52733 : void stereo_dft_dec_read_BS_fx(
    3586             :     const Word32 ivas_total_brate,         /* i  : IVAS total bitrate           Q0*/
    3587             :     const Word32 element_brate,            /* i  : element bitrate                      Q0*/
    3588             :     Word32 *total_brate,                   /* o  : total bitrate                        Q0*/
    3589             :     Decoder_State *st,                     /* i/o: decoder state structure        */
    3590             :     STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder stereo handle          */
    3591             :     const Word16 bwidth,                   /* i  : bandwidth                            Q0*/
    3592             :     const Word16 output_frame,             /* i  : output frame length          Q0*/
    3593             :     Word32 res_buf_fx[STEREO_DFT_N_8k],    /* o  : residual buffer          Q0*/
    3594             :     Word16 *nb_bits,                       /* o  : number of bits read          Q0*/
    3595             :     Word16 *coh_fx,                        /* i/o: Coherence               Q15*/
    3596             :     const Word16 ivas_format               /* i  : ivas format                          Q0*/
    3597             : )
    3598             : {
    3599             :     Word32 sg_tmp_fx[STEREO_DFT_BAND_MAX];
    3600             :     Word32 res_pred_gain_tmp_fx[STEREO_DFT_BAND_MAX];
    3601             :     Word16 b, N_div, nbands;
    3602             :     Word16 NFFT_inner;
    3603             :     Word16 k, k_offset;
    3604             :     Word16 I;
    3605             :     Word16 max_bits;
    3606             :     UWord16 bit_stream_side[800]; /*Max bits per frame for 30kbps*/
    3607             :     RangeUniDecState range_uni_dec_state;
    3608             :     ECSQ_instance ecsq_inst;
    3609             : 
    3610             :     /* needed for provisorial reordering of indices */
    3611             :     Word16 ind1[STEREO_DFT_BAND_MAX];
    3612             :     Word16 n_bits;
    3613             :     Word16 nb, ind1_ipd[STEREO_DFT_BAND_MAX], ind1_pred[STEREO_DFT_BAND_MAX];
    3614             :     Word16 sign_flag;
    3615             :     Word16 itd_mode;
    3616             : 
    3617             :     /*------------------------------------------------------------------*
    3618             :      * Initialization
    3619             :      *-----------------------------------------------------------------*/
    3620             : 
    3621       52733 :     k_offset = STEREO_DFT_OFFSET; /* Q0 */
    3622             : 
    3623       52733 :     move16();
    3624       52733 :     IF( EQ_32( ivas_total_brate, IVAS_SID_5k2 ) )
    3625             :     {
    3626        1492 :         IF( EQ_16( ivas_format, MASA_FORMAT ) )
    3627             :         {
    3628          74 :             hStereoDft->frame_nodata = 0;
    3629          74 :             hStereoDft->frame_sid_nodata = 1;
    3630          74 :             hStereoDft->frame_sid = 1;
    3631          74 :             *nb_bits = 0;
    3632             :         }
    3633             :         ELSE
    3634             :         {
    3635        1418 :             hStereoDft->frame_nodata = 0;
    3636        1418 :             hStereoDft->frame_sid_nodata = 1;
    3637        1418 :             hStereoDft->frame_sid = 1;
    3638        1418 :             *nb_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; /* Q0 */
    3639             :         }
    3640        1492 :         move16();
    3641        1492 :         move16();
    3642        1492 :         move16();
    3643        1492 :         move16();
    3644             :     }
    3645       51241 :     ELSE IF( EQ_32( ivas_total_brate, FRAME_NO_DATA ) )
    3646             :     {
    3647        8859 :         hStereoDft->frame_nodata = 1;
    3648        8859 :         hStereoDft->frame_sid_nodata = 1;
    3649        8859 :         hStereoDft->frame_sid = 0;
    3650        8859 :         *nb_bits = 0;
    3651        8859 :         *total_brate = 0;
    3652        8859 :         hStereoDft->itd_fx[k = hStereoDft->prm_res[k_offset] - 1 + k_offset] = hStereoDft->itd_xfade_target_fx; /* Q15 */
    3653        8859 :         hStereoDft->gipd_fx[hStereoDft->prm_res[k_offset] - 1 + k_offset] = hStereoDft->ipd_xfade_target_fx;    /* Q27 */
    3654             : 
    3655        8859 :         move16();
    3656        8859 :         move16();
    3657        8859 :         move16();
    3658        8859 :         move16();
    3659        8859 :         move32();
    3660        8859 :         move32();
    3661        8859 :         move32();
    3662        8859 :         return;
    3663             :     }
    3664             :     ELSE
    3665             :     {
    3666       42382 :         hStereoDft->frame_nodata = 0;
    3667       42382 :         hStereoDft->frame_sid_nodata = 0;
    3668       42382 :         hStereoDft->frame_sid = 0;
    3669       42382 :         move16();
    3670       42382 :         move16();
    3671       42382 :         move16();
    3672             : 
    3673       42382 :         st->total_brate = L_mult0( *nb_bits, FRAMES_PER_SEC ); /* Q0 */
    3674             :     }
    3675             : 
    3676       43874 :     hStereoDft->reverb_flag = 0;
    3677             : 
    3678       43874 :     move16();
    3679             :     /* reverse the bitstream */
    3680     8057535 :     FOR( b = 0; b < *nb_bits; b++ )
    3681             :     {
    3682     8013661 :         bit_stream_side[b] = st->bit_stream[-b]; /* Q0 */
    3683     8013661 :         move16();
    3684             :     }
    3685             : 
    3686             :     /* make sure the padding bits read ahead by the arithmetic coder (up to 16) or range coder (up to 32) have binary values */
    3687     1447842 :     FOR( ; b < *nb_bits + 32; b++ )
    3688             :     {
    3689     1403968 :         bit_stream_side[b] = 0;
    3690     1403968 :         move16();
    3691             :     }
    3692       43874 :     st->bit_stream = bit_stream_side; /* Q0 */
    3693             : 
    3694             :     /*init*/
    3695       43874 :     max_bits = *nb_bits; /* Q0 */
    3696       43874 :     *nb_bits = 0;
    3697       43874 :     N_div = STEREO_DFT_NBDIV; /* Q0 */
    3698             : 
    3699       43874 :     move16();
    3700       43874 :     move16();
    3701       43874 :     move16();
    3702       43874 :     IF( GT_32( ivas_total_brate, IVAS_SID_5k2 ) )
    3703             :     {
    3704       42382 :         Copy32( hStereoDft->side_gain_fx + 2 * STEREO_DFT_BAND_MAX, sg_tmp_fx, STEREO_DFT_BAND_MAX );                /*Q_31*/
    3705       42382 :         Copy32( hStereoDft->res_pred_gain_fx + 2 * STEREO_DFT_BAND_MAX, res_pred_gain_tmp_fx, STEREO_DFT_BAND_MAX ); /*Q_31*/
    3706             :     }
    3707             : 
    3708             :     /* attackPresent always set to 0 in SID frames */
    3709       43874 :     IF( hStereoDft->frame_sid )
    3710             :     {
    3711        1492 :         hStereoDft->attackPresent = 0;
    3712        1492 :         move16();
    3713             :     }
    3714             :     ELSE
    3715             :     {
    3716       42382 :         hStereoDft->attackPresent = get_next_indice_fx( st, 1 ); /* Q0 */
    3717       42382 :         ( *nb_bits ) = add( ( *nb_bits ), 1 );
    3718       42382 :         move16();
    3719       42382 :         move16();
    3720             :     }
    3721             : 
    3722             :     /* read res_cod_mode from bitstream */
    3723       43874 :     test();
    3724       43874 :     IF( EQ_16( bwidth, WB ) && hStereoDft->hConfig->ada_wb_res_cod_mode )
    3725             :     {
    3726        3265 :         hStereoDft->res_cod_mode[k_offset] = get_next_indice_fx( st, 1 ); /* Q0 */
    3727        3265 :         move16();
    3728        3265 :         ( *nb_bits ) = add( ( *nb_bits ), 1 );
    3729        3265 :         move16();
    3730             :     }
    3731             : 
    3732             :     /* read number of bands in the bitstream - depends on the audio bandwidth and not to output_Fs */
    3733       43874 :     IF( hStereoDft->frame_sid )
    3734             :     {
    3735        1492 :         NFFT_inner = imult1616( inner_frame_tbl[bwidth], STEREO_DFT32MS_N_MAX / L_FRAME48k ); /* Q0 */
    3736             :     }
    3737             :     ELSE
    3738             :     {
    3739       42382 :         NFFT_inner = imult1616( inner_frame_tbl[st->bwidth], STEREO_DFT32MS_N_MAX / L_FRAME48k ); /* Q0 */
    3740             :     }
    3741             : 
    3742             :     /* Use coarse band partition in inactive frames */
    3743       43874 :     IF( hStereoDft->frame_sid )
    3744             :     {
    3745        1492 :         hStereoDft->band_res[k_offset] = STEREO_DFT_BAND_RES_LOW;    /* Q0 */
    3746        1492 :         hStereoDft->res_cod_mode[k_offset] = STEREO_DFT_RES_COD_OFF; /* Q0 */
    3747        1492 :         move16();
    3748        1492 :         move16();
    3749        1492 :         hStereoDft->nbands = stereo_dft_band_config_fx( hStereoDft->band_limits, hStereoDft->band_res[k_offset], s_min( STEREO_DFT32MS_N_MAX, NFFT_inner ), DEC ); /* Q0 */
    3750             : 
    3751        1492 :         IF( hStereoDft->nbands > STEREO_DFT_COH_MAXBAND )
    3752             :         {
    3753         225 :             hStereoDft->band_limits[STEREO_DFT_COH_MAXBAND] = hStereoDft->band_limits[hStereoDft->nbands]; /* Q0 */
    3754         225 :             hStereoDft->nbands = STEREO_DFT_COH_MAXBAND;                                                   /* Q0 */
    3755         225 :             move16();
    3756         225 :             move16();
    3757             :         }
    3758             :     }
    3759             :     ELSE
    3760             :     {
    3761       42382 :         hStereoDft->nbands = stereo_dft_band_config_fx( hStereoDft->band_limits, hStereoDft->band_res[k_offset], NFFT_inner, DEC ); /* Q0 */
    3762       42382 :         move16();
    3763             :     }
    3764             : 
    3765       43874 :     hStereoDft->res_cod_band_max = dft_band_res_cod[hStereoDft->band_res[k_offset]][hStereoDft->res_cod_mode[k_offset]]; /* Q0 */
    3766       43874 :     move16();
    3767       43874 :     hStereoDft->res_cod_line_max = (Word16) L_shr( L_add( ( 1 << Q13 ) /*0.5f Q-14*/, L_shl( L_mult0( sub( hStereoDft->band_limits[hStereoDft->res_cod_band_max], 1 ), divide1616( shr( output_frame, 1 ), ( hStereoDft->NFFT ) ) ) /*Q-14*/, 1 ) ), Q14 ); /* Q0 */
    3768       43874 :     move16();
    3769       43874 :     hStereoDft->res_cod_line_max = shl( shr( hStereoDft->res_cod_line_max, 3 ), 3 ); /* Q0 */
    3770       43874 :     move16();
    3771       43874 :     hStereoDft->res_pred_band_min = s_max( STEREO_DFT_RES_PRED_BAND_MIN, hStereoDft->res_cod_band_max ); /* Q0 */
    3772       43874 :     move16();
    3773             : 
    3774             : 
    3775             :     /*Copy config. for all DFT frames*/
    3776       43874 :     set16_fx( hStereoDft->band_res + add( k_offset, 1 ), hStereoDft->band_res[k_offset], sub( N_div, 1 ) );
    3777       43874 :     set16_fx( hStereoDft->prm_res + add( k_offset, 1 ), hStereoDft->prm_res[k_offset], sub( N_div, 1 ) );
    3778       43874 :     set16_fx( hStereoDft->res_pred_mode + add( k_offset, 1 ), hStereoDft->res_pred_mode[k_offset], sub( N_div, 1 ) );
    3779       43874 :     set16_fx( hStereoDft->res_cod_mode + add( k_offset, 1 ), hStereoDft->res_cod_mode[k_offset], sub( N_div, 1 ) );
    3780             : 
    3781             :     /*------------------------------------------------------------------*
    3782             :      * Read DFT stereo parameters
    3783             :      *-----------------------------------------------------------------*/
    3784             : 
    3785             :     /* Sent from the latest to the oldest */
    3786       87748 :     FOR( k = hStereoDft->prm_res[k_offset] - 1; k < N_div; k += hStereoDft->prm_res[k + k_offset] )
    3787             :     {
    3788             :         /* reset parameters */
    3789       43874 :         set_zero_fx( hStereoDft->side_gain_fx + i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), STEREO_DFT_BAND_MAX );
    3790       43874 :         hStereoDft->gipd_fx[k + k_offset] = 0;
    3791       43874 :         move32();
    3792       43874 :         set_zero_fx( hStereoDft->res_pred_gain_fx + i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), STEREO_DFT_BAND_MAX );
    3793             : 
    3794       43874 :         test();
    3795       43874 :         IF( !( EQ_16( ivas_format, MASA_FORMAT ) && LE_32( ivas_total_brate, IVAS_SID_5k2 ) ) )
    3796             :         {
    3797             :             /*------------------------------------------------------------------*
    3798             :              * read Side gains
    3799             :              *-----------------------------------------------------------------*/
    3800             : 
    3801             :             /* side gain */
    3802             :             /* get coding type */
    3803             :             /* Do not read and decode side gain if a NO_DATA frame */
    3804       43800 :             IF( !hStereoDft->frame_nodata )
    3805             :             {
    3806       43800 :                 n_bits = 0;
    3807       43800 :                 nb = st->next_bit_pos;
    3808       43800 :                 move16();
    3809       43800 :                 move16();
    3810       43800 :                 n_bits = read_flag_EC_DFT( &st->bit_stream[nb], &hStereoDft->side_gain_flag_1 ); /* Q0 */
    3811       43800 :                 nb = add( nb, n_bits );
    3812             : 
    3813       43800 :                 IF( hStereoDft->side_gain_flag_1 == 0 )
    3814             :                 {
    3815       34133 :                     b = read_BS_adapt_GR_sg( st->bit_stream, nb, ind1, hStereoDft->nbands, &hStereoDft->side_gain_flag_2, dft_maps_sg ); /* Q0 */
    3816       34133 :                     n_bits = add( n_bits, b );                                                                                           /* Q0 */
    3817             :                 }
    3818             :                 ELSE
    3819             :                 {
    3820        9667 :                     IF( EQ_16( hStereoDft->side_gain_flag_1, 2 ) ) /* differential */
    3821             :                     {
    3822        8651 :                         b = read_BS_GR( st->bit_stream, nb, ind1, hStereoDft->nbands, &hStereoDft->side_gain_flag_2 ); /* Q0 */
    3823        8651 :                         n_bits = add( n_bits, b );                                                                     /* Q0 */
    3824       87841 :                         FOR( b = 0; b < hStereoDft->nbands; b++ )
    3825             :                         {
    3826       79190 :                             ind1[b] = add( ind1[b], hStereoDft->side_gain_index_previous[b] ); /* Q0 */
    3827             :                         }
    3828             :                     }
    3829             :                     ELSE
    3830             :                     {
    3831        6883 :                         FOR( b = 0; b < hStereoDft->nbands; b++ )
    3832             :                         {
    3833        5867 :                             ind1[b] = get_value( &st->bit_stream[nb], STEREO_DFT_SIDEGAIN_NBITS ); /* Q0 */
    3834        5867 :                             nb = add( nb, STEREO_DFT_SIDEGAIN_NBITS );                             /* Q0 */
    3835        5867 :                             n_bits = add( n_bits, STEREO_DFT_SIDEGAIN_NBITS );                     /* Q0 */
    3836             :                         }
    3837             :                     }
    3838             :                 }
    3839             : 
    3840      456699 :                 FOR( b = 0; b < hStereoDft->nbands; b++ )
    3841             :                 {
    3842      412899 :                     hStereoDft->side_gain_index_previous[b] = ind1[b]; /* Q0 */
    3843      412899 :                     move16();
    3844      412899 :                     hStereoDft->res_gains_ind_fx[0][b + STEREO_DFT_BAND_MAX] = L_shl_sat( ind1[b], 26 ); /* Q26 */
    3845      412899 :                     move32();
    3846             :                 }
    3847             : 
    3848       43800 :                 st->next_bit_pos = add( st->next_bit_pos, n_bits ); /* Q0 */
    3849       43800 :                 ( *nb_bits ) = add( ( *nb_bits ), n_bits );
    3850       43800 :                 move16();
    3851       43800 :                 move16();
    3852             :             }
    3853             : 
    3854             :             /*------------------------------------------------------------------*
    3855             :              * read ITDs
    3856             :              *-----------------------------------------------------------------*/
    3857             : 
    3858       43800 :             IF( !hStereoDft->frame_sid_nodata )
    3859             :             {
    3860       42382 :                 itd_mode = get_next_indice_fx( st, STEREO_DFT_ITD_MODE_NBITS ); /* Q0 */
    3861       42382 :                 ( *nb_bits ) = add( ( *nb_bits ), STEREO_DFT_ITD_MODE_NBITS );  /*ITD mode flag: 1bit   Q0*/
    3862       42382 :                 move16();
    3863       42382 :                 hStereoDft->itd_fx[k + k_offset] = 0;
    3864       42382 :                 move32();
    3865       42382 :                 IF( itd_mode )
    3866             :                 {
    3867       25539 :                     ( *nb_bits ) = add( ( *nb_bits ), read_itd( st, &I ) ); /* Q0 */
    3868       25539 :                     move16();
    3869       25539 :                     stereo_dft_dequantize_itd_fx( &I, hStereoDft->itd_fx + add( k, k_offset ), st->output_Fs );
    3870             :                 }
    3871             :             }
    3872        1418 :             ELSE IF( LE_16( *nb_bits, ( ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - STEREO_DFT_ITD_MODE_NBITS - STEREO_DFT_SID_ITD_NBITS - 1 - SID_FORMAT_NBITS ) ) )
    3873             :             {
    3874        1418 :                 itd_mode = get_next_indice_fx( st, STEREO_DFT_ITD_MODE_NBITS ); /* Q0 */
    3875        1418 :                 ( *nb_bits ) = add( ( *nb_bits ), STEREO_DFT_ITD_MODE_NBITS );  /*ITD mode flag: 1bit*/
    3876        1418 :                 move16();
    3877             : 
    3878        1418 :                 hStereoDft->itd_fx[k + k_offset] = 0; /* Q0 */
    3879        1418 :                 move32();
    3880        1418 :                 IF( itd_mode )
    3881             :                 {
    3882          23 :                     sign_flag = get_next_indice_fx( st, 1 );                          /* Q0 */
    3883          23 :                     I = get_next_indice_fx( st, STEREO_DFT_SID_ITD_NBITS );           /* Q0 */
    3884          23 :                     ( *nb_bits ) = add( ( *nb_bits ), STEREO_DFT_SID_ITD_NBITS + 1 ); /* Q0 */
    3885          23 :                     move16();
    3886          23 :                     I = shl( I, STEREO_DFT_SID_ITD_FAC ); /* Q0 */
    3887          23 :                     I = add( I, shl( sign_flag, 8 ) );    /* Q0 */
    3888          23 :                     stereo_dft_dequantize_itd_fx( &I, hStereoDft->itd_fx + add( k, k_offset ), st->output_Fs );
    3889             :                 }
    3890             :             }
    3891             : 
    3892             :             /*------------------------------------------------------------------*
    3893             :              * read IPDs
    3894             :              *-----------------------------------------------------------------*/
    3895             : 
    3896       43800 :             n_bits = 0;
    3897       43800 :             move16();
    3898       43800 :             nb = st->next_bit_pos; /* Q0 */
    3899       43800 :             move16();
    3900             : 
    3901       43800 :             IF( !hStereoDft->frame_sid_nodata )
    3902             :             {
    3903             :                 /* Active frame */
    3904       42382 :                 hStereoDft->no_ipd_flag = st->bit_stream[nb]; /* Q0 */
    3905       42382 :                 move16();
    3906       42382 :                 nb = add( nb, 1 );         /* Q0 */
    3907       42382 :                 n_bits = add( n_bits, 1 ); /* Q0 */
    3908       42382 :                 IF( hStereoDft->no_ipd_flag == 0 )
    3909             :                 {
    3910        3953 :                     ind1_ipd[0] = get_value( &st->bit_stream[nb], STEREO_DFT_GIPD_NBITS ); /* Q0 */
    3911        3953 :                     move16();
    3912        3953 :                     nb = add( nb, STEREO_DFT_GIPD_NBITS );         /* Q0 */
    3913        3953 :                     n_bits = add( n_bits, STEREO_DFT_GIPD_NBITS ); /* Q0 */
    3914        3953 :                     stereo_dft_dequantize_ipd_fx( &ind1_ipd[0], hStereoDft->gipd_fx + add( k, k_offset ), STEREO_DFT_GIPD_NBITS );
    3915             :                 }
    3916             :             }
    3917        1418 :             ELSE IF( LE_16( *nb_bits, ( ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - STEREO_DFT_FLAG_BITS - STEREO_DFT_SID_GIPD_NBITS - SID_FORMAT_NBITS ) ) )
    3918             :             {
    3919             :                 /* SID frame, only read IPD only if enough bits left in bitstream */
    3920        1418 :                 hStereoDft->no_ipd_flag = st->bit_stream[nb]; /* Q0 */
    3921        1418 :                 move16();
    3922        1418 :                 nb = add( nb, 1 );         /* Q0 */
    3923        1418 :                 n_bits = add( n_bits, 1 ); /* Q0 */
    3924        1418 :                 IF( hStereoDft->no_ipd_flag == 0 )
    3925             :                 {
    3926         271 :                     ind1_ipd[0] = get_value( &st->bit_stream[nb], STEREO_DFT_SID_GIPD_NBITS ); /* Q0 */
    3927         271 :                     move16();
    3928         271 :                     nb = add( nb, STEREO_DFT_SID_GIPD_NBITS );         /* Q0 */
    3929         271 :                     n_bits = add( n_bits, STEREO_DFT_SID_GIPD_NBITS ); /* Q0 */
    3930         271 :                     stereo_dft_dequantize_ipd_fx( &ind1_ipd[0], hStereoDft->gipd_fx + add( k, k_offset ), STEREO_DFT_SID_GIPD_NBITS );
    3931             :                 }
    3932             :             }
    3933             :             ELSE
    3934             :             {
    3935           0 :                 hStereoDft->no_ipd_flag = 1; /* Q0 */
    3936           0 :                 move16();
    3937             :             }
    3938             : 
    3939       43800 :             st->next_bit_pos = add( st->next_bit_pos, n_bits ); /* Q0 */
    3940       43800 :             ( *nb_bits ) = add( ( *nb_bits ), n_bits );         /* Q0 */
    3941       43800 :             move16();
    3942       43800 :             move16();
    3943             : 
    3944             :             /*------------------------------------------------------------------*
    3945             :              * read Residual parameters
    3946             :              *-----------------------------------------------------------------*/
    3947             : 
    3948             :             /* Residual prediction */ /* Switch it off if ITD detected */
    3949       43800 :             n_bits = 0;
    3950       43800 :             nb = st->next_bit_pos; /* Q0 */
    3951       43800 :             move16();
    3952       43800 :             move16();
    3953             : 
    3954             :             /* Not used in inactive frames */
    3955       43800 :             IF( !hStereoDft->frame_sid_nodata )
    3956             :             {
    3957       42382 :                 test();
    3958       42382 :                 IF( hStereoDft->res_pred_mode[k + k_offset] && hStereoDft->attackPresent == 0 )
    3959             :                 {
    3960       40860 :                     nbands = s_min( hStereoDft->nbands, STEREO_DFT_RES_PRED_BAND_MAX ); /* Q0 */
    3961             : 
    3962       40860 :                     hStereoDft->reverb_flag = 0;
    3963       40860 :                     hStereoDft->nbands_respred = nbands; /* Q0 */
    3964       40860 :                     move16();
    3965       40860 :                     move16();
    3966             : 
    3967             :                     /* Read bit for adaptive SF (WB/SWB & FB) */
    3968       40860 :                     IF( EQ_16( hStereoDft->hConfig->res_cod_mode, STEREO_DFT_RES_COD_OFF ) )
    3969             :                     {
    3970       24611 :                         hStereoDft->reverb_flag = get_next_indice_fx( st, STEREO_DFT_REVERB_MODE_NBITS ); /* Q0 */
    3971       24611 :                         ( *nb_bits ) = add( ( *nb_bits ), STEREO_DFT_REVERB_MODE_NBITS );                 /* Q0 */
    3972       24611 :                         move16();
    3973       24611 :                         move16();
    3974       24611 :                         nb = add( nb, STEREO_DFT_REVERB_MODE_NBITS ); /* Q0 */
    3975       24611 :                         IF( hStereoDft->reverb_flag )
    3976             :                         {
    3977        6479 :                             nbands = sub( nbands, STEREO_DFT_RES_PRED_BAND_MIN_CONST ); /* Q0 */
    3978             :                         }
    3979             :                     }
    3980             : 
    3981             :                     /* get coding type */
    3982       40860 :                     b = read_flag_EC_DFT( &st->bit_stream[nb], &hStereoDft->res_pred_flag_0 ); /* Q0 */
    3983       40860 :                     nb = add( nb, b );                                                         /* Q0 */
    3984       40860 :                     n_bits = add( n_bits, b );                                                 /* Q0 */
    3985             : 
    3986       40860 :                     IF( hStereoDft->res_pred_flag_0 == 0 )
    3987             :                     {
    3988        8245 :                         b = read_BS_adapt_GR_rpg( st->bit_stream, nb, ind1_pred, hStereoDft->res_pred_band_min, nbands, &hStereoDft->res_pred_flag_1 ); /* Q0 */
    3989        8245 :                         n_bits = add( n_bits, b );                                                                                                      /* Q0 */
    3990             :                     }
    3991             :                     ELSE
    3992             :                     {
    3993       32615 :                         IF( EQ_16( hStereoDft->res_pred_flag_0, 2 ) )
    3994             :                         {
    3995       29391 :                             b = read_BS_GR( st->bit_stream, nb, &ind1_pred[hStereoDft->res_pred_band_min], nbands - hStereoDft->res_pred_band_min, &hStereoDft->res_pred_flag_1 ); /* Q0 */
    3996             : 
    3997       29391 :                             n_bits = add( n_bits, b ); /* Q0 */
    3998      235575 :                             FOR( b = hStereoDft->res_pred_band_min; b < nbands; b++ )
    3999             :                             {
    4000      206184 :                                 ind1_pred[b] = add( ind1_pred[b], hStereoDft->res_pred_index_previous[b] ); /* Q0 */
    4001      206184 :                                 move16();
    4002             :                             }
    4003             :                         }
    4004             :                         ELSE
    4005             :                         {
    4006       22581 :                             FOR( b = hStereoDft->res_pred_band_min; b < nbands; b++ )
    4007             :                             {
    4008       19357 :                                 ind1_pred[b] = get_value( &st->bit_stream[nb], STEREO_DFT_RES_GAINS_BITS ); /* Q0 */
    4009       19357 :                                 move16();
    4010       19357 :                                 nb = add( nb, STEREO_DFT_RES_GAINS_BITS );         /* Q0 */
    4011       19357 :                                 n_bits = add( n_bits, STEREO_DFT_RES_GAINS_BITS ); /* Q0 */
    4012             :                             }
    4013             :                         }
    4014             :                     }
    4015             : 
    4016      122105 :                     FOR( b = 0; b < hStereoDft->res_pred_band_min; b++ )
    4017             :                     {
    4018       81245 :                         I = 0;
    4019       81245 :                         move16();
    4020       81245 :                         stereo_dft_dequantize_res_gains_fx( ind1 + b, &I, hStereoDft->side_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), hStereoDft->res_pred_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), 1 );
    4021       81245 :                         hStereoDft->res_pred_index_previous[b] = I; /* Q0 */
    4022       81245 :                         move16();
    4023       81245 :                         hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX] = 0; /* Q26 */
    4024       81245 :                         move32();
    4025             :                     }
    4026             : 
    4027      323079 :                     FOR( b = hStereoDft->res_pred_band_min; b < nbands; b++ )
    4028             :                     {
    4029      282219 :                         I = ind1_pred[b]; /* Q0 */
    4030      282219 :                         move16();
    4031      282219 :                         stereo_dft_dequantize_res_gains_fx( ind1 + b, &I, hStereoDft->side_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), hStereoDft->res_pred_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), 1 );
    4032      282219 :                         hStereoDft->res_pred_index_previous[b] = I; /* Q0 */
    4033      282219 :                         move16();
    4034      282219 :                         hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX] = L_shl_sat( I, 26 ); /* Q26 */
    4035      282219 :                         move32();
    4036             :                     }
    4037             : 
    4038       67938 :                     FOR( ; b < hStereoDft->nbands; b++ )
    4039             :                     {
    4040       27078 :                         I = 0;
    4041       27078 :                         move16();
    4042       27078 :                         stereo_dft_dequantize_res_gains_fx( ind1 + b, &I, hStereoDft->side_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), hStereoDft->res_pred_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), 1 );
    4043       27078 :                         move16();
    4044       27078 :                         hStereoDft->res_pred_index_previous[b] = I; /* Q0 */
    4045       27078 :                         move16();
    4046       27078 :                         hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX] = 0; /* Q26 */
    4047       27078 :                         move32();
    4048             :                     }
    4049             :                 }
    4050             :                 ELSE
    4051             :                 {
    4052       15687 :                     FOR( b = 0; b < hStereoDft->nbands; b++ )
    4053             :                     {
    4054       14165 :                         I = 0;
    4055       14165 :                         move16();
    4056       14165 :                         stereo_dft_dequantize_res_gains_fx( ind1 + b, &I, hStereoDft->side_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), hStereoDft->res_pred_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), 1 );
    4057       14165 :                         hStereoDft->res_pred_index_previous[b] = I; /* Q0 */
    4058       14165 :                         move16();
    4059       14165 :                         hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX] = L_shl_sat( I, 26 ); /* Q26 */
    4060       14165 :                         move32();
    4061             :                     }
    4062             :                 }
    4063             : 
    4064       42382 :                 st->next_bit_pos = add( st->next_bit_pos, n_bits ); /* Q0 */
    4065       42382 :                 ( *nb_bits ) = add( ( *nb_bits ), n_bits );         /* Q0 */
    4066       42382 :                 move16();
    4067       42382 :                 move16();
    4068             :             }
    4069             :             ELSE
    4070             :             {
    4071             :                 /* Dequantize sidegain if SID frame */
    4072        1418 :                 IF( hStereoDft->frame_sid )
    4073             :                 {
    4074        9610 :                     FOR( b = 0; b < hStereoDft->nbands; b++ )
    4075             :                     {
    4076        8192 :                         I = 0;
    4077        8192 :                         move16();
    4078        8192 :                         stereo_dft_dequantize_res_gains_fx( ind1 + b, &I, hStereoDft->side_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), hStereoDft->res_pred_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), 1 );
    4079             :                     }
    4080             :                 }
    4081             :             }
    4082             :         }
    4083             :     }
    4084             : 
    4085       43874 :     test();
    4086       43874 :     IF( !( EQ_16( ivas_format, MASA_FORMAT ) && LE_32( ivas_total_brate, IVAS_SID_5k2 ) ) )
    4087             :     {
    4088       43800 :         IF( NE_16( hStereoDft->side_gain_flag_1, 2 ) )
    4089             :         {
    4090       35149 :             hStereoDft->sg_mem_corrupt = 0;
    4091       35149 :             move16();
    4092             :         }
    4093             :     }
    4094             : 
    4095       43874 :     IF( GT_32( ivas_total_brate, IVAS_SID_5k2 ) )
    4096             :     {
    4097             :         // hStereoDft->recovery_flg = stereo_dft_sg_recovery( hStereoDft );
    4098       42382 :         hStereoDft->recovery_flg = stereo_dft_sg_recovery_fx( hStereoDft ); /* Q0 */
    4099             : 
    4100       42382 :         IF( hStereoDft->recovery_flg )
    4101             :         {
    4102           8 :             Copy32( sg_tmp_fx, hStereoDft->side_gain_fx + 2 * STEREO_DFT_BAND_MAX, STEREO_DFT_BAND_MAX );                /* Q31 */
    4103           8 :             Copy32( res_pred_gain_tmp_fx, hStereoDft->res_pred_gain_fx + 2 * STEREO_DFT_BAND_MAX, STEREO_DFT_BAND_MAX ); /* Q31 */
    4104             :         }
    4105             :     }
    4106             : 
    4107             :     /*----------------------------------------------------------------*
    4108             :      * Residual decoding: spectral lines
    4109             :      *----------------------------------------------------------------*/
    4110             : 
    4111             :     /* Residual coding not used in inactive frames */
    4112       43874 :     test();
    4113       43874 :     IF( hStereoDft->res_cod_band_max > 0 && !hStereoDft->frame_sid_nodata )
    4114             :     {
    4115             :         Word16 dec[STEREO_DFT_N_MAX_RES];
    4116             : 
    4117       16830 :         I = get_next_indice_fx( st, STEREO_DFT_RES_GLOBAL_GAIN_BITS );       /* Q0 */
    4118       16830 :         ( *nb_bits ) = add( ( *nb_bits ), STEREO_DFT_RES_GLOBAL_GAIN_BITS ); /* Q0 */
    4119       16830 :         move16();
    4120       16830 :         move16();
    4121             : 
    4122       16830 :         push_wmops( "residual_decode" );
    4123       16830 :         IF( I != ECSQ_GLOBAL_GAIN_INDEX_ALL_ZERO )
    4124             :         {
    4125       16373 :             ECSQ_init_instance_fx( &ecsq_inst, 0 /*dummy index*/, &range_uni_dec_state );
    4126             : 
    4127       16373 :             rc_uni_dec_init_fx( &range_uni_dec_state, bit_stream_side + *nb_bits, max_bits - *nb_bits );
    4128             : 
    4129       16373 :             hStereoDft->res_global_gain_fx = ECSQ_dequantize_gain_fx( I ); /* Q15 */
    4130       16373 :             move32();
    4131             : #ifdef DEBUGGING
    4132             :             dbgwrite_txt( (const float *) ( &hStereoDft->res_global_gain_fx ), 1, "fixed_res_global_gain.txt", NULL );
    4133             : #endif
    4134             : 
    4135       16373 :             ecsq_inst.config_index = sub( shl( hStereoDft->res_cod_mode[k_offset], 1 ), 1 ); /* Q0 */
    4136       16373 :             move16();
    4137             : 
    4138       16373 :             ECSQ_decode( &ecsq_inst, hStereoDft->res_cod_line_max, dec );
    4139             : 
    4140       16373 :             n_bits = rc_uni_dec_virtual_finish_fx( &range_uni_dec_state ); /* Q0 */
    4141             : 
    4142             : 
    4143       16373 :             set_zero_fx( res_buf_fx, STEREO_DFT_N_8k );
    4144      671293 :             FOR( Word16 c = 0; c < hStereoDft->res_cod_line_max; c++ )
    4145             :             {
    4146      654920 :                 dec[c] = shl_sat( dec[c], 8 ); /* Q0 */
    4147      654920 :                 move16();
    4148             :             }
    4149             : 
    4150       16373 :             ECSQ_dequantize_vector_fx( dec, hStereoDft->res_global_gain_fx, hStereoDft->res_cod_line_max, res_buf_fx );
    4151             : 
    4152             : #ifdef DEBUGGING
    4153             :             dbgwrite_txt( (const float *) res_buf_fx, hStereoDft->res_cod_line_max, "fixed_res_buf.txt", NULL );
    4154             : #endif
    4155             :         }
    4156             :         ELSE
    4157             :         {
    4158         457 :             set16_fx( dec, 0, hStereoDft->res_cod_line_max );
    4159         457 :             hStereoDft->res_global_gain_fx = 0;
    4160         457 :             n_bits = 0;
    4161         457 :             move32();
    4162         457 :             move16();
    4163         457 :             set_zero_fx( res_buf_fx, STEREO_DFT_N_8k );
    4164             :         }
    4165             : 
    4166       16830 :         ( *nb_bits ) = add( ( *nb_bits ), n_bits ); /* Q0 */
    4167       16830 :         pop_wmops();
    4168             :     }
    4169             : 
    4170       43874 :     test();
    4171       43874 :     test();
    4172       43874 :     IF( hStereoDft->frame_sid && !( EQ_16( ivas_format, MASA_FORMAT ) && LE_32( ivas_total_brate, IVAS_SID_5k2 ) ) )
    4173             :     {
    4174        1418 :         stereo_dft_dec_sid_coh_fx( st, hStereoDft->nbands, coh_fx, nb_bits );
    4175             :     }
    4176             : 
    4177       43874 :     test();
    4178       43874 :     IF( EQ_32( ivas_total_brate, IVAS_SID_5k2 ) && NE_16( ivas_format, MASA_FORMAT ) )
    4179             :     {
    4180        1418 :         *nb_bits = (Word16) Mult_32_16( L_sub( element_brate, SID_2k40 ), INV_FRAME_PER_SEC_Q15 ); /* => hCPE->hCoreCoder[0]->total_brate = SID_2k40;  Q0*/
    4181        1418 :         move16();
    4182             :     }
    4183             :     {
    4184       43874 :         *total_brate = L_sub( element_brate, L_mult0( *nb_bits, FRAMES_PER_SEC ) ); /* Q0 */
    4185       43874 :         move32();
    4186             :     }
    4187       43874 :     return;
    4188             : }

Generated by: LCOV version 1.14