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

Generated by: LCOV version 1.14