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

Generated by: LCOV version 1.14