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 1607645 : 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 1607645 : push_wmops( "ivas_mct_dec" );
92 :
93 1607645 : error = IVAS_ERR_OK;
94 1607645 : nCPE = st_ivas->nCPE;
95 1607645 : hMCT = st_ivas->hMCT;
96 :
97 1607645 : ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate;
98 :
99 1607645 : 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 304830 : mvr2r( output[LFE_CHANNEL], output_lfe_ch, output_frame );
103 : }
104 :
105 1607645 : 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 272455 : n = ivas_mc_ls_setup_get_num_channels( ivas_mc_map_output_config_to_mc_ls_setup( st_ivas->transport_config ) );
109 :
110 272455 : 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 6364332 : for ( cpe_id = 0; cpe_id < nCPE; cpe_id++ )
118 : {
119 : /*initialize param_lpc buffer*/
120 14270061 : for ( n = 0; n < CPE_CHANNELS; n++ )
121 : {
122 9513374 : set_s( param_lpc[cpe_id][n], 0, NPRM_LPC_NEW );
123 : }
124 :
125 4756687 : if ( ( error = ivas_cpe_dec( st_ivas, cpe_id, output, output_frame, 0 ) ) != IVAS_ERR_OK )
126 : {
127 0 : return error;
128 : }
129 :
130 4756687 : if ( cpe_id == 0 )
131 : {
132 1607645 : 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 4756687 : if ( !st_ivas->bfi )
136 : {
137 4369130 : 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 4369130 : ( ( cpe_id + 1 ) * CPE_CHANNELS > hMCT->nchan_out_woLFE ) );
139 :
140 4369130 : st_ivas->BER_detect |= st_ivas->hCPE[cpe_id]->hCoreCoder[0]->BER_detect;
141 4369130 : st_ivas->BER_detect |= st_ivas->hCPE[cpe_id]->hCoreCoder[1]->BER_detect;
142 : }
143 : }
144 :
145 : /* MCT side bits decoder */
146 1607645 : 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 1607645 : 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 6364332 : for ( cpe_id = 0; cpe_id < nCPE; cpe_id++ )
159 : {
160 4756687 : st_ivas->hCPE[cpe_id]->hCoreCoder[0]->BER_detect |= st_ivas->BER_detect;
161 4756687 : st_ivas->hCPE[cpe_id]->hCoreCoder[1]->BER_detect |= st_ivas->BER_detect;
162 :
163 14270061 : for ( n = 0; n < CPE_CHANNELS; n++ )
164 : {
165 9513374 : x[n][0] = output[n + cpe_id * CPE_CHANNELS];
166 9513374 : x[n][1] = output[n + cpe_id * CPE_CHANNELS] + ( L_FRAME48k / 2 );
167 9513374 : set_zero( x[n][0], L_FRAME48k / 2 );
168 9513374 : set_zero( x[n][1], L_FRAME48k / 2 );
169 : }
170 :
171 4756687 : ivas_mdct_core_invQ( st_ivas->hCPE[cpe_id], nTnsBitsTCX10[cpe_id], p_param[cpe_id], param_lpc[cpe_id], param[cpe_id],
172 4756687 : fUseTns[cpe_id], tnsData[cpe_id], x, x, Aq[cpe_id], NULL, 1 );
173 :
174 4756687 : st_ivas->BER_detect |= st_ivas->hCPE[cpe_id]->hCoreCoder[0]->BER_detect;
175 4756687 : st_ivas->BER_detect |= st_ivas->hCPE[cpe_id]->hCoreCoder[1]->BER_detect;
176 : }
177 :
178 : /* MCT core decoder */
179 1607645 : 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 1607645 : if ( st_ivas->sba_dirac_stereo_flag && st_ivas->ivas_format != SBA_ISM_FORMAT )
183 : {
184 41964 : for ( cpe_id = 1; cpe_id < nCPE; cpe_id++ )
185 : {
186 62946 : for ( n = 0; n < CPE_CHANNELS; n++ )
187 : {
188 41964 : 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 6364332 : for ( cpe_id = 0; cpe_id < nCPE; cpe_id++ )
195 : {
196 4756687 : hCPE = st_ivas->hCPE[cpe_id];
197 :
198 14270061 : for ( n = 0; n < CPE_CHANNELS; n++ )
199 : {
200 9513374 : x[n][0] = output[n + cpe_id * CPE_CHANNELS];
201 9513374 : x[n][1] = output[n + cpe_id * CPE_CHANNELS] + ( L_FRAME48k / 2 );
202 : }
203 :
204 4756687 : ivas_mdct_core_tns_ns( hCPE, fUseTns[cpe_id], tnsData[cpe_id], x, Aq[cpe_id], 1 );
205 : }
206 :
207 1607645 : if ( st_ivas->renderer_type == RENDERER_MC )
208 : {
209 : /* Equalization in MDCT Domain */
210 77277 : ivas_ls_setup_conversion_process_mdct( st_ivas, output );
211 : }
212 :
213 1530368 : 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 9090 : for ( cpe_id = 0; cpe_id < nCPE; cpe_id++ )
218 : {
219 18180 : for ( n = 0; n < CPE_CHANNELS; n++ )
220 : {
221 12120 : x_all[n + cpe_id * CPE_CHANNELS][0] = output[n + cpe_id * CPE_CHANNELS];
222 12120 : x_all[n + cpe_id * CPE_CHANNELS][1] = output[n + cpe_id * CPE_CHANNELS] + ( L_FRAME48k / 2 );
223 : }
224 : }
225 :
226 3030 : ivas_ls_setup_conversion_process_mdct_param_mc( st_ivas, x_all );
227 : }
228 :
229 6364332 : for ( cpe_id = 0; cpe_id < nCPE; cpe_id++ )
230 : {
231 4756687 : hCPE = st_ivas->hCPE[cpe_id];
232 4756687 : sts = hCPE->hCoreCoder;
233 :
234 14270061 : for ( n = 0; n < CPE_CHANNELS; n++ )
235 : {
236 9513374 : x[n][0] = output[n + cpe_id * CPE_CHANNELS];
237 9513374 : x[n][1] = output[n + cpe_id * CPE_CHANNELS] + ( L_FRAME48k / 2 );
238 : }
239 :
240 4756687 : ivas_mdct_core_reconstruct( hCPE, x, synth, fUseTns[cpe_id], 1 );
241 :
242 : /* set pointers back */
243 4756687 : 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 14270061 : for ( n = 0; n < CPE_CHANNELS; n++ )
256 : {
257 9513374 : if ( st_ivas->sba_dirac_stereo_flag && ( st_ivas->ivas_format != SBA_ISM_FORMAT || cpe_id >= nCPE - 2 ) )
258 : {
259 302196 : ivas_post_proc( NULL, hCPE, n, synth[n], NULL, output_frame, 1 );
260 : }
261 :
262 : /* Postprocessing for ACELP/MDCT core switching and synchronization */
263 9513374 : 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 9513374 : mvr2r( synth[n], output[cpe_id * CPE_CHANNELS + n], output_frame );
270 :
271 : /* Save synthesis for HQ FEC */
272 9513374 : save_synthesis_hq_fec( sts[n], output[cpe_id * CPE_CHANNELS + n], output_frame, hCPE );
273 :
274 : /* CoreCoder common updates */
275 9513374 : 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 4756687 : if ( !st_ivas->sba_dirac_stereo_flag || ( st_ivas->ivas_format == SBA_ISM_FORMAT && cpe_id < nCPE - 2 ) )
284 : {
285 4605589 : 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 1607645 : 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 304830 : mvr2r( output[hMCT->nchan_out_woLFE - 1], tmp, output_frame );
304 :
305 1391272 : for ( n = hMCT->nchan_out_woLFE - 1; n >= LFE_CHANNEL; n-- )
306 : {
307 1086442 : mvr2r( output[n - 1], output[n + 1], output_frame );
308 : }
309 304830 : mvr2r( tmp, output[LFE_CHANNEL - 1], output_frame );
310 :
311 : /* save LFE channel */
312 304830 : 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 1607645 : pop_wmops();
329 1607645 : return error;
330 : }
331 :
332 :
333 : /*-------------------------------------------------------------------------
334 : * create_mct_dec()
335 : *
336 : * Create, allocate and initialize IVAS decoder MCT handle
337 : *-------------------------------------------------------------------------*/
338 :
339 28084 : 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 28084 : 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 28084 : 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 23170 : hMCT->nchan_out_woLFE = st_ivas->nchan_transport;
366 23170 : if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC )
367 : {
368 14864 : hMCT->nchan_out_woLFE += st_ivas->nchan_ism;
369 : }
370 : }
371 4914 : else if ( st_ivas->mc_mode == MC_MODE_MCT )
372 : {
373 4716 : hMCT->nchan_out_woLFE = st_ivas->nchan_transport - st_ivas->hTransSetup.num_lfe;
374 : }
375 198 : else if ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMUPMIX )
376 : {
377 198 : 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 28084 : cp_bitrate = st_ivas->hDecoderConfig->ivas_total_brate / hMCT->nchan_out_woLFE * CPE_CHANNELS;
385 :
386 28084 : if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC )
387 : {
388 14864 : 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 113095 : for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ )
393 : {
394 255033 : for ( n = 0; n < CPE_CHANNELS; n++ )
395 : {
396 170022 : 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 28084 : if ( hMCT->nchan_out_woLFE % 2 )
402 : {
403 17347 : st_ivas->hCPE[st_ivas->nCPE - 1]->hCoreCoder[1]->mct_chan_mode = MCT_CHAN_MODE_IGNORE;
404 : }
405 :
406 : /*Initialize MCT block data */
407 28084 : max_blocks = hMCT->nchan_out_woLFE / 2;
408 :
409 95748 : for ( n = 0; n < max_blocks; n++ )
410 : {
411 67664 : 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 67664 : hMCT->hBlockData[n]->ch1 = 0;
418 67664 : hMCT->hBlockData[n]->ch2 = 0;
419 :
420 : /*-----------------------------------------------------------------*
421 : * MDCT stereo initialization
422 : *-----------------------------------------------------------------*/
423 :
424 67664 : 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 67664 : 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 67664 : hMCT->hBlockData[n]->hStereoMdct->use_itd = 0;
431 67664 : hMCT->hBlockData[n]->hStereoMdct->reverse_dmx = 0;
432 67664 : hMCT->hBlockData[n]->hStereoMdct->smooth_ratio = 1.f;
433 : }
434 128924 : for ( ; n < MCT_MAX_BLOCKS; n++ )
435 : {
436 100840 : hMCT->hBlockData[n] = NULL;
437 : }
438 :
439 : /*-----------------------------------------------------------------*
440 : * Initializations
441 : *-----------------------------------------------------------------*/
442 :
443 28084 : hMCT->currBlockDataCnt = 0;
444 :
445 : /*Initialize bits required to signal channel-pair index*/
446 28084 : 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 28084 : set_s( hMCT->chBitRatios, 0, MCT_MAX_CHANNELS );
449 28084 : set_s( hMCT->lowE_ch, 0, MCT_MAX_CHANNELS );
450 :
451 28084 : st_ivas->hMCT = hMCT;
452 :
453 28084 : return IVAS_ERR_OK;
454 : }
455 :
456 :
457 : /*-------------------------------------------------------------------------
458 : * mct_dec_reconfigure()
459 : *
460 : * Reconfigure IVAS decoder MCT handle
461 : *-------------------------------------------------------------------------*/
462 :
463 4779 : 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 4779 : hMCT = st_ivas->hMCT;
474 :
475 : /*-----------------------------------------------------------------*
476 : * Allocate and initialize MCT BlockData handles
477 : *-----------------------------------------------------------------*/
478 :
479 4779 : if ( b_nchan_change )
480 : {
481 : /* Determine active channels */
482 522 : 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 498 : hMCT->nchan_out_woLFE = st_ivas->nchan_transport;
485 498 : if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC )
486 : {
487 177 : hMCT->nchan_out_woLFE += st_ivas->nchan_ism;
488 : }
489 : }
490 24 : else if ( st_ivas->mc_mode == MC_MODE_MCT )
491 : {
492 21 : hMCT->nchan_out_woLFE = st_ivas->nchan_transport - st_ivas->hTransSetup.num_lfe;
493 : }
494 3 : else if ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMUPMIX )
495 : {
496 3 : 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 19989 : for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ )
506 : {
507 45630 : for ( n = 0; n < CPE_CHANNELS; n++ )
508 : {
509 30420 : 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 4779 : if ( hMCT->nchan_out_woLFE % 2 )
515 : {
516 2781 : st_ivas->hCPE[st_ivas->nCPE - 1]->hCoreCoder[1]->mct_chan_mode = MCT_CHAN_MODE_IGNORE;
517 : }
518 :
519 4779 : cp_bitrate = st_ivas->hDecoderConfig->ivas_total_brate / hMCT->nchan_out_woLFE * CPE_CHANNELS;
520 4779 : if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC )
521 : {
522 2526 : 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 19989 : for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ )
528 : {
529 15210 : st_ivas->hCPE[cpe_id]->element_brate = cp_bitrate;
530 45630 : for ( n = 0; n < CPE_CHANNELS; n++ )
531 : {
532 30420 : st = st_ivas->hCPE[cpe_id]->hCoreCoder[n];
533 :
534 30420 : st->total_brate = st_ivas->hCPE[cpe_id]->element_brate;
535 :
536 30420 : if ( st->mct_chan_mode != MCT_CHAN_MODE_IGNORE )
537 : {
538 27639 : st->bits_frame_nominal = (int16_t) ( st_ivas->hCPE[cpe_id]->element_brate / FRAMES_PER_SEC );
539 27639 : st->igf = getIgfPresent( st->element_mode, st->bits_frame_nominal * FRAMES_PER_SEC, st->bwidth, st->rf_flag );
540 27639 : if ( st->igf )
541 : {
542 5302 : 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 4779 : max_blocks = hMCT->nchan_out_woLFE / CPE_CHANNELS;
550 :
551 17208 : for ( n = 0; n < max_blocks; n++ )
552 : {
553 12429 : if ( b_nchan_change )
554 : {
555 1101 : if ( hMCT->hBlockData[n] == NULL )
556 : {
557 351 : 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 351 : hMCT->hBlockData[n]->ch1 = 0;
564 351 : hMCT->hBlockData[n]->ch2 = 0;
565 :
566 : /* MDCT stereo initialization */
567 351 : 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 12429 : 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 12429 : hMCT->hBlockData[n]->hStereoMdct->use_itd = 0;
576 : }
577 :
578 21024 : for ( ; n < MCT_MAX_BLOCKS; n++ )
579 : {
580 : /* deallocate no longer needed blocks */
581 16245 : if ( hMCT->hBlockData[n] != NULL )
582 : {
583 324 : if ( hMCT->hBlockData[n]->hStereoMdct != NULL )
584 : {
585 324 : free( hMCT->hBlockData[n]->hStereoMdct );
586 324 : hMCT->hBlockData[n]->hStereoMdct = NULL;
587 : }
588 :
589 324 : free( hMCT->hBlockData[n] );
590 324 : hMCT->hBlockData[n] = NULL;
591 : }
592 : }
593 :
594 : /*-----------------------------------------------------------------*
595 : * Initializations
596 : *-----------------------------------------------------------------*/
597 :
598 4779 : if ( b_nchan_change )
599 : {
600 522 : hMCT->currBlockDataCnt = 0;
601 :
602 : /*Initialize bits required to signal channel-pair index*/
603 522 : 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 522 : set_s( hMCT->chBitRatios, 0, MCT_MAX_CHANNELS );
606 522 : set_s( hMCT->lowE_ch, 0, MCT_MAX_CHANNELS );
607 : }
608 :
609 4779 : return IVAS_ERR_OK;
610 : }
611 :
612 :
613 : /*-------------------------------------------------------------------------
614 : * create_mct_dec_close()
615 : *
616 : * Close IVAS decoder MCT handle
617 : *-------------------------------------------------------------------------*/
618 :
619 91928 : void ivas_mct_dec_close(
620 : MCT_DEC_HANDLE *hMCT /* i/o: MCT decoder structure */
621 : )
622 : {
623 : int16_t n, maxBlocks;
624 :
625 91928 : if ( hMCT == NULL || *hMCT == NULL )
626 : {
627 63844 : return;
628 : }
629 :
630 28084 : maxBlocks = ( *hMCT )->nchan_out_woLFE / 2;
631 :
632 95775 : for ( n = 0; n < maxBlocks; n++ )
633 : {
634 67691 : if ( ( *hMCT )->hBlockData[n] != NULL )
635 : {
636 67691 : if ( ( *hMCT )->hBlockData[n]->hStereoMdct != NULL )
637 : {
638 67691 : free( ( *hMCT )->hBlockData[n]->hStereoMdct );
639 67691 : ( *hMCT )->hBlockData[n]->hStereoMdct = NULL;
640 : }
641 :
642 67691 : free( ( *hMCT )->hBlockData[n] );
643 67691 : ( *hMCT )->hBlockData[n] = NULL;
644 : }
645 : }
646 :
647 28084 : free( *hMCT );
648 28084 : *hMCT = NULL;
649 :
650 28084 : 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 525929 : 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 525929 : last_mc_mode = st_ivas->mc_mode;
674 :
675 525929 : if ( !st_ivas->bfi )
676 : {
677 : /* set transported MC LS setup */
678 525929 : signaled_config = ivas_mc_map_ls_setup_to_output_config( idx );
679 :
680 525929 : if ( st_ivas->ini_frame == 0 )
681 : {
682 7443 : st_ivas->transport_config = signaled_config;
683 : }
684 518486 : 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 525929 : 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 525929 : if ( st_ivas->ini_frame != 0 )
697 : {
698 518486 : if ( st_ivas->hDecoderConfig->last_ivas_total_brate != st_ivas->hDecoderConfig->ivas_total_brate || last_mc_mode != st_ivas->mc_mode )
699 : {
700 5226 : if ( ( error = ivas_mc_dec_reconfig( st_ivas ) ) != IVAS_ERR_OK )
701 : {
702 0 : return error;
703 : }
704 : }
705 : }
706 :
707 525929 : st_ivas->transport_config = signaled_config;
708 : }
709 :
710 525929 : return IVAS_ERR_OK;
711 : }
712 :
713 :
714 : /*-------------------------------------------------------------------------
715 : * ivas_mc_dec_reconfig()
716 : *
717 : * reconfigure the MC format decoder
718 : *-------------------------------------------------------------------------*/
719 :
720 5226 : 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 5226 : ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate;
738 5226 : nchan_transport_old = st_ivas->nchan_transport;
739 5226 : 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 5226 : mc_mode = st_ivas->mc_mode;
744 5226 : st_ivas->mc_mode = last_mc_mode;
745 5226 : ivas_init_dec_get_num_cldfb_instances( st_ivas, &numCldfbAnalyses_old, &numCldfbSyntheses_old );
746 5226 : st_ivas->mc_mode = mc_mode;
747 :
748 5226 : nSCE_old = st_ivas->nSCE;
749 5226 : nCPE_old = st_ivas->nCPE;
750 5226 : sba_dirac_stereo_flag_old = st_ivas->sba_dirac_stereo_flag;
751 :
752 : /* special handling needed for the hp20 buffers for McMASA */
753 5226 : if ( last_mc_mode == MC_MODE_MCMASA )
754 : {
755 1431 : nchan_hp20_old = getNumChanSynthesis( st_ivas );
756 : }
757 : else
758 : {
759 3795 : nchan_hp20_old = nchan_transport_old;
760 : }
761 5226 : st_ivas->sba_dirac_stereo_flag = ivas_get_sba_dirac_stereo_flag( st_ivas );
762 :
763 : /* renderer might have changed, reselect */
764 5226 : renderer_type_old = st_ivas->renderer_type;
765 5226 : ivas_renderer_select( st_ivas );
766 :
767 : /* side effect of the renderer selection can be a changed internal config */
768 5226 : ivas_output_init( &( st_ivas->hIntSetup ), st_ivas->intern_config );
769 :
770 : /* transfer subframe info from DirAC or ParamMC to central tc buffer */
771 5226 : if ( st_ivas->hTcBuffer->tc_buffer_mode != TC_BUFFER_MODE_BUFFER )
772 : {
773 4608 : if ( last_mc_mode == MC_MODE_PARAMMC )
774 : {
775 1197 : st_ivas->hTcBuffer->nb_subframes = st_ivas->hParamMC->nb_subframes;
776 1197 : st_ivas->hTcBuffer->subframes_rendered = st_ivas->hParamMC->subframes_rendered;
777 1197 : st_ivas->hTcBuffer->num_slots = st_ivas->hParamMC->num_slots;
778 1197 : st_ivas->hTcBuffer->slots_rendered = st_ivas->hParamMC->slots_rendered;
779 1197 : mvs2s( st_ivas->hParamMC->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS );
780 : }
781 3411 : else if ( last_mc_mode == MC_MODE_MCMASA && st_ivas->hSpatParamRendCom != NULL )
782 : {
783 1344 : st_ivas->hTcBuffer->nb_subframes = st_ivas->hSpatParamRendCom->nb_subframes;
784 1344 : st_ivas->hTcBuffer->subframes_rendered = st_ivas->hSpatParamRendCom->subframes_rendered;
785 1344 : st_ivas->hTcBuffer->num_slots = st_ivas->hSpatParamRendCom->num_slots;
786 1344 : st_ivas->hTcBuffer->slots_rendered = st_ivas->hSpatParamRendCom->slots_rendered;
787 1344 : 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 5226 : tc_granularity_new = ivas_jbm_dec_get_render_granularity( st_ivas->renderer_type, RENDERER_DISABLE, st_ivas->hDecoderConfig->output_Fs );
794 :
795 5226 : 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 4434 : else if ( tc_granularity_new > st_ivas->hTcBuffer->n_samples_granularity )
801 : {
802 813 : if ( ( error = ivas_jbm_dec_set_discard_samples( st_ivas ) ) != IVAS_ERR_OK )
803 : {
804 0 : return error;
805 : }
806 : }
807 :
808 5226 : if ( st_ivas->mc_mode == MC_MODE_MCT )
809 : {
810 2619 : 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 2619 : st_ivas->nSCE = 0;
812 2619 : st_ivas->nCPE = st_ivas->nchan_transport / 2;
813 :
814 2619 : if ( last_mc_mode != MC_MODE_MCT )
815 : {
816 : /*De-allocate handles for other MC modes*/
817 1575 : if ( st_ivas->hParamMC != NULL )
818 : {
819 630 : ivas_param_mc_dec_close( &st_ivas->hParamMC );
820 :
821 : /* remove ls conversion if it was allocated by ParamMC */
822 630 : ivas_ls_setup_conversion_close( &st_ivas->hLsSetUpConversion );
823 : }
824 :
825 1575 : if ( last_mc_mode == MC_MODE_PARAMUPMIX )
826 : {
827 9 : ivas_mc_paramupmix_dec_close( &( st_ivas->hMCParamUpmix ) );
828 9 : ivas_ls_setup_conversion_close( &( st_ivas->hLsSetUpConversion ) );
829 : }
830 :
831 : /* De-allocate McMasa-related handles */
832 1575 : ivas_masa_dec_close( &( st_ivas->hMasa ) );
833 1575 : ivas_qmetadata_close( &st_ivas->hQMetaData );
834 :
835 1575 : ivas_dirac_rend_close( &( st_ivas->hDirACRend ) );
836 1575 : ivas_spat_hSpatParamRendCom_close( &( st_ivas->hSpatParamRendCom ) );
837 1575 : ivas_dirac_dec_close( &( st_ivas->hDirAC ) );
838 1575 : vbap_free_data( &( st_ivas->hVBAPdata ) );
839 :
840 : /* init LS conversion if the renderer type asks for it */
841 1575 : if ( st_ivas->renderer_type == RENDERER_MC && st_ivas->hLsSetUpConversion == NULL )
842 : {
843 366 : if ( ( error = ivas_ls_setup_conversion_open( st_ivas ) ) != IVAS_ERR_OK )
844 : {
845 0 : return error;
846 : }
847 : }
848 : }
849 : }
850 2607 : else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX )
851 : {
852 21 : st_ivas->nSCE = 0;
853 21 : st_ivas->nCPE = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS / 2;
854 21 : st_ivas->nchan_transport = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS;
855 :
856 21 : if ( last_mc_mode != MC_MODE_PARAMUPMIX )
857 : {
858 : /*De-allocate handles for other MC modes*/
859 21 : if ( st_ivas->hParamMC != NULL )
860 : {
861 3 : ivas_param_mc_dec_close( &st_ivas->hParamMC );
862 :
863 : /* remove ls conversion if it was allocated by ParamMC */
864 3 : ivas_ls_setup_conversion_close( &st_ivas->hLsSetUpConversion );
865 : }
866 :
867 21 : ivas_masa_dec_close( &( st_ivas->hMasa ) );
868 21 : ivas_qmetadata_close( &st_ivas->hQMetaData );
869 :
870 : /* init LS conversion if the renderer type asks for it */
871 21 : if ( ( st_ivas->renderer_type == RENDERER_MC ) && st_ivas->hLsSetUpConversion == NULL )
872 : {
873 3 : if ( ( error = ivas_ls_setup_conversion_open( st_ivas ) ) != IVAS_ERR_OK )
874 : {
875 0 : return error;
876 : }
877 : }
878 :
879 21 : 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 2586 : else if ( st_ivas->mc_mode == MC_MODE_PARAMMC )
892 : {
893 1206 : 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 969 : if ( renderer_type_old == RENDERER_MC && st_ivas->hLsSetUpConversion != NULL )
897 : {
898 111 : ivas_ls_setup_conversion_close( &st_ivas->hLsSetUpConversion );
899 : }
900 :
901 969 : if ( ( error = ivas_param_mc_dec_open( st_ivas ) ) != IVAS_ERR_OK )
902 : {
903 0 : return error;
904 : }
905 : }
906 : else
907 : {
908 237 : 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 1206 : ivas_masa_dec_close( &( st_ivas->hMasa ) );
916 1206 : ivas_qmetadata_close( &st_ivas->hQMetaData );
917 :
918 1206 : ivas_dirac_rend_close( &( st_ivas->hDirACRend ) );
919 1206 : ivas_spat_hSpatParamRendCom_close( &( st_ivas->hSpatParamRendCom ) );
920 1206 : ivas_dirac_dec_close( &( st_ivas->hDirAC ) );
921 :
922 1206 : vbap_free_data( &( st_ivas->hVBAPdata ) );
923 :
924 1206 : if ( last_mc_mode == MC_MODE_MCT )
925 : {
926 636 : if ( st_ivas->hMCT != NULL && st_ivas->nchan_transport <= CPE_CHANNELS )
927 : {
928 621 : ivas_mct_dec_close( &st_ivas->hMCT );
929 : }
930 : }
931 570 : else if ( last_mc_mode == MC_MODE_PARAMUPMIX )
932 : {
933 0 : ivas_mc_paramupmix_dec_close( &( st_ivas->hMCParamUpmix ) );
934 : }
935 :
936 : /* LFE handle */
937 1206 : ivas_lfe_dec_close( &( st_ivas->hLFE ) );
938 : }
939 1380 : else if ( st_ivas->mc_mode == MC_MODE_MCMASA )
940 : {
941 1380 : ivas_mcmasa_setNumTransportChannels( &( st_ivas->nchan_transport ), &( st_ivas->element_mode_init ), ivas_total_brate );
942 :
943 1380 : if ( last_mc_mode != MC_MODE_MCMASA )
944 : {
945 1236 : if ( ( error = ivas_qmetadata_open( &( st_ivas->hQMetaData ) ) ) != IVAS_ERR_OK )
946 : {
947 0 : return error;
948 : }
949 : }
950 :
951 1380 : if ( ( error = ivas_mcmasa_dec_reconfig( st_ivas ) ) != IVAS_ERR_OK )
952 : {
953 0 : return error;
954 : }
955 :
956 : /* LS conversion */
957 1380 : if ( st_ivas->hLsSetUpConversion != NULL )
958 : {
959 303 : ivas_ls_setup_conversion_close( &st_ivas->hLsSetUpConversion );
960 : }
961 :
962 1380 : ivas_mc_paramupmix_dec_close( &( st_ivas->hMCParamUpmix ) );
963 :
964 1380 : if ( st_ivas->hParamMC != NULL )
965 : {
966 333 : ivas_param_mc_dec_close( &st_ivas->hParamMC );
967 333 : st_ivas->hParamMC = NULL;
968 : }
969 :
970 1380 : if ( last_mc_mode == MC_MODE_MCT )
971 : {
972 903 : ivas_mct_dec_close( &st_ivas->hMCT );
973 : }
974 :
975 : /* LFE handle */
976 1380 : ivas_lfe_dec_close( &( st_ivas->hLFE ) );
977 : }
978 :
979 5226 : if ( st_ivas->mc_mode != MC_MODE_MCMASA )
980 : {
981 3846 : if ( st_ivas->nchan_transport == 1 )
982 : {
983 0 : st_ivas->element_mode_init = IVAS_SCE;
984 : }
985 : else
986 : {
987 3846 : 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 5226 : if ( last_mc_mode == MC_MODE_MCT && st_ivas->mc_mode == MC_MODE_PARAMMC && st_ivas->nchan_transport > CPE_CHANNELS )
999 : {
1000 15 : st = st_ivas->hCPE[1]->hCoreCoder[1];
1001 :
1002 15 : if ( st_ivas->nchan_transport == 3 )
1003 : {
1004 15 : 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 15 : 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 15 : 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 15 : 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 15 : st->hTcxCfg->fIsTNSAllowed = getTnsAllowed( ivas_total_brate, st->igf, st->element_mode );
1043 : }
1044 5226 : if ( st_ivas->mc_mode == MC_MODE_MCMASA )
1045 : {
1046 : uint8_t separateChannelEnabled;
1047 : int16_t separateChannelIndex;
1048 1380 : ivas_mcmasa_set_separate_channel_mode( &separateChannelEnabled, &separateChannelIndex, ivas_total_brate );
1049 1380 : ivas_mcmasa_split_brate( separateChannelEnabled, ivas_total_brate, st_ivas->nSCE, st_ivas->nCPE, &new_brate_SCE, &new_brate_CPE );
1050 : }
1051 3846 : else if ( st_ivas->mc_mode == MC_MODE_MCT )
1052 : {
1053 2619 : new_brate_SCE = 0;
1054 2619 : new_brate_CPE = ( ivas_total_brate / ( st_ivas->nchan_transport - 1 ) ) * CPE_CHANNELS;
1055 : }
1056 1227 : else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX )
1057 : {
1058 21 : new_brate_SCE = 0;
1059 21 : new_brate_CPE = ( ivas_total_brate / ( st_ivas->nchan_transport - 1 ) ) * CPE_CHANNELS;
1060 : }
1061 : else
1062 : {
1063 1206 : new_brate_SCE = 0; /* ivas_total_brate / st_ivas->nchan_transport;*/
1064 1206 : new_brate_CPE = ( ivas_total_brate / st_ivas->nchan_transport ) * CPE_CHANNELS;
1065 : }
1066 :
1067 5226 : 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 5226 : if ( last_mc_mode == MC_MODE_MCT && st_ivas->mc_mode == MC_MODE_PARAMMC && st_ivas->nchan_transport > CPE_CHANNELS )
1073 : {
1074 15 : st = st_ivas->hCPE[1]->hCoreCoder[1];
1075 :
1076 : /* TCX-LTP */
1077 15 : 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 5226 : 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 5226 : if ( st_ivas->mc_mode == MC_MODE_MCMASA )
1101 : {
1102 1380 : if ( ( st_ivas->renderer_type != RENDERER_DISABLE ) && ( st_ivas->renderer_type != RENDERER_MCMASA_MONO_STEREO ) )
1103 : {
1104 1296 : if ( st_ivas->hDirAC != NULL )
1105 : {
1106 : /* reconfigure existing DirAC dec */
1107 1296 : 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 84 : else if ( st_ivas->renderer_type == RENDERER_DISABLE )
1122 : {
1123 69 : ivas_dirac_rend_close( &( st_ivas->hDirACRend ) );
1124 69 : ivas_spat_hSpatParamRendCom_close( &( st_ivas->hSpatParamRendCom ) );
1125 69 : ivas_dirac_dec_close( &( st_ivas->hDirAC ) );
1126 :
1127 69 : vbap_free_data( &( st_ivas->hVBAPdata ) );
1128 : }
1129 : }
1130 :
1131 5226 : if ( renderer_type_old != st_ivas->renderer_type )
1132 : {
1133 : AUDIO_CONFIG output_config;
1134 :
1135 3114 : output_config = st_ivas->hDecoderConfig->output_config;
1136 :
1137 : /* binaural renderers*/
1138 3114 : 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 2007 : if ( st_ivas->hBinRenderer != NULL && ( st_ivas->renderer_type != RENDERER_BINAURAL_FASTCONV && st_ivas->renderer_type != RENDERER_BINAURAL_FASTCONV_ROOM ) )
1142 : {
1143 591 : ivas_binRenderer_close( &st_ivas->hBinRenderer );
1144 :
1145 591 : if ( ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) )
1146 : {
1147 21 : efap_free_data( &st_ivas->hEFAPdata );
1148 : }
1149 : }
1150 :
1151 2007 : 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 ) ) )
1152 : {
1153 774 : ivas_rend_closeCrend( &( st_ivas->hCrendWrapper ) );
1154 : }
1155 :
1156 2007 : if ( st_ivas->hBinRendererTd != NULL && ( st_ivas->renderer_type != RENDERER_BINAURAL_OBJECTS_TD ) )
1157 : {
1158 18 : ivas_td_binaural_close( &st_ivas->hBinRendererTd );
1159 : }
1160 :
1161 2007 : if ( st_ivas->hDiracDecBin[0] != NULL )
1162 : {
1163 1221 : if ( st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC_ROOM && st_ivas->renderer_type != RENDERER_STEREO_PARAMETRIC )
1164 : {
1165 624 : ivas_dirac_dec_close_binaural_data( st_ivas->hDiracDecBin );
1166 : }
1167 : }
1168 :
1169 : /* init necessary new renderers */
1170 2007 : if ( st_ivas->hBinRenderer == NULL && ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) )
1171 : {
1172 597 : if ( ( error = ivas_binRenderer_open( st_ivas ) ) != IVAS_ERR_OK )
1173 : {
1174 0 : return error;
1175 : }
1176 : }
1177 1410 : else if ( st_ivas->hBinRendererTd == NULL && st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD )
1178 : {
1179 24 : if ( ( error = ivas_td_binaural_open( st_ivas ) ) != IVAS_ERR_OK )
1180 : {
1181 0 : return error;
1182 : }
1183 :
1184 24 : if ( st_ivas->hOutSetup.output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB )
1185 : {
1186 12 : if ( ( error = ivas_reverb_open( &st_ivas->hReverb, st_ivas->hHrtfStatistics, st_ivas->hRenderConfig, st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK )
1187 : {
1188 0 : return error;
1189 : }
1190 : }
1191 :
1192 24 : if ( st_ivas->hIntSetup.output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB )
1193 : {
1194 0 : if ( ( error = ivas_rend_initCrendWrapper( &st_ivas->hCrendWrapper, 1 ) ) != IVAS_ERR_OK )
1195 : {
1196 0 : return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend Wrapper\n" );
1197 : }
1198 :
1199 0 : st_ivas->hCrendWrapper->hCrend[0] = NULL;
1200 0 : st_ivas->hCrendWrapper->hHrtfCrend = NULL;
1201 0 : if ( ( st_ivas->hCrendWrapper->hCrend[0] = (CREND_HANDLE) malloc( sizeof( CREND_DATA ) ) ) == NULL )
1202 : {
1203 0 : return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend\n" );
1204 : }
1205 : }
1206 : }
1207 1386 : else if ( st_ivas->hCrendWrapper == NULL && ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) )
1208 : {
1209 789 : 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 )
1210 : {
1211 0 : return error;
1212 : }
1213 789 : st_ivas->binaural_latency_ns = st_ivas->hCrendWrapper->binaural_latency_ns;
1214 : }
1215 : }
1216 : /* mono/stereo */
1217 : else if ( output_config == IVAS_AUDIO_CONFIG_MONO || output_config == IVAS_AUDIO_CONFIG_STEREO )
1218 : {
1219 : /* nothing should happen here... */
1220 : }
1221 : /* LS */
1222 : 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 )
1223 : {
1224 : #ifdef DEBUGGING
1225 : 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 );
1226 : #endif
1227 : }
1228 : #ifdef DEBUGGING
1229 : else if ( output_config == IVAS_AUDIO_CONFIG_FOA || output_config == IVAS_AUDIO_CONFIG_HOA2 || output_config == IVAS_AUDIO_CONFIG_HOA3 )
1230 : {
1231 : /* FOA/HOA output */
1232 : /* Nothing to do, renderer is always RENDERER_SBA_LINEAR_ENC */
1233 : assert( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC && renderer_type_old == RENDERER_SBA_LINEAR_ENC );
1234 : }
1235 : #endif
1236 : }
1237 :
1238 : /*-----------------------------------------------------------------*
1239 : * CLDFB instances
1240 : *-----------------------------------------------------------------*/
1241 :
1242 5226 : if ( ( error = ivas_cldfb_dec_reconfig( st_ivas, nchan_transport_old, numCldfbAnalyses_old, numCldfbSyntheses_old ) ) != IVAS_ERR_OK )
1243 : {
1244 0 : return error;
1245 : }
1246 :
1247 :
1248 : /*-----------------------------------------------------------------*
1249 : * Allocate the LFE handle that is coded separately after the allocation of the core coders
1250 : *-----------------------------------------------------------------*/
1251 :
1252 5226 : if ( ( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) )
1253 : {
1254 : int32_t delay_ns;
1255 2640 : if ( st_ivas->hIntSetup.index_lfe[0] != -1 )
1256 : {
1257 2622 : delay_ns = st_ivas->binaural_latency_ns;
1258 : }
1259 : else
1260 : {
1261 18 : delay_ns = 0;
1262 : }
1263 :
1264 2640 : if ( st_ivas->hBinRenderer != NULL )
1265 : {
1266 6 : if ( st_ivas->hBinRenderer->render_lfe )
1267 : {
1268 : /* Account for filterbank delay */
1269 6 : delay_ns += IVAS_FB_DEC_DELAY_NS;
1270 : }
1271 : else
1272 : {
1273 0 : delay_ns = 0;
1274 : }
1275 : }
1276 : else
1277 : {
1278 2634 : if ( ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) && ( st_ivas->cldfbSynDec[0] != NULL ) )
1279 : {
1280 12 : delay_ns += IVAS_FB_DEC_DELAY_NS;
1281 : }
1282 : }
1283 :
1284 2640 : if ( st_ivas->hLFE != NULL )
1285 : {
1286 1053 : if ( st_ivas->hLFE->delay_ns != delay_ns )
1287 : {
1288 9 : ivas_lfe_dec_close( &( st_ivas->hLFE ) );
1289 : }
1290 : }
1291 :
1292 2640 : if ( st_ivas->hLFE == NULL )
1293 : {
1294 1596 : if ( ( error = ivas_create_lfe_dec( &st_ivas->hLFE, st_ivas->hDecoderConfig->output_Fs, delay_ns ) ) != IVAS_ERR_OK )
1295 : {
1296 0 : return error;
1297 : }
1298 :
1299 1596 : set_zero( st_ivas->hLFE->prevsynth_buf, LFE_PLC_BUFLEN );
1300 1596 : set_zero( st_ivas->hLFE->prior_out_buffer, L_FRAME48k );
1301 : }
1302 : }
1303 :
1304 : /*-----------------------------------------------------------------*
1305 : * JBM TC buffers
1306 : *-----------------------------------------------------------------*/
1307 : {
1308 : int16_t tc_nchan_full_new;
1309 : DECODER_TC_BUFFER_HANDLE hTcBuffer;
1310 :
1311 5226 : hTcBuffer = st_ivas->hTcBuffer;
1312 5226 : tc_buffer_mode_new = ivas_jbm_dec_get_tc_buffer_mode( st_ivas );
1313 5226 : tc_nchan_tc_new = ivas_jbm_dec_get_num_tc_channels( st_ivas );
1314 5226 : tc_nchan_allocate_new = tc_nchan_tc_new;
1315 5226 : tc_nchan_full_new = tc_nchan_tc_new;
1316 :
1317 5226 : if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC )
1318 : {
1319 654 : tc_nchan_allocate_new = BINAURAL_CHANNELS;
1320 654 : if ( st_ivas->hDiracDecBin[0] != NULL && st_ivas->hDiracDecBin[0]->useTdDecorr )
1321 : {
1322 609 : tc_nchan_allocate_new = 2 * BINAURAL_CHANNELS;
1323 : }
1324 45 : else if ( st_ivas->hOutSetup.separateChannelEnabled )
1325 : {
1326 24 : tc_nchan_allocate_new++;
1327 : }
1328 :
1329 654 : tc_nchan_full_new = tc_nchan_allocate_new;
1330 : }
1331 :
1332 5226 : 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 )
1333 : {
1334 1200 : tc_nchan_full_new = 0;
1335 : }
1336 4026 : else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX )
1337 : {
1338 21 : tc_nchan_allocate_new = MC_PARAMUPMIX_MAX_INPUT_CHANS;
1339 21 : tc_buffer_mode_new = TC_BUFFER_MODE_RENDERER;
1340 21 : if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_STEREO || st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_MONO )
1341 : {
1342 3 : tc_buffer_mode_new = TC_BUFFER_MODE_BUFFER;
1343 3 : tc_nchan_tc_new = st_ivas->hDecoderConfig->nchan_out;
1344 3 : tc_nchan_allocate_new = tc_nchan_tc_new;
1345 : }
1346 21 : tc_nchan_full_new = tc_nchan_allocate_new;
1347 : }
1348 :
1349 : /* reconfigure buffer */
1350 5226 : if ( hTcBuffer->tc_buffer_mode != tc_buffer_mode_new || hTcBuffer->nchan_transport_jbm != tc_nchan_tc_new ||
1351 1476 : hTcBuffer->nchan_buffer_full != tc_nchan_full_new || hTcBuffer->nchan_transport_internal != tc_nchan_allocate_new ||
1352 1458 : tc_granularity_new != hTcBuffer->n_samples_granularity )
1353 : {
1354 3768 : 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 )
1355 : {
1356 0 : return error;
1357 : }
1358 : }
1359 :
1360 : /* transfer subframe info from central tc buffer to ParamMC or McMASA (DirAC) */
1361 5226 : if ( st_ivas->hSpatParamRendCom != NULL )
1362 : {
1363 1314 : st_ivas->hSpatParamRendCom->nb_subframes = st_ivas->hTcBuffer->nb_subframes;
1364 1314 : st_ivas->hSpatParamRendCom->subframes_rendered = st_ivas->hTcBuffer->subframes_rendered;
1365 1314 : st_ivas->hSpatParamRendCom->num_slots = st_ivas->hTcBuffer->num_slots;
1366 1314 : st_ivas->hSpatParamRendCom->slots_rendered = st_ivas->hTcBuffer->slots_rendered;
1367 1314 : mvs2s( st_ivas->hTcBuffer->subframe_nbslots, st_ivas->hSpatParamRendCom->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS );
1368 : }
1369 3912 : else if ( st_ivas->hParamMC != NULL )
1370 : {
1371 1206 : st_ivas->hParamMC->nb_subframes = st_ivas->hTcBuffer->nb_subframes;
1372 1206 : st_ivas->hParamMC->subframes_rendered = st_ivas->hTcBuffer->subframes_rendered;
1373 1206 : st_ivas->hParamMC->num_slots = st_ivas->hTcBuffer->num_slots;
1374 1206 : st_ivas->hParamMC->slots_rendered = st_ivas->hTcBuffer->slots_rendered;
1375 1206 : mvs2s( st_ivas->hTcBuffer->subframe_nbslots, st_ivas->hParamMC->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS );
1376 : }
1377 : }
1378 :
1379 : /*-----------------------------------------------------------------*
1380 : * floating-point output audio buffers
1381 : *-----------------------------------------------------------------*/
1382 :
1383 5226 : nchan_out_buff = ivas_get_nchan_buffers_dec( st_ivas, -1, -1 );
1384 5226 : 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 )
1385 : {
1386 0 : return error;
1387 : }
1388 :
1389 5226 : return IVAS_ERR_OK;
1390 : }
|