LCOV - code coverage report
Current view: top level - lib_rend - ivas_crend.c (source / functions) Hit Total Coverage
Test: Coverage on main @ 6baab0c613aa6c7100498ed7b93676aa8198a493 Lines: 582 842 69.1 %
Date: 2025-05-29 08:28:55 Functions: 14 17 82.4 %

          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 "prot.h"
      36             : #include "ivas_prot.h"
      37             : #include "ivas_prot_rend.h"
      38             : #include "ivas_cnst.h"
      39             : #include "ivas_rom_rend.h"
      40             : #include <math.h>
      41             : #include "ivas_rom_binaural_crend_head.h"
      42             : #include "ivas_stat_rend.h"
      43             : #include "lib_rend.h"
      44             : #ifdef DEBUGGING
      45             : #include "debug.h"
      46             : #endif
      47             : #include "wmc_auto.h"
      48             : 
      49             : 
      50             : /*-------------------------------------------------------------------------
      51             :  * ivas_Crend_hrtf_init()
      52             :  *
      53             :  * Initialize hHrtf handle
      54             :  *------------------------------------------------------------------------*/
      55             : 
      56        6606 : ivas_error ivas_Crend_hrtf_init(
      57             :     HRTFS_CREND_DATA *hHrtf /* i/o: HRTF handle     */
      58             : )
      59             : {
      60             :     int16_t i, j;
      61             : 
      62        6606 :     if ( hHrtf == NULL )
      63             :     {
      64           0 :         return IVAS_ERR_WRONG_PARAMS;
      65             :     }
      66             : 
      67        6606 :     hHrtf->latency_s = 0;
      68        6606 :     hHrtf->max_num_ir = 0;
      69        6606 :     hHrtf->max_num_iterations = 0;
      70        6606 :     hHrtf->gain_lfe = 0;
      71        6606 :     hHrtf->index_frequency_max_diffuse = 0;
      72        6606 :     hHrtf->same_inv_diffuse_weight = 1;
      73             : 
      74      112302 :     for ( i = 0; i < MAX_INTERN_CHANNELS; i++ )
      75             :     {
      76      317088 :         for ( j = 0; j < BINAURAL_CHANNELS; j++ )
      77             :         {
      78      211392 :             hHrtf->inv_diffuse_weight[j][i] = 0;
      79      211392 :             hHrtf->num_iterations[i][j] = 0;
      80      211392 :             hHrtf->pIndex_frequency_max[i][j] = NULL;
      81      211392 :             hHrtf->pOut_to_bin_re[i][j] = NULL;
      82      211392 :             hHrtf->pOut_to_bin_im[i][j] = NULL;
      83             :         }
      84             :     }
      85             : 
      86       19818 :     for ( j = 0; j < BINAURAL_CHANNELS; j++ )
      87             :     {
      88       13212 :         hHrtf->num_iterations_diffuse[j] = 0;
      89       13212 :         hHrtf->pIndex_frequency_max_diffuse[j] = NULL;
      90       13212 :         hHrtf->pOut_to_bin_diffuse_re[j] = NULL;
      91       13212 :         hHrtf->pOut_to_bin_diffuse_im[j] = NULL;
      92             :     }
      93             : 
      94        6606 :     hHrtf->init_from_rom = 1;
      95             : 
      96        6606 :     return IVAS_ERR_OK;
      97             : }
      98             : 
      99             : 
     100             : /*-------------------------------------------------------------------------
     101             :  * ivas_hrtf_open()
     102             :  *
     103             :  * Open hHrtf handle for Crend renderer
     104             :  *------------------------------------------------------------------------*/
     105             : 
     106        5284 : static ivas_error ivas_hrtf_open(
     107             :     HRTFS_HANDLE *hHrtf_out /* o  : HRTF handle     */
     108             : )
     109             : {
     110             :     HRTFS_HANDLE hHrtf;
     111             :     ivas_error error;
     112             : 
     113        5284 :     if ( *hHrtf_out == NULL )
     114             :     {
     115        5284 :         if ( ( hHrtf = (HRTFS_HANDLE) malloc( sizeof( HRTFS_DATA ) ) ) == NULL )
     116             :         {
     117           0 :             return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend HRTFS Handle\n" );
     118             :         }
     119             : 
     120        5284 :         if ( ( error = ivas_Crend_hrtf_init( hHrtf ) ) != IVAS_ERR_OK )
     121             :         {
     122           0 :             return error;
     123             :         }
     124             : 
     125        5284 :         *hHrtf_out = hHrtf;
     126             :     }
     127             :     else
     128             :     {
     129           0 :         return IVAS_ERR_INTERNAL;
     130             :     }
     131             : 
     132        5284 :     return IVAS_ERR_OK;
     133             : }
     134             : 
     135             : 
     136             : /*-------------------------------------------------------------------------
     137             :  * ivas_hrtf_close()
     138             :  *
     139             :  * Close hHrtf handle
     140             :  *------------------------------------------------------------------------*/
     141             : 
     142        5284 : static void ivas_hrtf_close(
     143             :     HRTFS_HANDLE *hHrtf /* i/o: HRTF handle         */
     144             : )
     145             : {
     146        5284 :     if ( hHrtf == NULL || *hHrtf == NULL )
     147             :     {
     148           0 :         return;
     149             :     }
     150             : 
     151        5284 :     free( *hHrtf );
     152        5284 :     *hHrtf = NULL;
     153             : 
     154        5284 :     return;
     155             : }
     156             : 
     157             : 
     158             : /*-------------------------------------------------------------------------
     159             :  * ivas_rend_initCrend()
     160             :  *
     161             :  * Allocate and initialize crend renderer handle
     162             :  *------------------------------------------------------------------------*/
     163             : 
     164        6606 : static ivas_error ivas_rend_initCrend(
     165             :     CREND_WRAPPER *pCrend,
     166             :     const AUDIO_CONFIG inConfig,
     167             :     const AUDIO_CONFIG outConfig,
     168             :     HRTFS_CREND_HANDLE hHrtfCrend,
     169             :     const int16_t ext_rend_flag,
     170             :     const int32_t output_Fs )
     171             : {
     172             :     int16_t i, j, tmp, tmp2;
     173             :     int16_t nchan_in;
     174             :     IVAS_REND_AudioConfigType inConfigType;
     175             :     HRTFS_HANDLE hHrtf;
     176             :     ivas_error error;
     177             : 
     178        6606 :     inConfigType = getAudioConfigType( inConfig );
     179        6606 :     hHrtf = pCrend->hHrtfCrend;
     180             : 
     181             :     /* Do all error checks up front so that the nested if later is easier */
     182        6606 :     if ( inConfigType != IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED && inConfigType != IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS )
     183             :     {
     184           0 :         return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Encountered unsupported input config in Crend" );
     185             :     }
     186             : 
     187        6606 :     if ( outConfig != IVAS_AUDIO_CONFIG_BINAURAL && outConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR && outConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB && outConfig != IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED && outConfig != IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM )
     188             :     {
     189           0 :         return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Encountered unsupported output type in Crend" );
     190             :     }
     191             : 
     192        6606 :     if ( hHrtf == NULL )
     193             :     {
     194        6606 :         if ( hHrtfCrend != NULL && ext_rend_flag == 0 )
     195             :         {
     196             :             /* HRTF set loaded from binary file */
     197        1322 :             hHrtf = hHrtfCrend;
     198        1322 :             hHrtf->init_from_rom = 0;
     199             :         }
     200             :         else
     201             :         {
     202             :             /* create new handle when HRTF is loaded from ROM, or external renderer is used */
     203        5284 :             if ( ( error = ivas_hrtf_open( &hHrtf ) ) != IVAS_ERR_OK )
     204             :             {
     205           0 :                 return error;
     206             :             }
     207             : 
     208        5284 :             hHrtf->init_from_rom = 1;
     209        5284 :             if ( hHrtfCrend != NULL )
     210             :             {
     211           0 :                 hHrtf->init_from_rom = 0;
     212             :             }
     213             :         }
     214             :     }
     215             : 
     216        6606 :     if ( ( error = getAudioConfigNumChannels( inConfig, &nchan_in ) ) != IVAS_ERR_OK )
     217             :     {
     218           0 :         return error;
     219             :     }
     220        6606 :     hHrtf->max_num_ir = nchan_in;
     221             : 
     222        6606 :     if ( hHrtf->max_num_ir <= 0 )
     223             :     {
     224           0 :         return IVAS_ERR_INTERNAL_FATAL;
     225             :     }
     226             : 
     227        6606 :     if ( hHrtf->init_from_rom )
     228             :     {
     229        5284 :         if ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED )
     230             :         {
     231        5044 :             hHrtf->max_num_ir -= 1; /* subtract LFE */
     232        5044 :             hHrtf->gain_lfe = GAIN_LFE;
     233             : 
     234        5044 :             if ( output_Fs == 48000 )
     235             :             {
     236        2445 :                 if ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR )
     237             :                 {
     238        1891 :                     hHrtf->latency_s = CRendBin_Combined_BRIR_latency_s;
     239        1891 :                     hHrtf->max_num_iterations = CRendBin_Combined_BRIR_max_num_iterations_48kHz;
     240        1891 :                     hHrtf->index_frequency_max_diffuse = CRendBin_Combined_BRIR_index_frequency_max_diffuse_48kHz;
     241             :                 }
     242             :                 else
     243             :                 {
     244         554 :                     hHrtf->latency_s = CRendBin_Combined_HRIR_latency_s;
     245         554 :                     hHrtf->max_num_iterations = CRendBin_Combined_HRIR_max_num_iterations_48kHz;
     246         554 :                     hHrtf->index_frequency_max_diffuse = CRendBin_Combined_HRIR_index_frequency_max_diffuse_48kHz;
     247             :                 }
     248             : 
     249        7335 :                 for ( j = 0; j < BINAURAL_CHANNELS; j++ )
     250             :                 {
     251        4890 :                     if ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR )
     252             :                     {
     253        3782 :                         hHrtf->num_iterations_diffuse[j] = CRendBin_Combined_BRIR_num_iterations_diffuse_48kHz[j];
     254        3782 :                         hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_48kHz[j];
     255        3782 :                         hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_Combined_BRIR_coeff_diffuse_re_48kHz[j];
     256        3782 :                         hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_Combined_BRIR_coeff_diffuse_im_48kHz[j];
     257             :                     }
     258             :                     else
     259             :                     {
     260        1108 :                         hHrtf->num_iterations_diffuse[j] = CRendBin_Combined_HRIR_num_iterations_diffuse_48kHz[j];
     261        1108 :                         hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_48kHz[j];
     262        1108 :                         hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_Combined_HRIR_coeff_diffuse_re_48kHz[j];
     263        1108 :                         hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_Combined_HRIR_coeff_diffuse_im_48kHz[j];
     264             :                     }
     265             :                 }
     266             :             }
     267        2599 :             else if ( output_Fs == 32000 )
     268             :             {
     269        1180 :                 if ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR )
     270             :                 {
     271        1048 :                     hHrtf->latency_s = CRendBin_Combined_BRIR_latency_s;
     272        1048 :                     hHrtf->max_num_iterations = CRendBin_Combined_BRIR_max_num_iterations_32kHz;
     273        1048 :                     hHrtf->index_frequency_max_diffuse = CRendBin_Combined_BRIR_index_frequency_max_diffuse_32kHz;
     274             :                 }
     275             :                 else
     276             :                 {
     277         132 :                     hHrtf->latency_s = CRendBin_Combined_HRIR_latency_s;
     278         132 :                     hHrtf->max_num_iterations = CRendBin_Combined_HRIR_max_num_iterations_32kHz;
     279         132 :                     hHrtf->index_frequency_max_diffuse = CRendBin_Combined_HRIR_index_frequency_max_diffuse_32kHz;
     280             :                 }
     281             : 
     282        3540 :                 for ( j = 0; j < BINAURAL_CHANNELS; j++ )
     283             :                 {
     284        2360 :                     if ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR )
     285             :                     {
     286        2096 :                         hHrtf->num_iterations_diffuse[j] = CRendBin_Combined_BRIR_num_iterations_diffuse_32kHz[j];
     287        2096 :                         hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_32kHz[j];
     288        2096 :                         hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_Combined_BRIR_coeff_diffuse_re_32kHz[j];
     289        2096 :                         hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_Combined_BRIR_coeff_diffuse_im_32kHz[j];
     290             :                     }
     291             :                     else
     292             :                     {
     293         264 :                         hHrtf->num_iterations_diffuse[j] = CRendBin_Combined_HRIR_num_iterations_diffuse_32kHz[j];
     294         264 :                         hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_32kHz[j];
     295         264 :                         hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_Combined_HRIR_coeff_diffuse_re_32kHz[j];
     296         264 :                         hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_Combined_HRIR_coeff_diffuse_im_32kHz[j];
     297             :                     }
     298             :                 }
     299             :             }
     300        1419 :             else if ( output_Fs == 16000 )
     301             :             {
     302        1419 :                 if ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR )
     303             :                 {
     304         615 :                     hHrtf->latency_s = CRendBin_Combined_BRIR_latency_s;
     305             : 
     306         615 :                     hHrtf->max_num_iterations = CRendBin_Combined_BRIR_max_num_iterations_16kHz;
     307         615 :                     hHrtf->index_frequency_max_diffuse = CRendBin_Combined_BRIR_index_frequency_max_diffuse_16kHz;
     308             :                 }
     309             :                 else
     310             :                 {
     311         804 :                     hHrtf->latency_s = CRendBin_Combined_HRIR_latency_s;
     312         804 :                     hHrtf->max_num_iterations = CRendBin_Combined_HRIR_max_num_iterations_16kHz;
     313         804 :                     hHrtf->index_frequency_max_diffuse = CRendBin_Combined_HRIR_index_frequency_max_diffuse_16kHz;
     314             :                 }
     315             : 
     316        4257 :                 for ( j = 0; j < BINAURAL_CHANNELS; j++ )
     317             :                 {
     318        2838 :                     if ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR )
     319             :                     {
     320        1230 :                         hHrtf->num_iterations_diffuse[j] = CRendBin_Combined_BRIR_num_iterations_diffuse_16kHz[j];
     321        1230 :                         hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_16kHz[j];
     322        1230 :                         hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_Combined_BRIR_coeff_diffuse_re_16kHz[j];
     323        1230 :                         hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_Combined_BRIR_coeff_diffuse_im_16kHz[j];
     324             :                     }
     325             :                     else
     326             :                     {
     327        1608 :                         hHrtf->num_iterations_diffuse[j] = CRendBin_Combined_HRIR_num_iterations_diffuse_16kHz[j];
     328        1608 :                         hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_16kHz[j];
     329        1608 :                         hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_Combined_HRIR_coeff_diffuse_re_16kHz[j];
     330        1608 :                         hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_Combined_HRIR_coeff_diffuse_im_16kHz[j];
     331             :                     }
     332             :                 }
     333             :             }
     334             :             else
     335             :             {
     336           0 :                 return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "Encountered Unsupported sampling rate in Crend" );
     337             :             }
     338             : 
     339       47252 :             for ( i = 0; i < hHrtf->max_num_ir; i++ )
     340             :             {
     341       42208 :                 if ( inConfig == IVAS_AUDIO_CONFIG_5_1 )
     342             :                 {
     343        9100 :                     tmp = channelIndex_CICP6[i];
     344             :                 }
     345       33108 :                 else if ( inConfig == IVAS_AUDIO_CONFIG_7_1 )
     346             :                 {
     347        1022 :                     tmp = channelIndex_CICP12[i];
     348             :                 }
     349       32086 :                 else if ( inConfig == IVAS_AUDIO_CONFIG_5_1_2 )
     350             :                 {
     351        2611 :                     tmp = channelIndex_CICP14[i];
     352             :                 }
     353       29475 :                 else if ( inConfig == IVAS_AUDIO_CONFIG_5_1_4 )
     354             :                 {
     355        1260 :                     tmp = channelIndex_CICP16[i];
     356             :                 }
     357       28215 :                 else if ( inConfig == IVAS_AUDIO_CONFIG_7_1_4 )
     358             :                 {
     359       28215 :                     tmp = channelIndex_CICP19[i];
     360             :                 }
     361             :                 else
     362             :                 {
     363           0 :                     return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error: Channel configuration not specified!\n\n" );
     364             :                 }
     365             : 
     366       42208 :                 if ( output_Fs == 48000 )
     367             :                 {
     368       59781 :                     for ( j = 0; j < BINAURAL_CHANNELS; j++ )
     369             :                     {
     370       39854 :                         if ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR )
     371             :                         {
     372       32626 :                             hHrtf->inv_diffuse_weight[j][i] = CRendBin_Combined_BRIR_inv_diffuse_weight_48kHz[j][tmp];
     373       32626 :                             hHrtf->num_iterations[i][j] = CRendBin_Combined_BRIR_num_iterations_48kHz[tmp][j];
     374       32626 :                             hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_BRIR_pIndex_frequency_max_48kHz[tmp][j];
     375       32626 :                             hHrtf->pOut_to_bin_re[i][j] = CRendBin_Combined_BRIR_coeff_re_48kHz[tmp][j];
     376       32626 :                             hHrtf->pOut_to_bin_im[i][j] = CRendBin_Combined_BRIR_coeff_im_48kHz[tmp][j];
     377             :                         }
     378             :                         else
     379             :                         {
     380        7228 :                             hHrtf->inv_diffuse_weight[j][i] = CRendBin_Combined_HRIR_inv_diffuse_weight_48kHz[j][tmp];
     381        7228 :                             hHrtf->num_iterations[i][j] = CRendBin_Combined_HRIR_num_iterations_48kHz[tmp][j];
     382        7228 :                             hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_HRIR_pIndex_frequency_max_48kHz[tmp][j];
     383        7228 :                             hHrtf->pOut_to_bin_re[i][j] = CRendBin_Combined_HRIR_coeff_re_48kHz[tmp][j];
     384        7228 :                             hHrtf->pOut_to_bin_im[i][j] = CRendBin_Combined_HRIR_coeff_im_48kHz[tmp][j];
     385             :                         }
     386             :                     }
     387             :                 }
     388       22281 :                 else if ( output_Fs == 32000 )
     389             :                 {
     390       36852 :                     for ( j = 0; j < BINAURAL_CHANNELS; j++ )
     391             :                     {
     392       24568 :                         if ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR )
     393             :                         {
     394       22592 :                             hHrtf->inv_diffuse_weight[j][i] = CRendBin_Combined_BRIR_inv_diffuse_weight_32kHz[j][tmp];
     395       22592 :                             hHrtf->num_iterations[i][j] = CRendBin_Combined_BRIR_num_iterations_32kHz[tmp][j];
     396       22592 :                             hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_BRIR_pIndex_frequency_max_32kHz[tmp][j];
     397       22592 :                             hHrtf->pOut_to_bin_re[i][j] = CRendBin_Combined_BRIR_coeff_re_32kHz[tmp][j];
     398       22592 :                             hHrtf->pOut_to_bin_im[i][j] = CRendBin_Combined_BRIR_coeff_im_32kHz[tmp][j];
     399             :                         }
     400             :                         else
     401             :                         {
     402        1976 :                             hHrtf->inv_diffuse_weight[j][i] = CRendBin_Combined_HRIR_inv_diffuse_weight_32kHz[j][tmp];
     403        1976 :                             hHrtf->num_iterations[i][j] = CRendBin_Combined_HRIR_num_iterations_32kHz[tmp][j];
     404        1976 :                             hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_HRIR_pIndex_frequency_max_32kHz[tmp][j];
     405        1976 :                             hHrtf->pOut_to_bin_re[i][j] = CRendBin_Combined_HRIR_coeff_re_32kHz[tmp][j];
     406        1976 :                             hHrtf->pOut_to_bin_im[i][j] = CRendBin_Combined_HRIR_coeff_im_32kHz[tmp][j];
     407             :                         }
     408             :                     }
     409             :                 }
     410        9997 :                 else if ( output_Fs == 16000 )
     411             :                 {
     412       29991 :                     for ( j = 0; j < BINAURAL_CHANNELS; j++ )
     413             :                     {
     414       19994 :                         if ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR )
     415             :                         {
     416       11298 :                             hHrtf->inv_diffuse_weight[j][i] = CRendBin_Combined_BRIR_inv_diffuse_weight_16kHz[j][tmp];
     417       11298 :                             hHrtf->num_iterations[i][j] = CRendBin_Combined_BRIR_num_iterations_16kHz[tmp][j];
     418       11298 :                             hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_BRIR_pIndex_frequency_max_16kHz[tmp][j];
     419       11298 :                             hHrtf->pOut_to_bin_re[i][j] = CRendBin_Combined_BRIR_coeff_re_16kHz[tmp][j];
     420       11298 :                             hHrtf->pOut_to_bin_im[i][j] = CRendBin_Combined_BRIR_coeff_im_16kHz[tmp][j];
     421             :                         }
     422             :                         else
     423             :                         {
     424        8696 :                             hHrtf->inv_diffuse_weight[j][i] = CRendBin_Combined_HRIR_inv_diffuse_weight_16kHz[j][tmp];
     425        8696 :                             hHrtf->num_iterations[i][j] = CRendBin_Combined_HRIR_num_iterations_16kHz[tmp][j];
     426        8696 :                             hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_HRIR_pIndex_frequency_max_16kHz[tmp][j];
     427        8696 :                             hHrtf->pOut_to_bin_re[i][j] = CRendBin_Combined_HRIR_coeff_re_16kHz[tmp][j];
     428        8696 :                             hHrtf->pOut_to_bin_im[i][j] = CRendBin_Combined_HRIR_coeff_im_16kHz[tmp][j];
     429             :                         }
     430             :                     }
     431             :                 }
     432             :                 else
     433             :                 {
     434           0 :                     return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "Encountered Unsupported sampling rate in Crend" );
     435             :                 }
     436             :             }
     437             :         }
     438         240 :         else if ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS )
     439             :         {
     440         240 :             if ( inConfig == IVAS_AUDIO_CONFIG_HOA3 )
     441             :             {
     442         208 :                 if ( output_Fs == 48000 )
     443             :                 {
     444         208 :                     hHrtf->latency_s = CRendBin_HOA3_HRIR_latency_s;
     445         208 :                     hHrtf->max_num_iterations = CRendBin_HOA3_HRIR_max_num_iterations_48kHz;
     446         208 :                     hHrtf->index_frequency_max_diffuse = CRendBin_HOA3_HRIR_index_frequency_max_diffuse_48kHz;
     447             : 
     448        3536 :                     for ( i = 0; i < hHrtf->max_num_ir; i++ )
     449             :                     {
     450        9984 :                         for ( j = 0; j < BINAURAL_CHANNELS; j++ )
     451             :                         {
     452        6656 :                             hHrtf->inv_diffuse_weight[j][i] = CRendBin_HOA3_HRIR_inv_diffuse_weight_48kHz[j][i];
     453        6656 :                             hHrtf->num_iterations[i][j] = CRendBin_HOA3_HRIR_num_iterations_48kHz[i][j];
     454        6656 :                             hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_48kHz[i][j];
     455        6656 :                             hHrtf->pOut_to_bin_re[i][j] = CRendBin_HOA3_HRIR_coeff_re_48kHz[i][j];
     456        6656 :                             hHrtf->pOut_to_bin_im[i][j] = CRendBin_HOA3_HRIR_coeff_im_48kHz[i][j];
     457             :                         }
     458             :                     }
     459         624 :                     for ( j = 0; j < BINAURAL_CHANNELS; j++ )
     460             :                     {
     461         416 :                         hHrtf->num_iterations_diffuse[j] = CRendBin_HOA3_HRIR_num_iterations_diffuse_48kHz[j];
     462         416 :                         hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_48kHz[j];
     463         416 :                         hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_HOA3_HRIR_coeff_diffuse_re_48kHz[j];
     464         416 :                         hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA3_HRIR_coeff_diffuse_im_48kHz[j];
     465             :                     }
     466             :                 }
     467           0 :                 else if ( output_Fs == 32000 )
     468             :                 {
     469           0 :                     hHrtf->latency_s = CRendBin_HOA3_HRIR_latency_s;
     470           0 :                     hHrtf->max_num_iterations = CRendBin_HOA3_HRIR_max_num_iterations_32kHz;
     471           0 :                     hHrtf->index_frequency_max_diffuse = CRendBin_HOA3_HRIR_index_frequency_max_diffuse_32kHz;
     472             : 
     473           0 :                     for ( i = 0; i < hHrtf->max_num_ir; i++ )
     474             :                     {
     475           0 :                         for ( j = 0; j < BINAURAL_CHANNELS; j++ )
     476             :                         {
     477           0 :                             hHrtf->inv_diffuse_weight[j][i] = CRendBin_HOA3_HRIR_inv_diffuse_weight_32kHz[j][i];
     478           0 :                             hHrtf->num_iterations[i][j] = CRendBin_HOA3_HRIR_num_iterations_32kHz[i][j];
     479           0 :                             hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_32kHz[i][j];
     480           0 :                             hHrtf->pOut_to_bin_re[i][j] = CRendBin_HOA3_HRIR_coeff_re_32kHz[i][j];
     481           0 :                             hHrtf->pOut_to_bin_im[i][j] = CRendBin_HOA3_HRIR_coeff_im_32kHz[i][j];
     482             :                         }
     483             :                     }
     484             : 
     485           0 :                     for ( j = 0; j < BINAURAL_CHANNELS; j++ )
     486             :                     {
     487           0 :                         hHrtf->num_iterations_diffuse[j] = CRendBin_HOA3_HRIR_num_iterations_diffuse_32kHz[j];
     488           0 :                         hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_32kHz[j];
     489           0 :                         hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_HOA3_HRIR_coeff_diffuse_re_32kHz[j];
     490           0 :                         hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA3_HRIR_coeff_diffuse_im_32kHz[j];
     491             :                     }
     492             :                 }
     493           0 :                 else if ( output_Fs == 16000 )
     494             :                 {
     495           0 :                     hHrtf->latency_s = CRendBin_HOA3_HRIR_latency_s;
     496           0 :                     hHrtf->max_num_iterations = CRendBin_HOA3_HRIR_max_num_iterations_16kHz;
     497           0 :                     hHrtf->index_frequency_max_diffuse = CRendBin_HOA3_HRIR_index_frequency_max_diffuse_16kHz;
     498             : 
     499           0 :                     for ( i = 0; i < hHrtf->max_num_ir; i++ )
     500             :                     {
     501           0 :                         for ( j = 0; j < BINAURAL_CHANNELS; j++ )
     502             :                         {
     503           0 :                             hHrtf->inv_diffuse_weight[j][i] = CRendBin_HOA3_HRIR_inv_diffuse_weight_16kHz[j][i];
     504           0 :                             hHrtf->num_iterations[i][j] = CRendBin_HOA3_HRIR_num_iterations_16kHz[i][j];
     505           0 :                             hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_16kHz[i][j];
     506           0 :                             hHrtf->pOut_to_bin_re[i][j] = CRendBin_HOA3_HRIR_coeff_re_16kHz[i][j];
     507           0 :                             hHrtf->pOut_to_bin_im[i][j] = CRendBin_HOA3_HRIR_coeff_im_16kHz[i][j];
     508             :                         }
     509             :                     }
     510             : 
     511           0 :                     for ( j = 0; j < BINAURAL_CHANNELS; j++ )
     512             :                     {
     513           0 :                         hHrtf->num_iterations_diffuse[j] = CRendBin_HOA3_HRIR_num_iterations_diffuse_16kHz[j];
     514           0 :                         hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_16kHz[j];
     515           0 :                         hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_HOA3_HRIR_coeff_diffuse_re_16kHz[j];
     516           0 :                         hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz[j];
     517             :                     }
     518             :                 }
     519             :                 else
     520             :                 {
     521           0 :                     return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "Encountered Unsupported sampling rate in Crend" );
     522             :                 }
     523             :             }
     524          32 :             else if ( inConfig == IVAS_AUDIO_CONFIG_HOA2 )
     525             :             {
     526          16 :                 if ( output_Fs == 48000 )
     527             :                 {
     528          16 :                     hHrtf->latency_s = CRendBin_HOA2_HRIR_latency_s;
     529          16 :                     hHrtf->max_num_iterations = CRendBin_HOA2_HRIR_max_num_iterations_48kHz;
     530          16 :                     hHrtf->index_frequency_max_diffuse = CRendBin_HOA2_HRIR_index_frequency_max_diffuse_48kHz;
     531             : 
     532         160 :                     for ( i = 0; i < hHrtf->max_num_ir; i++ )
     533             :                     {
     534         432 :                         for ( j = 0; j < BINAURAL_CHANNELS; j++ )
     535             :                         {
     536         288 :                             hHrtf->inv_diffuse_weight[j][i] = CRendBin_HOA2_HRIR_inv_diffuse_weight_48kHz[j][i];
     537         288 :                             hHrtf->num_iterations[i][j] = CRendBin_HOA2_HRIR_num_iterations_48kHz[i][j];
     538         288 :                             hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA2_HRIR_pIndex_frequency_max_48kHz[i][j];
     539         288 :                             hHrtf->pOut_to_bin_re[i][j] = CRendBin_HOA2_HRIR_coeff_re_48kHz[i][j];
     540         288 :                             hHrtf->pOut_to_bin_im[i][j] = CRendBin_HOA2_HRIR_coeff_im_48kHz[i][j];
     541             :                         }
     542             :                     }
     543          48 :                     for ( j = 0; j < BINAURAL_CHANNELS; j++ )
     544             :                     {
     545          32 :                         hHrtf->num_iterations_diffuse[j] = CRendBin_HOA2_HRIR_num_iterations_diffuse_48kHz[j];
     546          32 :                         hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_48kHz[j];
     547          32 :                         hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_HOA2_HRIR_coeff_diffuse_re_48kHz[j];
     548          32 :                         hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA2_HRIR_coeff_diffuse_im_48kHz[j];
     549             :                     }
     550             :                 }
     551           0 :                 else if ( output_Fs == 32000 )
     552             :                 {
     553           0 :                     hHrtf->latency_s = CRendBin_HOA2_HRIR_latency_s;
     554           0 :                     hHrtf->max_num_iterations = CRendBin_HOA2_HRIR_max_num_iterations_32kHz;
     555           0 :                     hHrtf->index_frequency_max_diffuse = CRendBin_HOA2_HRIR_index_frequency_max_diffuse_32kHz;
     556             : 
     557           0 :                     for ( i = 0; i < hHrtf->max_num_ir; i++ )
     558             :                     {
     559           0 :                         for ( j = 0; j < BINAURAL_CHANNELS; j++ )
     560             :                         {
     561           0 :                             hHrtf->inv_diffuse_weight[j][i] = CRendBin_HOA2_HRIR_inv_diffuse_weight_32kHz[j][i];
     562           0 :                             hHrtf->num_iterations[i][j] = CRendBin_HOA2_HRIR_num_iterations_32kHz[i][j];
     563           0 :                             hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA2_HRIR_pIndex_frequency_max_32kHz[i][j];
     564           0 :                             hHrtf->pOut_to_bin_re[i][j] = CRendBin_HOA2_HRIR_coeff_re_32kHz[i][j];
     565           0 :                             hHrtf->pOut_to_bin_im[i][j] = CRendBin_HOA2_HRIR_coeff_im_32kHz[i][j];
     566             :                         }
     567             :                     }
     568             : 
     569           0 :                     for ( j = 0; j < BINAURAL_CHANNELS; j++ )
     570             :                     {
     571           0 :                         hHrtf->num_iterations_diffuse[j] = CRendBin_HOA2_HRIR_num_iterations_diffuse_32kHz[j];
     572           0 :                         hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_32kHz[j];
     573           0 :                         hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_HOA2_HRIR_coeff_diffuse_re_32kHz[j];
     574           0 :                         hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA2_HRIR_coeff_diffuse_im_32kHz[j];
     575             :                     }
     576             :                 }
     577           0 :                 else if ( output_Fs == 16000 )
     578             :                 {
     579           0 :                     hHrtf->latency_s = CRendBin_HOA2_HRIR_latency_s;
     580           0 :                     hHrtf->max_num_iterations = CRendBin_HOA2_HRIR_max_num_iterations_16kHz;
     581           0 :                     hHrtf->index_frequency_max_diffuse = CRendBin_HOA2_HRIR_index_frequency_max_diffuse_16kHz;
     582             : 
     583           0 :                     for ( i = 0; i < hHrtf->max_num_ir; i++ )
     584             :                     {
     585           0 :                         for ( j = 0; j < BINAURAL_CHANNELS; j++ )
     586             :                         {
     587           0 :                             hHrtf->inv_diffuse_weight[j][i] = CRendBin_HOA2_HRIR_inv_diffuse_weight_16kHz[j][i];
     588           0 :                             hHrtf->num_iterations[i][j] = CRendBin_HOA2_HRIR_num_iterations_16kHz[i][j];
     589           0 :                             hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA2_HRIR_pIndex_frequency_max_16kHz[i][j];
     590           0 :                             hHrtf->pOut_to_bin_re[i][j] = CRendBin_HOA2_HRIR_coeff_re_16kHz[i][j];
     591           0 :                             hHrtf->pOut_to_bin_im[i][j] = CRendBin_HOA2_HRIR_coeff_im_16kHz[i][j];
     592             :                         }
     593             :                     }
     594             : 
     595           0 :                     for ( j = 0; j < BINAURAL_CHANNELS; j++ )
     596             :                     {
     597           0 :                         hHrtf->num_iterations_diffuse[j] = CRendBin_HOA2_HRIR_num_iterations_diffuse_16kHz[j];
     598           0 :                         hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_16kHz[j];
     599           0 :                         hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_HOA2_HRIR_coeff_diffuse_re_16kHz[j];
     600           0 :                         hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA2_HRIR_coeff_diffuse_im_16kHz[j];
     601             :                     }
     602             :                 }
     603             :                 else
     604             :                 {
     605           0 :                     return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "Encountered Unsupported sampling rate in Crend" );
     606             :                 }
     607             :             }
     608          16 :             else if ( inConfig == IVAS_AUDIO_CONFIG_FOA )
     609             :             {
     610          16 :                 if ( output_Fs == 48000 )
     611             :                 {
     612          16 :                     hHrtf->latency_s = CRendBin_FOA_HRIR_latency_s;
     613          16 :                     hHrtf->max_num_iterations = CRendBin_FOA_HRIR_max_num_iterations_48kHz;
     614          16 :                     hHrtf->index_frequency_max_diffuse = CRendBin_FOA_HRIR_index_frequency_max_diffuse_48kHz;
     615             : 
     616          80 :                     for ( i = 0; i < hHrtf->max_num_ir; i++ )
     617             :                     {
     618         192 :                         for ( j = 0; j < BINAURAL_CHANNELS; j++ )
     619             :                         {
     620         128 :                             hHrtf->inv_diffuse_weight[j][i] = CRendBin_FOA_HRIR_inv_diffuse_weight_48kHz[j][i];
     621         128 :                             hHrtf->num_iterations[i][j] = CRendBin_FOA_HRIR_num_iterations_48kHz[i][j];
     622         128 :                             hHrtf->pIndex_frequency_max[i][j] = CRendBin_FOA_HRIR_pIndex_frequency_max_48kHz[i][j];
     623         128 :                             hHrtf->pOut_to_bin_re[i][j] = CRendBin_FOA_HRIR_coeff_re_48kHz[i][j];
     624         128 :                             hHrtf->pOut_to_bin_im[i][j] = CRendBin_FOA_HRIR_coeff_im_48kHz[i][j];
     625             :                         }
     626             :                     }
     627          48 :                     for ( j = 0; j < BINAURAL_CHANNELS; j++ )
     628             :                     {
     629          32 :                         hHrtf->num_iterations_diffuse[j] = CRendBin_FOA_HRIR_num_iterations_diffuse_48kHz[j];
     630          32 :                         hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_48kHz[j];
     631          32 :                         hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_FOA_HRIR_coeff_diffuse_re_48kHz[j];
     632          32 :                         hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_FOA_HRIR_coeff_diffuse_im_48kHz[j];
     633             :                     }
     634             :                 }
     635           0 :                 else if ( output_Fs == 32000 )
     636             :                 {
     637           0 :                     hHrtf->latency_s = CRendBin_FOA_HRIR_latency_s;
     638           0 :                     hHrtf->max_num_iterations = CRendBin_FOA_HRIR_max_num_iterations_32kHz;
     639           0 :                     hHrtf->index_frequency_max_diffuse = CRendBin_FOA_HRIR_index_frequency_max_diffuse_32kHz;
     640             : 
     641           0 :                     for ( i = 0; i < hHrtf->max_num_ir; i++ )
     642             :                     {
     643           0 :                         for ( j = 0; j < BINAURAL_CHANNELS; j++ )
     644             :                         {
     645           0 :                             hHrtf->inv_diffuse_weight[j][i] = CRendBin_FOA_HRIR_inv_diffuse_weight_32kHz[j][i];
     646           0 :                             hHrtf->num_iterations[i][j] = CRendBin_FOA_HRIR_num_iterations_32kHz[i][j];
     647           0 :                             hHrtf->pIndex_frequency_max[i][j] = CRendBin_FOA_HRIR_pIndex_frequency_max_32kHz[i][j];
     648           0 :                             hHrtf->pOut_to_bin_re[i][j] = CRendBin_FOA_HRIR_coeff_re_32kHz[i][j];
     649           0 :                             hHrtf->pOut_to_bin_im[i][j] = CRendBin_FOA_HRIR_coeff_im_32kHz[i][j];
     650             :                         }
     651             :                     }
     652             : 
     653           0 :                     for ( j = 0; j < BINAURAL_CHANNELS; j++ )
     654             :                     {
     655           0 :                         hHrtf->num_iterations_diffuse[j] = CRendBin_FOA_HRIR_num_iterations_diffuse_32kHz[j];
     656           0 :                         hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_32kHz[j];
     657           0 :                         hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_FOA_HRIR_coeff_diffuse_re_32kHz[j];
     658           0 :                         hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_FOA_HRIR_coeff_diffuse_im_32kHz[j];
     659             :                     }
     660             :                 }
     661           0 :                 else if ( output_Fs == 16000 )
     662             :                 {
     663           0 :                     hHrtf->latency_s = CRendBin_FOA_HRIR_latency_s;
     664           0 :                     hHrtf->max_num_iterations = CRendBin_FOA_HRIR_max_num_iterations_16kHz;
     665           0 :                     hHrtf->index_frequency_max_diffuse = CRendBin_FOA_HRIR_index_frequency_max_diffuse_16kHz;
     666             : 
     667           0 :                     for ( i = 0; i < hHrtf->max_num_ir; i++ )
     668             :                     {
     669           0 :                         for ( j = 0; j < BINAURAL_CHANNELS; j++ )
     670             :                         {
     671           0 :                             hHrtf->inv_diffuse_weight[j][i] = CRendBin_FOA_HRIR_inv_diffuse_weight_16kHz[j][i];
     672           0 :                             hHrtf->num_iterations[i][j] = CRendBin_FOA_HRIR_num_iterations_16kHz[i][j];
     673           0 :                             hHrtf->pIndex_frequency_max[i][j] = CRendBin_FOA_HRIR_pIndex_frequency_max_16kHz[i][j];
     674           0 :                             hHrtf->pOut_to_bin_re[i][j] = CRendBin_FOA_HRIR_coeff_re_16kHz[i][j];
     675           0 :                             hHrtf->pOut_to_bin_im[i][j] = CRendBin_FOA_HRIR_coeff_im_16kHz[i][j];
     676             :                         }
     677             :                     }
     678             : 
     679           0 :                     for ( j = 0; j < BINAURAL_CHANNELS; j++ )
     680             :                     {
     681           0 :                         hHrtf->num_iterations_diffuse[j] = CRendBin_FOA_HRIR_num_iterations_diffuse_16kHz[j];
     682           0 :                         hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_16kHz[j];
     683           0 :                         hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_FOA_HRIR_coeff_diffuse_re_16kHz[j];
     684           0 :                         hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_FOA_HRIR_coeff_diffuse_im_16kHz[j];
     685             :                     }
     686             :                 }
     687             :                 else
     688             :                 {
     689           0 :                     return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "Encountered Unsupported sampling rate in Crend" );
     690             :                 }
     691             :             }
     692             :             else
     693             :             {
     694           0 :                 return IVAS_ERROR( IVAS_ERR_INVALID_INPUT_FORMAT, "Encountered unsupported input config in Crend" );
     695             :             }
     696             :         }
     697             :         else
     698             :         {
     699           0 :             return IVAS_ERROR( IVAS_ERR_INTERNAL, "Unsupported renderer type in Crend" );
     700             :         }
     701             :     }
     702             :     else
     703             :     {
     704        1322 :         if ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED )
     705             :         {
     706        1322 :             hHrtf->max_num_ir -= 1; /* subtract LFE */
     707        1322 :             hHrtf->gain_lfe = GAIN_LFE;
     708             :         }
     709             : 
     710        1322 :         if ( ext_rend_flag == 1 )
     711             :         {
     712           0 :             if ( hHrtfCrend == NULL )
     713             :             {
     714           0 :                 return IVAS_ERROR( IVAS_ERR_UNEXPECTED_NULL_POINTER, "Invalid function parameters " );
     715             :             }
     716           0 :             hHrtf->latency_s = hHrtfCrend->latency_s;
     717           0 :             hHrtf->max_num_iterations = hHrtfCrend->max_num_iterations;
     718           0 :             hHrtf->index_frequency_max_diffuse = hHrtfCrend->index_frequency_max_diffuse;
     719             : 
     720           0 :             for ( j = 0; j < BINAURAL_CHANNELS; j++ )
     721             :             {
     722           0 :                 hHrtf->num_iterations_diffuse[j] = hHrtfCrend->num_iterations_diffuse[j];
     723           0 :                 hHrtf->pIndex_frequency_max_diffuse[j] = hHrtfCrend->pIndex_frequency_max_diffuse[j];
     724           0 :                 hHrtf->pOut_to_bin_diffuse_re[j] = hHrtfCrend->pOut_to_bin_diffuse_re[j];
     725           0 :                 hHrtf->pOut_to_bin_diffuse_im[j] = hHrtfCrend->pOut_to_bin_diffuse_im[j];
     726             :             }
     727             :         }
     728             : 
     729        1322 :         if ( inConfig == IVAS_AUDIO_CONFIG_7_1 && ext_rend_flag == 0 )
     730             :         {
     731             :             /* hack to enable pointers swapping - needed when indexes of 'channelIndex_CICPx[]' are not in increasing order */
     732         189 :             for ( i = 5; i < hHrtf->max_num_ir; i++ )
     733             :             {
     734         126 :                 tmp = channelIndex_CICP12[i];
     735         126 :                 tmp2 = channelIndex_CICP14[i];
     736             : 
     737         378 :                 for ( j = 0; j < BINAURAL_CHANNELS; j++ )
     738             :                 {
     739         252 :                     hHrtf->inv_diffuse_weight[j][tmp2] = hHrtfCrend->inv_diffuse_weight[j][tmp];
     740         252 :                     hHrtf->num_iterations[tmp2][j] = hHrtfCrend->num_iterations[tmp][j];
     741         252 :                     hHrtf->pIndex_frequency_max[tmp2][j] = hHrtfCrend->pIndex_frequency_max[tmp][j];
     742         252 :                     hHrtf->pOut_to_bin_re[tmp2][j] = hHrtfCrend->pOut_to_bin_re[tmp][j];
     743         252 :                     hHrtf->pOut_to_bin_im[tmp2][j] = hHrtfCrend->pOut_to_bin_im[tmp][j];
     744             :                 }
     745             :             }
     746             :         }
     747             : 
     748       14804 :         for ( i = 0; i < hHrtf->max_num_ir; i++ )
     749             :         {
     750       13482 :             if ( inConfig == IVAS_AUDIO_CONFIG_5_1 )
     751             :             {
     752         360 :                 tmp = channelIndex_CICP6[i];
     753             :             }
     754       13122 :             else if ( inConfig == IVAS_AUDIO_CONFIG_7_1 )
     755             :             {
     756         441 :                 if ( ext_rend_flag == 0 )
     757             :                 {
     758         441 :                     tmp = channelIndex_CICP14[i];
     759             :                 }
     760             :                 else
     761             :                 {
     762           0 :                     tmp = channelIndex_CICP12[i];
     763             :                 }
     764             :             }
     765       12681 :             else if ( inConfig == IVAS_AUDIO_CONFIG_5_1_2 )
     766             :             {
     767         441 :                 tmp = channelIndex_CICP14[i];
     768             :             }
     769       12240 :             else if ( inConfig == IVAS_AUDIO_CONFIG_5_1_4 )
     770             :             {
     771         558 :                 tmp = channelIndex_CICP16[i];
     772             :             }
     773       11682 :             else if ( inConfig == IVAS_AUDIO_CONFIG_7_1_4 )
     774             :             {
     775       11682 :                 tmp = channelIndex_CICP19[i];
     776             :             }
     777           0 :             else if ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS )
     778             :             {
     779           0 :                 tmp = i;
     780             :             }
     781             :             else
     782             :             {
     783           0 :                 return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error: Channel configuration not specified!\n\n" );
     784             :             }
     785             : 
     786       40446 :             for ( j = 0; j < BINAURAL_CHANNELS; j++ )
     787             :             {
     788       26964 :                 hHrtf->inv_diffuse_weight[j][i] = hHrtfCrend->inv_diffuse_weight[j][tmp];
     789       26964 :                 hHrtf->num_iterations[i][j] = hHrtfCrend->num_iterations[tmp][j];
     790             : 
     791       26964 :                 if ( ext_rend_flag == 0 )
     792             :                 {
     793             :                     /* in case of HRTF handle reuse, swap the pointers for correct deallocation at the exit */
     794             : #define WMC_TOOL_SKIP
     795       26964 :                     swap( hHrtf->pIndex_frequency_max[i][j], hHrtf->pIndex_frequency_max[tmp][j], const uint16_t * );
     796             :                     MOVE( 3 );
     797       26964 :                     swap( hHrtf->pOut_to_bin_re[i][j], hHrtf->pOut_to_bin_re[tmp][j], const float * );
     798             :                     MOVE( 3 );
     799       26964 :                     swap( hHrtf->pOut_to_bin_im[i][j], hHrtf->pOut_to_bin_im[tmp][j], const float * );
     800             :                     MOVE( 3 );
     801             : #undef WMC_TOOL_SKIP
     802             :                 }
     803             :                 else
     804             :                 {
     805           0 :                     hHrtf->pIndex_frequency_max[i][j] = hHrtfCrend->pIndex_frequency_max[tmp][j];
     806           0 :                     hHrtf->pOut_to_bin_re[i][j] = hHrtfCrend->pOut_to_bin_re[tmp][j];
     807           0 :                     hHrtf->pOut_to_bin_im[i][j] = hHrtfCrend->pOut_to_bin_im[tmp][j];
     808             :                 }
     809             :             }
     810             :         }
     811             :     }
     812             : 
     813        6606 :     hHrtf->same_inv_diffuse_weight = 1;
     814       65832 :     for ( i = 0; i < hHrtf->max_num_ir; i++ )
     815             :     {
     816       59226 :         if ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR )
     817             :         {
     818       41394 :             if ( hHrtf->inv_diffuse_weight[0][i] != hHrtf->inv_diffuse_weight[1][i] )
     819             :             {
     820           0 :                 hHrtf->same_inv_diffuse_weight = 0;
     821             :             }
     822             :         }
     823             :     }
     824             : 
     825        6606 :     pCrend->hHrtfCrend = hHrtf;
     826             : 
     827        6606 :     return IVAS_ERR_OK;
     828             : }
     829             : 
     830             : 
     831             : /*-------------------------------------------------------------------------
     832             :  * ivas_shoebox_data_init()
     833             :  *
     834             :  * Initialize shoebox_data_t handle
     835             :  *------------------------------------------------------------------------*/
     836             : 
     837          64 : static ivas_error ivas_shoebox_data_init(
     838             :     shoebox_data_t *hShoeboxData /* i/o: shoebox_data_t handle     */
     839             : )
     840             : {
     841             :     int16_t i;
     842             : 
     843          64 :     if ( hShoeboxData == NULL )
     844             :     {
     845           0 :         return IVAS_ERR_WRONG_PARAMS;
     846             :     }
     847             : 
     848        9664 :     for ( i = 0; i < 150; i++ )
     849             :     {
     850        9600 :         hShoeboxData->data[i] = 0.0f;
     851             :     }
     852         128 :     for ( i = 0; i < 1; i++ )
     853             :     {
     854          64 :         hShoeboxData->size[i] = 0;
     855             :     }
     856             : 
     857          64 :     return IVAS_ERR_OK;
     858             : }
     859             : 
     860             : 
     861             : /*-------------------------------------------------------------------------
     862             :  * ivas_shoebox_output_init()
     863             :  *
     864             :  * Initialize shoebox_output_t handle
     865             :  *------------------------------------------------------------------------*/
     866             : 
     867          16 : static ivas_error ivas_shoebox_output_init(
     868             :     shoebox_output_t *hShoeboxOutput /* i/o: shoebox_output_t handle     */
     869             : )
     870             : {
     871             :     ivas_error error;
     872             : 
     873          16 :     if ( hShoeboxOutput == NULL )
     874             :     {
     875           0 :         return IVAS_ERR_WRONG_PARAMS;
     876             :     }
     877             : 
     878          16 :     hShoeboxOutput->n_sources = 0;
     879          16 :     hShoeboxOutput->n_ref = 0;
     880             : 
     881          16 :     if ( ( error = ivas_shoebox_data_init( &hShoeboxOutput->times ) ) != IVAS_ERR_OK )
     882             :     {
     883           0 :         return error;
     884             :     }
     885             : 
     886          16 :     if ( ( error = ivas_shoebox_data_init( &hShoeboxOutput->gains ) ) != IVAS_ERR_OK )
     887             :     {
     888           0 :         return error;
     889             :     }
     890             : 
     891          16 :     if ( ( error = ivas_shoebox_data_init( &hShoeboxOutput->az_angle ) ) != IVAS_ERR_OK )
     892             :     {
     893           0 :         return error;
     894             :     }
     895             : 
     896          16 :     if ( ( error = ivas_shoebox_data_init( &hShoeboxOutput->el_angle ) ) != IVAS_ERR_OK )
     897             :     {
     898           0 :         return error;
     899             :     }
     900             : 
     901          16 :     return IVAS_ERR_OK;
     902             : }
     903             : 
     904             : 
     905             : /*-------------------------------------------------------------------------
     906             :  * ivas_shoebox_config_init()
     907             :  *
     908             :  * Initialize shoebox_config_t handle
     909             :  *------------------------------------------------------------------------*/
     910             : 
     911          16 : static ivas_error ivas_shoebox_config_init_params(
     912             :     shoebox_config_t *hShoeboxConfig /* i/o: shoebox_config_t handle     */
     913             : )
     914             : {
     915             :     int16_t i;
     916             : 
     917          16 :     if ( hShoeboxConfig == NULL )
     918             :     {
     919           0 :         return IVAS_ERR_WRONG_PARAMS;
     920             :     }
     921             : 
     922          16 :     hShoeboxConfig->room_L = 0.0f;
     923          16 :     hShoeboxConfig->room_W = 0.0f;
     924          16 :     hShoeboxConfig->room_H = 0.0f;
     925             : 
     926         112 :     for ( i = 0; i < IVAS_ROOM_ABS_COEFF; i++ )
     927             :     {
     928          96 :         hShoeboxConfig->abs_coeff[i] = 0.0f;
     929             :     }
     930          64 :     for ( i = 0; i < 3; i++ )
     931             :     {
     932          48 :         hShoeboxConfig->list_orig[i] = 0.0f;
     933             :     }
     934             : 
     935          16 :     return IVAS_ERR_OK;
     936             : }
     937             : 
     938             : 
     939             : /*-------------------------------------------------------------------------
     940             :  * ivas_shoebox_obj_init()
     941             :  *
     942             :  * Initialize shoebox_obj_t handle
     943             :  *------------------------------------------------------------------------*/
     944             : 
     945          16 : static ivas_error ivas_shoebox_obj_init(
     946             :     shoebox_obj_t *hShoeboxObj /* i/o: shoebox_obj_t handle     */
     947             : )
     948             : {
     949             :     int16_t i;
     950             :     ivas_error error;
     951             : 
     952          16 :     if ( hShoeboxObj == NULL )
     953             :     {
     954           0 :         return IVAS_ERR_WRONG_PARAMS;
     955             :     }
     956             : 
     957          16 :     hShoeboxObj->isCartesian = 0;
     958          16 :     hShoeboxObj->isRelative = 0;
     959          16 :     hShoeboxObj->isZHeight = 0;
     960          16 :     hShoeboxObj->isRadians = 0;
     961          16 :     hShoeboxObj->MAX_SOURCES = 0;
     962          16 :     hShoeboxObj->max_bands = 0;
     963          16 :     hShoeboxObj->REF_ORDER = 0;
     964             : 
     965        1216 :     for ( i = 0; i < 75; i++ )
     966             :     {
     967        1200 :         hShoeboxObj->src_pos[i] = 0.0f;
     968             :     }
     969         416 :     for ( i = 0; i < 25; i++ )
     970             :     {
     971         400 :         hShoeboxObj->src_dist[i] = 0.0f;
     972             :     }
     973          64 :     for ( i = 0; i < 3; i++ )
     974             :     {
     975          48 :         hShoeboxObj->list_pos[i] = 0.0f;
     976             :     }
     977             : 
     978          16 :     hShoeboxObj->nSrc = 0;
     979          16 :     hShoeboxObj->radius = 0.0f;
     980          16 :     hShoeboxObj->min_wall_dist = 0.0f;
     981          16 :     hShoeboxObj->soundspeed = 0.0f;
     982          16 :     hShoeboxObj->air_coeff = 0.0f;
     983             : 
     984          16 :     if ( ( error = ivas_shoebox_config_init_params( &hShoeboxObj->cal ) ) != IVAS_ERR_OK )
     985             :     {
     986           0 :         return error;
     987             :     }
     988             : 
     989          16 :     return IVAS_ERR_OK;
     990             : }
     991             : 
     992             : 
     993             : /*-------------------------------------------------------------------------
     994             :  * ivas_er_init_handle()
     995             :  *
     996             :  * Initialize early reflections handle
     997             :  *------------------------------------------------------------------------*/
     998             : 
     999          16 : static ivas_error ivas_er_init_handle(
    1000             :     er_struct_t *reflections /* i/o: early reflections handle     */
    1001             : )
    1002             : {
    1003             :     int16_t i;
    1004             :     ivas_error error;
    1005             : 
    1006          16 :     if ( reflections == NULL )
    1007             :     {
    1008           0 :         return IVAS_ERR_WRONG_PARAMS;
    1009             :     }
    1010             : 
    1011          16 :     reflections->audio_config = IVAS_AUDIO_CONFIG_INVALID;
    1012          16 :     reflections->use_er = 0;
    1013          16 :     reflections->is_ready = 0;
    1014          16 :     reflections->circ_len = 0;
    1015          16 :     reflections->circ_insert = 0;
    1016          16 :     reflections->n_total_reflections = 0;
    1017          16 :     reflections->is_cartesian = 0;
    1018          16 :     reflections->is_relative = 0;
    1019          16 :     reflections->max_frame_size = 0;
    1020          16 :     reflections->output_Fs = 0.0f;
    1021             : 
    1022        1216 :     for ( i = 0; i < 75; i++ )
    1023             :     {
    1024        1200 :         reflections->source_positions[i] = 0.0f;
    1025             :     }
    1026          64 :     for ( i = 0; i < 3; i++ )
    1027             :     {
    1028          48 :         reflections->user_origin[i] = 0.0f;
    1029          48 :         if ( i == 2 )
    1030             :         {
    1031          16 :             reflections->user_origin[i] = ER_LIST_HEIGHT;
    1032             :         }
    1033             :     }
    1034             : 
    1035          16 :     reflections->circ_buffers = NULL;
    1036          16 :     reflections->closest_ch_idx = NULL;
    1037             : 
    1038          16 :     if ( ( error = ivas_shoebox_output_init( &reflections->shoebox_data ) ) != IVAS_ERR_OK )
    1039             :     {
    1040           0 :         return error;
    1041             :     }
    1042             : 
    1043          16 :     if ( ( error = ivas_shoebox_obj_init( &reflections->shoebox_lib ) ) != IVAS_ERR_OK )
    1044             :     {
    1045           0 :         return error;
    1046             :     }
    1047             : 
    1048          16 :     return IVAS_ERR_OK;
    1049             : }
    1050             : 
    1051             : 
    1052             : /*-------------------------------------------------------------------------
    1053             :  * ivas_rend_initCrendWrapper()
    1054             :  *
    1055             :  * Allocate and initialize crend renderer handle
    1056             :  *------------------------------------------------------------------------*/
    1057             : 
    1058        6606 : ivas_error ivas_rend_initCrendWrapper(
    1059             :     CREND_WRAPPER_HANDLE *pCrend,
    1060             :     const int16_t num_poses )
    1061             : {
    1062             :     int16_t i;
    1063             :     CREND_HANDLE hCrend;
    1064             :     int16_t pos_idx;
    1065             : 
    1066        6606 :     if ( pCrend == NULL )
    1067             :     {
    1068           0 :         return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for renderer handle" );
    1069             :     }
    1070             : 
    1071        6606 :     if ( ( *pCrend = (CREND_WRAPPER_HANDLE) malloc( sizeof( CREND_WRAPPER ) ) ) == NULL )
    1072             :     {
    1073           0 :         return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend Wrapper\n" );
    1074             :     }
    1075             : 
    1076        6606 :     ( *pCrend )->binaural_latency_ns = 0;
    1077        6606 :     ( *pCrend )->hHrtfCrend = NULL;
    1078             : 
    1079       13212 :     for ( pos_idx = 0; pos_idx < num_poses; pos_idx++ )
    1080             :     {
    1081        6606 :         hCrend = NULL;
    1082        6606 :         if ( ( hCrend = (CREND_HANDLE) malloc( sizeof( CREND_DATA ) ) ) == NULL )
    1083             :         {
    1084           0 :             return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for renderer handle" );
    1085             :         }
    1086             : 
    1087        6606 :         hCrend->lfe_delay_line = NULL;
    1088             : 
    1089      112302 :         for ( i = 0; i < MAX_INTERN_CHANNELS; i++ )
    1090             :         {
    1091      105696 :             hCrend->freq_buffer_re[i] = NULL;
    1092      105696 :             hCrend->freq_buffer_im[i] = NULL;
    1093             :         }
    1094             : 
    1095       19818 :         for ( i = 0; i < BINAURAL_CHANNELS; i++ )
    1096             :         {
    1097       13212 :             hCrend->prev_out_buffer[i] = NULL;
    1098             :         }
    1099             : 
    1100        6606 :         hCrend->freq_buffer_re_diffuse[0] = NULL;
    1101        6606 :         hCrend->freq_buffer_re_diffuse[1] = NULL;
    1102        6606 :         hCrend->freq_buffer_im_diffuse[0] = NULL;
    1103        6606 :         hCrend->freq_buffer_im_diffuse[1] = NULL;
    1104        6606 :         hCrend->hReverb = NULL;
    1105        6606 :         hCrend->reflections = NULL;
    1106        6606 :         hCrend->delay_line_rw_index = 0;
    1107        6606 :         hCrend->diffuse_delay_line_rw_index = 0;
    1108        6606 :         hCrend->hTrack = NULL;
    1109        6606 :         hCrend->m_fYaw = 0;
    1110        6606 :         hCrend->m_fPitch = 0;
    1111        6606 :         hCrend->m_fRoll = 0;
    1112             : 
    1113        6606 :         ( *pCrend )->hCrend[pos_idx] = hCrend;
    1114             :     }
    1115             : 
    1116        6606 :     return IVAS_ERR_OK;
    1117             : }
    1118             : 
    1119             : 
    1120             : /*-------------------------------------------------------------------------
    1121             :  * ivas_rend_openMultiBinCrend()
    1122             :  *
    1123             :  * Allocate and initialize crend renderer handle
    1124             :  *------------------------------------------------------------------------*/
    1125             : 
    1126           0 : ivas_error ivas_rend_openMultiBinCrend(
    1127             :     CREND_WRAPPER_HANDLE *pCrend,
    1128             :     const AUDIO_CONFIG inConfig,
    1129             :     const AUDIO_CONFIG outConfig,
    1130             :     const MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData,
    1131             :     const int32_t output_Fs )
    1132             : {
    1133           0 :     return ivas_rend_openCrend( pCrend, inConfig, outConfig, NULL /*hRendCfg*/, NULL, NULL /* hHrtfStatistics */, output_Fs, 0, pMultiBinPoseData->num_poses );
    1134             : }
    1135             : 
    1136             : 
    1137             : /*-------------------------------------------------------------------------
    1138             :  * ivas_rend_openCrend()
    1139             :  *
    1140             :  * Allocate and initialize crend renderer handle
    1141             :  *------------------------------------------------------------------------*/
    1142             : 
    1143        6606 : ivas_error ivas_rend_openCrend(
    1144             :     CREND_WRAPPER_HANDLE *pCrend,
    1145             :     const AUDIO_CONFIG inConfig,
    1146             :     const AUDIO_CONFIG outConfig,
    1147             :     RENDER_CONFIG_DATA *hRendCfg,
    1148             :     HRTFS_CREND_HANDLE hHrtfCrend,
    1149             :     HRTFS_STATISTICS_HANDLE hHrtfStatistics,
    1150             :     const int32_t output_Fs,
    1151             :     const int16_t ext_rend_flag,
    1152             :     const int16_t num_poses )
    1153             : {
    1154             :     int16_t i, subframe_length;
    1155             :     int32_t max_total_ir_len;
    1156             :     HRTFS_HANDLE hHrtf;
    1157             :     CREND_HANDLE hCrend;
    1158             :     ivas_error error;
    1159             :     int16_t pos_idx;
    1160             : 
    1161        6606 :     error = IVAS_ERR_OK;
    1162             : 
    1163        6606 :     if ( ( error = ivas_rend_initCrendWrapper( pCrend, num_poses ) ) != IVAS_ERR_OK )
    1164             :     {
    1165           0 :         return error;
    1166             :     }
    1167             : 
    1168        6606 :     subframe_length = (int16_t) ( output_Fs / FRAMES_PER_SEC ) / MAX_PARAM_SPATIAL_SUBFRAMES;
    1169             : 
    1170        6606 :     if ( ( *pCrend )->hHrtfCrend == NULL )
    1171             :     {
    1172        6606 :         if ( ( error = ivas_rend_initCrend( *pCrend, inConfig, outConfig, hHrtfCrend, ext_rend_flag, output_Fs ) ) != IVAS_ERR_OK )
    1173             :         {
    1174           0 :             return error;
    1175             :         }
    1176             :     }
    1177             : 
    1178       13212 :     for ( pos_idx = 0; pos_idx < num_poses; pos_idx++ )
    1179             :     {
    1180        6606 :         hCrend = ( *pCrend )->hCrend[pos_idx];
    1181        6606 :         hHrtf = ( *pCrend )->hHrtfCrend;
    1182             : 
    1183        6606 :         if ( hHrtf != NULL )
    1184             :         {
    1185        6606 :             max_total_ir_len = hHrtf->max_num_iterations * subframe_length;
    1186             : 
    1187       65832 :             for ( i = 0; i < hHrtf->max_num_ir; i++ )
    1188             :             {
    1189       59226 :                 if ( ( hCrend->freq_buffer_re[i] = (float *) malloc( sizeof( float ) * max_total_ir_len ) ) == NULL )
    1190             :                 {
    1191           0 :                     return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" );
    1192             :                 }
    1193       59226 :                 set_zero_l( hCrend->freq_buffer_re[i], max_total_ir_len );
    1194             : 
    1195       59226 :                 if ( ( hCrend->freq_buffer_im[i] = (float *) malloc( sizeof( float ) * max_total_ir_len ) ) == NULL )
    1196             :                 {
    1197           0 :                     return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" );
    1198             :                 }
    1199       59226 :                 set_zero_l( hCrend->freq_buffer_im[i], max_total_ir_len );
    1200             :             }
    1201             : 
    1202       19818 :             for ( i = 0; i < BINAURAL_CHANNELS; i++ )
    1203             :             {
    1204       13212 :                 if ( ( hCrend->prev_out_buffer[i] = (float *) malloc( sizeof( float ) * subframe_length ) ) == NULL )
    1205             :                 {
    1206           0 :                     return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" );
    1207             :                 }
    1208       13212 :                 set_zero_l( hCrend->prev_out_buffer[i], subframe_length );
    1209             :             }
    1210             : 
    1211        6606 :             max_total_ir_len = hHrtf->num_iterations_diffuse[0] * subframe_length;
    1212             : 
    1213        6606 :             if ( max_total_ir_len > 0 )
    1214             :             {
    1215        4326 :                 if ( ( hCrend->freq_buffer_re_diffuse[0] = (float *) malloc( sizeof( float ) * max_total_ir_len ) ) == NULL )
    1216             :                 {
    1217           0 :                     return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" );
    1218             :                 }
    1219        4326 :                 if ( hHrtf->same_inv_diffuse_weight == 0 )
    1220             :                 {
    1221           0 :                     if ( ( hCrend->freq_buffer_re_diffuse[1] = (float *) malloc( sizeof( float ) * max_total_ir_len ) ) == NULL )
    1222             :                     {
    1223           0 :                         return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" );
    1224             :                     }
    1225             :                 }
    1226             :                 else
    1227             :                 {
    1228        4326 :                     hCrend->freq_buffer_re_diffuse[1] = NULL;
    1229             :                 }
    1230        4326 :                 set_zero_l( hCrend->freq_buffer_re_diffuse[0], max_total_ir_len );
    1231        4326 :                 if ( hCrend->freq_buffer_re_diffuse[1] != NULL )
    1232             :                 {
    1233           0 :                     set_zero_l( hCrend->freq_buffer_re_diffuse[1], max_total_ir_len );
    1234             :                 }
    1235             : 
    1236        4326 :                 if ( ( hCrend->freq_buffer_im_diffuse[0] = (float *) malloc( sizeof( float ) * max_total_ir_len ) ) == NULL )
    1237             :                 {
    1238           0 :                     return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" );
    1239             :                 }
    1240        4326 :                 if ( hHrtf->same_inv_diffuse_weight == 0 )
    1241             :                 {
    1242           0 :                     if ( ( hCrend->freq_buffer_im_diffuse[1] = (float *) malloc( sizeof( float ) * max_total_ir_len ) ) == NULL )
    1243             :                     {
    1244           0 :                         return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" );
    1245             :                     }
    1246             :                 }
    1247             :                 else
    1248             :                 {
    1249        4326 :                     hCrend->freq_buffer_im_diffuse[1] = NULL;
    1250             :                 }
    1251        4326 :                 set_zero_l( hCrend->freq_buffer_im_diffuse[0], max_total_ir_len );
    1252        4326 :                 if ( hCrend->freq_buffer_im_diffuse[1] != NULL )
    1253             :                 {
    1254           0 :                     set_zero_l( hCrend->freq_buffer_im_diffuse[1], max_total_ir_len );
    1255             :                 }
    1256             :             }
    1257             :             else
    1258             :             {
    1259        2280 :                 hCrend->freq_buffer_re_diffuse[0] = NULL;
    1260        2280 :                 hCrend->freq_buffer_im_diffuse[0] = NULL;
    1261        2280 :                 hCrend->freq_buffer_re_diffuse[1] = NULL;
    1262        2280 :                 hCrend->freq_buffer_im_diffuse[1] = NULL;
    1263             :             }
    1264             : 
    1265        6606 :             max_total_ir_len = (int16_t) ( hHrtf->latency_s * output_Fs + 0.5f ) + subframe_length;
    1266        6606 :             if ( max_total_ir_len > 0 )
    1267             :             {
    1268        6606 :                 if ( ( hCrend->lfe_delay_line = (float *) malloc( sizeof( float ) * max_total_ir_len ) ) == NULL )
    1269             :                 {
    1270           0 :                     return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" );
    1271             :                 }
    1272        6606 :                 set_zero_l( hCrend->lfe_delay_line, max_total_ir_len );
    1273             :             }
    1274             :             else
    1275             :             {
    1276           0 :                 hCrend->lfe_delay_line = NULL;
    1277             :             }
    1278             : 
    1279        6606 :             if ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB )
    1280             :             {
    1281        1091 :                 if ( ( error = ivas_reverb_open( &( hCrend->hReverb ), hHrtfStatistics, hRendCfg, output_Fs ) ) != IVAS_ERR_OK )
    1282             :                 {
    1283           0 :                     return error;
    1284             :                 }
    1285             : 
    1286        1091 :                 if ( hRendCfg->roomAcoustics.use_er == 1 )
    1287             :                 {
    1288             : 
    1289             :                     /* Allocate memory for reflections */
    1290          16 :                     hCrend->reflections = (er_struct_t *) malloc( sizeof( er_struct_t ) );
    1291          16 :                     if ( !hCrend->reflections )
    1292             :                     {
    1293           0 :                         return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Early Reflections" );
    1294             :                     }
    1295          16 :                     if ( ( error = ivas_er_init_handle( hCrend->reflections ) ) != IVAS_ERR_OK )
    1296             :                     {
    1297           0 :                         return error;
    1298             :                     }
    1299             : 
    1300          16 :                     hCrend->reflections->use_er = hRendCfg->roomAcoustics.use_er;
    1301          16 :                     hCrend->reflections->lowComplexity = hRendCfg->roomAcoustics.lowComplexity;
    1302             : 
    1303             :                     /* Set sample rate and frame size */
    1304          16 :                     hCrend->reflections->output_Fs = (float) output_Fs;
    1305          16 :                     hCrend->reflections->max_frame_size = (int16_t) ( output_Fs / FRAMES_PER_SEC );
    1306             : 
    1307             :                     /* Init Shoebox */
    1308          16 :                     ivas_shoebox_config_init( &hCrend->reflections->shoebox_lib.cal, hRendCfg );
    1309             : 
    1310             :                     /* Init and compute Reflections */
    1311          16 :                     if ( ( error = ivas_er_init( hCrend->reflections, inConfig ) ) != IVAS_ERR_OK )
    1312             :                     {
    1313           0 :                         return error;
    1314             :                     }
    1315             :                 }
    1316             :                 else
    1317             :                 {
    1318        1075 :                     hCrend->reflections = NULL;
    1319             :                 }
    1320             :             }
    1321             :             else
    1322             :             {
    1323        5515 :                 hCrend->hReverb = NULL;
    1324             :             }
    1325             : 
    1326        6606 :             ( *pCrend )->binaural_latency_ns = (int32_t) ( ( *pCrend )->hHrtfCrend->latency_s * 1000000000.f );
    1327             :         }
    1328             : 
    1329        6606 :         ( *pCrend )->hCrend[pos_idx] = hCrend;
    1330             :     }
    1331             : 
    1332        6606 :     return IVAS_ERR_OK;
    1333             : }
    1334             : 
    1335             : 
    1336             : /*-------------------------------------------------------------------------
    1337             :  * ivas_rend_closeCrend()
    1338             :  *
    1339             :  * Deallocate Crend renderer handle
    1340             :  *------------------------------------------------------------------------*/
    1341             : 
    1342      167458 : void ivas_rend_closeCrend(
    1343             :     CREND_WRAPPER_HANDLE *pCrend,
    1344             :     const int16_t num_poses )
    1345             : {
    1346             :     int16_t i;
    1347             :     int16_t pos_idx;
    1348             :     CREND_HANDLE hCrend;
    1349             : 
    1350      167458 :     if ( pCrend == NULL || *pCrend == NULL )
    1351             :     {
    1352      160852 :         return;
    1353             :     }
    1354             : 
    1355        6606 :     if ( ( *pCrend )->hHrtfCrend != NULL && ( *pCrend )->hHrtfCrend->init_from_rom )
    1356             :     {
    1357        5284 :         ivas_hrtf_close( &( *pCrend )->hHrtfCrend );
    1358             :     }
    1359             : 
    1360       13212 :     for ( pos_idx = 0; pos_idx < num_poses; pos_idx++ )
    1361             :     {
    1362        6606 :         hCrend = ( *pCrend )->hCrend[pos_idx];
    1363        6606 :         if ( hCrend != NULL )
    1364             :         {
    1365      112302 :             for ( i = 0; i < MAX_INTERN_CHANNELS; i++ )
    1366             :             {
    1367      105696 :                 if ( hCrend->freq_buffer_re[i] != NULL )
    1368             :                 {
    1369       59226 :                     free( hCrend->freq_buffer_re[i] );
    1370       59226 :                     hCrend->freq_buffer_re[i] = NULL;
    1371             :                 }
    1372      105696 :                 if ( hCrend->freq_buffer_im[i] != NULL )
    1373             :                 {
    1374       59226 :                     free( hCrend->freq_buffer_im[i] );
    1375       59226 :                     hCrend->freq_buffer_im[i] = NULL;
    1376             :                 }
    1377             :             }
    1378             : 
    1379       19818 :             for ( i = 0; i < BINAURAL_CHANNELS; i++ )
    1380             :             {
    1381       13212 :                 if ( hCrend->prev_out_buffer[i] != NULL )
    1382             :                 {
    1383       13212 :                     free( hCrend->prev_out_buffer[i] );
    1384       13212 :                     hCrend->prev_out_buffer[i] = NULL;
    1385             :                 }
    1386             :             }
    1387             : 
    1388        6606 :             if ( hCrend->lfe_delay_line != NULL )
    1389             :             {
    1390        6606 :                 free( hCrend->lfe_delay_line );
    1391        6606 :                 hCrend->lfe_delay_line = NULL;
    1392             :             }
    1393        6606 :             if ( hCrend->freq_buffer_re_diffuse[0] != NULL )
    1394             :             {
    1395        4326 :                 free( hCrend->freq_buffer_re_diffuse[0] );
    1396        4326 :                 hCrend->freq_buffer_re_diffuse[0] = NULL;
    1397             :             }
    1398             : 
    1399        6606 :             if ( hCrend->freq_buffer_im_diffuse[0] != NULL )
    1400             :             {
    1401        4326 :                 free( hCrend->freq_buffer_im_diffuse[0] );
    1402        4326 :                 hCrend->freq_buffer_im_diffuse[0] = NULL;
    1403             :             }
    1404             : 
    1405        6606 :             if ( hCrend->freq_buffer_re_diffuse[1] != NULL )
    1406             :             {
    1407           0 :                 free( hCrend->freq_buffer_re_diffuse[1] );
    1408           0 :                 hCrend->freq_buffer_re_diffuse[1] = NULL;
    1409             :             }
    1410             : 
    1411        6606 :             if ( hCrend->freq_buffer_im_diffuse[1] != NULL )
    1412             :             {
    1413           0 :                 free( hCrend->freq_buffer_im_diffuse[1] );
    1414           0 :                 hCrend->freq_buffer_im_diffuse[1] = NULL;
    1415             :             }
    1416             : 
    1417        6606 :             if ( hCrend->hTrack != NULL )
    1418             :             {
    1419           0 :                 free( hCrend->hTrack );
    1420           0 :                 hCrend->hTrack = NULL;
    1421             :             }
    1422             : 
    1423        6606 :             ivas_reverb_close( &hCrend->hReverb );
    1424             : 
    1425        6606 :             if ( hCrend->reflections != NULL )
    1426             :             {
    1427          16 :                 if ( hCrend->reflections->closest_ch_idx != NULL )
    1428             :                 {
    1429          16 :                     free( hCrend->reflections->closest_ch_idx );
    1430          16 :                     hCrend->reflections->closest_ch_idx = NULL;
    1431             :                 }
    1432             : 
    1433          16 :                 if ( hCrend->reflections->circ_buffers != NULL )
    1434             :                 {
    1435          16 :                     free( hCrend->reflections->circ_buffers );
    1436          16 :                     hCrend->reflections->circ_buffers = NULL;
    1437             :                 }
    1438             : 
    1439          16 :                 free( hCrend->reflections );
    1440          16 :                 hCrend->reflections = NULL;
    1441             :             }
    1442             : 
    1443        6606 :             free( hCrend );
    1444        6606 :             hCrend = NULL;
    1445        6606 :             ( *pCrend )->hCrend[pos_idx] = hCrend;
    1446             :         }
    1447             :     }
    1448             : 
    1449        6606 :     free( *pCrend );
    1450        6606 :     *pCrend = NULL;
    1451             : 
    1452        6606 :     return;
    1453             : }
    1454             : 
    1455             : 
    1456             : /*-------------------------------------------------------------------------
    1457             :  * ivas_rend_closeCldfbRend()
    1458             :  *
    1459             :  * Close CLDFB based fastconv binaural renderer memories
    1460             :  *------------------------------------------------------------------------*/
    1461             : 
    1462           0 : void ivas_rend_closeCldfbRend(
    1463             :     CLDFB_REND_WRAPPER *pCldfbRend )
    1464             : {
    1465           0 :     if ( pCldfbRend->hCldfbRend->hInputSetup != NULL )
    1466             :     {
    1467           0 :         free( pCldfbRend->hCldfbRend->hInputSetup );
    1468           0 :         pCldfbRend->hCldfbRend->hInputSetup = NULL;
    1469             :     }
    1470             : 
    1471           0 :     ivas_binRenderer_close( &pCldfbRend->hCldfbRend );
    1472           0 :     ivas_binaural_hrtf_close( &pCldfbRend->hHrtfFastConv );
    1473           0 :     ivas_HRTF_fastconv_binary_close( &pCldfbRend->hHrtfFastConv );
    1474             : 
    1475           0 :     return;
    1476             : }
    1477             : 
    1478             : 
    1479             : /*-----------------------------------------------------------------------------------------*
    1480             :  * Function ivas_rend_crendConvolver()
    1481             :  *
    1482             :  * Convolver block
    1483             :  *-----------------------------------------------------------------------------------------*/
    1484             : 
    1485     2789789 : static ivas_error ivas_rend_crendConvolver(
    1486             :     const CREND_WRAPPER *pCrend,
    1487             :     AUDIO_CONFIG inConfig,
    1488             :     AUDIO_CONFIG outConfig,
    1489             :     float *pcm_in[],
    1490             :     float *pcm_out[],
    1491             :     const int32_t output_Fs,
    1492             :     const int16_t i_ts,
    1493             :     const int16_t pos_idx )
    1494             : {
    1495             :     int16_t i, j, k, m;
    1496             :     int16_t subframe_length, idx_in;
    1497             :     int16_t lfe_idx_in;
    1498             :     int32_t offset, offset_in, offset_diffuse;
    1499             :     int16_t nchan_in, nchan_out;
    1500             :     const float *pIn;
    1501             :     const float *pFreq_filt_re, *pFreq_filt_im;
    1502     2789789 :     float *pFreq_buf_re = NULL, *pFreq_buf_im = NULL;
    1503     2789789 :     float *pFreq_buf2_re = NULL, *pFreq_buf2_im = NULL;
    1504             : #ifdef FIX_RENDERER_STACK
    1505             :     float pOut[2 /*Re,Im*/ * L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES];
    1506             :     float tmp_out_re[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES], tmp_out_im[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES];
    1507             : #else
    1508             :     float pOut[L_FRAME48k * 2];
    1509             :     float tmp_out_re[L_FRAME48k], tmp_out_im[L_FRAME48k];
    1510             : #endif
    1511             :     CREND_HANDLE hCrend;
    1512             :     ivas_error error;
    1513             : 
    1514     2789789 :     hCrend = pCrend->hCrend[pos_idx];
    1515             : 
    1516     2789789 :     if ( ( error = getAudioConfigNumChannels( inConfig, &nchan_in ) ) != IVAS_ERR_OK )
    1517             :     {
    1518           0 :         return error;
    1519             :     }
    1520             : 
    1521     2789789 :     if ( ( error = getAudioConfigNumChannels( outConfig, &nchan_out ) ) != IVAS_ERR_OK )
    1522             :     {
    1523           0 :         return error;
    1524             :     }
    1525             : 
    1526     2789789 :     subframe_length = (int16_t) ( output_Fs / FRAMES_PER_SEC ) / MAX_PARAM_SPATIAL_SUBFRAMES;
    1527             : 
    1528     2789789 :     lfe_idx_in = -1;
    1529     2789789 :     if ( getAudioConfigType( inConfig ) == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED )
    1530             :     {
    1531     2552787 :         if ( inConfig != IVAS_AUDIO_CONFIG_LS_CUSTOM )
    1532             :         {
    1533     2552787 :             lfe_idx_in = LFE_CHANNEL;
    1534             :         }
    1535             :         else
    1536             :         {
    1537           0 :             assert( 0 && "Custom LS not supported in CRend" );
    1538             :         }
    1539             :     }
    1540             : 
    1541     2789789 :     offset = hCrend->delay_line_rw_index * subframe_length;                 /* subframe_length * ( pCrend->hHrtfCrend->max_num_iterations - 1 ); */
    1542     2789789 :     offset_diffuse = hCrend->diffuse_delay_line_rw_index * subframe_length; /* subframe_length *( pCrend->hHrtfCrend->num_iterations_diffuse[0] - 1 ); */
    1543             : 
    1544     2789789 :     if ( pCrend->hHrtfCrend->num_iterations_diffuse[0] > 0 )
    1545             :     {
    1546     1715403 :         set_zero( &hCrend->freq_buffer_re_diffuse[0][offset_diffuse], subframe_length );
    1547     1715403 :         set_zero( &hCrend->freq_buffer_im_diffuse[0][offset_diffuse], subframe_length );
    1548     1715403 :         if ( pCrend->hHrtfCrend->same_inv_diffuse_weight == 0 )
    1549             :         {
    1550           0 :             set_zero( &hCrend->freq_buffer_re_diffuse[1][offset_diffuse], subframe_length );
    1551           0 :             set_zero( &hCrend->freq_buffer_im_diffuse[1][offset_diffuse], subframe_length );
    1552             :         }
    1553             :     }
    1554             : 
    1555     2789789 :     if ( pCrend->hHrtfCrend->num_iterations_diffuse[0] > 0 )
    1556             :     {
    1557     1715403 :         if ( pCrend->hHrtfCrend->same_inv_diffuse_weight )
    1558             :         {
    1559     1715403 :             pFreq_buf_re = &hCrend->freq_buffer_re_diffuse[0][offset_diffuse];
    1560     1715403 :             pFreq_buf_im = &hCrend->freq_buffer_im_diffuse[0][offset_diffuse];
    1561             :         }
    1562             :         else
    1563             :         {
    1564           0 :             pFreq_buf_re = &hCrend->freq_buffer_re_diffuse[0][offset_diffuse];
    1565           0 :             pFreq_buf_im = &hCrend->freq_buffer_im_diffuse[0][offset_diffuse];
    1566           0 :             pFreq_buf2_re = &hCrend->freq_buffer_re_diffuse[1][offset_diffuse];
    1567           0 :             pFreq_buf2_im = &hCrend->freq_buffer_im_diffuse[1][offset_diffuse];
    1568             :         }
    1569             :     }
    1570             : 
    1571     2789789 :     i = 0;
    1572    31361865 :     for ( idx_in = 0; idx_in < nchan_in; idx_in++ )
    1573             :     {
    1574    28572076 :         pIn = &pcm_in[idx_in][i_ts * subframe_length];
    1575    28572076 :         if ( idx_in != lfe_idx_in )
    1576             :         {
    1577    26019289 :             if ( pCrend->hHrtfCrend->num_iterations_diffuse[0] > 0 )
    1578             :             {
    1579    16843601 :                 if ( pCrend->hHrtfCrend->same_inv_diffuse_weight )
    1580             :                 {
    1581    16843601 :                     pFreq_filt_re = &hCrend->freq_buffer_re[i][offset];
    1582    16843601 :                     pFreq_filt_im = &hCrend->freq_buffer_im[i][offset];
    1583             : 
    1584  1632041754 :                     for ( k = 0; k < pCrend->hHrtfCrend->index_frequency_max_diffuse; k++ )
    1585             :                     {
    1586  1615198153 :                         pFreq_buf_re[k] += pFreq_filt_re[k] * pCrend->hHrtfCrend->inv_diffuse_weight[0][i];
    1587  1615198153 :                         pFreq_buf_im[k] += pFreq_filt_im[k] * pCrend->hHrtfCrend->inv_diffuse_weight[0][i];
    1588             :                     }
    1589             :                 }
    1590             :                 else
    1591             :                 {
    1592           0 :                     pFreq_filt_re = &hCrend->freq_buffer_re[i][offset];
    1593           0 :                     pFreq_filt_im = &hCrend->freq_buffer_im[i][offset];
    1594             : 
    1595           0 :                     for ( k = 0; k < pCrend->hHrtfCrend->index_frequency_max_diffuse; k++ )
    1596             :                     {
    1597           0 :                         pFreq_buf_re[k] += pFreq_filt_re[k] * pCrend->hHrtfCrend->inv_diffuse_weight[0][i];
    1598           0 :                         pFreq_buf_im[k] += pFreq_filt_im[k] * pCrend->hHrtfCrend->inv_diffuse_weight[0][i];
    1599           0 :                         pFreq_buf2_re[k] += pFreq_filt_re[k] * pCrend->hHrtfCrend->inv_diffuse_weight[1][i];
    1600           0 :                         pFreq_buf2_im[k] += pFreq_filt_im[k] * pCrend->hHrtfCrend->inv_diffuse_weight[1][i];
    1601             :                     }
    1602             :                 }
    1603             :             }
    1604             : 
    1605    26019289 :             ivas_mdft( pIn, &hCrend->freq_buffer_re[i][offset], &hCrend->freq_buffer_im[i][offset], subframe_length, subframe_length );
    1606    26019289 :             i++;
    1607             :         }
    1608             :     }
    1609             : 
    1610     8369367 :     for ( j = 0; j < nchan_out; j++ )
    1611             :     {
    1612     5579578 :         set_zero( tmp_out_re, subframe_length );
    1613     5579578 :         set_zero( tmp_out_im, subframe_length );
    1614             : 
    1615     5579578 :         i = 0;
    1616    62723730 :         for ( idx_in = 0; idx_in < nchan_in; idx_in++ )
    1617             :         {
    1618    57144152 :             if ( idx_in != lfe_idx_in )
    1619             :             {
    1620    52038578 :                 offset = 0;
    1621   814744566 :                 for ( m = 0; m < pCrend->hHrtfCrend->num_iterations[i][j]; m++ )
    1622             :                 {
    1623   762705988 :                     offset_in = ( hCrend->delay_line_rw_index + pCrend->hHrtfCrend->max_num_iterations - pCrend->hHrtfCrend->num_iterations[i][j] + m + 1 );
    1624   762705988 :                     offset_in = offset_in % ( pCrend->hHrtfCrend->max_num_iterations );
    1625   762705988 :                     offset_in = offset_in * subframe_length;
    1626   762705988 :                     pFreq_buf_re = &hCrend->freq_buffer_re[i][offset_in];
    1627   762705988 :                     pFreq_buf_im = &hCrend->freq_buffer_im[i][offset_in];
    1628   762705988 :                     pFreq_filt_re = &pCrend->hHrtfCrend->pOut_to_bin_re[i][j][offset];
    1629   762705988 :                     pFreq_filt_im = &pCrend->hHrtfCrend->pOut_to_bin_im[i][j][offset];
    1630             : 
    1631 98026130736 :                     for ( k = 0; k < pCrend->hHrtfCrend->pIndex_frequency_max[i][j][m]; k++ )
    1632             :                     {
    1633 97263424748 :                         tmp_out_re[k] += pFreq_buf_re[k] * pFreq_filt_re[k] - pFreq_buf_im[k] * pFreq_filt_im[k];
    1634 97263424748 :                         tmp_out_im[k] += pFreq_buf_re[k] * pFreq_filt_im[k] + pFreq_buf_im[k] * pFreq_filt_re[k];
    1635             :                     }
    1636   762705988 :                     offset = offset + k;
    1637             :                 }
    1638    52038578 :                 i++;
    1639             :             }
    1640             :         }
    1641             : 
    1642     5579578 :         offset = 0;
    1643   142811818 :         for ( m = 0; m < pCrend->hHrtfCrend->num_iterations_diffuse[j]; m++ )
    1644             :         {
    1645   137232240 :             offset_diffuse = ( hCrend->diffuse_delay_line_rw_index + m + 1 );
    1646   137232240 :             offset_diffuse = offset_diffuse % pCrend->hHrtfCrend->num_iterations_diffuse[0];
    1647   137232240 :             offset_diffuse = offset_diffuse * subframe_length;
    1648   137232240 :             if ( pCrend->hHrtfCrend->same_inv_diffuse_weight )
    1649             :             {
    1650   137232240 :                 pFreq_buf_re = &hCrend->freq_buffer_re_diffuse[0][offset_diffuse];
    1651   137232240 :                 pFreq_buf_im = &hCrend->freq_buffer_im_diffuse[0][offset_diffuse];
    1652             :             }
    1653             :             else
    1654             :             {
    1655           0 :                 pFreq_buf_re = &hCrend->freq_buffer_re_diffuse[j][offset_diffuse];
    1656           0 :                 pFreq_buf_im = &hCrend->freq_buffer_im_diffuse[j][offset_diffuse];
    1657             :             }
    1658   137232240 :             pFreq_filt_re = &pCrend->hHrtfCrend->pOut_to_bin_diffuse_re[j][offset];
    1659   137232240 :             pFreq_filt_im = &pCrend->hHrtfCrend->pOut_to_bin_diffuse_im[j][offset];
    1660             : 
    1661  9894809016 :             for ( k = 0; k < pCrend->hHrtfCrend->pIndex_frequency_max_diffuse[j][m]; k++ )
    1662             :             {
    1663  9757576776 :                 tmp_out_re[k] += pFreq_buf_re[k] * pFreq_filt_re[k] - pFreq_buf_im[k] * pFreq_filt_im[k];
    1664  9757576776 :                 tmp_out_im[k] += pFreq_buf_re[k] * pFreq_filt_im[k] + pFreq_buf_im[k] * pFreq_filt_re[k];
    1665             :             }
    1666   137232240 :             offset = offset + k;
    1667             :         }
    1668             : 
    1669     5579578 :         ivas_imdft( tmp_out_re, tmp_out_im, pOut, subframe_length );
    1670             : 
    1671     5579578 :         pFreq_buf_re = &pcm_out[j][i_ts * subframe_length];
    1672  1225087418 :         for ( k = 0; k < subframe_length; k++ )
    1673             :         {
    1674  1219507840 :             pFreq_buf_re[k] = pOut[k] + hCrend->prev_out_buffer[j][k];
    1675  1219507840 :             hCrend->prev_out_buffer[j][k] = pOut[k + subframe_length];
    1676             :         }
    1677             :     }
    1678             : 
    1679     2789789 :     hCrend->delay_line_rw_index++;
    1680     2789789 :     hCrend->delay_line_rw_index = hCrend->delay_line_rw_index % ( pCrend->hHrtfCrend->max_num_iterations );
    1681     2789789 :     if ( pCrend->hHrtfCrend->num_iterations_diffuse[0] > 0 )
    1682             :     {
    1683     1715403 :         hCrend->diffuse_delay_line_rw_index++;
    1684     1715403 :         hCrend->diffuse_delay_line_rw_index = hCrend->diffuse_delay_line_rw_index % ( pCrend->hHrtfCrend->num_iterations_diffuse[0] );
    1685             :     }
    1686             : 
    1687     2789789 :     return IVAS_ERR_OK;
    1688             : }
    1689             : 
    1690             : 
    1691             : /*-----------------------------------------------------------------------------------------*
    1692             :  * Function ivas_rend_crendProcessSubframe()
    1693             :  *
    1694             :  *
    1695             :  *-----------------------------------------------------------------------------------------*/
    1696             : 
    1697     1160681 : ivas_error ivas_rend_crendProcessSubframe(
    1698             :     const CREND_WRAPPER *pCrend,                                /* i/o: Crend wrapper handle                    */
    1699             :     const AUDIO_CONFIG inConfig,                                /* i  : input audio configuration               */
    1700             :     const AUDIO_CONFIG outConfig,                               /* i  : output audio configuration              */
    1701             :     const DECODER_CONFIG_HANDLE hDecoderConfig,                 /* i  : decoder config. structure               */
    1702             :     const COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i  : combined orientation handle             */
    1703             :     const IVAS_OUTPUT_SETUP_HANDLE hIntSetup,                   /* i  : internal setup handle                   */
    1704             :     const EFAP_HANDLE hEFAPdata,                                /* i  : EFAP handle                             */
    1705             :     DECODER_TC_BUFFER_HANDLE hTcBuffer,                         /* i/o: JBM handle                              */
    1706             :     float *input_f[],                                           /* i  : transport channels                      */
    1707             :     float *output[],                                            /* i/o: input/output audio channels             */
    1708             :     const int16_t n_samples_to_render,                          /* i  : output frame length per channel         */
    1709             :     const int32_t output_Fs,                                    /* i  : output sampling rate                    */
    1710             :     const int16_t pos_idx                                       /* i  : pose index                              */
    1711             : )
    1712             : {
    1713             :     int16_t subframe_idx, subframe_len;
    1714             :     int16_t nchan_out, nchan_in, ch, first_sf, last_sf, slot_size, slots_to_render;
    1715             :     float *tc_local[MAX_OUTPUT_CHANNELS];
    1716             : #ifdef FIX_RENDERER_STACK
    1717             :     float *p_output[BINAURAL_CHANNELS];
    1718             :     float pcm_tmp[BINAURAL_CHANNELS][L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES];
    1719             : #else
    1720             :     float pcm_tmp[BINAURAL_CHANNELS][L_FRAME48k];
    1721             : #endif
    1722             :     float *p_pcm_tmp[BINAURAL_CHANNELS];
    1723             :     IVAS_REND_AudioConfigType inConfigType;
    1724             :     ivas_error error;
    1725             :     int8_t combinedOrientationEnabled;
    1726             :     CREND_HANDLE hCrend;
    1727             : 
    1728     1160681 :     hCrend = pCrend->hCrend[pos_idx];
    1729             : 
    1730     1160681 :     combinedOrientationEnabled = 0;
    1731     1160681 :     if ( hCombinedOrientationData != NULL )
    1732             :     {
    1733       73552 :         if ( hCombinedOrientationData->enableCombinedOrientation[0] != 0 )
    1734             :         {
    1735       73552 :             combinedOrientationEnabled = 1;
    1736             :         }
    1737             :     }
    1738             : 
    1739     1160681 :     push_wmops( "ivas_rend_crendProcessSubframe" );
    1740     1160681 :     inConfigType = getAudioConfigType( inConfig );
    1741             : 
    1742     1160681 :     if ( ( error = getAudioConfigNumChannels( outConfig, &nchan_out ) ) != IVAS_ERR_OK )
    1743             :     {
    1744           0 :         return error;
    1745             :     }
    1746             : 
    1747     1160681 :     if ( ( error = getAudioConfigNumChannels( inConfig, &nchan_in ) ) != IVAS_ERR_OK )
    1748             :     {
    1749           0 :         return error;
    1750             :     }
    1751             : 
    1752    13228701 :     for ( ch = 0; ch < nchan_in; ch++ )
    1753             :     {
    1754    12068020 :         tc_local[ch] = input_f[ch];
    1755             :     }
    1756             : 
    1757     3482043 :     for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ )
    1758             :     {
    1759     2321362 :         p_pcm_tmp[ch] = pcm_tmp[ch];
    1760             : #ifdef FIX_RENDERER_STACK
    1761     2321362 :         p_output[ch] = output[ch];
    1762             : #endif
    1763             :     }
    1764             : 
    1765     1160681 :     if ( hTcBuffer != NULL )
    1766             :     {
    1767      555593 :         slot_size = hTcBuffer->n_samples_granularity;
    1768             : 
    1769             :         /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */
    1770      555593 :         slots_to_render = min( hTcBuffer->num_slots - hTcBuffer->slots_rendered, n_samples_to_render / slot_size );
    1771      555593 :         first_sf = hTcBuffer->subframes_rendered;
    1772      555593 :         last_sf = first_sf;
    1773             : 
    1774     2377162 :         while ( slots_to_render > 0 )
    1775             :         {
    1776     1821569 :             slots_to_render -= hTcBuffer->subframe_nbslots[last_sf];
    1777     1821569 :             last_sf++;
    1778             :         }
    1779      555593 :         subframe_len = -1; /* will be set later */
    1780             :     }
    1781             :     else
    1782             :     {
    1783      605088 :         subframe_len = (int16_t) ( output_Fs / ( FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES ) );
    1784      605088 :         first_sf = 0;
    1785      605088 :         last_sf = n_samples_to_render / subframe_len;
    1786             :     }
    1787             : 
    1788     3950470 :     for ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ )
    1789             :     {
    1790     2789789 :         if ( hTcBuffer != NULL )
    1791             :         {
    1792     1821569 :             subframe_len = hTcBuffer->subframe_nbslots[subframe_idx] * hTcBuffer->n_samples_granularity;
    1793             :         }
    1794             : 
    1795             :         /* Early Reflections */
    1796     2789789 :         if ( hCrend->reflections != NULL )
    1797             :         {
    1798      148012 :             if ( hCrend->reflections->use_er == 1 && hCrend->reflections->is_ready == 1 )
    1799             :             {
    1800      148012 :                 if ( ( error = ivas_er_process( hCrend->reflections, subframe_len, 0, tc_local, inConfig ) ) != IVAS_ERR_OK )
    1801             :                 {
    1802           0 :                     return error;
    1803             :                 }
    1804             :             }
    1805             :         }
    1806             : 
    1807     2789789 :         if ( hDecoderConfig && combinedOrientationEnabled )
    1808             :         {
    1809             :             /* Rotation in SHD for:
    1810             :                     MC with elevation (5_1_2 / 5_1_4 / 7_1_4) -> BINAURAL
    1811             :                     SBA SPAR -> BINAURAL or BINAURAL_ROOM
    1812             :                 */
    1813      223026 :             if ( inConfig == IVAS_AUDIO_CONFIG_FOA || inConfig == IVAS_AUDIO_CONFIG_HOA2 || inConfig == IVAS_AUDIO_CONFIG_HOA3 )
    1814             :             {
    1815       44882 :                 rotateFrame_shd( hCombinedOrientationData, tc_local, subframe_len, *hIntSetup, 0 );
    1816             :             }
    1817             :             /* Rotation in SD for MC -> BINAURAL_ROOM */
    1818      178144 :             else if ( ( hIntSetup != NULL ) && hIntSetup->is_loudspeaker_setup )
    1819             :             {
    1820      178144 :                 rotateFrame_sd( hCombinedOrientationData, tc_local, subframe_len, *hIntSetup, hEFAPdata, 0 );
    1821             :             }
    1822             :         }
    1823             : 
    1824     2789789 :         if ( ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) || ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) )
    1825             :         {
    1826     2789789 :             if ( ( error = ivas_rend_crendConvolver( pCrend, inConfig, outConfig, tc_local, p_pcm_tmp, output_Fs, 0, pos_idx ) ) != IVAS_ERR_OK )
    1827             :             {
    1828           0 :                 return error;
    1829             :             }
    1830             : 
    1831     2789789 :             if ( pCrend->hCrend[0]->hReverb != NULL )
    1832             :             {
    1833      656812 :                 if ( ( error = ivas_reverb_process( pCrend->hCrend[pos_idx]->hReverb, inConfig, 1, tc_local, p_pcm_tmp, 0 ) ) != IVAS_ERR_OK )
    1834             :                 {
    1835           0 :                     return error;
    1836             :                 }
    1837             :             }
    1838             : 
    1839    31361865 :             for ( ch = 0; ch < nchan_in; ch++ )
    1840             :             {
    1841    28572076 :                 tc_local[ch] += subframe_len;
    1842             :             }
    1843             : #ifndef FIX_RENDERER_STACK
    1844             :             for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ )
    1845             :             {
    1846             :                 p_pcm_tmp[ch] += subframe_len;
    1847             :             }
    1848             : #endif
    1849             : 
    1850     2789789 :             if ( hTcBuffer != NULL )
    1851             :             {
    1852     1821569 :                 hTcBuffer->slots_rendered += hTcBuffer->subframe_nbslots[subframe_idx];
    1853             :             }
    1854             :         }
    1855             :         else
    1856             :         {
    1857           0 :             return IVAS_ERR_INVALID_INPUT_FORMAT;
    1858             :         }
    1859             : 
    1860             : #ifdef FIX_RENDERER_STACK
    1861     8369367 :         for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ )
    1862             :         {
    1863             :             /* move to output */
    1864     5579578 :             mvr2r( pcm_tmp[ch], p_output[ch], subframe_len );
    1865             : 
    1866     5579578 :             p_output[ch] += subframe_len;
    1867             :         }
    1868             : 
    1869             : #endif
    1870             :         /* update combined orientation access index */
    1871     2789789 :         ivas_combined_orientation_update_index( hCombinedOrientationData, subframe_len );
    1872             :     }
    1873             : 
    1874             : #ifndef FIX_RENDERER_STACK
    1875             :     /* move to output */
    1876             :     for ( ch = 0; ch < nchan_out; ch++ )
    1877             :     {
    1878             :         mvr2r( pcm_tmp[ch], output[ch], n_samples_to_render );
    1879             :     }
    1880             : #endif
    1881     1160681 :     if ( hTcBuffer != NULL )
    1882             :     {
    1883      555593 :         hTcBuffer->subframes_rendered = last_sf;
    1884             :     }
    1885             : 
    1886     1160681 :     pop_wmops();
    1887             : 
    1888     1160681 :     return IVAS_ERR_OK;
    1889             : }
    1890             : 
    1891             : 
    1892             : /*-----------------------------------------------------------------------------------------*
    1893             :  * Function ivas_rend_crend_ProcessSubframesSplitBin()
    1894             :  *
    1895             :  * Process call for IVAS Crend renderer
    1896             :  *-----------------------------------------------------------------------------------------*/
    1897             : 
    1898           0 : ivas_error ivas_rend_crendProcessSubframesSplitBin(
    1899             :     const CREND_WRAPPER *pCrend,                                /* i/o: Crend wrapper handle                    */
    1900             :     const AUDIO_CONFIG inConfig,                                /* i  : input audio configuration               */
    1901             :     const AUDIO_CONFIG outConfig,                               /* i  : output audio configuration              */
    1902             :     const MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData,          /* i/o: pose correction data handle             */
    1903             :     const DECODER_CONFIG_HANDLE hDecoderConfig,                 /* i  : decoder config. structure               */
    1904             :     const COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i  : combined orientation handle             */
    1905             :     const IVAS_OUTPUT_SETUP_HANDLE hIntSetup,                   /* i  : internal setup handle                   */
    1906             :     const EFAP_HANDLE hEFAPdata,                                /* i  : EFAP handle                             */
    1907             :     DECODER_TC_BUFFER_HANDLE hTcBuffer,                         /* i/o: JBM handle                              */
    1908             :     float *input_f[],                                           /* i  : transport channels                      */
    1909             :     float *output[],                                            /* i/o: input/output audio channels             */
    1910             :     const int16_t n_samples_to_render,                          /* i  : output frame length per channel         */
    1911             :     const int32_t output_Fs                                     /* i  : output sampling rate                    */
    1912             : )
    1913             : {
    1914             :     int16_t i, j;
    1915             :     int16_t sf;
    1916             :     int16_t pos_idx;
    1917             :     ivas_error error;
    1918             :     float gain_lfe;
    1919             :     float tmpLfeBuffer[L_FRAME48k];
    1920             :     int16_t original_subframes_rendered, original_slots_rendered;
    1921             :     float tmpInputBuffer[MAX_OUTPUT_CHANNELS][L_FRAME48k];
    1922             :     float *p_tmpInputBuffer[MAX_OUTPUT_CHANNELS];
    1923             :     float tmpSplitBinBuffer[MAX_OUTPUT_CHANNELS][L_FRAME48k];
    1924             :     COMBINED_ORIENTATION_DATA combinedOrientationDataLocal;
    1925             :     COMBINED_ORIENTATION_HANDLE pCombinedOrientationDataLocal;
    1926             : 
    1927             :     /* save current head positions */
    1928           0 :     pCombinedOrientationDataLocal = hCombinedOrientationData;
    1929           0 :     combinedOrientationDataLocal = *pCombinedOrientationDataLocal;
    1930           0 :     original_subframes_rendered = hTcBuffer->subframes_rendered;
    1931           0 :     original_slots_rendered = hTcBuffer->slots_rendered;
    1932             : 
    1933             :     /* copy input */
    1934           0 :     for ( i = 0; i < hIntSetup->nchan_out_woLFE; ++i )
    1935             :     {
    1936           0 :         mvr2r( input_f[i], tmpInputBuffer[i], n_samples_to_render );
    1937             :     }
    1938             : 
    1939           0 :     for ( i = 0; i < MAX_OUTPUT_CHANNELS; ++i )
    1940             :     {
    1941           0 :         p_tmpInputBuffer[i] = tmpInputBuffer[i];
    1942             :     }
    1943             : 
    1944             :     /* save current head positions */
    1945           0 :     pCombinedOrientationDataLocal = hCombinedOrientationData;
    1946           0 :     combinedOrientationDataLocal = *pCombinedOrientationDataLocal;
    1947           0 :     if ( pMultiBinPoseData->poseCorrectionMode == ISAR_SPLIT_REND_POSE_CORRECTION_MODE_CLDFB )
    1948             :     {
    1949           0 :         for ( sf = 1; sf < hCombinedOrientationData->num_subframes; ++sf )
    1950             :         {
    1951           0 :             combinedOrientationDataLocal.Quaternions[sf] = combinedOrientationDataLocal.Quaternions[0];
    1952           0 :             for ( i = 0; i < 3; i++ )
    1953             :             {
    1954           0 :                 for ( j = 0; j < 3; j++ )
    1955             :                 {
    1956           0 :                     combinedOrientationDataLocal.Rmat[sf][i][j] = combinedOrientationDataLocal.Rmat[0][i][j];
    1957             :                 }
    1958             :             }
    1959             :         }
    1960             :     }
    1961             : 
    1962             :     /* copy LFE to tmpLfeBuffer and apply gain only once */
    1963           0 :     if ( hIntSetup->num_lfe > 0 && hIntSetup->index_lfe[0] != -1 )
    1964             :     {
    1965           0 :         mvr2r( output[hIntSetup->index_lfe[0]], tmpLfeBuffer, n_samples_to_render );
    1966           0 :         gain_lfe = ( ( pCrend != NULL ) && ( pCrend->hHrtfCrend != NULL ) ) ? pCrend->hHrtfCrend->gain_lfe : GAIN_LFE;
    1967           0 :         v_multc( tmpLfeBuffer, gain_lfe, tmpLfeBuffer, n_samples_to_render );
    1968             :     }
    1969             :     else
    1970             :     {
    1971           0 :         set_zero( tmpLfeBuffer, n_samples_to_render );
    1972             :     }
    1973             : 
    1974           0 :     for ( pos_idx = 0; pos_idx < pMultiBinPoseData->num_poses; ++pos_idx )
    1975             :     {
    1976             :         /* Update head positions */
    1977             :         IVAS_QUATERNION Quaternions_orig[MAX_PARAM_SPATIAL_SUBFRAMES], Quaternions_abs;
    1978           0 :         for ( i = 0; i < hCombinedOrientationData->num_subframes; i++ )
    1979             :         {
    1980           0 :             Quaternions_orig[i] = combinedOrientationDataLocal.Quaternions[i];
    1981           0 :             Quaternions_abs.w = -3.0f;
    1982           0 :             Quat2EulerDegree( combinedOrientationDataLocal.Quaternions[i], &Quaternions_abs.z, &Quaternions_abs.y, &Quaternions_abs.x ); /*order in Quat2Euler seems to be reversed ?*/
    1983             : 
    1984           0 :             Quaternions_abs.x += pMultiBinPoseData->relative_head_poses[pos_idx][0];
    1985           0 :             Quaternions_abs.y += pMultiBinPoseData->relative_head_poses[pos_idx][1];
    1986           0 :             Quaternions_abs.z += pMultiBinPoseData->relative_head_poses[pos_idx][2];
    1987           0 :             combinedOrientationDataLocal.Quaternions[i] = Quaternions_abs;
    1988           0 :             QuatToRotMat( combinedOrientationDataLocal.Quaternions[i], combinedOrientationDataLocal.Rmat[i] );
    1989             :         }
    1990             : 
    1991           0 :         pCombinedOrientationDataLocal = &combinedOrientationDataLocal;
    1992             : 
    1993           0 :         hTcBuffer->subframes_rendered = original_subframes_rendered;
    1994           0 :         hTcBuffer->slots_rendered = original_slots_rendered;
    1995             : 
    1996             :         /* update combined orientation access index */
    1997           0 :         ivas_combined_orientation_set_to_start_index( pCombinedOrientationDataLocal );
    1998             : 
    1999           0 :         for ( i = 0; i < 3; i++ )
    2000             :         {
    2001           0 :             mvr2r( hCombinedOrientationData->Rmat_prev[pos_idx][i], pCombinedOrientationDataLocal->Rmat_prev[0][i], 3 );
    2002             :         }
    2003             : 
    2004           0 :         if ( ( error = ivas_rend_crendProcessSubframe( pCrend, inConfig, outConfig, hDecoderConfig, pCombinedOrientationDataLocal,
    2005             :                                                        hIntSetup, hEFAPdata, hTcBuffer, p_tmpInputBuffer, p_tmpInputBuffer, n_samples_to_render, output_Fs, pos_idx ) ) != IVAS_ERR_OK )
    2006             :         {
    2007           0 :             return error;
    2008             :         }
    2009             : 
    2010           0 :         for ( i = 0; i < 3; i++ )
    2011             :         {
    2012           0 :             mvr2r( pCombinedOrientationDataLocal->Rmat_prev[0][i], hCombinedOrientationData->Rmat_prev[pos_idx][i], 3 );
    2013             :         }
    2014             : 
    2015           0 :         for ( i = 0; i < BINAURAL_CHANNELS; ++i )
    2016             :         {
    2017             :             /* accumulate LFE to output */
    2018           0 :             v_add( tmpInputBuffer[i], tmpLfeBuffer, tmpInputBuffer[i], n_samples_to_render );
    2019             : 
    2020             :             /* move to split bin output buffer */
    2021           0 :             mvr2r( tmpInputBuffer[i], tmpSplitBinBuffer[pos_idx * BINAURAL_CHANNELS + i], n_samples_to_render );
    2022             :         }
    2023             : 
    2024             :         /* overwrite rendered channels with input again for next iteration */
    2025           0 :         for ( i = 0; i < hIntSetup->nchan_out_woLFE; ++i )
    2026             :         {
    2027           0 :             mvr2r( input_f[i], tmpInputBuffer[i], n_samples_to_render );
    2028             :         }
    2029             : 
    2030             :         /* restore original headrotation data */
    2031           0 :         for ( i = 0; i < hCombinedOrientationData->num_subframes; i++ )
    2032             :         {
    2033           0 :             combinedOrientationDataLocal.Quaternions[i] = Quaternions_orig[i];
    2034             :         }
    2035             :     }
    2036             : 
    2037             :     /* copy split binaural rendered signals to final output */
    2038           0 :     for ( i = 0; i < BINAURAL_CHANNELS * pMultiBinPoseData->num_poses; ++i )
    2039             :     {
    2040           0 :         mvr2r( tmpSplitBinBuffer[i], output[i], n_samples_to_render );
    2041             :     }
    2042             : 
    2043             :     /* update main combined orientation access index */
    2044           0 :     ivas_combined_orientation_update_index( hCombinedOrientationData, n_samples_to_render );
    2045             : 
    2046           0 :     return IVAS_ERR_OK;
    2047             : }

Generated by: LCOV version 1.14