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_rend.h"
38 : #include "ivas_rom_com.h"
39 : #include "ivas_prot.h"
40 : #include <string.h>
41 : #ifdef DEBUGGING
42 : #include "debug.h"
43 : #include <assert.h>
44 : #endif
45 : #include "wmc_auto.h"
46 :
47 : /*-------------------------------------------------------------------------*
48 : * audioCfg2channels()
49 : *
50 : * Map Audio configuration to number of channels
51 : *-------------------------------------------------------------------------*/
52 :
53 : /*! r: number of audio channels */
54 102005476 : int16_t audioCfg2channels(
55 : AUDIO_CONFIG output_config /* i : output audio configuration */
56 : )
57 : {
58 : int16_t nchan_out;
59 :
60 102005476 : switch ( output_config )
61 : {
62 23326 : case IVAS_AUDIO_CONFIG_MONO:
63 23326 : nchan_out = 1;
64 23326 : break;
65 26942 : case IVAS_AUDIO_CONFIG_STEREO:
66 26942 : nchan_out = 2;
67 26942 : break;
68 1920521 : case IVAS_AUDIO_CONFIG_5_1:
69 1920521 : nchan_out = 6;
70 1920521 : break;
71 1290710 : case IVAS_AUDIO_CONFIG_7_1:
72 1290710 : nchan_out = 8;
73 1290710 : break;
74 1103413 : case IVAS_AUDIO_CONFIG_5_1_2:
75 1103413 : nchan_out = 8;
76 1103413 : break;
77 1311006 : case IVAS_AUDIO_CONFIG_5_1_4:
78 1311006 : nchan_out = 10;
79 1311006 : break;
80 16288632 : case IVAS_AUDIO_CONFIG_7_1_4:
81 16288632 : nchan_out = 12;
82 16288632 : break;
83 104028 : case IVAS_AUDIO_CONFIG_FOA:
84 104028 : nchan_out = 4;
85 104028 : break;
86 27914 : case IVAS_AUDIO_CONFIG_HOA2:
87 27914 : nchan_out = 9;
88 27914 : break;
89 18346420 : case IVAS_AUDIO_CONFIG_HOA3:
90 18346420 : nchan_out = 16;
91 18346420 : break;
92 0 : case IVAS_AUDIO_CONFIG_OBA:
93 0 : nchan_out = 8;
94 0 : break;
95 122064 : case IVAS_AUDIO_CONFIG_BINAURAL:
96 : case IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED:
97 : case IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM:
98 : case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR:
99 : case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB:
100 122064 : nchan_out = 2;
101 122064 : break;
102 60968525 : case IVAS_AUDIO_CONFIG_ISM1:
103 60968525 : nchan_out = 1;
104 60968525 : break;
105 81598 : case IVAS_AUDIO_CONFIG_ISM2:
106 81598 : nchan_out = 2;
107 81598 : break;
108 71049 : case IVAS_AUDIO_CONFIG_ISM3:
109 71049 : nchan_out = 3;
110 71049 : break;
111 318087 : case IVAS_AUDIO_CONFIG_ISM4:
112 318087 : nchan_out = 4;
113 318087 : break;
114 1241 : default:
115 1241 : IVAS_ERROR( IVAS_ERR_INTERNAL, "Error: illegal output configuration\n" );
116 1241 : nchan_out = -1;
117 1241 : break;
118 : }
119 :
120 102005476 : return ( nchan_out );
121 : }
122 :
123 :
124 : /*-------------------------------------------------------------------------*
125 : * ivas_output_init()
126 : *
127 : * Initialize and configure IVAS output parameters
128 : *-------------------------------------------------------------------------*/
129 :
130 431937 : void ivas_output_init(
131 : IVAS_OUTPUT_SETUP *hOutSetup, /* o : IVAS output setup structure */
132 : const AUDIO_CONFIG output_config /* i : output audio configuration */
133 : )
134 : {
135 : int16_t nchan_out;
136 :
137 : /* set general default values */
138 431937 : hOutSetup->output_config = output_config;
139 431937 : hOutSetup->is_loudspeaker_setup = 0;
140 431937 : hOutSetup->is_binaural_setup = 0;
141 431937 : hOutSetup->ambisonics_order = -1;
142 431937 : hOutSetup->separateChannelEnabled = 0;
143 431937 : hOutSetup->separateChannelIndex = 0;
144 :
145 431937 : if ( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM )
146 : {
147 317 : hOutSetup->is_loudspeaker_setup = 1;
148 : /* set in ivas_init_decoder: */
149 : /* hOutSetup->ls_azimuth */
150 : /* hOutSetup->ls_elevation */
151 : /* hOutSetup->num_lfe */
152 : /* hOutSetup->index_lfe[0] */
153 : /* hOutSetup->is_planar_setup */
154 : }
155 : else
156 : {
157 : /* Set default values for all other than custom LS setup */
158 431620 : hOutSetup->ls_azimuth = NULL;
159 431620 : hOutSetup->ls_elevation = NULL;
160 431620 : hOutSetup->num_lfe = 0;
161 431620 : hOutSetup->index_lfe[0] = -1;
162 431620 : hOutSetup->is_planar_setup = 0;
163 :
164 : /* set output setup specific values */
165 431620 : switch ( output_config )
166 : {
167 13407 : case IVAS_AUDIO_CONFIG_MONO:
168 13407 : hOutSetup->is_loudspeaker_setup = 1;
169 13407 : break;
170 14694 : case IVAS_AUDIO_CONFIG_STEREO:
171 14694 : hOutSetup->is_loudspeaker_setup = 1;
172 14694 : hOutSetup->ls_azimuth = ls_azimuth_CICP2;
173 14694 : hOutSetup->ls_elevation = ls_elevation_CICP2;
174 14694 : break;
175 94078 : case IVAS_AUDIO_CONFIG_FOA:
176 94078 : hOutSetup->ambisonics_order = SBA_FOA_ORDER;
177 94078 : break;
178 19173 : case IVAS_AUDIO_CONFIG_HOA2:
179 19173 : hOutSetup->ambisonics_order = SBA_HOA2_ORDER;
180 19173 : break;
181 37846 : case IVAS_AUDIO_CONFIG_HOA3:
182 37846 : hOutSetup->ambisonics_order = SBA_HOA3_ORDER;
183 37846 : break;
184 38834 : case IVAS_AUDIO_CONFIG_5_1:
185 38834 : hOutSetup->num_lfe = 1;
186 38834 : hOutSetup->index_lfe[0] = 3;
187 38834 : hOutSetup->is_loudspeaker_setup = 1;
188 38834 : hOutSetup->ls_azimuth = ls_azimuth_CICP6;
189 38834 : hOutSetup->ls_elevation = ls_elevation_CICP6;
190 38834 : hOutSetup->is_planar_setup = 1;
191 38834 : break;
192 18868 : case IVAS_AUDIO_CONFIG_7_1:
193 18868 : hOutSetup->num_lfe = 1;
194 18868 : hOutSetup->index_lfe[0] = 3;
195 18868 : hOutSetup->is_loudspeaker_setup = 1;
196 18868 : hOutSetup->ls_azimuth = ls_azimuth_CICP12;
197 18868 : hOutSetup->ls_elevation = ls_elevation_CICP12;
198 18868 : hOutSetup->is_planar_setup = 1;
199 18868 : break;
200 18468 : case IVAS_AUDIO_CONFIG_5_1_2:
201 18468 : hOutSetup->num_lfe = 1;
202 18468 : hOutSetup->index_lfe[0] = 3;
203 18468 : hOutSetup->is_loudspeaker_setup = 1;
204 18468 : hOutSetup->ls_azimuth = ls_azimuth_CICP14;
205 18468 : hOutSetup->ls_elevation = ls_elevation_CICP14;
206 18468 : hOutSetup->is_planar_setup = 0;
207 18468 : break;
208 17167 : case IVAS_AUDIO_CONFIG_5_1_4:
209 17167 : hOutSetup->num_lfe = 1;
210 17167 : hOutSetup->index_lfe[0] = 3;
211 17167 : hOutSetup->is_loudspeaker_setup = 1;
212 17167 : hOutSetup->ls_azimuth = ls_azimuth_CICP16;
213 17167 : hOutSetup->ls_elevation = ls_elevation_CICP16;
214 17167 : hOutSetup->is_planar_setup = 0;
215 17167 : break;
216 53201 : case IVAS_AUDIO_CONFIG_7_1_4:
217 53201 : hOutSetup->num_lfe = 1;
218 53201 : hOutSetup->index_lfe[0] = 3;
219 53201 : hOutSetup->is_loudspeaker_setup = 1;
220 53201 : hOutSetup->ls_azimuth = ls_azimuth_CICP19;
221 53201 : hOutSetup->ls_elevation = ls_elevation_CICP19;
222 53201 : hOutSetup->is_planar_setup = 0;
223 53201 : break;
224 91944 : case IVAS_AUDIO_CONFIG_BINAURAL:
225 : case IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED:
226 : case IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM:
227 : case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR:
228 : case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB:
229 : case IVAS_AUDIO_CONFIG_ISM1:
230 : case IVAS_AUDIO_CONFIG_ISM2:
231 : case IVAS_AUDIO_CONFIG_ISM3:
232 : case IVAS_AUDIO_CONFIG_ISM4:
233 91944 : hOutSetup->is_binaural_setup = 1;
234 105884 : case IVAS_AUDIO_CONFIG_EXTERNAL:
235 : /* Default values are used */
236 105884 : break;
237 0 : default:
238 : #ifdef DEBUGGING
239 : /* error */
240 : assert( !"Error: Unknown output setup!\n" );
241 : #endif
242 0 : return;
243 : }
244 : }
245 :
246 431937 : if ( output_config != IVAS_AUDIO_CONFIG_EXTERNAL && output_config != IVAS_AUDIO_CONFIG_LS_CUSTOM )
247 : {
248 417680 : nchan_out = audioCfg2channels( output_config );
249 417680 : hOutSetup->nchan_out_woLFE = nchan_out - hOutSetup->num_lfe;
250 : }
251 :
252 431937 : return;
253 : }
254 :
255 :
256 : /*-----------------------------------------------------------------*
257 : * ivas_get_nchan_buffers_dec()
258 : *
259 : * Return number of decoder audio buffers
260 : *-----------------------------------------------------------------*/
261 :
262 : /*! r: number of decoder buffers */
263 43321584 : int16_t ivas_get_nchan_buffers_dec(
264 : Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
265 : const int16_t sba_analysis_order, /* i : SBA order evaluated in SBA decoder */
266 : const int32_t ivas_total_brate /* i : total IVAS bitrate */
267 : )
268 : {
269 : int16_t nchan_out_buff;
270 : AUDIO_CONFIG output_config;
271 :
272 43321584 : output_config = st_ivas->hDecoderConfig->output_config;
273 :
274 43321584 : nchan_out_buff = st_ivas->nchan_transport;
275 :
276 43321584 : if ( st_ivas->ivas_format == MONO_FORMAT )
277 : {
278 564 : nchan_out_buff = st_ivas->hDecoderConfig->nchan_out;
279 : }
280 43321020 : else if ( st_ivas->ivas_format == STEREO_FORMAT )
281 : {
282 1839 : nchan_out_buff = max( st_ivas->hDecoderConfig->nchan_out, CPE_CHANNELS );
283 : }
284 43319181 : else if ( st_ivas->ivas_format == ISM_FORMAT )
285 : {
286 89973 : nchan_out_buff = max( st_ivas->hDecoderConfig->nchan_out, st_ivas->nchan_ism );
287 :
288 89973 : if ( st_ivas->ism_mode == ISM_MODE_PARAM || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR )
289 : {
290 47847 : nchan_out_buff = max( nchan_out_buff, audioCfg2channels( st_ivas->intern_config ) );
291 : }
292 : }
293 43229208 : else if ( st_ivas->ivas_format == SBA_FORMAT )
294 : {
295 : int16_t nchan_internal;
296 23477500 : nchan_internal = ivas_sba_get_nchan_metadata( sba_analysis_order, ivas_total_brate );
297 :
298 23477500 : nchan_out_buff = max( nchan_internal, st_ivas->hDecoderConfig->nchan_out );
299 : }
300 19751708 : else if ( st_ivas->ivas_format == MASA_FORMAT )
301 : {
302 98020 : nchan_out_buff = max( st_ivas->hDecoderConfig->nchan_out, st_ivas->nchan_transport );
303 :
304 98020 : if ( st_ivas->hDiracDecBin[0] != NULL && st_ivas->hDiracDecBin[0]->useTdDecorr )
305 : {
306 25806 : nchan_out_buff = 2 * BINAURAL_CHANNELS;
307 : }
308 : }
309 19653688 : else if ( st_ivas->ivas_format == MASA_ISM_FORMAT )
310 : {
311 158269 : nchan_out_buff = max( st_ivas->hDecoderConfig->nchan_out, st_ivas->nchan_transport + st_ivas->nchan_ism );
312 : }
313 19495419 : else if ( st_ivas->ivas_format == SBA_ISM_FORMAT )
314 : {
315 : int16_t nchan_internal;
316 :
317 3756753 : nchan_internal = ivas_sba_get_nchan_metadata( sba_analysis_order, ivas_total_brate );
318 :
319 3756753 : if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC )
320 : {
321 2228855 : nchan_internal += st_ivas->nchan_ism;
322 : }
323 :
324 3756753 : if ( st_ivas->hMCT != NULL )
325 : {
326 2444296 : nchan_internal = ( ( nchan_internal + 1 ) >> 1 ) << 1; /* ensure odd number of channels in MCT */
327 : }
328 :
329 3756753 : nchan_out_buff = max( nchan_internal, st_ivas->hDecoderConfig->nchan_out );
330 :
331 3756753 : if ( output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR )
332 : {
333 339487 : nchan_out_buff = max( nchan_out_buff, audioCfg2channels( st_ivas->intern_config ) );
334 : }
335 : }
336 15738666 : else if ( st_ivas->ivas_format == MC_FORMAT )
337 : {
338 15738666 : nchan_out_buff = max( st_ivas->hDecoderConfig->nchan_out, st_ivas->nchan_transport );
339 :
340 15738666 : if ( st_ivas->hOutSetup.separateChannelEnabled )
341 : {
342 632517 : nchan_out_buff = max( nchan_out_buff, st_ivas->nchan_transport + 1 );
343 : }
344 :
345 15738666 : if ( st_ivas->hDiracDecBin[0] != NULL && st_ivas->hDiracDecBin[0]->useTdDecorr )
346 : {
347 6907 : nchan_out_buff = 2 * BINAURAL_CHANNELS;
348 : }
349 : else
350 : {
351 15731759 : nchan_out_buff = max( nchan_out_buff, audioCfg2channels( st_ivas->intern_config ) );
352 : }
353 : }
354 :
355 43321584 : if ( output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM )
356 : {
357 2135074 : nchan_out_buff = max( nchan_out_buff, st_ivas->hSplitBinRend->splitrend.multiBinPoseData.num_poses * BINAURAL_CHANNELS );
358 : }
359 :
360 43321584 : return nchan_out_buff;
361 : }
362 :
363 :
364 : /*-------------------------------------------------------------------*
365 : * ivas_output_buff_dec()
366 : *
367 : * Allocate/reallocate output audio buffers
368 : *-------------------------------------------------------------------*/
369 :
370 456259 : ivas_error ivas_output_buff_dec(
371 : float *p_output_f[], /* i/o: output audio buffers */
372 : const int16_t nchan_out_buff, /* i : number of output channels */
373 : const int16_t Opt_tsm, /* i : TSM option flag */
374 : DECODER_TC_BUFFER_HANDLE hTcBuffer /* i : TSM buffer handle */
375 : )
376 : {
377 : int16_t ch, nchan_tc_jbm, nsamp_to_allocate, n_samp_full, offset;
378 :
379 9581439 : for ( ch = 0; ch < MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS; ch++ )
380 : {
381 9125180 : p_output_f[ch] = NULL;
382 : }
383 :
384 456259 : if ( hTcBuffer->tc_buffer2 != NULL )
385 : {
386 87426 : free( hTcBuffer->tc_buffer2 );
387 87426 : hTcBuffer->tc_buffer2 = NULL;
388 : }
389 :
390 456259 : nchan_tc_jbm = 0;
391 456259 : if ( Opt_tsm )
392 : {
393 : /* JBM decoding: output audio buffers are shared with audio buffers from 'hTcBuffer->tc[]' */
394 150866 : nchan_tc_jbm = max( hTcBuffer->nchan_transport_jbm, hTcBuffer->nchan_buffer_full );
395 : }
396 :
397 456259 : if ( nchan_out_buff <= nchan_tc_jbm && !Opt_tsm )
398 : {
399 0 : for ( ch = 0; ch < nchan_out_buff; ch++ )
400 : {
401 0 : p_output_f[ch] = hTcBuffer->tc[ch];
402 : }
403 : }
404 : else
405 : {
406 1016573 : for ( ch = 0; ch < nchan_tc_jbm; ch++ )
407 : {
408 560314 : p_output_f[ch] = hTcBuffer->tc[ch];
409 : }
410 :
411 : /* non-JBM decoding: allocate output audio buffers */
412 : /* JBM decoding: when not enough audio buffers 'hTcBuffer->tc[]', allocate additional buffers */
413 456259 : n_samp_full = ( 48000 / FRAMES_PER_SEC );
414 456259 : nsamp_to_allocate = ( nchan_out_buff - nchan_tc_jbm ) * n_samp_full;
415 :
416 456259 : if ( nsamp_to_allocate > 0 )
417 : {
418 : /* note: these are intra-frame heap memories */
419 381921 : if ( ( hTcBuffer->tc_buffer2 = (float *) malloc( nsamp_to_allocate * sizeof( float ) ) ) == NULL )
420 : {
421 0 : return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for floating-point output audio buffer!\n" ) );
422 : }
423 :
424 381921 : set_zero( hTcBuffer->tc_buffer2, nsamp_to_allocate );
425 : }
426 :
427 456259 : offset = 0;
428 3147113 : for ( ; ch < nchan_out_buff; ch++ )
429 : {
430 2690854 : p_output_f[ch] = &hTcBuffer->tc_buffer2[offset];
431 2690854 : offset += n_samp_full;
432 : }
433 : }
434 :
435 456259 : return IVAS_ERR_OK;
436 : }
437 :
438 :
439 : /*---------------------------------------------------------------------*
440 : * is_split_rendering_enabled()
441 : *
442 : *
443 : *---------------------------------------------------------------------*/
444 :
445 : /*! r: flag to indicate if split rendering is enabled */
446 43340780 : int16_t is_split_rendering_enabled(
447 : const DECODER_CONFIG_HANDLE hDecoderConfig, /* i : configuration structure */
448 : const IVAS_RENDER_CONFIG_HANDLE hRenderConfig /* i : Render config data structure */
449 : )
450 : {
451 43340780 : if ( hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ||
452 42468545 : ( hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_STEREO && hDecoderConfig->Opt_non_diegetic_pan && hRenderConfig->split_rend_config.dof == 0 ) )
453 : {
454 872235 : return 1;
455 : }
456 : else
457 : {
458 42468545 : return 0;
459 : }
460 : }
461 :
462 :
463 : /*---------------------------------------------------------------------*
464 : * get_channel_config()
465 : *
466 : * Gets a str related to input config
467 : *---------------------------------------------------------------------*/
468 :
469 130489 : ivas_error get_channel_config(
470 : const AUDIO_CONFIG config,
471 : char *str )
472 : {
473 130489 : if ( config == IVAS_AUDIO_CONFIG_MONO )
474 : {
475 6684 : strcpy( str, "Mono" );
476 : }
477 123805 : else if ( config == IVAS_AUDIO_CONFIG_STEREO )
478 : {
479 7247 : strcpy( str, "Stereo" );
480 : }
481 116558 : else if ( config == IVAS_AUDIO_CONFIG_ISM1 )
482 : {
483 2465 : strcpy( str, "Object-based audio (1 object)" );
484 : }
485 114093 : else if ( config == IVAS_AUDIO_CONFIG_ISM2 )
486 : {
487 2733 : strcpy( str, "Object-based audio (2 objects)" );
488 : }
489 111360 : else if ( config == IVAS_AUDIO_CONFIG_ISM3 )
490 : {
491 2291 : strcpy( str, "Object-based audio (3 objects)" );
492 : }
493 109069 : else if ( config == IVAS_AUDIO_CONFIG_ISM4 )
494 : {
495 2657 : strcpy( str, "Object-based audio (4 objects)" );
496 : }
497 106412 : else if ( config == IVAS_AUDIO_CONFIG_5_1 )
498 : {
499 6732 : strcpy( str, "Multichannel 5.1 (CICP6)" );
500 : }
501 99680 : else if ( config == IVAS_AUDIO_CONFIG_7_1 )
502 : {
503 6531 : strcpy( str, "Multichannel 7.1 (CICP12)" );
504 : }
505 93149 : else if ( config == IVAS_AUDIO_CONFIG_5_1_2 )
506 : {
507 6533 : strcpy( str, "Multichannel 5.1+2 (CICP14)" );
508 : }
509 86616 : else if ( config == IVAS_AUDIO_CONFIG_5_1_4 )
510 : {
511 6735 : strcpy( str, "Multichannel 5.1+4 (CICP16)" );
512 : }
513 79881 : else if ( config == IVAS_AUDIO_CONFIG_7_1_4 )
514 : {
515 6759 : strcpy( str, "Multichannel 7.1+4 (CICP19)" );
516 : }
517 73122 : else if ( config == IVAS_AUDIO_CONFIG_LS_CUSTOM )
518 : {
519 2133 : strcpy( str, "Multichannel (custom loudspeaker layout)" );
520 : }
521 70989 : else if ( config == IVAS_AUDIO_CONFIG_MASA1 )
522 : {
523 2234 : strcpy( str, "Metadata-Assisted Spatial Audio mono (MASA1)" );
524 : }
525 68755 : else if ( config == IVAS_AUDIO_CONFIG_MASA2 )
526 : {
527 2323 : strcpy( str, "Metadata-Assisted Spatial Audio stereo (MASA2)" );
528 : }
529 66432 : else if ( config == IVAS_AUDIO_CONFIG_FOA )
530 : {
531 9454 : strcpy( str, "Ambisonics: First Order (FOA)" );
532 : }
533 56978 : else if ( config == IVAS_AUDIO_CONFIG_HOA2 )
534 : {
535 7949 : strcpy( str, "Ambisonics: Second Order (HOA2)" );
536 : }
537 49029 : else if ( config == IVAS_AUDIO_CONFIG_HOA3 )
538 : {
539 8250 : strcpy( str, "Ambisonics: Third Order (HOA3)" );
540 : }
541 40779 : else if ( config == IVAS_AUDIO_CONFIG_BINAURAL )
542 : {
543 10090 : strcpy( str, "Binaural: no room" );
544 : }
545 30689 : else if ( config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR )
546 : {
547 9716 : strcpy( str, "Binaural: room with impulse responses" );
548 : }
549 20973 : else if ( config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB )
550 : {
551 11557 : strcpy( str, "Binaural: room with reverb" );
552 : }
553 9416 : else if ( config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED )
554 : {
555 3540 : strcpy( str, "BINAURAL_SPLIT_CODED" );
556 : }
557 5876 : else if ( config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM )
558 : {
559 52 : strcpy( str, "Binaural_Split_PCM" );
560 : }
561 5824 : else if ( config == IVAS_AUDIO_CONFIG_EXTERNAL )
562 : {
563 5824 : strcpy( str, "External renderer" );
564 : }
565 : else
566 : {
567 0 : return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Error: Incorrect Input/Output Configuration" );
568 : }
569 :
570 130489 : return IVAS_ERR_OK;
571 : }
|