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