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 3678128 : 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 3678128 : push_wmops( "ivas_mct_dec" );
92 :
93 3678128 : error = IVAS_ERR_OK;
94 3678128 : nCPE = st_ivas->nCPE;
95 3678128 : hMCT = st_ivas->hMCT;
96 :
97 3678128 : ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate;
98 :
99 3678128 : 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 617317 : mvr2r( output[LFE_CHANNEL], output_lfe_ch, output_frame );
103 : }
104 :
105 3678128 : 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 554574 : n = ivas_mc_ls_setup_get_num_channels( ivas_mc_map_output_config_to_mc_ls_setup( st_ivas->transport_config ) );
109 :
110 554574 : 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 13453674 : for ( cpe_id = 0; cpe_id < nCPE; cpe_id++ )
118 : {
119 : /*initialize param_lpc buffer*/
120 29326638 : for ( n = 0; n < CPE_CHANNELS; n++ )
121 : {
122 19551092 : set_s( param_lpc[cpe_id][n], 0, NPRM_LPC_NEW );
123 : }
124 :
125 9775546 : if ( ( error = ivas_cpe_dec( st_ivas, cpe_id, output, output_frame, 0 ) ) != IVAS_ERR_OK )
126 : {
127 0 : return error;
128 : }
129 :
130 9775546 : if ( cpe_id == 0 )
131 : {
132 3678128 : 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 9775546 : if ( !st_ivas->bfi )
136 : {
137 9103737 : 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 9103737 : ( ( cpe_id + 1 ) * CPE_CHANNELS > hMCT->nchan_out_woLFE ) );
139 :
140 9103737 : st_ivas->BER_detect |= st_ivas->hCPE[cpe_id]->hCoreCoder[0]->BER_detect;
141 9103737 : st_ivas->BER_detect |= st_ivas->hCPE[cpe_id]->hCoreCoder[1]->BER_detect;
142 : }
143 : }
144 :
145 : /* MCT side bits decoder */
146 3678128 : 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 3678128 : if ( st_ivas->hCPE[0]->hCoreCoder[0]->last_core == ACELP_CORE )
150 : {
151 36 : for ( n = 0; n < CPE_CHANNELS; n++ )
152 : {
153 24 : p_output_orig[n] = output[n];
154 24 : output[n] = synth[n];
155 : }
156 : }
157 :
158 13453674 : for ( cpe_id = 0; cpe_id < nCPE; cpe_id++ )
159 : {
160 9775546 : st_ivas->hCPE[cpe_id]->hCoreCoder[0]->BER_detect |= st_ivas->BER_detect;
161 9775546 : st_ivas->hCPE[cpe_id]->hCoreCoder[1]->BER_detect |= st_ivas->BER_detect;
162 :
163 29326638 : for ( n = 0; n < CPE_CHANNELS; n++ )
164 : {
165 19551092 : x[n][0] = output[n + cpe_id * CPE_CHANNELS];
166 19551092 : x[n][1] = output[n + cpe_id * CPE_CHANNELS] + ( L_FRAME48k / 2 );
167 19551092 : set_zero( x[n][0], L_FRAME48k / 2 );
168 19551092 : set_zero( x[n][1], L_FRAME48k / 2 );
169 : }
170 :
171 9775546 : ivas_mdct_core_invQ( st_ivas->hCPE[cpe_id], nTnsBitsTCX10[cpe_id], p_param[cpe_id], param_lpc[cpe_id], param[cpe_id],
172 9775546 : fUseTns[cpe_id], tnsData[cpe_id], x, x, Aq[cpe_id], NULL, 1 );
173 :
174 9775546 : st_ivas->BER_detect |= st_ivas->hCPE[cpe_id]->hCoreCoder[0]->BER_detect;
175 9775546 : st_ivas->BER_detect |= st_ivas->hCPE[cpe_id]->hCoreCoder[1]->BER_detect;
176 : }
177 :
178 : /* MCT core decoder */
179 3678128 : 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 3678128 : if ( st_ivas->sba_dirac_stereo_flag && st_ivas->ivas_format != SBA_ISM_FORMAT )
183 : {
184 82826 : for ( cpe_id = 1; cpe_id < nCPE; cpe_id++ )
185 : {
186 124239 : for ( n = 0; n < CPE_CHANNELS; n++ )
187 : {
188 82826 : 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 13453674 : for ( cpe_id = 0; cpe_id < nCPE; cpe_id++ )
195 : {
196 9775546 : hCPE = st_ivas->hCPE[cpe_id];
197 :
198 29326638 : for ( n = 0; n < CPE_CHANNELS; n++ )
199 : {
200 19551092 : x[n][0] = output[n + cpe_id * CPE_CHANNELS];
201 19551092 : x[n][1] = output[n + cpe_id * CPE_CHANNELS] + ( L_FRAME48k / 2 );
202 : }
203 :
204 9775546 : ivas_mdct_core_tns_ns( hCPE, fUseTns[cpe_id], tnsData[cpe_id], x, Aq[cpe_id], 1 );
205 : }
206 :
207 3678128 : if ( st_ivas->renderer_type == RENDERER_MC )
208 : {
209 : /* Equalization in MDCT Domain */
210 132458 : ivas_ls_setup_conversion_process_mdct( st_ivas, output );
211 : }
212 :
213 3545670 : 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 11778 : for ( cpe_id = 0; cpe_id < nCPE; cpe_id++ )
218 : {
219 23556 : for ( n = 0; n < CPE_CHANNELS; n++ )
220 : {
221 15704 : x_all[n + cpe_id * CPE_CHANNELS][0] = output[n + cpe_id * CPE_CHANNELS];
222 15704 : x_all[n + cpe_id * CPE_CHANNELS][1] = output[n + cpe_id * CPE_CHANNELS] + ( L_FRAME48k / 2 );
223 : }
224 : }
225 :
226 3926 : ivas_ls_setup_conversion_process_mdct_param_mc( st_ivas, x_all );
227 : }
228 :
229 13453674 : for ( cpe_id = 0; cpe_id < nCPE; cpe_id++ )
230 : {
231 9775546 : hCPE = st_ivas->hCPE[cpe_id];
232 9775546 : sts = hCPE->hCoreCoder;
233 :
234 29326638 : for ( n = 0; n < CPE_CHANNELS; n++ )
235 : {
236 19551092 : x[n][0] = output[n + cpe_id * CPE_CHANNELS];
237 19551092 : x[n][1] = output[n + cpe_id * CPE_CHANNELS] + ( L_FRAME48k / 2 );
238 : }
239 :
240 9775546 : ivas_mdct_core_reconstruct( hCPE, x, synth, fUseTns[cpe_id], 1 );
241 :
242 : /* set pointers back */
243 9775546 : if ( cpe_id == 0 && st_ivas->hCPE[0]->hCoreCoder[0]->last_core == ACELP_CORE )
244 : {
245 36 : for ( n = 0; n < CPE_CHANNELS; n++ )
246 : {
247 24 : output[n] = p_output_orig[n];
248 : }
249 : }
250 :
251 : /*----------------------------------------------------------------*
252 : * CoreCoder Post-processing and updates
253 : *----------------------------------------------------------------*/
254 :
255 29326638 : for ( n = 0; n < CPE_CHANNELS; n++ )
256 : {
257 19551092 : if ( st_ivas->sba_dirac_stereo_flag && ( st_ivas->ivas_format != SBA_ISM_FORMAT || cpe_id >= nCPE - 2 ) )
258 : {
259 465652 : ivas_post_proc( NULL, hCPE, n, synth[n], NULL, output_frame, 1 );
260 : }
261 :
262 : /* Postprocessing for ACELP/MDCT core switching and synchronization */
263 19551092 : 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 19551092 : mvr2r( synth[n], output[cpe_id * CPE_CHANNELS + n], output_frame );
270 :
271 : /* Save synthesis for HQ FEC */
272 19551092 : save_synthesis_hq_fec( sts[n], output[cpe_id * CPE_CHANNELS + n], output_frame, hCPE );
273 :
274 : /* CoreCoder common updates */
275 19551092 : 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 9775546 : if ( !st_ivas->sba_dirac_stereo_flag || ( st_ivas->ivas_format == SBA_ISM_FORMAT && cpe_id < nCPE - 2 ) )
284 : {
285 9542720 : 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 3678128 : 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 617317 : mvr2r( output[hMCT->nchan_out_woLFE - 1], tmp, output_frame );
304 :
305 3040777 : for ( n = hMCT->nchan_out_woLFE - 1; n >= LFE_CHANNEL; n-- )
306 : {
307 2423460 : mvr2r( output[n - 1], output[n + 1], output_frame );
308 : }
309 617317 : mvr2r( tmp, output[LFE_CHANNEL - 1], output_frame );
310 :
311 : /* save LFE channel */
312 617317 : 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 3678128 : pop_wmops();
329 3678128 : return error;
330 : }
331 :
332 :
333 : /*-------------------------------------------------------------------------
334 : * create_mct_dec()
335 : *
336 : * Create, allocate and initialize IVAS decoder MCT handle
337 : *-------------------------------------------------------------------------*/
338 :
339 36198 : 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 36198 : 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 36198 : 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 27354 : hMCT->nchan_out_woLFE = st_ivas->nchan_transport;
366 27354 : if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC )
367 : {
368 15790 : hMCT->nchan_out_woLFE += st_ivas->nchan_ism;
369 : }
370 : }
371 8844 : else if ( st_ivas->mc_mode == MC_MODE_MCT )
372 : {
373 8246 : hMCT->nchan_out_woLFE = st_ivas->nchan_transport - st_ivas->hTransSetup.num_lfe;
374 : }
375 598 : else if ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMUPMIX )
376 : {
377 598 : 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 36198 : cp_bitrate = st_ivas->hDecoderConfig->ivas_total_brate / hMCT->nchan_out_woLFE * CPE_CHANNELS;
385 :
386 36198 : if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC )
387 : {
388 15790 : 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 147145 : for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ )
393 : {
394 332841 : for ( n = 0; n < CPE_CHANNELS; n++ )
395 : {
396 221894 : 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 36198 : if ( hMCT->nchan_out_woLFE % 2 )
402 : {
403 24391 : st_ivas->hCPE[st_ivas->nCPE - 1]->hCoreCoder[1]->mct_chan_mode = MCT_CHAN_MODE_IGNORE;
404 : }
405 :
406 : /*Initialize MCT block data */
407 36198 : max_blocks = hMCT->nchan_out_woLFE / 2;
408 :
409 122754 : for ( n = 0; n < max_blocks; n++ )
410 : {
411 86556 : 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 86556 : hMCT->hBlockData[n]->ch1 = 0;
418 86556 : hMCT->hBlockData[n]->ch2 = 0;
419 :
420 : /*-----------------------------------------------------------------*
421 : * MDCT stereo initialization
422 : *-----------------------------------------------------------------*/
423 :
424 86556 : 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 86556 : 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 86556 : hMCT->hBlockData[n]->hStereoMdct->use_itd = 0;
431 86556 : hMCT->hBlockData[n]->hStereoMdct->reverse_dmx = 0;
432 86556 : hMCT->hBlockData[n]->hStereoMdct->smooth_ratio = 1.f;
433 : }
434 166830 : for ( ; n < MCT_MAX_BLOCKS; n++ )
435 : {
436 130632 : hMCT->hBlockData[n] = NULL;
437 : }
438 :
439 : /*-----------------------------------------------------------------*
440 : * Initializations
441 : *-----------------------------------------------------------------*/
442 :
443 36198 : hMCT->currBlockDataCnt = 0;
444 :
445 : /*Initialize bits required to signal channel-pair index*/
446 36198 : 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 36198 : set_s( hMCT->chBitRatios, 0, MCT_MAX_CHANNELS );
449 36198 : set_s( hMCT->lowE_ch, 0, MCT_MAX_CHANNELS );
450 :
451 36198 : st_ivas->hMCT = hMCT;
452 :
453 36198 : return IVAS_ERR_OK;
454 : }
455 :
456 :
457 : /*-------------------------------------------------------------------------
458 : * mct_dec_reconfigure()
459 : *
460 : * Reconfigure IVAS decoder MCT handle
461 : *-------------------------------------------------------------------------*/
462 :
463 11288 : 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 11288 : hMCT = st_ivas->hMCT;
474 :
475 : /*-----------------------------------------------------------------*
476 : * Allocate and initialize MCT BlockData handles
477 : *-----------------------------------------------------------------*/
478 :
479 11288 : if ( b_nchan_change )
480 : {
481 : /* Determine active channels */
482 3773 : 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 2990 : hMCT->nchan_out_woLFE = st_ivas->nchan_transport;
485 2990 : if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC )
486 : {
487 967 : hMCT->nchan_out_woLFE += st_ivas->nchan_ism;
488 : }
489 : }
490 783 : else if ( st_ivas->mc_mode == MC_MODE_MCT )
491 : {
492 597 : hMCT->nchan_out_woLFE = st_ivas->nchan_transport - st_ivas->hTransSetup.num_lfe;
493 : }
494 186 : else if ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMUPMIX )
495 : {
496 186 : 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 46599 : for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ )
506 : {
507 105933 : for ( n = 0; n < CPE_CHANNELS; n++ )
508 : {
509 70622 : 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 11288 : if ( hMCT->nchan_out_woLFE % 2 )
515 : {
516 8010 : st_ivas->hCPE[st_ivas->nCPE - 1]->hCoreCoder[1]->mct_chan_mode = MCT_CHAN_MODE_IGNORE;
517 : }
518 :
519 11288 : cp_bitrate = st_ivas->hDecoderConfig->ivas_total_brate / hMCT->nchan_out_woLFE * CPE_CHANNELS;
520 11288 : if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC )
521 : {
522 3644 : 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 46599 : for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ )
528 : {
529 35311 : st_ivas->hCPE[cpe_id]->element_brate = cp_bitrate;
530 105933 : for ( n = 0; n < CPE_CHANNELS; n++ )
531 : {
532 70622 : st = st_ivas->hCPE[cpe_id]->hCoreCoder[n];
533 :
534 70622 : st->total_brate = st_ivas->hCPE[cpe_id]->element_brate;
535 :
536 70622 : if ( st->mct_chan_mode != MCT_CHAN_MODE_IGNORE )
537 : {
538 62612 : st->bits_frame_nominal = (int16_t) ( st_ivas->hCPE[cpe_id]->element_brate / FRAMES_PER_SEC );
539 62612 : st->igf = getIgfPresent( st->element_mode, st->bits_frame_nominal * FRAMES_PER_SEC, st->bwidth, st->rf_flag );
540 62612 : if ( st->igf )
541 : {
542 28630 : 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 11288 : max_blocks = hMCT->nchan_out_woLFE / CPE_CHANNELS;
550 :
551 38589 : for ( n = 0; n < max_blocks; n++ )
552 : {
553 27301 : if ( b_nchan_change )
554 : {
555 8883 : if ( hMCT->hBlockData[n] == NULL )
556 : {
557 3174 : 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 3174 : hMCT->hBlockData[n]->ch1 = 0;
564 3174 : hMCT->hBlockData[n]->ch2 = 0;
565 :
566 : /* MDCT stereo initialization */
567 3174 : 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 27301 : 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 27301 : hMCT->hBlockData[n]->hStereoMdct->use_itd = 0;
576 : }
577 :
578 51715 : for ( ; n < MCT_MAX_BLOCKS; n++ )
579 : {
580 : /* deallocate no longer needed blocks */
581 40427 : if ( hMCT->hBlockData[n] != NULL )
582 : {
583 2918 : if ( hMCT->hBlockData[n]->hStereoMdct != NULL )
584 : {
585 2918 : free( hMCT->hBlockData[n]->hStereoMdct );
586 2918 : hMCT->hBlockData[n]->hStereoMdct = NULL;
587 : }
588 :
589 2918 : free( hMCT->hBlockData[n] );
590 2918 : hMCT->hBlockData[n] = NULL;
591 : }
592 : }
593 :
594 : /*-----------------------------------------------------------------*
595 : * Initializations
596 : *-----------------------------------------------------------------*/
597 :
598 11288 : if ( b_nchan_change )
599 : {
600 3773 : hMCT->currBlockDataCnt = 0;
601 :
602 : /*Initialize bits required to signal channel-pair index*/
603 3773 : 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 3773 : set_s( hMCT->chBitRatios, 0, MCT_MAX_CHANNELS );
606 3773 : set_s( hMCT->lowE_ch, 0, MCT_MAX_CHANNELS );
607 : }
608 :
609 11288 : return IVAS_ERR_OK;
610 : }
611 :
612 :
613 : /*-------------------------------------------------------------------------
614 : * create_mct_dec_close()
615 : *
616 : * Close IVAS decoder MCT handle
617 : *-------------------------------------------------------------------------*/
618 :
619 99543 : void ivas_mct_dec_close(
620 : MCT_DEC_HANDLE *hMCT /* i/o: MCT decoder structure */
621 : )
622 : {
623 : int16_t n, maxBlocks;
624 :
625 99543 : if ( hMCT == NULL || *hMCT == NULL )
626 : {
627 63345 : return;
628 : }
629 :
630 36198 : maxBlocks = ( *hMCT )->nchan_out_woLFE / 2;
631 :
632 123010 : for ( n = 0; n < maxBlocks; n++ )
633 : {
634 86812 : if ( ( *hMCT )->hBlockData[n] != NULL )
635 : {
636 86812 : if ( ( *hMCT )->hBlockData[n]->hStereoMdct != NULL )
637 : {
638 86812 : free( ( *hMCT )->hBlockData[n]->hStereoMdct );
639 86812 : ( *hMCT )->hBlockData[n]->hStereoMdct = NULL;
640 : }
641 :
642 86812 : free( ( *hMCT )->hBlockData[n] );
643 86812 : ( *hMCT )->hBlockData[n] = NULL;
644 : }
645 : }
646 :
647 36198 : free( *hMCT );
648 36198 : *hMCT = NULL;
649 :
650 36198 : 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 1101009 : 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 1101009 : last_mc_mode = st_ivas->mc_mode;
674 :
675 1101009 : if ( !st_ivas->bfi )
676 : {
677 : /* set transported MC LS setup */
678 1101009 : signaled_config = ivas_mc_map_ls_setup_to_output_config( idx );
679 :
680 1101009 : if ( st_ivas->ini_frame == 0 )
681 : {
682 6858 : st_ivas->transport_config = signaled_config;
683 : }
684 1094151 : 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 1101009 : 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 1101009 : if ( st_ivas->ini_frame != 0 )
697 : {
698 1094151 : if ( st_ivas->hDecoderConfig->last_ivas_total_brate != st_ivas->hDecoderConfig->ivas_total_brate || last_mc_mode != st_ivas->mc_mode )
699 : {
700 22772 : if ( ( error = ivas_mc_dec_reconfig( st_ivas ) ) != IVAS_ERR_OK )
701 : {
702 0 : return error;
703 : }
704 : }
705 : }
706 :
707 1101009 : st_ivas->transport_config = signaled_config;
708 : }
709 :
710 1101009 : return IVAS_ERR_OK;
711 : }
712 :
713 :
714 : /*-------------------------------------------------------------------------
715 : * ivas_mc_dec_reconfig()
716 : *
717 : * reconfigure the MC format decoder
718 : *-------------------------------------------------------------------------*/
719 :
720 22772 : 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 22772 : ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate;
738 22772 : nchan_transport_old = st_ivas->nchan_transport;
739 22772 : 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 22772 : mc_mode = st_ivas->mc_mode;
744 22772 : st_ivas->mc_mode = last_mc_mode;
745 22772 : ivas_init_dec_get_num_cldfb_instances( st_ivas, &numCldfbAnalyses_old, &numCldfbSyntheses_old );
746 22772 : st_ivas->mc_mode = mc_mode;
747 :
748 22772 : nSCE_old = st_ivas->nSCE;
749 22772 : nCPE_old = st_ivas->nCPE;
750 22772 : sba_dirac_stereo_flag_old = st_ivas->sba_dirac_stereo_flag;
751 :
752 : /* special handling needed for the hp20 buffers for McMASA */
753 22772 : if ( last_mc_mode == MC_MODE_MCMASA )
754 : {
755 7723 : nchan_hp20_old = getNumChanSynthesis( st_ivas );
756 : }
757 : else
758 : {
759 15049 : nchan_hp20_old = nchan_transport_old;
760 : }
761 22772 : st_ivas->sba_dirac_stereo_flag = ivas_get_sba_dirac_stereo_flag( st_ivas );
762 :
763 : /* renderer might have changed, reselect */
764 22772 : renderer_type_old = st_ivas->renderer_type;
765 22772 : ivas_renderer_select( st_ivas );
766 :
767 : /* side effect of the renderer selection can be a changed internal config */
768 22772 : ivas_output_init( &( st_ivas->hIntSetup ), st_ivas->intern_config );
769 :
770 : /* transfer subframe info from DirAC or ParamMC to central tc buffer */
771 22772 : if ( st_ivas->hTcBuffer->tc_buffer_mode != TC_BUFFER_MODE_BUFFER )
772 : {
773 20170 : if ( last_mc_mode == MC_MODE_PARAMMC )
774 : {
775 5247 : st_ivas->hTcBuffer->nb_subframes = st_ivas->hParamMC->nb_subframes;
776 5247 : st_ivas->hTcBuffer->subframes_rendered = st_ivas->hParamMC->subframes_rendered;
777 5247 : st_ivas->hTcBuffer->num_slots = st_ivas->hParamMC->num_slots;
778 5247 : st_ivas->hTcBuffer->slots_rendered = st_ivas->hParamMC->slots_rendered;
779 5247 : mvs2s( st_ivas->hParamMC->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS );
780 : }
781 14923 : else if ( last_mc_mode == MC_MODE_MCMASA && st_ivas->hSpatParamRendCom != NULL )
782 : {
783 7211 : st_ivas->hTcBuffer->nb_subframes = st_ivas->hSpatParamRendCom->nb_subframes;
784 7211 : st_ivas->hTcBuffer->subframes_rendered = st_ivas->hSpatParamRendCom->subframes_rendered;
785 7211 : st_ivas->hTcBuffer->num_slots = st_ivas->hSpatParamRendCom->num_slots;
786 7211 : st_ivas->hTcBuffer->slots_rendered = st_ivas->hSpatParamRendCom->slots_rendered;
787 7211 : mvs2s( st_ivas->hSpatParamRendCom->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS );
788 : }
789 : }
790 :
791 : #ifdef NONBE_1321_JBM_ASSERT_BITRATE_SWITCHING
792 : /* JBM: when granularity goes down (e.g. MCT with CREND -> ParamMC with binaural fastconv
793 : render what still fits in the new granularity */
794 22772 : tc_granularity_new = ivas_jbm_dec_get_render_granularity( st_ivas->renderer_type, RENDERER_DISABLE, st_ivas->hDecoderConfig->output_Fs );
795 :
796 22772 : if ( tc_granularity_new < st_ivas->hTcBuffer->n_samples_granularity )
797 : {
798 : /* flush already done in IVAS_DEC_ReadFormat() */
799 : }
800 : /* JBM: when granularity goes up set samples to discard at the beginning of the frame */
801 19839 : else if ( tc_granularity_new > st_ivas->hTcBuffer->n_samples_granularity )
802 : {
803 2956 : if ( ( error = ivas_jbm_dec_set_discard_samples( st_ivas ) ) != IVAS_ERR_OK )
804 : {
805 0 : return error;
806 : }
807 : }
808 :
809 : #endif
810 22772 : if ( st_ivas->mc_mode == MC_MODE_MCT )
811 : {
812 9097 : st_ivas->nchan_transport = ivas_mc_ls_setup_get_num_channels( ivas_mc_map_output_config_to_mc_ls_setup( st_ivas->transport_config ) );
813 9097 : st_ivas->nSCE = 0;
814 9097 : st_ivas->nCPE = st_ivas->nchan_transport / 2;
815 :
816 9097 : if ( last_mc_mode != MC_MODE_MCT )
817 : {
818 : /*De-allocate handles for other MC modes*/
819 6088 : if ( st_ivas->hParamMC != NULL )
820 : {
821 2661 : ivas_param_mc_dec_close( &st_ivas->hParamMC );
822 :
823 : /* remove ls conversion if it was allocated by ParamMC */
824 2661 : ivas_ls_setup_conversion_close( &st_ivas->hLsSetUpConversion );
825 : }
826 :
827 6088 : if ( last_mc_mode == MC_MODE_PARAMUPMIX )
828 : {
829 172 : ivas_mc_paramupmix_dec_close( &( st_ivas->hMCParamUpmix ) );
830 172 : ivas_ls_setup_conversion_close( &( st_ivas->hLsSetUpConversion ) );
831 : }
832 :
833 : /* De-allocate McMasa-related handles */
834 6088 : ivas_masa_dec_close( &( st_ivas->hMasa ) );
835 6088 : ivas_qmetadata_close( &st_ivas->hQMetaData );
836 :
837 6088 : ivas_dirac_rend_close( &( st_ivas->hDirACRend ) );
838 6088 : ivas_spat_hSpatParamRendCom_close( &( st_ivas->hSpatParamRendCom ) );
839 6088 : ivas_dirac_dec_close( &( st_ivas->hDirAC ) );
840 6088 : vbap_free_data( &( st_ivas->hVBAPdata ) );
841 :
842 : /* init LS conversion if the renderer type asks for it */
843 6088 : if ( st_ivas->renderer_type == RENDERER_MC && st_ivas->hLsSetUpConversion == NULL )
844 : {
845 988 : if ( ( error = ivas_ls_setup_conversion_open( st_ivas ) ) != IVAS_ERR_OK )
846 : {
847 0 : return error;
848 : }
849 : }
850 : }
851 : }
852 13675 : else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX )
853 : {
854 670 : st_ivas->nSCE = 0;
855 670 : st_ivas->nCPE = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS / 2;
856 670 : st_ivas->nchan_transport = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS;
857 :
858 670 : if ( last_mc_mode != MC_MODE_PARAMUPMIX )
859 : {
860 : /*De-allocate handles for other MC modes*/
861 670 : if ( st_ivas->hParamMC != NULL )
862 : {
863 25 : ivas_param_mc_dec_close( &st_ivas->hParamMC );
864 :
865 : /* remove ls conversion if it was allocated by ParamMC */
866 25 : ivas_ls_setup_conversion_close( &st_ivas->hLsSetUpConversion );
867 : }
868 :
869 670 : ivas_masa_dec_close( &( st_ivas->hMasa ) );
870 670 : ivas_qmetadata_close( &st_ivas->hQMetaData );
871 :
872 : /* init LS conversion if the renderer type asks for it */
873 670 : if ( ( st_ivas->renderer_type == RENDERER_MC ) && st_ivas->hLsSetUpConversion == NULL )
874 : {
875 71 : if ( ( error = ivas_ls_setup_conversion_open( st_ivas ) ) != IVAS_ERR_OK )
876 : {
877 0 : return error;
878 : }
879 : }
880 :
881 670 : if ( ( error = ivas_mc_paramupmix_dec_open( st_ivas ) ) != IVAS_ERR_OK )
882 : {
883 0 : return error;
884 : }
885 : }
886 : #ifdef DEBUGGING
887 : else
888 : {
889 : assert( 0 );
890 : }
891 : #endif
892 : }
893 13005 : else if ( st_ivas->mc_mode == MC_MODE_PARAMMC )
894 : {
895 5341 : if ( last_mc_mode != MC_MODE_PARAMMC )
896 : {
897 : /* remove old ls conversion for MCT if open, gets reopened correctly within ivas_param_mc_dec_open when needed */
898 4317 : if ( renderer_type_old == RENDERER_MC && st_ivas->hLsSetUpConversion != NULL )
899 : {
900 439 : ivas_ls_setup_conversion_close( &st_ivas->hLsSetUpConversion );
901 : }
902 :
903 4317 : if ( ( error = ivas_param_mc_dec_open( st_ivas ) ) != IVAS_ERR_OK )
904 : {
905 0 : return error;
906 : }
907 : }
908 : else
909 : {
910 1024 : if ( ( error = ivas_param_mc_dec_reconfig( st_ivas ) ) != IVAS_ERR_OK )
911 : {
912 0 : return error;
913 : }
914 : }
915 :
916 : /* De-allocate McMasa-related handles */
917 5341 : ivas_masa_dec_close( &( st_ivas->hMasa ) );
918 5341 : ivas_qmetadata_close( &st_ivas->hQMetaData );
919 :
920 5341 : ivas_dirac_rend_close( &( st_ivas->hDirACRend ) );
921 5341 : ivas_spat_hSpatParamRendCom_close( &( st_ivas->hSpatParamRendCom ) );
922 5341 : ivas_dirac_dec_close( &( st_ivas->hDirAC ) );
923 :
924 5341 : vbap_free_data( &( st_ivas->hVBAPdata ) );
925 :
926 5341 : if ( last_mc_mode == MC_MODE_MCT )
927 : {
928 2617 : if ( st_ivas->hMCT != NULL && st_ivas->nchan_transport <= CPE_CHANNELS )
929 : {
930 2224 : ivas_mct_dec_close( &st_ivas->hMCT );
931 : }
932 : }
933 2724 : else if ( last_mc_mode == MC_MODE_PARAMUPMIX )
934 : {
935 16 : ivas_mc_paramupmix_dec_close( &( st_ivas->hMCParamUpmix ) );
936 : }
937 :
938 : /* LFE handle */
939 5341 : ivas_lfe_dec_close( &( st_ivas->hLFE ) );
940 : }
941 7664 : else if ( st_ivas->mc_mode == MC_MODE_MCMASA )
942 : {
943 7664 : ivas_mcmasa_setNumTransportChannels( &( st_ivas->nchan_transport ), &( st_ivas->element_mode_init ), ivas_total_brate );
944 :
945 7664 : if ( last_mc_mode != MC_MODE_MCMASA )
946 : {
947 5364 : if ( ( error = ivas_qmetadata_open( &( st_ivas->hQMetaData ) ) ) != IVAS_ERR_OK )
948 : {
949 0 : return error;
950 : }
951 : }
952 :
953 7664 : if ( ( error = ivas_mcmasa_dec_reconfig( st_ivas ) ) != IVAS_ERR_OK )
954 : {
955 0 : return error;
956 : }
957 :
958 : /* LS conversion */
959 7664 : if ( st_ivas->hLsSetUpConversion != NULL )
960 : {
961 835 : ivas_ls_setup_conversion_close( &st_ivas->hLsSetUpConversion );
962 : }
963 :
964 7664 : ivas_mc_paramupmix_dec_close( &( st_ivas->hMCParamUpmix ) );
965 :
966 7664 : if ( st_ivas->hParamMC != NULL )
967 : {
968 1625 : ivas_param_mc_dec_close( &st_ivas->hParamMC );
969 1625 : st_ivas->hParamMC = NULL;
970 : }
971 :
972 7664 : if ( last_mc_mode == MC_MODE_MCT )
973 : {
974 3269 : ivas_mct_dec_close( &st_ivas->hMCT );
975 : }
976 :
977 : /* LFE handle */
978 7664 : ivas_lfe_dec_close( &( st_ivas->hLFE ) );
979 : }
980 :
981 22772 : if ( st_ivas->mc_mode != MC_MODE_MCMASA )
982 : {
983 15108 : if ( st_ivas->nchan_transport == 1 )
984 : {
985 0 : st_ivas->element_mode_init = IVAS_SCE;
986 : }
987 : else
988 : {
989 15108 : st_ivas->element_mode_init = IVAS_CPE_MDCT;
990 : }
991 : }
992 :
993 : /*-----------------------------------------------------------------*
994 : * Reconfigure core coder
995 : *-----------------------------------------------------------------*/
996 :
997 : /* special case: MCT->ParamMC with more than 2 TC, CPE 1 stays, but has the wrong mct_chan_mode in channel 1
998 : and might have IGF static memory not allocated and the bit stream index list not set,
999 : 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 */
1000 22772 : if ( last_mc_mode == MC_MODE_MCT && st_ivas->mc_mode == MC_MODE_PARAMMC && st_ivas->nchan_transport > CPE_CHANNELS )
1001 : {
1002 393 : st = st_ivas->hCPE[1]->hCoreCoder[1];
1003 :
1004 393 : if ( st_ivas->nchan_transport == 3 )
1005 : {
1006 393 : st->mct_chan_mode = MCT_CHAN_MODE_IGNORE;
1007 : }
1008 : else
1009 : {
1010 0 : st->mct_chan_mode = MCT_CHAN_MODE_REGULAR;
1011 : }
1012 :
1013 393 : if ( st->hIGFDec == NULL )
1014 : {
1015 0 : if ( ( st->hIGFDec = (IGF_DEC_INSTANCE_HANDLE) malloc( sizeof( IGFDEC_INSTANCE ) ) ) == NULL )
1016 : {
1017 0 : return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for IGF\n" ) );
1018 : }
1019 :
1020 0 : st->igf = 0;
1021 0 : init_igf_dec( st->hIGFDec );
1022 : }
1023 :
1024 393 : if ( st->hHQ_core == NULL )
1025 : {
1026 0 : if ( ( st->hHQ_core = (HQ_DEC_HANDLE) malloc( sizeof( HQ_DEC_DATA ) ) ) == NULL )
1027 : {
1028 0 : return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HQ core\n" ) );
1029 : }
1030 :
1031 : /* HQ core initialization */
1032 0 : HQ_core_dec_init( st->hHQ_core );
1033 : }
1034 :
1035 : /* check if we have a doubly used hTxcCfg, if so, allocate a distint one for the old MCT LFE channel */
1036 393 : if ( st->hTcxCfg == st_ivas->hCPE[1]->hCoreCoder[0]->hTcxCfg )
1037 : {
1038 0 : if ( ( st->hTcxCfg = (TCX_CONFIG_HANDLE) malloc( sizeof( TCX_config ) ) ) == NULL )
1039 : {
1040 0 : return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for hTcxCfg\n" ) );
1041 : }
1042 : }
1043 :
1044 393 : st->hTcxCfg->fIsTNSAllowed = getTnsAllowed( ivas_total_brate, st->igf, st->element_mode );
1045 : }
1046 22772 : if ( st_ivas->mc_mode == MC_MODE_MCMASA )
1047 : {
1048 : uint8_t separateChannelEnabled;
1049 : int16_t separateChannelIndex;
1050 7664 : ivas_mcmasa_set_separate_channel_mode( &separateChannelEnabled, &separateChannelIndex, ivas_total_brate );
1051 7664 : ivas_mcmasa_split_brate( separateChannelEnabled, ivas_total_brate, st_ivas->nSCE, st_ivas->nCPE, &new_brate_SCE, &new_brate_CPE );
1052 : }
1053 15108 : else if ( st_ivas->mc_mode == MC_MODE_MCT )
1054 : {
1055 9097 : new_brate_SCE = 0;
1056 9097 : new_brate_CPE = ( ivas_total_brate / ( st_ivas->nchan_transport - 1 ) ) * CPE_CHANNELS;
1057 : }
1058 6011 : else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX )
1059 : {
1060 670 : new_brate_SCE = 0;
1061 670 : new_brate_CPE = ( ivas_total_brate / ( st_ivas->nchan_transport - 1 ) ) * CPE_CHANNELS;
1062 : }
1063 : else
1064 : {
1065 5341 : new_brate_SCE = 0; /* ivas_total_brate / st_ivas->nchan_transport;*/
1066 5341 : new_brate_CPE = ( ivas_total_brate / st_ivas->nchan_transport ) * CPE_CHANNELS;
1067 : }
1068 :
1069 22772 : 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 )
1070 : {
1071 0 : return error;
1072 : }
1073 :
1074 22772 : if ( last_mc_mode == MC_MODE_MCT && st_ivas->mc_mode == MC_MODE_PARAMMC && st_ivas->nchan_transport > CPE_CHANNELS )
1075 : {
1076 393 : st = st_ivas->hCPE[1]->hCoreCoder[1];
1077 :
1078 : /* TCX-LTP */
1079 393 : if ( st->hTcxLtpDec == NULL )
1080 : {
1081 0 : if ( ( st->hTcxLtpDec = (TCX_LTP_DEC_HANDLE) malloc( sizeof( TCX_LTP_DEC_DATA ) ) ) == NULL )
1082 : {
1083 0 : return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TCX-LTP handle\n" ) );
1084 : }
1085 0 : tcxltp_dec_init( st->hTcxLtpDec, 0, st->last_codec_mode, st->element_mode, st->pit_max, st->sr_core );
1086 : }
1087 : }
1088 :
1089 : /*-----------------------------------------------------------------*
1090 : * re-configure HP20 memories
1091 : *-----------------------------------------------------------------*/
1092 :
1093 22772 : if ( ( error = ivas_hp20_dec_reconfig( st_ivas, nchan_hp20_old ) ) != IVAS_ERR_OK )
1094 : {
1095 0 : return error;
1096 : }
1097 :
1098 : /*-----------------------------------------------------------------*
1099 : * Reconfigure renderers
1100 : *-----------------------------------------------------------------*/
1101 :
1102 22772 : if ( st_ivas->mc_mode == MC_MODE_MCMASA )
1103 : {
1104 7664 : if ( ( st_ivas->renderer_type != RENDERER_DISABLE ) && ( st_ivas->renderer_type != RENDERER_MCMASA_MONO_STEREO ) )
1105 : {
1106 7155 : if ( st_ivas->hDirAC != NULL )
1107 : {
1108 : /* reconfigure existing DirAC dec */
1109 7155 : if ( ( error = ivas_dirac_dec_config( st_ivas, DIRAC_RECONFIGURE ) ) != IVAS_ERR_OK )
1110 : {
1111 0 : return error;
1112 : }
1113 : }
1114 : else
1115 : {
1116 : /* init a new DirAC dec */
1117 0 : if ( ( error = ivas_dirac_dec_config( st_ivas, DIRAC_OPEN ) ) != IVAS_ERR_OK )
1118 : {
1119 0 : return error;
1120 : }
1121 : }
1122 : }
1123 509 : else if ( st_ivas->renderer_type == RENDERER_DISABLE )
1124 : {
1125 284 : ivas_dirac_rend_close( &( st_ivas->hDirACRend ) );
1126 284 : ivas_spat_hSpatParamRendCom_close( &( st_ivas->hSpatParamRendCom ) );
1127 284 : ivas_dirac_dec_close( &( st_ivas->hDirAC ) );
1128 :
1129 284 : vbap_free_data( &( st_ivas->hVBAPdata ) );
1130 : }
1131 : }
1132 :
1133 22772 : if ( renderer_type_old != st_ivas->renderer_type )
1134 : {
1135 : AUDIO_CONFIG output_config;
1136 :
1137 13377 : output_config = st_ivas->hDecoderConfig->output_config;
1138 :
1139 : /* binaural renderers*/
1140 13377 : 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 )
1141 : {
1142 : /* remove unneeded binaural renderers */
1143 7778 : if ( st_ivas->hBinRenderer != NULL && ( st_ivas->renderer_type != RENDERER_BINAURAL_FASTCONV && st_ivas->renderer_type != RENDERER_BINAURAL_FASTCONV_ROOM ) )
1144 : {
1145 2393 : ivas_binRenderer_close( &st_ivas->hBinRenderer );
1146 :
1147 2393 : if ( ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) )
1148 : {
1149 483 : efap_free_data( &st_ivas->hEFAPdata );
1150 : }
1151 : }
1152 :
1153 7778 : 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 ) ) )
1154 : {
1155 2493 : ivas_rend_closeCrend( &( st_ivas->hCrendWrapper ) );
1156 : }
1157 :
1158 7778 : if ( st_ivas->hBinRendererTd != NULL && ( st_ivas->renderer_type != RENDERER_BINAURAL_OBJECTS_TD ) )
1159 : {
1160 440 : ivas_td_binaural_close( &st_ivas->hBinRendererTd );
1161 : }
1162 :
1163 7778 : if ( st_ivas->hDiracDecBin[0] != NULL )
1164 : {
1165 4874 : if ( st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC_ROOM && st_ivas->renderer_type != RENDERER_STEREO_PARAMETRIC )
1166 : {
1167 2452 : ivas_dirac_dec_close_binaural_data( st_ivas->hDiracDecBin );
1168 : }
1169 : }
1170 :
1171 : /* init necessary new renderers */
1172 7778 : if ( st_ivas->hBinRenderer == NULL && ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) )
1173 : {
1174 2400 : if ( ( error = ivas_binRenderer_open( st_ivas ) ) != IVAS_ERR_OK )
1175 : {
1176 0 : return error;
1177 : }
1178 : }
1179 5378 : else if ( st_ivas->hBinRendererTd == NULL && st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD )
1180 : {
1181 448 : if ( ( error = ivas_td_binaural_open( st_ivas ) ) != IVAS_ERR_OK )
1182 : {
1183 0 : return error;
1184 : }
1185 :
1186 448 : if ( st_ivas->hOutSetup.output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB )
1187 : {
1188 222 : if ( ( error = ivas_reverb_open( &st_ivas->hReverb, st_ivas->hHrtfStatistics, st_ivas->hRenderConfig, st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK )
1189 : {
1190 0 : return error;
1191 : }
1192 : }
1193 :
1194 448 : if ( st_ivas->hIntSetup.output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB )
1195 : {
1196 0 : if ( ( error = ivas_rend_initCrendWrapper( &st_ivas->hCrendWrapper, 1 ) ) != IVAS_ERR_OK )
1197 : {
1198 0 : return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend Wrapper\n" );
1199 : }
1200 :
1201 0 : st_ivas->hCrendWrapper->hCrend[0] = NULL;
1202 0 : st_ivas->hCrendWrapper->hHrtfCrend = NULL;
1203 0 : if ( ( st_ivas->hCrendWrapper->hCrend[0] = (CREND_HANDLE) malloc( sizeof( CREND_DATA ) ) ) == NULL )
1204 : {
1205 0 : return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend\n" );
1206 : }
1207 : }
1208 : }
1209 4930 : else if ( st_ivas->hCrendWrapper == NULL && ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) )
1210 : {
1211 2508 : 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 )
1212 : {
1213 0 : return error;
1214 : }
1215 2508 : st_ivas->binaural_latency_ns = st_ivas->hCrendWrapper->binaural_latency_ns;
1216 : }
1217 : }
1218 : /* mono/stereo */
1219 : else if ( output_config == IVAS_AUDIO_CONFIG_MONO || output_config == IVAS_AUDIO_CONFIG_STEREO )
1220 : {
1221 : /* nothing should happen here... */
1222 : }
1223 : /* LS */
1224 : 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 )
1225 : {
1226 : #ifdef DEBUGGING
1227 : 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 );
1228 : #endif
1229 : }
1230 : #ifdef DEBUGGING
1231 : else if ( output_config == IVAS_AUDIO_CONFIG_FOA || output_config == IVAS_AUDIO_CONFIG_HOA2 || output_config == IVAS_AUDIO_CONFIG_HOA3 )
1232 : {
1233 : /* FOA/HOA output */
1234 : /* Nothing to do, renderer is always RENDERER_SBA_LINEAR_ENC */
1235 : assert( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC && renderer_type_old == RENDERER_SBA_LINEAR_ENC );
1236 : }
1237 : #endif
1238 : }
1239 :
1240 : /*-----------------------------------------------------------------*
1241 : * CLDFB instances
1242 : *-----------------------------------------------------------------*/
1243 :
1244 22772 : if ( ( error = ivas_cldfb_dec_reconfig( st_ivas, nchan_transport_old, numCldfbAnalyses_old, numCldfbSyntheses_old ) ) != IVAS_ERR_OK )
1245 : {
1246 0 : return error;
1247 : }
1248 :
1249 :
1250 : /*-----------------------------------------------------------------*
1251 : * Allocate the LFE handle that is coded separately after the allocation of the core coders
1252 : *-----------------------------------------------------------------*/
1253 :
1254 22772 : if ( ( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) )
1255 : {
1256 : int32_t delay_ns;
1257 9767 : if ( st_ivas->hIntSetup.index_lfe[0] != -1 )
1258 : {
1259 9457 : delay_ns = st_ivas->binaural_latency_ns;
1260 : }
1261 : else
1262 : {
1263 310 : delay_ns = 0;
1264 : }
1265 :
1266 9767 : if ( st_ivas->hBinRenderer != NULL )
1267 : {
1268 244 : if ( st_ivas->hBinRenderer->render_lfe )
1269 : {
1270 : /* Account for filterbank delay */
1271 169 : delay_ns += IVAS_FB_DEC_DELAY_NS;
1272 : }
1273 : else
1274 : {
1275 75 : delay_ns = 0;
1276 : }
1277 : }
1278 : else
1279 : {
1280 9523 : if ( ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) && ( st_ivas->cldfbSynDec[0] != NULL ) )
1281 : {
1282 338 : delay_ns += IVAS_FB_DEC_DELAY_NS;
1283 : }
1284 : }
1285 :
1286 9767 : if ( st_ivas->hLFE != NULL )
1287 : {
1288 3342 : if ( st_ivas->hLFE->delay_ns != delay_ns )
1289 : {
1290 252 : ivas_lfe_dec_close( &( st_ivas->hLFE ) );
1291 : }
1292 : }
1293 :
1294 9767 : if ( st_ivas->hLFE == NULL )
1295 : {
1296 6677 : if ( ( error = ivas_create_lfe_dec( &st_ivas->hLFE, st_ivas->hDecoderConfig->output_Fs, delay_ns ) ) != IVAS_ERR_OK )
1297 : {
1298 0 : return error;
1299 : }
1300 :
1301 6677 : set_zero( st_ivas->hLFE->prevsynth_buf, LFE_PLC_BUFLEN );
1302 6677 : set_zero( st_ivas->hLFE->prior_out_buffer, L_FRAME48k );
1303 : }
1304 : }
1305 :
1306 : /*-----------------------------------------------------------------*
1307 : * JBM TC buffers
1308 : *-----------------------------------------------------------------*/
1309 : {
1310 : int16_t tc_nchan_full_new;
1311 : DECODER_TC_BUFFER_HANDLE hTcBuffer;
1312 :
1313 22772 : hTcBuffer = st_ivas->hTcBuffer;
1314 22772 : tc_buffer_mode_new = ivas_jbm_dec_get_tc_buffer_mode( st_ivas );
1315 22772 : tc_nchan_tc_new = ivas_jbm_dec_get_num_tc_channels( st_ivas );
1316 22772 : tc_nchan_allocate_new = tc_nchan_tc_new;
1317 22772 : tc_nchan_full_new = tc_nchan_tc_new;
1318 : #ifndef NONBE_1321_JBM_ASSERT_BITRATE_SWITCHING
1319 : tc_granularity_new = ivas_jbm_dec_get_render_granularity( st_ivas->renderer_type, RENDERER_DISABLE, st_ivas->hDecoderConfig->output_Fs );
1320 : #endif
1321 :
1322 22772 : if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC )
1323 : {
1324 3268 : tc_nchan_allocate_new = BINAURAL_CHANNELS;
1325 3268 : if ( st_ivas->hDiracDecBin[0] != NULL && st_ivas->hDiracDecBin[0]->useTdDecorr )
1326 : {
1327 2324 : tc_nchan_allocate_new = 2 * BINAURAL_CHANNELS;
1328 : }
1329 944 : else if ( st_ivas->hOutSetup.separateChannelEnabled )
1330 : {
1331 538 : tc_nchan_allocate_new++;
1332 : }
1333 :
1334 3268 : tc_nchan_full_new = tc_nchan_allocate_new;
1335 : }
1336 :
1337 22772 : 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 )
1338 : {
1339 5253 : tc_nchan_full_new = 0;
1340 : }
1341 17519 : else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX )
1342 : {
1343 670 : tc_nchan_allocate_new = MC_PARAMUPMIX_MAX_INPUT_CHANS;
1344 670 : tc_buffer_mode_new = TC_BUFFER_MODE_RENDERER;
1345 670 : if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_STEREO || st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_MONO )
1346 : {
1347 88 : tc_buffer_mode_new = TC_BUFFER_MODE_BUFFER;
1348 88 : tc_nchan_tc_new = st_ivas->hDecoderConfig->nchan_out;
1349 88 : tc_nchan_allocate_new = tc_nchan_tc_new;
1350 : }
1351 670 : tc_nchan_full_new = tc_nchan_allocate_new;
1352 : }
1353 :
1354 : /* reconfigure buffer */
1355 22772 : if ( hTcBuffer->tc_buffer_mode != tc_buffer_mode_new || hTcBuffer->nchan_transport_jbm != tc_nchan_tc_new ||
1356 5329 : hTcBuffer->nchan_buffer_full != tc_nchan_full_new || hTcBuffer->nchan_transport_internal != tc_nchan_allocate_new ||
1357 4994 : tc_granularity_new != hTcBuffer->n_samples_granularity )
1358 : {
1359 17778 : 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 )
1360 : {
1361 0 : return error;
1362 : }
1363 : }
1364 :
1365 : /* transfer subframe info from central tc buffer to ParamMC or McMASA (DirAC) */
1366 22772 : if ( st_ivas->hSpatParamRendCom != NULL )
1367 : {
1368 7582 : st_ivas->hSpatParamRendCom->nb_subframes = st_ivas->hTcBuffer->nb_subframes;
1369 7582 : st_ivas->hSpatParamRendCom->subframes_rendered = st_ivas->hTcBuffer->subframes_rendered;
1370 7582 : st_ivas->hSpatParamRendCom->num_slots = st_ivas->hTcBuffer->num_slots;
1371 7582 : st_ivas->hSpatParamRendCom->slots_rendered = st_ivas->hTcBuffer->slots_rendered;
1372 7582 : mvs2s( st_ivas->hTcBuffer->subframe_nbslots, st_ivas->hSpatParamRendCom->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS );
1373 : }
1374 15190 : else if ( st_ivas->hParamMC != NULL )
1375 : {
1376 5341 : st_ivas->hParamMC->nb_subframes = st_ivas->hTcBuffer->nb_subframes;
1377 5341 : st_ivas->hParamMC->subframes_rendered = st_ivas->hTcBuffer->subframes_rendered;
1378 5341 : st_ivas->hParamMC->num_slots = st_ivas->hTcBuffer->num_slots;
1379 5341 : st_ivas->hParamMC->slots_rendered = st_ivas->hTcBuffer->slots_rendered;
1380 5341 : mvs2s( st_ivas->hTcBuffer->subframe_nbslots, st_ivas->hParamMC->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS );
1381 : }
1382 : }
1383 :
1384 : /*-----------------------------------------------------------------*
1385 : * floating-point output audio buffers
1386 : *-----------------------------------------------------------------*/
1387 :
1388 22772 : nchan_out_buff = ivas_get_nchan_buffers_dec( st_ivas, -1, -1 );
1389 22772 : 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 )
1390 : {
1391 0 : return error;
1392 : }
1393 :
1394 22772 : return IVAS_ERR_OK;
1395 : }
|