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