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 "ivas_cnst.h"
36 : #include "prot.h"
37 : #include "ivas_prot.h"
38 : #include "ivas_prot_rend.h"
39 : #include "ivas_stat_com.h"
40 : #include "ivas_rom_com.h"
41 : #include "ivas_rom_dec.h"
42 : #include <math.h>
43 : #ifdef DEBUGGING
44 : #include "debug.h"
45 : #endif
46 : #include "wmc_auto.h"
47 :
48 :
49 : /*-------------------------------------------------------------------------*
50 : * ivas_ism_renderer_open()
51 : *
52 : * Open struct for object rendering, reserve memory, and init values.
53 : *-------------------------------------------------------------------------*/
54 :
55 23737 : ivas_error ivas_ism_renderer_open(
56 : Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */
57 : )
58 : {
59 : int16_t i;
60 : uint16_t interpolator_length;
61 : uint16_t init_interpolator_length;
62 : ivas_error error;
63 :
64 23737 : if ( ( st_ivas->hIsmRendererData = (ISM_RENDERER_HANDLE) malloc( sizeof( ISM_RENDERER_DATA ) ) ) == NULL )
65 : {
66 0 : return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for ISM renderer\n" ) );
67 : }
68 :
69 23737 : if ( st_ivas->hIntSetup.is_loudspeaker_setup &&
70 14495 : st_ivas->hDecoderConfig->output_config != IVAS_AUDIO_CONFIG_STEREO &&
71 12558 : st_ivas->hIntSetup.ls_azimuth != NULL && st_ivas->hIntSetup.ls_elevation != NULL &&
72 12542 : st_ivas->hEFAPdata == NULL )
73 : {
74 12542 : if ( ( error = efap_init_data( &( st_ivas->hEFAPdata ), st_ivas->hIntSetup.ls_azimuth, st_ivas->hIntSetup.ls_elevation, st_ivas->hIntSetup.nchan_out_woLFE, EFAP_MODE_EFAP ) ) != IVAS_ERR_OK )
75 : {
76 0 : return error;
77 : }
78 : }
79 :
80 118685 : for ( i = 0; i < MAX_NUM_OBJECTS; i++ )
81 : {
82 94948 : set_f( st_ivas->hIsmRendererData->prev_gains[i], 0.0f, MAX_OUTPUT_CHANNELS );
83 94948 : set_f( st_ivas->hIsmRendererData->gains[i], 0.0f, MAX_OUTPUT_CHANNELS );
84 : }
85 :
86 23737 : if ( st_ivas->hDecoderConfig->Opt_tsm )
87 : {
88 10659 : init_interpolator_length = NS2SA( st_ivas->hDecoderConfig->output_Fs, MAX_JBM_CLDFB_TIMESLOTS * CLDFB_SLOT_NS );
89 10659 : interpolator_length = (uint16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC );
90 : }
91 : else
92 : {
93 13078 : init_interpolator_length = (uint16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC );
94 13078 : interpolator_length = init_interpolator_length;
95 : }
96 :
97 23737 : if ( ( st_ivas->hIsmRendererData->interpolator = (float *) malloc( sizeof( float ) * init_interpolator_length ) ) == NULL )
98 : {
99 0 : return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for ISM renderer interpolator\n" ) );
100 : }
101 :
102 15425017 : for ( i = 0; i < interpolator_length; i++ )
103 : {
104 15401280 : st_ivas->hIsmRendererData->interpolator[i] = (float) i / ( (float) interpolator_length - 1 );
105 : }
106 :
107 23737 : return IVAS_ERR_OK;
108 : }
109 :
110 :
111 : /*-------------------------------------------------------------------------*
112 : * ivas_ism_renderer_close()
113 : *
114 : * Close struct for object rendering.
115 : *-------------------------------------------------------------------------*/
116 :
117 122401 : void ivas_ism_renderer_close(
118 : ISM_RENDERER_HANDLE *hIsmRendererData /* i/o: ISM renderer handle */
119 : )
120 : {
121 122401 : if ( hIsmRendererData == NULL || *hIsmRendererData == NULL )
122 : {
123 90110 : return;
124 : }
125 :
126 32291 : if ( ( *hIsmRendererData )->interpolator != NULL )
127 : {
128 32291 : free( ( *hIsmRendererData )->interpolator );
129 32291 : ( *hIsmRendererData )->interpolator = NULL;
130 : }
131 :
132 32291 : free( *hIsmRendererData );
133 32291 : *hIsmRendererData = NULL;
134 :
135 32291 : return;
136 : }
137 :
138 :
139 : /*-------------------------------------------------------------------------*
140 : * ivas_ism_render_sf()
141 : *
142 : * Object rendering process
143 : *-------------------------------------------------------------------------*/
144 :
145 918483 : void ivas_ism_render_sf(
146 : Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
147 : const RENDERER_TYPE renderer_type, /* i : active renderer type */
148 : float *output_f[], /* i/o: core-coder transport channels/object output */
149 : const int16_t n_samples_to_render /* i : output frame length per channel */
150 : )
151 : {
152 : int16_t i, j, k, j2;
153 : float *g1, g2, *tc;
154 : int16_t num_objects, nchan_out_woLFE, lfe_index;
155 : int16_t azimuth, elevation;
156 : int16_t tc_offset;
157 : int16_t interp_offset;
158 : float gain, prev_gain;
159 : float tc_local[MAX_NUM_OBJECTS][L_FRAME48k];
160 : float *p_tc[MAX_NUM_OBJECTS];
161 : int16_t ism_md_subframe_update_jbm, slots_to_render, first_sf, last_sf, subframe_idx;
162 : int16_t n_samples_rendered_loop;
163 :
164 : /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */
165 918483 : slots_to_render = min( st_ivas->hTcBuffer->num_slots - st_ivas->hTcBuffer->slots_rendered, n_samples_to_render / st_ivas->hTcBuffer->n_samples_granularity );
166 918483 : first_sf = st_ivas->hTcBuffer->subframes_rendered;
167 918483 : last_sf = first_sf;
168 918483 : n_samples_rendered_loop = 0;
169 :
170 4157757 : while ( slots_to_render > 0 )
171 : {
172 3239274 : slots_to_render -= st_ivas->hTcBuffer->subframe_nbslots[last_sf];
173 3239274 : last_sf++;
174 : }
175 : #ifdef DEBUGGING
176 : assert( slots_to_render == 0 );
177 : assert( last_sf <= st_ivas->hTcBuffer->nb_subframes );
178 : #endif
179 918483 : num_objects = st_ivas->nchan_ism;
180 :
181 918483 : nchan_out_woLFE = st_ivas->hIntSetup.nchan_out_woLFE;
182 :
183 918483 : tc_offset = st_ivas->hTcBuffer->n_samples_rendered;
184 918483 : interp_offset = st_ivas->hTcBuffer->n_samples_rendered;
185 :
186 : /* Number of subframes to delay metadata to sync with audio */
187 918483 : if ( st_ivas->hDecoderConfig->Opt_delay_comp )
188 : {
189 554551 : ism_md_subframe_update_jbm = max( 0, st_ivas->hTcBuffer->nb_subframes - 3 );
190 : }
191 : else
192 : {
193 363932 : ism_md_subframe_update_jbm = st_ivas->hTcBuffer->nb_subframes - 2;
194 : }
195 :
196 3250385 : for ( i = 0; i < num_objects; i++ )
197 : {
198 2331902 : mvr2r( &output_f[i][tc_offset], tc_local[i], n_samples_to_render );
199 2331902 : p_tc[i] = tc_local[i];
200 : }
201 :
202 8783361 : for ( i = 0; i < nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; i++ )
203 : {
204 7864878 : set_f( output_f[i], 0.0f, n_samples_to_render );
205 : }
206 :
207 4157757 : for ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ )
208 : {
209 : int16_t n_samples_in_subframe;
210 :
211 3239274 : n_samples_in_subframe = st_ivas->hTcBuffer->n_samples_granularity * st_ivas->hTcBuffer->subframe_nbslots[subframe_idx];
212 :
213 3239274 : if ( st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[st_ivas->hCombinedOrientationData->subframe_idx] == 1 )
214 : {
215 35976 : ivas_jbm_dec_get_adapted_linear_interpolator( n_samples_in_subframe, n_samples_in_subframe, st_ivas->hIsmRendererData->interpolator );
216 35976 : interp_offset = 0;
217 : }
218 :
219 11375724 : for ( i = 0; i < num_objects; i++ )
220 : {
221 : /* Combined rotation: rotate the object positions depending the head and external orientations */
222 8136450 : if ( st_ivas->hCombinedOrientationData != NULL && st_ivas->hCombinedOrientationData->enableCombinedOrientation[st_ivas->hCombinedOrientationData->subframe_idx] == 1 )
223 : {
224 35976 : if ( subframe_idx >= ism_md_subframe_update_jbm )
225 : {
226 26982 : rotateAziEle( st_ivas->hIsmMetaData[i]->edited_azimuth, st_ivas->hIsmMetaData[i]->edited_elevation, &azimuth, &elevation, st_ivas->hCombinedOrientationData->Rmat[st_ivas->hCombinedOrientationData->subframe_idx], st_ivas->hIntSetup.is_planar_setup );
227 : }
228 : else
229 : {
230 8994 : rotateAziEle( st_ivas->hIsmMetaData[i]->edited_azimuth, st_ivas->hIsmMetaData[i]->edited_elevation, &azimuth, &elevation, st_ivas->hCombinedOrientationData->Rmat[st_ivas->hCombinedOrientationData->subframe_idx], st_ivas->hIntSetup.is_planar_setup );
231 : }
232 :
233 35976 : if ( st_ivas->hEFAPdata != NULL )
234 : {
235 35976 : efap_determine_gains( st_ivas->hEFAPdata, st_ivas->hIsmRendererData->gains[i], azimuth, elevation, EFAP_MODE_EFAP );
236 35976 : v_multc( st_ivas->hIsmRendererData->gains[i], st_ivas->hIsmMetaData[i]->edited_gain, st_ivas->hIsmRendererData->gains[i], nchan_out_woLFE );
237 : }
238 : }
239 :
240 8136450 : lfe_index = 0;
241 71453745 : for ( j = 0, j2 = 0; j < nchan_out_woLFE; j++, j2++ )
242 : {
243 63317295 : if ( ( st_ivas->hIntSetup.num_lfe > 0 ) && ( st_ivas->hIntSetup.index_lfe[lfe_index] == j ) )
244 : {
245 5696105 : ( lfe_index < ( st_ivas->hIntSetup.num_lfe - 1 ) ) ? ( lfe_index++, j2++ ) : j2++;
246 : }
247 :
248 63317295 : gain = st_ivas->hIsmRendererData->gains[i][j];
249 63317295 : prev_gain = st_ivas->hIsmRendererData->prev_gains[i][j];
250 63317295 : if ( fabsf( gain ) > 0.0f || fabsf( prev_gain ) > 0.0f )
251 : {
252 32060403 : g1 = &st_ivas->hIsmRendererData->interpolator[interp_offset];
253 32060403 : tc = p_tc[i];
254 5364840483 : for ( k = 0; k < n_samples_in_subframe; k++ )
255 : {
256 5332780080 : g2 = 1.0f - *g1;
257 5332780080 : output_f[j2][k + n_samples_rendered_loop] += ( *( g1++ ) * gain + g2 * prev_gain ) * *( tc++ );
258 : }
259 : }
260 :
261 : /* update here only in case of head rotation */
262 63317295 : if ( st_ivas->hCombinedOrientationData != NULL && st_ivas->hCombinedOrientationData->enableCombinedOrientation[st_ivas->hCombinedOrientationData->subframe_idx] == 1 )
263 : {
264 395736 : st_ivas->hIsmRendererData->prev_gains[i][j] = gain;
265 : }
266 : }
267 8136450 : p_tc[i] += n_samples_in_subframe;
268 : }
269 :
270 : /* update combined orientation access index */
271 3239274 : ivas_combined_orientation_update_index( st_ivas->hCombinedOrientationData, n_samples_in_subframe );
272 :
273 3239274 : n_samples_rendered_loop += n_samples_in_subframe;
274 : /* update rendered subframe and slots info for all cases apart from a following crend call, the update will
275 : then happen in the crend call*/
276 3239274 : if ( renderer_type != RENDERER_BINAURAL_MIXER_CONV_ROOM )
277 : {
278 2830675 : st_ivas->hTcBuffer->subframes_rendered += 1;
279 2830675 : st_ivas->hTcBuffer->slots_rendered += st_ivas->hTcBuffer->subframe_nbslots[subframe_idx];
280 : }
281 3239274 : tc_offset += n_samples_in_subframe;
282 3239274 : interp_offset += n_samples_in_subframe;
283 : }
284 :
285 918483 : return;
286 : }
287 :
288 :
289 : /*-------------------------------------------------------------------------*
290 : * ivas_ism_get_stereo_gains()
291 : *
292 : *
293 : *-------------------------------------------------------------------------*/
294 :
295 1923526 : void ivas_ism_get_stereo_gains(
296 : const float azimuth, /* i : object azimuth */
297 : const float elevation, /* i : object elevation */
298 : float *left_gain, /* o : left channel gain */
299 : float *right_gain /* o : right channel gain */
300 : )
301 : {
302 : float aziRad, eleRad;
303 : float y, mappedX, aziRadMapped, A, A2, A3;
304 :
305 : /* Convert azi and ele to an azi value of the cone of confusion */
306 1923526 : aziRad = azimuth * PI_OVER_180;
307 1923526 : eleRad = elevation * PI_OVER_180;
308 1923526 : y = ( sinf( aziRad ) * cosf( eleRad ) );
309 1923526 : mappedX = sqrtf( max( 0.0f, 1.0f - ( y * y ) ) );
310 1923526 : aziRadMapped = atan2f( y, mappedX );
311 :
312 : /* Determine the amplitude panning gains */
313 1923526 : if ( aziRadMapped >= LS_ANGLE_RAD_30_DEG )
314 : { /* Left side */
315 218070 : *left_gain = 1.0f;
316 218070 : *right_gain = 0.0f;
317 : }
318 1705456 : else if ( aziRadMapped <= -LS_ANGLE_RAD_30_DEG )
319 : { /* Right side */
320 174518 : *left_gain = 0.0f;
321 174518 : *right_gain = 1.0f;
322 : }
323 : else /* Tangent panning law */
324 : {
325 1530938 : A = tanf( aziRadMapped ) * INV_TAN_LS_ANGLE_RAD_30_DEG;
326 1530938 : A2 = ( A - 1.0f ) / max( 0.001f, A + 1.0f );
327 1530938 : A3 = 1.0f / ( A2 * A2 + 1.0f );
328 1530938 : *left_gain = sqrtf( A3 );
329 1530938 : *right_gain = sqrtf( 1.0f - A3 );
330 : }
331 :
332 1923526 : return;
333 : }
334 :
335 :
336 : /*-------------------------------------------------------------------------*
337 : * ivas_omasa_separate_object_renderer_open()
338 : *
339 : * Open structures, reserve memory, and init values.
340 : *-------------------------------------------------------------------------*/
341 :
342 8131 : ivas_error ivas_omasa_separate_object_renderer_open(
343 : Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */
344 : )
345 : {
346 : int16_t interpolator_length;
347 : int16_t i;
348 : int16_t init_interpolator_length;
349 :
350 8131 : if ( ( st_ivas->hIsmRendererData = (ISM_RENDERER_HANDLE) malloc( sizeof( ISM_RENDERER_DATA ) ) ) == NULL )
351 : {
352 0 : return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for MASA ISM renderer \n" ) );
353 : }
354 :
355 40655 : for ( i = 0; i < MAX_NUM_OBJECTS; i++ )
356 : {
357 32524 : set_f( st_ivas->hIsmRendererData->prev_gains[i], 0.0f, MAX_OUTPUT_CHANNELS );
358 : }
359 :
360 8131 : init_interpolator_length = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC / MAX_PARAM_SPATIAL_SUBFRAMES );
361 8131 : interpolator_length = init_interpolator_length;
362 8131 : if ( ( st_ivas->hIsmRendererData->interpolator = (float *) malloc( sizeof( float ) * init_interpolator_length ) ) == NULL )
363 : {
364 0 : return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for MASA ISM renderer interpolator \n" ) );
365 : }
366 :
367 1613251 : for ( i = 0; i < interpolator_length; i++ )
368 : {
369 1605120 : st_ivas->hIsmRendererData->interpolator[i] = (float) i / ( (float) interpolator_length );
370 : }
371 8131 : st_ivas->hIsmRendererData->interpolator_length = interpolator_length;
372 :
373 8131 : return IVAS_ERR_OK;
374 : }
375 :
376 :
377 : /*-------------------------------------------------------------------------*
378 : * ivas_omasa_separate_object_renderer_close()
379 : *
380 : * Close structures, free memory.
381 : *-------------------------------------------------------------------------*/
382 :
383 31620 : void ivas_omasa_separate_object_renderer_close(
384 : Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */
385 : )
386 : {
387 : int16_t i;
388 :
389 31620 : if ( st_ivas->hMasaIsmData != NULL )
390 : {
391 31620 : if ( st_ivas->hMasaIsmData->delayBuffer != NULL )
392 : {
393 21405 : for ( i = 0; i < st_ivas->hMasaIsmData->delayBuffer_nchan; i++ )
394 : {
395 14829 : if ( st_ivas->hMasaIsmData->delayBuffer[i] != NULL )
396 : {
397 14829 : free( st_ivas->hMasaIsmData->delayBuffer[i] );
398 14829 : st_ivas->hMasaIsmData->delayBuffer[i] = NULL;
399 : }
400 : }
401 :
402 6576 : free( st_ivas->hMasaIsmData->delayBuffer );
403 6576 : st_ivas->hMasaIsmData->delayBuffer = NULL;
404 : }
405 : }
406 :
407 31620 : ivas_ism_renderer_close( &st_ivas->hIsmRendererData );
408 :
409 31620 : return;
410 : }
411 :
412 :
413 : /*-------------------------------------------------------------------------*
414 : * ivas_omasa_separate_object_render_jbm()
415 : *
416 : * Rendering separated objects and mixing them to the parametrically rendered signals for JBM
417 : *-------------------------------------------------------------------------*/
418 :
419 264832 : void ivas_omasa_separate_object_render_jbm(
420 : Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
421 : const uint16_t nSamplesRendered, /* i : number of samples rendered */
422 : float input_f_in[][L_FRAME48k], /* i : separated object signal */
423 : float *output_f[], /* o : rendered time signal */
424 : const int16_t subframes_rendered /* i : number of subframes rendered */
425 : )
426 : {
427 : VBAP_HANDLE hVBAPdata;
428 : DIRAC_REND_HANDLE hDirACRend;
429 : SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom;
430 : int16_t nchan_out_woLFE, num_lfe;
431 : ISM_RENDERER_HANDLE hRendererData;
432 : int16_t j, k, j2;
433 : int16_t obj;
434 : float gains[MAX_OUTPUT_CHANNELS];
435 : float g1, g2;
436 : int16_t lfe_index;
437 : int16_t azimuth, elevation;
438 : int16_t num_objects;
439 : uint8_t single_separated;
440 : float *input_f[MAX_TRANSPORT_CHANNELS];
441 : float *output_f_local[MAX_OUTPUT_CHANNELS];
442 : int16_t offsetSamples;
443 : int16_t n_samples_sf, md_idx;
444 : int16_t slots_to_render, first_sf, last_sf, subframe_idx;
445 :
446 264832 : hVBAPdata = st_ivas->hVBAPdata;
447 264832 : hDirACRend = st_ivas->hDirACRend;
448 264832 : hSpatParamRendCom = st_ivas->hSpatParamRendCom;
449 264832 : nchan_out_woLFE = st_ivas->hIntSetup.nchan_out_woLFE;
450 264832 : num_lfe = st_ivas->hIntSetup.num_lfe;
451 264832 : hRendererData = st_ivas->hIsmRendererData;
452 264832 : lfe_index = hDirACRend->hOutSetup.index_lfe[0];
453 :
454 264832 : if ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ )
455 : {
456 83520 : single_separated = 1;
457 83520 : num_objects = 1;
458 : }
459 : else
460 : {
461 181312 : single_separated = 0;
462 181312 : num_objects = st_ivas->nchan_ism;
463 : }
464 :
465 2607562 : for ( j = 0; j < nchan_out_woLFE + num_lfe; j++ )
466 : {
467 2342730 : output_f_local[j] = output_f[j];
468 : }
469 :
470 749129 : for ( obj = 0; obj < num_objects; obj++ )
471 : {
472 484297 : input_f[obj] = input_f_in[obj];
473 : }
474 :
475 264832 : slots_to_render = nSamplesRendered / hSpatParamRendCom->slot_size;
476 264832 : first_sf = subframes_rendered;
477 264832 : last_sf = first_sf;
478 :
479 1187422 : while ( slots_to_render > 0 )
480 : {
481 922590 : slots_to_render -= hSpatParamRendCom->subframe_nbslots[last_sf];
482 922590 : last_sf++;
483 : }
484 :
485 749129 : for ( obj = 0; obj < num_objects; obj++ )
486 : {
487 484297 : offsetSamples = 0;
488 :
489 2210239 : for ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ )
490 : {
491 1725942 : n_samples_sf = hSpatParamRendCom->subframe_nbslots[subframe_idx] * hSpatParamRendCom->slot_size;
492 1725942 : if ( n_samples_sf != hRendererData->interpolator_length )
493 : {
494 3552624 : for ( k = 0; k < n_samples_sf; k++ )
495 : {
496 3532320 : hRendererData->interpolator[k] = (float) k / ( (float) n_samples_sf );
497 : }
498 20304 : hRendererData->interpolator_length = n_samples_sf;
499 : }
500 :
501 1725942 : md_idx = hSpatParamRendCom->render_to_md_map[subframe_idx];
502 :
503 1725942 : if ( single_separated )
504 : {
505 251460 : if ( st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ && st_ivas->hMasaIsmData->ism_dir_is_edited[st_ivas->hMasaIsmData->idx_separated_ism] )
506 : {
507 0 : azimuth = st_ivas->hMasaIsmData->azimuth_ism_edited[st_ivas->hMasaIsmData->idx_separated_ism];
508 0 : elevation = st_ivas->hMasaIsmData->elevation_ism_edited[st_ivas->hMasaIsmData->idx_separated_ism];
509 : }
510 : else
511 : {
512 251460 : azimuth = st_ivas->hMasaIsmData->azimuth_separated_ism[md_idx];
513 251460 : elevation = st_ivas->hMasaIsmData->elevation_separated_ism[md_idx];
514 : }
515 : }
516 : else
517 : {
518 1474482 : if ( st_ivas->hMasaIsmData->ism_dir_is_edited[obj] )
519 : {
520 29694 : azimuth = st_ivas->hMasaIsmData->azimuth_ism_edited[obj];
521 29694 : elevation = st_ivas->hMasaIsmData->elevation_ism_edited[obj];
522 : }
523 : else
524 : {
525 1444788 : azimuth = st_ivas->hMasaIsmData->azimuth_ism[obj][md_idx];
526 1444788 : elevation = st_ivas->hMasaIsmData->elevation_ism[obj][md_idx];
527 : }
528 : }
529 :
530 1725942 : if ( st_ivas->hOutSetup.is_planar_setup )
531 : {
532 : /* If no elevation support in output format, then rendering should be done with zero elevation */
533 410436 : elevation = 0;
534 : }
535 :
536 1725942 : if ( hVBAPdata != NULL )
537 : {
538 1031730 : vbap_determine_gains( hVBAPdata, gains, azimuth, elevation, 1 );
539 : }
540 : else
541 : {
542 694212 : ivas_dirac_dec_get_response( azimuth, elevation, gains, hDirACRend->hOutSetup.ambisonics_order );
543 : }
544 :
545 16325244 : for ( j = 0; j < nchan_out_woLFE; j++ )
546 : {
547 14599302 : if ( hDirACRend->hOutSetup.num_lfe > 0 )
548 : {
549 8044254 : j2 = j + ( j >= lfe_index );
550 : }
551 : else
552 : {
553 6555048 : j2 = j;
554 : }
555 :
556 14599302 : if ( fabsf( gains[j] ) > 0.0f || fabsf( hRendererData->prev_gains[obj][j] ) > 0.0f )
557 : {
558 1485991905 : for ( k = 0; k < n_samples_sf; k++ )
559 : {
560 1477068360 : g1 = hRendererData->interpolator[k];
561 1477068360 : g2 = 1.0f - g1;
562 1477068360 : output_f_local[j2][k + offsetSamples] += ( g1 * gains[j] + g2 * hRendererData->prev_gains[obj][j] ) * input_f[obj][k + offsetSamples];
563 : }
564 : }
565 14599302 : hRendererData->prev_gains[obj][j] = gains[j];
566 : }
567 :
568 1725942 : offsetSamples += n_samples_sf;
569 : }
570 : }
571 :
572 264832 : return;
573 : }
|