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 "cnst.h"
37 : #include "rom_com.h"
38 : #include "prot_fx.h"
39 : #include "ivas_prot_fx.h"
40 : #include "ivas_cnst.h"
41 : #include "wmc_auto.h"
42 :
43 : /*-------------------------------------------------------------------------
44 : * ivas_post_proc()
45 : *
46 : * IVAS post-processing
47 : * - in SCE, post-processing of output channel
48 : * - in CPE_DFT, post-processing on output channels
49 : * - in CPE_TD, post-processing on decoded channels before upmixing
50 : *-------------------------------------------------------------------------*/
51 :
52 1082941 : void ivas_post_proc_fx(
53 : SCE_DEC_HANDLE hSCE, /* i/o: SCE decoder structure */
54 : CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */
55 : const Word16 n, /* i : channel number Q0*/
56 : Word32 synth[], /* i/o: output synthesis signal Q11*/
57 : Word32 *output[CPE_CHANNELS], /* i/o: output synthesis signal output_q*/
58 : const Word16 output_frame, /* i : output frame length Q0*/
59 : const Word16 sba_dirac_stereo_flag, /* i : signal stereo output for SBA DirAC Q0*/
60 : Word16 output_q )
61 : {
62 : Word16 k;
63 : Word16 delay_comp;
64 : Word32 output_Fs;
65 : Decoder_State **sts;
66 : TCX_LTP_DEC_HANDLE hTcxLtpDec;
67 :
68 1082941 : IF( hSCE != NULL )
69 : {
70 317379 : sts = hSCE->hCoreCoder;
71 : }
72 : ELSE
73 : {
74 765562 : sts = hCPE->hCoreCoder;
75 : }
76 :
77 1082941 : output_Fs = sts[0]->output_Fs;
78 1082941 : move32();
79 :
80 1082941 : test();
81 1082941 : test();
82 1082941 : test();
83 1082941 : test();
84 1082941 : test();
85 1082941 : IF( ( NE_16( sts[n]->element_mode, IVAS_CPE_DFT ) && !( sba_dirac_stereo_flag && NE_16( sts[n]->element_mode, IVAS_CPE_MDCT ) ) ) || ( EQ_16( sts[n]->element_mode, IVAS_CPE_DFT ) && EQ_16( hCPE->nchan_out, 1 ) && EQ_16( hCPE->hStereoDft->hConfig->res_cod_mode, STEREO_DFT_RES_COD_OFF ) ) )
86 : {
87 1036489 : IF( sts[n]->hTcxLtpDec != NULL )
88 : {
89 1032803 : hTcxLtpDec = sts[n]->hTcxLtpDec;
90 :
91 1032803 : test();
92 1032803 : IF( NE_16( sts[n]->core, TCX_20_CORE ) && NE_16( sts[n]->core, TCX_10_CORE ) )
93 : {
94 : /* TCX-LTP Postfilter: used in Mode 1 to update memories and to avoid discontinuities when the past frame was TCX */
95 145860 : tcx_ltp_post_fx32( sts[n], hTcxLtpDec, ACELP_CORE, output_frame, 0, synth, NULL, output_q );
96 : }
97 : ELSE
98 : {
99 : /* set delay */
100 886943 : delay_comp = NS2SA_FX2( output_Fs, DELAY_CLDFB_NS ); /*Q0*/
101 886943 : move16();
102 :
103 886943 : test();
104 886943 : test();
105 886943 : test();
106 886943 : test();
107 886943 : IF( EQ_16( EQ_16( sts[n]->element_mode, IVAS_CPE_DFT ) && EQ_16( hCPE->nchan_out, 1 ) && EQ_16( hCPE->hStereoDft->hConfig->res_cod_mode, STEREO_DFT_RES_COD_OFF ), 0 ) && NE_16( sts[n]->element_mode, IVAS_CPE_MDCT ) )
108 : {
109 201887 : Copy32( sts[n]->delay_buf_out32_fx, sts[n]->hTcxDec->FBTCXdelayBuf_32, delay_comp ); /*Q11*/
110 : }
111 685056 : ELSE IF( sba_dirac_stereo_flag && EQ_16( sts[n]->element_mode, IVAS_CPE_MDCT ) )
112 : {
113 22419 : Word16 numZeros = (Word16) ( NS2SA_FX2( output_Fs, N_ZERO_MDCT_NS ) ); /*Q0*/
114 22419 : move16();
115 22419 : assert( sts[n]->hHQ_core->Q_old_out_fx32 == Q11 );
116 22419 : Copy32( sts[n]->hHQ_core->old_out_fx32 + numZeros, sts[n]->hTcxDec->FBTCXdelayBuf_32, delay_comp ); /*Q11*/
117 : }
118 :
119 886943 : tcx_ltp_post_fx32( sts[n], hTcxLtpDec, sts[n]->core, output_frame, add( NS2SA_FX2( output_Fs, ACELP_LOOK_NS ), delay_comp ), synth, sts[n]->hTcxDec->FBTCXdelayBuf_32, output_q );
120 : }
121 : }
122 : }
123 : ELSE /* IVAS_CPE_DFT */
124 : {
125 : Word16 pit_res_max_past_tmp;
126 :
127 46452 : pit_res_max_past_tmp = sts[0]->pit_res_max_past; /*Q0*/
128 46452 : move16();
129 134001 : FOR( k = 0; k < hCPE->nchan_out; k++ )
130 : {
131 87549 : IF( k == 0 )
132 : {
133 46452 : hTcxLtpDec = sts[0]->hTcxLtpDec;
134 : }
135 : ELSE
136 : {
137 41097 : hTcxLtpDec = hCPE->hStereoDft->hTcxLtpDec;
138 : /* copy LTP side-info of downmix channel also to right channel struct */
139 41097 : hTcxLtpDec->tcxltp = sts[0]->hTcxLtpDec->tcxltp; /*Q0*/
140 41097 : move16();
141 41097 : hTcxLtpDec->tcxltp_gain = sts[0]->hTcxLtpDec->tcxltp_gain; /*Q15*/
142 41097 : move16();
143 41097 : hTcxLtpDec->tcxltp_pitch_int = sts[0]->hTcxLtpDec->tcxltp_pitch_int; /*Q0*/
144 41097 : move16();
145 41097 : hTcxLtpDec->tcxltp_pitch_fr = sts[0]->hTcxLtpDec->tcxltp_pitch_fr; /*Q0*/
146 41097 : move16();
147 : /* revert update of pit_res_max_past to have correct value also in right channel */
148 41097 : sts[0]->pit_res_max_past = pit_res_max_past_tmp; /*Q0*/
149 41097 : move16();
150 : }
151 :
152 : /*TCX-LTP*/
153 87549 : IF( NE_16( sts[0]->core, TCX_20_CORE ) && NE_16( sts[0]->core, TCX_10_CORE ) )
154 : {
155 : /* update memories and to avoid discontinuities when the past frame was TCX */
156 61409 : tcx_ltp_post_fx32( sts[0], hTcxLtpDec, ACELP_CORE, output_frame, 0, output[k], NULL, output_q );
157 : }
158 : ELSE
159 : {
160 : /*Use channel 0 side info.*/
161 26140 : tcx_ltp_post_fx32( sts[0], hTcxLtpDec, TCX_20_CORE, output_frame, NS2SA_FX2( output_Fs, STEREO_DFT32MS_OVL_NS ), output[k], hCPE->output_mem_fx[k], output_q );
162 : }
163 : }
164 : }
165 :
166 1082941 : return;
167 : }
168 :
169 :
170 : /*-------------------------------------------------------------------------
171 : * stereo_dft_dec_core_switching_fx()
172 : *
173 : * core switching in DFT stereo
174 : *-------------------------------------------------------------------------*/
175 :
176 64203 : void stereo_dft_dec_core_switching_fx(
177 : CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */
178 : Word32 output_fx[], /* i/o: synthesis @internal Fs q*/
179 : Word32 synth_fx[], /* i/o: synthesis @output Fs q*/
180 : Word32 hb_synth_fx[], /* i/o: hb synthesis q*/
181 : Word32 DFT_fx[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* o : DFT buffers q_DFT*/
182 : const Word16 output_frame, /* i : output frame length Q0*/
183 : const Word16 use_cldfb_for_dft, /* i : flag to use of CLDFB FOR DFT Stereo Q0*/
184 : const Word16 sba_dirac_stereo_dtx_flag, /* i : DTX indicator FOR SBA DirAC stereo Q0*/
185 : Word16 *q,
186 : Word16 *q_DFT )
187 : {
188 : Word32 output_Fs;
189 : Decoder_State *st;
190 : Word16 i, tmps;
191 : Word16 delay_dft_dec, delay_dft_dec_lb, delay_tdbwe, delay_comp;
192 : Word16 L_frameTCX;
193 : Word16 predelay, ap_fade_len;
194 : Word32 ap_fade_len_inv, ap_fade_len_fx;
195 : Word16 qap_fade_len;
196 : Word32 pAp_input_fx[L_FRAME16k];
197 : Word32 tcx_core_buf_fx[L_FRAME16k];
198 : Word64 calc_inv;
199 : Word32 synth_tmp_fx[L_FRAME48k];
200 :
201 :
202 64203 : st = hCPE->hCoreCoder[0]; /* in DFT stereo, only M channel is decoded by the CoreCoder */
203 64203 : output_Fs = st->output_Fs; /*Q0*/
204 64203 : move32();
205 64203 : L_frameTCX = st->hTcxDec->L_frameTCX; /*Q0*/
206 64203 : move16();
207 :
208 : /*TBE*/
209 64203 : delay_tdbwe = NS2SA_FX2( output_Fs, DELAY_BWE_TOTAL_NS ); /*Q0*/
210 64203 : move16();
211 64203 : delay_dft_dec = NS2SA_FX2( output_Fs, STEREO_DFT_DELAY_DEC_BWE_NS ); /*Q0*/
212 64203 : move16();
213 64203 : delay_dft_dec_lb = NS2SA_FX2( L_mult0( st->L_frame, FRAMES_PER_SEC ), STEREO_DFT_DELAY_DEC_BWE_NS ); /*Q0*/
214 64203 : move16();
215 :
216 : /* TCX/ACELP/HQ-CORE->TCX */
217 64203 : tmps = NS2SA_FX2( output_Fs, DELAY_BWE_TOTAL_NS ); /*cross-fading size @ FB*/ /*Q0*/
218 64203 : move16();
219 64203 : delay_comp = NS2SA_FX2( L_mult0( st->L_frame, FRAMES_PER_SEC ), DELAY_BWE_TOTAL_NS ); /*cross-fading size @ LB*/ /*Q0*/
220 64203 : move16();
221 :
222 64203 : calc_inv = W_shl( 1, 31 );
223 :
224 : // Memory Tables //////////////////////////////////////////////////////////////////////////////
225 64203 : Word32 mem_len_inv_tbl[] = { 85899345, 42949672, 28633115, 21474836, 17179869, 14316557 }; /*Q31*/
226 64203 : Word32 delay_comp_inv_tbl[] = { 2147483647, 306783378, 153391689, 97612893, 74051160, 58040098, 48806446, 42107522, 36398027, 32537631, 29020049 }; /*Q31*/
227 : ///////////////////////////////////////////////////////////////////////////////////////////////
228 :
229 64203 : test();
230 64203 : test();
231 64203 : IF( NE_16( st->last_L_frame, st->L_frame ) && LE_16( st->last_L_frame, L_FRAME16k ) && LE_16( st->L_frame, L_FRAME16k ) )
232 : {
233 319 : L_lerp_fx_q11( hCPE->input_mem_LB_fx[0], hCPE->input_mem_LB_fx[0], NS2SA_FX2( L_mult0( st->L_frame, FRAMES_PER_SEC ), STEREO_DFT32MS_OVL_NS ), NS2SA_FX2( L_mult0( st->last_L_frame, FRAMES_PER_SEC ), STEREO_DFT32MS_OVL_NS ) );
234 319 : L_lerp_fx_q11( hCPE->input_mem_BPF_fx[0], hCPE->input_mem_BPF_fx[0], NS2SA_FX2( L_mult0( st->L_frame, FRAMES_PER_SEC ), STEREO_DFT32MS_OVL_NS ), NS2SA_FX2( L_mult0( st->last_L_frame, FRAMES_PER_SEC ), STEREO_DFT32MS_OVL_NS ) );
235 : }
236 :
237 64203 : test();
238 64203 : test();
239 64203 : IF( ( st->prev_bfi != 0 ) && EQ_16( ( st->last_core_bfi == ACELP_CORE ) && EQ_16( st->last_con_tcx, 1 ), 0 ) )
240 : {
241 : /* last_core needed FOR correctly decoding ACELP->TCX/HQ switching frames in ivas_core_dec().
242 : In the following steps the decoder needs to consider IF the core was changed due to a lost frame to apply the correct transition */
243 877 : st->last_core = st->last_core_bfi;
244 877 : move16();
245 : }
246 :
247 :
248 64203 : test();
249 64203 : test();
250 64203 : test();
251 64203 : test();
252 64203 : test();
253 64203 : IF( EQ_16( st->core, TCX_20_CORE ) || EQ_16( st->core, TCX_10_CORE ) || EQ_16( st->core, HQ_CORE ) || ( EQ_16( st->bfi, 1 ) && EQ_16( st->core, ACELP_CORE ) && EQ_16( st->con_tcx, 1 ) ) )
254 : {
255 17769 : test();
256 17769 : test();
257 17769 : test();
258 17769 : test();
259 17769 : test();
260 17769 : test();
261 17769 : IF( ( ( ( st->last_core != ACELP_CORE ) || ( EQ_16( st->prev_bfi, 1 ) && EQ_16( st->last_core, ACELP_CORE ) && EQ_16( st->last_con_tcx, 1 ) ) ) && NE_16( st->last_core, AMR_WB_CORE ) ) || ( sba_dirac_stereo_dtx_flag && EQ_16( st->cng_type, FD_CNG ) ) ) /* TCX / HQ-CORE -> TCX / HQ-CORE */
262 : {
263 : /* In case of a TCX to ACELP switch next frame */
264 16514 : Copy32( &output_fx[st->L_frame - NS2SA( ( st->L_frame * FRAMES_PER_SEC ), STEREO_DFT32MS_OVL_NS )], hCPE->hStereoDft->buff_LBTCX_mem_fx, NS2SA_FX2( L_mult0( st->L_frame, FRAMES_PER_SEC ), STEREO_DFT32MS_OVL_NS ) ); /*q*/
265 :
266 : /* BPF */
267 16514 : test();
268 16514 : test();
269 16514 : IF( st->p_bpf_noise_buf_32 && NE_16( st->core, HQ_CORE ) )
270 : {
271 15407 : Scale_sig32( st->p_bpf_noise_buf_32, st->L_frame, sub( *q, Q11 ) ); /*q*/
272 15407 : stereo_dft_dec_analyze_fx( hCPE, st->p_bpf_noise_buf_32, DFT_fx, 0, st->L_frame, output_frame, DFT_STEREO_DEC_ANA_BPF, 2, 0, q, q_DFT );
273 : }
274 : /* st->p_bpf_noise_buf not updated FOR HQ core -> skip analysis and set input memory to zero */
275 1107 : ELSE IF( st->p_bpf_noise_buf_32 && EQ_16( st->core, HQ_CORE ) )
276 : {
277 1107 : set32_fx( hCPE->input_mem_BPF_fx[0], 0, STEREO_DFT32MS_OVL_16k );
278 : }
279 :
280 : /* TCX */
281 16514 : stereo_dft_dec_analyze_fx( hCPE, synth_fx, DFT_fx, 0, L_frameTCX, output_frame, DFT_STEREO_DEC_ANA_FB, 0, 0, q, q_DFT );
282 : }
283 1255 : ELSE IF( EQ_16( st->core, TCX_20_CORE ) || EQ_16( st->core, TCX_10_CORE ) || EQ_16( st->core, HQ_CORE ) ) /* ACELP -> TCX/HQ */
284 : {
285 1255 : test();
286 1255 : IF( LE_32( st->last_core_brate, SID_2k40 ) && LE_16( st->element_mode, IVAS_SCE ) )
287 2 : {
288 2 : Word16 mem_len = NS2SA_FX2( L_mult0( L_frameTCX, FRAMES_PER_SEC ), STEREO_DFT32MS_OVL_NS ); /*Q0*/
289 2 : move16();
290 2 : Word32 mem_len_inv = mem_len_inv_tbl[( mem_len / 25 ) - 1];
291 2 : move32();
292 2 : Word16 qmem_len = norm_l( mem_len );
293 2 : Word32 mem_len_fx = L_shl( mem_len, qmem_len );
294 302 : FOR( i = 0; i < mem_len; i++ )
295 : {
296 300 : hCPE->input_mem_fx[0][i] = Mpy_32_32( hCPE->input_mem_fx[0][i], L_sub( mem_len_fx, L_shl( i, qmem_len ) ) ); /*Q11 + qmem_len - 31*/
297 300 : move32();
298 300 : hCPE->input_mem_fx[0][i] = L_shl( Mpy_32_32( hCPE->input_mem_fx[0][i], mem_len_inv ), sub( Q31, qmem_len ) ); /*Q11*/
299 300 : move32();
300 : }
301 :
302 : /* Update FB input buff with hb synth FOR last delay_tdbwe sampled */
303 224 : FOR( i = 0; i < delay_tdbwe; i++ )
304 : {
305 444 : hCPE->input_mem_fx[0][( ( NS2SA( L_frameTCX * FRAMES_PER_SEC, STEREO_DFT32MS_OVL_NS ) - delay_tdbwe ) + i )] =
306 222 : L_add( hCPE->input_mem_fx[0][NS2SA( ( ( L_frameTCX * FRAMES_PER_SEC ) - STEREO_DFT32MS_OVL_NS ) + delay_tdbwe, i )], hb_synth_fx[i] ); /*Q11*/
307 222 : move32();
308 : }
309 : }
310 : ELSE
311 : {
312 : /* Update FB input buff with hb synth FOR last delay_tdbwe sampled */
313 100931 : FOR( i = 0; i < delay_tdbwe; i++ )
314 : {
315 99678 : hCPE->input_mem_fx[0][( ( NS2SA_FX2( L_frameTCX * FRAMES_PER_SEC, STEREO_DFT32MS_OVL_NS ) - delay_tdbwe ) + i )] = hb_synth_fx[i]; /*Q11*/
316 99678 : move32();
317 : }
318 : }
319 :
320 : /* cross-fading between (delayed) TBE and FB-TCX over 2.3125ms */
321 1255 : Copy32( synth_fx, synth_tmp_fx, output_frame ); /*q*/
322 1255 : Word16 qtmps = norm_l( tmps );
323 1255 : Word32 tmps_fx = L_shl( tmps, qtmps );
324 1255 : Word32 tmps_inv = (Word32) ( calc_inv / tmps );
325 101155 : FOR( i = 0; i < tmps; i++ )
326 : {
327 99900 : synth_tmp_fx[i] = L_add( Mpy_32_32( hb_synth_fx[( i + delay_tdbwe )], L_sub( tmps_fx, L_shl( i, qtmps ) ) ), Mpy_32_32( synth_fx[i], L_shl( i, qtmps ) ) ); /*q + qtmps - 31*/
328 99900 : move32();
329 99900 : synth_tmp_fx[i] = L_shl( Mpy_32_32( synth_tmp_fx[i], tmps_inv ), sub( 31, qtmps ) ); /*q*/
330 99900 : move32();
331 : }
332 :
333 : /* FB-TCX */
334 1255 : stereo_dft_dec_analyze_fx( hCPE, synth_tmp_fx, DFT_fx, 0, L_frameTCX, output_frame, DFT_STEREO_DEC_ANA_FB, 0, 0, q, q_DFT );
335 :
336 1255 : IF( st->tcxonly == 0 )
337 : {
338 1255 : IF( EQ_16( hCPE->hStereoDft->hConfig->res_pred_mode, STEREO_DFT_RESPRED_ESF ) )
339 : {
340 786 : Copy32( output_fx, tcx_core_buf_fx, L_FRAME16k ); /*q*/
341 : }
342 : /* fading-out LB-TCX/ACELP */
343 1255 : Word16 qdelay_comp = norm_l( delay_comp );
344 1255 : Word32 delay_comp_inv = delay_comp_inv_tbl[( delay_comp / 7 )]; /*Q31*/
345 1255 : move32();
346 1255 : Word32 delay_comp_fx = L_shl( delay_comp, qdelay_comp );
347 44442 : FOR( i = 0; i < delay_comp; i++ )
348 : {
349 43187 : output_fx[i] = Mpy_32_32( output_fx[i], L_sub( delay_comp_fx, L_shl( i, qdelay_comp ) ) ); /*q + qdelay_comp - 31*/
350 43187 : move32();
351 43187 : output_fx[i] = L_shl( Mpy_32_32( output_fx[i], delay_comp_inv ), sub( Q31, qdelay_comp ) ); /*q*/
352 43187 : move32();
353 : }
354 :
355 : /* In case of TCX frames, output LB TCX is zeroed out until the end but in case of an TCX->ACELP switch, this memory is needed, hence it is backed up */
356 : /* Unlike the case when DFT32MS is disabled, there is only 1 DFT analysis window, hence in the TCX frame we don't want to do a DFT analysis FOR LB TCX
357 : but in a potential ACELP frame, we want the memories of the LB TCX FOR the last OLA samples so that HB analysis can be skipped */
358 1255 : Copy32( &output_fx[st->L_frame - NS2SA_FX2( st->L_frame * FRAMES_PER_SEC, STEREO_DFT32MS_OVL_NS )], hCPE->hStereoDft->buff_LBTCX_mem_fx, NS2SA_FX2( L_mult0( st->L_frame, FRAMES_PER_SEC ), STEREO_DFT32MS_OVL_NS ) ); /*q*/
359 :
360 : /*zero the rest FOR avoiding adding contribution except the last samples which are not considered in DFT analysis (potentially used in next ACELP frame)*/
361 1255 : IF( GT_32( st->last_core_brate, SID_2k40 ) )
362 : {
363 316584 : FOR( ; i < st->L_frame; i++ )
364 : {
365 315390 : output_fx[i] = 0;
366 315390 : move32();
367 : }
368 :
369 1194 : stereo_dft_dec_analyze_fx( hCPE, output_fx, DFT_fx, 0, st->L_frame, output_frame, DFT_STEREO_DEC_ANA_LB_ADD, 1, 0, q, q_DFT );
370 :
371 : /* BPF */
372 1194 : IF( st->p_bpf_noise_buf_32 )
373 : {
374 1194 : set32_fx( hCPE->input_mem_BPF_fx[0], 0, NS2SA_FX2( L_mult0( st->L_frame, FRAMES_PER_SEC ), STEREO_DFT32MS_OVL_NS ) );
375 : }
376 : }
377 : }
378 : }
379 : }
380 : ELSE /* ACELP core */
381 : {
382 46434 : test();
383 46434 : test();
384 46434 : test();
385 46434 : IF( LE_32( st->core_brate, SID_2k40 ) && !sba_dirac_stereo_dtx_flag )
386 : {
387 10351 : set32_fx( hCPE->input_mem_fx[0], 0, NS2SA_FX2( L_mult0( st->hTcxDec->L_frameTCX, FRAMES_PER_SEC ), STEREO_DFT32MS_OVL_NS ) );
388 10351 : set32_fx( hCPE->input_mem_LB_fx[0], 0, NS2SA_FX2( L_mult0( st->L_frame, FRAMES_PER_SEC ), STEREO_DFT32MS_OVL_NS ) );
389 :
390 : /* CNG generated in ivas_cpe_dec() */
391 : }
392 36083 : ELSE IF( EQ_16( st->last_core, TCX_20_CORE ) || EQ_16( st->last_core, TCX_10_CORE ) || EQ_16( st->last_core, HQ_CORE ) ) /* TCX/HQ -> ACELP */
393 : {
394 1572 : IF( ( LE_16( st->last_L_frame, L_FRAME16k ) && LE_16( st->L_frame, L_FRAME16k ) ) || ( sba_dirac_stereo_dtx_flag && EQ_32( st->core_brate, SID_2k40 ) && EQ_16( st->cng_type, FD_CNG ) ) )
395 : {
396 : /* In case of a TCX to ACELP switch, retrieve the LB-TCX memories FOR the first STEREO_DFT32MS_OVL_NS NS of OLA */
397 1109 : L_lerp_fx_q11( hCPE->hStereoDft->buff_LBTCX_mem_fx, hCPE->input_mem_LB_fx[0], NS2SA_FX2( L_mult0( st->L_frame, FRAMES_PER_SEC ), STEREO_DFT32MS_OVL_NS ), NS2SA_FX2( L_mult0( st->last_L_frame, FRAMES_PER_SEC ), STEREO_DFT32MS_OVL_NS ) );
398 : }
399 :
400 1572 : IF( sba_dirac_stereo_dtx_flag && EQ_32( st->core_brate, SID_2k40 ) && EQ_16( st->cng_type, FD_CNG ) )
401 3 : {
402 : Word16 nZeros;
403 3 : nZeros = (Word16) ( NS2SA_FX2( st->output_Fs, N_ZERO_MDCT_NS ) ); /*Q0*/
404 3 : move16();
405 3 : delay_comp = NS2SA_FX2( st->output_Fs, DELAY_CLDFB_NS ); /*Q0*/
406 3 : move16();
407 :
408 3 : Copy32( &st->hHQ_core->old_out_fx32[nZeros - ( delay_comp + NS2SA( output_frame * FRAMES_PER_SEC, STEREO_DFT32MS_OVL_NS ) )], hCPE->input_mem_fx[0], NS2SA_FX2( L_mult0( output_frame, FRAMES_PER_SEC ), STEREO_DFT32MS_OVL_NS ) ); /*Q11*/
409 3 : Copy32( synth_fx, synth_tmp_fx, output_frame ); /*q*/
410 :
411 : Word16 mem_len;
412 3 : mem_len = NS2SA_FX2( L_mult0( st->L_frame, FRAMES_PER_SEC ), STEREO_DFT32MS_OVL_NS ); /*Q0*/
413 3 : move16();
414 :
415 3 : Word16 qmem_len = norm_l( mem_len );
416 3 : Word32 mem_len_fx = L_shl( mem_len, qmem_len );
417 3 : Word32 mem_len_inv = (Word32) ( calc_inv / tmps );
418 3 : move32();
419 153 : FOR( i = 0; i < mem_len; i++ )
420 : {
421 150 : hCPE->input_mem_LB_fx[0][i] = Mpy_32_32( hCPE->input_mem_LB_fx[0][i], L_sub( mem_len_fx, L_shl( i, qmem_len ) ) ); /*Q11 + qmem_len - 31*/
422 150 : move32();
423 150 : hCPE->input_mem_LB_fx[0][i] = L_shl( Mpy_32_32( hCPE->input_mem_LB_fx[0][i], mem_len_inv ), sub( Q31, qmem_len ) ); /*Q11*/
424 150 : move32();
425 : }
426 3 : set32_fx( output_fx, 0, st->L_frame );
427 :
428 3 : stereo_dft_dec_analyze_fx( hCPE, output_fx, DFT_fx, 0, st->L_frame, output_frame, DFT_STEREO_DEC_ANA_LB, 0, 0, q, q_DFT );
429 :
430 : /* BPF */
431 3 : IF( st->p_bpf_noise_buf_32 )
432 : {
433 3 : Scale_sig32( st->p_bpf_noise_buf_32, st->L_frame, sub( *q, Q11 ) ); /*q*/
434 3 : stereo_dft_dec_analyze_fx( hCPE, st->p_bpf_noise_buf_32, DFT_fx, 0, st->L_frame, output_frame, DFT_STEREO_DEC_ANA_BPF, 0, 0, q, q_DFT );
435 : }
436 : }
437 : ELSE
438 : {
439 : /* ACELP */
440 43701 : FOR( i = 0; i < ( NS2SA_FX2( L_mult0( st->L_frame, FRAMES_PER_SEC ), STEREO_DFT32MS_OVL_NS ) - delay_dft_dec_lb ); i++ )
441 : {
442 42132 : hCPE->input_mem_LB_fx[0][i] = 0;
443 42132 : move32();
444 : }
445 : /* ACELP fading-in*/
446 1569 : Word16 qdelay_dft_dec_lb = norm_l( delay_dft_dec_lb );
447 1569 : Word32 delay_dft_dec_lb_inv = (Word32) ( calc_inv / delay_dft_dec_lb );
448 29657 : FOR( i = 0; i < delay_dft_dec_lb; i++ )
449 : {
450 56176 : hCPE->input_mem_LB_fx[0][( ( NS2SA( st->L_frame * FRAMES_PER_SEC, STEREO_DFT32MS_OVL_NS ) - delay_dft_dec_lb ) + i )] =
451 28088 : Mpy_32_32( hCPE->input_mem_LB_fx[0][( NS2SA( st->L_frame * FRAMES_PER_SEC, STEREO_DFT32MS_OVL_NS ) - delay_dft_dec_lb ) + i], L_shl( i, qdelay_dft_dec_lb ) ); /*Q11 + qdelay_dft_dec_lb -31*/
452 28088 : move32();
453 56176 : hCPE->input_mem_LB_fx[0][( ( NS2SA( st->L_frame * FRAMES_PER_SEC, STEREO_DFT32MS_OVL_NS ) - delay_dft_dec_lb ) + i )] =
454 28088 : L_shl( Mpy_32_32( hCPE->input_mem_LB_fx[0][( ( NS2SA( st->L_frame * FRAMES_PER_SEC, STEREO_DFT32MS_OVL_NS ) - delay_dft_dec_lb ) + i )], delay_dft_dec_lb_inv ), sub( Q31, qdelay_dft_dec_lb ) ); /*Q11*/
455 28088 : move32();
456 : }
457 1569 : stereo_dft_dec_analyze_fx( hCPE, output_fx, DFT_fx, 0, st->L_frame, output_frame, DFT_STEREO_DEC_ANA_LB, 0, 0, q, q_DFT );
458 :
459 : /* BPF */
460 1569 : IF( st->p_bpf_noise_buf_32 )
461 : {
462 1106 : Scale_sig32( st->p_bpf_noise_buf_32, st->L_frame, sub( *q, Q11 ) ); /*q*/
463 1106 : stereo_dft_dec_analyze_fx( hCPE, st->p_bpf_noise_buf_32, DFT_fx, 0, st->L_frame, output_frame, DFT_STEREO_DEC_ANA_BPF, 0, 0, q, q_DFT );
464 : }
465 :
466 : /* Fading-in TD-BWE, Fading-out FB-TCX*/
467 1569 : Copy32( synth_fx, synth_tmp_fx, output_frame ); /*q*/
468 1569 : IF( NE_16( hCPE->last_element_mode, IVAS_CPE_MDCT ) )
469 : {
470 1082 : Word16 qdelay_dft_dec = norm_l( delay_dft_dec );
471 1082 : Word32 delay_dft_dec_inv = (Word32) ( calc_inv / delay_dft_dec );
472 1082 : Word32 delay_dft_dec_fx = L_shl( delay_dft_dec, qdelay_dft_dec );
473 48502 : FOR( i = 0; i < delay_dft_dec; i++ ) /* 1.25 ms of hb_synth fade-in and TCX fade-out */
474 : {
475 142260 : hCPE->input_mem_fx[0][( ( NS2SA_FX2( L_mult0( L_frameTCX, FRAMES_PER_SEC ), STEREO_DFT32MS_OVL_NS ) - delay_dft_dec ) + i )] = L_add(
476 47420 : Mpy_32_32( hb_synth_fx[( ( delay_tdbwe - delay_dft_dec ) + i )], L_shl( i, qdelay_dft_dec ) ),
477 47420 : Mpy_32_32( hCPE->input_mem_fx[0][( ( NS2SA_FX2( L_mult0( L_frameTCX, FRAMES_PER_SEC ), STEREO_DFT32MS_OVL_NS ) - delay_dft_dec ) + i )], L_sub( delay_dft_dec_fx, L_shl( i, qdelay_dft_dec ) ) ) ); /*Q11 + qdelay_dft_dec - 31*/
478 47420 : move32();
479 47420 : hCPE->input_mem_fx[0][( ( NS2SA_FX2( L_mult0( L_frameTCX, FRAMES_PER_SEC ), STEREO_DFT32MS_OVL_NS ) - delay_dft_dec ) + i )] = L_shl(
480 47420 : Mpy_32_32( hCPE->input_mem_fx[0][( ( NS2SA_FX2( L_mult0( L_frameTCX, FRAMES_PER_SEC ), STEREO_DFT32MS_OVL_NS ) - delay_dft_dec ) + i )], delay_dft_dec_inv ),
481 47420 : sub( Q31, qdelay_dft_dec ) ); /*Q11*/
482 47420 : move32();
483 : }
484 48502 : FOR( i = 0; i < delay_dft_dec; i++ ) /* 1.25 ms of hb_synth fade out. ICBWE fade in performed in time domain here */
485 : {
486 47420 : synth_tmp_fx[i] = Mpy_32_32( hb_synth_fx[( ( delay_tdbwe - delay_dft_dec ) + i )], L_sub( delay_dft_dec_fx, L_shl( i, qdelay_dft_dec ) ) ); /*q + qdelay_dft_dec - 31*/
487 47420 : move32();
488 47420 : synth_tmp_fx[i] = L_shl( Mpy_32_32( synth_tmp_fx[i], delay_dft_dec_inv ), sub( Q31, qdelay_dft_dec ) ); /*q*/
489 47420 : move32();
490 : }
491 :
492 712382 : FOR( ; i < output_frame; i++ )
493 : {
494 711300 : synth_tmp_fx[i] = 0;
495 711300 : move32();
496 : }
497 : }
498 : }
499 :
500 :
501 1572 : IF( sba_dirac_stereo_dtx_flag )
502 : {
503 3 : stereo_dft_dec_analyze_fx( hCPE, synth_tmp_fx, DFT_fx, 0, output_frame, output_frame, DFT_STEREO_DEC_ANA_FB_ADD, 0, 0, q, q_DFT );
504 : }
505 1569 : ELSE IF( EQ_16( hCPE->last_element_mode, IVAS_CPE_MDCT ) )
506 : {
507 487 : stereo_dft_dec_analyze_fx( hCPE, synth_tmp_fx, DFT_fx, 0, output_frame, output_frame, DFT_STEREO_DEC_ANA_HB_ADD, 1, 0, q, q_DFT );
508 : }
509 : ELSE
510 : {
511 1082 : stereo_dft_dec_analyze_fx( hCPE, synth_tmp_fx, DFT_fx, 0, output_frame, output_frame, DFT_STEREO_DEC_ANA_FB_ADD, 1, 0, q, q_DFT );
512 : }
513 : }
514 : ELSE /* ACELP -> ACELP */
515 : {
516 34511 : test();
517 34511 : test();
518 34511 : test();
519 34511 : test();
520 34511 : IF( sba_dirac_stereo_dtx_flag && LE_32( st->core_brate, SID_2k40 ) && EQ_16( st->cng_type, FD_CNG ) )
521 : {
522 88 : set32_fx( output_fx, 0, st->L_frame );
523 : }
524 : /* this needs an indication FOR sba2stereo in general */
525 34423 : ELSE IF( EQ_16( hCPE->element_mode, IVAS_SCE ) && LE_32( st->last_core_brate, SID_2k40 ) && EQ_16( st->cng_type, FD_CNG ) )
526 : {
527 0 : L_lerp_fx_q11( hCPE->input_mem_fx[0], hCPE->input_mem_LB_fx[0], NS2SA_FX2( L_mult0( st->L_frame, FRAMES_PER_SEC ), STEREO_DFT32MS_OVL_NS ), NS2SA_FX2( L_mult0( output_frame, FRAMES_PER_SEC ), STEREO_DFT32MS_OVL_NS ) );
528 : }
529 :
530 : /* ACELP synthesis @ internal sampling rate */
531 :
532 34511 : stereo_dft_dec_analyze_fx( hCPE, output_fx, DFT_fx, 0, st->L_frame, output_frame, DFT_STEREO_DEC_ANA_LB, 0, 0, q, q_DFT );
533 :
534 : /* BPF */
535 34511 : IF( st->p_bpf_noise_buf_32 )
536 : {
537 32090 : Scale_sig32( st->p_bpf_noise_buf_32, st->L_frame, sub( *q, Q11 ) ); /*q*/
538 32090 : stereo_dft_dec_analyze_fx( hCPE, st->p_bpf_noise_buf_32, DFT_fx, 0, st->L_frame, output_frame, DFT_STEREO_DEC_ANA_BPF, 0, 0, q, q_DFT );
539 : }
540 :
541 : /* BWE */
542 34511 : test();
543 34511 : test();
544 34511 : test();
545 34511 : test();
546 34511 : IF( sba_dirac_stereo_dtx_flag && LE_32( st->core_brate, SID_2k40 ) && EQ_16( st->cng_type, FD_CNG ) )
547 : {
548 88 : stereo_dft_dec_analyze_fx( hCPE, synth_fx, DFT_fx, 0, output_frame, output_frame, DFT_STEREO_DEC_ANA_FB_ADD, 0, 0, q, q_DFT );
549 : }
550 34423 : ELSE IF( NE_16( st->extl, -1 ) || ( ( st->bws_cnt > 0 ) && EQ_16( st->core, ACELP_CORE ) ) )
551 : {
552 29822 : stereo_dft_dec_analyze_fx( hCPE, hb_synth_fx, DFT_fx, 0, output_frame, output_frame, DFT_STEREO_DEC_ANA_FB_ADD, 2, negate( delay_tdbwe ), q, q_DFT );
553 : }
554 : }
555 : }
556 :
557 : /*----------------------------------------------------------------*
558 : * enhanced stereo filling: allpass filter
559 : *----------------------------------------------------------------*/
560 :
561 64203 : IF( EQ_16( hCPE->hStereoDft->hConfig->res_pred_mode, STEREO_DFT_RESPRED_ESF ) )
562 : {
563 32604 : IF( EQ_32( st->sr_core, INT_FS_12k8 ) )
564 : {
565 20023 : ap_fade_len = STEREO_DFT_ALLPASS_FADELEN_12k8;
566 20023 : move16();
567 20023 : ap_fade_len_inv = 67108864; /*1/32 in Q31*/
568 20023 : move32();
569 : }
570 : ELSE
571 : {
572 12581 : ap_fade_len = STEREO_DFT_ALLPASS_FADELEN_16k;
573 12581 : move16();
574 12581 : ap_fade_len_inv = 53687091; /*1/40 in Q31*/
575 12581 : move32();
576 : }
577 :
578 32604 : qap_fade_len = norm_l( ap_fade_len );
579 32604 : ap_fade_len_fx = L_shl( ap_fade_len, qap_fade_len );
580 :
581 32604 : test();
582 32604 : test();
583 32604 : test();
584 32604 : test();
585 32604 : test();
586 32604 : IF( EQ_16( st->core, TCX_20_CORE ) || EQ_16( st->core, TCX_10_CORE ) || EQ_16( st->core, HQ_CORE ) || ( EQ_16( st->bfi, 1 ) && EQ_16( st->core, ACELP_CORE ) && EQ_16( st->con_tcx, 1 ) ) )
587 11372 : {
588 11372 : Word16 numZeros = (Word16) ( NS2SA_FX2( st->sr_core, N_ZERO_MDCT_NS ) ); /*Q0*/
589 : Word32 tmp_fade_fx[max( STEREO_DFT_ALLPASS_FADELEN_12k8, STEREO_DFT_ALLPASS_FADELEN_16k )];
590 :
591 11372 : Copy32( st->hHQ_core->old_out_LB_fx32 + numZeros, hCPE->hStereoDft->ap_fade_mem_fx, ap_fade_len ); /*st->hHQ_core->q_old_outLB_fx*/
592 11372 : hCPE->hStereoDft->q_ap_fade_mem_fx = st->hHQ_core->Q_old_out_fx32;
593 11372 : move16();
594 :
595 11372 : test();
596 11372 : test();
597 11372 : test();
598 11372 : test();
599 11372 : test();
600 11372 : IF( EQ_16( st->last_core, ACELP_CORE ) && !( EQ_16( st->prev_bfi, 1 ) && EQ_16( st->last_core, ACELP_CORE ) && EQ_16( st->last_con_tcx, 1 ) ) && !st->tcxonly )
601 : {
602 786 : Copy32( tcx_core_buf_fx, pAp_input_fx, st->L_frame ); /*q*/
603 : }
604 : ELSE
605 : {
606 10586 : Copy32( output_fx, pAp_input_fx, st->L_frame ); /*q*/
607 : }
608 :
609 11372 : IF( EQ_16( st->last_core, ACELP_CORE ) && EQ_16( EQ_16( st->prev_bfi, 1 ) && EQ_16( st->last_core, ACELP_CORE ) && EQ_16( st->last_con_tcx, 1 ), 0 ) && !st->tcxonly ) /* ACELP -> TCX/HQ-Core */
610 : {
611 786 : Copy32( tcx_core_buf_fx, tmp_fade_fx, ap_fade_len ); /*q*/
612 29146 : FOR( i = 0; i < ap_fade_len; i++ )
613 : {
614 28360 : pAp_input_fx[i] = L_add(
615 : Mpy_32_32( pAp_input_fx[i], L_shl( i, qap_fade_len ) ),
616 : Mpy_32_32( tmp_fade_fx[i], L_sub( ap_fade_len_fx, L_shl( i, qap_fade_len ) ) ) ); /*q + qap_fade_len - 31*/
617 28360 : move32();
618 28360 : pAp_input_fx[i] = L_shl( Mpy_32_32( pAp_input_fx[i], ap_fade_len_inv ), sub( Q31, qap_fade_len ) ); /*q*/
619 28360 : move32();
620 : }
621 : }
622 : }
623 : ELSE
624 : {
625 21232 : Copy32( output_fx, pAp_input_fx, st->L_frame ); /*q*/
626 21232 : IF( NE_16( st->last_core, ACELP_CORE ) ) /* TCX/HQ-Core -> ACELP */
627 : {
628 1044 : Word16 shift = sub( hCPE->hStereoDft->q_ap_fade_mem_fx, q_DFT[0] );
629 37164 : FOR( i = 0; i < ap_fade_len; i++ )
630 : {
631 72240 : pAp_input_fx[i] = L_add(
632 : Mpy_32_32( pAp_input_fx[i], L_shl( i, qap_fade_len ) ),
633 36120 : Mpy_32_32( L_shr( hCPE->hStereoDft->ap_fade_mem_fx[i], shift ), L_sub( ap_fade_len_fx, L_shl( i, qap_fade_len ) ) ) ); /*q + qap_fade_len - 31*/
634 36120 : move32();
635 36120 : pAp_input_fx[i] = L_shl( Mpy_32_32( pAp_input_fx[i], ap_fade_len_inv ), sub( Q31, qap_fade_len ) ); /*q*/
636 36120 : move32();
637 : }
638 : }
639 : }
640 32604 : predelay = NS2SA_FX2( st->sr_core, DELAY_BWE_TOTAL_NS ); /*Q0*/
641 32604 : move16();
642 :
643 : /* apply predelay to have same overall filter delay FOR all cases */
644 :
645 32604 : delay_signal_q_adj_fx( pAp_input_fx, st->L_frame, hCPE->hStereoDft->ap_delay_mem_fx, predelay, *q, hCPE->hStereoDft->q_ap_delay_mem_fx );
646 :
647 : /* input zeroes FOR transient frames */
648 32604 : IF( hCPE->hStereoDft->attackPresent )
649 : {
650 965 : IF( hCPE->hStereoDft->ap_wasTransient )
651 : {
652 76 : set32_fx( pAp_input_fx, 0, ap_fade_len );
653 : }
654 : ELSE
655 : {
656 31849 : FOR( i = 0; i < ap_fade_len; i++ )
657 : {
658 30960 : pAp_input_fx[i] = Mpy_32_32( pAp_input_fx[i], L_sub( ap_fade_len_fx, L_shl( i, qap_fade_len ) ) ); /*q + qap_fade_len - 31*/
659 30960 : move32();
660 30960 : pAp_input_fx[i] = L_shl( Mpy_32_32( pAp_input_fx[i], ap_fade_len_inv ), sub( Q31, qap_fade_len ) ); /*q*/
661 30960 : move32();
662 : }
663 : }
664 965 : set32_fx( pAp_input_fx + ap_fade_len, 0, st->L_frame - ap_fade_len );
665 965 : hCPE->hStereoDft->ap_wasTransient = 1;
666 965 : move16();
667 : }
668 31639 : ELSE IF( hCPE->hStereoDft->ap_wasTransient )
669 : {
670 31808 : FOR( i = 0; i < ap_fade_len; i++ )
671 : {
672 30920 : pAp_input_fx[i] = Mpy_32_32( pAp_input_fx[i], L_shl( i, qap_fade_len ) ); /*q + qap_fade_len - 31*/
673 30920 : move32();
674 30920 : pAp_input_fx[i] = L_shl( Mpy_32_32( pAp_input_fx[i], ap_fade_len_inv ), sub( Q31, qap_fade_len ) ); /*q*/
675 30920 : move32();
676 : }
677 888 : hCPE->hStereoDft->ap_wasTransient = 0;
678 888 : move16();
679 : }
680 :
681 : /* apply 5-stage allpass, each stage consisting of a nested allpass pair */
682 32604 : filter_with_allpass_fx( pAp_input_fx, pAp_input_fx, st->L_frame, &hCPE->hStereoDft->ap1, *q );
683 32604 : filter_with_allpass_fx( pAp_input_fx, pAp_input_fx, st->L_frame, &hCPE->hStereoDft->ap2, *q );
684 32604 : filter_with_allpass_fx( pAp_input_fx, pAp_input_fx, st->L_frame, &hCPE->hStereoDft->ap3, *q );
685 :
686 : /* apply DFT to allpass-filtered signal */
687 32604 : stereo_dft_dec_analyze_fx( hCPE, pAp_input_fx, DFT_fx, 1, st->L_frame, output_frame, DFT_STEREO_DEC_ANA_FB, 0, 0, q, q_DFT );
688 32604 : hCPE->hStereoDft->q_ap_delay_mem_fx = *q;
689 32604 : move16();
690 : }
691 :
692 64203 : IF( EQ_16( st->core, ACELP_CORE ) )
693 : {
694 46461 : IF( !use_cldfb_for_dft ) /* Skip this FOR DFT Stereo mono output at non-residual bitrates */
695 : {
696 31678 : L_lerp_fx_q11( output_fx, synth_fx, output_frame, hCPE->hCoreCoder[0]->L_frame ); /* Dirty resampling, but should be good enough FOR ECU analysis */
697 : }
698 46461 : test();
699 46461 : test();
700 46461 : test();
701 46461 : test();
702 46461 : test();
703 46461 : IF( !use_cldfb_for_dft || ( ( EQ_32( st->core_brate, FRAME_NO_DATA ) || EQ_32( st->core_brate, SID_2k40 ) ) && EQ_16( st->cng_type, LP_CNG ) && EQ_16( st->extl, SWB_CNG ) && EQ_16( hCPE->nchan_out, 1 ) ) )
704 : {
705 32477 : v_add_fx( synth_fx, hb_synth_fx, synth_fx, output_frame ); /* Use one channel TD-BWE FOR ECU analysis buffer */ /*q*/
706 : }
707 : }
708 :
709 :
710 64203 : return;
711 : }
|