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