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 <stdint.h>
34 : #include "options.h"
35 : #include "cnst.h"
36 : #include "ivas_cnst.h"
37 : #include "rom_com.h"
38 : #include "prot.h"
39 : #include "ivas_prot.h"
40 : #include "ivas_prot_rend.h"
41 : #include "ivas_rom_com.h"
42 : #include <math.h>
43 : #ifdef DEBUGGING
44 : #include "debug.h"
45 : #endif
46 : #include "wmc_auto.h"
47 :
48 :
49 : /*-----------------------------------------------------------------------*
50 : * Local function prototypes
51 : *-----------------------------------------------------------------------*/
52 :
53 : static void ivas_jbm_dec_tc_buffer_playout( Decoder_Struct *st_ivas, const uint16_t nSamplesAsked, uint16_t *nSamplesRendered, float *output[] );
54 :
55 : static void ivas_jbm_dec_copy_masa_meta_to_buffer( Decoder_Struct *st_ivas );
56 :
57 : static void ivas_jbm_masa_sf_to_slot_map( Decoder_Struct *st_ivas, const int16_t nCldfbTs );
58 :
59 :
60 : /*--------------------------------------------------------------------------*
61 : * ivas_jbm_dec_tc()
62 : *
63 : * Principal IVAS JBM decoder routine, decoding of metadata and transport channels
64 : *--------------------------------------------------------------------------*/
65 :
66 5936793 : ivas_error ivas_jbm_dec_tc(
67 : Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */
68 : )
69 : {
70 : int16_t n, output_frame, nchan_out;
71 : Decoder_State *st; /* used for bitstream handling */
72 : float *p_output[MAX_TRANSPORT_CHANNELS]; /* 'float' buffer for output synthesis */
73 : int16_t nchan_remapped;
74 : int16_t nb_bits_metadata[MAX_SCE + 1];
75 : int32_t output_Fs, ivas_total_brate;
76 : AUDIO_CONFIG output_config;
77 : ivas_error error;
78 : int16_t num_md_sub_frames;
79 : int32_t ism_total_brate;
80 :
81 5936793 : push_wmops( "ivas_jbm_dec_tc" );
82 :
83 : /*----------------------------------------------------------------*
84 : * Initialization of local vars after struct has been set
85 : *----------------------------------------------------------------*/
86 :
87 5936793 : output_Fs = st_ivas->hDecoderConfig->output_Fs;
88 5936793 : nchan_out = st_ivas->hTcBuffer->nchan_transport_jbm;
89 5936793 : output_config = st_ivas->hDecoderConfig->output_config;
90 5936793 : ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate;
91 :
92 5936793 : output_frame = (int16_t) ( output_Fs / FRAMES_PER_SEC );
93 :
94 : /* set pointers to transport channels audio */
95 77178309 : for ( n = 0; n < MAX_TRANSPORT_CHANNELS; n++ )
96 : {
97 71241516 : p_output[n] = st_ivas->p_output_f[n];
98 71241516 : if ( p_output[n] != NULL )
99 : {
100 39966129 : set_zero( p_output[n], L_FRAME48k );
101 : }
102 : }
103 :
104 : /*----------------------------------------------------------------*
105 : * Decoding + pre-rendering
106 : *----------------------------------------------------------------*/
107 :
108 5936793 : if ( st_ivas->bfi && st_ivas->ini_frame == 0 )
109 : {
110 : /* zero output when first frame(s) is lost */
111 0 : for ( n = 0; n < nchan_out; n++ )
112 : {
113 0 : set_f( p_output[n], 0.0f, output_frame );
114 : }
115 :
116 : #ifdef DEBUG_MODE_INFO
117 : create_sce_dec( st_ivas, 0, ivas_total_brate );
118 : output_debug_mode_info_dec( st_ivas->hSCE[0]->hCoreCoder, 1, output_frame, NULL );
119 : destroy_sce_dec( st_ivas->hSCE[0] );
120 : st_ivas->hSCE[0] = NULL;
121 : #endif
122 : }
123 5936793 : else if ( st_ivas->ivas_format == STEREO_FORMAT )
124 : {
125 307452 : st_ivas->hCPE[0]->element_brate = ivas_total_brate;
126 307452 : if ( ( error = ivas_cpe_dec( st_ivas, 0, p_output, output_frame, 0 ) ) != IVAS_ERR_OK )
127 : {
128 0 : return error;
129 : }
130 :
131 : /* HP filtering */
132 838173 : for ( n = 0; n < min( nchan_out, st_ivas->nchan_transport ); n++ )
133 : {
134 530721 : hp20( p_output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs );
135 : }
136 : }
137 5629341 : else if ( st_ivas->ivas_format == ISM_FORMAT )
138 : {
139 : /* Metadata decoding and configuration */
140 1163743 : if ( ivas_total_brate == IVAS_SID_5k2 || ivas_total_brate == FRAME_NO_DATA )
141 : {
142 7353 : ivas_ism_dtx_dec( st_ivas, nb_bits_metadata );
143 :
144 : /* decode dominant object first so the noise energy of the other objects can be limited */
145 7353 : if ( ( error = ivas_sce_dec( st_ivas, st_ivas->hISMDTX.sce_id_dtx, &p_output[st_ivas->hISMDTX.sce_id_dtx], output_frame, nb_bits_metadata[st_ivas->hISMDTX.sce_id_dtx] ) ) != IVAS_ERR_OK )
146 : {
147 0 : return error;
148 : }
149 :
150 7353 : ivas_ism_dtx_limit_noise_energy_for_near_silence( st_ivas->hSCE, st_ivas->hISMDTX.sce_id_dtx, st_ivas->nchan_transport );
151 :
152 7353 : ivas_param_ism_dec_dequant_md( st_ivas );
153 : }
154 1156390 : else if ( st_ivas->ism_mode == ISM_MODE_PARAM )
155 : {
156 148488 : if ( ( error = ivas_ism_metadata_dec( ivas_total_brate, st_ivas->nchan_ism, &( st_ivas->nchan_transport ), st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->bfi, nb_bits_metadata, st_ivas->ism_mode, st_ivas->hISMDTX, st_ivas->hParamIsmDec->hParamIsm, &st_ivas->ism_extmeta_active, &st_ivas->ism_extmeta_cnt, st_ivas->hSCE[0]->hCoreCoder[0] ) ) != IVAS_ERR_OK )
157 : {
158 0 : return error;
159 : }
160 :
161 148488 : ivas_param_ism_dec_dequant_md( st_ivas );
162 : }
163 : else /* ISM_MODE_DISC */
164 : {
165 1007902 : if ( ( error = ivas_ism_metadata_dec( ivas_total_brate, st_ivas->nchan_ism, &( st_ivas->nchan_transport ), st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->bfi, nb_bits_metadata, st_ivas->ism_mode, st_ivas->hISMDTX, NULL, &st_ivas->ism_extmeta_active, &st_ivas->ism_extmeta_cnt, st_ivas->hSCE[0]->hCoreCoder[0] ) ) != IVAS_ERR_OK )
166 : {
167 0 : return error;
168 : }
169 : }
170 :
171 4125602 : for ( n = 0; n < st_ivas->nchan_transport; n++ )
172 : {
173 : /* for DTX frames, dominant object has already been decoded before */
174 2961859 : if ( !( ( ivas_total_brate == IVAS_SID_5k2 || ivas_total_brate == FRAME_NO_DATA ) && n == st_ivas->hISMDTX.sce_id_dtx ) )
175 : {
176 2954506 : if ( ( error = ivas_sce_dec( st_ivas, n, &p_output[n], output_frame, nb_bits_metadata[n] ) ) != IVAS_ERR_OK )
177 : {
178 0 : return error;
179 : }
180 : }
181 :
182 : /* HP filtering */
183 2961859 : hp20( p_output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs );
184 : }
185 :
186 1163743 : if ( st_ivas->renderer_type == RENDERER_MONO_DOWNMIX )
187 : {
188 68605 : ivas_ism_mono_dmx( st_ivas, p_output, output_frame );
189 : }
190 1095138 : else if ( st_ivas->ism_mode == ISM_MODE_PARAM && ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) )
191 : {
192 : /* loudness correction */
193 57383 : ivas_dirac_dec_binaural_sba_gain( p_output, st_ivas->nchan_transport, output_frame );
194 : }
195 : }
196 4465598 : else if ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == MASA_FORMAT )
197 : {
198 1647751 : set_s( nb_bits_metadata, 0, MAX_SCE );
199 :
200 :
201 : /* read parameters from the bitstream */
202 1647751 : if ( st_ivas->ivas_format == MASA_FORMAT && st_ivas->hQMetaData != NULL )
203 : {
204 639404 : st = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0] : st_ivas->hCPE[0]->hCoreCoder[0];
205 :
206 639404 : if ( ( error = ivas_masa_decode( st_ivas, st, &nb_bits_metadata[0] ) ) != IVAS_ERR_OK )
207 : {
208 0 : return error;
209 : }
210 : }
211 1008347 : else if ( st_ivas->ivas_format == SBA_FORMAT )
212 : {
213 1008347 : if ( ( error = ivas_spar_dec( st_ivas, nb_bits_metadata ) ) != IVAS_ERR_OK )
214 : {
215 0 : return error;
216 : }
217 : }
218 :
219 1647751 : if ( st_ivas->nchan_transport == CPE_CHANNELS && st_ivas->nCPE >= 1 )
220 : {
221 715207 : st_ivas->hCPE[0]->brate_surplus = 0;
222 715207 : st_ivas->hCPE[0]->element_brate = ivas_total_brate;
223 : }
224 :
225 : /* core-decoding of transport channels */
226 1647751 : if ( st_ivas->nSCE == 1 )
227 : {
228 515307 : if ( ( error = ivas_sce_dec( st_ivas, 0, p_output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK )
229 : {
230 0 : return error;
231 : }
232 : }
233 1132444 : else if ( st_ivas->nCPE == 1 )
234 : {
235 715207 : if ( ( error = ivas_cpe_dec( st_ivas, 0, p_output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK )
236 : {
237 0 : return error;
238 : }
239 : }
240 417237 : else if ( st_ivas->nCPE > 1 )
241 : {
242 417237 : if ( ( error = ivas_mct_dec( st_ivas, p_output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK )
243 : {
244 0 : return error;
245 : }
246 : }
247 :
248 : #ifdef DEBUG_SBA_AUDIO_DUMP
249 : /* Dump audio signal after core-decoding */
250 : ivas_spar_dump_signal_wav( output_frame, NULL, output, st_ivas->nchan_transport, spar_foa_dec_wav[0], "core-decoding" );
251 : #endif
252 : /* TCs remapping */
253 1647751 : nchan_remapped = st_ivas->nchan_transport;
254 1647751 : if ( st_ivas->sba_dirac_stereo_flag )
255 : {
256 68006 : nchan_remapped = nchan_out;
257 :
258 68006 : if ( st_ivas->ivas_format == SBA_FORMAT )
259 : {
260 68006 : ivas_agc_dec_process( st_ivas->hSpar->hAgcDec, p_output, p_output, st_ivas->hSpar->hMdDec->spar_md_cfg.nchan_transport, output_frame );
261 :
262 68006 : if ( st_ivas->hSpar->hPCA != NULL )
263 : {
264 594 : ivas_pca_dec( st_ivas->hSpar->hPCA, output_frame, st_ivas->hSpar->hMdDec->spar_md_cfg.nchan_transport, ivas_total_brate, st_ivas->hDecoderConfig->last_ivas_total_brate, st_ivas->bfi, p_output );
265 : }
266 :
267 68006 : ivas_spar_dec_gen_umx_mat( st_ivas->hSpar->hMdDec, st_ivas->nchan_transport, IVAS_MAX_NUM_BANDS, st_ivas->bfi, ivas_get_spar_dec_md_num_subframes( st_ivas->sba_order, ivas_total_brate, st_ivas->last_active_ivas_total_brate ) );
268 : }
269 :
270 68006 : ivas_sba_dirac_stereo_dec( st_ivas, p_output, output_frame, st_ivas->ivas_format == MC_FORMAT );
271 : }
272 1579745 : else if ( st_ivas->ivas_format == MASA_FORMAT && ivas_total_brate < MASA_STEREO_MIN_BITRATE && ( ivas_total_brate > IVAS_SID_5k2 || ( ivas_total_brate <= IVAS_SID_5k2 && st_ivas->nCPE > 0 && st_ivas->hCPE[0]->nchan_out == 1 ) ) )
273 : {
274 182175 : nchan_remapped = 1; /* Only one channel transported */
275 : }
276 :
277 : /* HP filtering */
278 : #ifndef DEBUG_SPAR_BYPASS_EVS_CODEC
279 4902081 : for ( n = 0; n < nchan_remapped; n++ )
280 : {
281 3254330 : hp20( p_output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs );
282 : }
283 : #endif
284 :
285 1647751 : if ( st_ivas->ivas_format == SBA_FORMAT )
286 : {
287 1008347 : nchan_remapped = ivas_sba_remapTCs( p_output, st_ivas, output_frame );
288 :
289 1008347 : if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM )
290 : {
291 212716 : num_md_sub_frames = ivas_get_spar_dec_md_num_subframes( st_ivas->sba_analysis_order, ivas_total_brate, st_ivas->last_active_ivas_total_brate );
292 212716 : ivas_sba_mix_matrix_determiner( st_ivas->hSpar, p_output, st_ivas->bfi, nchan_remapped, output_frame, num_md_sub_frames );
293 : }
294 795631 : else if ( st_ivas->renderer_type != RENDERER_DISABLE )
295 : {
296 698444 : ivas_spar_dec_agc_pca( st_ivas, p_output, output_frame );
297 : }
298 : }
299 :
300 1647751 : if ( st_ivas->ivas_format == MASA_FORMAT )
301 : {
302 639404 : ivas_masa_prerender( st_ivas, p_output, output_frame, nchan_remapped );
303 :
304 : /* external output */
305 639404 : if ( output_config == IVAS_AUDIO_CONFIG_EXTERNAL && st_ivas->hMasa->config.input_ivas_format == MASA_ISM_FORMAT )
306 : {
307 30702 : for ( n = 0; n < st_ivas->nchan_ism; n++ )
308 : {
309 22506 : set_zero( p_output[st_ivas->nchan_transport + n], output_frame );
310 : }
311 :
312 8196 : ivas_omasa_rearrange_channels( p_output, st_ivas->nchan_ism, output_frame );
313 : }
314 : }
315 1008347 : else if ( st_ivas->ivas_format == SBA_FORMAT && ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) )
316 : {
317 : /* loudness correction */
318 212716 : ivas_dirac_dec_binaural_sba_gain( p_output, nchan_remapped, output_frame );
319 : }
320 : }
321 2817847 : else if ( st_ivas->ivas_format == MASA_ISM_FORMAT )
322 : {
323 : int16_t nchan_ism, nchan_transport_ism;
324 : int16_t dirac_bs_md_write_idx;
325 :
326 539381 : set_s( nb_bits_metadata, 0, MAX_SCE + 1 );
327 :
328 : /* Set the number of objects for the parametric rendering */
329 539381 : dirac_bs_md_write_idx = 0;
330 539381 : if ( st_ivas->hSpatParamRendCom != NULL )
331 : {
332 467264 : st_ivas->hSpatParamRendCom->numIsmDirections = 0;
333 467264 : if ( st_ivas->ism_mode != ISM_MASA_MODE_DISC && st_ivas->ism_mode != ISM_MASA_MODE_MASA_ONE_OBJ )
334 : {
335 79671 : st_ivas->hSpatParamRendCom->numIsmDirections = st_ivas->nchan_ism;
336 : }
337 :
338 467264 : dirac_bs_md_write_idx = st_ivas->hSpatParamRendCom->dirac_bs_md_write_idx; /* Store the write-index for this frame */
339 : }
340 :
341 : /* MASA metadata decoding */
342 539381 : if ( ( error = ivas_masa_decode( st_ivas, st_ivas->hCPE[0]->hCoreCoder[0], &nb_bits_metadata[0] ) ) != IVAS_ERR_OK )
343 : {
344 0 : return error;
345 : }
346 :
347 : /* Configuration of combined-format bit-budget distribution */
348 539381 : ivas_set_surplus_brate_dec( st_ivas, &ism_total_brate );
349 :
350 539381 : st_ivas->hCPE[0]->hCoreCoder[0]->bit_stream = &( st_ivas->bit_stream[( ism_total_brate / FRAMES_PER_SEC )] );
351 :
352 : /* set ISM parameters and decode ISM metadata in OMASA format */
353 539381 : if ( ( error = ivas_omasa_ism_metadata_dec( st_ivas, ism_total_brate, &nchan_ism, &nchan_transport_ism, dirac_bs_md_write_idx, &nb_bits_metadata[1] ) ) != IVAS_ERR_OK )
354 : {
355 0 : return error;
356 : }
357 :
358 : /* decode ISM channels */
359 1543699 : for ( n = 0; n < nchan_transport_ism; n++ )
360 : {
361 1004318 : if ( ( error = ivas_sce_dec( st_ivas, n, &p_output[st_ivas->nchan_transport + n], output_frame, nb_bits_metadata[1] ) ) != IVAS_ERR_OK )
362 : {
363 0 : return error;
364 : }
365 : }
366 :
367 : /* decode MASA channels */
368 539381 : if ( ( error = ivas_cpe_dec( st_ivas, 0, p_output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK )
369 : {
370 0 : return error;
371 : }
372 :
373 539381 : if ( st_ivas->hCPE[0]->nchan_out == 1 )
374 : {
375 79860 : mvr2r( p_output[0], p_output[1], output_frame ); /* Copy mono signal to stereo output channels */
376 : }
377 :
378 : /* HP filtering */
379 2622461 : for ( n = 0; n < getNumChanSynthesis( st_ivas ); n++ )
380 : {
381 2083080 : hp20( p_output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs );
382 : }
383 :
384 539381 : if ( st_ivas->renderer_type == RENDERER_MONO_DOWNMIX )
385 : {
386 39357 : ivas_ism_mono_dmx( st_ivas, p_output, output_frame );
387 : }
388 500024 : else if ( output_config == IVAS_AUDIO_CONFIG_EXTERNAL )
389 : {
390 37380 : if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC )
391 : {
392 29634 : ivas_omasa_rearrange_channels( p_output, nchan_transport_ism, output_frame );
393 : }
394 7746 : else if ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ )
395 : {
396 : /* Convert separate object to MASA, combine with the original MASA, and output combined MASA + empty objects. */
397 3126 : ivas_omasa_combine_separate_ism_with_masa( st_ivas, p_output, st_ivas->nchan_ism, output_frame );
398 : }
399 4620 : else if ( st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ )
400 : {
401 : /* Extract objects from MASA, output MASA + all objects (i.e., extracted and separated objects) */
402 4620 : ivas_omasa_render_objects_from_mix( st_ivas, p_output, st_ivas->nchan_ism, output_frame );
403 : }
404 : }
405 : }
406 2278466 : else if ( st_ivas->ivas_format == SBA_ISM_FORMAT )
407 : {
408 : int16_t nchan_ism, sba_ch_idx;
409 :
410 1716673 : set_s( nb_bits_metadata, 0, MAX_SCE + 1 );
411 1716673 : nchan_ism = st_ivas->nchan_ism;
412 1716673 : if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC )
413 : {
414 : /* set ISM parameters and decode ISM metadata in OSBA format */
415 764386 : if ( ( error = ivas_osba_ism_metadata_dec( st_ivas, ivas_total_brate, &nchan_ism, &nb_bits_metadata[1] ) ) != IVAS_ERR_OK )
416 : {
417 0 : return error;
418 : }
419 764386 : sba_ch_idx = st_ivas->nchan_ism;
420 : }
421 : else
422 : {
423 952287 : nb_bits_metadata[1] += NO_BITS_MASA_ISM_NO_OBJ;
424 952287 : sba_ch_idx = 0;
425 : }
426 :
427 : /* SBA metadata decoding */
428 1716673 : if ( ( error = ivas_spar_dec( st_ivas, nb_bits_metadata ) ) != IVAS_ERR_OK )
429 : {
430 0 : return error;
431 : }
432 :
433 1716673 : if ( st_ivas->nchan_transport == CPE_CHANNELS && st_ivas->nCPE >= 1 )
434 : {
435 353357 : st_ivas->hCPE[0]->element_brate = ivas_total_brate;
436 : }
437 :
438 : /* core-decoding of transport channels */
439 1716673 : if ( st_ivas->nSCE == 1 )
440 : {
441 509009 : if ( ( error = ivas_sce_dec( st_ivas, 0, p_output, output_frame, nb_bits_metadata[0] + nb_bits_metadata[1] ) ) != IVAS_ERR_OK )
442 : {
443 0 : return error;
444 : }
445 : }
446 1207664 : else if ( st_ivas->nCPE == 1 )
447 : {
448 353357 : if ( ( error = ivas_cpe_dec( st_ivas, 0, p_output, output_frame, nb_bits_metadata[0] + nb_bits_metadata[1] ) ) != IVAS_ERR_OK )
449 : {
450 0 : return error;
451 : }
452 : }
453 854307 : else if ( st_ivas->nCPE > 1 )
454 : {
455 854307 : if ( ( error = ivas_mct_dec( st_ivas, p_output, output_frame, nb_bits_metadata[0] + nb_bits_metadata[1] ) ) != IVAS_ERR_OK )
456 : {
457 0 : return error;
458 : }
459 : }
460 :
461 1716673 : if ( st_ivas->sba_dirac_stereo_flag )
462 : {
463 108792 : ivas_agc_dec_process( st_ivas->hSpar->hAgcDec, &p_output[sba_ch_idx], &p_output[sba_ch_idx], st_ivas->hSpar->hMdDec->spar_md_cfg.nchan_transport, output_frame );
464 :
465 108792 : if ( st_ivas->hSpar->hPCA != NULL )
466 : {
467 2376 : ivas_pca_dec( st_ivas->hSpar->hPCA, output_frame, st_ivas->hSpar->hMdDec->spar_md_cfg.nchan_transport, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->hDecoderConfig->last_ivas_total_brate, st_ivas->bfi, &p_output[sba_ch_idx] );
468 : }
469 :
470 108792 : ivas_spar_dec_gen_umx_mat( st_ivas->hSpar->hMdDec, st_ivas->nchan_transport, IVAS_MAX_NUM_BANDS, st_ivas->bfi, ivas_get_spar_dec_md_num_subframes( st_ivas->sba_order, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->last_active_ivas_total_brate ) );
471 :
472 108792 : ivas_sba_dirac_stereo_dec( st_ivas, &p_output[sba_ch_idx], output_frame, 0 );
473 : }
474 :
475 : /* HP filtering */
476 7738890 : for ( n = 0; n < getNumChanSynthesis( st_ivas ); n++ )
477 : {
478 6022217 : hp20( p_output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs );
479 : }
480 :
481 1716673 : nchan_remapped = ivas_sba_remapTCs( &p_output[sba_ch_idx], st_ivas, output_frame );
482 :
483 : #ifdef DEBUG_OSBA
484 : if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC )
485 : {
486 : int16_t nchan = st_ivas->nchan_transport + st_ivas->nchan_ism;
487 : for ( int16_t t = 0; t < output_frame; t++ )
488 : {
489 : for ( int16_t c = 0; c < nchan; c++ )
490 : {
491 : int16_t val = (int16_t) ( output[c][t] + 0.5f );
492 : dbgwrite( &val, sizeof( int16_t ), 1, 1, "./res/TC_dec_core_out.raw" );
493 : }
494 : }
495 : }
496 : #endif
497 1716673 : if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM )
498 : {
499 266231 : num_md_sub_frames = ivas_get_spar_dec_md_num_subframes( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->last_active_ivas_total_brate );
500 :
501 266231 : ivas_sba_mix_matrix_determiner( st_ivas->hSpar, &p_output[sba_ch_idx], st_ivas->bfi, nchan_remapped, output_frame, num_md_sub_frames );
502 : }
503 1450442 : else if ( st_ivas->renderer_type != RENDERER_DISABLE && !st_ivas->sba_dirac_stereo_flag )
504 : {
505 1278672 : ivas_spar_dec_agc_pca( st_ivas, &p_output[sba_ch_idx], output_frame );
506 : }
507 :
508 1716673 : if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM )
509 : {
510 : /* loudness correction */
511 266231 : ivas_dirac_dec_binaural_sba_gain( &p_output[sba_ch_idx], nchan_remapped, output_frame );
512 : }
513 1450442 : else if ( st_ivas->renderer_type == RENDERER_MONO_DOWNMIX && st_ivas->ism_mode == ISM_SBA_MODE_DISC )
514 : {
515 44814 : ivas_ism_mono_dmx( st_ivas, p_output, output_frame );
516 :
517 : /* add W */
518 89628 : for ( n = 0; n < nchan_out; n++ )
519 : {
520 44814 : v_add( p_output[n], p_output[n + max( nchan_out, nchan_ism )], p_output[n], output_frame );
521 : }
522 : }
523 : }
524 561793 : else if ( st_ivas->ivas_format == MC_FORMAT )
525 : {
526 561793 : st = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0] : st_ivas->hCPE[0]->hCoreCoder[0];
527 :
528 561793 : if ( st_ivas->mc_mode == MC_MODE_MCT )
529 : {
530 : /* LFE channel decoder */
531 290261 : ivas_lfe_dec( st_ivas->hLFE, st, output_frame, st_ivas->bfi, p_output[LFE_CHANNEL] );
532 :
533 290261 : if ( ( error = ivas_mct_dec( st_ivas, p_output, output_frame, 0 ) ) != IVAS_ERR_OK )
534 : {
535 0 : return error;
536 : }
537 :
538 : /* HP filtering */
539 2479471 : for ( n = 0; n < st_ivas->nchan_transport; n++ )
540 : {
541 2189210 : if ( n != LFE_CHANNEL )
542 : {
543 1898949 : hp20( p_output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs );
544 : }
545 : }
546 :
547 290261 : if ( st_ivas->transport_config != st_ivas->intern_config && ( st_ivas->intern_config == IVAS_AUDIO_CONFIG_FOA || st_ivas->intern_config == IVAS_AUDIO_CONFIG_HOA2 || st_ivas->intern_config == IVAS_AUDIO_CONFIG_HOA3 ) )
548 : {
549 8250 : if ( ( st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe ) >= ( st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe ) )
550 : {
551 0 : ivas_mc2sba( st_ivas->hTransSetup, p_output, p_output, output_frame, st_ivas->hIntSetup.ambisonics_order, GAIN_LFE );
552 : }
553 : }
554 :
555 290261 : if ( ( st_ivas->renderer_type == RENDERER_MC || st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) && ( st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe ) >= ( st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe ) )
556 : {
557 58467 : if ( st_ivas->renderer_type == RENDERER_MC )
558 : {
559 46197 : ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, output_frame, p_output, p_output );
560 : }
561 12270 : else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC )
562 : {
563 12270 : ivas_mc2sba( st_ivas->hIntSetup, p_output, p_output, output_frame, st_ivas->hOutSetup.ambisonics_order, 0.f );
564 : }
565 : }
566 : }
567 271532 : else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX )
568 : {
569 : /* LFE channel decoder */
570 14569 : ivas_lfe_dec( st_ivas->hLFE, st, output_frame, st_ivas->bfi, p_output[LFE_CHANNEL] );
571 :
572 14569 : ivas_mc_paramupmix_dec_read_BS( st_ivas, st, st_ivas->hMCParamUpmix, &nb_bits_metadata[0] );
573 :
574 14569 : if ( ( error = ivas_mct_dec( st_ivas, p_output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK )
575 : {
576 0 : return error;
577 : }
578 :
579 : /* HP filtering */
580 131121 : for ( n = 0; n < st_ivas->nchan_transport; n++ )
581 : {
582 116552 : if ( n != LFE_CHANNEL )
583 : {
584 101983 : hp20( p_output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs );
585 : }
586 : }
587 :
588 : /* Rendering */
589 14569 : if ( st_ivas->renderer_type == RENDERER_MC && ( output_config == IVAS_AUDIO_CONFIG_MONO || output_config == IVAS_AUDIO_CONFIG_STEREO ) )
590 : {
591 : /* Compensate loudness for not doing full upmix */
592 4620 : for ( n = 4; n < 8; n++ )
593 : {
594 3696 : v_multc( p_output[n], 2.0f, p_output[n], output_frame );
595 : }
596 :
597 924 : if ( output_config == IVAS_AUDIO_CONFIG_MONO || output_config == IVAS_AUDIO_CONFIG_STEREO )
598 : {
599 924 : ivas_ls_setup_conversion( st_ivas, audioCfg2channels( IVAS_AUDIO_CONFIG_5_1_2 ), output_frame, p_output, p_output );
600 : }
601 : }
602 : }
603 256963 : else if ( st_ivas->mc_mode == MC_MODE_PARAMMC )
604 : {
605 : /* read Parametric MC parameters from the bitstream */
606 105782 : ivas_param_mc_dec_read_BS( ivas_total_brate, st, st_ivas->hParamMC, &nb_bits_metadata[0] );
607 :
608 105782 : if ( st_ivas->nCPE == 1 )
609 : {
610 74421 : if ( ( error = ivas_cpe_dec( st_ivas, 0, p_output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK )
611 : {
612 0 : return error;
613 : }
614 : }
615 31361 : else if ( st_ivas->nCPE > 1 )
616 : {
617 31361 : if ( ( error = ivas_mct_dec( st_ivas, p_output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK )
618 : {
619 0 : return error;
620 : }
621 : }
622 :
623 : /* HP filtering */
624 348707 : for ( n = 0; n < st_ivas->nchan_transport; n++ )
625 : {
626 242925 : hp20( p_output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs );
627 : }
628 :
629 : /* Rendering */
630 105782 : if ( output_config == IVAS_AUDIO_CONFIG_MONO || output_config == IVAS_AUDIO_CONFIG_STEREO )
631 : {
632 8376 : ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, output_frame, p_output, p_output );
633 : }
634 : }
635 151181 : else if ( st_ivas->mc_mode == MC_MODE_MCMASA )
636 : {
637 151181 : if ( st_ivas->hOutSetup.separateChannelEnabled )
638 : {
639 25709 : st = st_ivas->hCPE[0]->hCoreCoder[0]; /* Metadata is always with CPE in the case of separated channel */
640 : }
641 :
642 : /* read McMASA parameters from the bitstream */
643 151181 : if ( ( error = ivas_masa_decode( st_ivas, st, &nb_bits_metadata[0] ) ) != IVAS_ERR_OK )
644 : {
645 0 : return error;
646 : }
647 :
648 151181 : if ( st_ivas->hOutSetup.separateChannelEnabled )
649 : {
650 : /* Decode the transport audio signals */
651 25709 : if ( ( error = ivas_cpe_dec( st_ivas, 0, p_output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK )
652 : {
653 0 : return error;
654 : }
655 :
656 : /* Identify the index of the separated channel, always LFE_CHANNEL-1 here */
657 25709 : n = LFE_CHANNEL - 1;
658 :
659 : /* Decode the separated channel to output[n] to be combined with the synthesized channels */
660 25709 : if ( ( error = ivas_sce_dec( st_ivas, 0, &p_output[n], output_frame, 0 ) ) != IVAS_ERR_OK )
661 : {
662 0 : return error;
663 : }
664 :
665 : /* Delay the separated channel to sync with CLDFB delay of the DirAC synthesis, and synthesize the LFE signal. */
666 25709 : if ( output_config == IVAS_AUDIO_CONFIG_5_1 || output_config == IVAS_AUDIO_CONFIG_7_1 ||
667 20707 : output_config == IVAS_AUDIO_CONFIG_5_1_4 || output_config == IVAS_AUDIO_CONFIG_7_1_4 ||
668 17587 : output_config == IVAS_AUDIO_CONFIG_5_1_2 || ( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM && st_ivas->hOutSetup.num_lfe > 0 ) || output_config == IVAS_AUDIO_CONFIG_EXTERNAL )
669 : {
670 9992 : ivas_lfe_synth_with_filters( st_ivas->hMasa->hMasaLfeSynth, p_output, output_frame, n, LFE_CHANNEL );
671 : }
672 15717 : else if ( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM && st_ivas->hOutSetup.num_lfe == 0 )
673 : {
674 : /* Delay the separated channel to sync with the DirAC rendering */
675 0 : delay_signal( p_output[n], output_frame, st_ivas->hMasa->hMasaLfeSynth->delayBuffer_syncDirAC, st_ivas->hMasa->hMasaLfeSynth->delayBuffer_syncDirAC_size );
676 : }
677 : }
678 : else
679 : {
680 125472 : if ( st_ivas->nSCE == 1 )
681 : {
682 114796 : if ( ( error = ivas_sce_dec( st_ivas, 0, p_output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK )
683 : {
684 0 : return error;
685 : }
686 : }
687 10676 : else if ( st_ivas->nCPE == 1 )
688 : {
689 10676 : if ( ( error = ivas_cpe_dec( st_ivas, 0, p_output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK )
690 : {
691 0 : return error;
692 : }
693 : }
694 : }
695 :
696 151181 : if ( st_ivas->sba_dirac_stereo_flag ) /* use the flag to trigger the DFT upmix */
697 : {
698 8559 : ivas_sba_dirac_stereo_dec( st_ivas, p_output, output_frame, 1 );
699 : }
700 :
701 : /* HP filtering */
702 373015 : for ( n = 0; n < getNumChanSynthesis( st_ivas ); n++ )
703 : {
704 221834 : hp20( p_output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs );
705 : }
706 :
707 151181 : if ( st_ivas->renderer_type == RENDERER_MCMASA_MONO_STEREO )
708 : {
709 5361 : ivas_mono_stereo_downmix_mcmasa( st_ivas, p_output, output_frame );
710 : }
711 : }
712 : }
713 :
714 : /*----------------------------------------------------------------*
715 : * Common updates
716 : *----------------------------------------------------------------*/
717 :
718 5936793 : if ( !st_ivas->bfi ) /* do not update if first frame(s) are lost or NO_DATA */
719 : {
720 5487604 : st_ivas->hDecoderConfig->last_ivas_total_brate = ivas_total_brate;
721 5487604 : st_ivas->last_active_ivas_total_brate = ( ivas_total_brate <= IVAS_SID_5k2 ) ? st_ivas->last_active_ivas_total_brate : ivas_total_brate;
722 : }
723 :
724 5936793 : if ( st_ivas->ini_frame < MAX_FRAME_COUNTER && !( st_ivas->bfi && st_ivas->ini_frame == 0 ) ) /* keep "st_ivas->ini_frame = 0" until first good received frame */
725 : {
726 4687229 : st_ivas->ini_frame++;
727 : }
728 :
729 5936793 : if ( st_ivas->ini_active_frame < MAX_FRAME_COUNTER && !( st_ivas->bfi && st_ivas->ini_frame == 0 ) && ivas_total_brate > IVAS_SID_5k2 ) /* needed in MASA decoder in case the first active frame is BFI, and there were SID-frames decoded before */
730 : {
731 4685793 : st_ivas->ini_active_frame++;
732 : }
733 :
734 5936793 : st_ivas->last_ivas_format = st_ivas->ivas_format;
735 :
736 : #ifdef DEBUG_MODE_INFO
737 : dbgwrite( &st_ivas->bfi, sizeof( int16_t ), 1, output_frame, "res/bfi" );
738 : dbgwrite( &st_ivas->BER_detect, sizeof( int16_t ), 1, output_frame, "res/BER_detect" );
739 : {
740 : float tmpF = ivas_total_brate / 1000.0f;
741 : dbgwrite( &tmpF, sizeof( float ), 1, output_frame, "res/ivas_total_brate.dec" );
742 : }
743 : #endif
744 :
745 5936793 : pop_wmops();
746 5936793 : return IVAS_ERR_OK;
747 : }
748 :
749 :
750 : /*--------------------------------------------------------------------------*
751 : * ivas_dec_feed_tc_to_renderer()
752 : *
753 : * Feed decoded transport channels to the IVAS renderer routine
754 : * + digest TC channels in ParamISM and ParamMC
755 : *--------------------------------------------------------------------------*/
756 :
757 5976003 : void ivas_jbm_dec_feed_tc_to_renderer(
758 : Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
759 : const int16_t nSamplesForRendering, /* i : number of TC samples available for rendering */
760 : int16_t *nSamplesResidual /* o : number of samples not fitting into the renderer grid and buffer for the next call*/
761 : )
762 : {
763 : float tmp_buf[MAX_JBM_L_FRAME48k];
764 : float *p_data_f[FOA_CHANNELS + MAX_NUM_OBJECTS];
765 : int16_t n, n_render_timeslots, n_ch_cldfb;
766 : int16_t ch, offset, len_offset;
767 : DECODER_TC_BUFFER_HANDLE hTcBuffer;
768 :
769 5976003 : hTcBuffer = st_ivas->hTcBuffer;
770 5976003 : n_ch_cldfb = hTcBuffer->nchan_transport_jbm - hTcBuffer->nchan_buffer_full;
771 :
772 5976003 : if ( st_ivas->hDecoderConfig->Opt_tsm )
773 : {
774 : int16_t n_samples_still_available;
775 : int16_t n_ch_full_copy, n_ch_res_copy;
776 :
777 2137570 : n_samples_still_available = hTcBuffer->n_samples_buffered - hTcBuffer->n_samples_rendered;
778 2137570 : hTcBuffer->n_samples_buffered = n_samples_still_available + nSamplesForRendering + hTcBuffer->n_samples_discard;
779 2137570 : hTcBuffer->n_samples_available = hTcBuffer->n_samples_granularity * ( hTcBuffer->n_samples_buffered / hTcBuffer->n_samples_granularity );
780 2137570 : *nSamplesResidual = hTcBuffer->n_samples_buffered - hTcBuffer->n_samples_available;
781 2137570 : n_ch_full_copy = min( hTcBuffer->nchan_transport_jbm, hTcBuffer->nchan_buffer_full );
782 2137570 : n_ch_res_copy = hTcBuffer->nchan_transport_jbm - hTcBuffer->nchan_buffer_full;
783 :
784 : /* buffers are shared between 'hTcBuffer->tc[]' and 'p_output_f[]':
785 : in case of 'length(hTcBuffer->tc[]) < length(p_output_f[])', reset of TC buffers
786 : pointers is needed after ivas_buffer_interleaved_to_deinterleaved() */
787 2137570 : len_offset = NS2SA( st_ivas->hDecoderConfig->output_Fs, MAX_JBM_L_FRAME_NS );
788 2137570 : if ( len_offset < L_FRAME48k )
789 : {
790 636037 : offset = 0;
791 3138017 : for ( ch = 0; ch < max( hTcBuffer->nchan_transport_jbm, hTcBuffer->nchan_buffer_full ); ch++ )
792 : {
793 2501980 : hTcBuffer->tc[ch] = &hTcBuffer->tc_buffer[offset];
794 2501980 : st_ivas->p_output_f[ch] = hTcBuffer->tc[ch];
795 2501980 : offset += len_offset;
796 : }
797 : }
798 :
799 8643873 : for ( ch = 0; ch < n_ch_full_copy; ch++ )
800 : {
801 6506303 : mvr2r( hTcBuffer->tc[ch], tmp_buf, nSamplesForRendering );
802 6506303 : set_zero( hTcBuffer->tc[ch], hTcBuffer->n_samples_discard );
803 6506303 : mvr2r( hTcBuffer->tc_buffer_old[ch], hTcBuffer->tc[ch] + hTcBuffer->n_samples_discard, n_samples_still_available );
804 6506303 : mvr2r( tmp_buf, hTcBuffer->tc[ch] + n_samples_still_available + hTcBuffer->n_samples_discard, nSamplesForRendering - *nSamplesResidual );
805 6506303 : mvr2r( tmp_buf + nSamplesForRendering - *nSamplesResidual, hTcBuffer->tc_buffer_old[ch], *nSamplesResidual );
806 : }
807 :
808 2137570 : if ( n_ch_res_copy > 0 )
809 : {
810 202143 : for ( ; ch < hTcBuffer->nchan_transport_jbm; ch++ )
811 : {
812 138969 : p_data_f[ch] = hTcBuffer->tc[ch];
813 138969 : mvr2r( hTcBuffer->tc[ch], tmp_buf, nSamplesForRendering );
814 138969 : mvr2r( hTcBuffer->tc_buffer_old[ch], p_data_f[ch], n_samples_still_available );
815 138969 : mvr2r( tmp_buf, p_data_f[ch] + n_samples_still_available, nSamplesForRendering - *nSamplesResidual );
816 138969 : mvr2r( tmp_buf + nSamplesForRendering - *nSamplesResidual, hTcBuffer->tc_buffer_old[ch], *nSamplesResidual );
817 : }
818 : }
819 :
820 2137570 : n_render_timeslots = hTcBuffer->n_samples_available / hTcBuffer->n_samples_granularity;
821 : }
822 : else
823 : {
824 4061243 : for ( n = 0; n < n_ch_cldfb; n++ )
825 : {
826 222810 : p_data_f[n] = &st_ivas->p_output_f[n][0];
827 : }
828 :
829 3838433 : ch = max( hTcBuffer->nchan_transport_jbm, hTcBuffer->nchan_buffer_full );
830 18782225 : for ( n = 0; n < ch; n++ )
831 : {
832 14943792 : hTcBuffer->tc[n] = st_ivas->p_output_f[n]; /* note: buffers needed in the TD decorellator */
833 : }
834 :
835 3838433 : hTcBuffer->n_samples_buffered = nSamplesForRendering;
836 3838433 : hTcBuffer->n_samples_available = hTcBuffer->n_samples_buffered;
837 3838433 : *nSamplesResidual = 0;
838 :
839 3838433 : n_render_timeslots = DEFAULT_JBM_CLDFB_TIMESLOTS;
840 : }
841 :
842 : /* CLDFB analysis for ParamMC/ParamISM */
843 5976003 : if ( st_ivas->ivas_format == ISM_FORMAT && st_ivas->ism_mode == ISM_MODE_PARAM && ( st_ivas->renderer_type == RENDERER_PARAM_ISM || st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) )
844 : {
845 69318 : ivas_param_ism_dec_digest_tc( st_ivas, n_render_timeslots, p_data_f );
846 : }
847 5906685 : else if ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMMC && hTcBuffer->tc_buffer_mode == TC_BUFFER_MODE_RENDERER )
848 : {
849 97406 : ivas_param_mc_dec_digest_tc( st_ivas, (uint8_t) n_render_timeslots, p_data_f );
850 : }
851 :
852 5976003 : hTcBuffer->n_samples_rendered = 0;
853 5976003 : hTcBuffer->subframes_rendered = 0;
854 :
855 5976003 : return;
856 : }
857 :
858 :
859 : /*--------------------------------------------------------------------------*
860 : * ivas_dec_render()
861 : *
862 : * Principal IVAS JBM rendering routine
863 : *--------------------------------------------------------------------------*/
864 :
865 7939142 : ivas_error ivas_jbm_dec_render(
866 : Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
867 : const uint16_t nSamplesAsked, /* i : number of samples wanted */
868 : uint16_t *nSamplesRendered, /* o : number of samples rendered */
869 : uint16_t *nSamplesAvailableNext, /* o : number of samples still available in the rendering pipeline */
870 : const PCM_RESOLUTION pcm_resolution, /* i : type for the decoded PCM resolution */
871 : void *data /* o : output synthesis signal */
872 : )
873 : {
874 : int16_t n, nchan_out;
875 : int16_t nchan_transport;
876 : int16_t nchan_remapped;
877 : int32_t output_Fs;
878 : AUDIO_CONFIG output_config;
879 : int16_t nSamplesAskedLocal;
880 : ivas_error error;
881 : float *p_output[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS];
882 : float *p_tc[MAX_TRANSPORT_CHANNELS + MAX_NUM_OBJECTS];
883 : int16_t nchan_out_syn_output;
884 :
885 7939142 : push_wmops( "ivas_dec_render" );
886 : /*----------------------------------------------------------------*
887 : * Initialization of local vars after struct has been set
888 : *----------------------------------------------------------------*/
889 :
890 7939142 : output_Fs = st_ivas->hDecoderConfig->output_Fs;
891 7939142 : nchan_out = st_ivas->hDecoderConfig->nchan_out;
892 7939142 : nchan_transport = st_ivas->hTcBuffer->nchan_transport_jbm;
893 7939142 : output_config = st_ivas->hDecoderConfig->output_config;
894 7939142 : nSamplesAskedLocal = nSamplesAsked + st_ivas->hTcBuffer->n_samples_discard;
895 :
896 166721982 : for ( n = 0; n < MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS; n++ )
897 : {
898 158782840 : p_output[n] = st_ivas->p_output_f[n];
899 : }
900 :
901 7939142 : if ( !st_ivas->hDecoderConfig->Opt_tsm )
902 : {
903 93890881 : for ( n = 0; n < MAX_INTERN_CHANNELS; n++ )
904 : {
905 88367888 : st_ivas->hTcBuffer->tc[n] = p_output[n];
906 : }
907 : }
908 :
909 37945712 : for ( n = 0; n < st_ivas->hTcBuffer->nchan_buffer_full; n++ )
910 : {
911 30006570 : p_tc[n] = &st_ivas->hTcBuffer->tc[n][st_ivas->hTcBuffer->n_samples_rendered];
912 : }
913 :
914 : /*----------------------------------------------------------------*
915 : * Update combined orientation access index
916 : *----------------------------------------------------------------*/
917 :
918 7939142 : if ( st_ivas->hCombinedOrientationData != NULL )
919 : {
920 : /* take the discard samples into account here to make sure head rotation stays on the correct 5ms grid */
921 908586 : st_ivas->hCombinedOrientationData->cur_subframe_samples_rendered_start -= st_ivas->hTcBuffer->n_samples_discard;
922 :
923 908586 : ivas_combined_orientation_set_to_start_index( st_ivas->hCombinedOrientationData );
924 : }
925 :
926 : /*----------------------------------------------------------------*
927 : * Rendering
928 : *----------------------------------------------------------------*/
929 :
930 7939142 : *nSamplesRendered = min( st_ivas->hTcBuffer->n_samples_available, nSamplesAskedLocal );
931 :
932 7939142 : if ( st_ivas->ivas_format == UNDEFINED_FORMAT )
933 : {
934 0 : assert( 0 );
935 : }
936 7939142 : else if ( st_ivas->hTcBuffer->tc_buffer_mode == TC_BUFFER_MODE_BUFFER )
937 : {
938 1532542 : ivas_jbm_dec_tc_buffer_playout( st_ivas, nSamplesAskedLocal, nSamplesRendered, p_output );
939 : }
940 6406600 : else if ( st_ivas->ivas_format == MONO_FORMAT || st_ivas->ivas_format == STEREO_FORMAT )
941 : {
942 : /* Rendering */
943 7000 : if ( st_ivas->renderer_type == RENDERER_MC )
944 : {
945 0 : ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, *nSamplesRendered, p_tc, p_output );
946 : }
947 : #ifdef FIX_1435_MOVE_STEREO_PANNING
948 7000 : else if ( st_ivas->renderer_type == RENDERER_NON_DIEGETIC_DOWNMIX )
949 : {
950 7000 : ivas_apply_non_diegetic_panning( p_tc[0], p_output, st_ivas->hDecoderConfig->non_diegetic_pan_gain, *nSamplesRendered );
951 : }
952 : #endif
953 0 : else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC )
954 : {
955 : #ifdef FIX_1454_FIX_STEREO_TO_FOA_JBM
956 0 : ivas_stereo2sba( p_tc, p_output, *nSamplesRendered );
957 : #else
958 : ivas_stereo2sba( p_output, p_output, *nSamplesRendered );
959 : #endif
960 : }
961 : }
962 6399600 : else if ( st_ivas->ivas_format == ISM_FORMAT )
963 : {
964 : /* Rendering */
965 1309185 : if ( st_ivas->ism_mode == ISM_MODE_PARAM )
966 : {
967 208473 : if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC )
968 : {
969 106068 : ivas_dirac_dec_binaural_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, st_ivas->nchan_transport, p_output );
970 : }
971 102405 : else if ( st_ivas->renderer_type == RENDERER_PARAM_ISM || st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC )
972 : {
973 102405 : ivas_param_ism_dec_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output );
974 :
975 102405 : if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC )
976 : {
977 : /* Convert CICP19 -> Ambisonics */
978 60250 : ivas_mc2sba( st_ivas->hIntSetup, p_output, p_output, *nSamplesRendered, st_ivas->hOutSetup.ambisonics_order, 0.f );
979 : }
980 : }
981 : }
982 : else /* ISM_MODE_DISC */
983 : {
984 : /* Loudspeaker or Ambisonics rendering */
985 1100712 : if ( st_ivas->renderer_type == RENDERER_TD_PANNING || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM )
986 : {
987 : /* Convert to CICPxx; used also for ISM->CICP19->binaural_room rendering */
988 501478 : ivas_ism_render_sf( st_ivas, st_ivas->renderer_type, p_output, *nSamplesRendered );
989 : }
990 599234 : else if ( st_ivas->renderer_type == RENDERER_NON_DIEGETIC_DOWNMIX )
991 : {
992 10500 : ivas_apply_non_diegetic_panning( p_tc[0], p_output, st_ivas->hDecoderConfig->non_diegetic_pan_gain, *nSamplesRendered );
993 : }
994 : #ifdef DEBUGGING
995 : else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV )
996 : #else
997 588734 : else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC )
998 : #endif
999 : {
1000 : /* Convert to Ambisonics */
1001 192195 : ivas_ism2sba_sf( p_tc, p_output, st_ivas->hIsmRendererData, st_ivas->nchan_transport, *nSamplesRendered, st_ivas->hTcBuffer->n_samples_rendered, st_ivas->hIntSetup.ambisonics_order );
1002 : }
1003 :
1004 : /* Binaural rendering */
1005 1100712 : if ( st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD )
1006 : {
1007 396539 : if ( output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM )
1008 : {
1009 17814 : if ( ( error = ivas_td_binaural_renderer_sf_splitBinaural( st_ivas, p_output, *nSamplesRendered ) ) != IVAS_ERR_OK )
1010 : {
1011 0 : return error;
1012 : }
1013 : }
1014 : else
1015 : {
1016 378725 : if ( ( error = ivas_td_binaural_renderer_sf( st_ivas, p_output, *nSamplesRendered ) ) != IVAS_ERR_OK )
1017 : {
1018 0 : return error;
1019 : }
1020 : }
1021 : }
1022 704173 : else if ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM )
1023 : {
1024 146656 : if ( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, IVAS_AUDIO_CONFIG_7_1_4, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR, st_ivas->hDecoderConfig, NULL,
1025 146656 : NULL, NULL, st_ivas->hTcBuffer, p_output, p_output, *nSamplesRendered, output_Fs, 0 ) ) != IVAS_ERR_OK )
1026 : {
1027 0 : return error;
1028 : }
1029 : }
1030 : }
1031 : }
1032 5090415 : else if ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == MASA_FORMAT )
1033 : {
1034 2199973 : nchan_remapped = nchan_transport;
1035 :
1036 : /* Loudspeakers, Ambisonics or Binaural rendering */
1037 2199973 : if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC )
1038 : {
1039 786064 : ivas_dirac_dec_binaural_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, nchan_remapped, p_output );
1040 : }
1041 1413909 : else if ( st_ivas->ivas_format == MASA_FORMAT )
1042 : {
1043 369149 : if ( st_ivas->renderer_type == RENDERER_DIRAC )
1044 : {
1045 369149 : ivas_dirac_dec_render( st_ivas, nchan_remapped, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output );
1046 : }
1047 : }
1048 : else
1049 : {
1050 1044760 : if ( ( error = ivas_sba_dec_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output ) ) != IVAS_ERR_OK )
1051 : {
1052 0 : return error;
1053 : }
1054 : }
1055 : }
1056 2890442 : else if ( st_ivas->ivas_format == MASA_ISM_FORMAT )
1057 : {
1058 582304 : nchan_remapped = st_ivas->nchan_transport;
1059 :
1060 582304 : if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC )
1061 : {
1062 309726 : if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC && st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC )
1063 : {
1064 83753 : if ( ( error = ivas_omasa_dirac_td_binaural_jbm( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, nchan_remapped, p_output ) ) != IVAS_ERR_OK )
1065 : {
1066 0 : return error;
1067 : }
1068 : }
1069 : else
1070 : {
1071 225973 : ivas_dirac_dec_binaural_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, nchan_remapped, p_output );
1072 : }
1073 : }
1074 272578 : else if ( st_ivas->renderer_type == RENDERER_DIRAC )
1075 : {
1076 264832 : ivas_omasa_dirac_rend_jbm( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, nchan_remapped, p_output );
1077 : }
1078 7746 : else if ( st_ivas->renderer_type == RENDERER_OMASA_OBJECT_EXT || st_ivas->renderer_type == RENDERER_OMASA_MIX_EXT )
1079 : {
1080 7746 : ivas_jbm_dec_tc_buffer_playout( st_ivas, nSamplesAskedLocal, nSamplesRendered, p_output );
1081 7746 : ivas_omasa_rearrange_channels( p_output, st_ivas->nchan_ism, *nSamplesRendered );
1082 : }
1083 : }
1084 2308138 : else if ( st_ivas->ivas_format == SBA_ISM_FORMAT )
1085 : {
1086 1681655 : nchan_remapped = nchan_transport;
1087 :
1088 : /* Loudspeakers, Ambisonics or Binaural rendering */
1089 1681655 : if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC )
1090 : {
1091 804132 : if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV )
1092 : {
1093 245260 : if ( ( error = ivas_osba_dirac_td_binaural_jbm( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output ) ) != IVAS_ERR_OK )
1094 : {
1095 0 : return error;
1096 : }
1097 : }
1098 558872 : else if ( st_ivas->renderer_type == RENDERER_OSBA_STEREO )
1099 : {
1100 : /* shift SBA channels to avoid overwrite by ISM upmix in 1 object case and non-TSM unified channel memory*/
1101 51614 : if ( st_ivas->nchan_ism == 1 && st_ivas->hDecoderConfig->Opt_tsm == 0 )
1102 : {
1103 5940 : mvr2r( p_tc[2], p_output[3], *nSamplesRendered );
1104 5940 : mvr2r( p_tc[1], p_output[2], *nSamplesRendered );
1105 5940 : p_tc[1] = p_output[2];
1106 5940 : p_tc[2] = p_output[3];
1107 : }
1108 :
1109 : /* render objects */
1110 51614 : ivas_ism_render_sf( st_ivas, st_ivas->renderer_type, p_output, *nSamplesRendered );
1111 :
1112 : /* add already rendered SBA part */
1113 51614 : ivas_osba_stereo_add_channels( p_tc, p_output, st_ivas->hSbaIsmData->gain_bed, nchan_out, st_ivas->nchan_ism, *nSamplesRendered );
1114 : }
1115 507258 : else if ( st_ivas->renderer_type == RENDERER_OSBA_AMBI || st_ivas->renderer_type == RENDERER_OSBA_LS || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM )
1116 : {
1117 456244 : if ( ( error = ivas_osba_render_sf( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output ) ) != IVAS_ERR_OK )
1118 : {
1119 0 : return error;
1120 : }
1121 : }
1122 51014 : else if ( output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) /*EXT output = individual objects + HOA3*/
1123 : {
1124 51014 : if ( ( error = ivas_sba_dec_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, &p_output[st_ivas->nchan_ism] ) ) != IVAS_ERR_OK )
1125 : {
1126 0 : return error;
1127 : }
1128 :
1129 178676 : for ( n = 0; n < st_ivas->nchan_ism; n++ )
1130 : {
1131 127662 : mvr2r( p_tc[n], p_output[n], *nSamplesRendered );
1132 : }
1133 : }
1134 : else
1135 : {
1136 0 : if ( ( error = ivas_sba_dec_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output ) ) != IVAS_ERR_OK )
1137 : {
1138 0 : return error;
1139 : }
1140 : }
1141 : }
1142 877523 : else if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM )
1143 : {
1144 302783 : ivas_dirac_dec_binaural_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, nchan_remapped, p_output );
1145 908349 : for ( n = 0; n < st_ivas->hDecoderConfig->nchan_out; n++ )
1146 : {
1147 605566 : v_multc( p_output[n], 2.0f, p_output[n], *nSamplesRendered );
1148 : }
1149 : }
1150 : else
1151 : {
1152 574740 : if ( ( error = ivas_sba_dec_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output ) ) != IVAS_ERR_OK )
1153 : {
1154 0 : return error;
1155 : }
1156 :
1157 574740 : if ( output_config == IVAS_AUDIO_CONFIG_EXTERNAL )
1158 : {
1159 : #ifdef DEBUGGING
1160 : assert( st_ivas->ism_mode == ISM_MODE_NONE );
1161 : #endif
1162 649032 : for ( n = st_ivas->hIntSetup.nchan_out_woLFE - 1; n >= 0; n-- )
1163 : {
1164 589254 : mvr2r( p_output[n], p_output[n + st_ivas->nchan_ism], *nSamplesRendered );
1165 : }
1166 214596 : for ( n = 0; n < st_ivas->nchan_ism; n++ )
1167 : {
1168 154818 : set_zero( p_output[n], *nSamplesRendered );
1169 : }
1170 : }
1171 5801482 : for ( n = 0; n < st_ivas->hDecoderConfig->nchan_out; n++ )
1172 : {
1173 5226742 : v_multc( p_output[n], 2.0f, p_output[n], *nSamplesRendered );
1174 : }
1175 : }
1176 : }
1177 626483 : else if ( st_ivas->ivas_format == MC_FORMAT )
1178 : {
1179 626483 : if ( st_ivas->mc_mode == MC_MODE_MCT )
1180 : {
1181 303018 : int16_t crendInPlaceRotation = FALSE;
1182 :
1183 303018 : if ( st_ivas->transport_config != st_ivas->intern_config && ( st_ivas->intern_config == IVAS_AUDIO_CONFIG_FOA || st_ivas->intern_config == IVAS_AUDIO_CONFIG_HOA2 || st_ivas->intern_config == IVAS_AUDIO_CONFIG_HOA3 ) )
1184 : {
1185 9457 : if ( ( st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe ) < ( st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe ) )
1186 : {
1187 9457 : crendInPlaceRotation = TRUE;
1188 9457 : ivas_mc2sba( st_ivas->hTransSetup, p_tc, p_output, *nSamplesRendered, st_ivas->hIntSetup.ambisonics_order, GAIN_LFE );
1189 : }
1190 : }
1191 :
1192 : /* Rendering */
1193 303018 : if ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM )
1194 : {
1195 147762 : if ( output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM )
1196 : {
1197 15946 : if ( ( error = ivas_rend_crendProcessSubframesSplitBin( st_ivas->hCrendWrapper, st_ivas->intern_config, st_ivas->hOutSetup.output_config, ( st_ivas->hSplitBinRend == NULL ) ? NULL : &st_ivas->hSplitBinRend->splitrend.multiBinPoseData, st_ivas->hDecoderConfig, st_ivas->hCombinedOrientationData,
1198 15946 : &st_ivas->hIntSetup, st_ivas->hEFAPdata, st_ivas->hTcBuffer, crendInPlaceRotation ? p_output : p_tc, p_output, *nSamplesRendered, output_Fs ) ) != IVAS_ERR_OK )
1199 : {
1200 0 : return error;
1201 : }
1202 : }
1203 : else
1204 : {
1205 279578 : if ( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, st_ivas->intern_config, st_ivas->hOutSetup.output_config, st_ivas->hDecoderConfig, st_ivas->hCombinedOrientationData,
1206 279578 : &st_ivas->hIntSetup, st_ivas->hEFAPdata, st_ivas->hTcBuffer, crendInPlaceRotation ? p_output : p_tc, p_output, *nSamplesRendered, output_Fs, 0 ) ) != IVAS_ERR_OK )
1207 : {
1208 0 : return error;
1209 : }
1210 :
1211 139789 : ivas_binaural_add_LFE( st_ivas, *nSamplesRendered, p_tc, p_output );
1212 : }
1213 : }
1214 155256 : else if ( st_ivas->renderer_type == RENDERER_MC )
1215 : {
1216 45641 : ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, *nSamplesRendered, p_tc, p_output );
1217 : }
1218 109615 : else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC )
1219 : {
1220 18853 : ivas_mc2sba( st_ivas->hIntSetup, p_tc, p_output, *nSamplesRendered, st_ivas->hOutSetup.ambisonics_order, 0.f );
1221 : }
1222 90762 : else if ( st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD )
1223 : {
1224 90762 : if ( output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM )
1225 : {
1226 66872 : if ( ( error = ivas_td_binaural_renderer_sf_splitBinaural( st_ivas, p_output, *nSamplesRendered ) ) != IVAS_ERR_OK )
1227 : {
1228 0 : return error;
1229 : }
1230 : }
1231 : else
1232 : {
1233 23890 : if ( ( error = ivas_td_binaural_renderer_sf( st_ivas, p_output, *nSamplesRendered ) ) != IVAS_ERR_OK )
1234 : {
1235 0 : return error;
1236 : }
1237 :
1238 23890 : ivas_binaural_add_LFE( st_ivas, *nSamplesRendered, p_tc, p_output );
1239 : }
1240 : }
1241 : }
1242 323465 : else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX )
1243 : {
1244 19122 : ivas_mc_paramupmix_dec_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_tc, p_output );
1245 :
1246 :
1247 : /* Rendering */
1248 19122 : if ( ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) && !st_ivas->hDecoderConfig->Opt_Headrotation )
1249 : {
1250 : /* handled in CLDFB domain already */
1251 2461 : if ( output_config != IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED && output_config != IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM )
1252 : {
1253 2461 : ivas_binaural_add_LFE( st_ivas, *nSamplesRendered, p_output, p_output );
1254 : }
1255 : }
1256 16661 : else if ( st_ivas->renderer_type == RENDERER_MC )
1257 : {
1258 1188 : ivas_ls_setup_conversion( st_ivas, MC_PARAMUPMIX_MAX_INPUT_CHANS, *nSamplesRendered, p_output, p_output );
1259 : }
1260 15473 : else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC )
1261 : {
1262 961 : ivas_mc2sba( st_ivas->hIntSetup, p_output, p_output, *nSamplesRendered, st_ivas->hOutSetup.ambisonics_order, 0.f );
1263 : }
1264 : }
1265 304343 : else if ( st_ivas->mc_mode == MC_MODE_PARAMMC )
1266 : {
1267 139656 : ivas_param_mc_dec_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output );
1268 : }
1269 164687 : else if ( st_ivas->mc_mode == MC_MODE_MCMASA )
1270 : {
1271 164687 : nchan_remapped = st_ivas->nchan_transport;
1272 164687 : if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC )
1273 : {
1274 85558 : ivas_dirac_dec_binaural_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, nchan_remapped, p_output );
1275 : }
1276 79129 : else if ( st_ivas->renderer_type == RENDERER_DIRAC || st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) /* rendering to CICPxx and Ambisonics */
1277 : {
1278 79129 : ivas_dirac_dec_render( st_ivas, nchan_remapped, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output );
1279 :
1280 79129 : if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC )
1281 : {
1282 : /* we still need to copy the separate channel if available */
1283 23342 : if ( st_ivas->hOutSetup.separateChannelEnabled )
1284 : {
1285 4630 : mvr2r( p_tc[LFE_CHANNEL - 1], p_output[st_ivas->hOutSetup.separateChannelIndex], *nSamplesRendered );
1286 : }
1287 :
1288 23342 : ivas_mc2sba( st_ivas->hIntSetup, p_output, p_output, *nSamplesRendered, st_ivas->hOutSetup.ambisonics_order, 0.f );
1289 : }
1290 55787 : else if ( st_ivas->intern_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 ) )
1291 : {
1292 8040 : for ( n = st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; n < st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe; n++ )
1293 : {
1294 6030 : set_zero( p_output[n], *nSamplesRendered );
1295 : }
1296 : }
1297 : }
1298 :
1299 : /* copy discrete C and TD LFE from internal TC to output */
1300 164687 : if ( st_ivas->hOutSetup.separateChannelEnabled )
1301 : {
1302 22398 : if ( output_config == IVAS_AUDIO_CONFIG_5_1 || output_config == IVAS_AUDIO_CONFIG_7_1 ||
1303 16800 : output_config == IVAS_AUDIO_CONFIG_5_1_4 || output_config == IVAS_AUDIO_CONFIG_7_1_4 ||
1304 13680 : output_config == IVAS_AUDIO_CONFIG_5_1_2 || ( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM && st_ivas->hOutSetup.num_lfe > 0 ) )
1305 : {
1306 8718 : mvr2r( p_tc[LFE_CHANNEL], p_output[LFE_CHANNEL], *nSamplesRendered );
1307 8718 : mvr2r( p_tc[LFE_CHANNEL - 1], p_output[st_ivas->hOutSetup.separateChannelIndex], *nSamplesRendered );
1308 : }
1309 13680 : else if ( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM && st_ivas->hOutSetup.num_lfe == 0 )
1310 : {
1311 0 : mvr2r( p_tc[LFE_CHANNEL - 1], p_output[st_ivas->hOutSetup.separateChannelIndex], *nSamplesRendered );
1312 : }
1313 : }
1314 : }
1315 : }
1316 :
1317 : /*----------------------------------------------------------------*
1318 : * Write IVAS output channels
1319 : * - compensation for saturation
1320 : * - float to integer conversion
1321 : *----------------------------------------------------------------*/
1322 :
1323 7939142 : st_ivas->hTcBuffer->n_samples_available -= *nSamplesRendered;
1324 7939142 : st_ivas->hTcBuffer->n_samples_rendered += *nSamplesRendered;
1325 :
1326 : /* update global combined orientation start index */
1327 7939142 : ivas_combined_orientation_update_start_index( st_ivas->hCombinedOrientationData, *nSamplesRendered );
1328 :
1329 7939142 : if ( st_ivas->hTcBuffer->n_samples_discard > 0 )
1330 : {
1331 4140 : for ( n = 0; n < min( MAX_OUTPUT_CHANNELS, ivas_get_nchan_buffers_dec( st_ivas, st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ) ); n++ )
1332 : {
1333 3522 : p_output[n] += st_ivas->hTcBuffer->n_samples_discard;
1334 : }
1335 618 : *nSamplesRendered -= st_ivas->hTcBuffer->n_samples_discard;
1336 618 : st_ivas->hTcBuffer->n_samples_discard = 0;
1337 : }
1338 :
1339 7939142 : if ( output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM )
1340 : {
1341 347957 : nchan_out_syn_output = BINAURAL_CHANNELS * st_ivas->hSplitBinRend->splitrend.multiBinPoseData.num_poses;
1342 : #ifdef TMP_1342_WORKAROUND_DEC_FLUSH_BROKEN_IN_SR
1343 347957 : if ( st_ivas->flushing )
1344 : {
1345 503 : nchan_out_syn_output = BINAURAL_CHANNELS;
1346 : }
1347 : #endif
1348 : }
1349 : else
1350 : {
1351 7591185 : nchan_out_syn_output = nchan_out;
1352 : }
1353 :
1354 7939142 : if ( is_split_rendering_enabled( st_ivas->hDecoderConfig, st_ivas->hRenderConfig ) == 0 )
1355 : {
1356 7591185 : if ( st_ivas->ivas_format != MONO_FORMAT )
1357 : {
1358 : #ifndef DISABLE_LIMITER
1359 7531375 : ivas_limiter_dec( st_ivas->hLimiter, p_output, nchan_out, *nSamplesRendered, st_ivas->BER_detect );
1360 : #endif
1361 : }
1362 : }
1363 :
1364 7939142 : switch ( pcm_resolution )
1365 : {
1366 7591688 : case PCM_INT16:
1367 : #ifdef DEBUGGING
1368 : st_ivas->noClipping +=
1369 : #endif
1370 7591688 : ivas_syn_output( p_output, *nSamplesRendered, nchan_out_syn_output, (int16_t *) data );
1371 :
1372 7591688 : break;
1373 347454 : case PCM_FLOAT32:
1374 347454 : ivas_buffer_deinterleaved_to_interleaved( p_output, nchan_out_syn_output, *nSamplesRendered, (float *) data );
1375 347454 : break;
1376 0 : default:
1377 0 : error = IVAS_ERR_UNKNOWN;
1378 0 : break;
1379 : }
1380 :
1381 7939142 : *nSamplesAvailableNext = st_ivas->hTcBuffer->n_samples_available;
1382 :
1383 7939142 : pop_wmops();
1384 7939142 : return IVAS_ERR_OK;
1385 : }
1386 :
1387 :
1388 : /*--------------------------------------------------------------------------*
1389 : * ivas_jbm_dec_flush_renderer()
1390 : *
1391 : * Flush samples if renderer granularity changes on a bitrate change
1392 : *--------------------------------------------------------------------------*/
1393 :
1394 1836 : ivas_error ivas_jbm_dec_flush_renderer(
1395 : Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
1396 : const int16_t tc_granularity_new, /* i : new renderer granularity */
1397 : const RENDERER_TYPE renderer_type_old, /* i : old renderer type */
1398 : const AUDIO_CONFIG intern_config_old, /* i : old internal config */
1399 : const IVAS_OUTPUT_SETUP_HANDLE hIntSetupOld, /* i : old internal output setup */
1400 : const MC_MODE mc_mode_old, /* i : old MC mode */
1401 : const ISM_MODE ism_mode_old, /* i : old ISM mode */
1402 : uint16_t *nSamplesRendered, /* o : number of samples flushed */
1403 : const PCM_RESOLUTION pcm_resolution, /* i : type for the decoded PCM resolution */
1404 : void *data /* o : output synthesis signal */
1405 : )
1406 : {
1407 : ivas_error error;
1408 : int16_t n_samples_still_available;
1409 : int16_t n_slots_still_available;
1410 : int16_t n_samples_to_render;
1411 : DECODER_TC_BUFFER_HANDLE hTcBuffer;
1412 : float *p_output[MAX_LS_CHANNELS + MAX_NUM_OBJECTS];
1413 :
1414 1836 : if ( !st_ivas->hDecoderConfig->Opt_tsm )
1415 : {
1416 0 : return IVAS_ERR_OK;
1417 : }
1418 :
1419 1836 : *nSamplesRendered = 0;
1420 1836 : hTcBuffer = st_ivas->hTcBuffer;
1421 :
1422 : /* get number of possible slots in new granularity */
1423 1836 : n_samples_still_available = hTcBuffer->n_samples_buffered - hTcBuffer->n_samples_rendered;
1424 1836 : n_slots_still_available = n_samples_still_available / tc_granularity_new;
1425 1836 : *nSamplesRendered = n_slots_still_available * tc_granularity_new;
1426 1836 : n_samples_to_render = *nSamplesRendered;
1427 1836 : n_samples_still_available -= n_samples_to_render;
1428 1836 : assert( n_samples_still_available < tc_granularity_new );
1429 :
1430 : /* update combined orientation access index */
1431 1836 : ivas_combined_orientation_set_to_start_index( st_ivas->hCombinedOrientationData );
1432 :
1433 1836 : if ( n_slots_still_available )
1434 : {
1435 : int16_t ch_idx;
1436 :
1437 : /* render available full slots (with new lower granularity) */
1438 3870 : for ( ch_idx = 0; ch_idx < max( hTcBuffer->nchan_transport_jbm, hTcBuffer->nchan_buffer_full ); ch_idx++ )
1439 : {
1440 : /* move it at the beginning of the TC buffer with zero padding */
1441 3255 : mvr2r( hTcBuffer->tc_buffer_old[ch_idx], hTcBuffer->tc[ch_idx], n_samples_to_render );
1442 3255 : set_zero( hTcBuffer->tc[ch_idx] + n_samples_to_render, hTcBuffer->n_samples_granularity - n_samples_to_render );
1443 : }
1444 :
1445 : /* simple change of the slot info */
1446 615 : hTcBuffer->num_slots = 1;
1447 615 : hTcBuffer->nb_subframes = 1;
1448 615 : hTcBuffer->subframes_rendered = 0;
1449 615 : hTcBuffer->slots_rendered = 0;
1450 615 : hTcBuffer->subframe_nbslots[0] = 1;
1451 615 : hTcBuffer->n_samples_buffered = hTcBuffer->n_samples_granularity + n_samples_still_available;
1452 615 : hTcBuffer->n_samples_available = 0;
1453 615 : hTcBuffer->n_samples_flushed = n_samples_to_render;
1454 615 : hTcBuffer->n_samples_rendered = 0;
1455 :
1456 12915 : for ( ch_idx = 0; ch_idx < MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS; ch_idx++ )
1457 : {
1458 12300 : p_output[ch_idx] = st_ivas->p_output_f[ch_idx];
1459 : }
1460 :
1461 615 : if ( st_ivas->ivas_format == ISM_FORMAT )
1462 : {
1463 237 : if ( ism_mode_old == ISM_MODE_DISC )
1464 : {
1465 : /* Binaural rendering */
1466 237 : if ( renderer_type_old == RENDERER_BINAURAL_OBJECTS_TD )
1467 : {
1468 216 : if ( ( error = ivas_td_binaural_renderer_sf( st_ivas, p_output, hTcBuffer->n_samples_granularity ) ) != IVAS_ERR_OK )
1469 : {
1470 0 : return error;
1471 : }
1472 : }
1473 21 : else if ( renderer_type_old == RENDERER_BINAURAL_MIXER_CONV_ROOM )
1474 : {
1475 : /* Convert to CICPxx; used also for ISM->CICP19->binaural_room rendering */
1476 21 : set_f( st_ivas->hIsmRendererData->interpolator, 1.0f, hTcBuffer->n_samples_granularity );
1477 :
1478 21 : ivas_ism_render_sf( st_ivas, renderer_type_old, p_output, hTcBuffer->n_samples_granularity );
1479 :
1480 21 : if ( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, IVAS_AUDIO_CONFIG_7_1_4, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR, st_ivas->hDecoderConfig, NULL,
1481 21 : NULL, NULL, st_ivas->hTcBuffer, p_output, p_output, hTcBuffer->n_samples_granularity, st_ivas->hDecoderConfig->output_Fs, 0 ) ) != IVAS_ERR_OK )
1482 : {
1483 0 : return error;
1484 : }
1485 : }
1486 : }
1487 : else
1488 : {
1489 0 : return IVAS_ERROR( IVAS_ERR_WRONG_MODE, "Wrong ISM_MODE in VoIP renderer flushing!" );
1490 : }
1491 : }
1492 378 : else if ( st_ivas->ivas_format == MC_FORMAT )
1493 : {
1494 6 : if ( mc_mode_old == MC_MODE_MCT )
1495 : {
1496 6 : int16_t crendInPlaceRotation = FALSE;
1497 :
1498 6 : if ( st_ivas->transport_config != intern_config_old && ( intern_config_old == IVAS_AUDIO_CONFIG_FOA || intern_config_old == IVAS_AUDIO_CONFIG_HOA2 || intern_config_old == IVAS_AUDIO_CONFIG_HOA3 ) )
1499 : {
1500 3 : if ( ( st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe ) < ( hIntSetupOld->nchan_out_woLFE + hIntSetupOld->num_lfe ) )
1501 : {
1502 3 : crendInPlaceRotation = TRUE;
1503 3 : ivas_mc2sba( st_ivas->hTransSetup, hTcBuffer->tc, p_output, hTcBuffer->n_samples_granularity, hIntSetupOld->ambisonics_order, GAIN_LFE );
1504 : }
1505 : }
1506 6 : if ( renderer_type_old == RENDERER_BINAURAL_MIXER_CONV || renderer_type_old == RENDERER_BINAURAL_MIXER_CONV_ROOM )
1507 : {
1508 3 : if ( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, intern_config_old, st_ivas->hOutSetup.output_config, st_ivas->hDecoderConfig, st_ivas->hCombinedOrientationData,
1509 3 : hIntSetupOld, st_ivas->hEFAPdata, st_ivas->hTcBuffer, crendInPlaceRotation ? p_output : st_ivas->hTcBuffer->tc, p_output, hTcBuffer->n_samples_granularity, st_ivas->hDecoderConfig->output_Fs, 0 ) ) != IVAS_ERR_OK )
1510 : {
1511 0 : return error;
1512 : }
1513 :
1514 3 : ivas_binaural_add_LFE( st_ivas, hTcBuffer->n_samples_granularity, st_ivas->hTcBuffer->tc, p_output );
1515 : }
1516 3 : else if ( renderer_type_old == RENDERER_BINAURAL_OBJECTS_TD )
1517 : {
1518 3 : if ( ( error = ivas_td_binaural_renderer_sf( st_ivas, p_output, hTcBuffer->n_samples_granularity ) ) != IVAS_ERR_OK )
1519 : {
1520 0 : return error;
1521 : }
1522 :
1523 3 : ivas_binaural_add_LFE( st_ivas, hTcBuffer->n_samples_granularity, st_ivas->hTcBuffer->tc, p_output );
1524 : }
1525 : else
1526 : {
1527 0 : return IVAS_ERROR( IVAS_ERR_WRONG_MODE, "Wrong renderer in MCT VoIP renderer flushing!" );
1528 : }
1529 : }
1530 : else
1531 : {
1532 0 : return IVAS_ERROR( IVAS_ERR_WRONG_MODE, "Wrong MC_MODE in VoIP renderer flushing!" );
1533 : }
1534 : }
1535 372 : else if ( st_ivas->ivas_format == MASA_ISM_FORMAT || st_ivas->ivas_format == MASA_FORMAT )
1536 : {
1537 303 : if ( ism_mode_old == ISM_MASA_MODE_DISC )
1538 : {
1539 : float *tc_local[MAX_NUM_OBJECTS];
1540 : int16_t last_dirac_md_idx;
1541 : uint16_t nSamplesAvailableNext;
1542 : ISM_MODE ism_mode_orig;
1543 : RENDERER_TYPE renderer_type_orig;
1544 : int32_t ivas_total_brate;
1545 :
1546 : /* copy from ISM delay buffer to the correct place in TCs */
1547 1515 : for ( ch_idx = 0; ch_idx < st_ivas->nchan_ism; ch_idx++ )
1548 : {
1549 1212 : tc_local[ch_idx] = &st_ivas->hTcBuffer->tc[ch_idx + 2][hTcBuffer->n_samples_rendered];
1550 1212 : mvr2r( st_ivas->hMasaIsmData->delayBuffer[ch_idx], tc_local[ch_idx], st_ivas->hMasaIsmData->delayBuffer_size );
1551 : }
1552 :
1553 : /* to render flushed samples, use configuration from the last received frame */
1554 303 : ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate;
1555 303 : renderer_type_orig = st_ivas->renderer_type;
1556 303 : ism_mode_orig = st_ivas->ism_mode;
1557 303 : st_ivas->ism_mode = ism_mode_old;
1558 303 : st_ivas->renderer_type = renderer_type_old;
1559 303 : st_ivas->hDecoderConfig->ivas_total_brate = st_ivas->hDecoderConfig->last_ivas_total_brate;
1560 303 : last_dirac_md_idx = st_ivas->hSpatParamRendCom->render_to_md_map[st_ivas->hSpatParamRendCom->slots_rendered - 1];
1561 :
1562 : /* transfer adapted sf info from hTcBuffer to DirAC */
1563 303 : st_ivas->hSpatParamRendCom->nb_subframes = 1;
1564 303 : st_ivas->hSpatParamRendCom->subframes_rendered = 0;
1565 303 : st_ivas->hSpatParamRendCom->subframe_nbslots[0] = JBM_CLDFB_SLOTS_IN_SUBFRAME;
1566 303 : st_ivas->hSpatParamRendCom->slots_rendered = 0;
1567 303 : st_ivas->hSpatParamRendCom->num_slots = JBM_CLDFB_SLOTS_IN_SUBFRAME;
1568 303 : set_s( st_ivas->hSpatParamRendCom->render_to_md_map, last_dirac_md_idx, n_slots_still_available );
1569 :
1570 303 : if ( ( error = ivas_omasa_dirac_td_binaural_jbm( st_ivas, (uint16_t) hTcBuffer->n_samples_granularity, nSamplesRendered, &nSamplesAvailableNext, CPE_CHANNELS, p_output ) ) != IVAS_ERR_OK )
1571 : {
1572 0 : return error;
1573 : }
1574 :
1575 : /* restore original configuration */
1576 303 : st_ivas->ism_mode = ism_mode_orig;
1577 303 : st_ivas->renderer_type = renderer_type_orig;
1578 303 : st_ivas->hDecoderConfig->ivas_total_brate = ivas_total_brate;
1579 : }
1580 : }
1581 69 : else if ( st_ivas->ivas_format == SBA_ISM_FORMAT )
1582 : {
1583 69 : if ( ism_mode_old == ISM_SBA_MODE_DISC )
1584 : {
1585 : float *tc_local[MAX_TRANSPORT_CHANNELS];
1586 : int16_t last_spar_md_idx;
1587 : int16_t last_dirac_md_idx;
1588 : uint16_t nSamplesAvailableNext;
1589 : ISM_MODE ism_mode_orig;
1590 : RENDERER_TYPE renderer_type_orig;
1591 : int32_t ivas_total_brate;
1592 :
1593 : /* to render flushed samples, use configuration from the last received frame */
1594 69 : ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate;
1595 69 : renderer_type_orig = st_ivas->renderer_type;
1596 69 : ism_mode_orig = st_ivas->ism_mode;
1597 69 : st_ivas->ism_mode = ism_mode_old;
1598 69 : st_ivas->renderer_type = renderer_type_old;
1599 69 : st_ivas->hDecoderConfig->ivas_total_brate = st_ivas->hDecoderConfig->last_ivas_total_brate;
1600 69 : last_spar_md_idx = st_ivas->hSpar->render_to_md_map[st_ivas->hSpar->slots_rendered - 1];
1601 69 : last_dirac_md_idx = st_ivas->hSpatParamRendCom->render_to_md_map[st_ivas->hSpatParamRendCom->slots_rendered - 1];
1602 : #ifdef DEBUGGING
1603 : assert( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV );
1604 : #endif
1605 :
1606 : /* copy from ISM delay buffer to the correct place in TCs */
1607 207 : for ( ch_idx = 0; ch_idx < st_ivas->nchan_ism; ch_idx++ )
1608 : {
1609 138 : tc_local[ch_idx] = &st_ivas->hTcBuffer->tc[ch_idx][hTcBuffer->n_samples_rendered];
1610 138 : mvr2r( st_ivas->hSbaIsmData->delayBuffer[ch_idx], tc_local[ch_idx], st_ivas->hSbaIsmData->delayBuffer_size );
1611 : }
1612 :
1613 : /* transfer adapted sf info from hTcBuffer to SPAR and DirAC */
1614 69 : st_ivas->hSpar->nb_subframes = 1;
1615 69 : st_ivas->hSpar->subframes_rendered = 0;
1616 69 : st_ivas->hSpar->subframe_nbslots[0] = JBM_CLDFB_SLOTS_IN_SUBFRAME;
1617 69 : st_ivas->hSpar->slots_rendered = 0;
1618 69 : st_ivas->hSpar->num_slots = JBM_CLDFB_SLOTS_IN_SUBFRAME;
1619 69 : st_ivas->hSpatParamRendCom->nb_subframes = 1;
1620 69 : st_ivas->hSpatParamRendCom->subframes_rendered = 0;
1621 69 : st_ivas->hSpatParamRendCom->subframe_nbslots[0] = JBM_CLDFB_SLOTS_IN_SUBFRAME;
1622 69 : st_ivas->hSpatParamRendCom->slots_rendered = 0;
1623 69 : st_ivas->hSpatParamRendCom->num_slots = JBM_CLDFB_SLOTS_IN_SUBFRAME;
1624 :
1625 : /* also adapt md maps, just use the last index */
1626 69 : set_s( st_ivas->hSpar->render_to_md_map, last_spar_md_idx, n_slots_still_available );
1627 69 : set_s( st_ivas->hSpatParamRendCom->render_to_md_map, last_dirac_md_idx, n_slots_still_available );
1628 :
1629 : /* render the last subframe */
1630 69 : if ( ( error = ivas_osba_dirac_td_binaural_jbm( st_ivas, (uint16_t) hTcBuffer->n_samples_granularity, nSamplesRendered, &nSamplesAvailableNext, p_output ) ) != IVAS_ERR_OK )
1631 : {
1632 0 : return error;
1633 : }
1634 :
1635 : /* restore original configuration */
1636 69 : st_ivas->ism_mode = ism_mode_orig;
1637 69 : st_ivas->renderer_type = renderer_type_orig;
1638 69 : st_ivas->hDecoderConfig->ivas_total_brate = ivas_total_brate;
1639 : }
1640 : }
1641 : else
1642 : {
1643 0 : return IVAS_ERROR( IVAS_ERR_WRONG_MODE, "Wrong IVAS format in VoIP renderer flushing!" );
1644 : }
1645 :
1646 615 : hTcBuffer->n_samples_rendered = hTcBuffer->n_samples_granularity;
1647 : }
1648 :
1649 : /* update global combined orientation start index */
1650 1836 : ivas_combined_orientation_update_start_index( st_ivas->hCombinedOrientationData, *nSamplesRendered );
1651 :
1652 1836 : *nSamplesRendered = n_samples_to_render;
1653 :
1654 : /* Only write out the valid data*/
1655 1836 : if ( is_split_rendering_enabled( st_ivas->hDecoderConfig, st_ivas->hRenderConfig ) == 0 )
1656 : {
1657 1836 : if ( st_ivas->ivas_format != MONO_FORMAT )
1658 : {
1659 : #ifndef DISABLE_LIMITER
1660 1836 : ivas_limiter_dec( st_ivas->hLimiter, p_output, st_ivas->hDecoderConfig->nchan_out, *nSamplesRendered, st_ivas->BER_detect );
1661 : #endif
1662 : }
1663 : }
1664 :
1665 1836 : switch ( pcm_resolution )
1666 : {
1667 1836 : case PCM_INT16:
1668 : #ifdef DEBUGGING
1669 : st_ivas->noClipping +=
1670 : #endif
1671 1836 : ivas_syn_output( p_output, *nSamplesRendered, st_ivas->hDecoderConfig->nchan_out, (int16_t *) data );
1672 1836 : break;
1673 0 : case PCM_FLOAT32:
1674 0 : ivas_buffer_deinterleaved_to_interleaved( p_output, st_ivas->hDecoderConfig->nchan_out, *nSamplesRendered, (float *) data );
1675 0 : break;
1676 0 : default:
1677 0 : error = IVAS_ERR_UNKNOWN;
1678 0 : break;
1679 : }
1680 :
1681 1836 : return IVAS_ERR_OK;
1682 : }
1683 :
1684 :
1685 : /*--------------------------------------------------------------------------*
1686 : * ivas_jbm_dec_set_discard_samples()
1687 : *
1688 : * Set number of samples to discard in the first subframe if the renderer granularity changes on a bitrate change
1689 : *--------------------------------------------------------------------------*/
1690 :
1691 4626 : ivas_error ivas_jbm_dec_set_discard_samples(
1692 : Decoder_Struct *st_ivas /* i/o: main IVAS decoder structre */
1693 : )
1694 : {
1695 : int16_t nMaxSlotsPerSubframe, nSlotsInFirstSubframe;
1696 :
1697 : /* render first frame with front zero padding and discarding those samples */
1698 4626 : nMaxSlotsPerSubframe = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / ( FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES ) ) / st_ivas->hTcBuffer->n_samples_granularity;
1699 4626 : nSlotsInFirstSubframe = nMaxSlotsPerSubframe - st_ivas->hTcBuffer->subframe_nbslots[st_ivas->hTcBuffer->nb_subframes - 1];
1700 4626 : if ( nSlotsInFirstSubframe > 0 )
1701 : {
1702 618 : st_ivas->hTcBuffer->n_samples_discard = ( nMaxSlotsPerSubframe - nSlotsInFirstSubframe ) * st_ivas->hTcBuffer->n_samples_granularity;
1703 : /* set last subframes number to max to ensure correct continuation */
1704 618 : st_ivas->hTcBuffer->subframe_nbslots[st_ivas->hTcBuffer->nb_subframes - 1] = nMaxSlotsPerSubframe;
1705 : }
1706 :
1707 4626 : return IVAS_ERR_OK;
1708 : }
1709 :
1710 :
1711 : /*--------------------------------------------------------------------------*
1712 : * ivas_jbm_dec_get_adapted_linear_interpolator()
1713 : *
1714 : * Get an interpolator that is adapted to time scale modified IVAS frame
1715 : *--------------------------------------------------------------------------*/
1716 :
1717 211578 : void ivas_jbm_dec_get_adapted_linear_interpolator(
1718 : const int16_t default_interp_length, /* i : default length of the (full-frame) interpolator */
1719 : const int16_t interp_length, /* i : length of the interpolator to be created */
1720 : float *interpolator /* o : the interpolator */
1721 : )
1722 : {
1723 : int16_t jbm_segment_len, idx;
1724 : float dec;
1725 : #ifdef DEBUGGING
1726 : assert( default_interp_length % 2 == 0 );
1727 : #endif
1728 :
1729 211578 : jbm_segment_len = ( default_interp_length >> 1 );
1730 211578 : dec = 1.0f / default_interp_length;
1731 :
1732 211578 : interpolator[interp_length - 1] = 1.0f;
1733 5968100 : for ( idx = interp_length - 2; idx >= jbm_segment_len; idx-- )
1734 : {
1735 5756522 : interpolator[idx] = max( 0.0f, interpolator[idx + 1] - dec );
1736 : }
1737 :
1738 211578 : if ( interpolator[idx + 1] > 0.0f )
1739 : {
1740 211419 : dec = interpolator[idx + 1] / ( jbm_segment_len + 1 );
1741 6004291 : for ( ; idx >= 0; idx-- )
1742 : {
1743 5792872 : interpolator[idx] = interpolator[idx + 1] - dec;
1744 : }
1745 : }
1746 : else
1747 : {
1748 159 : set_f( interpolator, 0.0f, idx + 1 );
1749 : }
1750 :
1751 211578 : return;
1752 : }
1753 :
1754 :
1755 : /*--------------------------------------------------------------------------*
1756 : * ivas_jbm_dec_get_adapted_subframes()
1757 : *
1758 : * Get an interpolator that is adapted to time scale modified IVAS frame
1759 : *--------------------------------------------------------------------------*/
1760 :
1761 5902999 : void ivas_jbm_dec_get_adapted_subframes(
1762 : const int16_t nCldfbTs, /* i : number of time slots in the current frame */
1763 : int16_t *subframe_nbslots, /* i/o: subframe grid */
1764 : int16_t *nb_subframes /* i/o: number of subframes in the frame */
1765 : )
1766 : {
1767 : uint16_t nSlotsInLastSubframe, nSlotsInFirstSubframe;
1768 5902999 : uint16_t nCldfbSlotsLocal = nCldfbTs;
1769 :
1770 : /* get last subframe size from previous frame, determine how many slots have to be processed
1771 : in the first subframe (i.e. potential leftover of a 5ms subframe) */
1772 5902999 : nSlotsInFirstSubframe = ( PARAM_MC_MAX_NSLOTS_IN_SUBFRAME - subframe_nbslots[*nb_subframes - 1] );
1773 5902999 : *nb_subframes = 0;
1774 5902999 : if ( nSlotsInFirstSubframe > 0 )
1775 : {
1776 67621 : *nb_subframes = 1;
1777 67621 : nCldfbSlotsLocal -= nSlotsInFirstSubframe;
1778 : }
1779 :
1780 5902999 : *nb_subframes += (int16_t) ceilf( (float) nCldfbSlotsLocal / (float) PARAM_MC_MAX_NSLOTS_IN_SUBFRAME );
1781 5902999 : nSlotsInLastSubframe = nCldfbSlotsLocal % PARAM_MC_MAX_NSLOTS_IN_SUBFRAME;
1782 :
1783 5902999 : set_s( subframe_nbslots, 0, MAX_JBM_SUBFRAMES_5MS );
1784 5902999 : set_s( subframe_nbslots, PARAM_MC_MAX_NSLOTS_IN_SUBFRAME, *nb_subframes );
1785 :
1786 5902999 : if ( nSlotsInFirstSubframe > 0 )
1787 : {
1788 67621 : subframe_nbslots[0] = nSlotsInFirstSubframe;
1789 : }
1790 :
1791 5902999 : if ( nSlotsInLastSubframe > 0 )
1792 : {
1793 67960 : subframe_nbslots[*nb_subframes - 1] = nSlotsInLastSubframe;
1794 : }
1795 :
1796 5902999 : return;
1797 : }
1798 :
1799 :
1800 : /*--------------------------------------------------------------------------*
1801 : * ivas_jbm_dec_get_adapted_linear_interpolator()
1802 : *
1803 : * Get an meta data map adapted to a time scale modified IVAS frame
1804 : *--------------------------------------------------------------------------*/
1805 :
1806 5259186 : void ivas_jbm_dec_get_md_map(
1807 : const int16_t default_len, /* i : default frame length in metadata slots */
1808 : const int16_t len, /* i : length of the modfied frames in metadata slots */
1809 : const int16_t subframe_len, /* i : default length of a subframe */
1810 : const int16_t offset, /* i : current read offset into the md buffer */
1811 : const int16_t buf_len, /* i : length of the metadata buffer */
1812 : int16_t *map /* o : metadata index map */
1813 : )
1814 : {
1815 : int16_t jbm_segment_len, map_idx, src_idx, src_idx_map;
1816 : float dec, src_idx_f;
1817 :
1818 : #ifdef DEBUGGING
1819 : assert( default_len % 2 == 0 );
1820 : #endif
1821 5259186 : jbm_segment_len = ( default_len >> 1 );
1822 5259186 : dec = 1.0f / default_len;
1823 :
1824 47346996 : for ( map_idx = len - 1, src_idx = default_len - 1; map_idx >= jbm_segment_len; map_idx--, src_idx-- )
1825 : {
1826 42087810 : src_idx_map = max( 0, src_idx / subframe_len );
1827 42087810 : map[map_idx] = ( offset + src_idx_map ) % buf_len;
1828 : }
1829 :
1830 : /* changed part (first segment), interpolate index to parameters
1831 : (we do not want to interpolate and smooth acutal direction/diffuseness values even more) */
1832 5259186 : if ( src_idx >= 0 )
1833 : {
1834 5258157 : dec = ( (float) ( src_idx + 1 ) ) / ( (float) jbm_segment_len );
1835 5258157 : src_idx_f = (float) ( src_idx + 1 ) - dec;
1836 47323413 : for ( ; map_idx >= 0; map_idx-- )
1837 : {
1838 42065256 : src_idx = max( 0, ( (int16_t) round_f( src_idx_f ) ) / subframe_len );
1839 42065256 : map[map_idx] = ( offset + src_idx ) % buf_len;
1840 42065256 : src_idx_f -= dec;
1841 : }
1842 : }
1843 : else
1844 : {
1845 1029 : set_s( map, offset, map_idx + 1 );
1846 : }
1847 :
1848 5259186 : return;
1849 : }
1850 :
1851 :
1852 : /*--------------------------------------------------------------------------*
1853 : * ivas_jbm_dec_get_md_map_even_spacing()
1854 : *
1855 : * Get an meta data map adapted to a time scale modified IVAS frame. Distribute slots evenly across the modified frame.
1856 : *--------------------------------------------------------------------------*/
1857 :
1858 580007 : void ivas_jbm_dec_get_md_map_even_spacing(
1859 : const int16_t len, /* i : length of the modfied frames in metadata slots */
1860 : const int16_t subframe_len, /* i : default length of a subframe */
1861 : const int16_t offset, /* i : current read offset into the md buffer */
1862 : const int16_t buf_len, /* i : length of the metadata buffer */
1863 : int16_t *map /* o : metadata index map */
1864 : )
1865 : {
1866 : int16_t map_idx, sf_idx, sf_length, increment, subframes_written;
1867 : float decimal, decimal_sum, eps;
1868 : int16_t subframe_map_length[MAX_PARAM_SPATIAL_SUBFRAMES];
1869 :
1870 : /* subframe map length */
1871 580007 : sf_length = len / subframe_len;
1872 580007 : if ( len % subframe_len == 0 )
1873 : {
1874 : /* even subframes */
1875 2899075 : for ( sf_idx = 0; sf_idx < MAX_PARAM_SPATIAL_SUBFRAMES; sf_idx++ )
1876 : {
1877 2319260 : subframe_map_length[sf_idx] = sf_length;
1878 : }
1879 : }
1880 : else
1881 : {
1882 : /* uneven subframes */
1883 192 : decimal = ( (float) len / (float) subframe_len ) - (float) sf_length;
1884 192 : decimal_sum = decimal;
1885 192 : eps = 0.001f;
1886 960 : for ( sf_idx = 0; sf_idx < MAX_PARAM_SPATIAL_SUBFRAMES; sf_idx++ )
1887 : {
1888 768 : increment = (int16_t) floorf( decimal_sum + eps );
1889 768 : subframe_map_length[sf_idx] = sf_length + increment;
1890 768 : if ( increment > 0 )
1891 : {
1892 429 : decimal_sum -= 1.0f;
1893 : }
1894 768 : decimal_sum += decimal;
1895 : }
1896 : }
1897 :
1898 : /* map slots to subframes */
1899 580007 : sf_idx = 0;
1900 580007 : subframes_written = 0;
1901 9862008 : for ( map_idx = 0; map_idx < len; map_idx++ )
1902 : {
1903 9282001 : map[map_idx] = ( offset + sf_idx ) % buf_len;
1904 9282001 : if ( map_idx - subframes_written >= subframe_map_length[sf_idx] - 1 )
1905 : {
1906 2320028 : subframes_written += subframe_map_length[sf_idx];
1907 2320028 : ++sf_idx;
1908 : }
1909 : }
1910 :
1911 580007 : return;
1912 : }
1913 :
1914 :
1915 : /*--------------------------------------------------------------------------*
1916 : * ivas_jbm_dec_get_num_tc_channels()
1917 : *
1918 : * Get the number of transport channels provided by the JBM transport channel decode function
1919 : *--------------------------------------------------------------------------*/
1920 :
1921 142068 : int16_t ivas_jbm_dec_get_num_tc_channels(
1922 : Decoder_Struct *st_ivas /* i : IVAS decoder handle */
1923 : )
1924 : {
1925 : int16_t num_tc;
1926 : int32_t ivas_total_brate;
1927 : AUDIO_CONFIG output_config;
1928 :
1929 :
1930 142068 : if ( st_ivas->renderer_type == RENDERER_DISABLE )
1931 : {
1932 13776 : num_tc = st_ivas->hDecoderConfig->nchan_out;
1933 : }
1934 : else
1935 : {
1936 128292 : num_tc = st_ivas->nchan_transport;
1937 : }
1938 142068 : output_config = st_ivas->hDecoderConfig->output_config;
1939 :
1940 142068 : ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate;
1941 :
1942 : #ifdef FIX_1435_MOVE_STEREO_PANNING
1943 142068 : if ( st_ivas->ivas_format == MONO_FORMAT )
1944 : {
1945 495 : num_tc = 1;
1946 : }
1947 141573 : else if ( st_ivas->ivas_format == STEREO_FORMAT && st_ivas->hDecoderConfig->nchan_out == 1 )
1948 : #else
1949 : if ( st_ivas->ivas_format == STEREO_FORMAT && st_ivas->hDecoderConfig->nchan_out == 1 )
1950 : #endif
1951 : {
1952 234 : num_tc = 1;
1953 : }
1954 141339 : else if ( st_ivas->ivas_format == ISM_FORMAT )
1955 : {
1956 22214 : if ( st_ivas->renderer_type == RENDERER_MONO_DOWNMIX )
1957 : {
1958 1122 : num_tc = 1;
1959 : }
1960 : }
1961 119125 : else if ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == MASA_FORMAT )
1962 : {
1963 38027 : if ( st_ivas->sba_dirac_stereo_flag )
1964 : {
1965 516 : num_tc = CPE_CHANNELS;
1966 : }
1967 37511 : else if ( st_ivas->ivas_format == MASA_FORMAT && ivas_total_brate < MASA_STEREO_MIN_BITRATE && ( ivas_total_brate > IVAS_SID_5k2 || ( ivas_total_brate <= IVAS_SID_5k2 && st_ivas->nCPE > 0 && st_ivas->hCPE[0] != NULL && st_ivas->hCPE[0]->nchan_out == 1 ) ) )
1968 : {
1969 9669 : num_tc = 1; /* Only one channel transported */
1970 : }
1971 :
1972 38027 : if ( st_ivas->ivas_format == MASA_FORMAT && st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL && st_ivas->nchan_transport == 2 && st_ivas->hDecoderConfig->ivas_total_brate < MASA_STEREO_MIN_BITRATE && st_ivas->hDecoderConfig->ivas_total_brate > IVAS_SID_5k2 )
1973 : {
1974 541 : num_tc = CPE_CHANNELS;
1975 : }
1976 38027 : if ( st_ivas->ivas_format == SBA_FORMAT )
1977 : {
1978 :
1979 17447 : if ( num_tc == 3 )
1980 : {
1981 2868 : num_tc++;
1982 : }
1983 : }
1984 : }
1985 81098 : else if ( st_ivas->ivas_format == MASA_ISM_FORMAT )
1986 : {
1987 26117 : if ( st_ivas->hDecoderConfig->output_config != IVAS_AUDIO_CONFIG_EXTERNAL )
1988 : {
1989 24393 : if ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ )
1990 : {
1991 11390 : num_tc++;
1992 : }
1993 13003 : else if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC )
1994 : {
1995 13003 : num_tc += st_ivas->nchan_ism;
1996 : }
1997 : }
1998 : }
1999 54981 : else if ( st_ivas->ivas_format == SBA_ISM_FORMAT )
2000 : {
2001 40574 : if ( st_ivas->sba_dirac_stereo_flag )
2002 : {
2003 2730 : num_tc = CPE_CHANNELS;
2004 : }
2005 40574 : if ( num_tc == 3 )
2006 : {
2007 6720 : num_tc++;
2008 : }
2009 40574 : if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC )
2010 : {
2011 17390 : num_tc += st_ivas->nchan_ism;
2012 : }
2013 : }
2014 14407 : else if ( st_ivas->ivas_format == MC_FORMAT )
2015 : {
2016 13079 : if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_MONO )
2017 : {
2018 755 : num_tc = 1;
2019 : }
2020 12324 : else if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_STEREO )
2021 : {
2022 818 : num_tc = 2;
2023 : }
2024 11506 : else if ( st_ivas->mc_mode == MC_MODE_MCT )
2025 : {
2026 : /* do all static dmx already in the TC decoder if less channels than transported... */
2027 6506 : if ( st_ivas->transport_config != st_ivas->intern_config && ( st_ivas->intern_config == IVAS_AUDIO_CONFIG_FOA || st_ivas->intern_config == IVAS_AUDIO_CONFIG_HOA2 || st_ivas->intern_config == IVAS_AUDIO_CONFIG_HOA3 ) )
2028 : {
2029 93 : if ( ( st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe ) >= ( st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe ) )
2030 : {
2031 0 : num_tc = st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe;
2032 : }
2033 : }
2034 6413 : else if ( ( st_ivas->renderer_type == RENDERER_MC || st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) && ( st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe ) >= ( st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe ) )
2035 : {
2036 1234 : num_tc = st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe;
2037 : }
2038 : }
2039 5000 : else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX )
2040 : {
2041 184 : num_tc = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS;
2042 : }
2043 4816 : else if ( st_ivas->mc_mode == MC_MODE_MCMASA )
2044 : {
2045 3616 : if ( st_ivas->hOutSetup.separateChannelEnabled )
2046 : {
2047 478 : num_tc++;
2048 : }
2049 3616 : if ( st_ivas->hOutSetup.separateChannelEnabled && ( output_config == IVAS_AUDIO_CONFIG_5_1 || output_config == IVAS_AUDIO_CONFIG_7_1 ||
2050 383 : output_config == IVAS_AUDIO_CONFIG_5_1_4 || output_config == IVAS_AUDIO_CONFIG_7_1_4 ||
2051 320 : output_config == IVAS_AUDIO_CONFIG_5_1_2 || ( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM && st_ivas->hOutSetup.num_lfe > 0 ) ) )
2052 : {
2053 : /* LFE is synthesized in TD with the TCs*/
2054 158 : num_tc++;
2055 : }
2056 : }
2057 : }
2058 : #ifndef FIX_1435_MOVE_STEREO_PANNING
2059 : else if ( st_ivas->ivas_format == MONO_FORMAT && st_ivas->renderer_type == RENDERER_NON_DIEGETIC_DOWNMIX )
2060 : {
2061 : num_tc = MAX_OUTPUT_CHANNELS_IN_DIEGETIC_PAN;
2062 : }
2063 : #endif
2064 :
2065 142068 : return num_tc;
2066 : }
2067 :
2068 :
2069 : /*--------------------------------------------------------------------------*
2070 : * ivas_jbm_dec_get_render_granularity()
2071 : *
2072 : *
2073 : *--------------------------------------------------------------------------*/
2074 :
2075 : /*! r: render granularity */
2076 140977 : int16_t ivas_jbm_dec_get_render_granularity(
2077 : const RENDERER_TYPE renderer_type, /* i : renderer type */
2078 : const RENDERER_TYPE renderer_type_sec, /* i : secondary renderer type */
2079 : const int32_t output_Fs /* i : sampling rate */
2080 : )
2081 : {
2082 : int16_t render_granularity;
2083 :
2084 140977 : if ( renderer_type == RENDERER_BINAURAL_OBJECTS_TD || /* TD renderer */
2085 134529 : renderer_type == RENDERER_BINAURAL_MIXER_CONV || renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM || /* Crend */
2086 : renderer_type_sec == RENDERER_BINAURAL_OBJECTS_TD /* TD rend as a secondary renderer -> set the common granularity for both renderers */
2087 : )
2088 : {
2089 : /* 5 ms granularity */
2090 18046 : render_granularity = NS2SA( output_Fs, FRAME_SIZE_NS / MAX_PARAM_SPATIAL_SUBFRAMES );
2091 : }
2092 : else
2093 : {
2094 : /* 1.25 ms granularity */
2095 122931 : render_granularity = NS2SA( output_Fs, CLDFB_SLOT_NS );
2096 : }
2097 :
2098 140977 : return render_granularity;
2099 : }
2100 :
2101 :
2102 : /*--------------------------------------------------------------------------*
2103 : * ivas_jbm_dec_tc_audio_allocate()
2104 : *
2105 : * allocate and initialize TC audio buffer
2106 : *--------------------------------------------------------------------------*/
2107 :
2108 125736 : static ivas_error ivas_jbm_dec_tc_audio_allocate(
2109 : DECODER_TC_BUFFER_HANDLE hTcBuffer, /* i/o: JBM TSM buffer handle */
2110 : const int32_t output_Fs, /* i : output sampling rate */
2111 : const int16_t Opt_tsm /* i : TSM option flag */
2112 : )
2113 : {
2114 : int16_t nsamp_to_allocate;
2115 : int16_t ch_idx, n_samp_full, n_samp_residual, offset;
2116 :
2117 125736 : if ( Opt_tsm )
2118 : {
2119 54310 : n_samp_full = ( NS2SA( output_Fs, MAX_JBM_L_FRAME_NS ) );
2120 54310 : n_samp_full = max( n_samp_full, L_FRAME48k ); /* buffers are shared between 'hTcBuffer->tc[]' and 'p_output_f[]': ensure minimal length */
2121 54310 : n_samp_residual = hTcBuffer->n_samples_granularity - 1;
2122 : }
2123 : else
2124 : {
2125 71426 : n_samp_full = (int16_t) ( output_Fs / FRAMES_PER_SEC );
2126 71426 : n_samp_residual = 0;
2127 : }
2128 :
2129 125736 : nsamp_to_allocate = max( hTcBuffer->nchan_transport_jbm, hTcBuffer->nchan_buffer_full ) * n_samp_full;
2130 :
2131 125736 : if ( Opt_tsm )
2132 : {
2133 : /* note: this is stack memory buffer for time-scale modified audio signals */
2134 54310 : if ( ( hTcBuffer->tc_buffer = (float *) malloc( nsamp_to_allocate * sizeof( float ) ) ) == NULL )
2135 : {
2136 0 : return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for JBM TC Buffer\n" ) );
2137 : }
2138 54310 : set_zero( hTcBuffer->tc_buffer, nsamp_to_allocate );
2139 :
2140 54310 : offset = 0;
2141 275541 : for ( ch_idx = 0; ch_idx < max( hTcBuffer->nchan_transport_jbm, hTcBuffer->nchan_buffer_full ); ch_idx++ )
2142 : {
2143 221231 : hTcBuffer->tc[ch_idx] = &hTcBuffer->tc_buffer[offset];
2144 221231 : offset += n_samp_full;
2145 : }
2146 702039 : for ( ; ch_idx < MAX_INTERN_CHANNELS; ch_idx++ )
2147 : {
2148 647729 : hTcBuffer->tc[ch_idx] = NULL;
2149 : }
2150 :
2151 : /* memory buffer for TC audio samples not rendered in the previous frame */
2152 275541 : for ( ch_idx = 0; ch_idx < hTcBuffer->nchan_transport_internal; ch_idx++ )
2153 : {
2154 221231 : if ( ( hTcBuffer->tc_buffer_old[ch_idx] = (float *) malloc( n_samp_residual * sizeof( float ) ) ) == NULL )
2155 : {
2156 0 : return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for JBM TC Buffer\n" ) );
2157 : }
2158 221231 : set_zero( hTcBuffer->tc_buffer_old[ch_idx], n_samp_residual );
2159 : }
2160 702039 : for ( ; ch_idx < MAX_INTERN_CHANNELS; ch_idx++ )
2161 : {
2162 647729 : hTcBuffer->tc_buffer_old[ch_idx] = NULL;
2163 : }
2164 : }
2165 : else
2166 : {
2167 71426 : hTcBuffer->tc_buffer = NULL;
2168 :
2169 1214242 : for ( ch_idx = 0; ch_idx < MAX_INTERN_CHANNELS; ch_idx++ )
2170 : {
2171 1142816 : hTcBuffer->tc[ch_idx] = NULL;
2172 : }
2173 :
2174 1214242 : for ( ch_idx = 0; ch_idx < MAX_INTERN_CHANNELS; ch_idx++ )
2175 : {
2176 1142816 : hTcBuffer->tc_buffer_old[ch_idx] = NULL;
2177 : }
2178 : }
2179 :
2180 125736 : hTcBuffer->tc_buffer2 = NULL;
2181 :
2182 125736 : return IVAS_ERR_OK;
2183 : }
2184 :
2185 :
2186 : /*--------------------------------------------------------------------------*
2187 : * ivas_jbm_dec_tc_audio_deallocate()
2188 : *
2189 : * deallocate TC audio buffer
2190 : *--------------------------------------------------------------------------*/
2191 :
2192 125736 : static void ivas_jbm_dec_tc_audio_deallocate(
2193 : DECODER_TC_BUFFER_HANDLE hTcBuffer /* i/o: JBM TSM buffer handle */
2194 : )
2195 : {
2196 : int16_t ch_idx;
2197 :
2198 125736 : if ( hTcBuffer != NULL )
2199 : {
2200 125736 : if ( hTcBuffer->tc_buffer != NULL )
2201 : {
2202 923270 : for ( ch_idx = 0; ch_idx < MAX_INTERN_CHANNELS; ch_idx++ )
2203 : {
2204 868960 : hTcBuffer->tc[ch_idx] = NULL;
2205 : }
2206 :
2207 54310 : free( hTcBuffer->tc_buffer );
2208 54310 : hTcBuffer->tc_buffer = NULL;
2209 : }
2210 :
2211 2137512 : for ( ch_idx = 0; ch_idx < MAX_INTERN_CHANNELS; ch_idx++ )
2212 : {
2213 2011776 : if ( hTcBuffer->tc_buffer_old[ch_idx] != NULL )
2214 : {
2215 221231 : free( hTcBuffer->tc_buffer_old[ch_idx] );
2216 221231 : hTcBuffer->tc_buffer_old[ch_idx] = NULL;
2217 : }
2218 : }
2219 :
2220 125736 : if ( hTcBuffer->tc_buffer2 != NULL )
2221 : {
2222 104820 : free( hTcBuffer->tc_buffer2 );
2223 104820 : hTcBuffer->tc_buffer2 = NULL;
2224 : }
2225 : }
2226 :
2227 125736 : return;
2228 : }
2229 :
2230 :
2231 : /*--------------------------------------------------------------------------*
2232 : * ivas_jbm_dec_tc_buffer_open()
2233 : *
2234 : * open and initialize JBM transport channel buffer
2235 : *--------------------------------------------------------------------------*/
2236 :
2237 86033 : ivas_error ivas_jbm_dec_tc_buffer_open(
2238 : Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
2239 : const TC_BUFFER_MODE tc_buffer_mode, /* i : buffer mode */
2240 : const int16_t nchan_transport_jbm, /* i : number of real transport channels */
2241 : const int16_t nchan_transport_internal, /* i : number of totally buffered channels */
2242 : const int16_t nchan_full, /* i : number of channels to fully store */
2243 : const int16_t n_samples_granularity /* i : granularity of the renderer/buffer */
2244 : )
2245 : {
2246 : DECODER_TC_BUFFER_HANDLE hTcBuffer;
2247 : int16_t nMaxSlotsPerSubframe;
2248 : ivas_error error;
2249 :
2250 : /*-----------------------------------------------------------------*
2251 : * prepare library opening
2252 : *-----------------------------------------------------------------*/
2253 :
2254 86033 : if ( ( hTcBuffer = (DECODER_TC_BUFFER_HANDLE) malloc( sizeof( DECODER_TC_BUFFER ) ) ) == NULL )
2255 : {
2256 0 : return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for JBM TC Buffer\n" ) );
2257 : }
2258 :
2259 86033 : hTcBuffer->tc_buffer_mode = tc_buffer_mode;
2260 86033 : hTcBuffer->nchan_transport_jbm = nchan_transport_jbm;
2261 86033 : hTcBuffer->nchan_transport_internal = nchan_transport_internal;
2262 86033 : hTcBuffer->nchan_buffer_full = nchan_full;
2263 86033 : hTcBuffer->n_samples_granularity = n_samples_granularity;
2264 86033 : hTcBuffer->n_samples_available = 0;
2265 86033 : hTcBuffer->n_samples_buffered = 0;
2266 86033 : hTcBuffer->n_samples_rendered = 0;
2267 86033 : hTcBuffer->slots_rendered = 0;
2268 86033 : hTcBuffer->subframes_rendered = 0;
2269 86033 : hTcBuffer->n_samples_discard = 0;
2270 86033 : hTcBuffer->n_samples_flushed = 0;
2271 86033 : hTcBuffer->nb_subframes = MAX_PARAM_SPATIAL_SUBFRAMES;
2272 :
2273 86033 : nMaxSlotsPerSubframe = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / ( FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES ) ) / hTcBuffer->n_samples_granularity;
2274 86033 : hTcBuffer->num_slots = nMaxSlotsPerSubframe * MAX_PARAM_SPATIAL_SUBFRAMES;
2275 86033 : set_s( hTcBuffer->subframe_nbslots, 0, MAX_JBM_SUBFRAMES_5MS );
2276 86033 : set_s( hTcBuffer->subframe_nbslots, nMaxSlotsPerSubframe, MAX_PARAM_SPATIAL_SUBFRAMES );
2277 :
2278 86033 : if ( ( error = ivas_jbm_dec_tc_audio_allocate( hTcBuffer, st_ivas->hDecoderConfig->output_Fs, st_ivas->hDecoderConfig->Opt_tsm ) ) != IVAS_ERR_OK )
2279 : {
2280 0 : return error;
2281 : }
2282 :
2283 86033 : st_ivas->hTcBuffer = hTcBuffer;
2284 :
2285 86033 : return IVAS_ERR_OK;
2286 : }
2287 :
2288 :
2289 : /*--------------------------------------------------------------------------*
2290 : * ivas_jbm_dec_tc_buffer_reconfigure()
2291 : *
2292 : * open and initialize JBM transport channel buffer
2293 : *--------------------------------------------------------------------------*/
2294 :
2295 39703 : ivas_error ivas_jbm_dec_tc_buffer_reconfigure(
2296 : Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
2297 : const TC_BUFFER_MODE tc_buffer_mode, /* i : new buffer mode */
2298 : const int16_t nchan_transport_jbm, /* i : new number of real transport channels */
2299 : const int16_t nchan_transport_internal, /* i : new number of totally buffered channels */
2300 : const int16_t nchan_full, /* i : new number of channels to fully store */
2301 : const int16_t n_samples_granularity /* i : new granularity of the renderer/buffer */
2302 : )
2303 : {
2304 : int16_t ch_idx, num_tc_buffer_mem, n_samples_still_available;
2305 : float tc_buffer_mem[MAX_INTERN_CHANNELS][L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES - 1];
2306 : ivas_error error;
2307 : DECODER_TC_BUFFER_HANDLE hTcBuffer;
2308 :
2309 39703 : hTcBuffer = st_ivas->hTcBuffer;
2310 :
2311 39703 : num_tc_buffer_mem = 0;
2312 39703 : n_samples_still_available = 0;
2313 :
2314 39703 : if ( st_ivas->hDecoderConfig->Opt_tsm )
2315 : {
2316 : /* save samples of the TC buffer from the previous frame */
2317 16097 : num_tc_buffer_mem = min( hTcBuffer->nchan_transport_internal, nchan_transport_internal );
2318 16097 : n_samples_still_available = hTcBuffer->n_samples_buffered - hTcBuffer->n_samples_rendered;
2319 :
2320 : /* what is remaining from last frame needs always be smaller than the new granularity */
2321 16097 : assert( n_samples_still_available < n_samples_granularity );
2322 :
2323 67896 : for ( ch_idx = 0; ch_idx < num_tc_buffer_mem; ch_idx++ )
2324 : {
2325 51799 : mvr2r( hTcBuffer->tc_buffer_old[ch_idx] + hTcBuffer->n_samples_flushed, tc_buffer_mem[ch_idx], n_samples_still_available );
2326 : }
2327 : }
2328 :
2329 : /* if granularity changes, adapt subframe_nb_slots */
2330 39703 : if ( n_samples_granularity != hTcBuffer->n_samples_granularity )
2331 : {
2332 : #ifdef DEBUGGING
2333 : int16_t nMaxSlotsPerSubframeOld;
2334 : #endif
2335 : int16_t nMaxSlotsPerSubframeNew;
2336 :
2337 9261 : nMaxSlotsPerSubframeNew = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / ( FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES ) ) / n_samples_granularity;
2338 : #ifdef DEBUGGING
2339 : nMaxSlotsPerSubframeOld = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / ( FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES ) ) / st_ivas->hTcBuffer->n_samples_granularity;
2340 : assert( hTcBuffer->subframe_nbslots[hTcBuffer->subframes_rendered - 1] == nMaxSlotsPerSubframeOld );
2341 : if ( n_samples_granularity < hTcBuffer->n_samples_granularity )
2342 : {
2343 : assert( ( hTcBuffer->n_samples_granularity % n_samples_granularity ) == 0 );
2344 : }
2345 : else
2346 : {
2347 : assert( ( n_samples_granularity % hTcBuffer->n_samples_granularity ) == 0 );
2348 : }
2349 : #endif
2350 : /* if samples were flushed, take that into account here */
2351 9261 : if ( n_samples_granularity < hTcBuffer->n_samples_granularity && hTcBuffer->n_samples_flushed > 0 )
2352 : {
2353 615 : hTcBuffer->subframe_nbslots[hTcBuffer->subframes_rendered - 1] = hTcBuffer->n_samples_flushed / n_samples_granularity;
2354 615 : hTcBuffer->n_samples_flushed = 0;
2355 : }
2356 : else
2357 : {
2358 8646 : hTcBuffer->subframe_nbslots[hTcBuffer->subframes_rendered - 1] = nMaxSlotsPerSubframeNew;
2359 : }
2360 : }
2361 :
2362 39703 : hTcBuffer->tc_buffer_mode = tc_buffer_mode;
2363 39703 : hTcBuffer->nchan_transport_jbm = nchan_transport_jbm;
2364 39703 : hTcBuffer->nchan_transport_internal = nchan_transport_internal;
2365 39703 : hTcBuffer->nchan_buffer_full = nchan_full;
2366 39703 : hTcBuffer->n_samples_granularity = n_samples_granularity;
2367 :
2368 : /* reallocate TC audio buffers */
2369 :
2370 39703 : ivas_jbm_dec_tc_audio_deallocate( hTcBuffer );
2371 :
2372 39703 : if ( ( error = ivas_jbm_dec_tc_audio_allocate( hTcBuffer, st_ivas->hDecoderConfig->output_Fs, st_ivas->hDecoderConfig->Opt_tsm ) ) != IVAS_ERR_OK )
2373 : {
2374 0 : return error;
2375 : }
2376 :
2377 : /* propagate samples of the TC buffer from the previous frame */
2378 91502 : for ( ch_idx = 0; ch_idx < num_tc_buffer_mem; ch_idx++ )
2379 : {
2380 51799 : mvr2r( tc_buffer_mem[ch_idx], hTcBuffer->tc_buffer_old[ch_idx], n_samples_still_available );
2381 : }
2382 :
2383 39703 : return IVAS_ERR_OK;
2384 : }
2385 :
2386 :
2387 : /*--------------------------------------------------------------------------*
2388 : * ivas_jbm_dec_tc_buffer_playout()
2389 : *
2390 : *
2391 : *--------------------------------------------------------------------------*/
2392 :
2393 1540288 : static void ivas_jbm_dec_tc_buffer_playout(
2394 : Decoder_Struct *st_ivas,
2395 : const uint16_t nSamplesAsked,
2396 : uint16_t *nSamplesRendered,
2397 : float *output[] )
2398 : {
2399 : int16_t ch_idx, slot_size, slots_to_render, first_sf, last_sf;
2400 :
2401 1540288 : slot_size = st_ivas->hTcBuffer->n_samples_granularity;
2402 :
2403 : /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */
2404 1540288 : slots_to_render = min( st_ivas->hTcBuffer->num_slots - st_ivas->hTcBuffer->slots_rendered, nSamplesAsked / slot_size );
2405 1540288 : st_ivas->hTcBuffer->slots_rendered += slots_to_render;
2406 1540288 : *nSamplesRendered = (uint16_t) slots_to_render * slot_size;
2407 1540288 : first_sf = st_ivas->hTcBuffer->subframes_rendered;
2408 1540288 : last_sf = first_sf;
2409 :
2410 5911670 : while ( slots_to_render > 0 )
2411 : {
2412 4371382 : slots_to_render -= st_ivas->hTcBuffer->subframe_nbslots[last_sf];
2413 4371382 : last_sf++;
2414 : }
2415 : #ifdef DEBUGGING
2416 : assert( slots_to_render == 0 );
2417 : #endif
2418 :
2419 4927926 : for ( ch_idx = 0; ch_idx < st_ivas->hTcBuffer->nchan_transport_jbm; ch_idx++ )
2420 : {
2421 3387638 : output[ch_idx] = st_ivas->hTcBuffer->tc[ch_idx] + st_ivas->hTcBuffer->n_samples_rendered;
2422 : }
2423 :
2424 1540288 : st_ivas->hTcBuffer->subframes_rendered = last_sf;
2425 :
2426 1540288 : return;
2427 : }
2428 :
2429 :
2430 : /*--------------------------------------------------------------------------*
2431 : * ivas_jbm_dec_tc_buffer_close()
2432 : *
2433 : * Close JBM transport channel buffer
2434 : *--------------------------------------------------------------------------*/
2435 :
2436 86054 : void ivas_jbm_dec_tc_buffer_close(
2437 : DECODER_TC_BUFFER_HANDLE *phTcBuffer /* i/o: TC buffer handle */
2438 : )
2439 : {
2440 86054 : if ( *phTcBuffer != NULL )
2441 : {
2442 86033 : ivas_jbm_dec_tc_audio_deallocate( *phTcBuffer );
2443 :
2444 86033 : free( *phTcBuffer );
2445 86033 : *phTcBuffer = NULL;
2446 : }
2447 :
2448 86054 : return;
2449 : }
2450 :
2451 :
2452 : /*--------------------------------------------------------------------------*
2453 : * ivas_jbm_dec_td_renderers_adapt_subframes()
2454 : *
2455 : * Close JBM transport channel buffer
2456 : *--------------------------------------------------------------------------*/
2457 :
2458 4026037 : void ivas_jbm_dec_td_renderers_adapt_subframes(
2459 : Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */
2460 : )
2461 : {
2462 : int16_t nMaxSlotsPerSubframe, nSlotsAvailable;
2463 : uint16_t nSlotsInLastSubframe, nSlotsInFirstSubframe;
2464 :
2465 4026037 : nMaxSlotsPerSubframe = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / ( FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES ) ) / st_ivas->hTcBuffer->n_samples_granularity;
2466 4026037 : nSlotsAvailable = st_ivas->hTcBuffer->n_samples_available / st_ivas->hTcBuffer->n_samples_granularity;
2467 4026037 : st_ivas->hTcBuffer->num_slots = nSlotsAvailable;
2468 4026037 : st_ivas->hTcBuffer->n_samples_available = nSlotsAvailable * st_ivas->hTcBuffer->n_samples_granularity;
2469 4026037 : nSlotsInFirstSubframe = nMaxSlotsPerSubframe - st_ivas->hTcBuffer->subframe_nbslots[st_ivas->hTcBuffer->nb_subframes - 1];
2470 4026037 : st_ivas->hTcBuffer->nb_subframes = 0;
2471 :
2472 4026037 : if ( nSlotsInFirstSubframe > 0 )
2473 : {
2474 26386 : st_ivas->hTcBuffer->nb_subframes = 1;
2475 26386 : nSlotsAvailable -= nSlotsInFirstSubframe;
2476 : }
2477 4026037 : st_ivas->hTcBuffer->nb_subframes += (int16_t) ceilf( (float) nSlotsAvailable / (float) nMaxSlotsPerSubframe );
2478 4026037 : nSlotsInLastSubframe = nSlotsAvailable % nMaxSlotsPerSubframe;
2479 4026037 : set_s( st_ivas->hTcBuffer->subframe_nbslots, 0, MAX_JBM_SUBFRAMES_5MS );
2480 4026037 : set_s( st_ivas->hTcBuffer->subframe_nbslots, nMaxSlotsPerSubframe, st_ivas->hTcBuffer->nb_subframes );
2481 :
2482 4026037 : if ( nSlotsInFirstSubframe > 0 )
2483 : {
2484 26386 : st_ivas->hTcBuffer->subframe_nbslots[0] = nSlotsInFirstSubframe;
2485 : }
2486 :
2487 4026037 : if ( nSlotsInLastSubframe > 0 )
2488 : {
2489 26427 : st_ivas->hTcBuffer->subframe_nbslots[st_ivas->hTcBuffer->nb_subframes - 1] = nSlotsInLastSubframe;
2490 : }
2491 :
2492 4026037 : st_ivas->hTcBuffer->slots_rendered = 0;
2493 4026037 : st_ivas->hTcBuffer->subframes_rendered = 0;
2494 :
2495 4026037 : return;
2496 : }
2497 :
2498 :
2499 : /*--------------------------------------------------------------------------*
2500 : * ivas_jbm_dec_get_tc_buffer_mode()
2501 : *
2502 : *
2503 : *--------------------------------------------------------------------------*/
2504 :
2505 64743 : TC_BUFFER_MODE ivas_jbm_dec_get_tc_buffer_mode(
2506 : Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */
2507 : )
2508 : {
2509 : TC_BUFFER_MODE buffer_mode;
2510 64743 : buffer_mode = TC_BUFFER_MODE_BUFFER;
2511 :
2512 64743 : switch ( st_ivas->renderer_type )
2513 : {
2514 : /* all renderers where we are done after TC decoding (might include DMX to mono/stereo */
2515 11953 : case RENDERER_DISABLE:
2516 : case RENDERER_MCMASA_MONO_STEREO:
2517 : case RENDERER_OSBA_STEREO:
2518 : case RENDERER_MONO_DOWNMIX:
2519 11953 : buffer_mode = TC_BUFFER_MODE_BUFFER;
2520 11953 : break;
2521 : #ifdef FIX_1435_MOVE_STEREO_PANNING
2522 45566 : case RENDERER_NON_DIEGETIC_DOWNMIX:
2523 : #endif
2524 : case RENDERER_TD_PANNING:
2525 : case RENDERER_BINAURAL_OBJECTS_TD:
2526 : case RENDERER_BINAURAL_FASTCONV:
2527 : case RENDERER_BINAURAL_FASTCONV_ROOM:
2528 : case RENDERER_BINAURAL_PARAMETRIC:
2529 : case RENDERER_BINAURAL_PARAMETRIC_ROOM:
2530 : case RENDERER_STEREO_PARAMETRIC:
2531 : case RENDERER_DIRAC:
2532 : case RENDERER_PARAM_ISM:
2533 : case RENDERER_BINAURAL_MIXER_CONV:
2534 : case RENDERER_BINAURAL_MIXER_CONV_ROOM:
2535 : case RENDERER_OMASA_OBJECT_EXT:
2536 : case RENDERER_OMASA_MIX_EXT:
2537 : case RENDERER_OSBA_AMBI:
2538 : case RENDERER_OSBA_LS:
2539 45566 : buffer_mode = TC_BUFFER_MODE_RENDERER;
2540 45566 : break;
2541 : #ifndef FIX_1435_MOVE_STEREO_PANNING
2542 : case RENDERER_NON_DIEGETIC_DOWNMIX:
2543 : if ( st_ivas->ivas_format == MONO_FORMAT )
2544 : {
2545 : buffer_mode = TC_BUFFER_MODE_BUFFER;
2546 : }
2547 : else
2548 : {
2549 : buffer_mode = TC_BUFFER_MODE_RENDERER;
2550 : }
2551 : #endif
2552 : break;
2553 426 : case RENDERER_MC_PARAMMC:
2554 426 : if ( st_ivas->hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO )
2555 : {
2556 174 : buffer_mode = TC_BUFFER_MODE_BUFFER; /* TCs are already the DMX to mono or stereo */
2557 : }
2558 : else
2559 : {
2560 252 : buffer_mode = TC_BUFFER_MODE_RENDERER;
2561 : }
2562 426 : break;
2563 1676 : case RENDERER_MC:
2564 1676 : if ( ivas_jbm_dec_get_num_tc_channels( st_ivas ) != st_ivas->hDecoderConfig->nchan_out )
2565 : {
2566 735 : buffer_mode = TC_BUFFER_MODE_RENDERER;
2567 : }
2568 1676 : break;
2569 5122 : case RENDERER_SBA_LINEAR_ENC:
2570 5122 : if ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCT && ( st_ivas->renderer_type == RENDERER_MC || st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) && ( st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe ) >= ( st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe ) )
2571 : {
2572 306 : buffer_mode = TC_BUFFER_MODE_BUFFER;
2573 : }
2574 : else
2575 : {
2576 4816 : buffer_mode = TC_BUFFER_MODE_RENDERER;
2577 : }
2578 5122 : break;
2579 0 : case RENDERER_SBA_LINEAR_DEC:
2580 0 : if ( st_ivas->ivas_format == SBA_FORMAT && ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_MONO || st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_STEREO ) )
2581 : {
2582 0 : buffer_mode = TC_BUFFER_MODE_BUFFER;
2583 : }
2584 : else
2585 : {
2586 0 : buffer_mode = TC_BUFFER_MODE_RENDERER;
2587 : }
2588 0 : break;
2589 : #ifdef DEBUGGING
2590 : default:
2591 : assert( 0 );
2592 : #endif
2593 : }
2594 :
2595 64743 : return buffer_mode;
2596 : }
2597 :
2598 :
2599 : /*--------------------------------------------------------------------------*
2600 : * ivas_jbm_dec_metadata_open()
2601 : *
2602 : * Open structure for metadata buffering in JBM
2603 : *--------------------------------------------------------------------------*/
2604 :
2605 498 : ivas_error ivas_jbm_dec_metadata_open(
2606 : Decoder_Struct *st_ivas )
2607 : {
2608 : JBM_METADATA_HANDLE hJbmMetadata;
2609 498 : if ( ( hJbmMetadata = (JBM_METADATA_HANDLE) malloc( sizeof( JBM_METADATA ) ) ) == NULL )
2610 : {
2611 0 : return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for JBM metadata handle\n" ) );
2612 : }
2613 498 : hJbmMetadata->sf_write_idx = 0;
2614 498 : hJbmMetadata->sf_md_buffer_length = MASA_JBM_RINGBUFFER_FRAMES * MAX_PARAM_SPATIAL_SUBFRAMES;
2615 :
2616 498 : hJbmMetadata->slot_write_idx = 0;
2617 498 : hJbmMetadata->slot_read_idx = 0;
2618 498 : hJbmMetadata->slot_md_buffer_length = MASA_JBM_RINGBUFFER_FRAMES * MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME;
2619 :
2620 498 : st_ivas->hJbmMetadata = hJbmMetadata;
2621 :
2622 498 : return IVAS_ERR_OK;
2623 : }
2624 :
2625 :
2626 : /*--------------------------------------------------------------------------*
2627 : * ivas_jbm_dec_copy_masa_meta_to_buffer()
2628 : *
2629 : * Copy decoded MASA metadata to a ring buffer
2630 : *--------------------------------------------------------------------------*/
2631 :
2632 33600 : static void ivas_jbm_dec_copy_masa_meta_to_buffer(
2633 : Decoder_Struct *st_ivas )
2634 : {
2635 : int16_t sf, dir, band;
2636 : JBM_METADATA_HANDLE hJbmMetadata;
2637 : MASA_DECODER_EXT_OUT_META *extOutMeta;
2638 : int16_t write_idx;
2639 :
2640 33600 : hJbmMetadata = st_ivas->hJbmMetadata;
2641 33600 : extOutMeta = st_ivas->hMasa->data.extOutMeta;
2642 :
2643 168000 : for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ )
2644 : {
2645 134400 : write_idx = ( hJbmMetadata->sf_write_idx + sf ) % hJbmMetadata->sf_md_buffer_length;
2646 :
2647 403200 : for ( dir = 0; dir < MASA_MAXIMUM_DIRECTIONS; dir++ )
2648 : {
2649 6720000 : for ( band = 0; band < MASA_FREQUENCY_BANDS; band++ )
2650 : {
2651 6451200 : hJbmMetadata->directionIndexBuffer[dir][write_idx][band] = extOutMeta->directionIndex[dir][sf][band];
2652 6451200 : hJbmMetadata->directToTotalRatioBuffer[dir][write_idx][band] = extOutMeta->directToTotalRatio[dir][sf][band];
2653 6451200 : hJbmMetadata->spreadCoherenceBuffer[dir][write_idx][band] = extOutMeta->spreadCoherence[dir][sf][band];
2654 : }
2655 : }
2656 :
2657 3360000 : for ( band = 0; band < MASA_FREQUENCY_BANDS; band++ )
2658 : {
2659 3225600 : hJbmMetadata->diffuseToTotalRatioBuffer[write_idx][band] = extOutMeta->diffuseToTotalRatio[sf][band];
2660 3225600 : hJbmMetadata->surroundCoherenceBuffer[write_idx][band] = extOutMeta->surroundCoherence[sf][band];
2661 : }
2662 :
2663 134400 : hJbmMetadata->numberOfDirections[write_idx] = extOutMeta->descriptiveMeta.numberOfDirections;
2664 : }
2665 :
2666 33600 : return;
2667 : }
2668 :
2669 :
2670 : /*--------------------------------------------------------------------------*
2671 : * ivas_jbm_masa_sf_to_slot_map()
2672 : *
2673 : * Map input MASA metadata subframes to slots in JBM processing
2674 : *--------------------------------------------------------------------------*/
2675 :
2676 33600 : static void ivas_jbm_masa_sf_to_slot_map(
2677 : Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
2678 : const int16_t nCldfbTs /* i : number of CLDFB time slots */
2679 : )
2680 : {
2681 : int16_t sf_to_slot_map[MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME];
2682 : int16_t num_slots_in_subfr;
2683 : JBM_METADATA_HANDLE hJbmMetadata;
2684 : int16_t slot_idx;
2685 : int16_t write_idx, sf_index;
2686 :
2687 33600 : ivas_jbm_dec_copy_masa_meta_to_buffer( st_ivas );
2688 :
2689 : /* Set values */
2690 33600 : hJbmMetadata = st_ivas->hJbmMetadata;
2691 33600 : num_slots_in_subfr = CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES;
2692 :
2693 : /* Map input subframes to slots */
2694 33600 : ivas_jbm_dec_get_md_map_even_spacing( nCldfbTs, num_slots_in_subfr, 0, MAX_PARAM_SPATIAL_SUBFRAMES, sf_to_slot_map );
2695 :
2696 571269 : for ( slot_idx = 0; slot_idx < nCldfbTs; slot_idx++ )
2697 : {
2698 537669 : write_idx = ( hJbmMetadata->slot_write_idx + slot_idx ) % hJbmMetadata->slot_md_buffer_length;
2699 537669 : sf_index = ( hJbmMetadata->sf_write_idx + sf_to_slot_map[slot_idx] ) % hJbmMetadata->sf_md_buffer_length;
2700 :
2701 537669 : hJbmMetadata->sf_to_slot_map[write_idx] = sf_index;
2702 : }
2703 :
2704 33600 : hJbmMetadata->sf_write_idx = ( hJbmMetadata->sf_write_idx + MAX_PARAM_SPATIAL_SUBFRAMES ) % hJbmMetadata->sf_md_buffer_length;
2705 33600 : hJbmMetadata->slot_write_idx = ( hJbmMetadata->slot_write_idx + nCldfbTs ) % hJbmMetadata->slot_md_buffer_length;
2706 :
2707 33600 : return;
2708 : }
2709 :
2710 :
2711 : /*--------------------------------------------------------------------------*
2712 : * ivas_jbm_masa_sf_to_sf_map()
2713 : *
2714 : * Map input MASA metadata subframes to output subframes in JBM processing
2715 : *--------------------------------------------------------------------------*/
2716 :
2717 33600 : void ivas_jbm_masa_sf_to_sf_map(
2718 : Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */
2719 : )
2720 : {
2721 : int16_t sf_to_sf_map[MAX_PARAM_SPATIAL_SUBFRAMES];
2722 : JBM_METADATA_HANDLE hJbmMetadata;
2723 : MASA_DECODER_EXT_OUT_META *extOutMeta;
2724 : int16_t slot_read_idx, sf_read_idx;
2725 : int16_t sf_idx;
2726 : int16_t dir, band;
2727 : uint8_t numberOfDirections;
2728 :
2729 : /* Set values */
2730 33600 : hJbmMetadata = st_ivas->hJbmMetadata;
2731 33600 : extOutMeta = st_ivas->hMasa->data.extOutMeta;
2732 :
2733 : /* Map slots to subframes */
2734 168000 : for ( sf_idx = 0; sf_idx < MAX_PARAM_SPATIAL_SUBFRAMES; sf_idx++ )
2735 : {
2736 134400 : slot_read_idx = ( hJbmMetadata->slot_read_idx + 2 ) % hJbmMetadata->slot_md_buffer_length; /* Take the latter one of the middle slots of the output subframe */
2737 134400 : sf_to_sf_map[sf_idx] = hJbmMetadata->sf_to_slot_map[slot_read_idx];
2738 134400 : hJbmMetadata->slot_read_idx = ( hJbmMetadata->slot_read_idx + CLDFB_SLOTS_PER_SUBFRAME ) % hJbmMetadata->slot_md_buffer_length;
2739 : }
2740 :
2741 : /* Copy mapped metadata to the EXT meta buffer for writing */
2742 168000 : for ( sf_idx = 0; sf_idx < MAX_PARAM_SPATIAL_SUBFRAMES; sf_idx++ )
2743 : {
2744 134400 : sf_read_idx = sf_to_sf_map[sf_idx];
2745 :
2746 403200 : for ( dir = 0; dir < MASA_MAXIMUM_DIRECTIONS; dir++ )
2747 : {
2748 6720000 : for ( band = 0; band < MASA_FREQUENCY_BANDS; band++ )
2749 : {
2750 6451200 : extOutMeta->directionIndex[dir][sf_idx][band] = hJbmMetadata->directionIndexBuffer[dir][sf_read_idx][band];
2751 6451200 : extOutMeta->directToTotalRatio[dir][sf_idx][band] = hJbmMetadata->directToTotalRatioBuffer[dir][sf_read_idx][band];
2752 6451200 : extOutMeta->spreadCoherence[dir][sf_idx][band] = hJbmMetadata->spreadCoherenceBuffer[dir][sf_read_idx][band];
2753 : }
2754 : }
2755 :
2756 3360000 : for ( band = 0; band < MASA_FREQUENCY_BANDS; band++ )
2757 : {
2758 3225600 : extOutMeta->diffuseToTotalRatio[sf_idx][band] = hJbmMetadata->diffuseToTotalRatioBuffer[sf_read_idx][band];
2759 3225600 : extOutMeta->surroundCoherence[sf_idx][band] = hJbmMetadata->surroundCoherenceBuffer[sf_read_idx][band];
2760 : }
2761 : }
2762 :
2763 : /* Determine the number of directions for the frame to be written */
2764 33600 : numberOfDirections = 0;
2765 157452 : for ( sf_idx = 0; sf_idx < MAX_PARAM_SPATIAL_SUBFRAMES; sf_idx++ )
2766 : {
2767 126606 : sf_read_idx = sf_to_sf_map[sf_idx];
2768 :
2769 126606 : if ( hJbmMetadata->numberOfDirections[sf_read_idx] == 1 )
2770 : {
2771 2754 : numberOfDirections = 1;
2772 2754 : break;
2773 : }
2774 : }
2775 :
2776 33600 : extOutMeta->descriptiveMeta.numberOfDirections = numberOfDirections;
2777 :
2778 33600 : return;
2779 : }
2780 :
2781 :
2782 : /*--------------------------------------------------------------------------*
2783 : * ivas_dec_prepare_renderer()
2784 : *
2785 : * prepare IVAS renderer routine
2786 : *--------------------------------------------------------------------------*/
2787 :
2788 5976003 : void ivas_dec_prepare_renderer(
2789 : Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */
2790 : )
2791 : {
2792 : int16_t n, n_render_timeslots;
2793 :
2794 5976003 : push_wmops( "ivas_dec_prepare_renderer" );
2795 :
2796 5976003 : n_render_timeslots = st_ivas->hTcBuffer->n_samples_available / st_ivas->hTcBuffer->n_samples_granularity;
2797 :
2798 5976003 : if ( st_ivas->hTcBuffer->tc_buffer_mode == TC_BUFFER_MODE_BUFFER )
2799 : {
2800 1083070 : ivas_jbm_dec_td_renderers_adapt_subframes( st_ivas );
2801 :
2802 1083070 : if ( ( st_ivas->ivas_format == MASA_FORMAT || st_ivas->ivas_format == MASA_ISM_FORMAT ) && st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL && st_ivas->hDecoderConfig->Opt_tsm )
2803 : {
2804 30510 : ivas_jbm_masa_sf_to_slot_map( st_ivas, n_render_timeslots );
2805 : }
2806 :
2807 : /* MASA transport gaining for edited disc OMASA EXT. For ISMs, only metadata is modified */
2808 1083070 : if ( st_ivas->ivas_format == MASA_ISM_FORMAT && st_ivas->ism_mode == ISM_MASA_MODE_DISC && st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL && st_ivas->hMasaIsmData->masa_gain_is_edited == 1 )
2809 : {
2810 0 : ivas_omasa_gain_masa_tc( st_ivas->hTcBuffer->tc, st_ivas->hMasaIsmData->gain_masa_edited, st_ivas->nchan_ism, st_ivas->hTcBuffer->n_samples_available );
2811 : }
2812 : }
2813 4892933 : else if ( st_ivas->ivas_format == MONO_FORMAT || st_ivas->ivas_format == STEREO_FORMAT )
2814 : {
2815 3000 : ivas_jbm_dec_td_renderers_adapt_subframes( st_ivas );
2816 : }
2817 4889933 : else if ( st_ivas->ivas_format == ISM_FORMAT )
2818 : {
2819 973514 : if ( st_ivas->ism_mode == ISM_MODE_PARAM )
2820 : {
2821 126701 : if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC )
2822 : {
2823 57383 : ivas_dirac_dec_set_md_map( st_ivas, n_render_timeslots );
2824 57383 : ivas_param_ism_params_to_masa_param_mapping( st_ivas );
2825 : }
2826 69318 : else if ( st_ivas->renderer_type == RENDERER_PARAM_ISM || st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC )
2827 : {
2828 69318 : ivas_param_ism_dec_prepare_renderer( st_ivas, n_render_timeslots );
2829 : }
2830 : }
2831 : else /* ISM_MODE_DISC */
2832 : {
2833 846813 : ivas_ism_dec_digest_tc( st_ivas );
2834 : }
2835 : }
2836 3916419 : else if ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == MASA_FORMAT )
2837 : {
2838 1457567 : ivas_sba_dec_digest_tc( st_ivas, n_render_timeslots, st_ivas->hTcBuffer->n_samples_available );
2839 : }
2840 2458852 : else if ( st_ivas->ivas_format == SBA_ISM_FORMAT )
2841 : {
2842 1546103 : if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC )
2843 : {
2844 719572 : ivas_ism_dec_digest_tc( st_ivas );
2845 :
2846 : /* delay the objects here for all renderers where it is needed */
2847 719572 : if ( ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV ||
2848 518426 : st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ||
2849 443552 : st_ivas->renderer_type == RENDERER_OSBA_AMBI ||
2850 312098 : st_ivas->renderer_type == RENDERER_OSBA_LS ||
2851 97028 : st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) &&
2852 673558 : ( st_ivas->hDecoderConfig->output_config != IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED && st_ivas->hDecoderConfig->output_config != IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) )
2853 : {
2854 2205330 : for ( n = 0; n < st_ivas->nchan_ism; n++ )
2855 : {
2856 1576136 : delay_signal( st_ivas->hTcBuffer->tc[n], st_ivas->hTcBuffer->n_samples_available, st_ivas->hSbaIsmData->delayBuffer[n], st_ivas->hSbaIsmData->delayBuffer_size );
2857 : }
2858 : }
2859 :
2860 719572 : if ( !st_ivas->sba_dirac_stereo_flag )
2861 : {
2862 673558 : if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV )
2863 : {
2864 201146 : n_render_timeslots *= ( st_ivas->hTcBuffer->n_samples_granularity / st_ivas->hSpatParamRendCom->slot_size );
2865 : }
2866 :
2867 673558 : ivas_sba_dec_digest_tc( st_ivas, n_render_timeslots, st_ivas->hTcBuffer->n_samples_available );
2868 : }
2869 : }
2870 : else
2871 : {
2872 826531 : ivas_jbm_dec_td_renderers_adapt_subframes( st_ivas );
2873 :
2874 826531 : ivas_sba_dec_digest_tc( st_ivas, n_render_timeslots, st_ivas->hTcBuffer->n_samples_available );
2875 : }
2876 : }
2877 912749 : else if ( st_ivas->ivas_format == MASA_ISM_FORMAT )
2878 : {
2879 470390 : if ( st_ivas->renderer_type == RENDERER_OMASA_MIX_EXT || st_ivas->renderer_type == RENDERER_OMASA_OBJECT_EXT )
2880 : {
2881 7746 : ivas_jbm_dec_td_renderers_adapt_subframes( st_ivas );
2882 :
2883 7746 : if ( st_ivas->hDecoderConfig->Opt_tsm )
2884 : {
2885 3090 : ivas_jbm_masa_sf_to_slot_map( st_ivas, n_render_timeslots );
2886 : }
2887 :
2888 : /* MASA transport gaining for edited param_one OMASA EXT. For ISMs, only metadata is modified. */
2889 7746 : if ( st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ && st_ivas->hMasaIsmData->masa_gain_is_edited == 1 )
2890 : {
2891 0 : for ( n = 0; n < CPE_CHANNELS; n++ )
2892 : {
2893 0 : v_multc( st_ivas->hTcBuffer->tc[n], st_ivas->hMasaIsmData->gain_masa_edited, st_ivas->hTcBuffer->tc[n], st_ivas->hTcBuffer->n_samples_available );
2894 : }
2895 : }
2896 : }
2897 : else
2898 : {
2899 462644 : if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC && st_ivas->ism_mode == ISM_MASA_MODE_DISC )
2900 : {
2901 66716 : n_render_timeslots *= ( st_ivas->hTcBuffer->n_samples_granularity / st_ivas->hSpatParamRendCom->slot_size );
2902 : }
2903 :
2904 462644 : ivas_sba_dec_digest_tc( st_ivas, n_render_timeslots, st_ivas->hTcBuffer->n_samples_available );
2905 :
2906 462644 : if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC )
2907 : {
2908 322964 : ivas_ism_dec_digest_tc( st_ivas );
2909 : }
2910 :
2911 462644 : if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_DIRAC )
2912 : {
2913 : int16_t nchan_transport_ism;
2914 :
2915 : /* Delay the signal to match CLDFB delay. Delay the whole buffer. */
2916 329840 : nchan_transport_ism = 0;
2917 329840 : if ( ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC )
2918 : {
2919 62544 : nchan_transport_ism = 1;
2920 : }
2921 267296 : else if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC )
2922 : {
2923 233519 : nchan_transport_ism = st_ivas->nchan_ism;
2924 : }
2925 :
2926 329840 : if ( st_ivas->hDecoderConfig->Opt_tsm && st_ivas->ism_mode == ISM_MASA_MODE_DISC && st_ivas->renderer_type == RENDERER_DIRAC )
2927 : {
2928 : /* Gain MASA part, if edited */
2929 83874 : if ( st_ivas->hMasaIsmData->masa_gain_is_edited )
2930 : {
2931 8568 : for ( n = 0; n < CPE_CHANNELS; n++ )
2932 : {
2933 5712 : v_multc( st_ivas->hTcBuffer->tc[n], st_ivas->hMasaIsmData->gain_masa_edited, st_ivas->hTcBuffer->tc[n], st_ivas->hTcBuffer->n_samples_available );
2934 : }
2935 : }
2936 : }
2937 :
2938 902656 : for ( n = 0; n < nchan_transport_ism; n++ )
2939 : {
2940 572816 : if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC && st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC )
2941 : {
2942 : float gainIsm;
2943 143651 : gainIsm = OMASA_TDREND_MATCHING_GAIN;
2944 :
2945 143651 : if ( st_ivas->hMasaIsmData->ism_gain_is_edited[n] )
2946 : {
2947 13335 : gainIsm *= st_ivas->hMasaIsmData->gain_ism_edited[n];
2948 : }
2949 :
2950 143651 : v_multc( st_ivas->hTcBuffer->tc[CPE_CHANNELS + n], gainIsm, st_ivas->hTcBuffer->tc[CPE_CHANNELS + n], st_ivas->hTcBuffer->n_samples_available );
2951 : }
2952 :
2953 572816 : if ( st_ivas->hDecoderConfig->output_config != IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED && st_ivas->hDecoderConfig->output_config != IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM )
2954 : {
2955 520119 : delay_signal( st_ivas->hTcBuffer->tc[CPE_CHANNELS + n], st_ivas->hTcBuffer->n_samples_available, st_ivas->hMasaIsmData->delayBuffer[n], st_ivas->hMasaIsmData->delayBuffer_size );
2956 : }
2957 : }
2958 :
2959 329840 : if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC && st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC )
2960 : {
2961 : int16_t tcBufferSize;
2962 66716 : tcBufferSize = st_ivas->hSpatParamRendCom->num_slots * st_ivas->hSpatParamRendCom->slot_size;
2963 :
2964 66716 : if ( st_ivas->hMasaIsmData->masa_gain_is_edited )
2965 : {
2966 11385 : for ( n = 0; n < BINAURAL_CHANNELS; n++ )
2967 : {
2968 7590 : v_multc( st_ivas->hTcBuffer->tc[n], st_ivas->hMasaIsmData->gain_masa_edited, st_ivas->hTcBuffer->tc[n], tcBufferSize );
2969 : }
2970 : }
2971 : }
2972 : }
2973 : }
2974 : }
2975 442359 : else if ( st_ivas->ivas_format == MC_FORMAT )
2976 : {
2977 442359 : if ( st_ivas->mc_mode == MC_MODE_MCT )
2978 : {
2979 202696 : ivas_jbm_dec_td_renderers_adapt_subframes( st_ivas );
2980 : }
2981 239663 : else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX )
2982 : {
2983 13645 : ivas_mc_paramupmix_dec_digest_tc( st_ivas, (uint8_t) n_render_timeslots, st_ivas->hTcBuffer->n_samples_available );
2984 : }
2985 226018 : else if ( st_ivas->mc_mode == MC_MODE_PARAMMC )
2986 : {
2987 97406 : ivas_param_mc_dec_prepare_renderer( st_ivas, (uint8_t) n_render_timeslots );
2988 : }
2989 128612 : else if ( st_ivas->mc_mode == MC_MODE_MCMASA )
2990 : {
2991 128612 : ivas_sba_dec_digest_tc( st_ivas, n_render_timeslots, st_ivas->hTcBuffer->n_samples_available );
2992 : }
2993 : }
2994 :
2995 5976003 : pop_wmops();
2996 5976003 : return;
2997 : }
|