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 "ivas_cnst.h"
39 : #include "rom_com.h"
40 : #include "prot.h"
41 : #include "ivas_prot.h"
42 : #include "ivas_prot_rend.h"
43 : #include "ivas_rom_com.h"
44 : #ifdef DEBUGGING
45 : #include "debug.h"
46 : #endif
47 : #include "wmc_auto.h"
48 : #ifdef DEBUG_PLOT
49 : #include "deb_out.h"
50 : #endif
51 :
52 :
53 : /*-----------------------------------------------------------------------*
54 : * Local function prototypes
55 : *-----------------------------------------------------------------------*/
56 :
57 : static ivas_error ivas_mc_dec_reconfig( Decoder_Struct *st_ivas );
58 :
59 :
60 : /*--------------------------------------------------------------------------*
61 : * ivas_mct_dec()
62 : *
63 : * Multi-channel Coding Tool (MCT) decoding routine
64 : *--------------------------------------------------------------------------*/
65 :
66 3959805 : ivas_error ivas_mct_dec(
67 : Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
68 : float *output[], /* o : output synthesis signal */
69 : const int16_t output_frame, /* i : output frame length per channel */
70 : const int16_t nb_bits_metadata /* i : number of metadata bits */
71 : )
72 : {
73 : int16_t n, nCPE, cpe_id;
74 : MCT_DEC_HANDLE hMCT;
75 : CPE_DEC_HANDLE hCPE;
76 : float *x[CPE_CHANNELS][NB_DIV];
77 : int16_t param[MCT_MAX_BLOCKS][CPE_CHANNELS][DEC_NPRM_DIV * NB_DIV];
78 : int16_t param_lpc[MCT_MAX_BLOCKS][CPE_CHANNELS][NPRM_LPC_NEW];
79 : int16_t p_param[MCT_MAX_BLOCKS][CPE_CHANNELS][NB_DIV];
80 : int16_t nTnsBitsTCX10[MCT_MAX_BLOCKS][CPE_CHANNELS][NB_DIV];
81 : float Aq[MCT_MAX_BLOCKS][CPE_CHANNELS][( NB_SUBFR16k + 1 ) * ( M + 1 )];
82 : int16_t fUseTns[MCT_MAX_BLOCKS][CPE_CHANNELS][NB_DIV];
83 : STnsData tnsData[MCT_MAX_BLOCKS][CPE_CHANNELS][NB_DIV];
84 : Decoder_State **sts;
85 : float synth[CPE_CHANNELS][L_FRAME_PLUS];
86 : float *p_output_orig[2];
87 : float output_lfe_ch[L_FRAME48k];
88 : int32_t ivas_total_brate;
89 : ivas_error error;
90 :
91 3959805 : push_wmops( "ivas_mct_dec" );
92 :
93 3959805 : error = IVAS_ERR_OK;
94 3959805 : nCPE = st_ivas->nCPE;
95 3959805 : hMCT = st_ivas->hMCT;
96 :
97 3959805 : ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate;
98 :
99 3959805 : if ( st_ivas->ivas_format == MC_FORMAT && ( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) )
100 : {
101 : /* save LFE channel */
102 1162641 : mvr2r( output[LFE_CHANNEL], output_lfe_ch, output_frame );
103 : }
104 :
105 3959805 : if ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCT && !st_ivas->bfi )
106 : {
107 : /* get the number of channels from the signalled MC LS setup */
108 1043964 : n = ivas_mc_ls_setup_get_num_channels( ivas_mc_map_output_config_to_mc_ls_setup( st_ivas->transport_config ) );
109 :
110 1043964 : if ( n != st_ivas->nchan_transport )
111 : {
112 : /* IVAS_fmToDo: more work needed for switching the number of transport channels */
113 0 : return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error: wrong number of transport channels signalled in MC format!" );
114 : }
115 : }
116 :
117 15045111 : for ( cpe_id = 0; cpe_id < nCPE; cpe_id++ )
118 : {
119 : /*initialize param_lpc buffer*/
120 33255918 : for ( n = 0; n < CPE_CHANNELS; n++ )
121 : {
122 22170612 : set_s( param_lpc[cpe_id][n], 0, NPRM_LPC_NEW );
123 : }
124 :
125 11085306 : if ( ( error = ivas_cpe_dec( st_ivas, cpe_id, output, output_frame, 0 ) ) != IVAS_ERR_OK )
126 : {
127 0 : return error;
128 : }
129 :
130 11085306 : if ( cpe_id == 0 )
131 : {
132 3959805 : st_ivas->hCPE[0]->hCoreCoder[0]->total_brate = ivas_total_brate; /* set high enough to read the whole side-info; total_brate is rewritten later in ivas_mdct_core_invQ() */
133 : }
134 :
135 11085306 : if ( !st_ivas->bfi )
136 : {
137 10748154 : ivas_mdct_dec_side_bits_frame_channel( st_ivas->hCPE[cpe_id], param_lpc[cpe_id], p_param[cpe_id], st_ivas->hCPE[0]->hCoreCoder[0], nTnsBitsTCX10[cpe_id], param[cpe_id], 1,
138 10748154 : ( ( cpe_id + 1 ) * CPE_CHANNELS > hMCT->nchan_out_woLFE ) );
139 :
140 10748154 : st_ivas->BER_detect |= st_ivas->hCPE[cpe_id]->hCoreCoder[0]->BER_detect;
141 10748154 : st_ivas->BER_detect |= st_ivas->hCPE[cpe_id]->hCoreCoder[1]->BER_detect;
142 : }
143 : }
144 :
145 : /* MCT side bits decoder */
146 3959805 : ivas_mct_side_bits( hMCT, st_ivas->hCPE, nCPE, st_ivas->hCPE[0]->hCoreCoder[0], st_ivas->bfi, st_ivas->hCPE[0]->hCoreCoder[0]->bit_stream, ivas_total_brate, nb_bits_metadata );
147 :
148 : /* in case of switching from an SID frame (with ACELP core) to MCT, buffer of L_FRAME_PLUS samples is needed -> use synth[] as a temporary buffer */
149 3959805 : if ( st_ivas->hCPE[0]->hCoreCoder[0]->last_core == ACELP_CORE )
150 : {
151 27 : for ( n = 0; n < CPE_CHANNELS; n++ )
152 : {
153 18 : p_output_orig[n] = output[n];
154 18 : output[n] = synth[n];
155 : }
156 : }
157 :
158 15045111 : for ( cpe_id = 0; cpe_id < nCPE; cpe_id++ )
159 : {
160 11085306 : st_ivas->hCPE[cpe_id]->hCoreCoder[0]->BER_detect |= st_ivas->BER_detect;
161 11085306 : st_ivas->hCPE[cpe_id]->hCoreCoder[1]->BER_detect |= st_ivas->BER_detect;
162 :
163 33255918 : for ( n = 0; n < CPE_CHANNELS; n++ )
164 : {
165 22170612 : x[n][0] = output[n + cpe_id * CPE_CHANNELS];
166 22170612 : x[n][1] = output[n + cpe_id * CPE_CHANNELS] + ( L_FRAME48k / 2 );
167 22170612 : set_zero( x[n][0], L_FRAME48k / 2 );
168 22170612 : set_zero( x[n][1], L_FRAME48k / 2 );
169 : }
170 :
171 11085306 : ivas_mdct_core_invQ( st_ivas->hCPE[cpe_id], nTnsBitsTCX10[cpe_id], p_param[cpe_id], param_lpc[cpe_id], param[cpe_id],
172 11085306 : fUseTns[cpe_id], tnsData[cpe_id], x, x, Aq[cpe_id], NULL, 1 );
173 :
174 11085306 : st_ivas->BER_detect |= st_ivas->hCPE[cpe_id]->hCoreCoder[0]->BER_detect;
175 11085306 : st_ivas->BER_detect |= st_ivas->hCPE[cpe_id]->hCoreCoder[1]->BER_detect;
176 : }
177 :
178 : /* MCT core decoder */
179 3959805 : ivas_mct_core_dec( hMCT, st_ivas->hCPE, nCPE, output );
180 :
181 : /* for sba to stereo output disable any further processing for TCs > 2 as it is not needed*/
182 3959805 : if ( st_ivas->sba_dirac_stereo_flag && st_ivas->ivas_format != SBA_ISM_FORMAT )
183 : {
184 122586 : for ( cpe_id = 1; cpe_id < nCPE; cpe_id++ )
185 : {
186 183879 : for ( n = 0; n < CPE_CHANNELS; n++ )
187 : {
188 122586 : st_ivas->hCPE[cpe_id]->hCoreCoder[n]->mct_chan_mode = MCT_CHAN_MODE_IGNORE;
189 : }
190 : }
191 : }
192 :
193 : /* MCT reconstruction and CoreCoder updates */
194 15045111 : for ( cpe_id = 0; cpe_id < nCPE; cpe_id++ )
195 : {
196 11085306 : hCPE = st_ivas->hCPE[cpe_id];
197 :
198 33255918 : for ( n = 0; n < CPE_CHANNELS; n++ )
199 : {
200 22170612 : x[n][0] = output[n + cpe_id * CPE_CHANNELS];
201 22170612 : x[n][1] = output[n + cpe_id * CPE_CHANNELS] + ( L_FRAME48k / 2 );
202 : }
203 :
204 11085306 : ivas_mdct_core_tns_ns( hCPE, fUseTns[cpe_id], tnsData[cpe_id], x, Aq[cpe_id], 1 );
205 : }
206 :
207 3959805 : if ( st_ivas->renderer_type == RENDERER_MC )
208 : {
209 : /* Equalization in MDCT Domain */
210 165543 : ivas_ls_setup_conversion_process_mdct( st_ivas, output );
211 : }
212 :
213 3794262 : else if ( st_ivas->renderer_type == RENDERER_MC_PARAMMC && ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_MONO || st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_STEREO ) )
214 : {
215 : float *x_all[MAX_LS_CHANNELS][NB_DIV];
216 :
217 8064 : for ( cpe_id = 0; cpe_id < nCPE; cpe_id++ )
218 : {
219 16128 : for ( n = 0; n < CPE_CHANNELS; n++ )
220 : {
221 10752 : x_all[n + cpe_id * CPE_CHANNELS][0] = output[n + cpe_id * CPE_CHANNELS];
222 10752 : x_all[n + cpe_id * CPE_CHANNELS][1] = output[n + cpe_id * CPE_CHANNELS] + ( L_FRAME48k / 2 );
223 : }
224 : }
225 :
226 2688 : ivas_ls_setup_conversion_process_mdct_param_mc( st_ivas, x_all );
227 : }
228 :
229 15045111 : for ( cpe_id = 0; cpe_id < nCPE; cpe_id++ )
230 : {
231 11085306 : hCPE = st_ivas->hCPE[cpe_id];
232 11085306 : sts = hCPE->hCoreCoder;
233 :
234 33255918 : for ( n = 0; n < CPE_CHANNELS; n++ )
235 : {
236 22170612 : x[n][0] = output[n + cpe_id * CPE_CHANNELS];
237 22170612 : x[n][1] = output[n + cpe_id * CPE_CHANNELS] + ( L_FRAME48k / 2 );
238 : }
239 :
240 11085306 : ivas_mdct_core_reconstruct( hCPE, x, synth, fUseTns[cpe_id], 1 );
241 :
242 : /* set pointers back */
243 11085306 : if ( cpe_id == 0 && st_ivas->hCPE[0]->hCoreCoder[0]->last_core == ACELP_CORE )
244 : {
245 27 : for ( n = 0; n < CPE_CHANNELS; n++ )
246 : {
247 18 : output[n] = p_output_orig[n];
248 : }
249 : }
250 :
251 : /*----------------------------------------------------------------*
252 : * CoreCoder Post-processing and updates
253 : *----------------------------------------------------------------*/
254 :
255 33255918 : for ( n = 0; n < CPE_CHANNELS; n++ )
256 : {
257 22170612 : if ( st_ivas->sba_dirac_stereo_flag && ( st_ivas->ivas_format != SBA_ISM_FORMAT || cpe_id >= nCPE - 2 ) )
258 : {
259 490368 : ivas_post_proc( NULL, hCPE, n, synth[n], NULL, output_frame, 1 );
260 : }
261 :
262 : /* Postprocessing for ACELP/MDCT core switching and synchronization */
263 22170612 : if ( ( error = core_switching_post_dec( sts[n], synth[n], output[cpe_id * CPE_CHANNELS + n], hCPE->output_mem[1], 0, output_frame, 0 /*core_switching_flag*/, ( st_ivas->ivas_format != SBA_ISM_FORMAT || cpe_id >= nCPE - 2 ) ? st_ivas->sba_dirac_stereo_flag : 0, -1, hCPE->last_element_mode ) ) != IVAS_ERR_OK )
264 : {
265 0 : return error;
266 : }
267 :
268 : /* final output of synthesis signal */
269 22170612 : mvr2r( synth[n], output[cpe_id * CPE_CHANNELS + n], output_frame );
270 :
271 : /* Save synthesis for HQ FEC */
272 22170612 : save_synthesis_hq_fec( sts[n], output[cpe_id * CPE_CHANNELS + n], output_frame, hCPE );
273 :
274 : /* CoreCoder common updates */
275 22170612 : updt_dec_common( sts[n], NORMAL_HQ_CORE, -1, output[cpe_id * CPE_CHANNELS + n] );
276 :
277 : #ifdef DEBUG_PLOT
278 : sendDebout( "mct_synth", output_frame, 1, "aftPostPro", MTV_FLOAT, output[cpe_id * CPE_CHANNELS + n] );
279 : #endif
280 : } /* n_channels loop */
281 :
282 : /* synthesis synchronization between stereo modes */
283 11085306 : if ( !st_ivas->sba_dirac_stereo_flag || ( st_ivas->ivas_format == SBA_ISM_FORMAT && cpe_id < nCPE - 2 ) )
284 : {
285 10840122 : synchro_synthesis( ivas_total_brate, hCPE, output + cpe_id * CPE_CHANNELS, output_frame, 0 );
286 : }
287 :
288 : #ifdef DEBUG_PLOT
289 : for ( n = 0; n < CPE_CHANNELS; n++ )
290 : {
291 : setDeboutVars( -1, -1, n, cpe_id );
292 : sendDebout( "mct_synth", output_frame, 1, "aftSynchro", MTV_FLOAT, output[cpe_id * CPE_CHANNELS + n] );
293 : }
294 : #endif
295 : }
296 :
297 : /* move channels after LFE to correct output for multi-channel MCT */
298 3959805 : if ( st_ivas->ivas_format == MC_FORMAT && ( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) )
299 : {
300 : float tmp[L_FRAME48k];
301 :
302 : /*save center channel output*/
303 1162641 : mvr2r( output[hMCT->nchan_out_woLFE - 1], tmp, output_frame );
304 :
305 5825253 : for ( n = hMCT->nchan_out_woLFE - 1; n >= LFE_CHANNEL; n-- )
306 : {
307 4662612 : mvr2r( output[n - 1], output[n + 1], output_frame );
308 : }
309 1162641 : mvr2r( tmp, output[LFE_CHANNEL - 1], output_frame );
310 :
311 : /* save LFE channel */
312 1162641 : mvr2r( output_lfe_ch, output[LFE_CHANNEL], output_frame );
313 : }
314 :
315 : #ifdef DEBUG_MODE_INFO
316 : for ( cpe_id = 0; cpe_id < nCPE; cpe_id++ )
317 : {
318 : float tmpF = st_ivas->hCPE[cpe_id]->element_brate / 1000.0f;
319 : dbgwrite( &tmpF, sizeof( float ), 1, output_frame, fname( debug_dir, "element_brate", 0, cpe_id, DEC ) );
320 :
321 : dbgwrite( output[0], sizeof( float ), output_frame, 1, fname( debug_dir, "output.mct", 0, cpe_id, DEC ) );
322 : tmpF = 0;
323 : dbgwrite( &tmpF, sizeof( float ), 1, output_frame, fname( debug_dir, "output.sce", 0, cpe_id, DEC ) );
324 : dbgwrite( &tmpF, sizeof( float ), 1, output_frame, fname( debug_dir, "output.cpe", 0, cpe_id, DEC ) );
325 : }
326 : #endif
327 :
328 3959805 : pop_wmops();
329 3959805 : return error;
330 : }
331 :
332 :
333 : /*-------------------------------------------------------------------------
334 : * create_mct_dec()
335 : *
336 : * Create, allocate and initialize IVAS decoder MCT handle
337 : *-------------------------------------------------------------------------*/
338 :
339 28506 : ivas_error create_mct_dec(
340 : Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */
341 : )
342 : {
343 : MCT_DEC_HANDLE hMCT;
344 : int16_t n;
345 : int32_t cp_bitrate;
346 : int16_t max_blocks;
347 : int16_t cpe_id;
348 :
349 : /*--------------------------------------------------------- --------*
350 : * Allocate MCT handle
351 : *-----------------------------------------------------------------*/
352 :
353 28506 : if ( ( hMCT = (MCT_DEC_HANDLE) malloc( sizeof( MCT_DEC_DATA ) ) ) == NULL )
354 : {
355 0 : return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for CPE\n" ) );
356 : }
357 :
358 : /*-----------------------------------------------------------------*
359 : * Allocate MCT BlockData handles
360 : *-----------------------------------------------------------------*/
361 :
362 : /* Determine active channels */
363 28506 : if ( ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMMC ) || st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT )
364 : {
365 14634 : hMCT->nchan_out_woLFE = st_ivas->nchan_transport;
366 14634 : if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC )
367 : {
368 3816 : hMCT->nchan_out_woLFE += st_ivas->nchan_ism;
369 : }
370 : }
371 13872 : else if ( st_ivas->mc_mode == MC_MODE_MCT )
372 : {
373 12462 : hMCT->nchan_out_woLFE = st_ivas->nchan_transport - st_ivas->hTransSetup.num_lfe;
374 : }
375 1410 : else if ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMUPMIX )
376 : {
377 1410 : hMCT->nchan_out_woLFE = st_ivas->nchan_transport - st_ivas->hTransSetup.num_lfe;
378 : }
379 : else
380 : {
381 0 : assert( !"IVAS format currently not supported for MCT" );
382 : }
383 :
384 28506 : cp_bitrate = st_ivas->hDecoderConfig->ivas_total_brate / hMCT->nchan_out_woLFE * CPE_CHANNELS;
385 :
386 28506 : if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC )
387 : {
388 3816 : cp_bitrate = st_ivas->hDecoderConfig->ivas_total_brate / st_ivas->nchan_transport * CPE_CHANNELS;
389 : }
390 :
391 : /* indicate LFE for appropriate core-coder channel */
392 119238 : for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ )
393 : {
394 272196 : for ( n = 0; n < CPE_CHANNELS; n++ )
395 : {
396 181464 : st_ivas->hCPE[cpe_id]->hCoreCoder[n]->mct_chan_mode = MCT_CHAN_MODE_REGULAR;
397 : }
398 : }
399 :
400 : /* in case we have an uneven number of transport channels, indicate last channel ID as inactive */
401 28506 : if ( hMCT->nchan_out_woLFE % 2 )
402 : {
403 24114 : st_ivas->hCPE[st_ivas->nCPE - 1]->hCoreCoder[1]->mct_chan_mode = MCT_CHAN_MODE_IGNORE;
404 : }
405 :
406 : /*Initialize MCT block data */
407 28506 : max_blocks = hMCT->nchan_out_woLFE / 2;
408 :
409 95124 : for ( n = 0; n < max_blocks; n++ )
410 : {
411 66618 : if ( ( hMCT->hBlockData[n] = (MCT_DEC_BLOCK_DATA_HANDLE) malloc( sizeof( MCT_DEC_BLOCK_DATA ) ) ) == NULL )
412 : {
413 0 : return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MCT block data structure\n" ) );
414 : }
415 :
416 : /*Initialize all parameters to zero*/
417 66618 : hMCT->hBlockData[n]->ch1 = 0;
418 66618 : hMCT->hBlockData[n]->ch2 = 0;
419 :
420 : /*-----------------------------------------------------------------*
421 : * MDCT stereo initialization
422 : *-----------------------------------------------------------------*/
423 :
424 66618 : if ( ( hMCT->hBlockData[n]->hStereoMdct = (STEREO_MDCT_DEC_DATA_HANDLE) malloc( sizeof( STEREO_MDCT_DEC_DATA ) ) ) == NULL )
425 : {
426 0 : return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MDCT Stereo \n" ) );
427 : }
428 :
429 66618 : initMdctStereoDecData( hMCT->hBlockData[n]->hStereoMdct, st_ivas->hCPE[0]->hCoreCoder[0]->igf, st_ivas->hCPE[0]->hCoreCoder[0]->hIGFDec->igfData.igfInfo.grid, cp_bitrate, SWB );
430 66618 : hMCT->hBlockData[n]->hStereoMdct->use_itd = 0;
431 66618 : hMCT->hBlockData[n]->hStereoMdct->reverse_dmx = 0;
432 66618 : hMCT->hBlockData[n]->hStereoMdct->smooth_ratio = 1.f;
433 : }
434 132924 : for ( ; n < MCT_MAX_BLOCKS; n++ )
435 : {
436 104418 : hMCT->hBlockData[n] = NULL;
437 : }
438 :
439 : /*-----------------------------------------------------------------*
440 : * Initializations
441 : *-----------------------------------------------------------------*/
442 :
443 28506 : hMCT->currBlockDataCnt = 0;
444 :
445 : /*Initialize bits required to signal channel-pair index*/
446 28506 : hMCT->bitsChannelPairIndex = max( 1, (int16_t) ( floorf( ( logf( (float) hMCT->nchan_out_woLFE * ( hMCT->nchan_out_woLFE - 1 ) / 2 - 1 ) * INV_LOG_2 ) ) + 1 ) );
447 :
448 28506 : set_s( hMCT->chBitRatios, 0, MCT_MAX_CHANNELS );
449 28506 : set_s( hMCT->lowE_ch, 0, MCT_MAX_CHANNELS );
450 :
451 28506 : st_ivas->hMCT = hMCT;
452 :
453 28506 : return IVAS_ERR_OK;
454 : }
455 :
456 :
457 : /*-------------------------------------------------------------------------
458 : * mct_dec_reconfigure()
459 : *
460 : * Reconfigure IVAS decoder MCT handle
461 : *-------------------------------------------------------------------------*/
462 :
463 20085 : ivas_error mct_dec_reconfigure(
464 : Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
465 : const uint16_t b_nchan_change /* i : flag indicating different channel count */
466 : )
467 : {
468 : MCT_DEC_HANDLE hMCT;
469 : Decoder_State *st;
470 : int16_t n, cpe_id, max_blocks;
471 : int32_t cp_bitrate;
472 :
473 20085 : hMCT = st_ivas->hMCT;
474 :
475 : /*-----------------------------------------------------------------*
476 : * Allocate and initialize MCT BlockData handles
477 : *-----------------------------------------------------------------*/
478 :
479 20085 : if ( b_nchan_change )
480 : {
481 : /* Determine active channels */
482 9906 : if ( ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMMC ) || st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT )
483 : {
484 7629 : hMCT->nchan_out_woLFE = st_ivas->nchan_transport;
485 7629 : if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC )
486 : {
487 2433 : hMCT->nchan_out_woLFE += st_ivas->nchan_ism;
488 : }
489 : }
490 2277 : else if ( st_ivas->mc_mode == MC_MODE_MCT )
491 : {
492 1728 : hMCT->nchan_out_woLFE = st_ivas->nchan_transport - st_ivas->hTransSetup.num_lfe;
493 : }
494 549 : else if ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMUPMIX )
495 : {
496 549 : hMCT->nchan_out_woLFE = st_ivas->nchan_transport - st_ivas->hTransSetup.num_lfe;
497 : }
498 : else
499 : {
500 0 : assert( !"IVAS format currently not supported for MCT" );
501 : }
502 : }
503 :
504 : /* indicate LFE for appropriate core-coder channel */
505 81900 : for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ )
506 : {
507 185445 : for ( n = 0; n < CPE_CHANNELS; n++ )
508 : {
509 123630 : st_ivas->hCPE[cpe_id]->hCoreCoder[n]->mct_chan_mode = MCT_CHAN_MODE_REGULAR;
510 : }
511 : }
512 :
513 : /* in case we have an uneven number of transport channels, indicate last channel ID as inactive */
514 20085 : if ( hMCT->nchan_out_woLFE % 2 )
515 : {
516 16137 : st_ivas->hCPE[st_ivas->nCPE - 1]->hCoreCoder[1]->mct_chan_mode = MCT_CHAN_MODE_IGNORE;
517 : }
518 :
519 20085 : cp_bitrate = st_ivas->hDecoderConfig->ivas_total_brate / hMCT->nchan_out_woLFE * CPE_CHANNELS;
520 20085 : if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC )
521 : {
522 3462 : cp_bitrate = st_ivas->hDecoderConfig->ivas_total_brate / st_ivas->nchan_transport * CPE_CHANNELS;
523 : }
524 :
525 : /* set correct nominal bitrates and igf config already here, otherwise we
526 : * run into a number of problems */
527 81900 : for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ )
528 : {
529 61815 : st_ivas->hCPE[cpe_id]->element_brate = cp_bitrate;
530 185445 : for ( n = 0; n < CPE_CHANNELS; n++ )
531 : {
532 123630 : st = st_ivas->hCPE[cpe_id]->hCoreCoder[n];
533 :
534 123630 : st->total_brate = st_ivas->hCPE[cpe_id]->element_brate;
535 :
536 123630 : if ( st->mct_chan_mode != MCT_CHAN_MODE_IGNORE )
537 : {
538 107493 : st->bits_frame_nominal = (int16_t) ( st_ivas->hCPE[cpe_id]->element_brate / FRAMES_PER_SEC );
539 107493 : st->igf = getIgfPresent( st->element_mode, st->bits_frame_nominal * FRAMES_PER_SEC, st->bwidth, st->rf_flag );
540 107493 : if ( st->igf )
541 : {
542 71784 : IGFDecSetMode( st->hIGFDec, st_ivas->hCPE[cpe_id]->element_brate, st->bwidth, st->element_mode, -1, -1, st->rf_flag );
543 : }
544 : }
545 : }
546 : }
547 :
548 : /*Initialize MCT block data */
549 20085 : max_blocks = hMCT->nchan_out_woLFE / CPE_CHANNELS;
550 :
551 65763 : for ( n = 0; n < max_blocks; n++ )
552 : {
553 45678 : if ( b_nchan_change )
554 : {
555 23634 : if ( hMCT->hBlockData[n] == NULL )
556 : {
557 8559 : if ( ( hMCT->hBlockData[n] = (MCT_DEC_BLOCK_DATA_HANDLE) malloc( sizeof( MCT_BLOCK_DATA ) ) ) == NULL )
558 : {
559 0 : return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MCT block data structure\n" ) );
560 : }
561 :
562 : /*Initialize all parameters to zero*/
563 8559 : hMCT->hBlockData[n]->ch1 = 0;
564 8559 : hMCT->hBlockData[n]->ch2 = 0;
565 :
566 : /* MDCT stereo initialization */
567 8559 : if ( ( hMCT->hBlockData[n]->hStereoMdct = (STEREO_MDCT_DEC_DATA_HANDLE) malloc( sizeof( STEREO_MDCT_ENC_DATA ) ) ) == NULL )
568 : {
569 0 : return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MDCT Stereo \n" ) );
570 : }
571 : }
572 : }
573 :
574 45678 : initMdctStereoDecData( hMCT->hBlockData[n]->hStereoMdct, st_ivas->hCPE[0]->hCoreCoder[0]->igf, st_ivas->hCPE[0]->hCoreCoder[0]->hIGFDec->igfData.igfInfo.grid, cp_bitrate, st_ivas->hCPE[0]->hCoreCoder[0]->bwidth );
575 45678 : hMCT->hBlockData[n]->hStereoMdct->use_itd = 0;
576 : }
577 :
578 94917 : for ( ; n < MCT_MAX_BLOCKS; n++ )
579 : {
580 : /* deallocate no longer needed blocks */
581 74832 : if ( hMCT->hBlockData[n] != NULL )
582 : {
583 7863 : if ( hMCT->hBlockData[n]->hStereoMdct != NULL )
584 : {
585 7863 : free( hMCT->hBlockData[n]->hStereoMdct );
586 7863 : hMCT->hBlockData[n]->hStereoMdct = NULL;
587 : }
588 :
589 7863 : free( hMCT->hBlockData[n] );
590 7863 : hMCT->hBlockData[n] = NULL;
591 : }
592 : }
593 :
594 : /*-----------------------------------------------------------------*
595 : * Initializations
596 : *-----------------------------------------------------------------*/
597 :
598 20085 : if ( b_nchan_change )
599 : {
600 9906 : hMCT->currBlockDataCnt = 0;
601 :
602 : /*Initialize bits required to signal channel-pair index*/
603 9906 : hMCT->bitsChannelPairIndex = max( 1, (int16_t) ( floorf( ( logf( (float) hMCT->nchan_out_woLFE * ( hMCT->nchan_out_woLFE - 1 ) / 2 - 1 ) * INV_LOG_2 ) ) + 1 ) );
604 :
605 9906 : set_s( hMCT->chBitRatios, 0, MCT_MAX_CHANNELS );
606 9906 : set_s( hMCT->lowE_ch, 0, MCT_MAX_CHANNELS );
607 : }
608 :
609 20085 : return IVAS_ERR_OK;
610 : }
611 :
612 :
613 : /*-------------------------------------------------------------------------
614 : * create_mct_dec_close()
615 : *
616 : * Close IVAS decoder MCT handle
617 : *-------------------------------------------------------------------------*/
618 :
619 29941 : void ivas_mct_dec_close(
620 : MCT_DEC_HANDLE *hMCT /* i/o: MCT decoder structure */
621 : )
622 : {
623 : int16_t n, maxBlocks;
624 :
625 29941 : if ( hMCT == NULL || *hMCT == NULL )
626 : {
627 1435 : return;
628 : }
629 :
630 28506 : maxBlocks = ( *hMCT )->nchan_out_woLFE / 2;
631 :
632 95820 : for ( n = 0; n < maxBlocks; n++ )
633 : {
634 67314 : if ( ( *hMCT )->hBlockData[n] != NULL )
635 : {
636 67314 : if ( ( *hMCT )->hBlockData[n]->hStereoMdct != NULL )
637 : {
638 67314 : free( ( *hMCT )->hBlockData[n]->hStereoMdct );
639 67314 : ( *hMCT )->hBlockData[n]->hStereoMdct = NULL;
640 : }
641 :
642 67314 : free( ( *hMCT )->hBlockData[n] );
643 67314 : ( *hMCT )->hBlockData[n] = NULL;
644 : }
645 : }
646 :
647 28506 : free( *hMCT );
648 28506 : *hMCT = NULL;
649 :
650 28506 : return;
651 : }
652 :
653 :
654 : /*-------------------------------------------------------------------------
655 : * ivas_mc_dec_config()
656 : *
657 : * - read transported MC LS setup
658 : * - select MC format mode
659 : * - reconfigure the MC format decoder
660 : *-------------------------------------------------------------------------*/
661 :
662 : /*! r : MC format mode */
663 1982127 : ivas_error ivas_mc_dec_config(
664 : Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
665 : const int16_t idx /* i : LS config. index */
666 : )
667 : {
668 : AUDIO_CONFIG signaled_config;
669 : MC_MODE last_mc_mode;
670 : ivas_error error;
671 :
672 : /* store last frame MC mode */
673 1982127 : last_mc_mode = st_ivas->mc_mode;
674 :
675 1982127 : if ( !st_ivas->bfi )
676 : {
677 : /* set transported MC LS setup */
678 1982127 : signaled_config = ivas_mc_map_ls_setup_to_output_config( idx );
679 :
680 1982127 : if ( st_ivas->ini_frame == 0 )
681 : {
682 246 : st_ivas->transport_config = signaled_config;
683 : }
684 1981881 : else if ( st_ivas->transport_config != signaled_config )
685 : {
686 : #ifdef DEBUGGING
687 : fprintf( stderr, "\nError: Switching of MC configurations is not supported!\n" );
688 : #endif
689 0 : return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "wrong MC configuration signalled!" );
690 : }
691 :
692 : /* select MC format mode */
693 1982127 : st_ivas->mc_mode = ivas_mc_mode_select( ivas_mc_map_output_config_to_mc_ls_setup( signaled_config ), st_ivas->hDecoderConfig->ivas_total_brate );
694 :
695 : /* MC format switching */
696 1982127 : if ( st_ivas->ini_frame != 0 )
697 : {
698 1981881 : if ( st_ivas->hDecoderConfig->last_ivas_total_brate != st_ivas->hDecoderConfig->ivas_total_brate || last_mc_mode != st_ivas->mc_mode )
699 : {
700 54429 : if ( ( error = ivas_mc_dec_reconfig( st_ivas ) ) != IVAS_ERR_OK )
701 : {
702 0 : return error;
703 : }
704 : }
705 : }
706 :
707 1982127 : st_ivas->transport_config = signaled_config;
708 : }
709 :
710 1982127 : return IVAS_ERR_OK;
711 : }
712 :
713 :
714 : /*-------------------------------------------------------------------------
715 : * ivas_mc_dec_reconfig()
716 : *
717 : * reconfigure the MC format decoder
718 : *-------------------------------------------------------------------------*/
719 :
720 54429 : static ivas_error ivas_mc_dec_reconfig(
721 : Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */
722 : )
723 : {
724 : int16_t nchan_transport_old, nSCE_old, nCPE_old, sba_dirac_stereo_flag_old, nchan_hp20_old;
725 : int16_t numCldfbAnalyses_old, numCldfbSyntheses_old;
726 : int32_t new_brate_SCE, new_brate_CPE, ivas_total_brate;
727 : RENDERER_TYPE renderer_type_old;
728 : Decoder_State *st;
729 : ivas_error error;
730 : MC_MODE mc_mode, last_mc_mode;
731 : TC_BUFFER_MODE tc_buffer_mode_new;
732 : int16_t tc_nchan_tc_new;
733 : int16_t tc_nchan_allocate_new;
734 : int16_t tc_granularity_new;
735 : int16_t nchan_out_buff;
736 :
737 54429 : ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate;
738 54429 : nchan_transport_old = st_ivas->nchan_transport;
739 54429 : last_mc_mode = ivas_mc_mode_select( ivas_mc_map_output_config_to_mc_ls_setup( st_ivas->transport_config ), st_ivas->hDecoderConfig->last_ivas_total_brate ); /* NB: this assumes that LS config remains the same between frames */
740 :
741 : /* temporally set the current mc_mode back to the previous one to make sure the following call to
742 : ivas_init_dec_get_num_cldfb_instances() returns the correct counts */
743 54429 : mc_mode = st_ivas->mc_mode;
744 54429 : st_ivas->mc_mode = last_mc_mode;
745 54429 : ivas_init_dec_get_num_cldfb_instances( st_ivas, &numCldfbAnalyses_old, &numCldfbSyntheses_old );
746 54429 : st_ivas->mc_mode = mc_mode;
747 :
748 54429 : nSCE_old = st_ivas->nSCE;
749 54429 : nCPE_old = st_ivas->nCPE;
750 54429 : sba_dirac_stereo_flag_old = st_ivas->sba_dirac_stereo_flag;
751 :
752 : /* special handling needed for the hp20 buffers for McMASA */
753 54429 : if ( last_mc_mode == MC_MODE_MCMASA )
754 : {
755 19236 : nchan_hp20_old = getNumChanSynthesis( st_ivas );
756 : }
757 : else
758 : {
759 35193 : nchan_hp20_old = nchan_transport_old;
760 : }
761 54429 : st_ivas->sba_dirac_stereo_flag = ivas_get_sba_dirac_stereo_flag( st_ivas );
762 :
763 : /* renderer might have changed, reselect */
764 54429 : renderer_type_old = st_ivas->renderer_type;
765 54429 : ivas_renderer_select( st_ivas );
766 :
767 : /* side effect of the renderer selection can be a changed internal config */
768 54429 : ivas_output_init( &( st_ivas->hIntSetup ), st_ivas->intern_config );
769 :
770 : /* transfer subframe info from DirAC or ParamMC to central tc buffer */
771 54429 : if ( st_ivas->hTcBuffer->tc_buffer_mode != TC_BUFFER_MODE_BUFFER )
772 : {
773 48477 : if ( last_mc_mode == MC_MODE_PARAMMC )
774 : {
775 12762 : st_ivas->hTcBuffer->nb_subframes = st_ivas->hParamMC->nb_subframes;
776 12762 : st_ivas->hTcBuffer->subframes_rendered = st_ivas->hParamMC->subframes_rendered;
777 12762 : st_ivas->hTcBuffer->num_slots = st_ivas->hParamMC->num_slots;
778 12762 : st_ivas->hTcBuffer->slots_rendered = st_ivas->hParamMC->slots_rendered;
779 12762 : mvs2s( st_ivas->hParamMC->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS );
780 : }
781 35715 : else if ( last_mc_mode == MC_MODE_MCMASA && st_ivas->hSpatParamRendCom != NULL )
782 : {
783 17961 : st_ivas->hTcBuffer->nb_subframes = st_ivas->hSpatParamRendCom->nb_subframes;
784 17961 : st_ivas->hTcBuffer->subframes_rendered = st_ivas->hSpatParamRendCom->subframes_rendered;
785 17961 : st_ivas->hTcBuffer->num_slots = st_ivas->hSpatParamRendCom->num_slots;
786 17961 : st_ivas->hTcBuffer->slots_rendered = st_ivas->hSpatParamRendCom->slots_rendered;
787 17961 : mvs2s( st_ivas->hSpatParamRendCom->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS );
788 : }
789 : }
790 :
791 : /* JBM: when granularity goes down (e.g. MCT with CREND -> ParamMC with binaural fastconv
792 : render what still fits in the new granularity */
793 54429 : tc_granularity_new = ivas_jbm_dec_get_render_granularity( st_ivas->renderer_type, RENDERER_DISABLE, st_ivas->hDecoderConfig->output_Fs );
794 :
795 54429 : if ( tc_granularity_new < st_ivas->hTcBuffer->n_samples_granularity )
796 : {
797 : /* flush already done in IVAS_DEC_ReadFormat() */
798 : }
799 : /* JBM: when granularity goes up set samples to discard at the beginning of the frame */
800 47475 : else if ( tc_granularity_new > st_ivas->hTcBuffer->n_samples_granularity )
801 : {
802 6969 : if ( ( error = ivas_jbm_dec_set_discard_samples( st_ivas ) ) != IVAS_ERR_OK )
803 : {
804 0 : return error;
805 : }
806 : }
807 :
808 54429 : if ( st_ivas->mc_mode == MC_MODE_MCT )
809 : {
810 20262 : st_ivas->nchan_transport = ivas_mc_ls_setup_get_num_channels( ivas_mc_map_output_config_to_mc_ls_setup( st_ivas->transport_config ) );
811 20262 : st_ivas->nSCE = 0;
812 20262 : st_ivas->nCPE = st_ivas->nchan_transport / 2;
813 :
814 20262 : if ( last_mc_mode != MC_MODE_MCT )
815 : {
816 : /*De-allocate handles for other MC modes*/
817 14079 : if ( st_ivas->hParamMC != NULL )
818 : {
819 6426 : ivas_param_mc_dec_close( &st_ivas->hParamMC );
820 :
821 : /* remove ls conversion if it was allocated by ParamMC */
822 6426 : ivas_ls_setup_conversion_close( &st_ivas->hLsSetUpConversion );
823 : }
824 :
825 14079 : if ( last_mc_mode == MC_MODE_PARAMUPMIX )
826 : {
827 489 : ivas_mc_paramupmix_dec_close( &( st_ivas->hMCParamUpmix ) );
828 489 : ivas_ls_setup_conversion_close( &( st_ivas->hLsSetUpConversion ) );
829 : }
830 :
831 : /* De-allocate McMasa-related handles */
832 14079 : ivas_masa_dec_close( &( st_ivas->hMasa ) );
833 14079 : ivas_qmetadata_close( &st_ivas->hQMetaData );
834 :
835 14079 : ivas_dirac_rend_close( &( st_ivas->hDirACRend ) );
836 14079 : ivas_spat_hSpatParamRendCom_close( &( st_ivas->hSpatParamRendCom ) );
837 14079 : ivas_dirac_dec_close( &( st_ivas->hDirAC ) );
838 14079 : vbap_free_data( &( st_ivas->hVBAPdata ) );
839 :
840 : /* init LS conversion if the renderer type asks for it */
841 14079 : if ( st_ivas->renderer_type == RENDERER_MC && st_ivas->hLsSetUpConversion == NULL )
842 : {
843 1866 : if ( ( error = ivas_ls_setup_conversion_open( st_ivas ) ) != IVAS_ERR_OK )
844 : {
845 0 : return error;
846 : }
847 : }
848 : }
849 : }
850 34167 : else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX )
851 : {
852 1947 : st_ivas->nSCE = 0;
853 1947 : st_ivas->nCPE = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS / 2;
854 1947 : st_ivas->nchan_transport = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS;
855 :
856 1947 : if ( last_mc_mode != MC_MODE_PARAMUPMIX )
857 : {
858 : /*De-allocate handles for other MC modes*/
859 1947 : if ( st_ivas->hParamMC != NULL )
860 : {
861 66 : ivas_param_mc_dec_close( &st_ivas->hParamMC );
862 :
863 : /* remove ls conversion if it was allocated by ParamMC */
864 66 : ivas_ls_setup_conversion_close( &st_ivas->hLsSetUpConversion );
865 : }
866 :
867 1947 : ivas_masa_dec_close( &( st_ivas->hMasa ) );
868 1947 : ivas_qmetadata_close( &st_ivas->hQMetaData );
869 :
870 : /* init LS conversion if the renderer type asks for it */
871 1947 : if ( ( st_ivas->renderer_type == RENDERER_MC ) && st_ivas->hLsSetUpConversion == NULL )
872 : {
873 204 : if ( ( error = ivas_ls_setup_conversion_open( st_ivas ) ) != IVAS_ERR_OK )
874 : {
875 0 : return error;
876 : }
877 : }
878 :
879 1947 : if ( ( error = ivas_mc_paramupmix_dec_open( st_ivas ) ) != IVAS_ERR_OK )
880 : {
881 0 : return error;
882 : }
883 : }
884 : #ifdef DEBUGGING
885 : else
886 : {
887 : assert( 0 );
888 : }
889 : #endif
890 : }
891 32220 : else if ( st_ivas->mc_mode == MC_MODE_PARAMMC )
892 : {
893 13017 : if ( last_mc_mode != MC_MODE_PARAMMC )
894 : {
895 : /* remove old ls conversion for MCT if open, gets reopened correctly within ivas_param_mc_dec_open when needed */
896 10530 : if ( renderer_type_old == RENDERER_MC && st_ivas->hLsSetUpConversion != NULL )
897 : {
898 984 : ivas_ls_setup_conversion_close( &st_ivas->hLsSetUpConversion );
899 : }
900 :
901 10530 : if ( ( error = ivas_param_mc_dec_open( st_ivas ) ) != IVAS_ERR_OK )
902 : {
903 0 : return error;
904 : }
905 : }
906 : else
907 : {
908 2487 : if ( ( error = ivas_param_mc_dec_reconfig( st_ivas ) ) != IVAS_ERR_OK )
909 : {
910 0 : return error;
911 : }
912 : }
913 :
914 : /* De-allocate McMasa-related handles */
915 13017 : ivas_masa_dec_close( &( st_ivas->hMasa ) );
916 13017 : ivas_qmetadata_close( &st_ivas->hQMetaData );
917 :
918 13017 : ivas_dirac_rend_close( &( st_ivas->hDirACRend ) );
919 13017 : ivas_spat_hSpatParamRendCom_close( &( st_ivas->hSpatParamRendCom ) );
920 13017 : ivas_dirac_dec_close( &( st_ivas->hDirAC ) );
921 :
922 13017 : vbap_free_data( &( st_ivas->hVBAPdata ) );
923 :
924 13017 : if ( last_mc_mode == MC_MODE_MCT )
925 : {
926 6276 : if ( st_ivas->hMCT != NULL && st_ivas->nchan_transport <= CPE_CHANNELS )
927 : {
928 5142 : ivas_mct_dec_close( &st_ivas->hMCT );
929 : }
930 : }
931 6741 : else if ( last_mc_mode == MC_MODE_PARAMUPMIX )
932 : {
933 48 : ivas_mc_paramupmix_dec_close( &( st_ivas->hMCParamUpmix ) );
934 : }
935 :
936 : /* LFE handle */
937 13017 : ivas_lfe_dec_close( &( st_ivas->hLFE ) );
938 : }
939 19203 : else if ( st_ivas->mc_mode == MC_MODE_MCMASA )
940 : {
941 19203 : ivas_mcmasa_setNumTransportChannels( &( st_ivas->nchan_transport ), &( st_ivas->element_mode_init ), ivas_total_brate );
942 :
943 19203 : if ( last_mc_mode != MC_MODE_MCMASA )
944 : {
945 12735 : if ( ( error = ivas_qmetadata_open( &( st_ivas->hQMetaData ) ) ) != IVAS_ERR_OK )
946 : {
947 0 : return error;
948 : }
949 : }
950 :
951 19203 : if ( ( error = ivas_mcmasa_dec_reconfig( st_ivas ) ) != IVAS_ERR_OK )
952 : {
953 0 : return error;
954 : }
955 :
956 : /* LS conversion */
957 19203 : if ( st_ivas->hLsSetUpConversion != NULL )
958 : {
959 1596 : ivas_ls_setup_conversion_close( &st_ivas->hLsSetUpConversion );
960 : }
961 :
962 19203 : ivas_mc_paramupmix_dec_close( &( st_ivas->hMCParamUpmix ) );
963 :
964 19203 : if ( st_ivas->hParamMC != NULL )
965 : {
966 4029 : ivas_param_mc_dec_close( &st_ivas->hParamMC );
967 4029 : st_ivas->hParamMC = NULL;
968 : }
969 :
970 19203 : if ( last_mc_mode == MC_MODE_MCT )
971 : {
972 7296 : ivas_mct_dec_close( &st_ivas->hMCT );
973 : }
974 :
975 : /* LFE handle */
976 19203 : ivas_lfe_dec_close( &( st_ivas->hLFE ) );
977 : }
978 :
979 54429 : if ( st_ivas->mc_mode != MC_MODE_MCMASA )
980 : {
981 35226 : if ( st_ivas->nchan_transport == 1 )
982 : {
983 0 : st_ivas->element_mode_init = IVAS_SCE;
984 : }
985 : else
986 : {
987 35226 : st_ivas->element_mode_init = IVAS_CPE_MDCT;
988 : }
989 : }
990 :
991 : /*-----------------------------------------------------------------*
992 : * Reconfigure core coder
993 : *-----------------------------------------------------------------*/
994 :
995 : /* special case: MCT->ParamMC with more than 2 TC, CPE 1 stays, but has the wrong mct_chan_mode in channel 1
996 : and might have IGF static memory not allocated and the bit stream index list not set,
997 : set correct mct_chan_mode and init missing static mem (IGF, HQ) and some config (TNS) do it here since it is _very_ MC specific */
998 54429 : if ( last_mc_mode == MC_MODE_MCT && st_ivas->mc_mode == MC_MODE_PARAMMC && st_ivas->nchan_transport > CPE_CHANNELS )
999 : {
1000 1134 : st = st_ivas->hCPE[1]->hCoreCoder[1];
1001 :
1002 1134 : if ( st_ivas->nchan_transport == 3 )
1003 : {
1004 1134 : st->mct_chan_mode = MCT_CHAN_MODE_IGNORE;
1005 : }
1006 : else
1007 : {
1008 0 : st->mct_chan_mode = MCT_CHAN_MODE_REGULAR;
1009 : }
1010 :
1011 1134 : if ( st->hIGFDec == NULL )
1012 : {
1013 0 : if ( ( st->hIGFDec = (IGF_DEC_INSTANCE_HANDLE) malloc( sizeof( IGFDEC_INSTANCE ) ) ) == NULL )
1014 : {
1015 0 : return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for IGF\n" ) );
1016 : }
1017 :
1018 0 : st->igf = 0;
1019 0 : init_igf_dec( st->hIGFDec );
1020 : }
1021 :
1022 1134 : if ( st->hHQ_core == NULL )
1023 : {
1024 0 : if ( ( st->hHQ_core = (HQ_DEC_HANDLE) malloc( sizeof( HQ_DEC_DATA ) ) ) == NULL )
1025 : {
1026 0 : return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HQ core\n" ) );
1027 : }
1028 :
1029 : /* HQ core initialization */
1030 0 : HQ_core_dec_init( st->hHQ_core );
1031 : }
1032 :
1033 : /* check if we have a doubly used hTxcCfg, if so, allocate a distint one for the old MCT LFE channel */
1034 1134 : if ( st->hTcxCfg == st_ivas->hCPE[1]->hCoreCoder[0]->hTcxCfg )
1035 : {
1036 0 : if ( ( st->hTcxCfg = (TCX_CONFIG_HANDLE) malloc( sizeof( TCX_config ) ) ) == NULL )
1037 : {
1038 0 : return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for hTcxCfg\n" ) );
1039 : }
1040 : }
1041 :
1042 1134 : st->hTcxCfg->fIsTNSAllowed = getTnsAllowed( ivas_total_brate, st->igf, st->element_mode );
1043 : }
1044 54429 : if ( st_ivas->mc_mode == MC_MODE_MCMASA )
1045 : {
1046 : uint8_t separateChannelEnabled;
1047 : int16_t separateChannelIndex;
1048 19203 : ivas_mcmasa_set_separate_channel_mode( &separateChannelEnabled, &separateChannelIndex, ivas_total_brate );
1049 19203 : ivas_mcmasa_split_brate( separateChannelEnabled, ivas_total_brate, st_ivas->nSCE, st_ivas->nCPE, &new_brate_SCE, &new_brate_CPE );
1050 : }
1051 35226 : else if ( st_ivas->mc_mode == MC_MODE_MCT )
1052 : {
1053 20262 : new_brate_SCE = 0;
1054 20262 : new_brate_CPE = ( ivas_total_brate / ( st_ivas->nchan_transport - 1 ) ) * CPE_CHANNELS;
1055 : }
1056 14964 : else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX )
1057 : {
1058 1947 : new_brate_SCE = 0;
1059 1947 : new_brate_CPE = ( ivas_total_brate / ( st_ivas->nchan_transport - 1 ) ) * CPE_CHANNELS;
1060 : }
1061 : else
1062 : {
1063 13017 : new_brate_SCE = 0; /* ivas_total_brate / st_ivas->nchan_transport;*/
1064 13017 : new_brate_CPE = ( ivas_total_brate / st_ivas->nchan_transport ) * CPE_CHANNELS;
1065 : }
1066 :
1067 54429 : if ( ( error = ivas_corecoder_dec_reconfig( st_ivas, nSCE_old, nCPE_old, nchan_transport_old, sba_dirac_stereo_flag_old, new_brate_SCE, new_brate_CPE ) ) != IVAS_ERR_OK )
1068 : {
1069 0 : return error;
1070 : }
1071 :
1072 54429 : if ( last_mc_mode == MC_MODE_MCT && st_ivas->mc_mode == MC_MODE_PARAMMC && st_ivas->nchan_transport > CPE_CHANNELS )
1073 : {
1074 1134 : st = st_ivas->hCPE[1]->hCoreCoder[1];
1075 :
1076 : /* TCX-LTP */
1077 1134 : if ( st->hTcxLtpDec == NULL )
1078 : {
1079 0 : if ( ( st->hTcxLtpDec = (TCX_LTP_DEC_HANDLE) malloc( sizeof( TCX_LTP_DEC_DATA ) ) ) == NULL )
1080 : {
1081 0 : return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TCX-LTP handle\n" ) );
1082 : }
1083 0 : tcxltp_dec_init( st->hTcxLtpDec, 0, st->last_codec_mode, st->element_mode, st->pit_max, st->sr_core );
1084 : }
1085 : }
1086 :
1087 : /*-----------------------------------------------------------------*
1088 : * re-configure HP20 memories
1089 : *-----------------------------------------------------------------*/
1090 :
1091 54429 : if ( ( error = ivas_hp20_dec_reconfig( st_ivas, nchan_hp20_old ) ) != IVAS_ERR_OK )
1092 : {
1093 0 : return error;
1094 : }
1095 :
1096 : /*-----------------------------------------------------------------*
1097 : * Reconfigure renderers
1098 : *-----------------------------------------------------------------*/
1099 :
1100 54429 : if ( st_ivas->mc_mode == MC_MODE_MCMASA )
1101 : {
1102 19203 : if ( ( st_ivas->renderer_type != RENDERER_DISABLE ) && ( st_ivas->renderer_type != RENDERER_MCMASA_MONO_STEREO ) )
1103 : {
1104 17928 : if ( st_ivas->hDirAC != NULL )
1105 : {
1106 : /* reconfigure existing DirAC dec */
1107 17928 : if ( ( error = ivas_dirac_dec_config( st_ivas, DIRAC_RECONFIGURE ) ) != IVAS_ERR_OK )
1108 : {
1109 0 : return error;
1110 : }
1111 : }
1112 : else
1113 : {
1114 : /* init a new DirAC dec */
1115 0 : if ( ( error = ivas_dirac_dec_config( st_ivas, DIRAC_OPEN ) ) != IVAS_ERR_OK )
1116 : {
1117 0 : return error;
1118 : }
1119 : }
1120 : }
1121 1275 : else if ( st_ivas->renderer_type == RENDERER_DISABLE )
1122 : {
1123 645 : ivas_dirac_rend_close( &( st_ivas->hDirACRend ) );
1124 645 : ivas_spat_hSpatParamRendCom_close( &( st_ivas->hSpatParamRendCom ) );
1125 645 : ivas_dirac_dec_close( &( st_ivas->hDirAC ) );
1126 :
1127 645 : vbap_free_data( &( st_ivas->hVBAPdata ) );
1128 : }
1129 : }
1130 :
1131 54429 : if ( renderer_type_old != st_ivas->renderer_type )
1132 : {
1133 : AUDIO_CONFIG output_config;
1134 :
1135 32166 : output_config = st_ivas->hDecoderConfig->output_config;
1136 :
1137 : /* binaural renderers*/
1138 32166 : if ( output_config == IVAS_AUDIO_CONFIG_BINAURAL || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB || output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM )
1139 : {
1140 : /* remove unneeded binaural renderers */
1141 18690 : if ( st_ivas->hBinRenderer != NULL && ( st_ivas->renderer_type != RENDERER_BINAURAL_FASTCONV && st_ivas->renderer_type != RENDERER_BINAURAL_FASTCONV_ROOM ) )
1142 : {
1143 5892 : ivas_binRenderer_close( &st_ivas->hBinRenderer );
1144 :
1145 : #ifdef IVAS_RTPDUMP
1146 5892 : if ( ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation || st_ivas->hCombinedOrientationData ) )
1147 : #else
1148 : if ( ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) )
1149 : #endif
1150 : {
1151 1386 : efap_free_data( &st_ivas->hEFAPdata );
1152 : }
1153 : }
1154 :
1155 18690 : if ( ( st_ivas->hCrendWrapper != NULL ) && ( st_ivas->hCrendWrapper->hCrend[0] != NULL ) && ( st_ivas->renderer_type != RENDERER_BINAURAL_MIXER_CONV && st_ivas->renderer_type != RENDERER_BINAURAL_MIXER_CONV_ROOM && ( st_ivas->renderer_type != RENDERER_BINAURAL_OBJECTS_TD || st_ivas->hIntSetup.output_config != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) )
1156 : {
1157 5688 : ivas_rend_closeCrend( &( st_ivas->hCrendWrapper ) );
1158 : }
1159 :
1160 18690 : if ( st_ivas->hBinRendererTd != NULL && ( st_ivas->renderer_type != RENDERER_BINAURAL_OBJECTS_TD ) )
1161 : {
1162 1266 : ivas_td_binaural_close( &st_ivas->hBinRendererTd );
1163 : }
1164 :
1165 18690 : if ( st_ivas->hDiracDecBin[0] != NULL )
1166 : {
1167 11670 : if ( st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC_ROOM && st_ivas->renderer_type != RENDERER_STEREO_PARAMETRIC )
1168 : {
1169 5844 : ivas_dirac_dec_close_binaural_data( st_ivas->hDiracDecBin );
1170 : }
1171 : }
1172 :
1173 : /* init necessary new renderers */
1174 18690 : if ( st_ivas->hBinRenderer == NULL && ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) )
1175 : {
1176 5895 : if ( ( error = ivas_binRenderer_open( st_ivas ) ) != IVAS_ERR_OK )
1177 : {
1178 0 : return error;
1179 : }
1180 : }
1181 12795 : else if ( st_ivas->hBinRendererTd == NULL && st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD )
1182 : {
1183 1272 : if ( ( error = ivas_td_binaural_open( st_ivas ) ) != IVAS_ERR_OK )
1184 : {
1185 0 : return error;
1186 : }
1187 :
1188 1272 : if ( st_ivas->hOutSetup.output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB )
1189 : {
1190 630 : if ( ( error = ivas_reverb_open( &st_ivas->hReverb, st_ivas->hHrtfStatistics, st_ivas->hRenderConfig, st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK )
1191 : {
1192 0 : return error;
1193 : }
1194 : }
1195 :
1196 1272 : if ( st_ivas->hIntSetup.output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB )
1197 : {
1198 0 : if ( ( error = ivas_rend_initCrendWrapper( &st_ivas->hCrendWrapper, 1 ) ) != IVAS_ERR_OK )
1199 : {
1200 0 : return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend Wrapper\n" );
1201 : }
1202 :
1203 0 : st_ivas->hCrendWrapper->hCrend[0] = NULL;
1204 0 : st_ivas->hCrendWrapper->hHrtfCrend = NULL;
1205 0 : if ( ( st_ivas->hCrendWrapper->hCrend[0] = (CREND_HANDLE) malloc( sizeof( CREND_DATA ) ) ) == NULL )
1206 : {
1207 0 : return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend\n" );
1208 : }
1209 : }
1210 : }
1211 11523 : else if ( st_ivas->hCrendWrapper == NULL && ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) )
1212 : {
1213 5697 : if ( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hDecoderConfig->output_config, st_ivas->hRenderConfig, st_ivas->hHrtfCrend, st_ivas->hHrtfStatistics, st_ivas->hDecoderConfig->output_Fs, 0, ( st_ivas->hSplitBinRend == NULL ) ? 1 : st_ivas->hSplitBinRend->splitrend.multiBinPoseData.num_poses ) ) != IVAS_ERR_OK )
1214 : {
1215 0 : return error;
1216 : }
1217 5697 : st_ivas->binaural_latency_ns = st_ivas->hCrendWrapper->binaural_latency_ns;
1218 : }
1219 : }
1220 : /* mono/stereo */
1221 : else if ( output_config == IVAS_AUDIO_CONFIG_MONO || output_config == IVAS_AUDIO_CONFIG_STEREO )
1222 : {
1223 : /* nothing should happen here... */
1224 : }
1225 : /* LS */
1226 : else if ( output_config == IVAS_AUDIO_CONFIG_5_1 || output_config == IVAS_AUDIO_CONFIG_5_1_2 || output_config == IVAS_AUDIO_CONFIG_5_1_4 || output_config == IVAS_AUDIO_CONFIG_7_1 || output_config == IVAS_AUDIO_CONFIG_7_1_4 || output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM )
1227 : {
1228 : #ifdef DEBUGGING
1229 : assert( st_ivas->renderer_type == RENDERER_MC || st_ivas->renderer_type == RENDERER_MC_PARAMMC || st_ivas->renderer_type == RENDERER_DIRAC || st_ivas->renderer_type == RENDERER_DISABLE );
1230 : #endif
1231 : }
1232 : #ifdef DEBUGGING
1233 : else if ( output_config == IVAS_AUDIO_CONFIG_FOA || output_config == IVAS_AUDIO_CONFIG_HOA2 || output_config == IVAS_AUDIO_CONFIG_HOA3 )
1234 : {
1235 : /* FOA/HOA output */
1236 : /* Nothing to do, renderer is always RENDERER_SBA_LINEAR_ENC */
1237 : assert( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC && renderer_type_old == RENDERER_SBA_LINEAR_ENC );
1238 : }
1239 : #endif
1240 : }
1241 :
1242 : /*-----------------------------------------------------------------*
1243 : * CLDFB instances
1244 : *-----------------------------------------------------------------*/
1245 :
1246 54429 : if ( ( error = ivas_cldfb_dec_reconfig( st_ivas, nchan_transport_old, numCldfbAnalyses_old, numCldfbSyntheses_old ) ) != IVAS_ERR_OK )
1247 : {
1248 0 : return error;
1249 : }
1250 :
1251 :
1252 : /*-----------------------------------------------------------------*
1253 : * Allocate the LFE handle that is coded separately after the allocation of the core coders
1254 : *-----------------------------------------------------------------*/
1255 :
1256 54429 : if ( ( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) )
1257 : {
1258 : int32_t delay_ns;
1259 22209 : if ( st_ivas->hIntSetup.index_lfe[0] != -1 )
1260 : {
1261 21333 : delay_ns = st_ivas->binaural_latency_ns;
1262 : }
1263 : else
1264 : {
1265 876 : delay_ns = 0;
1266 : }
1267 :
1268 22209 : if ( st_ivas->hBinRenderer != NULL )
1269 : {
1270 714 : if ( st_ivas->hBinRenderer->render_lfe )
1271 : {
1272 : /* Account for filterbank delay */
1273 489 : delay_ns += IVAS_FB_DEC_DELAY_NS;
1274 : }
1275 : else
1276 : {
1277 225 : delay_ns = 0;
1278 : }
1279 : }
1280 : else
1281 : {
1282 21495 : if ( ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) && ( st_ivas->cldfbSynDec[0] != NULL ) )
1283 : {
1284 978 : delay_ns += IVAS_FB_DEC_DELAY_NS;
1285 : }
1286 : }
1287 :
1288 22209 : if ( st_ivas->hLFE != NULL )
1289 : {
1290 7155 : if ( st_ivas->hLFE->delay_ns != delay_ns )
1291 : {
1292 729 : ivas_lfe_dec_close( &( st_ivas->hLFE ) );
1293 : }
1294 : }
1295 :
1296 22209 : if ( st_ivas->hLFE == NULL )
1297 : {
1298 15783 : if ( ( error = ivas_create_lfe_dec( &st_ivas->hLFE, st_ivas->hDecoderConfig->output_Fs, delay_ns ) ) != IVAS_ERR_OK )
1299 : {
1300 0 : return error;
1301 : }
1302 :
1303 15783 : set_zero( st_ivas->hLFE->prevsynth_buf, LFE_PLC_BUFLEN );
1304 15783 : set_zero( st_ivas->hLFE->prior_out_buffer, L_FRAME48k );
1305 : }
1306 : }
1307 :
1308 : /*-----------------------------------------------------------------*
1309 : * JBM TC buffers
1310 : *-----------------------------------------------------------------*/
1311 : {
1312 : int16_t tc_nchan_full_new;
1313 : DECODER_TC_BUFFER_HANDLE hTcBuffer;
1314 :
1315 54429 : hTcBuffer = st_ivas->hTcBuffer;
1316 54429 : tc_buffer_mode_new = ivas_jbm_dec_get_tc_buffer_mode( st_ivas );
1317 54429 : tc_nchan_tc_new = ivas_jbm_dec_get_num_tc_channels( st_ivas );
1318 54429 : tc_nchan_allocate_new = tc_nchan_tc_new;
1319 54429 : tc_nchan_full_new = tc_nchan_tc_new;
1320 :
1321 54429 : if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC )
1322 : {
1323 8193 : tc_nchan_allocate_new = BINAURAL_CHANNELS;
1324 8193 : if ( st_ivas->hDiracDecBin[0] != NULL && st_ivas->hDiracDecBin[0]->useTdDecorr )
1325 : {
1326 5496 : tc_nchan_allocate_new = 2 * BINAURAL_CHANNELS;
1327 : }
1328 2697 : else if ( st_ivas->hOutSetup.separateChannelEnabled )
1329 : {
1330 1542 : tc_nchan_allocate_new++;
1331 : }
1332 :
1333 8193 : tc_nchan_full_new = tc_nchan_allocate_new;
1334 : }
1335 :
1336 54429 : if ( st_ivas->mc_mode == MC_MODE_PARAMMC && st_ivas->hDecoderConfig->output_config != IVAS_AUDIO_CONFIG_MONO && st_ivas->hDecoderConfig->output_config != IVAS_AUDIO_CONFIG_STEREO )
1337 : {
1338 12771 : tc_nchan_full_new = 0;
1339 : }
1340 41658 : else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX )
1341 : {
1342 1947 : tc_nchan_allocate_new = MC_PARAMUPMIX_MAX_INPUT_CHANS;
1343 1947 : tc_buffer_mode_new = TC_BUFFER_MODE_RENDERER;
1344 1947 : if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_STEREO || st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_MONO )
1345 : {
1346 255 : tc_buffer_mode_new = TC_BUFFER_MODE_BUFFER;
1347 255 : tc_nchan_tc_new = st_ivas->hDecoderConfig->nchan_out;
1348 255 : tc_nchan_allocate_new = tc_nchan_tc_new;
1349 : }
1350 1947 : tc_nchan_full_new = tc_nchan_allocate_new;
1351 : }
1352 :
1353 : /* reconfigure buffer */
1354 54429 : if ( hTcBuffer->tc_buffer_mode != tc_buffer_mode_new || hTcBuffer->nchan_transport_jbm != tc_nchan_tc_new ||
1355 11973 : hTcBuffer->nchan_buffer_full != tc_nchan_full_new || hTcBuffer->nchan_transport_internal != tc_nchan_allocate_new ||
1356 11022 : tc_granularity_new != hTcBuffer->n_samples_granularity )
1357 : {
1358 43407 : if ( ( error = ivas_jbm_dec_tc_buffer_reconfigure( st_ivas, tc_buffer_mode_new, tc_nchan_tc_new, tc_nchan_allocate_new, tc_nchan_full_new, tc_granularity_new ) ) != IVAS_ERR_OK )
1359 : {
1360 0 : return error;
1361 : }
1362 : }
1363 :
1364 : /* transfer subframe info from central tc buffer to ParamMC or McMASA (DirAC) */
1365 54429 : if ( st_ivas->hSpatParamRendCom != NULL )
1366 : {
1367 19155 : st_ivas->hSpatParamRendCom->nb_subframes = st_ivas->hTcBuffer->nb_subframes;
1368 19155 : st_ivas->hSpatParamRendCom->subframes_rendered = st_ivas->hTcBuffer->subframes_rendered;
1369 19155 : st_ivas->hSpatParamRendCom->num_slots = st_ivas->hTcBuffer->num_slots;
1370 19155 : st_ivas->hSpatParamRendCom->slots_rendered = st_ivas->hTcBuffer->slots_rendered;
1371 19155 : mvs2s( st_ivas->hTcBuffer->subframe_nbslots, st_ivas->hSpatParamRendCom->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS );
1372 : }
1373 35274 : else if ( st_ivas->hParamMC != NULL )
1374 : {
1375 13017 : st_ivas->hParamMC->nb_subframes = st_ivas->hTcBuffer->nb_subframes;
1376 13017 : st_ivas->hParamMC->subframes_rendered = st_ivas->hTcBuffer->subframes_rendered;
1377 13017 : st_ivas->hParamMC->num_slots = st_ivas->hTcBuffer->num_slots;
1378 13017 : st_ivas->hParamMC->slots_rendered = st_ivas->hTcBuffer->slots_rendered;
1379 13017 : mvs2s( st_ivas->hTcBuffer->subframe_nbslots, st_ivas->hParamMC->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS );
1380 : }
1381 : }
1382 :
1383 : /*-----------------------------------------------------------------*
1384 : * floating-point output audio buffers
1385 : *-----------------------------------------------------------------*/
1386 :
1387 54429 : nchan_out_buff = ivas_get_nchan_buffers_dec( st_ivas, -1, -1 );
1388 54429 : if ( ( error = ivas_output_buff_dec( st_ivas->p_output_f, nchan_out_buff, st_ivas->hDecoderConfig->Opt_tsm, st_ivas->hTcBuffer ) ) != IVAS_ERR_OK )
1389 : {
1390 0 : return error;
1391 : }
1392 :
1393 54429 : return IVAS_ERR_OK;
1394 : }
|