LCOV - code coverage report
Current view: top level - lib_dec - ivas_masa_dec.c (source / functions) Hit Total Coverage
Test: Coverage on main -- merged total coverage @ 9b04ec3cb36f5e8dc438cf854fa3e349998fa1e9 Lines: 920 976 94.3 %
Date: 2025-10-31 05:45:46 Functions: 18 18 100.0 %

          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 <math.h>
      36             : #include "ivas_cnst.h"
      37             : #include "ivas_prot.h"
      38             : #include "ivas_prot_rend.h"
      39             : #include "ivas_rom_com.h"
      40             : #include "ivas_stat_dec.h"
      41             : #include "prot.h"
      42             : #ifdef DEBUGGING
      43             : #include "debug.h"
      44             : #endif
      45             : #include <assert.h>
      46             : #include "wmc_auto.h"
      47             : 
      48             : /*-----------------------------------------------------------------------*
      49             :  * Local constants
      50             :  *-----------------------------------------------------------------------*/
      51             : 
      52             : #define SPAR_META_DELAY_SUBFRAMES 2                              /* Number of subframes to delay the SPAR metadata */
      53             : #define SPH_IDX_FRONT             ( MASA_NO_POINTS_EQUATOR / 2 ) /* Spherical index corresponding to front direction for setting as default value */
      54             : 
      55             : 
      56             : /*-----------------------------------------------------------------------*
      57             :  * Local function prototypes
      58             :  *-----------------------------------------------------------------------*/
      59             : 
      60             : static void index_16bits( IVAS_QMETADATA_HANDLE hQMetaData, SPHERICAL_GRID_DATA *Sph_Grid16 );
      61             : 
      62             : static void create_masa_ext_out_meta( MASA_DECODER *hMasa, IVAS_QMETADATA_HANDLE hQMetaData, const int16_t nchan_transport );
      63             : 
      64             : static void replicate_subframes( IVAS_QMETADATA_HANDLE hQMetaData );
      65             : 
      66             : static void restore_lowbitrate_masa( IVAS_QMETADATA_HANDLE hQMetaData, const int16_t low_bitrate_mode, const int16_t numCodingBands );
      67             : 
      68             : static ivas_error init_lfe_synth_data( Decoder_Struct *st_ivas, MASA_DECODER_HANDLE hMasa );
      69             : 
      70             : static void compute_foa_cov_matrix( float foaCov[FOA_CHANNELS][FOA_CHANNELS], float inCov[FOA_CHANNELS][FOA_CHANNELS], float mixMtx[FOA_CHANNELS][FOA_CHANNELS] );
      71             : 
      72             : static int16_t decode_lfe_to_total_energy_ratio( MCMASA_LFE_SYNTH_DATA_HANDLE hMasaLfeSynth, uint16_t *bitstream, int16_t *index, const int32_t ivas_total_brate );
      73             : 
      74             : static ivas_error ivas_masa_dec_config( Decoder_Struct *st_ivas );
      75             : 
      76             : static int16_t ivas_decode_masaism_metadata( IVAS_QMETADATA_HANDLE hQMetaData, MASA_DECODER_HANDLE hMasa, MASA_ISM_DATA_HANDLE hMasaIsmData, const int16_t nchan_ism, uint16_t *bit_stream, int16_t *next_bit_pos, const int16_t idx_separated_object, const int16_t ism_imp, const int16_t dirac_bs_md_write_idx, const int16_t dirac_md_buffer_length );
      77             : 
      78             : static void decode_index_slice( int16_t index, int16_t *ratio_idx_ism, const int16_t nchan_ism, const int16_t K );
      79             : 
      80             : static void decode_ism_ratios( uint16_t *bit_stream, int16_t *next_bit_pos, float masa_to_total_energy_ratio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], float ratio_ism[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS], const int16_t nchan_ism, const int16_t nbands, const int16_t nblocks, const int16_t idx_separated_object );
      81             : 
      82             : static void read_ism_ratio_index( int16_t ratio_ism_idx[MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS], const int16_t nchan_ism, const int16_t numCodingBands, const int16_t sf, int16_t ratio_ism_idx_prev_sf[MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS], uint16_t *bit_stream, int16_t *next_bit_pos, float *masa_to_total_energy_ratio, const int16_t idx_sep_obj, int16_t *num_zeros );
      83             : 
      84             : 
      85             : /*-----------------------------------------------------------------------*
      86             :  * ivas_masa_decode()
      87             :  *
      88             :  * MASA metadata decoder
      89             :  *-----------------------------------------------------------------------*/
      90             : 
      91     4181235 : ivas_error ivas_masa_decode(
      92             :     Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct                    */
      93             :     Decoder_State *st,       /* i/o: decoder state structure with bitstream */
      94             :     int16_t *nb_bits_read    /* o  : number of bits read                    */
      95             : )
      96             : {
      97             :     uint16_t byteBuffer;
      98             :     int16_t next_bit_pos_orig;
      99             :     int32_t masa_brate, ivas_total_brate;
     100             :     MASA_DECODER_HANDLE hMasa;
     101             :     IVAS_QMETADATA_HANDLE hQMetaData;
     102             :     IVAS_FORMAT ivas_format;
     103             :     int16_t low_bitrate_mode, tmp_elem_mode;
     104             :     ivas_error error;
     105             :     int16_t obj;
     106             :     int16_t i, ch, ism_imp;
     107             :     int16_t dirac_bs_md_write_idx;
     108             :     int32_t masa_total_brate;
     109             : 
     110     4181235 :     dirac_bs_md_write_idx = 0;
     111     4181235 :     ism_imp = 0;
     112             : 
     113     4181235 :     error = IVAS_ERR_OK;
     114     4181235 :     ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate;
     115             : 
     116     4181235 :     low_bitrate_mode = -1; /* This means that LBR mode is not used. */
     117             : 
     118     4181235 :     if ( st_ivas->hOutSetup.separateChannelEnabled || st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_DISC )
     119             :     {
     120     1258863 :         masa_brate = st_ivas->hCPE[0]->element_brate;
     121             :     }
     122             :     else
     123             :     {
     124     2922372 :         masa_brate = ivas_total_brate;
     125             :     }
     126             : 
     127     4181235 :     hMasa = st_ivas->hMasa;
     128     4181235 :     hQMetaData = st_ivas->hQMetaData;
     129     4181235 :     ivas_format = st_ivas->ivas_format;
     130             : 
     131     4181235 :     hMasa->data.dir_decode_quality = 1.0f; /* Set to default of max quality */
     132     4181235 :     hQMetaData->is_masa_ivas_format = 1;
     133             : 
     134     4181235 :     *nb_bits_read = 0;
     135     4181235 :     next_bit_pos_orig = st->next_bit_pos;
     136     4181235 :     if ( masa_brate == IVAS_SID_5k2 )
     137             :     {
     138        3010 :         st->next_bit_pos = (int16_t) ( ( masa_brate / FRAMES_PER_SEC ) - 1 - SID_FORMAT_NBITS );
     139             :     }
     140             :     else
     141             :     {
     142     4178225 :         st->next_bit_pos = (int16_t) ( ( masa_brate / FRAMES_PER_SEC ) - 1 );
     143             :     }
     144             : 
     145     4181235 :     if ( ivas_format == MASA_FORMAT && ( masa_brate == IVAS_SID_5k2 || ivas_total_brate == FRAME_NO_DATA ) )
     146             :     {
     147       20588 :         hMasa->config.numberOfDirections = 1;
     148             :     }
     149             : 
     150     4181235 :     if ( !st->bfi && ivas_total_brate > IVAS_SID_5k2 )
     151             :     {
     152     4021261 :         if ( !( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA ) )
     153             :         {
     154     3376145 :             if ( ivas_format == MASA_FORMAT )
     155             :             {
     156             :                 /* re-read the number of objects, needed in case of bad frame  */
     157     2306549 :                 ch = 5 - ( st_ivas->bit_stream[( ivas_total_brate / FRAMES_PER_SEC ) - 3] + 2 * st_ivas->bit_stream[( ivas_total_brate / FRAMES_PER_SEC ) - 2] );
     158             : 
     159     2306549 :                 if ( ch == 5 )
     160             :                 {
     161     2004635 :                     ch = 0;
     162             :                 }
     163     2306549 :                 st_ivas->nchan_ism = ch;
     164             :             }
     165             : 
     166     3376145 :             if ( ivas_format == MASA_FORMAT && st_ivas->nchan_ism > 0 )
     167             :             {
     168             :                 /* there was OMASA in the input */
     169      301914 :                 hMasa->config.input_ivas_format = MASA_ISM_FORMAT;
     170      301914 :                 if ( st_ivas->nchan_ism < 3 )
     171             :                 {
     172             :                     /* was read in ivas_init_dec() to distinguish between 1 and 2 objects */
     173      118704 :                     if ( st_ivas->bit_stream[( ivas_total_brate / FRAMES_PER_SEC ) - 1] == 0 )
     174             :                     {
     175       59363 :                         st_ivas->nchan_ism = 1;
     176             :                     }
     177      118704 :                     st->next_bit_pos -= MASA_TRANSP_BITS;
     178      118704 :                     *nb_bits_read += MASA_TRANSP_BITS;
     179             : 
     180             :                     /* the two reserved bits were already read in ivas_init_dec()*/
     181      118704 :                     byteBuffer = st->bit_stream[( st->next_bit_pos )--];
     182      118704 :                     byteBuffer = st->bit_stream[( st->next_bit_pos )--];
     183      118704 :                     *nb_bits_read += MASA_HEADER_BITS;
     184             :                     /* read number of directions */
     185      118704 :                     byteBuffer = st->bit_stream[( st->next_bit_pos )--];
     186      118704 :                     ( *nb_bits_read )++;
     187      118704 :                     hMasa->config.numberOfDirections = (uint8_t) ( byteBuffer + 1 );
     188             :                 }
     189             :                 else
     190             :                 {
     191             :                     /* if there are 3 or 4 objects the number of transport channels bit is given to MASA format
     192             :                     and used to read number of directions*/
     193      183210 :                     byteBuffer = st->bit_stream[( st->next_bit_pos )--];
     194      183210 :                     ( *nb_bits_read )++;
     195      183210 :                     hMasa->config.numberOfDirections = (uint8_t) ( byteBuffer + 1 );
     196             : 
     197             :                     /* the two reserved bits were already read in ivas_init_dec()*/
     198      183210 :                     byteBuffer = st->bit_stream[( st->next_bit_pos )--];
     199      183210 :                     byteBuffer = st->bit_stream[( st->next_bit_pos )--];
     200      183210 :                     *nb_bits_read += MASA_HEADER_BITS;
     201             :                 }
     202             :             }
     203             :             else
     204             :             {
     205     3074231 :                 if ( ivas_format != MASA_ISM_FORMAT )
     206             :                 {
     207             :                     /* number of transport channels is always 2 for MASA_ISM format */
     208             :                     /* the number of MASA transport channels was read in ivas_dec_setup() */
     209     2004635 :                     st->next_bit_pos -= MASA_TRANSP_BITS;
     210     2004635 :                     *nb_bits_read += MASA_TRANSP_BITS;
     211             :                 }
     212             : 
     213     3074231 :                 if ( ivas_format == MASA_ISM_FORMAT && st_ivas->ism_mode != ISM_MODE_NONE )
     214             :                 {
     215             :                     /* the number of objects  was read */
     216     1069596 :                     st->next_bit_pos -= NO_BITS_MASA_ISM_NO_OBJ;
     217     1069596 :                     *nb_bits_read += NO_BITS_MASA_ISM_NO_OBJ;
     218             : 
     219     1069596 :                     if ( st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ )
     220             :                     {
     221             :                         /* read index of separated object */
     222             :                         /* nchan_ism should be > 1*/
     223      245050 :                         byteBuffer = st->bit_stream[( st->next_bit_pos )--];
     224      245050 :                         ( *nb_bits_read )++;
     225      245050 :                         st_ivas->hMasaIsmData->idx_separated_ism = 2 * byteBuffer + st->bit_stream[( st->next_bit_pos )--];
     226      245050 :                         ( *nb_bits_read )++;
     227             :                     }
     228             :                     else
     229             :                     {
     230      824546 :                         st_ivas->hMasaIsmData->idx_separated_ism = -1;
     231             :                     }
     232             : 
     233             :                     /* read ISM importance flag (one per object) */
     234     1069596 :                     if ( st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ )
     235             :                     {
     236      245050 :                         ism_imp = 0;
     237      735150 :                         for ( i = 0; i < ISM_METADATA_FLAG_BITS; i++ )
     238             :                         {
     239      490100 :                             byteBuffer = st->bit_stream[( st->next_bit_pos )--];
     240      490100 :                             ( *nb_bits_read )++;
     241      490100 :                             ism_imp = ( ism_imp << 1 ) + byteBuffer;
     242             :                         }
     243      245050 :                         st_ivas->hIsmMetaData[0]->ism_imp = ism_imp;
     244             :                     }
     245             : 
     246     1069596 :                     if ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ )
     247             :                     {
     248      234895 :                         ism_imp = 0;
     249      704685 :                         for ( i = 0; i < ISM_METADATA_FLAG_BITS; i++ )
     250             :                         {
     251      469790 :                             byteBuffer = st->bit_stream[( st->next_bit_pos )--];
     252      469790 :                             ( *nb_bits_read )++;
     253      469790 :                             ism_imp = ( ism_imp << 1 ) + byteBuffer;
     254             :                         }
     255      234895 :                         st_ivas->hIsmMetaData[0]->ism_imp = ism_imp;
     256             : 
     257             :                         /* reset */
     258      234895 :                         st_ivas->hIsmMetaData[0]->ism_md_null_flag = 0;
     259      234895 :                         st_ivas->hIsmMetaData[0]->ism_md_lowrate_flag = 0;
     260      234895 :                         if ( st_ivas->hIsmMetaData[0]->ism_imp == ISM_NO_META )
     261             :                         {
     262             :                             /* read flags */
     263        6867 :                             st_ivas->hIsmMetaData[0]->ism_md_null_flag = st->bit_stream[( st->next_bit_pos )--];
     264        6867 :                             ( *nb_bits_read ) += ISM_METADATA_MD_FLAG_BITS;
     265        6867 :                             st_ivas->hIsmMetaData[0]->ism_md_lowrate_flag = st->bit_stream[( st->next_bit_pos )--];
     266        6867 :                             ( *nb_bits_read ) += ISM_METADATA_INACTIVE_FLAG_BITS;
     267             :                         }
     268             :                     }
     269      834701 :                     else if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC )
     270             :                     {
     271     2036736 :                         for ( ch = 0; ch < st_ivas->nchan_ism; ch++ )
     272             :                         {
     273     1447085 :                             ism_imp = 0;
     274     4341255 :                             for ( i = 0; i < ISM_METADATA_FLAG_BITS; i++ )
     275             :                             {
     276     2894170 :                                 byteBuffer = st->bit_stream[( st->next_bit_pos )--];
     277     2894170 :                                 ( *nb_bits_read )++;
     278     2894170 :                                 ism_imp = ( ism_imp << 1 ) + byteBuffer;
     279             :                             }
     280     1447085 :                             st_ivas->hIsmMetaData[ch]->ism_imp = ism_imp;
     281             : 
     282             :                             /* reset */
     283     1447085 :                             st_ivas->hIsmMetaData[ch]->ism_md_null_flag = 0;
     284     1447085 :                             st_ivas->hIsmMetaData[ch]->ism_md_lowrate_flag = 0;
     285     1447085 :                             if ( st_ivas->hIsmMetaData[ch]->ism_imp == ISM_NO_META )
     286             :                             {
     287             :                                 /* read flags */
     288       33678 :                                 st_ivas->hIsmMetaData[ch]->ism_md_null_flag = st->bit_stream[( st->next_bit_pos )--];
     289       33678 :                                 ( *nb_bits_read ) += ISM_METADATA_MD_FLAG_BITS;
     290       33678 :                                 st_ivas->hIsmMetaData[ch]->ism_md_lowrate_flag = st->bit_stream[( st->next_bit_pos )--];
     291       33678 :                                 ( *nb_bits_read ) += ISM_METADATA_INACTIVE_FLAG_BITS;
     292             :                             }
     293             :                         }
     294      589651 :                         st_ivas->flag_omasa_brate = 0;
     295      589651 :                         if ( st_ivas->nchan_ism >= 3 && ivas_total_brate == IVAS_128k )
     296             :                         {
     297       25985 :                             st_ivas->flag_omasa_brate = st->bit_stream[( st->next_bit_pos )--];
     298       25985 :                             ( *nb_bits_read ) += 1;
     299             :                         }
     300             :                     }
     301             :                 }
     302             : 
     303     3074231 :                 byteBuffer = st->bit_stream[( st->next_bit_pos )--];
     304     3074231 :                 byteBuffer = byteBuffer + 2 * st->bit_stream[( st->next_bit_pos )--];
     305             : 
     306     3074231 :                 if ( byteBuffer == 0 && ivas_format == MASA_FORMAT )
     307             :                 {
     308     2004635 :                     hMasa->config.input_ivas_format = MASA_FORMAT;
     309             :                 }
     310             :                 else
     311             :                 {
     312     1069596 :                     hMasa->config.input_ivas_format = MASA_ISM_FORMAT;
     313             :                 }
     314     3074231 :                 *nb_bits_read += MASA_HEADER_BITS;
     315             : 
     316             :                 /* read number of directions */
     317     3074231 :                 byteBuffer = st->bit_stream[( st->next_bit_pos )--];
     318     3074231 :                 ( *nb_bits_read )++;
     319     3074231 :                 hMasa->config.numberOfDirections = (uint8_t) ( byteBuffer + 1 );
     320             :             }
     321             :         }
     322             :         else
     323             :         {
     324      645116 :             hMasa->config.numberOfDirections = 1;
     325             :         }
     326             : 
     327     4021261 :         if ( !( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA ) )
     328             :         {
     329             :             /* read subframe mode */
     330     3376145 :             byteBuffer = st->bit_stream[( st->next_bit_pos )--];
     331     3376145 :             ( *nb_bits_read )++;
     332     3376145 :             hMasa->config.joinedSubframes = (uint8_t) byteBuffer;
     333             :         }
     334             :         else
     335             :         {
     336      645116 :             hMasa->config.joinedSubframes = FALSE;
     337             :         }
     338             : 
     339     4021261 :         if ( st_ivas->mc_mode == MC_MODE_MCMASA )
     340             :         {
     341      645116 :             *nb_bits_read += decode_lfe_to_total_energy_ratio( hMasa->hMasaLfeSynth, st->bit_stream, &st->next_bit_pos, ivas_total_brate );
     342             :         }
     343             : 
     344             :         /* Once we know incoming configuration, we can config decoder further based on bitrate etc. */
     345     4021261 :         if ( ( error = ivas_masa_dec_config( st_ivas ) ) != IVAS_ERR_OK )
     346             :         {
     347           0 :             return error;
     348             :         }
     349             : 
     350             :         /* If we are under metadata bit budget limit and joined subframes is not signalled, then read LBR mode. */
     351     4021261 :         if ( hMasa->config.max_metadata_bits < MINIMUM_BIT_BUDGET_NORMAL_META && hMasa->config.joinedSubframes == FALSE )
     352             :         {
     353             :             /* read low bitrate mode */
     354     1338471 :             byteBuffer = st->bit_stream[( st->next_bit_pos )--];
     355     1338471 :             ( *nb_bits_read )++;
     356     1338471 :             low_bitrate_mode = byteBuffer;
     357             : 
     358     1338471 :             if ( low_bitrate_mode == 1 )
     359             :             {
     360     1125756 :                 hQMetaData->q_direction[0].cfg.nblocks = 1;
     361             :             }
     362             :             else
     363             :             {
     364      212715 :                 hQMetaData->q_direction[0].cfg.nbands = 1;
     365             :             }
     366             :         }
     367             : 
     368             :         /* Remove already read bits from the bit budget */
     369     4021261 :         hQMetaData->metadata_max_bits -= *nb_bits_read;
     370             : 
     371     4021261 :         if ( st_ivas->ivas_format == MASA_ISM_FORMAT )
     372             :         {
     373     1069596 :             if ( st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ )
     374             :             {
     375      245050 :                 if ( st_ivas->hDirAC != NULL )
     376             :                 {
     377      411108 :                     *nb_bits_read += ivas_decode_masaism_metadata( hQMetaData, st_ivas->hMasa, st_ivas->hMasaIsmData, st_ivas->nchan_ism, st->bit_stream, &st->next_bit_pos,
     378      205554 :                                                                    st_ivas->hMasaIsmData->idx_separated_ism, ism_imp, st_ivas->hSpatParamRendCom->dirac_bs_md_write_idx, st_ivas->hSpatParamRendCom->dirac_md_buffer_length );
     379             : 
     380     1089422 :                     for ( obj = 0; obj <= st_ivas->nchan_ism; obj++ )
     381             :                     {
     382      883868 :                         if ( st_ivas->hMasaIsmData->idx_separated_ism == obj )
     383             :                         {
     384             :                             int16_t sf;
     385             :                             int16_t meta_write_index;
     386             : 
     387     1027770 :                             for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ )
     388             :                             {
     389      822216 :                                 meta_write_index = ( st_ivas->hSpatParamRendCom->dirac_bs_md_write_idx + sf ) % st_ivas->hSpatParamRendCom->dirac_md_buffer_length;
     390      822216 :                                 st_ivas->hMasaIsmData->azimuth_separated_ism[meta_write_index] = st_ivas->hMasaIsmData->azimuth_ism[obj][meta_write_index];
     391      822216 :                                 st_ivas->hMasaIsmData->elevation_separated_ism[meta_write_index] = st_ivas->hMasaIsmData->elevation_ism[obj][meta_write_index];
     392             :                             }
     393             :                         }
     394             :                     }
     395             :                 }
     396       39496 :                 else if ( st_ivas->renderer_type == RENDERER_OMASA_OBJECT_EXT )
     397             :                 {
     398        8128 :                     *nb_bits_read += ivas_decode_masaism_metadata( hQMetaData, st_ivas->hMasa, st_ivas->hMasaIsmData, st_ivas->nchan_ism, st->bit_stream, &st->next_bit_pos,
     399        8128 :                                                                    st_ivas->hMasaIsmData->idx_separated_ism, ism_imp, st_ivas->hSpatParamRendCom->dirac_bs_md_write_idx, st_ivas->hSpatParamRendCom->dirac_md_buffer_length );
     400             :                 }
     401             :                 else
     402             :                 {
     403       31368 :                     *nb_bits_read += ivas_decode_masaism_metadata( hQMetaData, st_ivas->hMasa, st_ivas->hMasaIsmData, st_ivas->nchan_ism, st->bit_stream, &st->next_bit_pos,
     404       31368 :                                                                    st_ivas->hMasaIsmData->idx_separated_ism, ism_imp, 0, MAX_PARAM_SPATIAL_SUBFRAMES );
     405             :                 }
     406             :             }
     407             :         }
     408             : 
     409     4021261 :         masa_total_brate = ivas_total_brate;
     410     4021261 :         if ( ivas_format == MASA_ISM_FORMAT && st_ivas->ism_mode == ISM_MASA_MODE_DISC )
     411             :         {
     412      589651 :             masa_total_brate = calculate_cpe_brate_MASA_ISM( st_ivas->ism_mode, ivas_total_brate, st_ivas->nchan_ism );
     413             :         }
     414             : 
     415     4021261 :         if ( masa_total_brate >= IVAS_384k )
     416             :         {
     417      241572 :             if ( masa_total_brate >= IVAS_512k )
     418             :             {
     419       93807 :                 *nb_bits_read += ivas_qmetadata_dec_decode_hr_384_512( hQMetaData, st->bit_stream, &st->next_bit_pos, hMasa->data.sph_grid16, 16, 4, hMasa->config.numCodingBands );
     420             :             }
     421             :             else
     422             :             {
     423      147765 :                 *nb_bits_read += ivas_qmetadata_dec_decode_hr_384_512( hQMetaData, st->bit_stream, &st->next_bit_pos, hMasa->data.sph_grid16, 11, 3, hMasa->config.numCodingBands );
     424             :             }
     425             :         }
     426             :         else
     427             :         {
     428     3779689 :             *nb_bits_read += ivas_qmetadata_dec_decode( hQMetaData, st->bit_stream, &st->next_bit_pos, 0 );
     429             :         }
     430             : 
     431     4021261 :         if ( st_ivas->ivas_format == MASA_ISM_FORMAT && st_ivas->ism_mode != ISM_MASA_MODE_DISC && st_ivas->ism_mode != ISM_MASA_MODE_MASA_ONE_OBJ )
     432             :         {
     433             :             /* Modify spatial metadata based on the MASA-to-total energy ratios */
     434      245050 :             ivas_omasa_modify_masa_energy_ratios( hQMetaData, st_ivas->hMasaIsmData->masa_to_total_energy_ratio );
     435             :         }
     436             : 
     437             :         /* Get direction decoding quality. EC 1 and 2 are handled by the default value. */
     438     4021261 :         if ( hQMetaData->ec_flag == 2 )
     439             :         {
     440      432155 :             hMasa->data.dir_decode_quality = hQMetaData->dir_comp_ratio;
     441             :         }
     442             : 
     443     4021261 :         hMasa->config.coherencePresent = !hQMetaData->all_coherence_zero;
     444             : 
     445     4021261 :         if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL && ( st_ivas->ivas_format == MASA_FORMAT || st_ivas->ivas_format == MASA_ISM_FORMAT ) )
     446             :         {
     447      527956 :             index_16bits( hQMetaData, hMasa->data.sph_grid16 );
     448             :         }
     449             : 
     450             :         /* If LBR mode is not disabled, then we restore metadata to 5 bands and 4 subframes based on the LBR mode. */
     451     4021261 :         if ( low_bitrate_mode != -1 )
     452             :         {
     453     1338471 :             restore_lowbitrate_masa( hQMetaData, low_bitrate_mode, hMasa->config.numCodingBands );
     454             :         }
     455     2682790 :         else if ( hMasa->config.joinedSubframes == TRUE )
     456             :         {
     457      895929 :             replicate_subframes( hQMetaData );
     458             :         }
     459             :     }
     460      159974 :     else if ( !st->bfi && ivas_format == MASA_FORMAT && ivas_total_brate == IVAS_SID_5k2 )
     461             :     {
     462        3010 :         if ( hQMetaData->q_direction == NULL )
     463             :         {
     464             :             /* replicate ivas_masa_dec_config() in case that first good received frame is SID frame */
     465           0 :             if ( ( error = ivas_masa_dec_config( st_ivas ) ) != IVAS_ERR_OK )
     466             :             {
     467           0 :                 return error;
     468             :             }
     469             : 
     470           0 :             ivas_masa_set_elements( ivas_total_brate, st_ivas->mc_mode, st_ivas->nchan_transport, hQMetaData, &st_ivas->element_mode_init, &st_ivas->nSCE, &st_ivas->nCPE, st_ivas->ivas_format, st_ivas->ism_mode, 0 );
     471             : 
     472           0 :             hQMetaData->metadata_max_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC;
     473             : 
     474           0 :             if ( ( error = ivas_qmetadata_allocate_memory( hQMetaData, 5, 1, 0 ) ) != IVAS_ERR_OK )
     475             :             {
     476           0 :                 return error;
     477             :             }
     478             : 
     479           0 :             hQMetaData->numTwoDirBands = hMasa->config.numTwoDirBands;
     480           0 :             hQMetaData->useLowerRes = 0;
     481             : 
     482           0 :             hQMetaData->q_direction->cfg.nbands = 5;
     483           0 :             hQMetaData->q_direction->cfg.nblocks = 4;
     484             : 
     485           0 :             if ( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA )
     486             :             {
     487           0 :                 hQMetaData->q_direction->cfg.mc_ls_setup = ivas_mc_map_output_config_to_mc_ls_setup( st_ivas->transport_config );
     488             :             }
     489             :             else
     490             :             {
     491           0 :                 hQMetaData->q_direction->cfg.mc_ls_setup = MC_LS_SETUP_INVALID;
     492             :             }
     493             :         }
     494             : 
     495        3010 :         tmp_elem_mode = -1;
     496        3010 :         *nb_bits_read += ivas_qmetadata_dec_sid_decode( hQMetaData, st->bit_stream, &( st->next_bit_pos ), st_ivas->nchan_transport, &tmp_elem_mode, ivas_format );
     497        3010 :         if ( st_ivas->nchan_transport == 2 )
     498             :         {
     499        1097 :             assert( st_ivas->nCPE > 0 );
     500        1097 :             st_ivas->hCPE[0]->element_mode = tmp_elem_mode;
     501             :         }
     502        3010 :         *nb_bits_read += SID_FORMAT_NBITS;
     503             :     }
     504      156964 :     else if ( !st->bfi && ivas_format == MASA_FORMAT && ivas_total_brate == FRAME_NO_DATA )
     505             :     {
     506       17578 :         if ( hQMetaData->q_direction == NULL )
     507             :         {
     508           0 :             if ( ( error = ivas_masa_dec_config( st_ivas ) ) != IVAS_ERR_OK )
     509             :             {
     510           0 :                 return error;
     511             :             }
     512             :         }
     513             :     }
     514             : 
     515     4181235 :     if ( st_ivas->hDirAC != NULL )
     516             :     {
     517     3275643 :         dirac_bs_md_write_idx = st_ivas->hSpatParamRendCom->dirac_bs_md_write_idx; /* Store the write-index for this frame */
     518     3275643 :         ivas_qmetadata_to_dirac( hQMetaData, st_ivas->hDirAC, hMasa, st_ivas->hSpatParamRendCom, ivas_total_brate, ivas_format, 0, 0 );
     519             :     }
     520      905592 :     else if ( st_ivas->renderer_type == RENDERER_OMASA_OBJECT_EXT )
     521             :     {
     522        8524 :         st_ivas->hSpatParamRendCom->dirac_bs_md_write_idx = ( st_ivas->hSpatParamRendCom->dirac_bs_md_write_idx + MAX_PARAM_SPATIAL_SUBFRAMES ) % st_ivas->hSpatParamRendCom->dirac_md_buffer_length;
     523             :     }
     524             : 
     525     4181235 :     if ( st_ivas->ivas_format == MASA_ISM_FORMAT )
     526             :     {
     527     1128296 :         if ( hQMetaData->q_direction == NULL )
     528             :         {
     529           0 :             if ( ( error = ivas_masa_dec_config( st_ivas ) ) != IVAS_ERR_OK )
     530             :             {
     531           0 :                 return error;
     532             :             }
     533             :         }
     534             : 
     535     1128296 :         if ( st_ivas->hDirAC != NULL )
     536             :         {
     537             :             int16_t b;
     538             :             int16_t block;
     539             :             int16_t meta_write_index;
     540             : 
     541     1625996 :             for ( i = 0; i < st_ivas->hSpatParamRendCom->numIsmDirections; i++ )
     542             :             {
     543     3524840 :                 for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ )
     544             :                 {
     545     2819872 :                     meta_write_index = ( dirac_bs_md_write_idx + block ) % st_ivas->hSpatParamRendCom->dirac_md_buffer_length;
     546             : 
     547   140529712 :                     for ( b = 0; b < st_ivas->hSpatParamRendCom->num_freq_bands; b++ )
     548             :                     {
     549   137709840 :                         st_ivas->hSpatParamRendCom->diffuseness_vector[meta_write_index][b] -= st_ivas->hMasaIsmData->energy_ratio_ism[i][meta_write_index][b];
     550             :                     }
     551             :                 }
     552             :             }
     553             : 
     554     4605140 :             for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ )
     555             :             {
     556     3684112 :                 meta_write_index = ( dirac_bs_md_write_idx + block ) % st_ivas->hSpatParamRendCom->dirac_md_buffer_length;
     557             : 
     558   181673792 :                 for ( b = 0; b < st_ivas->hSpatParamRendCom->num_freq_bands; b++ )
     559             :                 {
     560   177989680 :                     st_ivas->hSpatParamRendCom->diffuseness_vector[meta_write_index][b] = max( 0.0f, st_ivas->hSpatParamRendCom->diffuseness_vector[meta_write_index][b] );
     561             :                 }
     562             :             }
     563             :         }
     564             :     }
     565             : 
     566     4181235 :     st->next_bit_pos = next_bit_pos_orig;
     567             : 
     568     4181235 :     if ( ivas_format == MASA_ISM_FORMAT )
     569             :     {
     570             :         int32_t cpe_brate;
     571     1128296 :         cpe_brate = calculate_cpe_brate_MASA_ISM( st_ivas->ism_mode, ivas_total_brate, st_ivas->nchan_ism );
     572             : 
     573     1128296 :         if ( st_ivas->nCPE == 1 && st_ivas->hCPE[0]->hStereoDft != NULL && st_ivas->hCPE[0]->hStereoDft->hConfig != NULL )
     574             :         {
     575      415402 :             st_ivas->hCPE[0]->hStereoDft->hConfig->force_mono_transmission = cpe_brate < MASA_STEREO_MIN_BITRATE ? 1 : 0;
     576             : 
     577      415402 :             if ( ivas_total_brate <= IVAS_SID_5k2 )
     578             :             {
     579           0 :                 st_ivas->hCPE[0]->hStereoDft->hConfig->force_mono_transmission = 0;
     580             :             }
     581             :         }
     582             :     }
     583             :     else
     584             :     {
     585     3052939 :         if ( ivas_format == MASA_FORMAT && st_ivas->nCPE == 1 && st_ivas->hCPE[0]->hStereoDft != NULL && st_ivas->hCPE[0]->hStereoDft->hConfig != NULL )
     586             :         {
     587      688383 :             st_ivas->hCPE[0]->hStereoDft->hConfig->force_mono_transmission = ivas_total_brate < MASA_STEREO_MIN_BITRATE ? 1 : 0;
     588             : 
     589      688383 :             if ( ivas_total_brate <= IVAS_SID_5k2 )
     590             :             {
     591        6320 :                 st_ivas->hCPE[0]->hStereoDft->hConfig->force_mono_transmission = 0;
     592             :             }
     593             :         }
     594             :     }
     595             : 
     596     4181235 :     if ( ivas_format == MASA_FORMAT && st_ivas->nCPE == 1 )
     597             :     {
     598     1619495 :         st_ivas->hCPE[0]->hCoreCoder[0]->masa_sid_format = 0;
     599             : 
     600     1619495 :         if ( st_ivas->hDecoderConfig->last_ivas_total_brate <= IVAS_SID_5k2 )
     601             :         {
     602        7637 :             st_ivas->hCPE[0]->hCoreCoder[0]->masa_sid_format = 1;
     603             : 
     604        7637 :             if ( ivas_total_brate >= IVAS_SID_5k2 )
     605             :             {
     606        1097 :                 st_ivas->hCPE[0]->element_brate = ivas_total_brate;
     607             :             }
     608             :         }
     609             :     }
     610             : 
     611     4181235 :     if ( ( st_ivas->ivas_format == MASA_FORMAT || st_ivas->ivas_format == MASA_ISM_FORMAT ) && st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL )
     612             :     {
     613      542703 :         create_masa_ext_out_meta( hMasa, hQMetaData, st_ivas->nchan_transport );
     614             :     }
     615             : 
     616     4181235 :     return error /* *nb_bits_read*/;
     617             : }
     618             : 
     619             : 
     620             : /*-------------------------------------------------------------------*
     621             :  * ivas_masa_dec_open()
     622             :  *
     623             :  *
     624             :  *-------------------------------------------------------------------*/
     625             : 
     626       40859 : ivas_error ivas_masa_dec_open(
     627             :     Decoder_Struct *st_ivas /* i/o: IVAS decoder handle  */
     628             : )
     629             : {
     630             :     MASA_DECODER_HANDLE hMasa;
     631             :     ivas_error error;
     632             :     int16_t i;
     633             :     int32_t ism_total_brate;
     634             : 
     635       40859 :     error = IVAS_ERR_OK;
     636             : 
     637       40859 :     if ( ( hMasa = (MASA_DECODER_HANDLE) malloc( sizeof( MASA_DECODER ) ) ) == NULL )
     638             :     {
     639           0 :         return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA decoder\n" ) );
     640             :     }
     641             : 
     642       40859 :     ism_total_brate = 0;
     643             :     /* ISM metadata */
     644       40859 :     if ( st_ivas->ivas_format == MASA_FORMAT && st_ivas->hIsmMetaData[0] != NULL )
     645             :     {
     646             :         /* these are not needed -> clean. EXT metafile writer in OMASA needs only the number of ISMs and writes default null-data */
     647           0 :         ivas_ism_metadata_close( st_ivas->hIsmMetaData, 0 );
     648             :     }
     649       40859 :     if ( st_ivas->ivas_format == MASA_ISM_FORMAT && st_ivas->nSCE > 0 && ( st_ivas->ism_mode == ISM_MASA_MODE_DISC || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) )
     650             :     {
     651       24274 :         for ( i = 0; i < st_ivas->nSCE; i++ )
     652             :         {
     653       15757 :             ism_total_brate += st_ivas->hSCE[i]->element_brate;
     654             :         }
     655             :     }
     656             : 
     657       40859 :     ivas_masa_set_elements( st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->mc_mode, st_ivas->nchan_transport, st_ivas->hQMetaData, &st_ivas->element_mode_init, &st_ivas->nSCE, &st_ivas->nCPE, st_ivas->ivas_format, st_ivas->ism_mode, ism_total_brate );
     658             : 
     659       40859 :     mvs2s( DirAC_block_grouping, hMasa->config.block_grouping, MAX_PARAM_SPATIAL_SUBFRAMES + 1 );
     660       40859 :     mvs2s( MASA_band_grouping_24, hMasa->config.band_grouping, MASA_FREQUENCY_BANDS + 1 );
     661       40859 :     hMasa->config.numberOfDirections = 1;
     662       40859 :     hMasa->config.joinedSubframes = FALSE;
     663             : 
     664             :     /* Create spherical grid only for external output */
     665       40859 :     if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL && ( st_ivas->ivas_format == MASA_FORMAT || st_ivas->ivas_format == MASA_ISM_FORMAT ) )
     666             :     {
     667        1125 :         if ( ( hMasa->data.sph_grid16 = (SPHERICAL_GRID_DATA *) malloc( sizeof( SPHERICAL_GRID_DATA ) ) ) == NULL )
     668             :         {
     669           0 :             return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA decoder\n" ) );
     670             :         }
     671             : 
     672        1125 :         generate_gridEq( hMasa->data.sph_grid16 );
     673        1125 :         if ( ( hMasa->data.extOutMeta = (MASA_DECODER_EXT_OUT_META *) malloc( sizeof( MASA_DECODER_EXT_OUT_META ) ) ) == NULL )
     674             :         {
     675           0 :             return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA decoder\n" ) );
     676             :         }
     677             :     }
     678             :     else
     679             :     {
     680       39734 :         hMasa->data.sph_grid16 = NULL;
     681       39734 :         hMasa->data.extOutMeta = NULL;
     682             :     }
     683             : 
     684       40859 :     if ( st_ivas->mc_mode == MC_MODE_MCMASA )
     685             :     {
     686       23680 :         error = init_lfe_synth_data( st_ivas, hMasa );
     687             :     }
     688             :     else
     689             :     {
     690       17179 :         hMasa->hMasaLfeSynth = NULL;
     691             :     }
     692             : 
     693       40859 :     st_ivas->hMasa = hMasa;
     694             : 
     695             :     /* allocate transport channels*/
     696       40859 :     if ( st_ivas->hTcBuffer == NULL && st_ivas->renderer_type != RENDERER_DISABLE && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC_ROOM && st_ivas->renderer_type != RENDERER_STEREO_PARAMETRIC )
     697             :     {
     698             :         int16_t nchan_to_allocate, nchan_transport;
     699             :         int16_t granularity;
     700             :         TC_BUFFER_MODE buffer_mode;
     701             : 
     702       10527 :         buffer_mode = TC_BUFFER_MODE_RENDERER;
     703       10527 :         if ( st_ivas->mc_mode == MC_MODE_MCMASA && ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_STEREO || st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_MONO ) )
     704             :         {
     705          95 :             buffer_mode = TC_BUFFER_MODE_BUFFER;
     706             :         }
     707       10432 :         else if ( st_ivas->ivas_format == MASA_ISM_FORMAT && st_ivas->renderer_type == RENDERER_MONO_DOWNMIX )
     708             :         {
     709         527 :             buffer_mode = TC_BUFFER_MODE_BUFFER;
     710             :         }
     711             : 
     712       10527 :         nchan_transport = ivas_jbm_dec_get_num_tc_channels( st_ivas );
     713       10527 :         nchan_to_allocate = nchan_transport;
     714             : 
     715       10527 :         if ( st_ivas->ivas_format == MASA_ISM_FORMAT && st_ivas->renderer_type == RENDERER_MONO_DOWNMIX )
     716             :         {
     717         527 :             nchan_transport = 1;
     718         527 :             nchan_to_allocate = 1;
     719             :         }
     720       10000 :         else if ( st_ivas->ivas_format == MASA_ISM_FORMAT && ( st_ivas->renderer_type == RENDERER_OMASA_MIX_EXT || st_ivas->renderer_type == RENDERER_OMASA_OBJECT_EXT ) )
     721             :         {
     722         129 :             nchan_transport = st_ivas->nchan_transport + st_ivas->nchan_ism;
     723         129 :             nchan_to_allocate = st_ivas->nchan_transport + st_ivas->nchan_ism;
     724             :         }
     725        9871 :         else if ( st_ivas->nchan_transport == 1 && ( st_ivas->renderer_type == RENDERER_DIRAC ) )
     726             :         {
     727             :             /* addtl channel for CNG */
     728        2060 :             nchan_to_allocate++;
     729             :         }
     730             : 
     731       10527 :         granularity = ivas_jbm_dec_get_render_granularity( st_ivas->renderer_type, RENDERER_DISABLE, st_ivas->hDecoderConfig->output_Fs );
     732             : 
     733       10527 :         if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, buffer_mode, nchan_transport, nchan_to_allocate, nchan_to_allocate, granularity ) ) != IVAS_ERR_OK )
     734             :         {
     735           0 :             return error;
     736             :         }
     737             :     }
     738             : 
     739       40859 :     return error;
     740             : }
     741             : 
     742             : 
     743             : /*-----------------------------------------------------------------------*
     744             :  * ivas_masa_dec_close()
     745             :  *
     746             :  * close MASA decoder
     747             :  *-----------------------------------------------------------------------*/
     748             : 
     749      143144 : void ivas_masa_dec_close(
     750             :     MASA_DECODER_HANDLE *hMasa_out /* i/o: MASA metadata structure      */
     751             : )
     752             : {
     753             :     MASA_DECODER_HANDLE hMasa;
     754             : 
     755      143144 :     if ( hMasa_out == NULL || *hMasa_out == NULL )
     756             :     {
     757      102285 :         return;
     758             :     }
     759             : 
     760       40859 :     hMasa = *hMasa_out;
     761             : 
     762             :     /* Free spherical grid memory if in use */
     763       40859 :     if ( hMasa->data.sph_grid16 != NULL )
     764             :     {
     765        3231 :         free( hMasa->data.sph_grid16 );
     766        3231 :         hMasa->data.sph_grid16 = NULL;
     767             :     }
     768             : 
     769       40859 :     if ( hMasa->data.extOutMeta != NULL )
     770             :     {
     771        1125 :         free( hMasa->data.extOutMeta );
     772        1125 :         hMasa->data.extOutMeta = NULL;
     773             :     }
     774             : 
     775       40859 :     if ( hMasa->hMasaLfeSynth != NULL )
     776             :     {
     777       23680 :         if ( hMasa->hMasaLfeSynth->lfeSynthRingBuffer != NULL )
     778             :         {
     779        2561 :             free( hMasa->hMasaLfeSynth->lfeSynthRingBuffer );
     780        2561 :             hMasa->hMasaLfeSynth->lfeSynthRingBuffer = NULL;
     781             :         }
     782       23680 :         if ( hMasa->hMasaLfeSynth->lfeSynthRingBuffer2 != NULL )
     783             :         {
     784        2561 :             free( hMasa->hMasaLfeSynth->lfeSynthRingBuffer2 );
     785        2561 :             hMasa->hMasaLfeSynth->lfeSynthRingBuffer2 = NULL;
     786             :         }
     787       23680 :         if ( hMasa->hMasaLfeSynth->delayBuffer_syncLp != NULL )
     788             :         {
     789        2561 :             free( hMasa->hMasaLfeSynth->delayBuffer_syncLp );
     790        2561 :             hMasa->hMasaLfeSynth->delayBuffer_syncLp = NULL;
     791             :         }
     792       23680 :         if ( hMasa->hMasaLfeSynth->delayBuffer_syncDirAC != NULL )
     793             :         {
     794        2561 :             free( hMasa->hMasaLfeSynth->delayBuffer_syncDirAC );
     795        2561 :             hMasa->hMasaLfeSynth->delayBuffer_syncDirAC = NULL;
     796             :         }
     797       23680 :         free( hMasa->hMasaLfeSynth );
     798       23680 :         hMasa->hMasaLfeSynth = NULL;
     799             :     }
     800             : 
     801       40859 :     free( *hMasa_out );
     802       40859 :     *hMasa_out = NULL;
     803             : 
     804       40859 :     return;
     805             : }
     806             : 
     807             : 
     808             : /*-------------------------------------------------------------------*
     809             :  * ivas_masa_dec_config()
     810             :  *
     811             :  * Frame-by-frame configuration of MASA decoder
     812             :  *-------------------------------------------------------------------*/
     813             : 
     814     4021261 : static ivas_error ivas_masa_dec_config(
     815             :     Decoder_Struct *st_ivas /* i/o: IVAS decoder handle  */
     816             : )
     817             : {
     818             :     int16_t i;
     819             :     MASA_DECODER_HANDLE hMasa;
     820             :     uint8_t maxBand;
     821             :     int16_t maxBin;
     822             :     ivas_error error;
     823             :     int32_t ivas_total_brate;
     824             :     int32_t ism_total_brate;
     825     4021261 :     error = IVAS_ERR_OK;
     826     4021261 :     hMasa = st_ivas->hMasa;
     827             : 
     828     4021261 :     ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate;
     829     4021261 :     ism_total_brate = 0;
     830     4021261 :     if ( st_ivas->ivas_format == MASA_ISM_FORMAT && st_ivas->nSCE > 0 && ( st_ivas->ism_mode == ISM_MASA_MODE_DISC || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) )
     831             :     {
     832     2996626 :         for ( i = 0; i < st_ivas->nSCE; i++ )
     833             :         {
     834     1927030 :             ism_total_brate += st_ivas->hSCE[i]->element_brate;
     835             :         }
     836             :     }
     837             : 
     838     4021261 :     ivas_masa_set_elements( ivas_total_brate, st_ivas->mc_mode, st_ivas->nchan_transport, st_ivas->hQMetaData, &st_ivas->element_mode_init, &st_ivas->nSCE, &st_ivas->nCPE, st_ivas->ivas_format, st_ivas->ism_mode, ism_total_brate );
     839             : 
     840     4021261 :     if ( st_ivas->ivas_format == MASA_ISM_FORMAT )
     841             :     {
     842     1069596 :         ivas_masa_set_coding_config( &( hMasa->config ), hMasa->data.band_mapping, st_ivas->hCPE[0]->element_brate, st_ivas->nchan_transport, MC_MODE_NONE );
     843             :     }
     844             :     else
     845             :     {
     846     2951665 :         ivas_masa_set_coding_config( &( hMasa->config ), hMasa->data.band_mapping, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA ) );
     847             :     }
     848             : 
     849     4021261 :     if ( ( st_ivas->ivas_format == MASA_FORMAT || st_ivas->ivas_format == MASA_ISM_FORMAT ) && st_ivas->hDecoderConfig->ivas_total_brate == IVAS_512k )
     850             :     {
     851      161530 :         hMasa->config.mergeRatiosOverSubframes = 0;
     852             : 
     853             :         /* initialize spherical grid */
     854      161530 :         if ( hMasa->data.sph_grid16 == NULL )
     855             :         {
     856        2106 :             if ( ( hMasa->data.sph_grid16 = (SPHERICAL_GRID_DATA *) malloc( sizeof( SPHERICAL_GRID_DATA ) ) ) == NULL )
     857             :             {
     858           0 :                 return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA data handle\n" ) );
     859             :             }
     860        2106 :             generate_gridEq( hMasa->data.sph_grid16 );
     861             :         }
     862             :     }
     863     4021261 :     st_ivas->hQMetaData->metadata_max_bits = hMasa->config.max_metadata_bits;
     864     4021261 :     st_ivas->hQMetaData->bandMap = hMasa->data.band_mapping;
     865     4021261 :     st_ivas->hQMetaData->nchan_transport = st_ivas->nchan_transport;
     866             : 
     867     4021261 :     if ( ( error = ivas_qmetadata_allocate_memory( st_ivas->hQMetaData, hMasa->config.numCodingBands, hMasa->config.numberOfDirections, hMasa->config.useCoherence ) ) != IVAS_ERR_OK )
     868             :     {
     869           0 :         return error;
     870             :     }
     871             : 
     872     4021261 :     st_ivas->hQMetaData->numTwoDirBands = st_ivas->hMasa->config.numTwoDirBands;
     873     4021261 :     st_ivas->hQMetaData->useLowerRes = 0;
     874             : 
     875     8564450 :     for ( i = 0; i < st_ivas->hQMetaData->no_directions; i++ )
     876             :     {
     877     4543189 :         st_ivas->hQMetaData->q_direction[i].cfg.nbands = hMasa->config.numCodingBands;
     878     4543189 :         st_ivas->hQMetaData->q_direction[i].cfg.nblocks = hMasa->config.joinedSubframes == TRUE ? 1 : MAX_PARAM_SPATIAL_SUBFRAMES;
     879             : 
     880     4543189 :         if ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA )
     881             :         {
     882      645116 :             st_ivas->hQMetaData->q_direction[i].cfg.mc_ls_setup = ivas_mc_map_output_config_to_mc_ls_setup( st_ivas->transport_config );
     883             :         }
     884             :         else
     885             :         {
     886     3898073 :             st_ivas->hQMetaData->q_direction[i].cfg.mc_ls_setup = MC_LS_SETUP_INVALID;
     887             :         }
     888             :     }
     889             : 
     890     4021261 :     ivas_set_qmetadata_maxbit_req( st_ivas->hQMetaData, st_ivas->ivas_format );
     891             : 
     892             :     /* Find maximum band usable */
     893     4021261 :     maxBin = (int16_t) ( st_ivas->hDecoderConfig->output_Fs * INV_CLDFB_BANDWIDTH );
     894     4021261 :     maxBand = 0;
     895   102345730 :     while ( maxBand <= MASA_FREQUENCY_BANDS && MASA_band_grouping_24[maxBand] <= maxBin )
     896             :     {
     897    98324469 :         maxBand++;
     898             :     }
     899     4021261 :     maxBand--;
     900             : 
     901     4021261 :     if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL )
     902             :     {
     903             :         /* need to apply the sampling rate correction also for the EXT output MASA meta buffer */
     904      572068 :         masa_sample_rate_band_correction( &( hMasa->config ), hMasa->data.band_mapping, st_ivas->hQMetaData, maxBand, 0, hMasa->data.extOutMeta );
     905             :     }
     906             :     else
     907             :     {
     908     3449193 :         masa_sample_rate_band_correction( &( hMasa->config ), hMasa->data.band_mapping, st_ivas->hQMetaData, maxBand, 0, NULL );
     909             :     }
     910             : 
     911     4021261 :     return error;
     912             : }
     913             : 
     914             : 
     915             : /*-------------------------------------------------------------------*
     916             :  * ivas_masa_prerender()
     917             :  *
     918             :  * Apply gaining and copying of transport signals when needed
     919             :  *-------------------------------------------------------------------*/
     920             : 
     921     2390233 : void ivas_masa_prerender(
     922             :     Decoder_Struct *st_ivas,     /* i/o: IVAS decoder handle                         */
     923             :     float *output[],             /* i/o: synthesized core-coder transport channels   */
     924             :     const int16_t output_frame,  /* i  : output frame length per channel             */
     925             :     const int16_t nchan_remapped /* i  : number of transports used in core           */
     926             : )
     927             : {
     928     2390233 :     if ( st_ivas->ivas_format == MASA_FORMAT && st_ivas->nchan_transport == 2 && nchan_remapped == 1 )
     929             :     {
     930      390982 :         if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL )
     931             :         {
     932       41016 :             mvr2r( output[0], output[1], output_frame ); /* Copy mono signal to stereo output channels */
     933             :         }
     934             :         else
     935             :         {
     936      349966 :             if ( st_ivas->renderer_type == RENDERER_DIRAC || st_ivas->renderer_type == RENDERER_DISABLE )
     937             :             {
     938      218822 :                 v_multc( output[0], SQRT2, output[0], output_frame ); /* Gain transport signal when transmitting mono with cpe in order to match loudness */
     939             :             }
     940             :         }
     941             :     }
     942             : 
     943     2390233 :     return;
     944             : }
     945             : 
     946             : 
     947             : /*-------------------------------------------------------------------*
     948             :  * Local functions
     949             :  *-------------------------------------------------------------------*/
     950             : 
     951      527956 : static void index_16bits(
     952             :     IVAS_QMETADATA_HANDLE hQMetaData,
     953             :     SPHERICAL_GRID_DATA *Sph_Grid16 )
     954             : {
     955             :     int16_t d, band, block;
     956             : 
     957     1169091 :     for ( d = 0; d < hQMetaData->no_directions; d++ )
     958             :     {
     959             :         /* Note: The band information is read from the first direction as it contains the full information.  */
     960     7906721 :         for ( band = 0; band < hQMetaData->q_direction[0].cfg.nbands; band++ )
     961             :         {
     962    26450232 :             for ( block = 0; block < hQMetaData->q_direction[0].cfg.nblocks; block++ )
     963             :             {
     964    19184646 :                 hQMetaData->q_direction[d].band_data[band].spherical_index[block] = index_theta_phi_16( &( hQMetaData->q_direction[d].band_data[band].elevation[block] ),
     965    19184646 :                                                                                                         &( hQMetaData->q_direction[d].band_data[band].azimuth[block] ), Sph_Grid16 );
     966             :             }
     967             :         }
     968             :     }
     969             : 
     970      527956 :     return;
     971             : }
     972             : 
     973             : 
     974             : /* Replicate subframe data when there is only one subframe sent */
     975      895929 : static void replicate_subframes(
     976             :     IVAS_QMETADATA_HANDLE hQMetaData )
     977             : {
     978             :     int16_t sf, band, dir, nbands, ndirs;
     979             : 
     980      895929 :     nbands = hQMetaData->q_direction->cfg.nbands;
     981      895929 :     ndirs = hQMetaData->no_directions;
     982             : 
     983     3583716 :     for ( sf = 1; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ )
     984             :     {
     985    34781505 :         for ( band = 0; band < nbands; band++ )
     986             :         {
     987    72617232 :             for ( dir = 0; dir < ndirs; dir++ )
     988             :             {
     989    40523514 :                 hQMetaData->q_direction[dir].band_data[band].azimuth[sf] = hQMetaData->q_direction[dir].band_data[band].azimuth[0];
     990    40523514 :                 hQMetaData->q_direction[dir].band_data[band].elevation[sf] = hQMetaData->q_direction[dir].band_data[band].elevation[0];
     991    40523514 :                 hQMetaData->q_direction[dir].band_data[band].spherical_index[sf] = hQMetaData->q_direction[dir].band_data[band].spherical_index[0];
     992    40523514 :                 hQMetaData->q_direction[dir].band_data[band].energy_ratio[sf] = hQMetaData->q_direction[dir].band_data[band].energy_ratio[0];
     993             : 
     994    40523514 :                 if ( hQMetaData->q_direction[dir].coherence_band_data != NULL )
     995             :                 {
     996    33477732 :                     hQMetaData->q_direction[dir].coherence_band_data[band].spread_coherence[sf] = hQMetaData->q_direction[dir].coherence_band_data[band].spread_coherence[0];
     997             :                 }
     998             :             }
     999             : 
    1000    32093718 :             if ( hQMetaData->surcoh_band_data != NULL )
    1001             :             {
    1002    25047936 :                 hQMetaData->surcoh_band_data[band].surround_coherence[sf] = hQMetaData->surcoh_band_data[band].surround_coherence[0];
    1003             :             }
    1004             :         }
    1005             :     }
    1006             : 
    1007      895929 :     return;
    1008             : }
    1009             : 
    1010             : 
    1011     1338471 : static void restore_lowbitrate_masa(
    1012             :     IVAS_QMETADATA_HANDLE hQMetaData,
    1013             :     const int16_t low_bitrate_mode,
    1014             :     const int16_t numCodingBands )
    1015             : {
    1016             :     int16_t sf, band;
    1017             : 
    1018     1338471 :     if ( low_bitrate_mode == 1 )
    1019             :     {
    1020             :         /* With signal 1, we are in 5 frequency bands, 1 subframe mode. */
    1021             :         /* Replicate data to all subframes */
    1022     4503024 :         for ( sf = 1; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ )
    1023             :         {
    1024    20263608 :             for ( band = 0; band < numCodingBands; band++ )
    1025             :             {
    1026    16886340 :                 hQMetaData->q_direction[0].band_data[band].azimuth[sf] = hQMetaData->q_direction[0].band_data[band].azimuth[0];
    1027    16886340 :                 hQMetaData->q_direction[0].band_data[band].elevation[sf] = hQMetaData->q_direction[0].band_data[band].elevation[0];
    1028    16886340 :                 hQMetaData->q_direction[0].band_data[band].spherical_index[sf] = hQMetaData->q_direction[0].band_data[band].spherical_index[0];
    1029    16886340 :                 hQMetaData->q_direction[0].band_data[band].energy_ratio[sf] = hQMetaData->q_direction[0].band_data[band].energy_ratio[0];
    1030    16886340 :                 if ( hQMetaData->q_direction[0].coherence_band_data != NULL )
    1031             :                 {
    1032     2923785 :                     hQMetaData->q_direction[0].coherence_band_data[band].spread_coherence[sf] = hQMetaData->q_direction[0].coherence_band_data[band].spread_coherence[0];
    1033             :                 }
    1034    16886340 :                 if ( hQMetaData->surcoh_band_data != NULL )
    1035             :                 {
    1036     2923785 :                     hQMetaData->surcoh_band_data[band].surround_coherence[sf] = hQMetaData->surcoh_band_data[band].surround_coherence[0];
    1037             :                 }
    1038             :             }
    1039             :         }
    1040     1125756 :         hQMetaData->q_direction->cfg.nblocks = 4;
    1041             :     }
    1042             :     else
    1043             :     {
    1044             :         /* With signal 0, we are in 1 frequency bands, 4 subframes mode. */
    1045             :         /* Replicate data to all bands */
    1046     1063575 :         for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ )
    1047             :         {
    1048     4254300 :             for ( band = 1; band < numCodingBands; band++ )
    1049             :             {
    1050     3403440 :                 hQMetaData->q_direction[0].band_data[band].azimuth[sf] = hQMetaData->q_direction[0].band_data[0].azimuth[sf];
    1051     3403440 :                 hQMetaData->q_direction[0].band_data[band].elevation[sf] = hQMetaData->q_direction[0].band_data[0].elevation[sf];
    1052     3403440 :                 hQMetaData->q_direction[0].band_data[band].spherical_index[sf] = hQMetaData->q_direction[0].band_data[0].spherical_index[sf];
    1053     3403440 :                 hQMetaData->q_direction[0].band_data[band].energy_ratio[sf] = hQMetaData->q_direction[0].band_data[0].energy_ratio[sf];
    1054     3403440 :                 if ( hQMetaData->q_direction[0].coherence_band_data != NULL )
    1055             :                 {
    1056      853136 :                     hQMetaData->q_direction[0].coherence_band_data[band].spread_coherence[sf] = hQMetaData->q_direction[0].coherence_band_data[0].spread_coherence[sf];
    1057             :                 }
    1058     3403440 :                 if ( hQMetaData->surcoh_band_data != NULL )
    1059             :                 {
    1060      853136 :                     hQMetaData->surcoh_band_data[band].surround_coherence[sf] = hQMetaData->surcoh_band_data[0].surround_coherence[sf];
    1061             :                 }
    1062             :             }
    1063             :         }
    1064      212715 :         hQMetaData->q_direction->cfg.nbands = numCodingBands;
    1065             :     }
    1066             : 
    1067     1338471 :     return;
    1068             : }
    1069             : 
    1070             : 
    1071       23680 : static ivas_error init_lfe_synth_data(
    1072             :     Decoder_Struct *st_ivas,  /* i  : IVAS decoder struct     */
    1073             :     MASA_DECODER_HANDLE hMasa /* i/o: MASA decoder structure  */
    1074             : )
    1075             : {
    1076             :     int32_t output_Fs;
    1077             :     AUDIO_CONFIG output_config;
    1078             : 
    1079       23680 :     output_Fs = st_ivas->hDecoderConfig->output_Fs;
    1080       23680 :     output_config = st_ivas->hDecoderConfig->output_config;
    1081             : 
    1082       23680 :     if ( ( hMasa->hMasaLfeSynth = (MCMASA_LFE_SYNTH_DATA_HANDLE) malloc( sizeof( MCMASA_LFE_SYNTH_DATA ) ) ) == NULL )
    1083             :     {
    1084           0 :         return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA decoder\n" ) );
    1085             :     }
    1086             : 
    1087       23680 :     hMasa->hMasaLfeSynth->transportEneSmooth = 0.0f;
    1088       23680 :     hMasa->hMasaLfeSynth->protoLfeEneSmooth = 0.0f;
    1089       23680 :     hMasa->hMasaLfeSynth->targetEneLfeSmooth = 0.0f;
    1090       23680 :     hMasa->hMasaLfeSynth->targetEneTransSmooth = 0.0f;
    1091             : 
    1092       23680 :     set_zero( hMasa->hMasaLfeSynth->lfeToTotalEnergyRatio, MAX_PARAM_SPATIAL_SUBFRAMES );
    1093       23680 :     hMasa->hMasaLfeSynth->lfeGainPrevIndex = 0;
    1094             : 
    1095       23680 :     if ( st_ivas->hOutSetup.separateChannelEnabled &&
    1096        4959 :          ( output_config == IVAS_AUDIO_CONFIG_5_1 || output_config == IVAS_AUDIO_CONFIG_7_1 ||
    1097        4899 :            output_config == IVAS_AUDIO_CONFIG_5_1_2 ||
    1098        4867 :            output_config == IVAS_AUDIO_CONFIG_5_1_4 || output_config == IVAS_AUDIO_CONFIG_7_1_4 ||
    1099        3526 :            output_config == IVAS_AUDIO_CONFIG_EXTERNAL ||
    1100        3496 :            output_config == IVAS_AUDIO_CONFIG_FOA || output_config == IVAS_AUDIO_CONFIG_HOA2 ||
    1101        2435 :            output_config == IVAS_AUDIO_CONFIG_HOA3 ||
    1102           0 :            ( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM && st_ivas->hOutSetup.num_lfe > 0 ) ) )
    1103        2561 :     {
    1104             :         int16_t bufferSize;
    1105             :         int16_t i;
    1106             :         int16_t slot_size;
    1107             : 
    1108             :         /* Ring buffer for the filterbank of the LFE synthesis.
    1109             :          * The filterbank is using moving average lowpass filter with the crossover of 120 Hz. */
    1110        2561 :         bufferSize = (int16_t) ( ( output_Fs / FRAMES_PER_SEC ) / MAX_PARAM_SPATIAL_SUBFRAMES );
    1111        2561 :         if ( ( hMasa->hMasaLfeSynth->lfeSynthRingBuffer = (float *) malloc( bufferSize * sizeof( float ) ) ) == NULL )
    1112             :         {
    1113           0 :             return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA decoder\n" ) );
    1114             :         }
    1115        2561 :         set_zero( hMasa->hMasaLfeSynth->lfeSynthRingBuffer, bufferSize );
    1116        2561 :         hMasa->hMasaLfeSynth->ringBufferLoPointer = 0;
    1117        2561 :         hMasa->hMasaLfeSynth->ringBufferHiPointer = bufferSize / 2;
    1118        2561 :         hMasa->hMasaLfeSynth->lowpassSum = 0.0f;
    1119        2561 :         hMasa->hMasaLfeSynth->ringBufferSize = bufferSize;
    1120             : 
    1121             :         /* Ring buffer for additional lowpass filter for the LFE signal.
    1122             :          * Moving average lowpass filter with the crossover of 240 Hz. */
    1123        2561 :         bufferSize /= 2;
    1124        2561 :         if ( ( hMasa->hMasaLfeSynth->lfeSynthRingBuffer2 = (float *) malloc( bufferSize * sizeof( float ) ) ) == NULL )
    1125             :         {
    1126           0 :             return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA decoder\n" ) );
    1127             :         }
    1128        2561 :         set_zero( hMasa->hMasaLfeSynth->lfeSynthRingBuffer2, bufferSize );
    1129        2561 :         hMasa->hMasaLfeSynth->ringBufferLoPointer2 = 0;
    1130        2561 :         hMasa->hMasaLfeSynth->lowpassSum2 = 0.0f;
    1131        2561 :         hMasa->hMasaLfeSynth->ringBufferSize2 = bufferSize;
    1132             : 
    1133             :         /* Delay buffer for matching the delay of the lowpass filter */
    1134        2561 :         bufferSize /= 2; /* The delay of the moving average lowpass filter is bufferSize / 2 */
    1135        2561 :         if ( ( hMasa->hMasaLfeSynth->delayBuffer_syncLp = (float *) malloc( bufferSize * sizeof( float ) ) ) == NULL )
    1136             :         {
    1137           0 :             return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA decoder\n" ) );
    1138             :         }
    1139        2561 :         set_zero( hMasa->hMasaLfeSynth->delayBuffer_syncLp, bufferSize );
    1140        2561 :         hMasa->hMasaLfeSynth->delayBuffer_syncLp_size = bufferSize;
    1141             : 
    1142             :         /* Delay buffer for syncing with DirAC rendering */
    1143        2561 :         bufferSize = NS2SA( output_Fs, IVAS_FB_DEC_DELAY_NS ) - hMasa->hMasaLfeSynth->ringBufferSize / 2 - hMasa->hMasaLfeSynth->ringBufferSize2 / 2;
    1144        2561 :         if ( ( hMasa->hMasaLfeSynth->delayBuffer_syncDirAC = (float *) malloc( bufferSize * sizeof( float ) ) ) == NULL )
    1145             :         {
    1146           0 :             return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA decoder\n" ) );
    1147             :         }
    1148        2561 :         set_zero( hMasa->hMasaLfeSynth->delayBuffer_syncDirAC, bufferSize );
    1149        2561 :         hMasa->hMasaLfeSynth->delayBuffer_syncDirAC_size = bufferSize;
    1150             : 
    1151             :         /* Interpolation between slots */
    1152        2561 :         hMasa->hMasaLfeSynth->lfeGainPrev = 0.0f;
    1153        2561 :         hMasa->hMasaLfeSynth->transportGainPrev = 1.0f;
    1154        2561 :         slot_size = (int16_t) ( ( output_Fs / FRAMES_PER_SEC ) / CLDFB_NO_COL_MAX );
    1155      145381 :         for ( i = 0; i < slot_size; i++ )
    1156             :         {
    1157      142820 :             hMasa->hMasaLfeSynth->interpolator[i] = ( (float) ( i + 1 ) ) / ( (float) slot_size );
    1158             :         }
    1159             :     }
    1160       21119 :     else if ( st_ivas->hOutSetup.separateChannelEnabled && output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM && st_ivas->hOutSetup.num_lfe == 0 )
    1161           0 :     {
    1162             :         int16_t bufferSize;
    1163             : 
    1164             :         /* Delay buffer for syncing with DirAC rendering */
    1165           0 :         bufferSize = NS2SA( output_Fs, IVAS_FB_DEC_DELAY_NS );
    1166           0 :         if ( ( hMasa->hMasaLfeSynth->delayBuffer_syncDirAC = (float *) malloc( bufferSize * sizeof( float ) ) ) == NULL )
    1167             :         {
    1168           0 :             return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA decoder\n" ) );
    1169             :         }
    1170           0 :         set_zero( hMasa->hMasaLfeSynth->delayBuffer_syncDirAC, bufferSize );
    1171           0 :         hMasa->hMasaLfeSynth->delayBuffer_syncDirAC_size = bufferSize;
    1172             : 
    1173           0 :         hMasa->hMasaLfeSynth->lfeSynthRingBuffer = NULL;
    1174           0 :         hMasa->hMasaLfeSynth->lfeSynthRingBuffer2 = NULL;
    1175           0 :         hMasa->hMasaLfeSynth->delayBuffer_syncLp = NULL;
    1176             :     }
    1177             :     else
    1178             :     {
    1179       21119 :         hMasa->hMasaLfeSynth->lfeSynthRingBuffer = NULL;
    1180       21119 :         hMasa->hMasaLfeSynth->lfeSynthRingBuffer2 = NULL;
    1181       21119 :         hMasa->hMasaLfeSynth->delayBuffer_syncLp = NULL;
    1182       21119 :         hMasa->hMasaLfeSynth->delayBuffer_syncDirAC = NULL;
    1183             :     }
    1184             : 
    1185       23680 :     return IVAS_ERR_OK;
    1186             : }
    1187             : 
    1188             : 
    1189             : /*! r: Number of bits read */
    1190      645116 : static int16_t decode_lfe_to_total_energy_ratio(
    1191             :     MCMASA_LFE_SYNTH_DATA_HANDLE hMasaLfeSynth, /* i/o: McMASA LFE structure */
    1192             :     uint16_t *bitstream,                        /* i  : bitstream            */
    1193             :     int16_t *index,                             /* i/o: bitstream position   */
    1194             :     const int32_t ivas_total_brate              /* i  : total bitrate        */
    1195             : )
    1196             : {
    1197             :     int16_t i;
    1198             :     int16_t lfeToTotalEnergyRatioIndices[3];
    1199             :     int16_t VQBits;
    1200             :     float log2LFEaverage;
    1201             :     float lfeToTotalEnergyRatioTemp;
    1202             :     uint16_t byteBuffer;
    1203             :     int16_t lfeBitsRead;
    1204             : 
    1205      645116 :     lfeBitsRead = 0;
    1206      645116 :     byteBuffer = bitstream[( *index )--];
    1207      645116 :     lfeBitsRead += 1;
    1208      645116 :     lfeToTotalEnergyRatioIndices[0] = byteBuffer; /* First LFE index */
    1209             : 
    1210      645116 :     if ( ivas_total_brate == IVAS_13k2 ) /* 1-bit adaptive LFE gain quantizer at 13.2 kbps */
    1211             :     {
    1212       63302 :         lfeToTotalEnergyRatioTemp = hMasaLfeSynth->lfeToTotalEnergyRatio[3]; /* Take memory from the last subframe */
    1213       63302 :         if ( lfeToTotalEnergyRatioIndices[0] == 1 )
    1214             :         {
    1215       18664 :             if ( hMasaLfeSynth->lfeGainPrevIndex == 1 )
    1216             :             {
    1217        8667 :                 lfeToTotalEnergyRatioTemp = lfeToTotalEnergyRatioTemp + MCMASA_LFE_THETA * MCMASA_LFE_BETA; /* larger "bump-up" energy */
    1218             :             }
    1219             :             else
    1220             :             {
    1221        9997 :                 lfeToTotalEnergyRatioTemp = lfeToTotalEnergyRatioTemp + MCMASA_LFE_BETA; /* "bump-up" energy */
    1222             :             }
    1223             :         }
    1224             :         else
    1225             :         {
    1226       44638 :             lfeToTotalEnergyRatioTemp = MCMASA_LFE_ALPHA * lfeToTotalEnergyRatioTemp; /* exponential decay */
    1227             :         }
    1228       63302 :         if ( lfeToTotalEnergyRatioTemp > 1.0f )
    1229             :         {
    1230          12 :             lfeToTotalEnergyRatioTemp = 1.0f;
    1231             :         }
    1232       63302 :         hMasaLfeSynth->lfeGainPrevIndex = lfeToTotalEnergyRatioIndices[0];
    1233      316510 :         for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ )
    1234             :         {
    1235      253208 :             hMasaLfeSynth->lfeToTotalEnergyRatio[i] = lfeToTotalEnergyRatioTemp;
    1236             :         }
    1237             :     }
    1238             :     else /* Bitrates >= 16.4 kbps */
    1239             :     {
    1240      581814 :         if ( lfeToTotalEnergyRatioIndices[0] == 0 )
    1241             :         {
    1242      466935 :             for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ )
    1243             :             {
    1244      373548 :                 hMasaLfeSynth->lfeToTotalEnergyRatio[i] = 0.0f;
    1245             :             }
    1246             :         }
    1247             :         else
    1248             :         {
    1249      488427 :             byteBuffer = bitstream[( *index )--] << 2;
    1250      488427 :             byteBuffer += bitstream[( *index )--] << 1;
    1251      488427 :             byteBuffer += bitstream[( *index )--];
    1252      488427 :             lfeBitsRead += 3;
    1253      488427 :             lfeToTotalEnergyRatioIndices[1] = byteBuffer; /* Scalar index */
    1254      488427 :             log2LFEaverage = usdequant( lfeToTotalEnergyRatioIndices[1], MCMASA_LFE_QLOW, MCMASA_LFE_DELTA );
    1255             : 
    1256             :             /* 16.4 kbps sends only scalar gain, above it VQ is used */
    1257      488427 :             if ( ivas_total_brate >= IVAS_24k4 )
    1258             :             {
    1259             :                 /* Depending on average (scalar) gain more bits are sent for VQ LFE gain */
    1260      465949 :                 switch ( lfeToTotalEnergyRatioIndices[1] )
    1261             :                 {
    1262       98446 :                     case 0:
    1263             :                     case 1:
    1264       98446 :                         VQBits = 0;
    1265       98446 :                         break;
    1266       50664 :                     case 2:
    1267       50664 :                         VQBits = 1;
    1268       50664 :                         break;
    1269       59282 :                     case 3:
    1270       59282 :                         VQBits = 2;
    1271       59282 :                         break;
    1272       69583 :                     case 4:
    1273       69583 :                         VQBits = 3;
    1274       69583 :                         break;
    1275      187974 :                     default:
    1276      187974 :                         VQBits = 4;
    1277             :                 }
    1278      465949 :                 byteBuffer = 0;
    1279     1595822 :                 for ( i = 0; i < VQBits; i++ )
    1280             :                 {
    1281     1129873 :                     byteBuffer += bitstream[( *index )--] << ( VQBits - 1 - i );
    1282     1129873 :                     lfeBitsRead += 1;
    1283             :                 }
    1284      465949 :                 lfeToTotalEnergyRatioIndices[2] = byteBuffer; /* VQ index */
    1285             :             }
    1286             : 
    1287     2442135 :             for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ )
    1288             :             {
    1289     1953708 :                 if ( ivas_total_brate == IVAS_16k4 )
    1290             :                 {
    1291       89912 :                     hMasaLfeSynth->lfeToTotalEnergyRatio[i] = exp2f( log2LFEaverage );
    1292             :                 }
    1293             :                 else
    1294             :                 {
    1295     1863796 :                     hMasaLfeSynth->lfeToTotalEnergyRatio[i] = exp2f( log2LFEaverage + McMASA_LFEGain_vectors[4 * lfeToTotalEnergyRatioIndices[2] + i] );
    1296             :                 }
    1297     1953708 :                 hMasaLfeSynth->lfeToTotalEnergyRatio[i] = min( hMasaLfeSynth->lfeToTotalEnergyRatio[i], 1.0f );
    1298     1953708 :                 hMasaLfeSynth->lfeToTotalEnergyRatio[i] = max( hMasaLfeSynth->lfeToTotalEnergyRatio[i], 0.0f );
    1299             :             }
    1300             :         }
    1301             :     }
    1302             : 
    1303      645116 :     return lfeBitsRead;
    1304             : }
    1305             : 
    1306             : 
    1307             : /*-------------------------------------------------------------------*
    1308             :  * ivas_masa_dec_reconfigure()
    1309             :  *
    1310             :  * Reconfigure IVAS MASA decoder
    1311             :  *-------------------------------------------------------------------*/
    1312             : 
    1313      188897 : ivas_error ivas_masa_dec_reconfigure(
    1314             :     Decoder_Struct *st_ivas /* i/o: IVAS decoder structure  */
    1315             : )
    1316             : {
    1317             :     int16_t n, tmp, num_bits;
    1318             :     int16_t sce_id, cpe_id;
    1319             :     uint16_t *bit_stream;
    1320             :     Decoder_State **sts;
    1321             :     int32_t ivas_total_brate, last_ivas_total_brate;
    1322             :     int16_t numCldfbAnalyses_old, numCldfbSyntheses_old;
    1323             :     int16_t nchan_out_buff;
    1324             :     ivas_error error;
    1325             :     int16_t pos_idx;
    1326             :     int32_t ism_total_brate;
    1327             : 
    1328      188897 :     ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate;
    1329      188897 :     last_ivas_total_brate = st_ivas->hDecoderConfig->last_ivas_total_brate;
    1330             : 
    1331             :     /* Copy state to TC buffer if granularity matches and we are not in OMASA EXT rendering mode */
    1332      188897 :     if ( st_ivas->hSpatParamRendCom != NULL && st_ivas->hSpatParamRendCom->slot_size == st_ivas->hTcBuffer->n_samples_granularity && st_ivas->hDecoderConfig->output_config != IVAS_AUDIO_CONFIG_EXTERNAL )
    1333             :     {
    1334      149132 :         mvs2s( st_ivas->hSpatParamRendCom->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS );
    1335      149132 :         st_ivas->hTcBuffer->nb_subframes = st_ivas->hSpatParamRendCom->nb_subframes;
    1336      149132 :         st_ivas->hTcBuffer->subframes_rendered = st_ivas->hSpatParamRendCom->subframes_rendered;
    1337             :     }
    1338             : 
    1339      188897 :     ivas_init_dec_get_num_cldfb_instances( st_ivas, &numCldfbAnalyses_old, &numCldfbSyntheses_old );
    1340             : 
    1341             :     /* renderer might have changed, reselect */
    1342      188897 :     ivas_renderer_select( st_ivas );
    1343             : 
    1344      188897 :     if ( ( st_ivas->renderer_type == RENDERER_DIRAC && st_ivas->hDirACRend == NULL ) ||
    1345      186527 :          ( ( st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) && st_ivas->hDiracDecBin[0] == NULL ) )
    1346             :     {
    1347             :         /* init a new DirAC dec */
    1348        2370 :         if ( ( error = ivas_dirac_dec_config( st_ivas, DIRAC_OPEN ) ) != IVAS_ERR_OK )
    1349             :         {
    1350           0 :             return error;
    1351             :         }
    1352             :     }
    1353      186527 :     else if ( st_ivas->renderer_type == RENDERER_DISABLE || st_ivas->renderer_type == RENDERER_MONO_DOWNMIX || st_ivas->renderer_type == RENDERER_OMASA_MIX_EXT )
    1354             :     {
    1355             :         /* close all unnecessary parametric decoding and rendering */
    1356       27364 :         ivas_dirac_dec_close_binaural_data( st_ivas->hDiracDecBin );
    1357       27364 :         ivas_dirac_rend_close( &( st_ivas->hDirACRend ) );
    1358       27364 :         ivas_spat_hSpatParamRendCom_close( &( st_ivas->hSpatParamRendCom ) );
    1359       27364 :         ivas_dirac_dec_close( &( st_ivas->hDirAC ) );
    1360             :     }
    1361             :     /* possible reconfigure is done later */
    1362             : 
    1363             :     /*-----------------------------------------------------------------*
    1364             :      * Allocate and initialize SCE/CPE and other handles
    1365             :      *-----------------------------------------------------------------*/
    1366             : 
    1367      188897 :     bit_stream = st_ivas->hSCE[0] != NULL ? st_ivas->hSCE[0]->hCoreCoder[0]->bit_stream : st_ivas->hCPE[0]->hCoreCoder[0]->bit_stream;
    1368             : 
    1369      188897 :     num_bits = 0;
    1370             : 
    1371      398243 :     for ( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ )
    1372             :     {
    1373      209346 :         st_ivas->hSCE[sce_id]->element_brate = ivas_total_brate / st_ivas->nchan_transport;
    1374      209346 :         st_ivas->hSCE[sce_id]->hCoreCoder[0]->total_brate = st_ivas->hSCE[sce_id]->element_brate; /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */
    1375      209346 :         sts = st_ivas->hSCE[sce_id]->hCoreCoder;
    1376      209346 :         sts[0]->bit_stream = bit_stream + num_bits;
    1377      209346 :         num_bits += (int16_t) ( st_ivas->hSCE[sce_id]->element_brate / FRAMES_PER_SEC );
    1378             : 
    1379      209346 :         if ( ( st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) && st_ivas->hDiracDecBin[0] != NULL )
    1380             :         {
    1381      100796 :             if ( ( error = ivas_dirac_dec_config( st_ivas, DIRAC_RECONFIGURE ) ) != IVAS_ERR_OK )
    1382             :             {
    1383           0 :                 return error;
    1384             :             }
    1385             :         }
    1386             :     }
    1387             : 
    1388      359553 :     for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ )
    1389             :     {
    1390      170656 :         st_ivas->hCPE[cpe_id]->element_brate = ( ivas_total_brate / st_ivas->nchan_transport ) * CPE_CHANNELS;
    1391             : 
    1392             :         /* prepare bitstream buffers */
    1393      511968 :         for ( n = 0; n < CPE_CHANNELS; n++ )
    1394             :         {
    1395      341312 :             st_ivas->hCPE[cpe_id]->hCoreCoder[n]->total_brate = st_ivas->hCPE[cpe_id]->element_brate / ( st_ivas->nCPE > 1 ? 1 : CPE_CHANNELS ); /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */
    1396             :         }
    1397      170656 :         sts = st_ivas->hCPE[cpe_id]->hCoreCoder;
    1398      170656 :         sts[0]->bit_stream = bit_stream + num_bits;
    1399      170656 :         num_bits += (int16_t) ( st_ivas->hCPE[cpe_id]->element_brate / FRAMES_PER_SEC );
    1400      170656 :         if ( ( ivas_total_brate < MASA_STEREO_MIN_BITRATE && last_ivas_total_brate >= MASA_STEREO_MIN_BITRATE ) ||
    1401      138377 :              ( ivas_total_brate < MASA_STEREO_MIN_BITRATE && last_ivas_total_brate == FRAME_NO_DATA ) ||
    1402         443 :              ( ivas_total_brate < MASA_STEREO_MIN_BITRATE && last_ivas_total_brate == IVAS_SID_5k2 ) )
    1403             :         {
    1404       32392 :             st_ivas->hCPE[cpe_id]->nchan_out = 1;
    1405       32392 :             if ( ( st_ivas->renderer_type == RENDERER_DIRAC && st_ivas->hDirACRend != NULL ) || ( ( st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) && st_ivas->hDiracDecBin[0] != NULL ) )
    1406             :             {
    1407       26496 :                 if ( ( error = ivas_dirac_dec_config( st_ivas, DIRAC_RECONFIGURE ) ) != IVAS_ERR_OK )
    1408             :                 {
    1409           0 :                     return error;
    1410             :                 }
    1411             :             }
    1412             :         }
    1413      138264 :         else if ( ivas_total_brate >= MASA_STEREO_MIN_BITRATE && last_ivas_total_brate < MASA_STEREO_MIN_BITRATE )
    1414             :         {
    1415       32483 :             st_ivas->hCPE[cpe_id]->nchan_out = CPE_CHANNELS;
    1416             : 
    1417       32483 :             if ( ( st_ivas->renderer_type == RENDERER_DIRAC && st_ivas->hDirACRend != NULL ) || ( ( st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) && st_ivas->hDiracDecBin[0] != NULL ) )
    1418             :             {
    1419       27436 :                 if ( ( error = ivas_dirac_dec_config( st_ivas, DIRAC_RECONFIGURE ) ) != IVAS_ERR_OK )
    1420             :                 {
    1421           0 :                     return error;
    1422             :                 }
    1423             :             }
    1424             :         }
    1425             :     }
    1426             : 
    1427     1700073 :     for ( pos_idx = 0; pos_idx < MAX_HEAD_ROT_POSES; pos_idx++ )
    1428             :     {
    1429     1511176 :         if ( st_ivas->hDiracDecBin[pos_idx] != NULL )
    1430             :         {
    1431             :             /* regularization factor is bitrate-dependent */
    1432       93011 :             st_ivas->hDiracDecBin[pos_idx]->reqularizationFactor = configure_reqularization_factor( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate );
    1433             :         }
    1434             :     }
    1435             : 
    1436      188897 :     if ( st_ivas->ivas_format == MASA_FORMAT && st_ivas->last_ivas_format == MASA_FORMAT ) /* note: switching within OMASA is handled in ivas_omasa_dec_config() */
    1437             :     {
    1438             :         /*-----------------------------------------------------------------*
    1439             :          * TD Decorrelator
    1440             :          *-----------------------------------------------------------------*/
    1441             : 
    1442       41021 :         if ( st_ivas->hDiracDecBin[0] != NULL )
    1443             :         {
    1444       19349 :             if ( ( error = ivas_td_decorr_reconfig_dec( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, &( st_ivas->hDiracDecBin[0]->hTdDecorr ), &( st_ivas->hDiracDecBin[0]->useTdDecorr ) ) ) != IVAS_ERR_OK )
    1445             :             {
    1446           0 :                 return error;
    1447             :             }
    1448             :         }
    1449             : 
    1450             :         /*-----------------------------------------------------------------*
    1451             :          * CLDFB instances
    1452             :          *-----------------------------------------------------------------*/
    1453             : 
    1454       41021 :         if ( ( error = ivas_cldfb_dec_reconfig( st_ivas, st_ivas->nchan_transport, numCldfbAnalyses_old, numCldfbSyntheses_old ) ) != IVAS_ERR_OK )
    1455             :         {
    1456           0 :             return error;
    1457             :         }
    1458             :     }
    1459             : 
    1460             :     /*-----------------------------------------------------------------*
    1461             :      * Set-up MASA coding elements and bitrates
    1462             :      *-----------------------------------------------------------------*/
    1463             : 
    1464      188897 :     ism_total_brate = 0;
    1465      188897 :     if ( st_ivas->ivas_format == MASA_ISM_FORMAT && st_ivas->nSCE > 0 && ( st_ivas->ism_mode == ISM_MASA_MODE_DISC || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) )
    1466             :     {
    1467      187514 :         for ( n = 0; n < st_ivas->nSCE; n++ )
    1468             :         {
    1469      120879 :             ism_total_brate += st_ivas->hSCE[n]->element_brate;
    1470             :         }
    1471             :     }
    1472             : 
    1473      188897 :     ivas_masa_set_elements( ivas_total_brate, st_ivas->mc_mode, st_ivas->nchan_transport, st_ivas->hQMetaData, &tmp, &tmp, &tmp, st_ivas->ivas_format, st_ivas->ism_mode, ism_total_brate );
    1474             : 
    1475             :     /*-----------------------------------------------------------------*
    1476             :      * JBM TC buffers
    1477             :      *-----------------------------------------------------------------*/
    1478             : 
    1479             :     {
    1480             :         int16_t tc_nchan_to_allocate;
    1481             :         int16_t tc_nchan_transport;
    1482             :         TC_BUFFER_MODE buffer_mode_new;
    1483             :         int16_t n_samples_granularity;
    1484             : 
    1485      188897 :         n_samples_granularity = ivas_jbm_dec_get_render_granularity( st_ivas->renderer_type, ivas_renderer_secondary_select( st_ivas ), st_ivas->hDecoderConfig->output_Fs );
    1486      188897 :         buffer_mode_new = ivas_jbm_dec_get_tc_buffer_mode( st_ivas );
    1487      188897 :         tc_nchan_transport = ivas_jbm_dec_get_num_tc_channels( st_ivas );
    1488             : 
    1489      188897 :         tc_nchan_to_allocate = tc_nchan_transport;
    1490      188897 :         if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC )
    1491             :         {
    1492       93011 :             if ( st_ivas->ivas_format == MASA_ISM_FORMAT )
    1493             :             {
    1494       52411 :                 tc_nchan_to_allocate = BINAURAL_CHANNELS + st_ivas->nchan_ism;
    1495             :             }
    1496             :             else
    1497             :             {
    1498       40600 :                 tc_nchan_to_allocate = BINAURAL_CHANNELS;
    1499       40600 :                 if ( st_ivas->hDiracDecBin[0] != NULL && st_ivas->hDiracDecBin[0]->useTdDecorr )
    1500             :                 {
    1501       21110 :                     tc_nchan_to_allocate = 2 * BINAURAL_CHANNELS;
    1502             :                 }
    1503             :             }
    1504             : 
    1505       93011 :             if ( st_ivas->ivas_format == MASA_ISM_FORMAT && st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC && st_ivas->ism_mode == ISM_MASA_MODE_DISC )
    1506             :             {
    1507       10066 :                 if ( n_samples_granularity > st_ivas->hTcBuffer->n_samples_granularity )
    1508             :                 {
    1509        9994 :                     if ( ( error = ivas_jbm_dec_set_discard_samples( st_ivas ) ) != IVAS_ERR_OK )
    1510             :                     {
    1511           0 :                         return error;
    1512             :                     }
    1513             :                 }
    1514             :             }
    1515       16872 :             else if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC && st_ivas->ism_mode != ISM_MASA_MODE_DISC )
    1516             :             {
    1517       16872 :                 if ( n_samples_granularity < st_ivas->hTcBuffer->n_samples_granularity )
    1518             :                 {
    1519             :                     /* flush already done in IVAS_DEC_ReadFormat() */
    1520             :                 }
    1521             :             }
    1522             :         }
    1523       95886 :         else if ( st_ivas->nchan_transport == 1 && ( st_ivas->renderer_type == RENDERER_DIRAC && st_ivas->hDirACRend->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) )
    1524             :         {
    1525             :             /* addtl channel for CNG */
    1526        4096 :             tc_nchan_to_allocate++;
    1527             :         }
    1528       91790 :         else if ( st_ivas->ivas_format == MASA_ISM_FORMAT && ( st_ivas->renderer_type == RENDERER_OMASA_MIX_EXT || st_ivas->renderer_type == RENDERER_OMASA_OBJECT_EXT ) )
    1529             :         {
    1530        4645 :             tc_nchan_transport = st_ivas->nchan_transport + st_ivas->nchan_ism;
    1531        4645 :             tc_nchan_to_allocate = st_ivas->nchan_transport + st_ivas->nchan_ism;
    1532             :         }
    1533             : 
    1534      188897 :         if ( tc_nchan_transport != st_ivas->hTcBuffer->nchan_transport_jbm || tc_nchan_to_allocate != st_ivas->hTcBuffer->nchan_transport_internal || buffer_mode_new != st_ivas->hTcBuffer->tc_buffer_mode )
    1535             :         {
    1536      135700 :             if ( ( error = ivas_jbm_dec_tc_buffer_reconfigure( st_ivas, buffer_mode_new, tc_nchan_transport, tc_nchan_to_allocate, tc_nchan_to_allocate, n_samples_granularity ) ) != IVAS_ERR_OK )
    1537             :             {
    1538           0 :                 return error;
    1539             :             }
    1540             :         }
    1541             : 
    1542      188897 :         if ( st_ivas->hSpatParamRendCom != NULL && st_ivas->hSpatParamRendCom->slot_size == st_ivas->hTcBuffer->n_samples_granularity )
    1543             :         {
    1544      149144 :             mvs2s( st_ivas->hTcBuffer->subframe_nbslots, st_ivas->hSpatParamRendCom->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS );
    1545      149144 :             st_ivas->hSpatParamRendCom->nb_subframes = st_ivas->hTcBuffer->nb_subframes;
    1546      149144 :             st_ivas->hSpatParamRendCom->subframes_rendered = st_ivas->hTcBuffer->subframes_rendered;
    1547             :         }
    1548             : 
    1549      188897 :         if ( st_ivas->ivas_format == MASA_ISM_FORMAT && st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC && st_ivas->ism_mode == ISM_MASA_MODE_DISC )
    1550             :         {
    1551       10066 :             int16_t granularityMultiplier = st_ivas->hTcBuffer->n_samples_granularity / st_ivas->hSpatParamRendCom->slot_size;
    1552             : 
    1553       90594 :             for ( n = 0; n < MAX_JBM_SUBFRAMES_5MS; n++ )
    1554             :             {
    1555       80528 :                 st_ivas->hSpatParamRendCom->subframe_nbslots[n] = st_ivas->hTcBuffer->subframe_nbslots[n] * granularityMultiplier;
    1556             :             }
    1557             :         }
    1558             :     }
    1559             : 
    1560             :     /*-----------------------------------------------------------------*
    1561             :      * floating-point output audio buffers
    1562             :      *-----------------------------------------------------------------*/
    1563             : 
    1564      188897 :     if ( st_ivas->ivas_format == MASA_FORMAT && st_ivas->last_ivas_format == MASA_FORMAT ) /* note: switching with OMASA is addressed in ivas_omasa_dec_config() */
    1565             :     {
    1566       41021 :         nchan_out_buff = ivas_get_nchan_buffers_dec( st_ivas, -1, -1 );
    1567       41021 :         if ( ( error = ivas_output_buff_dec( st_ivas->p_output_f, nchan_out_buff, st_ivas->hDecoderConfig->Opt_tsm, st_ivas->hTcBuffer ) ) != IVAS_ERR_OK )
    1568             :         {
    1569           0 :             return error;
    1570             :         }
    1571             :     }
    1572             : 
    1573      188897 :     return IVAS_ERR_OK;
    1574             : }
    1575             : 
    1576             : 
    1577             : /*-------------------------------------------------------------------*
    1578             :  * ivas_spar_param_to_masa_param_mapping()
    1579             :  *
    1580             :  * Determine MASA metadata from the SPAR metadata
    1581             :  *-------------------------------------------------------------------*/
    1582             : 
    1583     6475076 : void ivas_spar_param_to_masa_param_mapping(
    1584             :     Decoder_Struct *st_ivas,                                       /* i/o: IVAS decoder struct               */
    1585             :     float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i  : Input audio in CLDFB domain, real */
    1586             :     float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i  : Input audio in CLDFB domain, imag */
    1587             :     const int16_t subframe                                         /* i  : Subframe to map                   */
    1588             : )
    1589             : {
    1590             :     int16_t i, j, band, bin, slot, ch, nBins, nchan_transport;
    1591             :     int16_t mixer_mat_index;
    1592             :     int16_t dirac_write_idx;
    1593             :     DIRAC_DEC_HANDLE hDirAC;
    1594             :     DIFFUSE_DISTRIBUTION_HANDLE hDiffuseDist;
    1595             :     float mixer_mat_sf_bands_real[SPAR_DIRAC_SPLIT_START_BAND][FOA_CHANNELS][FOA_CHANNELS];
    1596             :     float mixer_mat_sf_bins_real[CLDFB_NO_CHANNELS_MAX][FOA_CHANNELS][FOA_CHANNELS];
    1597             :     int16_t *band_grouping;
    1598             :     int16_t band_start, band_end;
    1599             :     float transportSignalEnergies[2][CLDFB_NO_CHANNELS_MAX];
    1600             :     float transportSignalCrossCorrelation[CLDFB_NO_CHANNELS_MAX];
    1601             :     float instEne;
    1602             :     float inCovarianceMtx[FOA_CHANNELS][FOA_CHANNELS];
    1603             :     float foaCovarianceMtx[FOA_CHANNELS][FOA_CHANNELS];
    1604             :     float Iy, Iz, Ix, E, azi, ele, I, ratio;
    1605             :     float diffuseGainX, diffuseGainY, diffuseGainZ, diffuseGainSum;
    1606             :     int16_t slot_idx, slot_idx_start, sf;
    1607             :     SPAR_DEC_HANDLE hSpar;
    1608             :     float slot_fac;
    1609             :     SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom;
    1610             : 
    1611             :     /* Set values */
    1612     6475076 :     hDirAC = st_ivas->hDirAC;
    1613     6475076 :     hSpatParamRendCom = st_ivas->hSpatParamRendCom;
    1614     6475076 :     hSpatParamRendCom->numParametricDirections = 1;
    1615     6475076 :     hSpatParamRendCom->numSimultaneousDirections = 1;
    1616     6475076 :     hDiffuseDist = st_ivas->hDiracDecBin[0]->hDiffuseDist;
    1617     6475076 :     nchan_transport = st_ivas->nchan_transport;
    1618     6475076 :     band_grouping = hDirAC->band_grouping;
    1619     6475076 :     hSpar = st_ivas->hSpar;
    1620     6475076 :     dirac_write_idx = hSpatParamRendCom->render_to_md_map[subframe];
    1621             : 
    1622             :     /* Init arrays */
    1623    32375380 :     for ( i = 0; i < FOA_CHANNELS; i++ )
    1624             :     {
    1625    25900304 :         set_zero( inCovarianceMtx[i], FOA_CHANNELS );
    1626             :     }
    1627             : 
    1628             :     /* Delay the SPAR mixing matrices to have them synced with the audio */
    1629     6475076 :     slot_idx_start = hSpar->slots_rendered;
    1630     6475076 :     slot_fac = 1.0f / (float) hSpar->subframe_nbslots[subframe];
    1631             : 
    1632    32291062 :     for ( slot_idx = 0; slot_idx < hSpar->subframe_nbslots[subframe]; slot_idx++ )
    1633             :     {
    1634    25815986 :         sf = hSpar->render_to_md_map[slot_idx + slot_idx_start] / JBM_CLDFB_SLOTS_IN_SUBFRAME;
    1635             : 
    1636    25815986 :         if ( ( sf < SPAR_META_DELAY_SUBFRAMES ) )
    1637             :         {
    1638    12908926 :             mixer_mat_index = sf + MAX_PARAM_SPATIAL_SUBFRAMES - SPAR_META_DELAY_SUBFRAMES + 1;
    1639   116180334 :             for ( band = 0; band < SPAR_DIRAC_SPLIT_START_BAND; band++ )
    1640             :             {
    1641   516357040 :                 for ( i = 0; i < FOA_CHANNELS; i++ )
    1642             :                 {
    1643  2065428160 :                     for ( j = 0; j < FOA_CHANNELS; j++ )
    1644             :                     {
    1645  1652342528 :                         mixer_mat_sf_bands_real[band][i][j] = slot_fac * st_ivas->hSpar->hMdDec->mixer_mat_prev[mixer_mat_index][i][j][band];
    1646             :                     }
    1647             :                 }
    1648             :             }
    1649             :         }
    1650             :         else
    1651             :         {
    1652    12907060 :             mixer_mat_index = ( ivas_get_spar_dec_md_num_subframes( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->last_active_ivas_total_brate ) == 1 ) ? 0 : ( sf - SPAR_META_DELAY_SUBFRAMES );
    1653   116163540 :             for ( band = 0; band < SPAR_DIRAC_SPLIT_START_BAND; band++ )
    1654             :             {
    1655   516282400 :                 for ( i = 0; i < FOA_CHANNELS; i++ )
    1656             :                 {
    1657  2065129600 :                     for ( j = 0; j < FOA_CHANNELS; j++ )
    1658             :                     {
    1659  1652103680 :                         mixer_mat_sf_bands_real[band][i][j] = slot_fac * st_ivas->hSpar->hMdDec->mixer_mat[i][j][band + mixer_mat_index * IVAS_MAX_NUM_BANDS];
    1660             :                     }
    1661             :                 }
    1662             :             }
    1663             :         }
    1664             :     }
    1665             : 
    1666             :     /* Map the mixing matrices from the frequency bands to frequency bins */
    1667     6475076 :     bin = 0;
    1668    58275684 :     for ( band = 0; band < SPAR_DIRAC_SPLIT_START_BAND; band++ )
    1669             :     {
    1670    51800608 :         band_start = band_grouping[band];
    1671    51800608 :         band_end = band_grouping[band + 1];
    1672   123026444 :         for ( bin = band_start; bin < band_end; bin++ )
    1673             :         {
    1674   356129180 :             for ( i = 0; i < FOA_CHANNELS; i++ )
    1675             :             {
    1676  1424516720 :                 for ( j = 0; j < FOA_CHANNELS; j++ )
    1677             :                 {
    1678  1139613376 :                     mixer_mat_sf_bins_real[bin][i][j] = mixer_mat_sf_bands_real[band][i][j];
    1679             :                 }
    1680             :             }
    1681             :         }
    1682             :     }
    1683     6475076 :     nBins = bin;
    1684             : 
    1685             :     /* Determine MASA metadata */
    1686             :     /* Determine transport signal energies and cross correlations when more than 1 TC */
    1687     6475076 :     if ( nchan_transport == 2 )
    1688             :     {
    1689     3545961 :         set_zero( transportSignalEnergies[0], nBins );
    1690     3545961 :         set_zero( transportSignalEnergies[1], nBins );
    1691     3545961 :         set_zero( transportSignalCrossCorrelation, nBins );
    1692             : 
    1693    17710791 :         for ( slot = 0; slot < hSpatParamRendCom->subframe_nbslots[subframe]; slot++ )
    1694             :         {
    1695   169977960 :             for ( bin = 0; bin < nBins; bin++ )
    1696             :             {
    1697   467439390 :                 for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ )
    1698             :                 {
    1699   311626260 :                     instEne = ( inRe[ch][slot][bin] * inRe[ch][slot][bin] );
    1700   311626260 :                     instEne += ( inIm[ch][slot][bin] * inIm[ch][slot][bin] );
    1701   311626260 :                     transportSignalEnergies[ch][bin] += instEne;
    1702             :                 }
    1703   155813130 :                 transportSignalCrossCorrelation[bin] += inRe[0][slot][bin] * inRe[1][slot][bin];
    1704   155813130 :                 transportSignalCrossCorrelation[bin] += inIm[0][slot][bin] * inIm[1][slot][bin];
    1705             :             }
    1706             :         }
    1707             :     }
    1708             : 
    1709     6475076 :     if ( hDiffuseDist != NULL )
    1710             :     {
    1711     6475076 :         set_zero( hDiffuseDist->diffuseRatioX, CLDFB_NO_CHANNELS_MAX );
    1712     6475076 :         set_zero( hDiffuseDist->diffuseRatioY, CLDFB_NO_CHANNELS_MAX );
    1713     6475076 :         set_zero( hDiffuseDist->diffuseRatioZ, CLDFB_NO_CHANNELS_MAX );
    1714             :     }
    1715             : 
    1716    77700912 :     for ( bin = 0; bin < nBins; bin++ )
    1717             :     {
    1718             :         /* Set the energy of the first transport signal */
    1719    71225836 :         if ( nchan_transport == 1 )
    1720             :         {
    1721    32220265 :             inCovarianceMtx[0][0] = 1.0f; /* In case of 1TC, fixed value can be used */
    1722             :         }
    1723             :         else
    1724             :         {
    1725    39005571 :             inCovarianceMtx[0][0] = transportSignalEnergies[0][bin]; /* In case of 2TC, use actual energies */
    1726             :         }
    1727             : 
    1728             :         /* Decorrelated channels assumed to have the same energy as the source channel */
    1729    71225836 :         inCovarianceMtx[1][1] = inCovarianceMtx[0][0];
    1730    71225836 :         inCovarianceMtx[2][2] = inCovarianceMtx[0][0];
    1731    71225836 :         inCovarianceMtx[3][3] = inCovarianceMtx[0][0];
    1732             : 
    1733             :         /* In case residuals were transmitted, use their actual energies and cross correlations */
    1734    71225836 :         if ( nchan_transport == 2 )
    1735             :         {
    1736    39005571 :             inCovarianceMtx[1][1] = transportSignalEnergies[1][bin];
    1737    39005571 :             inCovarianceMtx[0][1] = transportSignalCrossCorrelation[bin];
    1738    39005571 :             inCovarianceMtx[1][0] = inCovarianceMtx[0][1];
    1739             :         }
    1740             : 
    1741    71225836 :         compute_foa_cov_matrix( foaCovarianceMtx, inCovarianceMtx, mixer_mat_sf_bins_real[bin] );
    1742             : 
    1743             :         /* Estimate MASA metadata */
    1744    71225836 :         Iy = foaCovarianceMtx[0][1];                                                                                      /* Intensity in Y direction */
    1745    71225836 :         Iz = foaCovarianceMtx[0][2];                                                                                      /* Intensity in Z direction */
    1746    71225836 :         Ix = foaCovarianceMtx[0][3];                                                                                      /* Intensity in X direction */
    1747    71225836 :         I = sqrtf( Ix * Ix + Iy * Iy + Iz * Iz );                                                                         /* Intensity vector length */
    1748    71225836 :         E = ( foaCovarianceMtx[0][0] + foaCovarianceMtx[1][1] + foaCovarianceMtx[2][2] + foaCovarianceMtx[3][3] ) / 2.0f; /* Overall energy */
    1749    71225836 :         azi = atan2f( Iy, Ix );                                                                                           /* Azimuth */
    1750    71225836 :         ele = atan2f( Iz, sqrtf( Ix * Ix + Iy * Iy ) );                                                                   /* Elevation */
    1751    71225836 :         ratio = I / fmaxf( 1e-12f, E );                                                                                   /* Energy ratio */
    1752    71225836 :         ratio = fmaxf( 0.0f, fminf( 1.0f, ratio ) );
    1753             : 
    1754    71225836 :         hSpatParamRendCom->azimuth[dirac_write_idx][bin] = (int16_t) roundf( azi / PI_OVER_180 );
    1755    71225836 :         hSpatParamRendCom->elevation[dirac_write_idx][bin] = (int16_t) roundf( ele / PI_OVER_180 );
    1756    71225836 :         hSpatParamRendCom->energy_ratio1[dirac_write_idx][bin] = ratio;
    1757    71225836 :         hSpatParamRendCom->diffuseness_vector[dirac_write_idx][bin] = 1.0f - ratio;
    1758             : 
    1759    71225836 :         hSpatParamRendCom->spreadCoherence[dirac_write_idx][bin] = 0.0f;
    1760    71225836 :         hSpatParamRendCom->surroundingCoherence[dirac_write_idx][bin] = 0.0f;
    1761             : 
    1762             :         /* Determine directional distribution of the indirect audio based on the SPAR mixing matrices (and the transport audio signals when 2 TC) */
    1763    71225836 :         if ( hDiffuseDist != NULL )
    1764             :         {
    1765    71225836 :             if ( nchan_transport == 1 )
    1766             :             {
    1767    32220265 :                 diffuseGainY = fabsf( mixer_mat_sf_bins_real[bin][1][1] );
    1768    32220265 :                 diffuseGainX = fabsf( mixer_mat_sf_bins_real[bin][3][2] );
    1769    32220265 :                 diffuseGainZ = fabsf( mixer_mat_sf_bins_real[bin][2][3] );
    1770             :             }
    1771    39005571 :             else if ( nchan_transport == 2 )
    1772             :             {
    1773    39005571 :                 diffuseGainY = fabsf( mixer_mat_sf_bins_real[bin][1][1] * transportSignalEnergies[1][bin] );
    1774    39005571 :                 diffuseGainX = fabsf( mixer_mat_sf_bins_real[bin][3][2] * transportSignalEnergies[0][bin] ) + fabsf( mixer_mat_sf_bins_real[bin][3][1] * transportSignalEnergies[1][bin] );
    1775    39005571 :                 diffuseGainZ = fabsf( mixer_mat_sf_bins_real[bin][2][3] * transportSignalEnergies[0][bin] ) + fabsf( mixer_mat_sf_bins_real[bin][2][1] * transportSignalEnergies[1][bin] );
    1776             :             }
    1777             :             else
    1778             :             {
    1779           0 :                 diffuseGainY = 1.0f;
    1780           0 :                 diffuseGainX = 1.0f;
    1781           0 :                 diffuseGainZ = 1.0f;
    1782             :             }
    1783             : 
    1784    71225836 :             diffuseGainSum = diffuseGainY + diffuseGainX + diffuseGainZ;
    1785             : 
    1786    71225836 :             if ( diffuseGainSum == 0.0f )
    1787             :             {
    1788     2235865 :                 hDiffuseDist->diffuseRatioX[bin] = 1.0f / 3.0f;
    1789     2235865 :                 hDiffuseDist->diffuseRatioY[bin] = 1.0f / 3.0f;
    1790     2235865 :                 hDiffuseDist->diffuseRatioZ[bin] = 1.0f / 3.0f;
    1791             :             }
    1792             :             else
    1793             :             {
    1794    68989971 :                 hDiffuseDist->diffuseRatioX[bin] = diffuseGainX / ( diffuseGainSum + EPSILON );
    1795    68989971 :                 hDiffuseDist->diffuseRatioY[bin] = diffuseGainY / ( diffuseGainSum + EPSILON );
    1796    68989971 :                 hDiffuseDist->diffuseRatioZ[bin] = diffuseGainZ / ( diffuseGainSum + EPSILON );
    1797             :             }
    1798             :         }
    1799             :     }
    1800             : 
    1801     6475076 :     return;
    1802             : }
    1803             : 
    1804             : 
    1805             : /* Estimate FOA properties: foaCov = mixMtx * inCov * mixMtx' */
    1806    71225836 : static void compute_foa_cov_matrix(
    1807             :     float foaCov[FOA_CHANNELS][FOA_CHANNELS], /* o  : Estimated FOA covariance matrix */
    1808             :     float inCov[FOA_CHANNELS][FOA_CHANNELS],  /* i  : Input covariance matrix         */
    1809             :     float mixMtx[FOA_CHANNELS][FOA_CHANNELS]  /* i  : Mixing matrix                   */
    1810             : )
    1811             : {
    1812             :     float tmpMtx[FOA_CHANNELS][FOA_CHANNELS];
    1813             :     int16_t i, j, k;
    1814             : 
    1815             :     /* tmpMtx = mixMtx * inCov */
    1816   356129180 :     for ( i = 0; i < FOA_CHANNELS; i++ )
    1817             :     {
    1818  1424516720 :         for ( j = 0; j < FOA_CHANNELS; j++ )
    1819             :         {
    1820  1139613376 :             tmpMtx[i][j] = 0.0f;
    1821  5698066880 :             for ( k = 0; k < FOA_CHANNELS; k++ )
    1822             :             {
    1823  4558453504 :                 tmpMtx[i][j] += mixMtx[i][k] * inCov[k][j];
    1824             :             }
    1825             :         }
    1826             :     }
    1827             : 
    1828             :     /* foaCov = inCov * mixMtx' */
    1829   356129180 :     for ( i = 0; i < FOA_CHANNELS; i++ )
    1830             :     {
    1831  1424516720 :         for ( j = 0; j < FOA_CHANNELS; j++ )
    1832             :         {
    1833  1139613376 :             foaCov[i][j] = 0.0f;
    1834  5698066880 :             for ( k = 0; k < FOA_CHANNELS; k++ )
    1835             :             {
    1836  4558453504 :                 foaCov[i][j] += tmpMtx[i][k] * mixMtx[j][k];
    1837             :             }
    1838             :         }
    1839             :     }
    1840             : 
    1841    71225836 :     return;
    1842             : }
    1843             : 
    1844      542703 : static void create_masa_ext_out_meta(
    1845             :     MASA_DECODER *hMasa,
    1846             :     IVAS_QMETADATA_HANDLE hQMetaData,
    1847             :     const int16_t nchan_transport )
    1848             : {
    1849             :     int16_t i, sf, b_old, b_new, dir;
    1850             :     MASA_DECRIPTIVE_META *descMeta;
    1851             :     int16_t *bandMap;
    1852             :     uint8_t numCodingBands;
    1853             :     uint8_t numDirections;
    1854             :     MASA_DECODER_EXT_OUT_META *extOutMeta;
    1855             : 
    1856      542703 :     numDirections = hMasa->config.numberOfDirections;
    1857      542703 :     numCodingBands = hMasa->config.numCodingBands;
    1858      542703 :     bandMap = hMasa->data.band_mapping;
    1859      542703 :     extOutMeta = hMasa->data.extOutMeta;
    1860      542703 :     descMeta = &hMasa->data.extOutMeta->descriptiveMeta;
    1861             : 
    1862             :     /* Construct descriptive meta */
    1863     4884327 :     for ( i = 0; i < 8; i++ )
    1864             :     {
    1865     4341624 :         descMeta->formatDescriptor[i] = ivasmasaFormatDescriptor[i];
    1866             :     }
    1867      542703 :     descMeta->numberOfDirections = numDirections - 1;
    1868      542703 :     descMeta->numberOfChannels = (uint8_t) ( nchan_transport - 1 );
    1869             :     /* Following correspond to "unknown" values until transmission is implemented */
    1870      542703 :     descMeta->sourceFormat = 0x0u;
    1871      542703 :     descMeta->transportDefinition = 0x0u;
    1872      542703 :     descMeta->channelAngle = 0x0u;
    1873      542703 :     descMeta->channelDistance = 0x0u;
    1874      542703 :     descMeta->channelLayout = 0x0u;
    1875             : 
    1876             :     /* Construct spatial metadata from qmetadata */
    1877     2713515 :     for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ )
    1878             :     {
    1879     4799572 :         for ( dir = 0; dir < numDirections; dir++ )
    1880             :         {
    1881             :             /* Spherical index */
    1882    32407360 :             for ( b_old = 0; b_old < numCodingBands; b_old++ )
    1883             :             {
    1884    92380972 :                 for ( b_new = bandMap[b_old]; b_new < bandMap[b_old + 1]; b_new++ )
    1885             :                 {
    1886    62602372 :                     extOutMeta->directionIndex[dir][sf][b_new] = hQMetaData->q_direction[dir].band_data[b_old].spherical_index[sf];
    1887             :                 }
    1888             :             }
    1889             : 
    1890             :             /* Direct-to-total ratio */
    1891    32407360 :             for ( b_old = 0; b_old < numCodingBands; b_old++ )
    1892             :             {
    1893    92380972 :                 for ( b_new = bandMap[b_old]; b_new < bandMap[b_old + 1]; b_new++ )
    1894             :                 {
    1895    62602372 :                     extOutMeta->directToTotalRatio[dir][sf][b_new] = (uint8_t) floorf( hQMetaData->q_direction[dir].band_data[b_old].energy_ratio[sf] * UINT8_MAX );
    1896             :                 }
    1897             :             }
    1898             : 
    1899             :             /* Spread coherence */
    1900     2628760 :             if ( hQMetaData->q_direction[dir].coherence_band_data != NULL )
    1901             :             {
    1902    28740808 :                 for ( b_old = 0; b_old < numCodingBands; b_old++ )
    1903             :                 {
    1904    75381896 :                     for ( b_new = bandMap[b_old]; b_new < bandMap[b_old + 1]; b_new++ )
    1905             :                     {
    1906    48677584 :                         extOutMeta->spreadCoherence[dir][sf][b_new] = hQMetaData->q_direction[dir].coherence_band_data[b_old].spread_coherence[sf];
    1907             :                     }
    1908             :                 }
    1909             :             }
    1910             :             else
    1911             :             {
    1912    14806600 :                 for ( i = 0; i < MASA_FREQUENCY_BANDS; i++ )
    1913             :                 {
    1914    14214336 :                     extOutMeta->spreadCoherence[dir][sf][i] = 0;
    1915             :                 }
    1916             :             }
    1917             :         }
    1918             : 
    1919             :         /* Fill second direction with zero energy data for EXT output */
    1920     2170812 :         if ( numDirections == 1 )
    1921             :         {
    1922    42821600 :             for ( i = 0; i < MASA_FREQUENCY_BANDS; i++ )
    1923             :             {
    1924    41108736 :                 extOutMeta->directionIndex[1][sf][i] = SPH_IDX_FRONT;
    1925             :             }
    1926             : 
    1927    42821600 :             for ( i = 0; i < MASA_FREQUENCY_BANDS; i++ )
    1928             :             {
    1929    41108736 :                 extOutMeta->directToTotalRatio[1][sf][i] = 0;
    1930             :             }
    1931             : 
    1932    42821600 :             for ( i = 0; i < MASA_FREQUENCY_BANDS; i++ )
    1933             :             {
    1934    41108736 :                 extOutMeta->spreadCoherence[1][sf][i] = 0;
    1935             :             }
    1936             :         }
    1937             : 
    1938             :         /* Common spatial meta */
    1939             :         /* Diffuse-to-total ratio = 1 - sum(direct-to-total ratios) */
    1940    26289208 :         for ( b_old = 0; b_old < numCodingBands; b_old++ )
    1941             :         {
    1942    75730016 :             for ( b_new = bandMap[b_old]; b_new < bandMap[b_old + 1]; b_new++ )
    1943             :             {
    1944    51611620 :                 extOutMeta->diffuseToTotalRatio[sf][b_new] = UINT8_MAX;
    1945   114213992 :                 for ( dir = 0; dir < numDirections; dir++ )
    1946             :                 {
    1947    62602372 :                     extOutMeta->diffuseToTotalRatio[sf][b_new] -= (uint8_t) floorf( hQMetaData->q_direction[dir].band_data[b_old].energy_ratio[sf] * UINT8_MAX );
    1948             :                 }
    1949             :             }
    1950             :         }
    1951             : 
    1952             :         /* Surround coherence */
    1953     2170812 :         if ( hQMetaData->surcoh_band_data != NULL )
    1954             :         {
    1955    22622656 :             for ( b_old = 0; b_old < numCodingBands; b_old++ )
    1956             :             {
    1957    58730940 :                 for ( b_new = bandMap[b_old]; b_new < bandMap[b_old + 1]; b_new++ )
    1958             :                 {
    1959    37686832 :                     extOutMeta->surroundCoherence[sf][b_new] = hQMetaData->surcoh_band_data[b_old].surround_coherence[sf];
    1960             :                 }
    1961             :             }
    1962             :         }
    1963             :         else
    1964             :         {
    1965    14806600 :             for ( i = 0; i < MASA_FREQUENCY_BANDS; i++ )
    1966             :             {
    1967    14214336 :                 extOutMeta->surroundCoherence[sf][i] = 0;
    1968             :             }
    1969             :         }
    1970             :     }
    1971             : 
    1972      542703 :     return;
    1973             : }
    1974             : 
    1975      422497 : static void decode_index_slice(
    1976             :     int16_t index,           /* i  : index to decode                        */
    1977             :     int16_t *ratio_idx_ism,  /* o  : decodec array of integers              */
    1978             :     const int16_t nchan_ism, /* i  : number of elements in array (objects)  */
    1979             :     const int16_t K          /* i  : sum of array elements                  */
    1980             : )
    1981             : {
    1982             :     int16_t i, j, sum, elem;
    1983             :     int16_t base[MAX_NUM_OBJECTS];
    1984             : 
    1985      422497 :     switch ( nchan_ism )
    1986             :     {
    1987       23563 :         case 2:
    1988       23563 :             ratio_idx_ism[0] = index;
    1989       23563 :             ratio_idx_ism[1] = K - ratio_idx_ism[0];
    1990       23563 :             break;
    1991      398934 :         case 3:
    1992             :         case 4:
    1993             :         {
    1994      398934 :             j = 0;
    1995    30959209 :             while ( index >= 0 )
    1996             :             {
    1997    30560275 :                 if ( valid_ratio_index( j, K, nchan_ism - 1 ) )
    1998             :                 {
    1999    10370154 :                     index--;
    2000             :                 }
    2001    30560275 :                 j++;
    2002             :             }
    2003      398934 :             j--;
    2004      398934 :             base[0] = 1;
    2005     1086161 :             for ( i = 1; i < nchan_ism - 1; i++ )
    2006             :             {
    2007      687227 :                 base[i] = base[i - 1] * 10;
    2008             :             }
    2009      398934 :             sum = 0;
    2010     1485095 :             for ( i = nchan_ism - 2; i >= 0; i-- )
    2011             :             {
    2012     1086161 :                 elem = j / base[i];
    2013     1086161 :                 ratio_idx_ism[nchan_ism - i - 2] = elem;
    2014     1086161 :                 sum += elem;
    2015     1086161 :                 j -= elem * base[i];
    2016             :             }
    2017      398934 :             ratio_idx_ism[nchan_ism - 1] = K - sum;
    2018             :         }
    2019             : 
    2020      398934 :         default:
    2021      398934 :             break;
    2022             :     }
    2023             : 
    2024      422497 :     return;
    2025             : }
    2026             : 
    2027             : 
    2028      676276 : static void read_ism_ratio_index(
    2029             :     int16_t ratio_ism_idx[MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS],         /* o  : ISM read ratio indexes                                        */
    2030             :     const int16_t nchan_ism,                                              /* i  : number of objects                                             */
    2031             :     const int16_t numCodingBands,                                         /* i  : number of subbands                                            */
    2032             :     const int16_t sf,                                                     /* i  : index of subframe                                             */
    2033             :     int16_t ratio_ism_idx_prev_sf[MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS], /* i  : previous subframe ISM ratio indexes                           */
    2034             :     uint16_t *bit_stream,                                                 /* i  : bitstream                                                     */
    2035             :     int16_t *next_bit_pos,                                                /* i/o: position in bitstream                                         */
    2036             :     float *masa_to_total_energy_ratio,                                    /* i  : masa to total ratios                                          */
    2037             :     const int16_t idx_sep_obj,                                            /* i  : index of separated index, -1 if none                          */
    2038             :     int16_t *num_zeros                                                    /* i/o: number of zero values in first subframe for separated object  */
    2039             : )
    2040             : {
    2041             :     int16_t b, i, b_signif;
    2042             :     int16_t index;
    2043             :     int16_t GR_order, differential_subframe;
    2044             :     int16_t buf;
    2045             :     int16_t no_levels_ratio_ism;
    2046             :     int16_t bits_index;
    2047             :     int16_t ratio_ism_idx_ref[MAX_NUM_OBJECTS];
    2048             :     int16_t idx_sep_obj_local, shift_one;
    2049             : 
    2050      676276 :     idx_sep_obj_local = idx_sep_obj;
    2051      676276 :     if ( idx_sep_obj > -1 )
    2052             :     {
    2053      676276 :         if ( idx_sep_obj == nchan_ism - 1 && nchan_ism > 2 )
    2054             :         {
    2055      175947 :             idx_sep_obj_local = 0;
    2056             :         }
    2057             :     }
    2058             : 
    2059      676276 :     b_signif = 0;
    2060      676276 :     no_levels_ratio_ism = ( ( 1 << PARAM_ISM_POW_RATIO_NBITS ) - 1 );
    2061     1756554 :     while ( ( b_signif < numCodingBands ) && ( masa_to_total_energy_ratio[b_signif] >= MASA2TOTAL_THR ) )
    2062             :     {
    2063             :         /* distribute evenly the objects */
    2064     1080278 :         distribute_evenly_ism( ratio_ism_idx[b_signif], no_levels_ratio_ism, nchan_ism );
    2065     1080278 :         b_signif++;
    2066             :     }
    2067             : 
    2068      676276 :     if ( b_signif == numCodingBands )
    2069             :     {
    2070      173972 :         return;
    2071             :     }
    2072             :     else
    2073             :     {
    2074             : 
    2075      502304 :         if ( sf == 0 )
    2076             :         {
    2077      171523 :             bits_index = bits_index_ism_ratio( nchan_ism );
    2078             : 
    2079             :             /* read coding type */
    2080      171523 :             if ( bit_stream[( *next_bit_pos )--] == 1 )
    2081             :             {
    2082             :                 /* independent coding*/
    2083      409592 :                 for ( b = 0; b < numCodingBands; b++ )
    2084             :                 {
    2085      345334 :                     if ( masa_to_total_energy_ratio[b] < MASA2TOTAL_THR )
    2086             :                     {
    2087      315232 :                         index = 0;
    2088     2428651 :                         for ( i = 0; i < bits_index; i++ )
    2089             :                         {
    2090     2113419 :                             index = ( index << 1 ) + bit_stream[( *next_bit_pos )--];
    2091             :                         }
    2092      315232 :                         decode_index_slice( index, ratio_ism_idx[b], nchan_ism, no_levels_ratio_ism );
    2093      315232 :                         if ( idx_sep_obj > -1 && ratio_ism_idx[b][idx_sep_obj_local] == 0 )
    2094             :                         {
    2095      287521 :                             ( *num_zeros )++;
    2096             :                         }
    2097             :                     }
    2098             :                     else
    2099             :                     {
    2100             :                         /* distribute evenly the objects */
    2101       30102 :                         distribute_evenly_ism( ratio_ism_idx[b], no_levels_ratio_ism, nchan_ism );
    2102             :                     }
    2103             :                 }
    2104             :             }
    2105             :             else
    2106             :             {
    2107             :                 /* differential coding */
    2108      107265 :                 index = 0;
    2109      746432 :                 for ( i = 0; i < bits_index; i++ )
    2110             :                 {
    2111      639167 :                     index = ( index << 1 ) + bit_stream[( *next_bit_pos )--];
    2112             :                 }
    2113      107265 :                 decode_index_slice( index, ratio_ism_idx[b_signif], nchan_ism, no_levels_ratio_ism );
    2114      107265 :                 if ( idx_sep_obj > -1 && ratio_ism_idx[b_signif][idx_sep_obj_local] == 0 )
    2115             :                 {
    2116       94795 :                     ( *num_zeros )++;
    2117             :                 }
    2118      107265 :                 mvs2s( ratio_ism_idx[b_signif], ratio_ism_idx_ref, nchan_ism );
    2119      781192 :                 for ( b = b_signif + 1; b < numCodingBands; b++ )
    2120             :                 {
    2121      673927 :                     if ( masa_to_total_energy_ratio[b] < MASA2TOTAL_THR )
    2122             :                     {
    2123      591529 :                         ratio_ism_idx[b][nchan_ism - 1] = no_levels_ratio_ism;
    2124     2009740 :                         for ( i = 0; i < nchan_ism - 1; i++ )
    2125             :                         {
    2126     1418211 :                             buf = ivas_qmetadata_DecodeExtendedGR( bit_stream, next_bit_pos, 100, 0 );
    2127     1418211 :                             if ( ( buf % 2 ) == 0 )
    2128             :                             {
    2129     1357013 :                                 ratio_ism_idx[b][i] = -( buf >> 1 );
    2130             :                             }
    2131             :                             else
    2132             :                             {
    2133       61198 :                                 ratio_ism_idx[b][i] = ( ( buf + 1 ) >> 1 );
    2134             :                             }
    2135     1418211 :                             ratio_ism_idx[b][i] = ratio_ism_idx[b][i] + ratio_ism_idx_ref[i];
    2136     1418211 :                             ratio_ism_idx[b][nchan_ism - 1] -= ratio_ism_idx[b][i];
    2137             :                         }
    2138      591529 :                         mvs2s( ratio_ism_idx[b], ratio_ism_idx_ref, nchan_ism );
    2139      591529 :                         if ( idx_sep_obj > -1 && ratio_ism_idx[b][idx_sep_obj_local] == 0 )
    2140             :                         {
    2141      519834 :                             ( *num_zeros )++;
    2142             :                         }
    2143             :                     }
    2144             :                     else
    2145             :                     {
    2146             :                         /* distribute evenly the objects */
    2147       82398 :                         distribute_evenly_ism( ratio_ism_idx[b], no_levels_ratio_ism, nchan_ism );
    2148             :                     }
    2149             :                 }
    2150             :             }
    2151             :         }
    2152             :         else
    2153             :         {
    2154      330781 :             if ( numCodingBands > 1 )
    2155             :             {
    2156             :                 /* read prediction type */
    2157      327477 :                 differential_subframe = bit_stream[( *next_bit_pos )--];
    2158             :             }
    2159             :             else
    2160             :             {
    2161        3304 :                 differential_subframe = 1;
    2162             :             }
    2163             : 
    2164      330781 :             if ( *num_zeros == numCodingBands )
    2165             :             {
    2166      228624 :                 shift_one = 1;
    2167             :             }
    2168             :             else
    2169             :             {
    2170      102157 :                 shift_one = 0;
    2171             :             }
    2172             : 
    2173      330781 :             if ( shift_one == 1 && nchan_ism == 2 )
    2174             :             {
    2175             :                 /* nothing has been sent ; values can be inferred */
    2176        6360 :                 for ( b = b_signif; b < numCodingBands; b++ )
    2177             :                 {
    2178        3180 :                     if ( masa_to_total_energy_ratio[b] < MASA2TOTAL_THR )
    2179             :                     {
    2180        3180 :                         if ( idx_sep_obj_local == 0 )
    2181             :                         {
    2182        2931 :                             ratio_ism_idx[b][0] = 0;
    2183        2931 :                             ratio_ism_idx[b][1] = 7;
    2184             :                         }
    2185             :                         else
    2186             :                         {
    2187         249 :                             ratio_ism_idx[b][0] = 7;
    2188         249 :                             ratio_ism_idx[b][1] = 0;
    2189             :                         }
    2190             :                     }
    2191             :                 }
    2192             :             }
    2193             :             else
    2194             :             {
    2195             :                 /* read GR order */
    2196      327601 :                 GR_order = bit_stream[( *next_bit_pos )--];
    2197     1930426 :                 for ( b = b_signif; b < numCodingBands; b++ )
    2198             :                 {
    2199     1602825 :                     if ( masa_to_total_energy_ratio[b] < MASA2TOTAL_THR )
    2200             :                     {
    2201     4344487 :                         for ( i = 0; i < nchan_ism - 1 - shift_one; i++ )
    2202             :                         {
    2203     2854156 :                             buf = ivas_qmetadata_DecodeExtendedGR( bit_stream, next_bit_pos, 100, GR_order );
    2204     2854156 :                             if ( ( buf % 2 ) == 0 )
    2205             :                             {
    2206     2439365 :                                 ratio_ism_idx[b][i] = -( buf >> 1 );
    2207             :                             }
    2208             :                             else
    2209             :                             {
    2210      414791 :                                 ratio_ism_idx[b][i] = ( ( buf + 1 ) >> 1 );
    2211             :                             }
    2212             :                         }
    2213             : 
    2214             :                         /* insert separated obj */
    2215     1490331 :                         if ( shift_one )
    2216             :                         {
    2217     3722546 :                             for ( i = nchan_ism - 1; i > idx_sep_obj_local; i-- )
    2218             :                             {
    2219     2620024 :                                 ratio_ism_idx[b][i] = ratio_ism_idx[b][i - 1];
    2220             :                             }
    2221     1102522 :                             ratio_ism_idx[b][idx_sep_obj_local] = 0; /* this is only difference; need to pdate later as well  */
    2222             :                         }
    2223             :                     }
    2224             :                 }
    2225      327601 :                 if ( differential_subframe )
    2226             :                 {
    2227             :                     /* differential to previous subframe */
    2228     1752690 :                     for ( b = b_signif; b < numCodingBands; b++ )
    2229             :                     {
    2230     1455171 :                         if ( masa_to_total_energy_ratio[b] < MASA2TOTAL_THR )
    2231             :                         {
    2232     1362932 :                             ratio_ism_idx[b][nchan_ism - 1] = no_levels_ratio_ism;
    2233     4985234 :                             for ( i = 0; i < nchan_ism - 1; i++ )
    2234             :                             {
    2235     3622302 :                                 ratio_ism_idx[b][i] = ratio_ism_idx[b][i] + ratio_ism_idx_prev_sf[b][i];
    2236     3622302 :                                 if ( shift_one && i == idx_sep_obj_local )
    2237             :                                 {
    2238     1059352 :                                     ratio_ism_idx[b][i] = 0;
    2239             :                                 }
    2240     3622302 :                                 ratio_ism_idx[b][nchan_ism - 1] -= ratio_ism_idx[b][i];
    2241             :                             }
    2242             :                         }
    2243             :                         else
    2244             :                         {
    2245             :                             /* distribute evenly the objects */
    2246       92239 :                             distribute_evenly_ism( ratio_ism_idx[b], no_levels_ratio_ism, nchan_ism );
    2247             :                         }
    2248             :                     }
    2249             :                 }
    2250             :                 else
    2251             :                 {
    2252             :                     /* difference to previous subband */
    2253       30082 :                     ratio_ism_idx[b_signif][nchan_ism - 1] = no_levels_ratio_ism;
    2254             : 
    2255             :                     /* first significant subband - differential to previous subframe */
    2256      109252 :                     for ( i = 0; i < nchan_ism - 1; i++ )
    2257             :                     {
    2258       79170 :                         ratio_ism_idx[b_signif][i] = ratio_ism_idx[b_signif][i] + ratio_ism_idx_prev_sf[b_signif][i];
    2259       79170 :                         if ( shift_one && i == idx_sep_obj_local )
    2260             :                         {
    2261        8993 :                             ratio_ism_idx[b_signif][i] = 0;
    2262             :                         }
    2263       79170 :                         ratio_ism_idx[b_signif][nchan_ism - 1] -= ratio_ism_idx[b_signif][i];
    2264             :                     }
    2265             : 
    2266             :                     /* rest of subbands differential to previous subband */
    2267       30082 :                     mvs2s( ratio_ism_idx[b_signif], ratio_ism_idx_ref, nchan_ism );
    2268      147654 :                     for ( b = b_signif + 1; b < numCodingBands; b++ )
    2269             :                     {
    2270      117572 :                         if ( masa_to_total_energy_ratio[b] < MASA2TOTAL_THR )
    2271             :                         {
    2272       97317 :                             ratio_ism_idx[b][nchan_ism - 1] = no_levels_ratio_ism;
    2273      352523 :                             for ( i = 0; i < nchan_ism - 1; i++ )
    2274             :                             {
    2275      255206 :                                 ratio_ism_idx[b][i] = ratio_ism_idx[b][i] + ratio_ism_idx_ref[i];
    2276      255206 :                                 if ( shift_one && i == idx_sep_obj_local )
    2277             :                                 {
    2278       34177 :                                     ratio_ism_idx[b][i] = 0;
    2279             :                                 }
    2280      255206 :                                 ratio_ism_idx[b][nchan_ism - 1] -= ratio_ism_idx[b][i];
    2281             :                             }
    2282       97317 :                             mvs2s( ratio_ism_idx[b], ratio_ism_idx_ref, nchan_ism );
    2283             :                         }
    2284             :                         else
    2285             :                         {
    2286             :                             /* distribute evenly the objects */
    2287       20255 :                             distribute_evenly_ism( ratio_ism_idx[b], no_levels_ratio_ism, nchan_ism );
    2288             :                         }
    2289             :                     }
    2290             :                 }
    2291             :             }
    2292             :         }
    2293             : 
    2294      502304 :         return;
    2295             :     }
    2296             : }
    2297             : 
    2298             : 
    2299      245050 : static void decode_ism_ratios(
    2300             :     uint16_t *bit_stream,                                                                /* i  : bitstream                      */
    2301             :     int16_t *next_bit_pos,                                                               /* i/o: position in bitstream          */
    2302             :     float masa_to_total_energy_ratio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i  : masa_to_total energy ratios    */
    2303             :     float ratio_ism[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS], /* o  : ISM ratios                     */
    2304             :     const int16_t n_ism,                                                                 /* i  : number of objects              */
    2305             :     const int16_t nbands,                                                                /* i  : number of subbands             */
    2306             :     const int16_t numSf,                                                                 /* i  : number of subframes            */
    2307             :     const int16_t idx_separated_object                                                   /* i  : index of separated object      */
    2308             : )
    2309             : {
    2310             :     int16_t sf, band;
    2311             :     int16_t ratio_ism_idx[MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS];
    2312             :     int16_t ratio_ism_idx_prev_sf[MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS];
    2313             :     float tmp;
    2314             :     int16_t num_zeros;
    2315      245050 :     num_zeros = 0;
    2316             : 
    2317             :     /* hQMetaData->q_direction->cfg.nblocks; */
    2318      921326 :     for ( sf = 0; sf < numSf; sf++ )
    2319             :     {
    2320             :         /* read ism ratio indexes */
    2321      676276 :         read_ism_ratio_index( ratio_ism_idx, n_ism, nbands, sf, ratio_ism_idx_prev_sf, bit_stream, next_bit_pos, masa_to_total_energy_ratio[sf], idx_separated_object, &num_zeros );
    2322             :         /* save previous subframe index values */
    2323      676276 :         if ( sf < numSf - 1 )
    2324             :         {
    2325     2565864 :             for ( band = 0; band < nbands; band++ )
    2326             :             {
    2327     2134638 :                 mvs2s( ratio_ism_idx[band], ratio_ism_idx_prev_sf[band], n_ism );
    2328             :             }
    2329             :         }
    2330             : 
    2331             :         /* reconstructed values */
    2332     4482810 :         for ( band = 0; band < nbands; band++ )
    2333             :         {
    2334     3806534 :             reconstruct_ism_ratios( ratio_ism_idx[band], n_ism, 1.0f / (float) ( ( 1 << PARAM_ISM_POW_RATIO_NBITS ) - 1 ), ratio_ism[sf][band] );
    2335             :         }
    2336             : 
    2337      676276 :         if ( ( n_ism > 2 ) && ( idx_separated_object == n_ism - 1 ) )
    2338             :         {
    2339             :             /* rotate */
    2340     1240559 :             for ( band = 0; band < nbands; band++ )
    2341             :             {
    2342     1064612 :                 if ( masa_to_total_energy_ratio[sf][band] < MASA2TOTAL_THR )
    2343             :                 {
    2344      539473 :                     tmp = ratio_ism[sf][band][n_ism - 1];
    2345      539473 :                     ratio_ism[sf][band][n_ism - 1] = ratio_ism[sf][band][0];
    2346      539473 :                     ratio_ism[sf][band][0] = tmp;
    2347             :                 }
    2348             :             }
    2349             :         }
    2350             : 
    2351      676276 :         if ( nbands == 1 )
    2352             :         {
    2353       35820 :             for ( band = 1; band < 5; band++ )
    2354             :             {
    2355       28656 :                 mvr2r( ratio_ism[sf][0], ratio_ism[sf][band], n_ism );
    2356             :             }
    2357             :         }
    2358             :     }
    2359             : 
    2360      245050 :     if ( numSf == 1 )
    2361             :     {
    2362      405232 :         for ( sf = 1; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ )
    2363             :         {
    2364     3184974 :             for ( band = 0; band < nbands; band++ )
    2365             :             {
    2366     2881050 :                 mvr2r( ratio_ism[0][band], ratio_ism[sf][band], n_ism );
    2367             :             }
    2368             :         }
    2369             :     }
    2370             : 
    2371      245050 :     return;
    2372             : }
    2373             : 
    2374             : 
    2375      245050 : static int16_t ivas_decode_masaism_metadata(
    2376             :     IVAS_QMETADATA_HANDLE hQMetaData,
    2377             :     MASA_DECODER_HANDLE hMasa,
    2378             :     MASA_ISM_DATA_HANDLE hMasaIsmData,
    2379             :     const int16_t nchan_ism,
    2380             :     uint16_t *bit_stream,
    2381             :     int16_t *next_bit_pos,
    2382             :     const int16_t idx_separated_object,
    2383             :     const int16_t ism_imp,
    2384             :     const int16_t dirac_bs_md_write_idx,
    2385             :     const int16_t dirac_md_buffer_length )
    2386             : {
    2387             :     int16_t sf, band, dir, nbands, nblocks, obj, i;
    2388             :     float energy_ratio_ism[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS];
    2389             :     int16_t *band_mapping;
    2390             :     int16_t b;
    2391             :     int16_t bits_ism[MAX_NUM_OBJECTS], index;
    2392             :     uint16_t idx_el, idx_az;
    2393             :     float azimuth, elevation;
    2394             :     int16_t nb_bits_read;
    2395             :     float delta_phi;
    2396             :     int16_t meta_write_index;
    2397             : 
    2398      245050 :     nb_bits_read = *next_bit_pos;
    2399      245050 :     nbands = hQMetaData->q_direction->cfg.nbands;
    2400      245050 :     nblocks = hQMetaData->q_direction->cfg.nblocks;
    2401             : 
    2402             :     /* Read MASA-to-total energy ratios */
    2403      245050 :     ivas_omasa_decode_masa_to_total( bit_stream, next_bit_pos, hMasaIsmData->masa_to_total_energy_ratio, nbands, nblocks );
    2404      245050 :     if ( nchan_ism > 1 )
    2405             :     {
    2406             :         /* read ISM ratios */
    2407      245050 :         decode_ism_ratios( bit_stream, next_bit_pos, hMasaIsmData->masa_to_total_energy_ratio, energy_ratio_ism, nchan_ism, nbands, nblocks, idx_separated_object );
    2408             :     }
    2409             :     else
    2410             :     {
    2411           0 :         for ( sf = 0; sf < nblocks; sf++ )
    2412             :         {
    2413           0 :             for ( band = 0; band < nbands; band++ )
    2414             :             {
    2415           0 :                 energy_ratio_ism[sf][band][0] = 1.0f;
    2416             :             }
    2417             :         }
    2418             :     }
    2419             : 
    2420             :     /* read ISM metadata */
    2421      245050 :     calculate_nbits_meta( nchan_ism, energy_ratio_ism, hMasaIsmData->masa_to_total_energy_ratio, nblocks, nbands, bits_ism, idx_separated_object, ism_imp );
    2422             : 
    2423     1067524 :     for ( obj = 0; obj < nchan_ism; obj++ )
    2424             :     {
    2425      822474 :         hMasaIsmData->bits_ism[obj] = bits_ism[obj];
    2426      822474 :         index = 0;
    2427      822474 :         if ( bits_ism[obj] < 8 ) /* if low resolution, can look to the past */
    2428             :         {
    2429             :             /* read if same as previous */
    2430      364371 :             if ( bit_stream[( *next_bit_pos )--] )
    2431             :             {
    2432       33010 :                 azimuth = hMasaIsmData->q_azimuth_old[obj];
    2433       33010 :                 elevation = hMasaIsmData->q_elevation_old[obj];
    2434             :             }
    2435             :             else
    2436             :             {
    2437     2148828 :                 for ( i = 0; i < bits_ism[obj]; i++ )
    2438             :                 {
    2439     1817467 :                     index = ( index << 1 ) + bit_stream[( *next_bit_pos )--];
    2440             :                 }
    2441      331361 :                 deindex_spherical_component( index, &azimuth, &elevation, &idx_az, &idx_el, bits_ism[obj], MC_LS_SETUP_INVALID );
    2442             : 
    2443      331361 :                 if ( azimuth * hMasaIsmData->q_azimuth_old[obj] > 0 )
    2444             :                 {
    2445      273099 :                     delta_phi = 180.0f / (float) ( no_phi_masa[bits_ism[obj] - 1][idx_el] ); /* 360/2*/
    2446             :                     /* this is equivalent to testing if 'azimuth - hMasaIsmData->q_azimuth_old[obj] > delta_phi' with limited precision */
    2447      273099 :                     if ( roundf( 100 * ( no_phi_masa[bits_ism[obj] - 1][idx_el] ) * ( azimuth - hMasaIsmData->q_azimuth_old[obj] ) ) / 100.0f > 180.0f )
    2448             :                     {
    2449       17700 :                         azimuth -= delta_phi;
    2450             :                     }
    2451             :                     else
    2452             :                     {
    2453             :                         /* this is equivalent to testing if 'hMasaIsmData->q_azimuth_old[obj] - azimuth > delta_phi' with limited precision */
    2454      255399 :                         if ( roundf( 100 * ( no_phi_masa[bits_ism[obj] - 1][idx_el] ) * ( hMasaIsmData->q_azimuth_old[obj] - azimuth ) ) / 100.0f > 180.0f )
    2455             :                         {
    2456       17431 :                             azimuth += delta_phi;
    2457             :                         }
    2458             :                     }
    2459             :                 }
    2460             : 
    2461      331361 :                 hMasaIsmData->q_azimuth_old[obj] = azimuth;
    2462      331361 :                 hMasaIsmData->q_elevation_old[obj] = elevation;
    2463             :             }
    2464             :         }
    2465             :         else
    2466             :         {
    2467     5200653 :             for ( i = 0; i < bits_ism[obj]; i++ )
    2468             :             {
    2469     4742550 :                 index = ( index << 1 ) + bit_stream[( *next_bit_pos )--];
    2470             :             }
    2471      458103 :             deindex_spherical_component( index, &azimuth, &elevation, &idx_az, &idx_el, bits_ism[obj], MC_LS_SETUP_INVALID );
    2472      458103 :             hMasaIsmData->q_azimuth_old[obj] = azimuth;
    2473      458103 :             hMasaIsmData->q_elevation_old[obj] = elevation;
    2474             :         }
    2475             : 
    2476     4112370 :         for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ )
    2477             :         {
    2478     3289896 :             meta_write_index = ( dirac_bs_md_write_idx + sf ) % dirac_md_buffer_length;
    2479     3289896 :             hMasaIsmData->azimuth_ism[obj][meta_write_index] = (int16_t) rint( azimuth );
    2480     3289896 :             hMasaIsmData->elevation_ism[obj][meta_write_index] = (int16_t) rint( elevation );
    2481             :         }
    2482             :     }
    2483             : 
    2484             :     /* Modify ISM metadata based on the MASA-to-total energy ratios */
    2485      921326 :     for ( sf = 0; sf < nblocks; sf++ )
    2486             :     {
    2487     4482810 :         for ( band = 0; band < nbands; band++ )
    2488             :         {
    2489    17249282 :             for ( dir = 0; dir < nchan_ism; dir++ )
    2490             :             {
    2491    13442748 :                 energy_ratio_ism[sf][band][dir] *= ( 1.0f - hMasaIsmData->masa_to_total_energy_ratio[sf][band] );
    2492             :             }
    2493             :         }
    2494             :     }
    2495             : 
    2496             :     /* Set data to struct in bins */
    2497      245050 :     band_mapping = hMasa->data.band_mapping;
    2498     1905198 :     for ( band = 0; band < hMasa->config.numCodingBands; ++band )
    2499             :     {
    2500    13892428 :         for ( b = MASA_band_grouping_24[band_mapping[band]]; b < MASA_band_grouping_24[band_mapping[band + 1]]; ++b )
    2501             :         {
    2502    61161400 :             for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; ++sf )
    2503             :             {
    2504    48929120 :                 if ( nblocks == 1 )
    2505             :                 {
    2506    21184320 :                     i = 0;
    2507             :                 }
    2508             :                 else
    2509             :                 {
    2510    27744800 :                     i = sf;
    2511             :                 }
    2512             : 
    2513    48929120 :                 meta_write_index = ( dirac_bs_md_write_idx + sf ) % dirac_md_buffer_length;
    2514             : 
    2515   214604480 :                 for ( dir = 0; dir < nchan_ism; dir++ )
    2516             :                 {
    2517   165675360 :                     hMasaIsmData->energy_ratio_ism[dir][meta_write_index][b] = energy_ratio_ism[i][band][dir];
    2518             :                 }
    2519             : 
    2520    48929120 :                 if ( hMasaIsmData->hExtData != NULL )
    2521             :                 {
    2522     1697280 :                     hMasaIsmData->hExtData->masa_render_masa_to_total[meta_write_index][b] = hMasaIsmData->masa_to_total_energy_ratio[i][band];
    2523             :                 }
    2524             :             }
    2525             :         }
    2526             :     }
    2527             : 
    2528      245050 :     return ( nb_bits_read - *next_bit_pos );
    2529             : }

Generated by: LCOV version 1.14