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