LCOV - code coverage report
Current view: top level - lib_dec - ivas_spar_md_dec_fx.c (source / functions) Hit Total Coverage
Test: Coverage on main -- dec/rend @ 633e3f2e309758d10805ef21e0436356fe719b7a Lines: 1349 1453 92.8 %
Date: 2025-08-23 01:22:27 Functions: 30 30 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 "prot_fx.h"
      37             : #include "ivas_rom_com.h"
      38             : #include <assert.h>
      39             : #include "wmc_auto.h"
      40             : #include "ivas_stat_dec.h"
      41             : #include "ivas_prot_fx.h"
      42             : #include "ivas_rom_com_fx.h"
      43             : 
      44             : /*------------------------------------------------------------------------------------------*
      45             :  * Local constants
      46             :  *------------------------------------------------------------------------------------------*/
      47             : #define DEG180_BY_PI_Q24 ( (Word32) 0x394BB835 ) /* 180.0/PI in Q24) */
      48             : 
      49             : #define IVAS_DEFAULT_DTX_CNG_RAMP ( 8 )
      50             : 
      51             : /* PLC constants */
      52             : static const Word16 ivas_spar_dec_plc_num_frames_keep = 9;
      53             : // static const Word16 ivas_spar_dec_plc_num_frames_fade_out = 9;
      54             : static const Word16 ivas_spar_dec_plc_per_frame_ramp_down_gain_dB = 3;
      55             : static const Word16 ivas_spar_dec_plc_max_num_frames_ramp_down = 33;
      56             : static const Word16 ivas_spar_dec_plc_spatial_target[IVAS_SPAR_MAX_CH] = { 1, 0, 0, 0, 0, 0, 0, 0 };
      57             : 
      58             : 
      59             : /*------------------------------------------------------------------------------------------*
      60             :  * Static functions declaration
      61             :  *------------------------------------------------------------------------------------------*/
      62             : 
      63             : static void ivas_get_spar_matrices_fx( ivas_spar_md_dec_state_t *hMdDec, const Word16 num_bands_out, const Word16 n_ts, const Word16 bw, const Word16 dtx_vad, const Word16 nB, const Word16 numch_out, const Word16 active_w_vlbr, const Word16 dyn_active_w_flag );
      64             : static void ivas_decode_arith_bs( ivas_spar_md_dec_state_t *hMdDec, Decoder_State *st, const UWord16 qsi, const Word16 nB, const Word16 bands_bw, Word16 *pDo_diff, const Word16 strat, const Word32 ivas_total_brate );
      65             : 
      66             : static void ivas_decode_huffman_bs( ivas_spar_md_dec_state_t *hMdDec, Decoder_State *st, const UWord16 qsi, const Word16 nB, const Word16 bands_bw );
      67             : 
      68             : static void ivas_fill_band_coeffs_idx( ivas_band_coeffs_ind_t *pBands_idx, const Word16 nB, Word16 *pSymbol_re, ivas_cell_dim_t *pCell_dims, ivas_coeffs_type_t coeff_type );
      69             : 
      70             : static void ivas_mat_col_rearrange_fx( Word32 in_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], const Word16 order[IVAS_SPAR_MAX_CH], const Word16 i_ts, Word32 ***mixer_mat, const Word16 bands, const Word16 num_ch );
      71             : 
      72             : static void ivas_spar_dec_compute_ramp_down_post_matrix_fx( ivas_spar_md_dec_state_t *hMdDec, const Word16 num_bands, const Word16 bfi, const Word16 num_md_sub_frames );
      73             : 
      74             : static void ivas_spar_md_fill_invalid_bands_fx( ivas_spar_dec_matrices_t *pSpar_coeffs, ivas_spar_dec_matrices_t *pSpar_coeffs_prev, const Word16 *valid_bands, Word16 *base_band_age, const Word16 num_bands, const Word16 num_channels, const Word16 num_md_sub_frames );
      75             : 
      76             : static void ivas_spar_md_fill_invalid_bandcoeffs( ivas_band_coeffs_t *pBand_coeffs, ivas_band_coeffs_t *pBand_coeffs_prev, const Word16 *valid_bands, Word16 *base_band_age, Word16 *first_valid_frame, const Word16 num_bands );
      77             : 
      78             : static ivas_error ivas_spar_set_dec_config( ivas_spar_md_dec_state_t *hMdDec, const Word16 nchan_transport, Word32 *pFC );
      79             : 
      80             : static void ivas_parse_parameter_bitstream_dtx( ivas_spar_md_t *pSpar_md, Decoder_State *st, const Word16 bw, const Word16 num_bands, Word16 *num_dmx_per_band, Word16 *num_dec_per_band );
      81             : 
      82             : static ivas_error ivas_deindex_real_index_fx( const Word16 *index, const Word16 q_levels, const Word32 min_value, const Word32 max_value, Word32 *quant, const Word16 num_ch_dim2 );
      83             : 
      84             : static void ivas_spar_dec_parse_md_bs_fx( ivas_spar_md_dec_state_t *hMdDec, Decoder_State *st, Word16 *nB, Word16 *bands_bw, Word16 *dtx_vad, const Word32 ivas_total_brate, const Word16 sba_inactive_mode );
      85             : 
      86             : 
      87        1597 : ivas_error ivas_spar_md_dec_matrix_open_fx(
      88             :     ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle       */
      89             :     const Word16 num_channels,        /* i  : number of internal channels  Q0*/
      90             :     const Word16 num_md_sub_frames    /* i  : number of MD subframes       Q0*/
      91             : )
      92             : {
      93             :     Word16 i, j;
      94             :     Word16 k;
      95        1597 :     IF( ( hMdDec->spar_md.band_coeffs = (ivas_band_coeffs_t *) malloc( i_mult( i_mult( IVAS_MAX_NUM_BANDS, num_md_sub_frames ), sizeof( ivas_band_coeffs_t ) ) ) ) == NULL )
      96             :     {
      97           0 :         return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for band_coeffs in SPAR MD" );
      98             :     }
      99        1597 :     IF( ( hMdDec->band_coeffs_prev = (ivas_band_coeffs_t *) malloc( IVAS_MAX_NUM_BANDS * sizeof( ivas_band_coeffs_t ) ) ) == NULL )
     100             :     {
     101           0 :         return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for band_coeffs in SPAR MD" );
     102             :     }
     103        1597 :     IF( ( hMdDec->mixer_mat_fx = (Word32 ***) malloc( i_mult( num_channels, sizeof( Word32 ** ) ) ) ) == NULL )
     104             :     {
     105           0 :         return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" );
     106             :     }
     107        9099 :     FOR( i = 0; i < num_channels; i++ )
     108             :     {
     109        7502 :         IF( ( hMdDec->mixer_mat_fx[i] = (Word32 **) malloc( i_mult( num_channels, sizeof( Word32 * ) ) ) ) == NULL )
     110             :         {
     111           0 :             return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" );
     112             :         }
     113       47846 :         FOR( j = 0; j < num_channels; j++ )
     114             :         {
     115       40344 :             IF( ( hMdDec->mixer_mat_fx[i][j] = (Word32 *) malloc( i_mult( i_mult( num_md_sub_frames, IVAS_MAX_NUM_BANDS ), sizeof( Word32 ) ) ) ) == NULL )
     116             :             {
     117           0 :                 return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" );
     118             :             }
     119             :         }
     120             :     }
     121             : 
     122        1597 :     IF( ( hMdDec->spar_coeffs.C_re_fx = (Word32 ***) malloc( i_mult( num_channels, sizeof( Word32 ** ) ) ) ) == NULL )
     123             :     {
     124           0 :         return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" );
     125             :     }
     126        9099 :     FOR( i = 0; i < num_channels; i++ )
     127             :     {
     128        7502 :         IF( ( hMdDec->spar_coeffs.C_re_fx[i] = (Word32 **) malloc( i_mult( num_channels, sizeof( Word32 * ) ) ) ) == NULL )
     129             :         {
     130           0 :             return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" );
     131             :         }
     132       47846 :         FOR( j = 0; j < num_channels; j++ )
     133             :         {
     134       40344 :             IF( ( hMdDec->spar_coeffs.C_re_fx[i][j] = (Word32 *) malloc( i_mult( i_mult( num_md_sub_frames, IVAS_MAX_NUM_BANDS ), sizeof( Word32 ) ) ) ) == NULL )
     135             :             {
     136           0 :                 return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" );
     137             :             }
     138             :         }
     139             :     }
     140             : 
     141        1597 :     IF( ( hMdDec->spar_coeffs.P_re_fx = (Word32 ***) malloc( i_mult( num_channels, sizeof( Word32 ** ) ) ) ) == NULL )
     142             :     {
     143           0 :         return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" );
     144             :     }
     145        9099 :     FOR( i = 0; i < num_channels; i++ )
     146             :     {
     147        7502 :         IF( ( hMdDec->spar_coeffs.P_re_fx[i] = (Word32 **) malloc( i_mult( num_channels, sizeof( Word32 * ) ) ) ) == NULL )
     148             :         {
     149           0 :             return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" );
     150             :         }
     151       47846 :         FOR( j = 0; j < num_channels; j++ )
     152             :         {
     153       40344 :             IF( ( hMdDec->spar_coeffs.P_re_fx[i][j] = (Word32 *) malloc( i_mult( num_md_sub_frames, IVAS_MAX_NUM_BANDS * sizeof( Word32 ) ) ) ) == NULL )
     154             :             {
     155           0 :                 return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" );
     156             :             }
     157             :         }
     158             :     }
     159             : 
     160        1597 :     IF( ( hMdDec->spar_coeffs_prev.C_re_fx = (Word32 ***) malloc( i_mult( num_channels, sizeof( Word32 ** ) ) ) ) == NULL )
     161             :     {
     162           0 :         return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" );
     163             :     }
     164        9099 :     FOR( i = 0; i < num_channels; i++ )
     165             :     {
     166        7502 :         IF( ( hMdDec->spar_coeffs_prev.C_re_fx[i] = (Word32 **) malloc( i_mult( num_channels, sizeof( Word32 * ) ) ) ) == NULL )
     167             :         {
     168           0 :             return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" );
     169             :         }
     170       47846 :         FOR( j = 0; j < num_channels; j++ )
     171             :         {
     172       40344 :             IF( ( hMdDec->spar_coeffs_prev.C_re_fx[i][j] = (Word32 *) malloc( IVAS_MAX_NUM_BANDS * sizeof( Word32 ) ) ) == NULL )
     173             :             {
     174           0 :                 return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" );
     175             :             }
     176             :         }
     177             :     }
     178             : 
     179        1597 :     IF( ( hMdDec->spar_coeffs_prev.P_re_fx = (Word32 ***) malloc( i_mult( num_channels, sizeof( Word32 ** ) ) ) ) == NULL )
     180             :     {
     181           0 :         return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" );
     182             :     }
     183        9099 :     FOR( i = 0; i < num_channels; i++ )
     184             :     {
     185        7502 :         IF( ( hMdDec->spar_coeffs_prev.P_re_fx[i] = (Word32 **) malloc( i_mult( num_channels, sizeof( Word32 * ) ) ) ) == NULL )
     186             :         {
     187           0 :             return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" );
     188             :         }
     189       47846 :         FOR( j = 0; j < num_channels; j++ )
     190             :         {
     191       40344 :             IF( ( hMdDec->spar_coeffs_prev.P_re_fx[i][j] = (Word32 *) malloc( IVAS_MAX_NUM_BANDS * sizeof( Word32 ) ) ) == NULL )
     192             :             {
     193           0 :                 return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" );
     194             :             }
     195             :         }
     196             :     }
     197        1597 :     IF( ( hMdDec->spar_coeffs_tar.C_re_fx = (Word32 ***) malloc( i_mult( num_channels, sizeof( Word32 ** ) ) ) ) == NULL )
     198             :     {
     199           0 :         return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" );
     200             :     }
     201        9099 :     FOR( i = 0; i < num_channels; i++ )
     202             :     {
     203        7502 :         IF( ( hMdDec->spar_coeffs_tar.C_re_fx[i] = (Word32 **) malloc( i_mult( num_channels, sizeof( Word32 * ) ) ) ) == NULL )
     204             :         {
     205           0 :             return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" );
     206             :         }
     207       47846 :         FOR( j = 0; j < num_channels; j++ )
     208             :         {
     209       40344 :             IF( ( hMdDec->spar_coeffs_tar.C_re_fx[i][j] = (Word32 *) malloc( IVAS_MAX_NUM_BANDS * sizeof( Word32 ) ) ) == NULL )
     210             :             {
     211           0 :                 return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" );
     212             :             }
     213             :         }
     214             :     }
     215        1597 :     IF( ( hMdDec->spar_coeffs_tar.P_re_fx = (Word32 ***) malloc( i_mult( num_channels, sizeof( Word32 ** ) ) ) ) == NULL )
     216             :     {
     217           0 :         return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" );
     218             :     }
     219        9099 :     FOR( i = 0; i < num_channels; i++ )
     220             :     {
     221        7502 :         IF( ( hMdDec->spar_coeffs_tar.P_re_fx[i] = (Word32 **) malloc( i_mult( num_channels, sizeof( Word32 * ) ) ) ) == NULL )
     222             :         {
     223           0 :             return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" );
     224             :         }
     225       47846 :         FOR( j = 0; j < num_channels; j++ )
     226             :         {
     227       40344 :             IF( ( hMdDec->spar_coeffs_tar.P_re_fx[i][j] = (Word32 *) malloc( IVAS_MAX_NUM_BANDS * sizeof( Word32 ) ) ) == NULL )
     228             :             {
     229           0 :                 return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" );
     230             :             }
     231             :         }
     232             :     }
     233             : 
     234        9099 :     FOR( i = 0; i < num_channels; i++ )
     235             :     {
     236       47846 :         FOR( j = 0; j < num_channels; j++ )
     237             :         {
     238      524472 :             FOR( k = 0; k < IVAS_MAX_NUM_BANDS; k++ )
     239             :             {
     240      484128 :                 hMdDec->spar_coeffs_prev.C_re_fx[i][j][k] = 0;
     241      484128 :                 move32();
     242      484128 :                 hMdDec->spar_coeffs_prev.P_re_fx[i][j][k] = 0;
     243      484128 :                 move32();
     244      484128 :                 hMdDec->spar_coeffs_tar.C_re_fx[i][j][k] = 0;
     245      484128 :                 move32();
     246      484128 :                 hMdDec->spar_coeffs_tar.P_re_fx[i][j][k] = 0;
     247      484128 :                 move32();
     248             :             }
     249             :         }
     250             :     }
     251             : 
     252        1597 :     return IVAS_ERR_OK;
     253             : }
     254             : 
     255             : /*-------------------------------------------------------------------------
     256             :  * ivas_get_spar_dec_md_num_subframes()
     257             :  *
     258             :  * return number of MD subframes
     259             :  *------------------------------------------------------------------------*/
     260             : 
     261             : /*! r: number of MD subframes */
     262     1501774 : Word16 ivas_get_spar_dec_md_num_subframes(
     263             :     const Word16 sba_order,             /* i  : Ambisonic (SBA) order        Q0*/
     264             :     const Word32 ivas_total_brate,      /* i  : IVAS total bitrate           Q0*/
     265             :     const Word32 ivas_last_active_brate /* i  : IVAS last active bitrate     Q0*/
     266             : )
     267             : {
     268             :     Word16 num_subframes;
     269             : 
     270     1501774 :     num_subframes = MAX_PARAM_SPATIAL_SUBFRAMES;
     271     1501774 :     move16();
     272     1501774 :     IF( GT_16( sba_order, SBA_FOA_ORDER ) )
     273             :     {
     274      324790 :         if ( GE_32( ivas_total_brate, IVAS_512k ) )
     275             :         {
     276       68402 :             num_subframes = 1;
     277       68402 :             move16();
     278             :         }
     279             :     }
     280             : 
     281     1501774 :     test();
     282     1501774 :     test();
     283     1501774 :     test();
     284     1501774 :     if ( ( LE_32( ivas_total_brate, IVAS_SID_5k2 ) && LT_32( ivas_last_active_brate, IVAS_24k4 ) ) || ( GT_32( ivas_total_brate, IVAS_SID_5k2 ) && LT_32( ivas_total_brate, IVAS_24k4 ) ) )
     285             :     {
     286      122732 :         num_subframes = 1;
     287      122732 :         move16();
     288             :     }
     289             : 
     290     1501774 :     return ( num_subframes ); /*Q0*/
     291             : }
     292             : 
     293             : 
     294             : /*-------------------------------------------------------------------------
     295             :  * ivas_spar_md_dec_open()
     296             :  *
     297             :  * Allocate and initialize SPAR MD decoder handle
     298             :  *------------------------------------------------------------------------*/
     299             : 
     300        1557 : ivas_error ivas_spar_md_dec_open(
     301             :     ivas_spar_md_dec_state_t **hMdDec_out,      /* i/o: SPAR MD decoder handle      */
     302             :     const DECODER_CONFIG_HANDLE hDecoderConfig, /* i  : configuration structure     */
     303             :     const Word16 num_channels,                  /* i  : number of internal channels Q0*/
     304             :     const Word16 sba_order,                     /* i  : SBA order                   Q0*/
     305             :     const Word16 sid_format,                    /* i  : SID format                  Q0*/
     306             :     const Word32 last_active_ivas_total_brate   /* i  : IVAS last active bitrate    Q0*/
     307             : )
     308             : {
     309             :     ivas_spar_md_dec_state_t *hMdDec;
     310             :     ivas_error error;
     311             :     Word16 num_md_sub_frames;
     312             : 
     313        1557 :     error = IVAS_ERR_OK;
     314        1557 :     move32();
     315             : 
     316        1557 :     IF( ( hMdDec = (ivas_spar_md_dec_state_t *) malloc( sizeof( ivas_spar_md_dec_state_t ) ) ) == NULL )
     317             :     {
     318           0 :         return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD decoder" );
     319             :     }
     320             : 
     321        1557 :     num_md_sub_frames = ivas_get_spar_dec_md_num_subframes( sba_order, hDecoderConfig->ivas_total_brate, last_active_ivas_total_brate ); /*Q0*/
     322             : 
     323        1557 :     IF( NE_32( ( error = ivas_spar_md_dec_matrix_open_fx( hMdDec, num_channels, num_md_sub_frames ) ), IVAS_ERR_OK ) )
     324             :     {
     325           0 :         return error;
     326             :     }
     327             : 
     328        1557 :     IF( EQ_32( hDecoderConfig->ivas_total_brate, IVAS_SID_5k2 ) )
     329             :     {
     330           0 :         IF( EQ_16( sid_format, SID_SBA_2TC ) )
     331             :         {
     332           0 :             hMdDec->table_idx = ivas_get_spar_table_idx_fx( IVAS_48k, sba_order, SPAR_CONFIG_BW, NULL, NULL ); /*Q0*/
     333           0 :             move16();
     334             :         }
     335             :         ELSE
     336             :         {
     337           0 :             hMdDec->table_idx = ivas_get_spar_table_idx_fx( IVAS_24k4, sba_order, SPAR_CONFIG_BW, NULL, NULL );
     338           0 :             move16();
     339             :         }
     340             :     }
     341             :     ELSE
     342             :     {
     343        1557 :         hMdDec->table_idx = ivas_get_spar_table_idx_fx( hDecoderConfig->ivas_total_brate, sba_order, SPAR_CONFIG_BW, NULL, NULL );
     344        1557 :         move16();
     345             :     }
     346             : 
     347        1557 :     IF( NE_32( ( error = ivas_spar_md_dec_init( hMdDec, hDecoderConfig, num_channels, sba_order ) ), IVAS_ERR_OK ) )
     348             :     {
     349           0 :         return error;
     350             :     }
     351             : 
     352        1557 :     *hMdDec_out = hMdDec;
     353             : 
     354        1557 :     return error;
     355             : }
     356             : 
     357             : 
     358             : /*-------------------------------------------------------------------------
     359             :  * ivas_spar_md_dec_matrix_close()
     360             :  *
     361             :  * Deallocate SPAR MD decoder matrices
     362             :  *------------------------------------------------------------------------*/
     363             : 
     364        1597 : void ivas_spar_md_dec_matrix_close_fx(
     365             :     ivas_spar_md_dec_state_t *hMdDecoder, /* i/o: SPAR MD decoder handle      */
     366             :     const Word16 num_channels             /* i  : number of internal channels Q0*/
     367             : )
     368             : {
     369             :     Word16 i, j;
     370             : 
     371        1597 :     IF( hMdDecoder->spar_md.band_coeffs != NULL )
     372             :     {
     373        1597 :         free( hMdDecoder->spar_md.band_coeffs );
     374        1597 :         hMdDecoder->spar_md.band_coeffs = NULL;
     375             :     }
     376        1597 :     IF( hMdDecoder->band_coeffs_prev != NULL )
     377             :     {
     378        1597 :         free( hMdDecoder->band_coeffs_prev );
     379        1597 :         hMdDecoder->band_coeffs_prev = NULL;
     380             :     }
     381             : 
     382        1597 :     IF( hMdDecoder->mixer_mat_fx != NULL )
     383             :     {
     384        9099 :         FOR( i = 0; i < num_channels; i++ )
     385             :         {
     386       47846 :             FOR( j = 0; j < num_channels; j++ )
     387             :             {
     388       40344 :                 free( hMdDecoder->mixer_mat_fx[i][j] );
     389             :             }
     390        7502 :             free( hMdDecoder->mixer_mat_fx[i] );
     391             :         }
     392        1597 :         free( hMdDecoder->mixer_mat_fx );
     393             :     }
     394        1597 :     IF( hMdDecoder->spar_coeffs.C_re_fx != NULL )
     395             :     {
     396        9099 :         FOR( i = 0; i < num_channels; i++ )
     397             :         {
     398       47846 :             FOR( j = 0; j < num_channels; j++ )
     399             :             {
     400       40344 :                 free( hMdDecoder->spar_coeffs.C_re_fx[i][j] );
     401             :             }
     402        7502 :             free( hMdDecoder->spar_coeffs.C_re_fx[i] );
     403             :         }
     404        1597 :         free( hMdDecoder->spar_coeffs.C_re_fx );
     405             :     }
     406        1597 :     IF( hMdDecoder->spar_coeffs.P_re_fx != NULL )
     407             :     {
     408        9099 :         FOR( i = 0; i < num_channels; i++ )
     409             :         {
     410       47846 :             FOR( j = 0; j < num_channels; j++ )
     411             :             {
     412       40344 :                 free( hMdDecoder->spar_coeffs.P_re_fx[i][j] );
     413             :             }
     414        7502 :             free( hMdDecoder->spar_coeffs.P_re_fx[i] );
     415             :         }
     416        1597 :         free( hMdDecoder->spar_coeffs.P_re_fx );
     417             :     }
     418             : 
     419        1597 :     IF( hMdDecoder->spar_coeffs_prev.C_re_fx != NULL )
     420             :     {
     421        9099 :         FOR( i = 0; i < num_channels; i++ )
     422             :         {
     423       47846 :             FOR( j = 0; j < num_channels; j++ )
     424             :             {
     425       40344 :                 free( hMdDecoder->spar_coeffs_prev.C_re_fx[i][j] );
     426             :             }
     427        7502 :             free( hMdDecoder->spar_coeffs_prev.C_re_fx[i] );
     428             :         }
     429        1597 :         free( hMdDecoder->spar_coeffs_prev.C_re_fx );
     430             :     }
     431             : 
     432        1597 :     IF( hMdDecoder->spar_coeffs_prev.P_re_fx != NULL )
     433             :     {
     434        9099 :         FOR( i = 0; i < num_channels; i++ )
     435             :         {
     436       47846 :             FOR( j = 0; j < num_channels; j++ )
     437             :             {
     438       40344 :                 free( hMdDecoder->spar_coeffs_prev.P_re_fx[i][j] );
     439             :             }
     440        7502 :             free( hMdDecoder->spar_coeffs_prev.P_re_fx[i] );
     441             :         }
     442        1597 :         free( hMdDecoder->spar_coeffs_prev.P_re_fx );
     443             :     }
     444             : 
     445        1597 :     IF( hMdDecoder->spar_coeffs_tar.C_re_fx != NULL )
     446             :     {
     447        9099 :         FOR( i = 0; i < num_channels; i++ )
     448             :         {
     449       47846 :             FOR( j = 0; j < num_channels; j++ )
     450             :             {
     451       40344 :                 free( hMdDecoder->spar_coeffs_tar.C_re_fx[i][j] );
     452             :             }
     453        7502 :             free( hMdDecoder->spar_coeffs_tar.C_re_fx[i] );
     454             :         }
     455        1597 :         free( hMdDecoder->spar_coeffs_tar.C_re_fx );
     456             :     }
     457        1597 :     IF( hMdDecoder->spar_coeffs_tar.P_re_fx != NULL )
     458             :     {
     459        9099 :         FOR( i = 0; i < num_channels; i++ )
     460             :         {
     461       47846 :             FOR( j = 0; j < num_channels; j++ )
     462             :             {
     463       40344 :                 free( hMdDecoder->spar_coeffs_tar.P_re_fx[i][j] );
     464             :             }
     465        7502 :             free( hMdDecoder->spar_coeffs_tar.P_re_fx[i] );
     466             :         }
     467        1597 :         free( hMdDecoder->spar_coeffs_tar.P_re_fx );
     468             :     }
     469             : 
     470        1597 :     return;
     471             : }
     472             : 
     473             : /*-------------------------------------------------------------------------
     474             :  * ivas_spar_md_dec_close()
     475             :  *
     476             :  * Deallocate SPAR MD decoder handle
     477             :  *------------------------------------------------------------------------*/
     478             : 
     479        1557 : void ivas_spar_md_dec_close(
     480             :     ivas_spar_md_dec_state_t **hMdDec /* i/o: SPAR MD decoder handle     */
     481             : )
     482             : {
     483             :     ivas_spar_md_dec_state_t *hMdDecoder;
     484             :     Word16 num_channels;
     485             : 
     486        1557 :     hMdDecoder = *hMdDec;
     487        1557 :     num_channels = hMdDecoder->spar_md_cfg.num_umx_chs;
     488        1557 :     move16();
     489             : 
     490        1557 :     ivas_spar_md_dec_matrix_close_fx( hMdDecoder, num_channels );
     491             : 
     492        1557 :     free( *hMdDec );
     493        1557 :     *hMdDec = NULL;
     494             : 
     495        1557 :     return;
     496             : }
     497             : 
     498             : Word32 pFC_8k[IVAS_MAX_NUM_BANDS] = { 33, 100, 166, 233, 300, 366, 433, 566, 866, 1333, 2033, 3233 };            /*Q0*/
     499             : Word32 pFC_12k[IVAS_MAX_NUM_BANDS] = { 53, 160, 266, 373, 480, 586, 693, 906, 1386, 2133, 3253, 5173 };          /*Q0*/
     500             : Word32 pFC_16k[IVAS_MAX_NUM_BANDS] = { 66, 200, 333, 466, 600, 733, 866, 1133, 1733, 2666, 4066, 6466 };         /*Q0*/
     501             : Word32 pFC_32k[IVAS_MAX_NUM_BANDS] = { 133, 400, 666, 933, 1200, 1466, 1733, 2266, 3466, 5333, 8133, 12933 };    /*Q0*/
     502             : Word32 pFC_48k[IVAS_MAX_NUM_BANDS] = { 199, 600, 1000, 1400, 1800, 2200, 2600, 3400, 5200, 8000, 12200, 19400 }; /*Q0*/
     503             : 
     504             : /*-----------------------------------------------------------------------------------------*
     505             :  * Function ivas_spar_md_dec_init()
     506             :  *
     507             :  * SPAR MD decoder initialization
     508             :  *-----------------------------------------------------------------------------------------*/
     509        1860 : ivas_error ivas_spar_md_dec_init(
     510             :     ivas_spar_md_dec_state_t *hMdDec,           /* i/o: SPAR MD decoder handle       */
     511             :     const DECODER_CONFIG_HANDLE hDecoderConfig, /* i  : configuration structure      */
     512             :     const Word16 num_channels,                  /* i  : number of internal channels  Q0*/
     513             :     const Word16 sba_order                      /* i  : SBA order                    Q0*/
     514             : )
     515             : {
     516             :     Word16 i, j;
     517             :     Word16 nchan_transport;
     518        1860 :     Word32 *pFC_fx = NULL, PR_minmax_fx[2];
     519             :     ivas_error error;
     520             : 
     521        1860 :     ivas_sba_get_spar_hoa_md_flag_fx( sba_order, hDecoderConfig->ivas_total_brate, &hMdDec->spar_hoa_md_flag, &hMdDec->spar_hoa_dirac2spar_md_flag );
     522             : 
     523        1860 :     ivas_sba_get_spar_hoa_ch_ind_fx( num_channels, hDecoderConfig->ivas_total_brate, hMdDec->HOA_md_ind );
     524             : 
     525        1860 :     IF( hMdDec->spar_hoa_md_flag )
     526             :     {
     527         240 :         hMdDec->spar_md.num_bands = IVAS_MAX_NUM_BANDS;
     528         240 :         move16();
     529             :     }
     530             :     ELSE
     531             :     {
     532        1620 :         hMdDec->spar_md.num_bands = s_min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND );
     533        1620 :         move16();
     534             :     }
     535             : 
     536        1860 :     ivas_spar_set_bitrate_config_fx( &hMdDec->spar_md_cfg, hMdDec->table_idx, hMdDec->spar_md.num_bands, hMdDec->spar_hoa_dirac2spar_md_flag, 0, 0, 0 );
     537             : 
     538        1860 :     nchan_transport = hMdDec->spar_md_cfg.nchan_transport;
     539        1860 :     move16();
     540             : 
     541        1860 :     IF( EQ_32( hDecoderConfig->output_Fs, 8000 ) )
     542             :     {
     543           0 :         pFC_fx = pFC_8k; /*Q0*/
     544             :     }
     545        1860 :     ELSE IF( EQ_32( hDecoderConfig->output_Fs, 12800 ) )
     546             :     {
     547           0 :         pFC_fx = pFC_12k; /*Q0*/
     548             :     }
     549        1860 :     ELSE IF( EQ_32( hDecoderConfig->output_Fs, 16000 ) )
     550             :     {
     551         132 :         pFC_fx = pFC_16k; /*Q0*/
     552             :     }
     553        1728 :     ELSE IF( EQ_32( hDecoderConfig->output_Fs, 32000 ) )
     554             :     {
     555         530 :         pFC_fx = pFC_32k; /*Q0*/
     556             :     }
     557        1198 :     ELSE IF( EQ_32( hDecoderConfig->output_Fs, 48000 ) )
     558             :     {
     559        1198 :         pFC_fx = pFC_48k; /*Q0*/
     560             :     }
     561             :     ELSE
     562             :     {
     563           0 :         assert( 0 ); // update sample rate
     564             :     }
     565             : 
     566        1860 :     IF( NE_32( ( error = ivas_spar_set_dec_config( hMdDec, nchan_transport, pFC_fx ) ), IVAS_ERR_OK ) )
     567             :     {
     568           0 :         return error;
     569             :     }
     570             : 
     571        1860 :     test();
     572        1860 :     test();
     573        1860 :     IF( NE_16( nchan_transport, 2 ) && ( EQ_16( hMdDec->spar_md_cfg.remix_unmix_order, 2 ) || EQ_16( hMdDec->spar_md_cfg.remix_unmix_order, 1 ) ) )
     574             :     {
     575           0 :         return IVAS_ERR_INTERNAL;
     576             :     }
     577             : 
     578             :     /* DTX quant init */
     579        1860 :     PR_minmax_fx[0] = hMdDec->spar_md_cfg.quant_strat[0].PR.min_fx; /*Q28*/
     580        1860 :     move32();
     581        1860 :     PR_minmax_fx[1] = hMdDec->spar_md_cfg.quant_strat[0].PR.max_fx; /*Q28*/
     582        1860 :     move32();
     583        1860 :     ivas_spar_quant_dtx_init_fx( &hMdDec->spar_md, PR_minmax_fx );
     584             : 
     585        1860 :     ivas_spar_arith_coeffs_com_init_fx( &hMdDec->arith_coeffs, &hMdDec->spar_md_cfg, hMdDec->table_idx, DEC );
     586        1860 :     ivas_spar_huff_coeffs_com_init_fx( &hMdDec->huff_coeffs, &hMdDec->spar_md_cfg, hMdDec->table_idx, DEC );
     587             : 
     588        1860 :     hMdDec->spar_md_cfg.prev_quant_idx = -1;
     589        1860 :     move16();
     590             : 
     591             :     /* initialize PLC state */
     592        1860 :     set16_fx( hMdDec->valid_bands, 0, IVAS_MAX_NUM_BANDS );
     593        1860 :     set16_fx( hMdDec->base_band_age, 0, IVAS_MAX_NUM_BANDS );
     594        1860 :     set16_fx( hMdDec->base_band_coeffs_age, 0, IVAS_MAX_NUM_BANDS );
     595        1860 :     hMdDec->spar_plc_num_lost_frames = 0;
     596        1860 :     move16();
     597        1860 :     hMdDec->spar_plc_enable_fadeout_flag = 1;
     598        1860 :     move16();
     599        1860 :     hMdDec->dtx_md_smoothing_cntr = 1;
     600        1860 :     move16();
     601             : 
     602        1860 :     ivas_clear_band_coeffs_fx( hMdDec->spar_md.band_coeffs, IVAS_MAX_NUM_BANDS );
     603        1860 :     ivas_clear_band_coeffs_fx( hMdDec->band_coeffs_prev, IVAS_MAX_NUM_BANDS );
     604             : 
     605        1860 :     ivas_clear_band_coeff_idx( hMdDec->spar_md.band_coeffs_idx, IVAS_MAX_NUM_BANDS );
     606        1860 :     ivas_clear_band_coeff_idx( hMdDec->spar_md_prev.band_coeffs_idx, IVAS_MAX_NUM_BANDS );
     607        1860 :     ivas_clear_band_coeff_idx( hMdDec->spar_md_prev.band_coeffs_idx_mapped, IVAS_MAX_NUM_BANDS );
     608             : 
     609        1860 :     hMdDec->spar_md.dtx_vad = 0;
     610        1860 :     move16();
     611        1860 :     hMdDec->td_decorr_flag = 1;
     612        1860 :     move16();
     613             : 
     614             : 
     615        1860 :     set32_fx( hMdDec->spar_md.en_ratio_slow_fx, 0, IVAS_MAX_NUM_BANDS );
     616        1860 :     set32_fx( hMdDec->spar_md.ref_pow_slow_fx, 0, IVAS_MAX_NUM_BANDS );
     617        1860 :     set16_fx( hMdDec->smooth_fac_fx, 0, IVAS_MAX_NUM_BANDS );
     618             : 
     619       24180 :     FOR( i = 0; i < IVAS_MAX_NUM_BANDS; i++ )
     620             :     {
     621       22320 :         set32_fx( hMdDec->smooth_buf_fx[i], 0, 2 * SBA_DIRAC_NRG_SMOOTH_LONG + 1 );
     622             :     }
     623             : 
     624       22320 :     FOR( i = 0; i < IVAS_SPAR_MAX_CH; i++ )
     625             :     {
     626      245520 :         FOR( j = 0; j < IVAS_SPAR_MAX_CH; j++ )
     627             :         {
     628      225060 :             set32_fx( hMdDec->mixer_mat_prev2_fx[i][j], 0, IVAS_MAX_NUM_BANDS );
     629             :         }
     630             :     }
     631        1860 :     hMdDec->first_valid_frame = 1;
     632        1860 :     move16();
     633             : 
     634        1860 :     return IVAS_ERR_OK;
     635             : }
     636             : 
     637             : 
     638             : /*-----------------------------------------------------------------------------------------*
     639             :  * Function ivas_spar_set_dec_config()
     640             :  *
     641             :  * Set configuration for SPAR MD decoder
     642             :  *-----------------------------------------------------------------------------------------*/
     643        1860 : static ivas_error ivas_spar_set_dec_config(
     644             :     ivas_spar_md_dec_state_t *hMdDec,
     645             :     const Word16 nchan_transport,
     646             :     Word32 *pFC /*Q0*/ )
     647             : {
     648             :     Word16 i, j, nchan, dmx_ch;
     649             : 
     650        6052 :     FOR( i = 0; i < nchan_transport; i++ )
     651             :     {
     652        4192 :         hMdDec->spar_md_cfg.max_freq_per_chan[i] = ivas_spar_br_table_consts[hMdDec->table_idx].fpcs; /*Q0*/
     653        4192 :         move16();
     654             :     }
     655             : 
     656        1860 :     nchan = ivas_sba_get_nchan_metadata_fx( ivas_spar_br_table_consts[hMdDec->table_idx].sba_order, ivas_spar_br_table_consts[hMdDec->table_idx].ivas_total_brate ); /*Q0*/
     657             : 
     658        1860 :     SWITCH( nchan )
     659             :     {
     660        1620 :         case 4: /* FOA_CHANNELS */
     661        1620 :             hMdDec->num_decorr = IVAS_TD_DECORR_OUT_3CH;
     662        1620 :             move16();
     663        1620 :             BREAK;
     664          17 :         case 9: /* IVAS_HOA_2_CH */
     665          17 :             hMdDec->num_decorr = IVAS_TD_DECORR_OUT_5CH;
     666          17 :             move16();
     667          17 :             BREAK;
     668          38 :         case 6: /* IVAS_HOA_2_CH */
     669          38 :             hMdDec->num_decorr = IVAS_TD_DECORR_OUT_2CH;
     670          38 :             move16();
     671          38 :             BREAK;
     672         114 :         case 8: /* IVAS_HOA_3_CH */
     673         114 :             hMdDec->num_decorr = IVAS_TD_DECORR_OUT_4CH;
     674         114 :             move16();
     675         114 :             BREAK;
     676             :     }
     677             : 
     678        1860 :     hMdDec->spar_md_cfg.num_umx_chs = nchan; /*Q0*/
     679        1860 :     move16();
     680             : 
     681        1860 :     dmx_ch = 0;
     682        1860 :     move16();
     683       24180 :     FOR( i = 0; i < IVAS_MAX_NUM_BANDS; i++ )
     684             :     {
     685       22320 :         dmx_ch = 0;
     686       22320 :         move16();
     687       72624 :         FOR( j = 0; j < nchan_transport; j++ )
     688             :         {
     689       50304 :             if ( LT_32( pFC[i], hMdDec->spar_md_cfg.max_freq_per_chan[j] ) )
     690             :             {
     691       50304 :                 dmx_ch = add( dmx_ch, 1 );
     692             :             }
     693             :         }
     694             : 
     695       22320 :         hMdDec->spar_md_cfg.num_dmx_chans_per_band[i] = hMdDec->spar_md_cfg.nchan_transport; /*Q0*/
     696       22320 :         move16();
     697       22320 :         hMdDec->spar_md_cfg.num_decorr_per_band[i] = sub( nchan, hMdDec->spar_md_cfg.nchan_transport ); /*Q0*/
     698       22320 :         move16();
     699             :     }
     700             : 
     701        1860 :     hMdDec->spar_md_cfg.nchan_transport = dmx_ch; /*Q0*/
     702        1860 :     move16();
     703             : 
     704        1860 :     return IVAS_ERR_OK;
     705             : }
     706             : 
     707             : 
     708             : /*-----------------------------------------------------------------------------------------*
     709             :  * Function ivas_dec_mono_sba_handling()
     710             :  *
     711             :  *
     712             :  *-----------------------------------------------------------------------------------------*/
     713             : 
     714      145833 : static void ivas_dec_mono_sba_handling_fx(
     715             :     Decoder_Struct *st_ivas /* i/o: IVAS decoder handle                                 */
     716             : )
     717             : {
     718             :     Word16 mono_flag, b, block;
     719             : 
     720      145833 :     mono_flag = 1;
     721      145833 :     move16();
     722             : 
     723      700647 :     FOR( b = 0; b < st_ivas->hQMetaData->q_direction[0].cfg.nbands; b++ )
     724             :     {
     725     2774070 :         FOR( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; ++block )
     726             :         {
     727     2219256 :             Word32 azimuth_fx = st_ivas->hQMetaData->q_direction[0].band_data[b].azimuth_fx[block]; /*Q22*/
     728     2219256 :             move32();
     729     2219256 :             Word32 elevation_fx = st_ivas->hQMetaData->q_direction[0].band_data[b].azimuth_fx[block]; /*Q22*/
     730     2219256 :             move32();
     731     2219256 :             Word32 energy_ratio_fx = st_ivas->hQMetaData->q_direction[0].band_data[0].energy_ratio_fx[block]; /*Q30*/
     732     2219256 :             move32();
     733             : 
     734     2219256 :             test();
     735     2219256 :             test();
     736     2219256 :             if (
     737      481065 :                 ( ( azimuth_fx != 0 ) ) ||
     738      481065 :                 ( ( elevation_fx != 0 ) ) ||
     739      481065 :                 ( GT_32( energy_ratio_fx, 161061274 /* 0.15f in Q30 */ ) ) ) /* 0.15f is just above the lowest quantised value. */
     740             :             {
     741     1932463 :                 mono_flag = 0;
     742     1932463 :                 move16();
     743             :             }
     744             :         }
     745             :     }
     746             : 
     747             :     /* Combine the SPAR prediction coefs flag with the azimuth, elevation and energy ratio flag.*/
     748      145833 :     test();
     749      145833 :     mono_flag = mono_flag && ivas_spar_chk_zero_coefs_fx( st_ivas );
     750             : 
     751      145833 :     IF( mono_flag )
     752             :     {
     753             :         /* Set Energy Ratio values to be zero */
     754          96 :         FOR( b = 0; b < st_ivas->hQMetaData->q_direction[0].cfg.nbands; b++ )
     755             :         {
     756          72 :             set32_fx( st_ivas->hQMetaData->q_direction[0].band_data[b].energy_ratio_fx, 0, MAX_PARAM_SPATIAL_SUBFRAMES );
     757             :         }
     758          24 :         IF( st_ivas->hDirAC != NULL )
     759             :         {
     760          21 :             FOR( block = 0; block < st_ivas->hSpatParamRendCom->dirac_md_buffer_length; ++block )
     761             :             {
     762             :                 /* Set directional Energy Ratio values to be zero */
     763          18 :                 set32_fx( st_ivas->hSpatParamRendCom->energy_ratio1_fx[block], 0, st_ivas->hSpatParamRendCom->num_freq_bands );
     764          18 :                 IF( EQ_32( st_ivas->hQMetaData->no_directions, 2 ) )
     765             :                 {
     766           0 :                     set32_fx( st_ivas->hSpatParamRendCom->energy_ratio2_fx[block], 0, st_ivas->hSpatParamRendCom->num_freq_bands );
     767             :                 }
     768             :                 /* Set Diffuseness values to be 1.0 */
     769          18 :                 set32_fx( st_ivas->hSpatParamRendCom->diffuseness_vector_fx[block], ONE_IN_Q30, st_ivas->hSpatParamRendCom->num_freq_bands ); /*Q30*/
     770             :             }
     771             :         }
     772             :     }
     773             : 
     774      145833 :     return;
     775             : }
     776             : 
     777             : 
     778             : /*-----------------------------------------------------------------------------------------*
     779             :  * Function ivas_spar_md_dec_process_fx()
     780             :  *
     781             :  * SPAR Meta Data decoder process
     782             :  *-----------------------------------------------------------------------------------------*/
     783             : 
     784      145833 : void ivas_spar_md_dec_process_fx(
     785             :     Decoder_Struct *st_ivas,    /* i/o: IVAS decoder handle                                */
     786             :     Decoder_State *st0,         /* i/o: decoder state structure - for bitstream handling   */
     787             :     const Word16 num_bands_out, /* i  : number of output bands                             Q0*/
     788             :     const Word16 sba_order      /* i  : Ambisonic (SBA) order                              Q0*/
     789             : )
     790             : {
     791             :     Word16 j, k, b, bw, dtx_vad, nB, i_ts;
     792             :     ivas_spar_md_dec_state_t *hMdDec;
     793             :     Word16 num_md_chs;
     794             :     Word16 num_md_sub_frames;
     795             :     Word16 dyn_active_w_flag;
     796             :     Word16 active_w_vlbr;
     797             : 
     798      145833 :     hMdDec = st_ivas->hSpar->hMdDec;
     799             : 
     800      145833 :     IF( LT_32( st_ivas->hDecoderConfig->ivas_total_brate, IVAS_24k4 ) )
     801             :     {
     802       11461 :         active_w_vlbr = 1;
     803       11461 :         move16();
     804             :     }
     805             :     ELSE
     806             :     {
     807      134372 :         active_w_vlbr = 0;
     808      134372 :         move16();
     809             :     }
     810             : 
     811      145833 :     num_md_chs = ivas_sba_get_nchan_metadata_fx( sba_order, st_ivas->hDecoderConfig->ivas_total_brate ); /*Q0*/
     812             : 
     813      145833 :     num_md_sub_frames = ivas_get_spar_dec_md_num_subframes( sba_order, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->last_active_ivas_total_brate ); /*Q0*/
     814             : 
     815      145833 :     test();
     816      145833 :     IF( GT_16( hMdDec->spar_md_cfg.nchan_transport, 1 ) && LE_16( hMdDec->spar_md_cfg.nchan_transport, 3 ) )
     817             :     {
     818       68734 :         hMdDec->spar_md.res_ind = 0;
     819       68734 :         move16();
     820       68734 :         dyn_active_w_flag = get_next_indice_fx( st0, 1 ); /*Q0*/
     821       68734 :         IF( EQ_16( dyn_active_w_flag, 1 ) )
     822             :         {
     823           0 :             IF( EQ_16( hMdDec->spar_md_cfg.nchan_transport, 2 ) )
     824             :             {
     825           0 :                 hMdDec->spar_md.res_ind = get_next_indice_fx( st0, 1 ); /*Q0*/
     826           0 :                 move16();
     827           0 :                 hMdDec->spar_md.res_ind = add( hMdDec->spar_md_cfg.nchan_transport, hMdDec->spar_md.res_ind ); /*Q0*/
     828           0 :                 move16();
     829             :             }
     830           0 :             ELSE IF( EQ_16( hMdDec->spar_md_cfg.nchan_transport, 3 ) )
     831             :             {
     832           0 :                 hMdDec->spar_md.res_ind = remix_order_set[hMdDec->spar_md_cfg.remix_unmix_order][hMdDec->spar_md_cfg.nchan_transport]; /*Q0*/
     833           0 :                 move16();
     834             :             }
     835             :         }
     836             :     }
     837             :     ELSE
     838             :     {
     839       77099 :         dyn_active_w_flag = 0;
     840       77099 :         move16();
     841       77099 :         IF( EQ_16( hMdDec->spar_md_cfg.nchan_transport, FOA_CHANNELS ) )
     842             :         {
     843       39194 :             get_next_indice_fx( st0, 1 );
     844             :         }
     845             :     }
     846             : 
     847      145833 :     ivas_spar_dec_parse_md_bs_fx( hMdDec, st0, &nB, &bw, &dtx_vad, st_ivas->hDecoderConfig->ivas_total_brate,
     848      145833 :                                   st_ivas->hQMetaData->sba_inactive_mode );
     849             : 
     850      145833 :     assert( nB == hMdDec->spar_md.num_bands );
     851      145833 :     assert( bw == 1 );
     852      145833 :     ivas_spar_md_fill_invalid_bandcoeffs(
     853             :         hMdDec->spar_md.band_coeffs,
     854             :         hMdDec->band_coeffs_prev,
     855      145833 :         &hMdDec->valid_bands[0],
     856             :         &hMdDec->base_band_coeffs_age[0],
     857             :         &hMdDec->first_valid_frame,
     858             :         nB );
     859             : 
     860      145833 :     ivas_dec_mono_sba_handling_fx( st_ivas );
     861             : 
     862             :     /* SPAR to DirAC conversion */
     863      145833 :     IF( EQ_16( hMdDec->spar_hoa_dirac2spar_md_flag, 1 ) )
     864             :     {
     865      135969 :         ivas_spar_to_dirac_fx( st_ivas, hMdDec, dtx_vad, num_bands_out, bw, dyn_active_w_flag );
     866             :     }
     867             : 
     868             :     /* set correct number of bands*/
     869      145833 :     nB = IVAS_MAX_NUM_BANDS;
     870      145833 :     move16();
     871             : 
     872             :     /* expand DirAC MD to all time slots */
     873      520293 :     FOR( i_ts = 1; i_ts < num_md_sub_frames; i_ts++ )
     874             :     {
     875     3501528 :         FOR( b = 0; b < hMdDec->spar_md.num_bands; b++ )
     876             :         {
     877    34397748 :             FOR( j = 0; j < IVAS_SPAR_MAX_CH - 1; j++ )
     878             :             {
     879    31270680 :                 hMdDec->spar_md.band_coeffs[( b + ( i_ts * IVAS_MAX_NUM_BANDS ) )].pred_re_fx[j] = hMdDec->spar_md.band_coeffs[b].pred_re_fx[j]; /*Q22*/
     880    31270680 :                 move32();
     881             :             }
     882             : 
     883    25016544 :             FOR( j = 0; j < IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS; j++ )
     884             :             {
     885    87557904 :                 FOR( k = 0; k < IVAS_SPAR_MAX_DMX_CHS - 1; k++ )
     886             :                 {
     887    65668428 :                     hMdDec->spar_md.band_coeffs[( b + ( i_ts * IVAS_MAX_NUM_BANDS ) )].C_re_fx[j][k] = hMdDec->spar_md.band_coeffs[b].C_re_fx[j][k]; /*Q22*/
     888    65668428 :                     move32();
     889             :                 }
     890             :             }
     891             : 
     892    34397748 :             FOR( j = 0; j < IVAS_SPAR_MAX_CH - 1; j++ )
     893             :             {
     894    31270680 :                 hMdDec->spar_md.band_coeffs[add( b, i_mult( i_ts, IVAS_MAX_NUM_BANDS ) )].P_re_fx[j] = hMdDec->spar_md.band_coeffs[b].P_re_fx[j]; /*Q22*/
     895    31270680 :                 move32();
     896             :             }
     897             :         }
     898             :     }
     899             : 
     900      145833 :     ivas_get_spar_matrices_fx( hMdDec, num_bands_out, num_md_sub_frames, bw, dtx_vad, nB, num_md_chs, active_w_vlbr, dyn_active_w_flag );
     901             : 
     902             : #ifdef DEBUG_SPAR_DIRAC_WRITE_OUT_PRED_PARS
     903             :     {
     904             :         static FILE *fid = 0;
     905             :         int16_t band = 9;
     906             :         if ( !fid )
     907             :         {
     908             :             fid = fopen( "pred_coeffs_dec.txt", "wt" );
     909             :         }
     910             :         fprintf( fid, "%.6f\n", hMdDec->mixer_mat[1][0][band] );
     911             :     }
     912             : #endif
     913      145833 :     ivas_spar_md_fill_invalid_bands_fx( &hMdDec->spar_coeffs, &hMdDec->spar_coeffs_prev, &hMdDec->valid_bands[0], &hMdDec->base_band_age[0], num_bands_out, num_md_chs, num_md_sub_frames );
     914             : 
     915             : 
     916      145833 :     hMdDec->dtx_md_smoothing_cntr = 1;
     917      145833 :     move16();
     918             : 
     919      145833 :     return;
     920             : }
     921             : 
     922             : 
     923         740 : Word16 ivas_spar_chk_zero_coefs_fx(
     924             :     Decoder_Struct *st_ivas /* i/o: IVAS decoder handle        */
     925             : )
     926             : {
     927             :     Word16 j, k, b;
     928             :     ivas_spar_md_dec_state_t *hMdDec;
     929         740 :     Word16 mono = 1;
     930         740 :     move16();
     931             :     Word16 ndec, ndm;
     932             : 
     933         740 :     hMdDec = st_ivas->hSpar->hMdDec;
     934         740 :     ndec = hMdDec->spar_md_cfg.num_decorr_per_band[0]; /*Q0*/
     935         740 :     move16();
     936         740 :     ndm = hMdDec->spar_md_cfg.num_dmx_chans_per_band[0]; /*Q0*/
     937         740 :     move16();
     938             : 
     939         740 :     Word16 min_bands = s_min( hMdDec->spar_md.num_bands, SPAR_DIRAC_SPLIT_START_BAND );
     940        6660 :     FOR( b = 0; b < min_bands; b++ )
     941             :     {
     942       23760 :         FOR( j = 0; j < ( ( ndm + ndec ) - 1 ); j++ )
     943             :         {
     944       17840 :             if ( hMdDec->spar_md.band_coeffs[b].pred_re_fx[j] != 0 )
     945             :             {
     946        9494 :                 mono = 0;
     947        9494 :                 move16();
     948             :             }
     949             :         }
     950       22208 :         FOR( j = 0; j < ndec; j++ )
     951             :         {
     952       18368 :             FOR( k = 0; k < ( ndm - 1 ); k++ )
     953             :             {
     954        2080 :                 if ( hMdDec->spar_md.band_coeffs[b].C_re_fx[j][k] != 0 )
     955             :                 {
     956         716 :                     mono = 0;
     957         716 :                     move16();
     958             :                 }
     959             :             }
     960             :         }
     961       22208 :         FOR( j = 0; j < ndec; j++ )
     962             :         {
     963       16288 :             if ( hMdDec->spar_md.band_coeffs[b].P_re_fx[j] != 0 )
     964             :             {
     965       15099 :                 mono = 0;
     966       15099 :                 move16();
     967             :             }
     968             :         }
     969             :     }
     970             : 
     971         740 :     return mono;
     972             : }
     973             : 
     974             : 
     975             : /*-----------------------------------------------------------------------------------------*
     976             :  * Function ivas_spar_smooth_md_dtx()
     977             :  *
     978             :  * Smooth MD during no data frame during DTX
     979             :  *-----------------------------------------------------------------------------------------*/
     980             : 
     981        2189 : void ivas_spar_smooth_md_dtx_fx(
     982             :     ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle        */
     983             :     const Word16 num_bands_out,       /* i  : number of output bands        Q0*/
     984             :     const Word16 num_md_sub_frames    /* i  : number of metadata subframes  Q0*/
     985             : )
     986             : {
     987             :     Word16 j, k, b, dmx_ch;
     988             :     Word16 ramp_fx;
     989             :     Word32 tar_fx, prev_fx, new_val_fx;
     990             : 
     991             :     /* ramp = (float)hMdDec->dtx_md_smoothing_cntr / IVAS_DEFAULT_DTX_CNG_RAMP; */
     992        2189 :     ramp_fx = i_mult_sat( hMdDec->dtx_md_smoothing_cntr, 4096 /* 1 / IVAS_DEFAULT_DTX_CNG_RAMP in Q15 */ ); /* Q15 */
     993             : 
     994       28457 :     FOR( b = 0; b < num_bands_out; b++ )
     995             :     {
     996       26268 :         dmx_ch = hMdDec->spar_md_cfg.num_dmx_chans_per_band[b];
     997       26268 :         move16();
     998             : 
     999      105072 :         FOR( j = 1; j < FOA_CHANNELS; j++ )
    1000             :         {
    1001      276948 :             FOR( k = dmx_ch; k < FOA_CHANNELS; k++ )
    1002             :             {
    1003      198144 :                 prev_fx = hMdDec->spar_coeffs_prev.P_re_fx[j][k][b]; /* Q22 */
    1004      198144 :                 move32();
    1005      198144 :                 tar_fx = hMdDec->spar_coeffs_tar.P_re_fx[j][k][b]; /* Q22 */
    1006      198144 :                 move32();
    1007      198144 :                 new_val_fx = L_add( prev_fx, Mpy_32_16_1( L_sub( tar_fx, prev_fx ), ramp_fx ) ); /* Q22 + Q15 - Q15 = Q22*/
    1008      198144 :                 hMdDec->spar_coeffs.P_re_fx[j][k][b] = new_val_fx;                               /* Q22 */
    1009      198144 :                 move32();
    1010             :             }
    1011             :         }
    1012             : 
    1013      131340 :         FOR( j = 0; j < FOA_CHANNELS; j++ )
    1014             :         {
    1015      261168 :             FOR( k = 0; k < dmx_ch; k++ )
    1016             :             {
    1017      156096 :                 prev_fx = hMdDec->spar_coeffs_prev.C_re_fx[j][k][b]; /* Q22 */
    1018      156096 :                 move32();
    1019      156096 :                 tar_fx = hMdDec->spar_coeffs_tar.C_re_fx[j][k][b]; /* Q22 */
    1020      156096 :                 move32();
    1021      156096 :                 new_val_fx = L_add( prev_fx, Mpy_32_16_1( L_sub( tar_fx, prev_fx ), ramp_fx ) ); /* Q22 + Q15 - Q15 = Q22*/
    1022      156096 :                 hMdDec->spar_coeffs.C_re_fx[j][k][b] = new_val_fx;                               /* Q22 */
    1023      156096 :                 move32();
    1024             :             }
    1025             :         }
    1026             :     }
    1027             : 
    1028             :     /* expand MD to all time slots */
    1029        8519 :     FOR( Word16 i_ts = 1; i_ts < num_md_sub_frames; i_ts++ )
    1030             :     {
    1031       82290 :         FOR( b = 0; b < num_bands_out; b++ )
    1032             :         {
    1033       75960 :             dmx_ch = hMdDec->spar_md_cfg.num_dmx_chans_per_band[b]; /*Q0*/
    1034       75960 :             move16();
    1035             : 
    1036      303840 :             FOR( j = 1; j < FOA_CHANNELS; j++ )
    1037             :             {
    1038      796716 :                 FOR( k = dmx_ch; k < FOA_CHANNELS; k++ )
    1039             :                 {
    1040      568836 :                     hMdDec->spar_coeffs.P_re_fx[j][k][( b + ( i_ts * IVAS_MAX_NUM_BANDS ) )] = hMdDec->spar_coeffs.P_re_fx[j][k][b]; /* Q22 */
    1041      568836 :                     move32();
    1042             :                 }
    1043             :             }
    1044             : 
    1045      379800 :             FOR( j = 0; j < FOA_CHANNELS; j++ )
    1046             :             {
    1047      760752 :                 FOR( k = 0; k < dmx_ch; k++ )
    1048             :                 {
    1049      456912 :                     hMdDec->spar_coeffs.C_re_fx[j][k][( b + ( i_ts * IVAS_MAX_NUM_BANDS ) )] = hMdDec->spar_coeffs.C_re_fx[j][k][b]; /* Q22 */
    1050      456912 :                     move32();
    1051             :                 }
    1052             :             }
    1053             :         }
    1054             :     }
    1055             : 
    1056        2189 :     hMdDec->dtx_md_smoothing_cntr = s_min( add( hMdDec->dtx_md_smoothing_cntr, 1 ), IVAS_DEFAULT_DTX_CNG_RAMP );
    1057        2189 :     move16();
    1058             : 
    1059        2189 :     return;
    1060             : }
    1061             : 
    1062             : 
    1063             : /*-----------------------------------------------------------------------------------------*
    1064             :  * Function ivas_spar_setup_md_smoothing()
    1065             :  *
    1066             :  * Set up smoothing of SPAR MD when SID update frame is received
    1067             :  *-----------------------------------------------------------------------------------------*/
    1068             : 
    1069         125 : void ivas_spar_setup_md_smoothing_fx(
    1070             :     ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle        */
    1071             :     const Word16 num_bands_out,       /* i  : number of output bands        Q0*/
    1072             :     const Word16 num_md_sub_frames    /* i  : number of metadata subframes  Q0*/
    1073             : )
    1074             : {
    1075             :     /* copy the coeffs */
    1076             :     Word16 num_channels, i, j, k;
    1077             : 
    1078         125 :     num_channels = hMdDec->spar_md_cfg.num_umx_chs; /*Q0*/
    1079         125 :     move16();
    1080             : 
    1081         625 :     FOR( i = 0; i < num_channels; i++ )
    1082             :     {
    1083        2500 :         FOR( j = 0; j < num_channels; j++ )
    1084             :         {
    1085       26000 :             FOR( k = 0; k < IVAS_MAX_NUM_BANDS; k++ )
    1086             :             {
    1087       24000 :                 hMdDec->spar_coeffs_prev.C_re_fx[i][j][k] = hMdDec->spar_coeffs_tar.C_re_fx[i][j][k]; /* Q22 */
    1088       24000 :                 move32();
    1089             :             }
    1090             :         }
    1091             :     }
    1092             : 
    1093         625 :     FOR( i = 0; i < num_channels; i++ )
    1094             :     {
    1095        2500 :         FOR( j = 0; j < num_channels; j++ )
    1096             :         {
    1097       26000 :             FOR( k = 0; k < IVAS_MAX_NUM_BANDS; k++ )
    1098             :             {
    1099       24000 :                 hMdDec->spar_coeffs_prev.P_re_fx[i][j][k] = hMdDec->spar_coeffs_tar.P_re_fx[i][j][k]; /* Q22 */
    1100       24000 :                 move32();
    1101             :             }
    1102             :         }
    1103             :     }
    1104             : 
    1105         625 :     FOR( i = 0; i < num_channels; i++ )
    1106             :     {
    1107        2500 :         FOR( j = 0; j < num_channels; j++ )
    1108             :         {
    1109       26000 :             FOR( k = 0; k < IVAS_MAX_NUM_BANDS; k++ )
    1110             :             {
    1111       24000 :                 hMdDec->spar_coeffs_tar.C_re_fx[i][j][k] = hMdDec->spar_coeffs.C_re_fx[i][j][k]; /* Q22 */
    1112       24000 :                 move32();
    1113             :             }
    1114             :         }
    1115             :     }
    1116             : 
    1117         625 :     FOR( i = 0; i < num_channels; i++ )
    1118             :     {
    1119        2500 :         FOR( j = 0; j < num_channels; j++ )
    1120             :         {
    1121       26000 :             FOR( k = 0; k < IVAS_MAX_NUM_BANDS; k++ )
    1122             :             {
    1123       24000 :                 hMdDec->spar_coeffs_tar.P_re_fx[i][j][k] = hMdDec->spar_coeffs.P_re_fx[i][j][k]; /* Q22 */
    1124       24000 :                 move32();
    1125             :             }
    1126             :         }
    1127             :     }
    1128             : 
    1129         125 :     ivas_spar_smooth_md_dtx_fx( hMdDec, num_bands_out, num_md_sub_frames );
    1130             : 
    1131         125 :     return;
    1132             : }
    1133             : 
    1134             : 
    1135             : /*-----------------------------------------------------------------------------------------*
    1136             :  * Function ivas_spar_update_md_hist()
    1137             :  *
    1138             :  * Update previous and target MD
    1139             :  *-----------------------------------------------------------------------------------------*/
    1140             : 
    1141      145708 : void ivas_spar_update_md_hist_fx(
    1142             :     ivas_spar_md_dec_state_t *hMdDec /* i/o: SPAR MD decoder handle */
    1143             : )
    1144             : {
    1145             :     Word16 num_channels, i, j, k;
    1146             : 
    1147      145708 :     num_channels = hMdDec->spar_md_cfg.num_umx_chs; /*Q0*/
    1148      145708 :     move16();
    1149             : 
    1150      826040 :     FOR( i = 0; i < num_channels; i++ )
    1151             :     {
    1152     4331848 :         FOR( j = 0; j < num_channels; j++ )
    1153             :         {
    1154    47469708 :             FOR( k = 0; k < IVAS_MAX_NUM_BANDS; k++ )
    1155             :             {
    1156    43818192 :                 hMdDec->spar_coeffs_prev.C_re_fx[i][j][k] = hMdDec->spar_coeffs.C_re_fx[i][j][k]; /* Q22 */
    1157    43818192 :                 move32();
    1158             :             }
    1159             :         }
    1160             :     }
    1161             : 
    1162      826040 :     FOR( i = 0; i < num_channels; i++ )
    1163             :     {
    1164     4331848 :         FOR( j = 0; j < num_channels; j++ )
    1165             :         {
    1166    47469708 :             FOR( k = 0; k < IVAS_MAX_NUM_BANDS; k++ )
    1167             :             {
    1168    43818192 :                 hMdDec->spar_coeffs_prev.P_re_fx[i][j][k] = hMdDec->spar_coeffs.P_re_fx[i][j][k]; /* Q22 */
    1169    43818192 :                 move32();
    1170             :             }
    1171             :         }
    1172             :     }
    1173             : 
    1174      826040 :     FOR( i = 0; i < num_channels; i++ )
    1175             :     {
    1176     4331848 :         FOR( j = 0; j < num_channels; j++ )
    1177             :         {
    1178    47469708 :             FOR( k = 0; k < IVAS_MAX_NUM_BANDS; k++ )
    1179             :             {
    1180    43818192 :                 hMdDec->spar_coeffs_tar.C_re_fx[i][j][k] = hMdDec->spar_coeffs.C_re_fx[i][j][k]; /* Q22 */
    1181    43818192 :                 move32();
    1182             :             }
    1183             :         }
    1184             :     }
    1185             : 
    1186      826040 :     FOR( i = 0; i < num_channels; i++ )
    1187             :     {
    1188     4331848 :         FOR( j = 0; j < num_channels; j++ )
    1189             :         {
    1190    47469708 :             FOR( k = 0; k < IVAS_MAX_NUM_BANDS; k++ )
    1191             :             {
    1192    43818192 :                 hMdDec->spar_coeffs_tar.P_re_fx[i][j][k] = hMdDec->spar_coeffs.P_re_fx[i][j][k]; /* Q22 */
    1193    43818192 :                 move32();
    1194             :             }
    1195             :         }
    1196             :     }
    1197             : 
    1198      145708 :     return;
    1199             : }
    1200             : 
    1201             : /*-----------------------------------------------------------------------------------------*
    1202             :  * Function ivas_get_spar_matrices()
    1203             :  *
    1204             :  * Get SPAR matrices
    1205             :  *-----------------------------------------------------------------------------------------*/
    1206             : 
    1207      145833 : static void ivas_get_spar_matrices_fx(
    1208             :     ivas_spar_md_dec_state_t *hMdDec,
    1209             :     const Word16 num_bands_out, /*Q0*/
    1210             :     const Word16 n_ts,          /*Q0*/
    1211             :     const Word16 bw,            /*Q0*/
    1212             :     const Word16 dtx_vad,       /*Q0*/
    1213             :     const Word16 nB,            /*Q0*/
    1214             :     const Word16 numch_out,     /*Q0*/
    1215             :     const Word16 active_w_vlbr, /*Q0*/
    1216             :     const Word16 dyn_active_w_flag /*Q0*/ )
    1217             : {
    1218             :     Word16 num_bands, dmx_ch, split_band;
    1219             :     Word16 i, j, k, m, b, i_ts, active_w;
    1220             :     const Word16 *order;
    1221             :     Word32 active_w_dm_fac_fx, re_fx, re_fx1;
    1222             : 
    1223      145833 :     num_bands = num_bands_out;
    1224      145833 :     move16();
    1225      145833 :     order = remix_order_set[hMdDec->spar_md_cfg.remix_unmix_order];
    1226             : 
    1227      145833 :     split_band = SPAR_DIRAC_SPLIT_START_BAND;
    1228      145833 :     move16();
    1229             : 
    1230             :     // Dead code as SPAR_DIRAC_SPLIT_START_BAND = 8 and IVAS_MAX_NUM_BANDS = 12
    1231      145833 :     IF( GE_16( split_band, IVAS_MAX_NUM_BANDS ) )
    1232             :     {
    1233             :         /*store previous 4x4 parameters for linear interpolation to current*/
    1234             : 
    1235           0 :         FOR( i = 0; i < numch_out; i++ )
    1236             :         {
    1237           0 :             FOR( j = 0; j < numch_out; j++ )
    1238             :             {
    1239           0 :                 FOR( b = 0; b < num_bands; b++ )
    1240             :                 {
    1241           0 :                     hMdDec->mixer_mat_prev_fx[0][i][j][b] = hMdDec->mixer_mat_fx[i][j][b]; /*hMdDec->Q_mixer_mat*/
    1242           0 :                     move32();
    1243             :                 }
    1244             :             }
    1245             :         }
    1246             :     }
    1247             : 
    1248      145833 :     if ( EQ_16( bw, IVAS_RED_BAND_FACT ) )
    1249             :     {
    1250           0 :         num_bands = shr( num_bands, 1 );
    1251             :     }
    1252             : 
    1253      145833 :     test();
    1254      145833 :     active_w = EQ_16( dyn_active_w_flag, 1 ) || EQ_16( hMdDec->spar_md_cfg.active_w, 1 );
    1255             : 
    1256      145833 :     IF( dtx_vad == 0 )
    1257             :     {
    1258         557 :         active_w_dm_fac_fx = IVAS_ACTIVEW_DM_F_SCALE_DTX_FX;
    1259         557 :         move32();
    1260             :     }
    1261      145276 :     ELSE IF( EQ_16( active_w_vlbr, 1 ) )
    1262             :     {
    1263       11127 :         active_w_dm_fac_fx = IVAS_ACTIVEW_DM_F_SCALE_VLBR_FX;
    1264       11127 :         move32();
    1265             :     }
    1266             :     ELSE
    1267             :     {
    1268      134149 :         active_w_dm_fac_fx = IVAS_ACTIVEW_DM_F_SCALE_FX;
    1269      134149 :         move32();
    1270             :     }
    1271             : 
    1272      666126 :     FOR( i_ts = 0; i_ts < n_ts; i_ts++ )
    1273             :     {
    1274     2797455 :         FOR( i = 0; i < numch_out; i++ )
    1275             :         {
    1276    13038122 :             FOR( j = 0; j < numch_out; j++ )
    1277             :             {
    1278             : 
    1279    10760960 :                 set32_fx( &hMdDec->spar_coeffs.C_re_fx[i][j][( i_ts * IVAS_MAX_NUM_BANDS )], 0, IVAS_MAX_NUM_BANDS );
    1280    10760960 :                 set32_fx( &hMdDec->spar_coeffs.P_re_fx[i][j][( i_ts * IVAS_MAX_NUM_BANDS )], 0, IVAS_MAX_NUM_BANDS );
    1281             :             }
    1282             :         }
    1283      520293 :         num_bands = s_min( num_bands, nB );
    1284      520293 :         move16();
    1285             : 
    1286     6668565 :         FOR( b = 0; b < num_bands; b++ )
    1287             :         {
    1288             :             Word32 tmp_C1_re_fx[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH];
    1289             :             Word32 tmp_C2_re_fx[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH];
    1290             :             Word32 tmp_dm_re_fx[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH];
    1291     6148272 :             dmx_ch = hMdDec->spar_md_cfg.num_dmx_chans_per_band[( bw * b )]; /*Q0*/
    1292     6148272 :             move16();
    1293             : 
    1294    33077240 :             FOR( j = 0; j < numch_out; j++ )
    1295             :             {
    1296    26928968 :                 set_zero_fx( tmp_C1_re_fx[j], numch_out );
    1297    26928968 :                 set_zero_fx( tmp_C2_re_fx[j], numch_out );
    1298    26928968 :                 set_zero_fx( tmp_dm_re_fx[j], numch_out );
    1299             : 
    1300    26928968 :                 tmp_C1_re_fx[j][j] = ONE_IN_Q22; /*Q22*/
    1301    26928968 :                 tmp_C2_re_fx[j][j] = ONE_IN_Q22; /*Q22*/
    1302    26928968 :                 tmp_dm_re_fx[j][j] = ONE_IN_Q22; /*Q22*/
    1303    26928968 :                 move32();
    1304    26928968 :                 move32();
    1305    26928968 :                 move32();
    1306             :             }
    1307             : 
    1308    26928968 :             FOR( j = 1; j < numch_out; j++ )
    1309             :             {
    1310    20780696 :                 tmp_C1_re_fx[j][0] = hMdDec->spar_md.band_coeffs[( b + ( i_ts * IVAS_MAX_NUM_BANDS ) )].pred_re_fx[j - 1]; // Q.22
    1311    20780696 :                 move32();
    1312             :             }
    1313             : 
    1314     6148272 :             IF( EQ_16( active_w, 1 ) )
    1315             :             {
    1316     5536768 :                 FOR( j = 1; j < numch_out; j++ )
    1317             :                 {
    1318             : 
    1319     4152576 :                     tmp_C2_re_fx[0][j] = Mpy_32_32( active_w_dm_fac_fx, L_negate( hMdDec->spar_md.band_coeffs[( b + ( i_ts * IVAS_MAX_NUM_BANDS ) )].pred_re_fx[j - 1] ) ); // Q31 *Q22=Q22
    1320     4152576 :                     move32();
    1321             :                 }
    1322     1384192 :                 re_fx1 = Madd_32_32( ONE_IN_Q13, tmp_C2_re_fx[0][1], tmp_C1_re_fx[1][0] ); // Q13+Q13
    1323             : 
    1324     1384192 :                 re_fx1 = Madd_32_32( re_fx1, tmp_C2_re_fx[0][2], tmp_C1_re_fx[2][0] ); // Q13+Q13
    1325             : 
    1326     1384192 :                 tmp_dm_re_fx[0][0] = L_shl( Madd_32_32( re_fx1, tmp_C2_re_fx[0][3], tmp_C1_re_fx[3][0] ), Q9 ); // (Q13+Q13) << Q9 = Q22;
    1327             :                                                                                                                 //
    1328     1384192 :                 move32();
    1329             : 
    1330     1384192 :                 IF( EQ_16( dyn_active_w_flag, 1 ) )
    1331             :                 {
    1332           0 :                     tmp_dm_re_fx[0][0] = Mpy_32_32( tmp_dm_re_fx[0][0], IVAS_SPAR_DYN_ACTIVEW_THRESH_FX ); // Q22 * Q31 = Q22
    1333           0 :                     move32();
    1334             :                 }
    1335             : 
    1336     1384192 :                 tmp_dm_re_fx[0][1] = tmp_C2_re_fx[0][1]; /*Q22*/
    1337     1384192 :                 move32();
    1338             : 
    1339     1384192 :                 tmp_dm_re_fx[0][2] = tmp_C2_re_fx[0][2]; /*Q22*/
    1340     1384192 :                 move32();
    1341             : 
    1342     1384192 :                 tmp_dm_re_fx[0][3] = tmp_C2_re_fx[0][3]; /*Q22*/
    1343     1384192 :                 move32();
    1344             : 
    1345     1384192 :                 tmp_dm_re_fx[1][0] = tmp_C1_re_fx[1][0]; /*Q22*/
    1346     1384192 :                 move32();
    1347             : 
    1348     1384192 :                 tmp_dm_re_fx[2][0] = tmp_C1_re_fx[2][0]; /*Q22*/
    1349     1384192 :                 move32();
    1350             : 
    1351     1384192 :                 tmp_dm_re_fx[3][0] = tmp_C1_re_fx[3][0]; /*Q22*/
    1352     1384192 :                 move32();
    1353             : 
    1354     1384192 :                 IF( NE_16( hMdDec->spar_md_cfg.remix_unmix_order, 3 ) )
    1355             :                 {
    1356     1384192 :                     ivas_mat_col_rearrange_fx( tmp_dm_re_fx, order, i_ts, hMdDec->mixer_mat_fx, b, numch_out );
    1357             :                 }
    1358             :             }
    1359             :             ELSE
    1360             :             {
    1361     4764080 :                 IF( NE_16( hMdDec->spar_md_cfg.remix_unmix_order, 3 ) )
    1362             :                 {
    1363     4764080 :                     ivas_mat_col_rearrange_fx( tmp_C1_re_fx, order, i_ts, hMdDec->mixer_mat_fx, b, numch_out );
    1364             :                 }
    1365             :             }
    1366     6148272 :             hMdDec->Q_mixer_mat = Q30;
    1367     6148272 :             move16();
    1368     6148272 :             IF( dmx_ch > 0 )
    1369             :             {
    1370             :                 Word32 tmpC_re_fx[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH];
    1371             :                 Word32 tmpP_re_fx[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH];
    1372             : 
    1373    33077240 :                 FOR( j = 0; j < numch_out; j++ )
    1374             :                 {
    1375    26928968 :                     set32_fx( tmpC_re_fx[j], 0, numch_out );
    1376    26928968 :                     set32_fx( tmpP_re_fx[j], 0, numch_out );
    1377             :                 }
    1378             : 
    1379    33077240 :                 FOR( j = 0; j < numch_out; j++ )
    1380             :                 {
    1381    26928968 :                     set32_fx( tmpC_re_fx[j], 0, numch_out );
    1382             :                 }
    1383             : 
    1384    21523312 :                 FOR( k = 0; k < dmx_ch; k++ )
    1385             :                 {
    1386    15375040 :                     tmpC_re_fx[k][k] = ONE_IN_Q22; /*Q22*/
    1387    15375040 :                     move32();
    1388             :                 }
    1389             : 
    1390    17702200 :                 FOR( j = dmx_ch; j < numch_out; j++ )
    1391             :                 {
    1392    25080736 :                     FOR( k = 1; k < dmx_ch; k++ )
    1393             :                     {
    1394    13526808 :                         tmpC_re_fx[j][k] = hMdDec->spar_md.band_coeffs[add( b, i_mult( i_ts, IVAS_MAX_NUM_BANDS ) )].C_re_fx[sub( j, dmx_ch )][k - 1]; // Q22
    1395    13526808 :                         move32();
    1396             :                     }
    1397             :                 }
    1398             : 
    1399    17702200 :                 FOR( j = dmx_ch; j < numch_out; j++ )
    1400             :                 {
    1401    43077128 :                     FOR( k = dmx_ch; k < numch_out; k++ )
    1402             :                     {
    1403    31523200 :                         IF( EQ_16( j, k ) )
    1404             :                         {
    1405    11553928 :                             tmpP_re_fx[j][k] = hMdDec->spar_md.band_coeffs[add( b, i_mult( i_ts, IVAS_MAX_NUM_BANDS ) )].P_re_fx[sub( k, dmx_ch )]; // Q22
    1406    11553928 :                             move32();
    1407             :                         }
    1408             :                         ELSE
    1409             :                         {
    1410    19969272 :                             tmpP_re_fx[j][k] = 0;
    1411    19969272 :                             move32();
    1412             :                         }
    1413             :                     }
    1414             :                 }
    1415             : 
    1416             : 
    1417    26928968 :                 FOR( j = 1; j < numch_out; j++ )
    1418             :                 {
    1419    65830704 :                     FOR( k = dmx_ch; k < numch_out; k++ )
    1420             :                     {
    1421   310121536 :                         FOR( m = 0; m < numch_out; m++ )
    1422             :                         {
    1423   265071528 :                             re_fx = Mpy_32_32( hMdDec->mixer_mat_fx[j][m][( b + ( i_ts * IVAS_MAX_NUM_BANDS ) )], tmpP_re_fx[m][k] );                                                                              // Q30*Q22 = Q21
    1424   265071528 :                             re_fx = L_shl( re_fx, 1 );                                                                                                                                                             /*Q22*/
    1425   265071528 :                             hMdDec->spar_coeffs.P_re_fx[j][k][( ( b * bw ) + ( i_ts * IVAS_MAX_NUM_BANDS ) )] = L_add( hMdDec->spar_coeffs.P_re_fx[j][k][( ( b * bw ) + ( i_ts * IVAS_MAX_NUM_BANDS ) )], re_fx ); /*Q22*/
    1426   265071528 :                             move32();
    1427             :                         }
    1428             :                     }
    1429             :                 }
    1430             : 
    1431             : 
    1432    33077240 :                 FOR( j = 0; j < numch_out; j++ )
    1433             :                 {
    1434    97772648 :                     FOR( k = 0; k < dmx_ch; k++ )
    1435             :                     {
    1436   433145376 :                         FOR( m = 0; m < numch_out; m++ )
    1437             :                         {
    1438   362301696 :                             re_fx = Mpy_32_32( hMdDec->mixer_mat_fx[j][m][( b + ( i_ts * IVAS_MAX_NUM_BANDS ) )], tmpC_re_fx[m][k] );                                                                              // Q30* Q22 = Q21
    1439   362301696 :                             re_fx = L_shl( re_fx, 1 );                                                                                                                                                             /*Q22*/
    1440   362301696 :                             hMdDec->spar_coeffs.C_re_fx[j][k][( ( b * bw ) + ( i_ts * IVAS_MAX_NUM_BANDS ) )] = L_add( hMdDec->spar_coeffs.C_re_fx[j][k][( ( b * bw ) + ( i_ts * IVAS_MAX_NUM_BANDS ) )], re_fx ); /*Q22*/
    1441   362301696 :                             move32();
    1442             :                         }
    1443             :                     }
    1444             :                 }
    1445             : 
    1446    12296544 :                 hMdDec->spar_coeffs.C_re_fx[0][0][( ( b * bw ) + ( i_ts * IVAS_MAX_NUM_BANDS ) )] =
    1447     6148272 :                     L_max( 0, hMdDec->spar_coeffs.C_re_fx[0][0][( ( b * bw ) + ( i_ts * IVAS_MAX_NUM_BANDS ) )] ); /*Q22*/
    1448     6148272 :                 move32();
    1449             :             }
    1450             :         }
    1451             : 
    1452             :         /* band mixing */
    1453      520293 :         IF( EQ_16( bw, IVAS_RED_BAND_FACT ) )
    1454             :         {
    1455           0 :             FOR( b = 0; b < num_bands_out; b = ( b + bw ) )
    1456             :             {
    1457           0 :                 dmx_ch = hMdDec->spar_md_cfg.num_dmx_chans_per_band[b];
    1458           0 :                 move16();
    1459           0 :                 FOR( j = 0; j < numch_out; j++ )
    1460             :                 {
    1461           0 :                     FOR( k = dmx_ch; k < numch_out; k++ )
    1462             :                     {
    1463           0 :                         hMdDec->spar_coeffs.P_re_fx[j][k][( ( b + 1 ) + ( i_ts * IVAS_MAX_NUM_BANDS ) )] = hMdDec->spar_coeffs.P_re_fx[j][k][( b + ( i_ts * IVAS_MAX_NUM_BANDS ) )]; /*Q22*/
    1464           0 :                         move32();
    1465             :                     }
    1466             :                 }
    1467             : 
    1468           0 :                 FOR( j = 0; j < numch_out; j++ )
    1469             :                 {
    1470           0 :                     FOR( k = 0; k < dmx_ch; k++ )
    1471             :                     {
    1472           0 :                         hMdDec->spar_coeffs.C_re_fx[j][k][( ( b + 1 ) + ( i_ts * IVAS_MAX_NUM_BANDS ) )] = hMdDec->spar_coeffs.C_re_fx[j][k][( b + ( i_ts * IVAS_MAX_NUM_BANDS ) )]; /*Q22*/
    1473           0 :                         move32();
    1474             :                     }
    1475             :                 }
    1476             :             }
    1477             :         }
    1478             :     }
    1479             : 
    1480      145833 :     return;
    1481             : }
    1482             : 
    1483             : /*-----------------------------------------------------------------------------------------*
    1484             :  * Function ivas_mat_col_rearrange()
    1485             :  *
    1486             :  * reorders the input matrix based on order
    1487             :  *-----------------------------------------------------------------------------------------*/
    1488             : 
    1489     6148272 : static void ivas_mat_col_rearrange_fx(
    1490             :     Word32 in_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], /*Q22*/
    1491             :     const Word16 order[IVAS_SPAR_MAX_CH],             /*Q0*/
    1492             :     const Word16 i_ts,                                /*Q0*/
    1493             :     Word32 ***mixer_mat,                              /*Q30*/
    1494             :     const Word16 bands,                               /*Q0*/
    1495             :     const Word16 num_ch /*Q0*/ )
    1496             : {
    1497             :     Word16 i, j, idx;
    1498             : 
    1499    33077240 :     FOR( i = 0; i < num_ch; i++ )
    1500             :     {
    1501    26928968 :         idx = order[i]; /*Q0*/
    1502    26928968 :         move16();
    1503             : 
    1504   154376584 :         FOR( j = 0; j < num_ch; j++ )
    1505             :         {
    1506   127447616 :             mixer_mat[j][i][( bands + ( i_ts * IVAS_MAX_NUM_BANDS ) )] = L_shl_sat( in_re[j][idx], Q8 ); /*Q30*/
    1507   127447616 :             move32();
    1508             :         }
    1509             :     }
    1510             : 
    1511     6148272 :     return;
    1512             : }
    1513             : 
    1514             : /*-----------------------------------------------------------------------------------------*
    1515             :  * Function ivas_spar_dec_gen_umx_mat()
    1516             :  *
    1517             :  * generates upmix matrix
    1518             :  *-----------------------------------------------------------------------------------------*/
    1519      187962 : void ivas_spar_dec_gen_umx_mat_fx(
    1520             :     ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle        */
    1521             :     const Word16 nchan_transport,     /* i  : number of transport channels  Q0*/
    1522             :     const Word16 num_bands_out,       /* i  : number of output bands        Q0*/
    1523             :     const Word16 bfi,                 /* i  : bad frame indicator           Q0*/
    1524             :     const Word16 num_md_sub_frames /*Q0*/ )
    1525             : {
    1526             :     Word16 i, j, b, i_ts, num_out_ch;
    1527      187962 :     num_out_ch = hMdDec->spar_md_cfg.num_umx_chs;
    1528      187962 :     move16();
    1529      864045 :     FOR( i_ts = 0; i_ts < num_md_sub_frames; i_ts++ )
    1530             :     {
    1531      676083 :         IF( EQ_16( hMdDec->td_decorr_flag, 1 ) )
    1532             :         {
    1533     3565819 :             FOR( i = 0; i < num_out_ch; i++ )
    1534             :             {
    1535     9800660 :                 FOR( j = 0; j < nchan_transport; j++ )
    1536             :                 {
    1537    88868412 :                     FOR( b = 0; b < num_bands_out; b++ )
    1538             :                     {
    1539    81957488 :                         hMdDec->mixer_mat_fx[i][j][( b + ( i_ts * IVAS_MAX_NUM_BANDS ) )] = L_shl_sat( hMdDec->spar_coeffs.C_re_fx[i][j][( b + ( i_ts * IVAS_MAX_NUM_BANDS ) )], Q8 ); /*Q30*/
    1540    81957488 :                         move32();
    1541             :                     }
    1542             :                 }
    1543             :             }
    1544     3565819 :             FOR( i = 0; i < num_out_ch; i++ )
    1545             :             {
    1546     9119908 :                 FOR( j = nchan_transport; j < num_out_ch; j++ )
    1547             :                 {
    1548    80022028 :                     FOR( b = 0; b < num_bands_out; b++ )
    1549             :                     {
    1550    73791856 :                         hMdDec->mixer_mat_fx[i][j][( b + ( i_ts * IVAS_MAX_NUM_BANDS ) )] = L_shl_sat( hMdDec->spar_coeffs.P_re_fx[i][j][( b + ( i_ts * IVAS_MAX_NUM_BANDS ) )], Q8 ); /*Q30*/
    1551    73791856 :                         move32();
    1552             :                     }
    1553             :                 }
    1554             :             }
    1555             :         }
    1556             :         ELSE
    1557             :         {
    1558           0 :             FOR( i = 0; i < num_out_ch; i++ )
    1559             :             {
    1560           0 :                 FOR( j = 0; j < nchan_transport; j++ )
    1561             :                 {
    1562           0 :                     FOR( b = 0; b < num_bands_out; b++ )
    1563             :                     {
    1564           0 :                         hMdDec->mixer_mat_fx[i][j][( b + ( i_ts * IVAS_MAX_NUM_BANDS ) )] = L_shl_sat( hMdDec->spar_coeffs.C_re_fx[i][j][( b + ( i_ts * IVAS_MAX_NUM_BANDS ) )], Q8 ); /*Q30*/
    1565           0 :                         move32();
    1566             :                     }
    1567             :                 }
    1568             :             }
    1569             :         }
    1570             :     }
    1571      187962 :     hMdDec->Q_mixer_mat = Q30;
    1572      187962 :     move16();
    1573      187962 :     ivas_spar_dec_compute_ramp_down_post_matrix_fx( hMdDec, num_bands_out, bfi, num_md_sub_frames );
    1574      187962 :     return;
    1575             : }
    1576             : 
    1577       11684 : static void ivas_spar_md_band_upmix(
    1578             :     ivas_band_coeffs_t *band_coeffs,
    1579             :     Word16 *nB,          /*Q0*/
    1580             :     Word16 *bands_bw,    /*Q0*/
    1581             :     Word16 *valid_bands, /*Q0*/
    1582             :     Word16 bw_final,     /*Q0*/
    1583             :     Word16 ndec,         /*Q0*/
    1584             :     Word16 ndm /*Q0*/ )
    1585             : {
    1586             :     Word16 i, ii, jj, b, idx, bw_fact;
    1587             : 
    1588       11684 :     bw_fact = idiv1616( *bands_bw, bw_final ); /*Q0*/
    1589       57306 :     FOR( i = sub( *nB, 1 ); i >= 0; i-- )
    1590             :     {
    1591             : 
    1592      139094 :         FOR( b = sub( bw_fact, 1 ); b >= 0; b-- )
    1593             :         {
    1594       93472 :             idx = add( i_mult( i, bw_fact ), b ); /*Q0*/
    1595      373888 :             FOR( ii = 0; ii < ( ( ndec + ndm ) - 1 ); ii++ )
    1596             :             {
    1597      280416 :                 band_coeffs[idx].pred_re_fx[ii] = band_coeffs[i].pred_re_fx[ii]; /*Q22*/
    1598      280416 :                 move32();
    1599             :             }
    1600      371344 :             FOR( ii = 0; ii < ndec; ii++ )
    1601             :             {
    1602      282960 :                 FOR( jj = 0; jj < sub( ndm, 1 ); jj++ )
    1603             :                 {
    1604        5088 :                     band_coeffs[idx].C_re_fx[ii][jj] = band_coeffs[i].C_re_fx[ii][jj]; /*Q22*/
    1605        5088 :                     move32();
    1606             :                 }
    1607             :             }
    1608      371344 :             FOR( jj = 0; jj < ndec; jj++ )
    1609             :             {
    1610      277872 :                 band_coeffs[idx].P_re_fx[jj] = band_coeffs[i].P_re_fx[jj]; /*Q22*/
    1611      277872 :                 move32();
    1612             :             }
    1613       93472 :             valid_bands[idx] = valid_bands[i]; /*Q0*/
    1614       93472 :             move16();
    1615             :         }
    1616             :     }
    1617       11684 :     *nB = idiv1616( i_mult( ( *nB ), ( *bands_bw ) ), bw_final ); /*Q0*/
    1618       11684 :     move16();
    1619       11684 :     *bands_bw = bw_final; /*Q0*/
    1620       11684 :     move16();
    1621             : 
    1622       11684 :     return;
    1623             : }
    1624             : 
    1625             : /*-----------------------------------------------------------------------------------------*
    1626             :  * Function ivas_spar_dec_parse_md_bs()
    1627             :  *
    1628             :  * Parse SPAR MD bitstream
    1629             :  *-----------------------------------------------------------------------------------------*/
    1630             : 
    1631      145833 : static void ivas_spar_dec_parse_md_bs_fx(
    1632             :     ivas_spar_md_dec_state_t *hMdDec,
    1633             :     Decoder_State *st0,
    1634             :     Word16 *nB,                    /*Q0*/
    1635             :     Word16 *bands_bw,              /*Q0*/
    1636             :     Word16 *dtx_vad,               /*Q0*/
    1637             :     const Word32 ivas_total_brate, /*Q0*/
    1638             :     const Word16 sba_inactive_mode /*Q0*/ )
    1639             : {
    1640             :     Word16 i, j, k, num_bands;
    1641             :     Word16 ii, jj, ndec, ndm;
    1642             :     UWord16 qsi;
    1643             :     ivas_quant_strat_t qs;
    1644             :     Word16 strat, no_ec;
    1645             :     Word16 do_diff[IVAS_MAX_NUM_BANDS];
    1646             :     Word32 quant_fx[IVAS_SPAR_MAX_C_COEFF];
    1647             :     Word16 do_repeat[IVAS_MAX_NUM_BANDS];
    1648      145833 :     *dtx_vad = 1;
    1649      145833 :     move16();
    1650      145833 :     *bands_bw = 1;
    1651      145833 :     move16();
    1652      145833 :     qsi = 0;
    1653      145833 :     move16();
    1654      145833 :     num_bands = hMdDec->spar_md.num_bands;
    1655      145833 :     move16();
    1656             : 
    1657      145833 :     IF( GT_32( ivas_total_brate, IVAS_SID_5k2 ) )
    1658             :     {
    1659      145509 :         IF( hMdDec->spar_md_cfg.quant_strat_bits > 0 )
    1660             :         {
    1661      145509 :             IF( GE_32( ivas_total_brate, BRATE_SPAR_Q_STRAT ) )
    1662             :             {
    1663             :                 /*only one bit written for quantization strategy to indicate either a fixed quantization strategy or dtx_vad==0 */
    1664       39194 :                 qsi = get_next_indice_fx( st0, 1 ); /*Q0*/
    1665       39194 :                 if ( EQ_32( qsi, 1 ) )
    1666             :                 {
    1667           0 :                     *dtx_vad = 0;
    1668           0 :                     move16();
    1669             :                 }
    1670             :             }
    1671             :             ELSE
    1672             :             {
    1673      106315 :                 IF( EQ_16( sba_inactive_mode, 1 ) )
    1674             :                 {
    1675         233 :                     *dtx_vad = 0;
    1676         233 :                     move16();
    1677         233 :                     qsi = add( hMdDec->spar_md_cfg.quant_strat_bits, 1 );
    1678             :                 }
    1679             :                 ELSE
    1680             :                 {
    1681      106082 :                     qsi = get_next_indice_fx( st0, hMdDec->spar_md_cfg.quant_strat_bits );
    1682             :                 }
    1683             :             }
    1684             :         }
    1685             :         ELSE
    1686             :         {
    1687           0 :             qsi = 0;
    1688           0 :             move16();
    1689             :         }
    1690             :     }
    1691             :     ELSE
    1692             :     {
    1693         324 :         *dtx_vad = 0;
    1694         324 :         move16();
    1695             :     }
    1696             : 
    1697      145833 :     hMdDec->dtx_vad = *dtx_vad; /*Q0*/
    1698      145833 :     move16();
    1699             : 
    1700      145833 :     IF( *dtx_vad == 0 )
    1701             :     {
    1702         557 :         *nB = SPAR_DTX_BANDS;
    1703         557 :         move16();
    1704         557 :         *bands_bw = shr( num_bands, SPAR_DTX_BANDS_LOG2 ); /*Q0*/
    1705         557 :         move16();
    1706             : 
    1707        1671 :         FOR( i = 0; i < *nB; i++ )
    1708             :         {
    1709       12254 :             FOR( j = 0; j < IVAS_SPAR_MAX_CH - 1; j++ )
    1710             :             {
    1711       11140 :                 hMdDec->spar_md.band_coeffs[i].pred_re_fx[j] = 0;
    1712       11140 :                 move32();
    1713       11140 :                 hMdDec->spar_md.band_coeffs[i].P_re_fx[j] = 0;
    1714       11140 :                 move32();
    1715             :             }
    1716        1114 :             hMdDec->valid_bands[i] = 1;
    1717        1114 :             move16();
    1718             :         }
    1719             : 
    1720        5013 :         FOR( i = 0; i < num_bands; i++ )
    1721             :         {
    1722       35648 :             FOR( j = 0; j < ( IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS ); j++ )
    1723             :             {
    1724      124768 :                 FOR( k = 0; k < ( IVAS_SPAR_MAX_DMX_CHS - 1 ); k++ )
    1725             :                 {
    1726       93576 :                     hMdDec->spar_md.band_coeffs[i].C_re_fx[j][k] = 0;
    1727       93576 :                     move32();
    1728             :                 }
    1729             :             }
    1730             :         }
    1731             : 
    1732         557 :         ivas_parse_parameter_bitstream_dtx( &hMdDec->spar_md, st0, *bands_bw, *nB, hMdDec->spar_md_cfg.num_dmx_chans_per_band, hMdDec->spar_md_cfg.num_decorr_per_band );
    1733             : 
    1734         557 :         IF( NE_16( *bands_bw, 1 ) )
    1735             :         {
    1736         557 :             ndec = hMdDec->spar_md_cfg.num_decorr_per_band[0]; /*Q0*/
    1737         557 :             move16();
    1738         557 :             ndm = hMdDec->spar_md_cfg.num_dmx_chans_per_band[0]; /*Q0*/
    1739         557 :             move16();
    1740         557 :             ivas_spar_md_band_upmix(
    1741             :                 hMdDec->spar_md.band_coeffs,
    1742             :                 nB,
    1743             :                 bands_bw,
    1744         557 :                 hMdDec->valid_bands,
    1745             :                 1,
    1746             :                 ndec,
    1747             :                 ndm );
    1748             :         }
    1749             : 
    1750         557 :         return;
    1751             :     }
    1752             : 
    1753      145276 :     qs = hMdDec->spar_md_cfg.quant_strat[qsi];
    1754             : 
    1755      145276 :     strat = get_next_indice_fx( st0, 3 ); /*Q0*/
    1756             : 
    1757      145276 :     no_ec = 0;
    1758      145276 :     move16();
    1759             : 
    1760      145276 :     IF( LT_16( strat, 2 ) )
    1761             :     {
    1762       55995 :         *bands_bw = add( strat, 1 );
    1763       55995 :         move16();
    1764       55995 :         *nB = idiv1616( num_bands, *bands_bw ); /*Q0*/
    1765       55995 :         move16();
    1766      586051 :         FOR( i = 0; i < *nB; i++ )
    1767             :         {
    1768      530056 :             do_diff[i] = 0;
    1769      530056 :             move16();
    1770      530056 :             do_repeat[i] = 0;
    1771      530056 :             move16();
    1772             :         }
    1773             :     }
    1774       89281 :     ELSE IF( LT_16( strat, 4 ) )
    1775             :     {
    1776        2670 :         *bands_bw = sub( strat, 1 );
    1777        2670 :         move16();
    1778        2670 :         *nB = idiv1616( num_bands, *bands_bw ); /*Q0*/
    1779        2670 :         move16();
    1780       23682 :         FOR( i = 0; i < *nB; i++ )
    1781             :         {
    1782       21012 :             do_diff[i] = 0;
    1783       21012 :             move16();
    1784       21012 :             do_repeat[i] = 0;
    1785       21012 :             move16();
    1786             :         }
    1787        2670 :         no_ec = 1;
    1788        2670 :         move16();
    1789             :     }
    1790       86611 :     ELSE IF( LT_32( ivas_total_brate, IVAS_24k4 ) )
    1791             :     {
    1792       10751 :         *bands_bw = 2;
    1793       10751 :         move16();
    1794       10751 :         *nB = idiv1616( num_bands, *bands_bw ); /*Q0*/
    1795       10751 :         move16();
    1796             : 
    1797       53755 :         FOR( i = 0; i < *nB; i++ )
    1798             :         {
    1799       43004 :             do_diff[i] = 0;
    1800       43004 :             move16();
    1801       43004 :             do_repeat[i] = extract_l( EQ_16( ( strat % 2 ), ( add( i, 1 ) % 2 ) ) ); /*Q0*/
    1802       43004 :             move16();
    1803             :         }
    1804             :     }
    1805             :     ELSE
    1806             :     {
    1807       75860 :         *bands_bw = 1;
    1808       75860 :         move16();
    1809       75860 :         *nB = num_bands;
    1810       75860 :         move16();
    1811             : 
    1812      682740 :         FOR( i = 0; i < *nB; i++ )
    1813             :         {
    1814      606880 :             do_diff[i] = extract_l( NE_16( s_and( add( i, 1 ), 3 ), sub( strat, 4 ) ) ); /*Q0*/
    1815      606880 :             move16();
    1816      606880 :             do_repeat[i] = 0;
    1817      606880 :             move16();
    1818             :         }
    1819       75860 :         IF( hMdDec->spar_md_cfg.prev_quant_idx >= 0 )
    1820             :         {
    1821       75853 :             ivas_map_prior_coeffs_quant( &hMdDec->spar_md_prev, &hMdDec->spar_md_cfg, qsi, *nB );
    1822             :         }
    1823             :     }
    1824      145276 :     hMdDec->spar_md_cfg.prev_quant_idx = qsi;
    1825      145276 :     move16();
    1826             : 
    1827      145276 :     IF( no_ec == 0 )
    1828             :     {
    1829      142606 :         ivas_decode_arith_bs( hMdDec, st0, qsi, *nB, *bands_bw, do_diff, strat, ivas_total_brate );
    1830             :     }
    1831             :     ELSE
    1832             :     {
    1833        2670 :         ivas_decode_huffman_bs( hMdDec, st0, qsi, *nB, *bands_bw );
    1834             :     }
    1835             : 
    1836     1346228 :     FOR( i = 0; i < *nB; i++ )
    1837             :     {
    1838     1200952 :         ndec = hMdDec->spar_md_cfg.num_decorr_per_band[( ( *bands_bw ) * i )]; /*Q0*/
    1839     1200952 :         move16();
    1840     1200952 :         ndm = hMdDec->spar_md_cfg.num_dmx_chans_per_band[( ( *bands_bw ) * i )]; /*Q0*/
    1841     1200952 :         move16();
    1842             : 
    1843     1200952 :         ivas_deindex_real_index_fx( hMdDec->spar_md.band_coeffs_idx[i].pred_index_re, qs.PR.q_levels[0], qs.PR.min_fx, qs.PR.max_fx, hMdDec->spar_md.band_coeffs[i].pred_re_fx, sub( add( ndm, ndec ), 1 ) );
    1844             : 
    1845     1200952 :         j = 0;
    1846     1200952 :         move16();
    1847     3990764 :         FOR( ii = 0; ii < ndec; ii++ )
    1848             :         {
    1849     7394468 :             FOR( jj = 0; jj < sub( ndm, 1 ); jj++ )
    1850             :             {
    1851     4604656 :                 quant_fx[j] = hMdDec->spar_md.band_coeffs[i].C_re_fx[ii][jj]; /*Q22*/
    1852     4604656 :                 move32();
    1853     4604656 :                 j = add( j, 1 );
    1854             :             }
    1855             :         }
    1856             : 
    1857     1200952 :         ivas_deindex_real_index_fx( hMdDec->spar_md.band_coeffs_idx[i].drct_index_re, qs.C.q_levels[0], qs.C.min_fx, qs.C.max_fx, quant_fx, i_mult( ndec, sub( ndm, 1 ) ) );
    1858             : 
    1859     1200952 :         j = 0;
    1860     1200952 :         move16();
    1861     3990764 :         FOR( ii = 0; ii < ndec; ii++ )
    1862             :         {
    1863     7394468 :             FOR( jj = 0; jj < sub( ndm, 1 ); jj++ )
    1864             :             {
    1865     4604656 :                 hMdDec->spar_md.band_coeffs[i].C_re_fx[ii][jj] = quant_fx[j]; /*Q22*/
    1866     4604656 :                 move32();
    1867     4604656 :                 j = add( j, 1 );
    1868             :             }
    1869             :         }
    1870             : 
    1871     1200952 :         ivas_deindex_real_index_fx( hMdDec->spar_md.band_coeffs_idx[i].decd_index_re, qs.P_r.q_levels[0], qs.P_r.min_fx, qs.P_r.max_fx, hMdDec->spar_md.band_coeffs[i].P_re_fx, sub( add( ndm, ndec ), 1 ) );
    1872             : 
    1873             :         /* Store prior coefficient indices */
    1874     5973808 :         FOR( j = 0; j < ( ( ndm + ndec ) - 1 ); j++ )
    1875             :         {
    1876     4772856 :             hMdDec->spar_md_prev.band_coeffs_idx[i].pred_index_re[j] = hMdDec->spar_md.band_coeffs_idx[i].pred_index_re[j]; /*Q0*/
    1877     4772856 :             move16();
    1878             :         }
    1879     5805608 :         FOR( j = 0; j < ( ndec * ( ndm - 1 ) ); j++ )
    1880             :         {
    1881     4604656 :             hMdDec->spar_md_prev.band_coeffs_idx[i].drct_index_re[j] = hMdDec->spar_md.band_coeffs_idx[i].drct_index_re[j]; /*Q0*/
    1882     4604656 :             move16();
    1883             :         }
    1884     3990764 :         FOR( j = 0; j < ndec; j++ )
    1885             :         {
    1886     2789812 :             hMdDec->spar_md_prev.band_coeffs_idx[i].decd_index_re[j] = hMdDec->spar_md.band_coeffs_idx[i].decd_index_re[j]; /*Q0*/
    1887     2789812 :             move16();
    1888             :         }
    1889     1200952 :         test();
    1890     1200952 :         IF( ( do_diff[i] == 0 ) && ( do_repeat[i] == 0 ) )
    1891             :         {
    1892      724290 :             hMdDec->valid_bands[i] = s_or( hMdDec->valid_bands[i], 1 );
    1893      724290 :             move16();
    1894             :         }
    1895             :         ELSE
    1896             :         {
    1897      476662 :             hMdDec->valid_bands[i] = s_or( hMdDec->valid_bands[i], 0 );
    1898      476662 :             move16();
    1899             :         }
    1900             :     }
    1901             : 
    1902      145276 :     ndec = hMdDec->spar_md_cfg.num_decorr_per_band[0];
    1903      145276 :     move16();
    1904      145276 :     ndm = hMdDec->spar_md_cfg.num_dmx_chans_per_band[0];
    1905      145276 :     move16();
    1906      145276 :     IF( NE_16( *bands_bw, 1 ) )
    1907             :     {
    1908       11127 :         ivas_spar_md_band_upmix(
    1909             :             hMdDec->spar_md.band_coeffs,
    1910             :             nB,
    1911             :             bands_bw,
    1912       11127 :             hMdDec->valid_bands,
    1913             :             1,
    1914             :             ndec,
    1915             :             ndm );
    1916             :     }
    1917             : 
    1918             : 
    1919      145276 :     return;
    1920             : }
    1921             : 
    1922             : 
    1923             : /*-----------------------------------------------------------------------------------------*
    1924             :  * Function ivas_decode_arith_bs()
    1925             :  *
    1926             :  * Decode bitstream with arith decoder
    1927             :  *-----------------------------------------------------------------------------------------*/
    1928             : 
    1929      142606 : static void ivas_decode_arith_bs(
    1930             :     ivas_spar_md_dec_state_t *hMdDec,
    1931             :     Decoder_State *st0,    /* i/o: decoder state structure - for bitstream handling*/
    1932             :     const UWord16 qsi,     /*Q0*/
    1933             :     const Word16 nB,       /*Q0*/
    1934             :     const Word16 bands_bw, /*Q0*/
    1935             :     Word16 *pDo_diff,      /*Q0*/
    1936             :     const Word16 strat,    /*Q0*/
    1937             :     const Word32 ivas_total_brate /*Q0*/ )
    1938             : {
    1939             :     Word16 i, ndm, ndec;
    1940             :     Word16 j;
    1941             :     ivas_cell_dim_t pred_cell_dims[IVAS_MAX_NUM_BANDS];
    1942             :     ivas_cell_dim_t drct_cell_dims[IVAS_MAX_NUM_BANDS];
    1943             :     ivas_cell_dim_t decd_cell_dims[IVAS_MAX_NUM_BANDS];
    1944             :     ivas_cell_dim_t decx_cell_dims[IVAS_MAX_NUM_BANDS];
    1945             :     Word16 symbol_arr_re[IVAS_MAX_INPUT_LEN];
    1946             :     Word16 symbol_arr_old_re[IVAS_MAX_INPUT_LEN];
    1947             :     Word16 any_diff;
    1948             : 
    1949     1322546 :     FOR( i = 0; i < nB; i++ )
    1950             :     {
    1951     1179940 :         ndm = hMdDec->spar_md_cfg.num_dmx_chans_per_band[bands_bw * i];
    1952     1179940 :         ndec = hMdDec->spar_md_cfg.num_decorr_per_band[bands_bw * i];
    1953     1179940 :         move16();
    1954     1179940 :         move16();
    1955     1179940 :         test();
    1956     1179940 :         test();
    1957     1179940 :         test();
    1958     1179940 :         test();
    1959     1179940 :         test();
    1960     1179940 :         IF( LT_32( ivas_total_brate, IVAS_24k4 ) && GT_16( strat, 3 ) && ( ( EQ_16( i % 2, 1 ) && ( strat % 2 == 0 ) ) || ( ( i % 2 == 0 ) && EQ_16( strat % 2, 1 ) ) ) )
    1961             :         {
    1962       21502 :             pred_cell_dims[i].dim1 = 0;
    1963       21502 :             pred_cell_dims[i].dim2 = 0;
    1964       21502 :             drct_cell_dims[i].dim1 = 0;
    1965       21502 :             drct_cell_dims[i].dim2 = 0;
    1966       21502 :             decd_cell_dims[i].dim1 = 0;
    1967       21502 :             decd_cell_dims[i].dim2 = 0;
    1968       21502 :             decx_cell_dims[i].dim1 = 0;
    1969       21502 :             decx_cell_dims[i].dim2 = 0;
    1970       21502 :             move16();
    1971       21502 :             move16();
    1972       21502 :             move16();
    1973       21502 :             move16();
    1974       21502 :             move16();
    1975       21502 :             move16();
    1976       21502 :             move16();
    1977       21502 :             move16();
    1978             :         }
    1979             :         ELSE
    1980             :         {
    1981     1158438 :             pred_cell_dims[i].dim1 = add( ndm, sub( ndec, 1 ) ); /*Q0*/
    1982     1158438 :             move16();
    1983     1158438 :             IF( hMdDec->spar_hoa_md_flag && hMdDec->spar_hoa_dirac2spar_md_flag )
    1984             :             {
    1985      131388 :                 IF( GE_16( i, SPAR_DIRAC_SPLIT_START_BAND ) )
    1986             :                 {
    1987       43796 :                     pred_cell_dims[i].dim1 = sub( pred_cell_dims[i].dim1, ( FOA_CHANNELS - 1 ) );
    1988       43796 :                     move16();
    1989             :                 }
    1990             :             }
    1991     1158438 :             pred_cell_dims[i].dim2 = 1;
    1992     1158438 :             drct_cell_dims[i].dim1 = ndec;
    1993     1158438 :             drct_cell_dims[i].dim2 = sub( ndm, 1 );
    1994     1158438 :             decd_cell_dims[i].dim1 = ndec;
    1995     1158438 :             decd_cell_dims[i].dim2 = 1;
    1996     1158438 :             decx_cell_dims[i].dim1 = shr( imult1616( ndec, sub( ndec, 1 ) ), 1 );
    1997     1158438 :             decx_cell_dims[i].dim2 = 1;
    1998     1158438 :             move16();
    1999     1158438 :             move16();
    2000     1158438 :             move16();
    2001     1158438 :             move16();
    2002     1158438 :             move16();
    2003     1158438 :             move16();
    2004     1158438 :             move16();
    2005             :         }
    2006             :     }
    2007             : 
    2008      142606 :     any_diff = 0;
    2009      142606 :     move16();
    2010      734725 :     FOR( i = 0; i < nB; i++ )
    2011             :     {
    2012      667979 :         IF( pDo_diff[i] != 0 )
    2013             :         {
    2014       75860 :             any_diff = 1;
    2015       75860 :             move16();
    2016       75860 :             break;
    2017             :         }
    2018             :     }
    2019             : 
    2020      142606 :     IF( EQ_16( any_diff, 1 ) )
    2021             :     {
    2022       75860 :         IF( hMdDec->spar_hoa_md_flag && hMdDec->spar_hoa_dirac2spar_md_flag )
    2023             :         {
    2024           0 :             FOR( i = 0; i < nB; i++ )
    2025             :             {
    2026           0 :                 IF( GE_16( i, SPAR_DIRAC_SPLIT_START_BAND ) )
    2027             :                 {
    2028           0 :                     FOR( j = 0; j < pred_cell_dims[i].dim1; j++ )
    2029             :                     {
    2030           0 :                         hMdDec->spar_md_prev.band_coeffs_idx_mapped[i].pred_index_re[j] =
    2031           0 :                             hMdDec->spar_md_prev.band_coeffs_idx_mapped[i].pred_index_re[j + ( FOA_CHANNELS - 1 )]; /*Q0*/
    2032           0 :                         move16();
    2033             :                     }
    2034             :                 }
    2035             :             }
    2036             :         }
    2037             : 
    2038       75860 :         ivas_copy_band_coeffs_idx_to_arr( hMdDec->spar_md_prev.band_coeffs_idx_mapped, nB, symbol_arr_old_re, pred_cell_dims, PRED_COEFF );
    2039             :     }
    2040             : 
    2041      142606 :     ivas_arith_decode_cmplx_cell_array( &hMdDec->arith_coeffs.pred_arith_re[qsi], &hMdDec->arith_coeffs.pred_arith_re_diff[qsi],
    2042             :                                         st0, pred_cell_dims, pDo_diff, nB, symbol_arr_re, symbol_arr_old_re );
    2043             : 
    2044      142606 :     ivas_fill_band_coeffs_idx( hMdDec->spar_md.band_coeffs_idx, nB, symbol_arr_re, pred_cell_dims, PRED_COEFF );
    2045             : 
    2046      142606 :     IF( hMdDec->spar_hoa_md_flag && hMdDec->spar_hoa_dirac2spar_md_flag )
    2047             :     {
    2048      142337 :         FOR( i = 0; i < nB; i++ )
    2049             :         {
    2050      131388 :             IF( GE_16( i, SPAR_DIRAC_SPLIT_START_BAND ) )
    2051             :             {
    2052      175116 :                 FOR( j = pred_cell_dims[i].dim1 - 1; j >= 0; j-- )
    2053             :                 {
    2054      131320 :                     hMdDec->spar_md.band_coeffs_idx[i].pred_index_re[j + ( FOA_CHANNELS - 1 )] =
    2055      131320 :                         hMdDec->spar_md.band_coeffs_idx[i].pred_index_re[j]; /*Q0*/
    2056      131320 :                     move16();
    2057             :                 }
    2058      175184 :                 FOR( j = 0; j < FOA_CHANNELS - 1; j++ )
    2059             :                 {
    2060      131388 :                     hMdDec->spar_md.band_coeffs_idx[i].pred_index_re[j] = 0;
    2061      131388 :                     move16();
    2062             :                 }
    2063             :             }
    2064             :         }
    2065             :     }
    2066             : 
    2067      142606 :     IF( EQ_16( any_diff, 1 ) )
    2068             :     {
    2069       75860 :         ivas_copy_band_coeffs_idx_to_arr( hMdDec->spar_md_prev.band_coeffs_idx_mapped, nB, symbol_arr_old_re, drct_cell_dims, DRCT_COEFF );
    2070             :     }
    2071             : 
    2072      142606 :     ivas_arith_decode_cmplx_cell_array( &hMdDec->arith_coeffs.drct_arith_re[qsi], &hMdDec->arith_coeffs.drct_arith_re_diff[qsi],
    2073             :                                         st0, drct_cell_dims, pDo_diff, nB, symbol_arr_re, symbol_arr_old_re );
    2074             : 
    2075      142606 :     ivas_fill_band_coeffs_idx( hMdDec->spar_md.band_coeffs_idx, nB, symbol_arr_re, drct_cell_dims, DRCT_COEFF );
    2076             : 
    2077      142606 :     IF( EQ_16( any_diff, 1 ) )
    2078             :     {
    2079       75860 :         ivas_copy_band_coeffs_idx_to_arr( hMdDec->spar_md_prev.band_coeffs_idx_mapped, nB, symbol_arr_old_re, decd_cell_dims, DECD_COEFF );
    2080             :     }
    2081             : 
    2082      142606 :     ivas_arith_decode_cmplx_cell_array( &hMdDec->arith_coeffs.decd_arith_re[qsi], &hMdDec->arith_coeffs.decd_arith_re_diff[qsi],
    2083             :                                         st0, decd_cell_dims, pDo_diff, nB, symbol_arr_re, symbol_arr_old_re );
    2084             : 
    2085      142606 :     ivas_fill_band_coeffs_idx( hMdDec->spar_md.band_coeffs_idx, nB, symbol_arr_re, decd_cell_dims, DECD_COEFF );
    2086             : 
    2087      142606 :     IF( EQ_16( any_diff, 1 ) )
    2088             :     {
    2089       75860 :         ivas_copy_band_coeffs_idx_to_arr( hMdDec->spar_md_prev.band_coeffs_idx_mapped, nB, symbol_arr_old_re, decx_cell_dims, DECX_COEFF );
    2090             :     }
    2091             : 
    2092      142606 :     ivas_fill_band_coeffs_idx( hMdDec->spar_md.band_coeffs_idx, nB, symbol_arr_re, decx_cell_dims, DECX_COEFF );
    2093             : 
    2094      142606 :     return;
    2095             : }
    2096             : 
    2097             : /*-----------------------------------------------------------------------------------------*
    2098             :  * Function ivas_fill_band_coeffs_idx()
    2099             :  *
    2100             :  * Copy pred band coeffs to arr
    2101             :  *-----------------------------------------------------------------------------------------*/
    2102             : 
    2103      570424 : static void ivas_fill_band_coeffs_idx(
    2104             :     ivas_band_coeffs_ind_t *pBands_idx,
    2105             :     const Word16 nB,    /*Q0*/
    2106             :     Word16 *pSymbol_re, /*Q0*/
    2107             :     ivas_cell_dim_t *pCell_dims,
    2108             :     const ivas_coeffs_type_t coeff_type )
    2109             : {
    2110             :     Word16 i, len;
    2111      570424 :     Word16 *pPtr_idx = NULL;
    2112             : 
    2113     5290184 :     FOR( i = 0; i < nB; i++ )
    2114             :     {
    2115     4719760 :         SWITCH( coeff_type )
    2116             :         {
    2117     1179940 :             case PRED_COEFF:
    2118             :             {
    2119     1179940 :                 pPtr_idx = pBands_idx[i].pred_index_re;
    2120     1179940 :                 BREAK;
    2121             :             }
    2122     1179940 :             case DRCT_COEFF:
    2123             :             {
    2124     1179940 :                 pPtr_idx = pBands_idx[i].drct_index_re;
    2125     1179940 :                 BREAK;
    2126             :             }
    2127     1179940 :             case DECD_COEFF:
    2128             :             {
    2129     1179940 :                 pPtr_idx = pBands_idx[i].decd_index_re;
    2130     1179940 :                 BREAK;
    2131             :             }
    2132     1179940 :             case DECX_COEFF:
    2133             :             {
    2134     1179940 :                 BREAK;
    2135             :             }
    2136             : 
    2137           0 :             default:
    2138           0 :                 assert( !"unsupported config!" );
    2139             :         }
    2140             : 
    2141     4719760 :         IF( NE_16( coeff_type, DECX_COEFF ) )
    2142             :         {
    2143     3539820 :             len = imult1616( pCell_dims[i].dim1, pCell_dims[i].dim2 ); /*Q0*/
    2144     3539820 :             Copy( pSymbol_re, pPtr_idx, len );                         /*Q0*/
    2145     3539820 :             pSymbol_re += len;
    2146             :         }
    2147             :     }
    2148             : 
    2149      570424 :     return;
    2150             : }
    2151             : 
    2152             : 
    2153             : /*-----------------------------------------------------------------------------------------*
    2154             :  * Function ivas_decode_huffman_bs()
    2155             :  *
    2156             :  * Decode bitstream with huffman decoder
    2157             :  *-----------------------------------------------------------------------------------------*/
    2158             : 
    2159        2670 : static void ivas_decode_huffman_bs(
    2160             :     ivas_spar_md_dec_state_t *hMdDec,
    2161             :     Decoder_State *st0, /* i/o: decoder state structure - for bitstream handling*/
    2162             :     const UWord16 qsi,  /*Q0*/
    2163             :     const Word16 nB,    /*Q0*/
    2164             :     const Word16 bands_bw /*Q0*/ )
    2165             : {
    2166             :     Word16 i, j;
    2167             :     Word16 ndm, ndec;
    2168             :     Word16 pred_dim, drct_dim, decd_dim, pred_offset;
    2169             : 
    2170       23682 :     FOR( i = 0; i < nB; i++ )
    2171             :     {
    2172       21012 :         ndm = hMdDec->spar_md_cfg.num_dmx_chans_per_band[bands_bw * i]; /*Q0*/
    2173       21012 :         ndec = hMdDec->spar_md_cfg.num_decorr_per_band[bands_bw * i];   /*Q0*/
    2174       21012 :         move16();
    2175       21012 :         move16();
    2176             : 
    2177       21012 :         pred_dim = sub( add( ndec, ndm ), 1 );
    2178       21012 :         drct_dim = imult1616( ndec, sub( ndm, 1 ) ); /*Q0*/
    2179       21012 :         decd_dim = ndec;
    2180       21012 :         pred_offset = 0;
    2181       21012 :         move16();
    2182       21012 :         move16();
    2183             : 
    2184       21012 :         IF( hMdDec->spar_hoa_md_flag && hMdDec->spar_hoa_dirac2spar_md_flag )
    2185             :         {
    2186           0 :             IF( GE_16( i, SPAR_DIRAC_SPLIT_START_BAND ) )
    2187             :             {
    2188           0 :                 pred_offset = FOA_CHANNELS - 1;
    2189           0 :                 move16();
    2190             :             }
    2191             :         }
    2192             : 
    2193       84048 :         FOR( j = pred_offset; j < pred_dim; j++ )
    2194             :         {
    2195       63036 :             ivas_huffman_decode( &hMdDec->huff_coeffs.pred_huff_re[qsi], st0, &hMdDec->spar_md.band_coeffs_idx[i].pred_index_re[j] );
    2196             :         }
    2197             : 
    2198       21012 :         IF( hMdDec->spar_hoa_md_flag && hMdDec->spar_hoa_dirac2spar_md_flag )
    2199             :         {
    2200           0 :             IF( i >= SPAR_DIRAC_SPLIT_START_BAND )
    2201             :             {
    2202           0 :                 FOR( j = 0; j < pred_offset; j++ )
    2203             :                 {
    2204           0 :                     hMdDec->spar_md.band_coeffs_idx[i].pred_index_re[j] = 0;
    2205           0 :                     move16();
    2206             :                 }
    2207             :             }
    2208             :         }
    2209             : 
    2210       23140 :         FOR( j = 0; j < drct_dim; j++ )
    2211             :         {
    2212        2128 :             ivas_huffman_decode( &hMdDec->huff_coeffs.drct_huff_re[qsi], st0, &hMdDec->spar_md.band_coeffs_idx[i].drct_index_re[j] );
    2213             :         }
    2214             : 
    2215       25016 :         FOR( j = 0; j < decd_dim; j++ )
    2216             :         {
    2217        4004 :             ivas_huffman_decode( &hMdDec->huff_coeffs.decd_huff_re[qsi], st0, &hMdDec->spar_md.band_coeffs_idx[i].decd_index_re[j] );
    2218             :         }
    2219             :     }
    2220             : 
    2221        2670 :     return;
    2222             : }
    2223             : 
    2224      291666 : static void ivas_spar_plc_get_band_age(
    2225             :     const Word16 *valid_bands,                      /*Q0*/
    2226             :     Word16 *base_band_age,                          /*Q0*/
    2227             :     const Word16 num_bands,                         /*Q0*/
    2228             :     Word16 last_valid_band_idx[IVAS_MAX_NUM_BANDS], /*Q0*/
    2229             :     Word16 valid_band_idx[IVAS_MAX_NUM_BANDS],      /*Q0*/
    2230             :     Word16 *all_valid,                              /*Q0*/
    2231             :     Word16 *b_idx /*Q0*/ )
    2232             : {
    2233             :     Word16 b, idx;
    2234             : 
    2235      291666 :     set16_fx( valid_band_idx, 0, IVAS_MAX_NUM_BANDS );
    2236      291666 :     set16_fx( last_valid_band_idx, 0, IVAS_MAX_NUM_BANDS );
    2237      291666 :     idx = -1;
    2238      291666 :     *all_valid = 1;
    2239      291666 :     move16();
    2240      291666 :     move16();
    2241     3267428 :     FOR( b = 0; b < num_bands; b++ ){
    2242     2975762 :         IF( valid_bands[b] != 0 ){
    2243     2941674 :             base_band_age[b] = 0; /* reset band age */
    2244     2941674 :     idx = add( idx, 1 );
    2245     2941674 :     valid_band_idx[idx] = b;
    2246     2941674 :     move16();
    2247     2941674 :     move16();
    2248             : }
    2249             : ELSE
    2250             : {
    2251       34088 :     base_band_age[b] = add( base_band_age[b], 1 ); /* increment the age of invalid bands */ /*Q0*/
    2252             : 
    2253       34088 :     IF( GT_16( base_band_age[b], 3 ) )
    2254             :     {
    2255        5276 :         last_valid_band_idx[b] = idx;
    2256        5276 :         move16();
    2257             :     }
    2258       34088 :     *all_valid = 0;
    2259       34088 :     move16();
    2260             : }
    2261             : }
    2262      291666 : *b_idx = idx;
    2263      291666 : move16();
    2264             : 
    2265      291666 : return;
    2266             : }
    2267             : 
    2268             : 
    2269        5276 : static void ivas_spar_get_plc_interp_weights_fx(
    2270             :     Word16 valid_band_idx[IVAS_MAX_NUM_BANDS], /*Q0*/
    2271             :     Word16 last_valid_band_idx,                /*Q0*/
    2272             :     Word16 idx,                                /*Q0*/
    2273             :     Word16 b,                                  /*Q0*/
    2274             :     Word16 *w,                                 /*Q15*/
    2275             :     Word16 *id0,                               /*Q0*/
    2276             :     Word16 *id1 /*Q0*/ )
    2277             : {
    2278        5276 :     IF( last_valid_band_idx < 0 ) /* Extrapolation */
    2279             :     {
    2280        1484 :         *id1 = valid_band_idx[0]; /*Q0*/
    2281        1484 :         move16();
    2282        1484 :         *id0 = 0;
    2283        1484 :         move16();
    2284        1484 :         *w = MAX_WORD16;
    2285        1484 :         move16();
    2286             :     }
    2287        3792 :     ELSE IF( EQ_16( last_valid_band_idx, idx ) ) /* Extrapolation */
    2288             :     {
    2289         434 :         *id1 = valid_band_idx[last_valid_band_idx]; /*Q0*/
    2290         434 :         move16();
    2291         434 :         *id0 = valid_band_idx[last_valid_band_idx]; /*Q0*/
    2292         434 :         move16();
    2293         434 :         *w = 0;
    2294         434 :         move16();
    2295             :     }
    2296             :     ELSE /* Interpolation */
    2297             :     {
    2298        3358 :         *id0 = valid_band_idx[last_valid_band_idx]; /*Q0*/
    2299        3358 :         move16();
    2300        3358 :         *id1 = valid_band_idx[last_valid_band_idx + 1]; /*Q0*/
    2301        3358 :         move16();
    2302        3358 :         IF( sub( b, *id0 ) == 0 )
    2303             :         {
    2304           0 :             *w = 0;
    2305           0 :             move16();
    2306             :         }
    2307             :         ELSE
    2308             :         {
    2309        3358 :             *w = divide3232( sub( b, *id0 ), sub( *id1, *id0 ) ); /*Q0*/
    2310        3358 :             move16();
    2311             :         }
    2312             :     }
    2313        5276 :     return;
    2314             : }
    2315             : 
    2316             : /*-----------------------------------------------------------------------------------------*
    2317             :  * Function ivas_spar_md_fill_invalid_bands_fx()
    2318             :  *
    2319             :  * Fill invalid bands in interpolation/extrapolation of valid bands
    2320             :  * when PLC is to be done with partial time differential coding
    2321             :  *-----------------------------------------------------------------------------------------*/
    2322      145833 : static void ivas_spar_md_fill_invalid_bands_fx(
    2323             :     ivas_spar_dec_matrices_t *pSpar_coeffs,
    2324             :     ivas_spar_dec_matrices_t *pSpar_coeffs_prev,
    2325             :     const Word16 *valid_bands, /*Q0*/
    2326             :     Word16 *base_band_age,     /*Q0*/
    2327             :     const Word16 num_bands,    /*Q0*/
    2328             :     const Word16 num_channels, /*Q0*/
    2329             :     const Word16 num_md_sub_frames /*Q0*/ )
    2330             : {
    2331             :     Word16 i, j, b, all_valid;
    2332      145833 :     Word16 valid_band_idx[IVAS_MAX_NUM_BANDS], idx = -1;
    2333      145833 :     move16();
    2334             :     Word16 last_valid_band_idx[IVAS_MAX_NUM_BANDS];
    2335      145833 :     Word16 w_fx = 0;
    2336      145833 :     move16();
    2337      145833 :     ivas_spar_plc_get_band_age( valid_bands, base_band_age, num_bands,
    2338             :                                 last_valid_band_idx, valid_band_idx, &all_valid, &idx );
    2339      145833 :     assert( idx > 0 ); /* some bands should be valid */
    2340             : 
    2341      145833 :     IF( all_valid == 0 )
    2342             :     {
    2343       46803 :         FOR( b = 0; b < num_bands; b++ )
    2344             :         {
    2345             :             /* check against non zero in if and else if */
    2346             : 
    2347       43036 :             IF( GT_16( base_band_age[b], 3 ) ) /* old invalid bands */
    2348             :             {
    2349             :                 Word16 id0, id1;
    2350        2638 :                 ivas_spar_get_plc_interp_weights_fx( valid_band_idx, last_valid_band_idx[b],
    2351             :                                                      idx, b, &w_fx, &id0, &id1 );
    2352       13190 :                 FOR( i = 0; i < num_channels; i++ )
    2353             :                 {
    2354       52760 :                     FOR( j = 0; j < num_channels; j++ )
    2355             :                     {
    2356       42208 :                         pSpar_coeffs->C_re_fx[i][j][b] = L_add( Mpy_32_16_1( pSpar_coeffs->C_re_fx[i][j][id0], sub( MAX_WORD16, w_fx ) ), Mpy_32_16_1( pSpar_coeffs->C_re_fx[i][j][id1], w_fx ) ); /*Q22*/
    2357       42208 :                         move32();
    2358       42208 :                         pSpar_coeffs->P_re_fx[i][j][b] = L_add( Mpy_32_16_1( pSpar_coeffs->P_re_fx[i][j][id0], sub( MAX_WORD16, w_fx ) ), Mpy_32_16_1( pSpar_coeffs->P_re_fx[i][j][id1], w_fx ) ); /*Q22*/
    2359       42208 :                         move32();
    2360             :                     }
    2361             :                 }
    2362             :             }
    2363             :             ELSE /* young invalid bands */
    2364             :             {
    2365       40398 :                 IF( valid_bands[b] == 0 )
    2366             :                 {
    2367       72030 :                     FOR( i = 0; i < num_channels; i++ )
    2368             :                     {
    2369      288120 :                         FOR( j = 0; j < num_channels; j++ )
    2370             :                         {
    2371      230496 :                             pSpar_coeffs->C_re_fx[i][j][b] = pSpar_coeffs_prev->C_re_fx[i][j][b]; /*Q22*/
    2372      230496 :                             move32();
    2373      230496 :                             pSpar_coeffs->P_re_fx[i][j][b] = pSpar_coeffs_prev->P_re_fx[i][j][b]; /*Q22*/
    2374      230496 :                             move32();
    2375             :                         }
    2376             :                     }
    2377             :                 }
    2378             :             }
    2379             : 
    2380       43036 :             IF( valid_bands[b] == 0 )
    2381             :             {
    2382             :                 Word16 i_ts;
    2383       85220 :                 FOR( i = 0; i < num_channels; i++ )
    2384             :                 {
    2385      340880 :                     FOR( j = 0; j < num_channels; j++ )
    2386             :                     {
    2387     1074112 :                         FOR( i_ts = 1; i_ts < num_md_sub_frames; i_ts++ )
    2388             :                         {
    2389      801408 :                             pSpar_coeffs->C_re_fx[i][j][( b + ( i_ts * IVAS_MAX_NUM_BANDS ) )] = pSpar_coeffs->C_re_fx[i][j][b]; /*Q22*/
    2390      801408 :                             move32();
    2391      801408 :                             pSpar_coeffs->P_re_fx[i][j][( b + ( i_ts * IVAS_MAX_NUM_BANDS ) )] = pSpar_coeffs->P_re_fx[i][j][b]; /*Q22*/
    2392      801408 :                             move32();
    2393             :                         }
    2394             :                     }
    2395             :                 }
    2396             :             }
    2397             :         }
    2398             :     }
    2399             : 
    2400      145833 :     return;
    2401             : }
    2402             : 
    2403      145833 : static void ivas_spar_md_fill_invalid_bandcoeffs(
    2404             :     ivas_band_coeffs_t *pBand_coeffs,
    2405             :     ivas_band_coeffs_t *pBand_coeffs_prev,
    2406             :     const Word16 *valid_bands, /*Q0*/
    2407             :     Word16 *base_band_age,     /*Q0*/
    2408             :     Word16 *first_valid_frame, /*Q0*/
    2409             :     const Word16 num_bands /*Q0*/ )
    2410             : {
    2411             :     Word16 j, k, b, all_valid;
    2412      145833 :     Word16 valid_band_idx[IVAS_MAX_NUM_BANDS], idx = -1;
    2413      145833 :     move16();
    2414             :     Word16 last_valid_band_idx[IVAS_MAX_NUM_BANDS];
    2415      145833 :     Word16 w_fx = 0;
    2416      145833 :     move16();
    2417             : 
    2418      145833 :     ivas_spar_plc_get_band_age( valid_bands, base_band_age, num_bands,
    2419             :                                 last_valid_band_idx, valid_band_idx, &all_valid, &idx );
    2420             : 
    2421      145833 :     assert( idx > 0 ); /* some bands should be valid */
    2422             : 
    2423      145833 :     IF( all_valid == 0 )
    2424             :     {
    2425       33903 :         FOR( b = 0; b < num_bands; b++ )
    2426             :         {
    2427             :             /* check against non zero in if and else if */
    2428       30136 :             test();
    2429       30136 :             IF( GT_16( base_band_age[b], 3 ) || ( *first_valid_frame == 0 ) ) /* old invalid bands */
    2430        2638 :             {
    2431             :                 Word16 id0, id1;
    2432             : 
    2433        2638 :                 ivas_spar_get_plc_interp_weights_fx( valid_band_idx, last_valid_band_idx[b],
    2434             :                                                      idx, b, &w_fx, &id0, &id1 );
    2435             : 
    2436       29018 :                 FOR( j = 0; j < IVAS_SPAR_MAX_CH - 1; j++ )
    2437             :                 {
    2438       26380 :                     pBand_coeffs[b].pred_re_fx[j] = L_add( Mpy_32_16_1( pBand_coeffs[id0].pred_re_fx[j], sub( MAX_WORD16, w_fx ) ), Mpy_32_16_1( pBand_coeffs[id1].pred_re_fx[j], w_fx ) ); /*Q22*/
    2439       26380 :                     move32();
    2440             :                 }
    2441             : 
    2442       21104 :                 FOR( j = 0; j < IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS; j++ )
    2443             :                 {
    2444       73864 :                     FOR( k = 0; k < IVAS_SPAR_MAX_DMX_CHS - 1; k++ )
    2445             :                     {
    2446       55398 :                         pBand_coeffs[b].C_re_fx[j][k] = L_add( Mpy_32_16_1( pBand_coeffs[id0].C_re_fx[j][k], sub( MAX_WORD16, w_fx ) ), Mpy_32_16_1( pBand_coeffs[id1].C_re_fx[j][k], w_fx ) ); /*Q22*/
    2447       55398 :                         move32();
    2448             :                     }
    2449             :                 }
    2450             : 
    2451       29018 :                 FOR( j = 0; j < IVAS_SPAR_MAX_CH - 1; j++ )
    2452             :                 {
    2453       26380 :                     pBand_coeffs[b].P_re_fx[j] = L_add( Mpy_32_16_1( pBand_coeffs[id0].P_re_fx[j], sub( MAX_WORD16, w_fx ) ), Mpy_32_16_1( pBand_coeffs[id1].P_re_fx[j], w_fx ) ); /*Q22*/
    2454       26380 :                     move32();
    2455             :                 }
    2456             :             }
    2457             :             ELSE /* young invalid bands */
    2458             :             {
    2459       27498 :                 IF( valid_bands[b] == 0 )
    2460             :                 {
    2461      158466 :                     FOR( j = 0; j < IVAS_SPAR_MAX_CH - 1; j++ )
    2462             :                     {
    2463      144060 :                         pBand_coeffs[b].pred_re_fx[j] = pBand_coeffs_prev[b].pred_re_fx[j]; /*Q22*/
    2464      144060 :                         move32();
    2465             :                     }
    2466             : 
    2467      115248 :                     FOR( j = 0; j < IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS; j++ )
    2468             :                     {
    2469      403368 :                         FOR( k = 0; k < IVAS_SPAR_MAX_DMX_CHS - 1; k++ )
    2470             :                         {
    2471      302526 :                             pBand_coeffs[b].C_re_fx[j][k] = pBand_coeffs_prev[b].C_re_fx[j][k]; /*Q22*/
    2472      302526 :                             move32();
    2473             :                         }
    2474             :                     }
    2475             : 
    2476      158466 :                     FOR( j = 0; j < IVAS_SPAR_MAX_CH - 1; j++ )
    2477             :                     {
    2478      144060 :                         pBand_coeffs[b].P_re_fx[j] = pBand_coeffs_prev[b].P_re_fx[j]; /*Q22*/
    2479      144060 :                         move32();
    2480             :                     }
    2481             :                 }
    2482             :             }
    2483             :         }
    2484             :     }
    2485             :     ELSE
    2486             :     {
    2487      142066 :         *first_valid_frame = 1;
    2488      142066 :         move16();
    2489             :     }
    2490             : 
    2491      145833 :     return;
    2492             : }
    2493             : 
    2494             : /*-----------------------------------------------------------------------------------------*
    2495             :  * Function ivas_spar_dec_compute_ramp_down_post_matrix_fx()
    2496             :  *
    2497             :  *
    2498             :  *-----------------------------------------------------------------------------------------*/
    2499             : 
    2500      187962 : static void ivas_spar_dec_compute_ramp_down_post_matrix_fx(
    2501             :     ivas_spar_md_dec_state_t *hMdDec,
    2502             :     const Word16 num_bands_out, /*Q0*/
    2503             :     const Word16 bfi,           /*Q0*/
    2504             :     const Word16 num_md_sub_frames /*Q0*/ )
    2505             : {
    2506             :     Word16 num_in_ch, num_out_ch, i, j, b;
    2507      187962 :     num_in_ch = hMdDec->spar_md_cfg.num_umx_chs;  /*Q0*/
    2508      187962 :     num_out_ch = hMdDec->spar_md_cfg.num_umx_chs; /*Q0*/
    2509      187962 :     move16();
    2510      187962 :     move16();
    2511      187962 :     IF( bfi == 0 )
    2512             :     {
    2513      181661 :         hMdDec->spar_plc_num_lost_frames = 0;
    2514      181661 :         move16();
    2515             :     }
    2516             :     ELSE
    2517             :     {
    2518        6301 :         if ( hMdDec->td_decorr_flag == 0 )
    2519             :         {
    2520           0 :             assert( 0 );
    2521             :         }
    2522             : 
    2523        6301 :         hMdDec->spar_plc_num_lost_frames = add( hMdDec->spar_plc_num_lost_frames, 1 );
    2524        6301 :         move16();
    2525        6301 :         hMdDec->spar_plc_num_lost_frames = s_min( hMdDec->spar_plc_num_lost_frames, 100 ); /*hMdDec->spar_plc_num_lost_frames is always <=100*/ /*Q0*/
    2526        6301 :         move16();
    2527             : 
    2528        6301 :         IF( GT_16( hMdDec->spar_plc_num_lost_frames, ivas_spar_dec_plc_num_frames_keep ) ) /*if control enters then ivas_spar_dec_plc_num_frames_keep<100 */
    2529             :         {
    2530             :             Word16 num_fade_frames;
    2531             :             Word16 gain_dB;
    2532             :             Word32 gain_fx;
    2533             :             Word32 post_matrix_fx[IVAS_SPAR_MAX_CH];
    2534             :             Word16 Q_post_matrix;
    2535             :             Word16 Q_gain;
    2536             :             Word16 norm_nff; /*norm of num_fade_frames*/
    2537        2038 :             num_fade_frames = s_max( sub( hMdDec->spar_plc_num_lost_frames, ivas_spar_dec_plc_num_frames_keep ), 0 );
    2538        2038 :             norm_nff = norm_s( num_fade_frames );
    2539        2038 :             gain_dB = negate( imult1616( s_min( num_fade_frames, ivas_spar_dec_plc_max_num_frames_ramp_down ), ivas_spar_dec_plc_per_frame_ramp_down_gain_dB ) ); /*abs(gain_dB)<99*/ /*Q(gain_dB)=7Q24*/
    2540        2038 :             Word16 exp_gain = 0;
    2541        2038 :             move16();                                                                                                                       /*stores exponent for gain_fx*/
    2542        2038 :             gain_fx = BASOP_util_Pow2( Mult_32_16( imult3216( 13421773 /*=2^28/20*/, gain_dB ), 27213 /*=log2(10)*2^13*/ ), 5, &exp_gain ); /*Q_gain*/
    2543        2038 :             Q_gain = sub( 31, exp_gain );
    2544       24456 :             FOR( i = 0; i < IVAS_SPAR_MAX_CH; i++ )
    2545             :             {
    2546       22418 :                 post_matrix_fx[i] = add( shl( 1, norm_nff ), mult( s_min( mult( shl( num_fade_frames, norm_nff ), 3640 /* 1 / ivas_spar_dec_plc_num_frames_fade_out in Q15 */ ), shl( 1, norm_nff ) ), shl( sub( ivas_spar_dec_plc_spatial_target[i], 1 ), 15 ) ) ); /*Q=norm_nff*/
    2547       22418 :                 move32();
    2548       22418 :                 post_matrix_fx[i] = Mult_32_16( gain_fx, extract_l( post_matrix_fx[i] ) ); /*Q_gain+norm_nff-15*/
    2549       22418 :                 move32();
    2550             :             }
    2551        2038 :             Q_post_matrix = sub( add( Q_gain, norm_nff ), 15 );
    2552             :             /* apply the post matrix */
    2553        2038 :             hMdDec->Q_mixer_mat = sub( add( Q_post_matrix, hMdDec->Q_mixer_mat ), 31 );
    2554        2038 :             move16();
    2555       10190 :             FOR( Word16 i_ts = 0; i_ts < num_md_sub_frames; i_ts++ )
    2556             :             {
    2557       40760 :                 FOR( i = 0; i < num_out_ch; i++ )
    2558             :                 {
    2559      163040 :                     FOR( j = 0; j < num_in_ch; j++ )
    2560             :                     {
    2561     1611648 :                         FOR( b = 0; b < num_bands_out; b++ )
    2562             :                         {
    2563     1481216 :                             hMdDec->mixer_mat_fx[i][j][( b + ( i_ts * IVAS_MAX_NUM_BANDS ) )] = L_shl( Mult_32_32( hMdDec->mixer_mat_fx[i][j][( b + ( i_ts * IVAS_MAX_NUM_BANDS ) )], post_matrix_fx[i] ), sub( Q30, hMdDec->Q_mixer_mat ) ); // Q30
    2564     1481216 :                             move32();
    2565             :                         }
    2566             :                     }
    2567             :                 }
    2568             :             }
    2569        2038 :             hMdDec->Q_mixer_mat = Q30;
    2570        2038 :             move16();
    2571             :         }
    2572             :     }
    2573             : 
    2574      187962 :     return;
    2575             : }
    2576             : 
    2577             : 
    2578             : /*-----------------------------------------------------------------------------------------*
    2579             :  * Function ivas_spar_unquant_dtx_indicies()
    2580             :  *
    2581             :  * Unquantize SPAR MD DYX indices
    2582             :  *-----------------------------------------------------------------------------------------*/
    2583         557 : static void ivas_spar_unquant_dtx_indicies(
    2584             :     ivas_spar_md_t *pSpar_md,
    2585             :     const Word16 nB, /*Q0*/
    2586             :     const Word16 bw, /*Q0*/
    2587             :     Word16 *ndm_per_band /*Q0*/ )
    2588             : {
    2589             :     Word16 i, b;
    2590             :     Word16 q_lvl;
    2591             :     Word32 val_fx;
    2592             :     Word16 idx;
    2593             :     Word32 pr_min_max_fx[2];
    2594             : 
    2595         557 :     pr_min_max_fx[0] = pSpar_md->min_max_fx[0]; /*Q28*/
    2596         557 :     move32();
    2597         557 :     pr_min_max_fx[1] = pSpar_md->min_max_fx[1]; /*Q28*/
    2598         557 :     move32();
    2599             : 
    2600        1671 :     FOR( b = 0; b < nB; b++ )
    2601             :     {
    2602        4456 :         FOR( i = 0; i < FOA_CHANNELS - 1; i++ )
    2603             :         {
    2604        3342 :             q_lvl = dtx_pr_real_q_levels[( ndm_per_band[( bw * b )] - 1 )][i]; /*Q0*/
    2605        3342 :             move16();
    2606             : 
    2607        3342 :             idx = pSpar_md->band_coeffs_idx[b].pred_index_re[i]; /*Q0*/
    2608        3342 :             move16();
    2609        3342 :             ivas_deindex_real_index_fx( &idx, q_lvl, pr_min_max_fx[0], pr_min_max_fx[1], &val_fx, 1 );
    2610        3342 :             pSpar_md->band_coeffs[b].pred_re_fx[i] = val_fx; /*Q22*/
    2611        3342 :             move32();
    2612             :         }
    2613             : 
    2614        3820 :         FOR( i = 0; i < ( FOA_CHANNELS - ndm_per_band[( bw - b )] ); i++ )
    2615             :         {
    2616        2706 :             q_lvl = dtx_pd_real_q_levels[( ndm_per_band[( bw * b )] - 1 )][i]; /*Q0*/
    2617        2706 :             move16();
    2618             : 
    2619        2706 :             idx = pSpar_md->band_coeffs_idx[b].decd_index_re[i]; /*Q0*/
    2620        2706 :             move16();
    2621        2706 :             ivas_deindex_real_index_fx( &idx, q_lvl, dtx_pd_real_min_max_fx[0], dtx_pd_real_min_max_fx[1], &val_fx, 1 );
    2622        2706 :             pSpar_md->band_coeffs[b].P_re_fx[i] = val_fx; /*Q22*/
    2623        2706 :             move32();
    2624             :         }
    2625             :     }
    2626             : 
    2627         557 :     return;
    2628             : }
    2629             : 
    2630             : /*-----------------------------------------------------------------------------------------*
    2631             :  * Function ivas_parse_parameter_bitstream_dtx()
    2632             :  *
    2633             :  * parse DTX bitstream parameters
    2634             :  *-----------------------------------------------------------------------------------------*/
    2635         557 : static void ivas_parse_parameter_bitstream_dtx(
    2636             :     ivas_spar_md_t *pSpar_md,
    2637             :     Decoder_State *st0,       /* i/o: decoder state structure - for bitstream handling*/
    2638             :     const Word16 bw,          /*Q0*/
    2639             :     const Word16 num_bands,   /*Q0*/
    2640             :     Word16 *num_dmx_per_band, /*Q0*/
    2641             :     Word16 *num_dec_per_band /*Q0*/ )
    2642             : {
    2643             :     Word16 i, j, ndec, ndm;
    2644             :     Word32 val_fx;
    2645             :     Word16 idx;
    2646             :     Word32 pr_min_max_fx[2];
    2647             :     Word16 pr_q_lvls, pr, pd, pd_q_lvls, pr_pd_bits;
    2648             :     Word16 zero_pad_bits, sid_bits_len;
    2649             : #ifdef NONBE_FIX_1052_SBA_EXT
    2650             :     Word16 sba_spar_bitlen;
    2651             : #endif
    2652             : 
    2653         557 :     sid_bits_len = st0->next_bit_pos; /*Q0*/
    2654         557 :     move16();
    2655         557 :     pr_min_max_fx[0] = pSpar_md->min_max_fx[0]; /*Q28*/
    2656         557 :     move32();
    2657         557 :     pr_min_max_fx[1] = pSpar_md->min_max_fx[1]; /*Q28*/
    2658         557 :     move32();
    2659             : 
    2660        1671 :     FOR( i = 0; i < num_bands; i++ )
    2661             :     {
    2662        1114 :         ndec = num_dec_per_band[( bw * i )];
    2663        1114 :         move16();
    2664        1114 :         ndm = num_dmx_per_band[( bw * i )];
    2665        1114 :         move16();
    2666             : 
    2667        4456 :         FOR( j = 0; j < FOA_CHANNELS - 1; j++ )
    2668             :         {
    2669             :             Word16 pr_idx_1, pr_idx_2, pd_idx_1, pd_idx_2;
    2670             :             UWord16 value;
    2671             : 
    2672        3342 :             pr_idx_1 = pr_pr_idx_pairs[ndm - 1][j][0]; /*Q0*/
    2673        3342 :             move16();
    2674        3342 :             pr_idx_2 = pr_pr_idx_pairs[ndm - 1][j][1]; /*Q0*/
    2675        3342 :             move16();
    2676        3342 :             pd_idx_1 = pr_pd_idx_pairs[ndm - 1][j][0]; /*Q0*/
    2677        3342 :             move16();
    2678        3342 :             pd_idx_2 = pr_pd_idx_pairs[ndm - 1][j][1]; /*Q0*/
    2679        3342 :             move16();
    2680             : 
    2681        3342 :             test();
    2682        3342 :             test();
    2683        3342 :             test();
    2684        3342 :             IF( pr_idx_1 != 0 || pd_idx_1 != 0 || pr_idx_2 != 0 || pd_idx_2 != 0 )
    2685             :             {
    2686        3342 :                 pr_q_lvls = dtx_pr_real_q_levels[ndm - 1][pd_idx_1 - 1]; /*Q0*/
    2687        3342 :                 move16();
    2688             : 
    2689        3342 :                 IF( GT_16( add( j, 1 ), ndec ) )
    2690             :                 {
    2691         636 :                     pd_q_lvls = 1;
    2692         636 :                     move16();
    2693             :                 }
    2694             :                 ELSE
    2695             :                 {
    2696        2706 :                     pd_q_lvls = dtx_pd_real_q_levels[ndm - 1][pd_idx_2 - 1]; /*Q0*/
    2697        2706 :                     move16();
    2698             :                 }
    2699             : 
    2700        3342 :                 pr_pd_bits = ivas_get_bits_to_encode( L_mult0( pd_q_lvls, pr_q_lvls ) ); /*Q0*/
    2701             : 
    2702        3342 :                 value = get_next_indice_fx( st0, pr_pd_bits ); /*Q0*/
    2703             : 
    2704        3342 :                 IF( value != 0 )
    2705             :                 {
    2706        3342 :                     pr = idiv1616( value, pd_q_lvls ); /*Q0*/
    2707             :                 }
    2708             :                 ELSE
    2709             :                 {
    2710           0 :                     pr = 0;
    2711           0 :                     move16();
    2712             :                 }
    2713        3342 :                 pd = extract_l( L_sub( value, i_mult( pr, pd_q_lvls ) ) );
    2714        3342 :                 val_fx = dtx_pd_real_min_max_fx[0]; /*Q28*/
    2715        3342 :                 move32();
    2716        3342 :                 ivas_quantise_real_values_fx( &val_fx, pd_q_lvls, dtx_pd_real_min_max_fx[0], dtx_pd_real_min_max_fx[1], &idx, &val_fx, 1 );
    2717        3342 :                 pd = add( pd, idx );
    2718             : 
    2719        3342 :                 val_fx = pr_min_max_fx[0]; /*Q28*/
    2720        3342 :                 move32();
    2721        3342 :                 ivas_quantise_real_values_fx( &val_fx, pr_q_lvls, pr_min_max_fx[0], pr_min_max_fx[1], &idx, &val_fx, 1 );
    2722        3342 :                 pr = add( pr, idx );
    2723             : 
    2724        3342 :                 if ( LE_16( add( j, 1 ), ndec ) )
    2725             :                 {
    2726        2706 :                     pSpar_md->band_coeffs_idx[i].decd_index_re[pd_idx_2 - 1] = pd; /*Q0*/
    2727        2706 :                     move16();
    2728             :                 }
    2729             : 
    2730        3342 :                 pSpar_md->band_coeffs_idx[i].pred_index_re[pd_idx_1 - 1] = pr; /*Q0*/
    2731        3342 :                 move16();
    2732             :             }
    2733             :         }
    2734             :     }
    2735             : 
    2736         557 :     sid_bits_len = sub( st0->next_bit_pos, sid_bits_len );
    2737             : #ifdef NONBE_FIX_1052_SBA_EXT
    2738         557 :     sba_spar_bitlen = ivas_sba_spar_sid_bitlen_fx( num_dmx_per_band[0] );
    2739         557 :     zero_pad_bits = sub( sba_spar_bitlen, sid_bits_len );
    2740             : #else
    2741             :     zero_pad_bits = sub( ( SPAR_DTX_BANDS * SPAR_SID_BITS_TAR_PER_BAND ), sid_bits_len );
    2742             : #endif
    2743         557 :     assert( zero_pad_bits >= 0 );
    2744         557 :     if ( EQ_16( num_dmx_per_band[0], 2 ) )
    2745             :     {
    2746         318 :         zero_pad_bits = sub( zero_pad_bits, 1 );
    2747             :     }
    2748             : 
    2749        1511 :     FOR( j = 0; j < zero_pad_bits; j++ )
    2750             :     {
    2751         954 :         get_next_indice_fx( st0, 1 );
    2752             :     }
    2753             : 
    2754         557 :     ivas_spar_unquant_dtx_indicies( pSpar_md, num_bands, bw, num_dmx_per_band );
    2755             : 
    2756         557 :     return;
    2757             : }
    2758             : 
    2759             : /*-----------------------------------------------------------------------------------------*
    2760             :  * Function ivas_deindex_real_index()
    2761             :  *
    2762             :  * Deindex real index
    2763             :  *-----------------------------------------------------------------------------------------*/
    2764             : 
    2765             : 
    2766     3608904 : static ivas_error ivas_deindex_real_index_fx(
    2767             :     const Word16 *index,    /*Q0*/
    2768             :     const Word16 q_levels,  /*Q0*/
    2769             :     const Word32 min_value, /*Q28*/
    2770             :     const Word32 max_value, /*Q28*/
    2771             :     Word32 *quant,          /*Q22*/
    2772             :     const Word16 dim /*Q0*/ )
    2773             : {
    2774             :     Word16 i;
    2775             :     Word32 q_step_fx;
    2776     3608904 :     IF( q_levels == 0 )
    2777             :     {
    2778           0 :         return IVAS_ERR_INTERNAL;
    2779             :     }
    2780             : 
    2781     3608904 :     IF( EQ_16( q_levels, 1 ) )
    2782             :     {
    2783      992060 :         FOR( i = 0; i < dim; i++ )
    2784             :         {
    2785      441144 :             quant[i] = 0;
    2786      441144 :             move32();
    2787             :         }
    2788             :     }
    2789             :     ELSE
    2790             :     {
    2791     3057988 :         q_step_fx = L_sub( max_value, min_value );
    2792     3057988 :         q_step_fx = Mpy_32_32( q_step_fx, one_by_q_level[q_levels - 1] /*Q31*/ ); /*Q28*/
    2793    16773260 :         FOR( i = 0; i < dim; i++ )
    2794             :         {
    2795    13715272 :             quant[i] = Mpy_32_32( L_shl( index[i], 31 - 6 ), q_step_fx ); //(25+28)-31 = 22
    2796    13715272 :             move32();
    2797             :         }
    2798             :     }
    2799             : 
    2800     3608904 :     return IVAS_ERR_OK;
    2801             : }
    2802             : 
    2803             : 
    2804      135969 : void ivas_spar_to_dirac_fx(
    2805             :     Decoder_Struct *st_ivas,
    2806             :     ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle      Q0*/
    2807             :     const Word16 dtx_vad,             /* i  : DTX frame flag              Q0*/
    2808             :     const Word16 num_bands_out,       /* i  : number of output bands      Q0*/
    2809             :     const Word16 bw,                  /* i  : band joining factor         Q0*/
    2810             :     const Word16 dyn_active_w_flag )
    2811             : {
    2812             :     DIRAC_DEC_HANDLE hDirAC;
    2813             :     Word16 start_band, end_band, band, qmf_band_start, qmf_band_end;
    2814             :     Word16 block, b;
    2815             :     Word16 *band_grouping;
    2816             : 
    2817             :     Word32 diffuseness_fx[IVAS_MAX_NUM_BANDS];
    2818             :     Word16 sba_order_internal;
    2819             : 
    2820             :     Word32 azi_dirac_fx[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES];
    2821             : 
    2822             :     Word32 ele_dirac_fx[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES];
    2823             :     Word16 azi[IVAS_MAX_NUM_BANDS];
    2824             :     Word16 ele[IVAS_MAX_NUM_BANDS];
    2825             : 
    2826             :     Word32 dvx_fx[IVAS_MAX_NUM_BANDS], dvy_fx[IVAS_MAX_NUM_BANDS], dvz_fx[IVAS_MAX_NUM_BANDS];
    2827             : 
    2828             :     Word32 radius_fx;
    2829             : 
    2830             :     Word32 en_ratio_fx, res_pow_fx;
    2831             :     Word16 en_ratio_q;
    2832             :     Word16 num_slots_in_subfr;
    2833             :     Word16 tmp_write_idx_param_band;
    2834             :     Word16 tmp_write_idx_band;
    2835             : 
    2836             :     Word32 pred_re_20ms_fx[IVAS_MAX_NUM_BANDS][IVAS_SPAR_MAX_CH - 1];
    2837             :     Word16 pred_idx;
    2838             :     Word16 *dirac_to_spar_md_bands;
    2839             :     Word16 enc_param_start_band;
    2840             :     Word16 active_w_vlbr;
    2841             :     Word16 i, num_subframes;
    2842             :     Word16 active_w;
    2843             :     SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom;
    2844             : 
    2845      135969 :     test();
    2846      135969 :     active_w = EQ_16( dyn_active_w_flag, 1 ) || EQ_16( hMdDec->spar_md_cfg.active_w, 1 );
    2847      135969 :     sba_order_internal = s_min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER );
    2848      135969 :     move16();
    2849      135969 :     start_band = 0;
    2850      135969 :     move16();
    2851      135969 :     end_band = idiv1616( s_min( num_bands_out, SPAR_DIRAC_SPLIT_START_BAND ), bw ); /*Q0*/
    2852             : 
    2853      135969 :     hDirAC = st_ivas->hDirAC;
    2854      135969 :     hSpatParamRendCom = st_ivas->hSpatParamRendCom;
    2855             : 
    2856      135969 :     dirac_to_spar_md_bands = st_ivas->hSpar->dirac_to_spar_md_bands; /*Q0*/
    2857      135969 :     move16();
    2858             : 
    2859      135969 :     IF( st_ivas->hSpar->enc_param_start_band > 0 )
    2860             :     {
    2861      129775 :         enc_param_start_band = idiv1616( st_ivas->hSpar->enc_param_start_band, bw ); /*Q0*/
    2862             :     }
    2863             :     ELSE
    2864             :     {
    2865        6194 :         enc_param_start_band = 0;
    2866        6194 :         move16();
    2867             :     }
    2868             : 
    2869      135969 :     IF( LT_32( st_ivas->hDecoderConfig->ivas_total_brate, IVAS_24k4 ) )
    2870             :     {
    2871       11461 :         active_w_vlbr = 1;
    2872       11461 :         move16();
    2873             :     }
    2874             :     ELSE
    2875             :     {
    2876      124508 :         active_w_vlbr = 0;
    2877      124508 :         move16();
    2878             :     }
    2879             : 
    2880      135969 :     test();
    2881      135969 :     IF( hDirAC != NULL && ivas_get_hodirac_flag_fx( st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->sba_analysis_order ) == 0 )
    2882             :     {
    2883       84348 :         band_grouping = hDirAC->band_grouping;
    2884             : 
    2885       84348 :         IF( st_ivas->hDirAC->hConfig->dec_param_estim )
    2886             :         {
    2887       47657 :             num_slots_in_subfr = CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES;
    2888       47657 :             move16();
    2889             :         }
    2890             :         ELSE
    2891             :         {
    2892       36691 :             num_slots_in_subfr = 1;
    2893       36691 :             move16();
    2894             :         }
    2895             : 
    2896      759132 :         FOR( band = start_band; band < end_band; band++ )
    2897             :         {
    2898             :             Word32 PR_fx[3], Pd_fx[3], dvnorm_fx, g_pred_fx;
    2899             :             Word16 q_g_pred;
    2900             :             Word16 q_dvnorm;
    2901      674784 :             PR_fx[0] = hMdDec->spar_md.band_coeffs[band].pred_re_fx[2]; /*Q22*/
    2902      674784 :             move32();
    2903      674784 :             PR_fx[1] = hMdDec->spar_md.band_coeffs[band].pred_re_fx[0]; /*Q22*/
    2904      674784 :             move32();
    2905      674784 :             PR_fx[2] = hMdDec->spar_md.band_coeffs[band].pred_re_fx[1]; /*Q22*/
    2906      674784 :             move32();
    2907      674784 :             g_pred_fx = L_add( L_add( Mpy_32_32( PR_fx[0], PR_fx[0] ), Mpy_32_32( PR_fx[1], PR_fx[1] ) ), Mpy_32_32( PR_fx[2], PR_fx[2] ) ); /*q_g_pred*/
    2908      674784 :             q_g_pred = Q22 + Q22 - Q31;
    2909      674784 :             move16();
    2910      674784 :             q_dvnorm = sub( Q31, q_g_pred );
    2911      674784 :             q_g_pred = q_dvnorm;
    2912      674784 :             move16();
    2913      674784 :             IF( LE_32( g_pred_fx, EPSILON_FIX ) )
    2914             :             {
    2915       29786 :                 dvx_fx[band] = ONE_IN_Q22; /*Q22*/
    2916       29786 :                 move32();
    2917       29786 :                 dvy_fx[band] = 0;
    2918       29786 :                 move32();
    2919       29786 :                 dvz_fx[band] = 0;
    2920       29786 :                 move32();
    2921             : 
    2922       29786 :                 azi[band] = 0;
    2923       29786 :                 move16();
    2924       29786 :                 ele[band] = 0;
    2925       29786 :                 move16();
    2926       29786 :                 q_g_pred = Q22;
    2927       29786 :                 move16();
    2928       29786 :                 q_dvnorm = Q22;
    2929       29786 :                 move16();
    2930             :             }
    2931             :             ELSE
    2932             :             {
    2933      644998 :                 dvnorm_fx = ISqrt32( g_pred_fx, &q_dvnorm ); /*Q31 - q_dvnorm*/
    2934      644998 :                 g_pred_fx = Sqrt32( g_pred_fx, &q_g_pred );  /*Q31 - q_g_pred*/
    2935      644998 :                 IF( q_g_pred < 0 )
    2936             :                 {
    2937      280992 :                     g_pred_fx = L_shr( g_pred_fx, negate( q_g_pred ) );
    2938      280992 :                     q_g_pred = 0;
    2939      280992 :                     move16();
    2940             :                 }
    2941             : 
    2942      644998 :                 dvx_fx[band] = Mpy_32_32( PR_fx[0], dvnorm_fx ); /*q_1*/
    2943      644998 :                 move32();
    2944      644998 :                 dvy_fx[band] = Mpy_32_32( PR_fx[1], dvnorm_fx ); /*q_1*/
    2945      644998 :                 move32();
    2946      644998 :                 dvz_fx[band] = Mpy_32_32( PR_fx[2], dvnorm_fx ); /*q_1*/
    2947      644998 :                 move32();
    2948      644998 :                 Word16 q_1 = sub( add( 22, sub( 31, q_dvnorm ) ), 31 );
    2949             : 
    2950      644998 :                 Word32 temp = L_add( Mpy_32_32( dvx_fx[band], dvx_fx[band] ), Mpy_32_32( dvy_fx[band], dvy_fx[band] ) ); /*q2*/
    2951      644998 :                 Word16 q2 = sub( add( q_1, q_1 ), 31 );
    2952      644998 :                 Word16 q_temp = sub( 31, q2 );
    2953      644998 :                 radius_fx = Sqrt32( temp, &q_temp );
    2954             : 
    2955      644998 :                 Word16 check_azi_fx = BASOP_util_atan2( dvy_fx[band], dvx_fx[band], 0 ); /*Q13*/
    2956             : 
    2957      644998 :                 Word32 azi_intermediate = Mpy_32_16_1( DEG180_BY_PI_Q24, check_azi_fx );
    2958             : 
    2959      644998 :                 azi_intermediate = L_add( azi_intermediate, ONE_IN_Q21 ); /*Q22*/
    2960             : 
    2961             :                 Word16 azi_res;
    2962      644998 :                 IF( azi_intermediate < 0 )
    2963             :                 {
    2964      438948 :                     azi_res = negate( extract_l( L_shr( L_negate( azi_intermediate ), 22 ) ) ); /*Q0*/
    2965             :                 }
    2966             :                 ELSE
    2967             :                 {
    2968      206050 :                     azi_res = extract_l( L_shr( azi_intermediate, 22 ) ); /*Q0*/
    2969             :                 }
    2970             : 
    2971      644998 :                 Word16 check_ele_fx = BASOP_util_atan2( dvz_fx[band], radius_fx, sub( add( 9, q_dvnorm ), q_temp ) ); /*Q13*/
    2972      644998 :                 Word32 ele_intermediate = Mpy_32_16_1( DEG180_BY_PI_Q24, check_ele_fx );
    2973      644998 :                 ele_intermediate = L_add( ele_intermediate, ONE_IN_Q21 ); /*Q22*/
    2974             : 
    2975             :                 Word16 ele_res;
    2976      644998 :                 IF( ele_intermediate < 0 )
    2977             :                 {
    2978      269025 :                     ele_res = negate( extract_l( L_shr( L_negate( ele_intermediate ), 22 ) ) ); /*Q0*/
    2979             :                 }
    2980             :                 ELSE
    2981             :                 {
    2982      375973 :                     ele_res = extract_l( L_shr( ele_intermediate, 22 ) ); /*Q0*/
    2983             :                 }
    2984             : 
    2985      644998 :                 azi[band] = s_max( -180, s_min( 180, azi_res ) ); /*Q0*/
    2986      644998 :                 move16();
    2987      644998 :                 ele[band] = s_max( -90, s_min( 180, ele_res ) ); /*Q0*/
    2988      644998 :                 move16();
    2989             :             }
    2990             : 
    2991      674784 :             IF( EQ_16( st_ivas->nchan_transport, 1 ) )
    2992             :             {
    2993             :                 Word32 w_en_norm_fx, f_scale_fx;
    2994             :                 Word16 q_w_en_norm_fx;
    2995      168960 :                 IF( active_w )
    2996             :                 {
    2997      168960 :                     IF( dtx_vad == 0 )
    2998             :                     {
    2999         888 :                         f_scale_fx = IVAS_ACTIVEW_DM_F_SCALE_DTX_FX; /*Q31*/
    3000         888 :                         move32();
    3001             :                     }
    3002             :                     ELSE
    3003             :                     {
    3004      168072 :                         IF( active_w_vlbr )
    3005             :                         {
    3006       67312 :                             f_scale_fx = IVAS_ACTIVEW_DM_F_SCALE_VLBR_FX; /*Q31*/
    3007       67312 :                             move32();
    3008             :                         }
    3009             :                         ELSE
    3010             :                         {
    3011      100760 :                             f_scale_fx = IVAS_ACTIVEW_DM_F_SCALE_FX; /*Q31*/
    3012      100760 :                             move32();
    3013             :                         }
    3014             :                     }
    3015             :                 }
    3016             :                 ELSE
    3017             :                 {
    3018           0 :                     f_scale_fx = 0;
    3019           0 :                     move32();
    3020             :                 }
    3021             : 
    3022      168960 :                 Word32 temp_result = Mpy_32_32( Mpy_32_32( f_scale_fx, g_pred_fx ), g_pred_fx ); /*Q31 - q_g_pred*/
    3023      168960 :                 temp_result = L_sub( L_shr( ONE_IN_Q31, q_g_pred ), temp_result );
    3024             : 
    3025      168960 :                 w_en_norm_fx = Mpy_32_32( temp_result, temp_result ); /*q_w_en_norm_fx*/
    3026      168960 :                 q_w_en_norm_fx = add( q_g_pred, q_g_pred );
    3027             : 
    3028      168960 :                 Pd_fx[0] = hMdDec->spar_md.band_coeffs[band].P_re_fx[1]; /*Q22*/
    3029      168960 :                 move32();
    3030      168960 :                 Pd_fx[1] = hMdDec->spar_md.band_coeffs[band].P_re_fx[0]; /*Q22*/
    3031      168960 :                 move32();
    3032      168960 :                 Pd_fx[2] = hMdDec->spar_md.band_coeffs[band].P_re_fx[2]; /*Q22*/
    3033      168960 :                 move32();
    3034             : 
    3035      168960 :                 en_ratio_fx = L_add( L_add( Mpy_32_32( PR_fx[0], PR_fx[0] ), Mpy_32_32( PR_fx[1], PR_fx[1] ) ), Mpy_32_32( PR_fx[2], PR_fx[2] ) );        // 22+22-31 = 13
    3036      168960 :                 Word32 Pd_temp_res = L_add( L_add( Mpy_32_32( Pd_fx[0], Pd_fx[0] ), Mpy_32_32( Pd_fx[1], Pd_fx[1] ) ), Mpy_32_32( Pd_fx[2], Pd_fx[2] ) ); // q = 22+22-31 = 13
    3037             : 
    3038      168960 :                 res_pow_fx = L_add( L_shr( w_en_norm_fx, sub( sub( 31, q_w_en_norm_fx ), 13 ) ), L_add( en_ratio_fx, Pd_temp_res ) ); /*Q13*/
    3039             : 
    3040      168960 :                 res_pow_fx = L_shr( res_pow_fx, 1 ); /*Q13*/
    3041             : 
    3042      168960 :                 hMdDec->spar_md.en_ratio_slow_fx[band] = L_add( Mpy_32_32( 1610612736 /*0.75f in Q31*/, hMdDec->spar_md.en_ratio_slow_fx[band] ), Mpy_32_32( 536870912 /*0.25f in Q31*/, en_ratio_fx ) ); /*Q13*/
    3043      168960 :                 move32();
    3044             : 
    3045      168960 :                 hMdDec->spar_md.ref_pow_slow_fx[band] = L_add( Mpy_32_32( 1610612736 /*0.75f in Q31*/, hMdDec->spar_md.ref_pow_slow_fx[band] ), Mpy_32_32( 536870912 /*0.25f in Q31*/, res_pow_fx ) ); /*Q13*/
    3046      168960 :                 move32();
    3047             : 
    3048      168960 :                 en_ratio_q = 31 - 13;
    3049      168960 :                 move16();
    3050      168960 :                 en_ratio_fx = Sqrt32( hMdDec->spar_md.en_ratio_slow_fx[band], &en_ratio_q ); /*Q31 - en_ratio_q*/
    3051      168960 :                 IF( en_ratio_q < 0 )
    3052             :                 {
    3053       75732 :                     en_ratio_fx = L_shr( en_ratio_fx, negate( en_ratio_q ) ); /*Q31*/
    3054       75732 :                     en_ratio_q = 0;
    3055       75732 :                     move16();
    3056             :                 }
    3057      168960 :                 Word32 en_ratio_fx_scaled = L_shr( en_ratio_fx, ( sub( sub( 31, en_ratio_q ), 13 ) ) ); /*Q13*/
    3058      168960 :                 IF( GT_32( en_ratio_fx_scaled, hMdDec->spar_md.ref_pow_slow_fx[band] ) )
    3059             :                 {
    3060       38537 :                     diffuseness_fx[band] = 0;
    3061       38537 :                     move32();
    3062             :                 }
    3063      130423 :                 ELSE IF( en_ratio_fx_scaled == 0 )
    3064             :                 {
    3065        2544 :                     diffuseness_fx[band] = ONE_IN_Q30; /*1.0f in Q30*/
    3066        2544 :                     move32();
    3067             :                 }
    3068      127879 :                 ELSE IF( EQ_32( en_ratio_fx_scaled, hMdDec->spar_md.ref_pow_slow_fx[band] ) )
    3069             :                 {
    3070          56 :                     diffuseness_fx[band] = ONE_IN_Q30; /*1.0f in Q30*/
    3071          56 :                     move32();
    3072             :                 }
    3073             :                 ELSE
    3074             :                 {
    3075      127823 :                     en_ratio_fx = divide3232( en_ratio_fx_scaled, L_add( hMdDec->spar_md.ref_pow_slow_fx[band], EPSILON_FX ) ); /*Q15*/
    3076      127823 :                     en_ratio_fx = L_shl( en_ratio_fx, 15 );                                                                     /*Q30*/
    3077      127823 :                     diffuseness_fx[band] = L_sub( ONE_IN_Q30, en_ratio_fx );
    3078      127823 :                     move32();
    3079             :                 }
    3080             :             }
    3081             :             ELSE
    3082             :             {
    3083      505824 :                 en_ratio_fx = L_add( L_add( Mpy_32_32( PR_fx[0], PR_fx[0] ), Mpy_32_32( PR_fx[1], PR_fx[1] ) ), Mpy_32_32( PR_fx[2], PR_fx[2] ) ); /*Q13*/
    3084             : 
    3085      505824 :                 hMdDec->spar_md.en_ratio_slow_fx[band] = L_add( Mpy_32_32( 1610612736 /*0.75f in Q31*/, hMdDec->spar_md.en_ratio_slow_fx[band] ), Mpy_32_32( 536870912 /*0.25f in Q31*/, en_ratio_fx ) );
    3086      505824 :                 move32();
    3087             : 
    3088      505824 :                 en_ratio_q = 31 - 13;
    3089      505824 :                 move16();
    3090      505824 :                 en_ratio_fx = Sqrt32( hMdDec->spar_md.en_ratio_slow_fx[band], &en_ratio_q ); /*Q31 - en_ratio_q*/
    3091      505824 :                 IF( en_ratio_q < 0 )
    3092             :                 {
    3093      222224 :                     en_ratio_fx = L_shr( en_ratio_fx, ( -en_ratio_q ) ); /*Q31*/
    3094      222224 :                     en_ratio_q = 0;
    3095      222224 :                     move16();
    3096             :                 }
    3097      505824 :                 Word32 en_ratio_fx_scaled = L_shr( en_ratio_fx, 1 ); /*Q30*/
    3098      505824 :                 IF( GT_32( en_ratio_fx_scaled, ONE_IN_Q30 ) )
    3099             :                 {
    3100           0 :                     diffuseness_fx[band] = 0;
    3101           0 :                     move32();
    3102             :                 }
    3103             :                 ELSE
    3104             :                 {
    3105      505824 :                     diffuseness_fx[band] = L_sub( ONE_IN_Q30, en_ratio_fx_scaled ); /*Q30*/
    3106      505824 :                     move32();
    3107             :                 }
    3108             :             }
    3109             :         }
    3110             : 
    3111      759132 :         FOR( band = start_band; band < end_band; band++ )
    3112             :         {
    3113             :             Word16 azi_dith, ele_dith;
    3114      674784 :             tmp_write_idx_param_band = hDirAC->spar_to_dirac_write_idx;
    3115      674784 :             move16();
    3116             : 
    3117      674784 :             en_ratio_fx = L_sub( ONE_IN_Q30, diffuseness_fx[band] ); /*Q30*/
    3118             : 
    3119      674784 :             masa_sq_fx( L_sub( ONE_IN_Q30, en_ratio_fx ), diffuseness_thresholds_fx, DIRAC_DIFFUSE_LEVELS );
    3120             : 
    3121             : 
    3122      674784 :             qmf_band_start = band_grouping[band]; /*Q0*/
    3123      674784 :             move16();
    3124      674784 :             qmf_band_end = band_grouping[band + 1]; /*Q0*/
    3125      674784 :             move16();
    3126             : 
    3127     3373920 :             FOR( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ )
    3128             :             {
    3129             :                 Word16 ts_start, ts_end, ts;
    3130             : 
    3131     2699136 :                 ts_start = DirAC_block_grouping[block]; /*Q0*/
    3132     2699136 :                 move16();
    3133     2699136 :                 ts_end = DirAC_block_grouping[block + 1];
    3134     2699136 :                 move16();
    3135     6410448 :                 FOR( b = qmf_band_start; b < qmf_band_end; b++ ) /*Q0*/
    3136             :                 {
    3137             : 
    3138     3711312 :                     azi_dith = azi[band]; /*Q0*/
    3139     3711312 :                     move16();
    3140     3711312 :                     ele_dith = ele[band]; /*Q0*/
    3141     3711312 :                     move16();
    3142             : 
    3143             : 
    3144     3711312 :                     hSpatParamRendCom->energy_ratio1_fx[block][b] = en_ratio_fx; /*Q30*/
    3145     3711312 :                     move32();
    3146     3711312 :                     tmp_write_idx_band = tmp_write_idx_param_band; /*Q0*/
    3147     3711312 :                     move16();
    3148             : 
    3149     3711312 :                     IF( hDirAC->hConfig->dec_param_estim == FALSE )
    3150             :                     {
    3151     1614404 :                         hSpatParamRendCom->elevation[tmp_write_idx_band][b] = ele_dith; /*Q0*/
    3152     1614404 :                         move16();
    3153     1614404 :                         hSpatParamRendCom->azimuth[tmp_write_idx_band][b] = azi_dith; /*Q0*/
    3154     1614404 :                         move16();
    3155             : 
    3156     1614404 :                         hSpatParamRendCom->diffuseness_vector_fx[tmp_write_idx_band][b] = diffuseness_fx[band]; /*Q30*/
    3157     1614404 :                         move32();
    3158             :                     }
    3159             :                     ELSE
    3160             :                     {
    3161    10484540 :                         FOR( ts = ts_start; ts < ts_end; ts++ )
    3162             :                         {
    3163     8387632 :                             hSpatParamRendCom->elevation[tmp_write_idx_band][b] = ele_dith; /*Q0*/
    3164     8387632 :                             move16();
    3165     8387632 :                             hSpatParamRendCom->azimuth[tmp_write_idx_band][b] = azi_dith; /*Q0*/
    3166     8387632 :                             move16();
    3167             : 
    3168     8387632 :                             hSpatParamRendCom->diffuseness_vector_fx[tmp_write_idx_band][b] = diffuseness_fx[band]; /*Q30*/
    3169     8387632 :                             move32();
    3170     8387632 :                             tmp_write_idx_band = add( tmp_write_idx_band, 1 ) % hSpatParamRendCom->dirac_md_buffer_length; /*Q0*/
    3171     8387632 :                             move16();
    3172             :                         }
    3173             :                     }
    3174             :                 }
    3175     2699136 :                 tmp_write_idx_param_band = add( tmp_write_idx_param_band, num_slots_in_subfr ) % hSpatParamRendCom->dirac_md_buffer_length;
    3176     2699136 :                 move16();
    3177             :             }
    3178             :         }
    3179             : 
    3180             :         /* update buffer write index */
    3181       84348 :         IF( hDirAC->hConfig->dec_param_estim == FALSE )
    3182             :         {
    3183       36691 :             hDirAC->spar_to_dirac_write_idx = add( hDirAC->spar_to_dirac_write_idx, MAX_PARAM_SPATIAL_SUBFRAMES ) % hSpatParamRendCom->dirac_md_buffer_length; /*Q0*/
    3184       36691 :             move16();
    3185             :         }
    3186             :         ELSE
    3187             :         {
    3188       47657 :             hDirAC->spar_to_dirac_write_idx = add( hDirAC->spar_to_dirac_write_idx, CLDFB_NO_COL_MAX ) % hSpatParamRendCom->dirac_md_buffer_length; /*Q0*/
    3189       47657 :             move16();
    3190             :         }
    3191             :     }
    3192             :     ELSE
    3193             :     {
    3194       51621 :         band = end_band;
    3195       51621 :         move16();
    3196             :     }
    3197             : 
    3198             :     /*read DirAC metadata, convert DirAC to SPAR*/
    3199      655695 :     FOR( ; band < idiv1616( num_bands_out, bw ); band++ )
    3200             :     {
    3201             :         Word16 dirac_band_idx;
    3202             : 
    3203      519726 :         dirac_band_idx = sub( dirac_to_spar_md_bands[band], enc_param_start_band ); /*Q0*/
    3204             : 
    3205      519726 :         num_subframes = MAX_PARAM_SPATIAL_SUBFRAMES;
    3206      519726 :         move16();
    3207      519726 :         if ( st_ivas->hQMetaData->useLowerRes )
    3208             :         {
    3209       44144 :             num_subframes = 1;
    3210       44144 :             move16();
    3211             :         }
    3212             : 
    3213     2466198 :         FOR( block = 0; block < num_subframes; block++ )
    3214             :         {
    3215             : 
    3216     1946472 :             IF( st_ivas->hQMetaData->q_direction->band_data[dirac_band_idx].azimuth_fx[block] < 0 )
    3217             :             {
    3218      581876 :                 st_ivas->hQMetaData->q_direction->band_data[dirac_band_idx].azimuth_fx[block] =
    3219      290938 :                     L_add( L_shl( 360, 22 ), st_ivas->hQMetaData->q_direction->band_data[dirac_band_idx].azimuth_fx[block] ); /*Q22*/
    3220      290938 :                 move32();
    3221             :             }
    3222             : 
    3223     1946472 :             azi_dirac_fx[band][block] = st_ivas->hQMetaData->q_direction->band_data[dirac_band_idx].azimuth_fx[block]; /*Q22*/
    3224     1946472 :             move32();
    3225     1946472 :             ele_dirac_fx[band][block] = st_ivas->hQMetaData->q_direction->band_data[dirac_band_idx].elevation_fx[block]; /*Q22*/
    3226     1946472 :             move32();
    3227             :         }
    3228             : 
    3229      519726 :         diffuseness_fx[band] = L_sub( ONE_IN_Q30, st_ivas->hQMetaData->q_direction->band_data[dirac_band_idx].energy_ratio_fx[0] ); /*Q30*/
    3230      519726 :         move32();
    3231             :     }
    3232             : 
    3233             :     /* DirAC MD averaged over 4 subframes and converted to SPAR format similar to encoder processing */
    3234      135969 :     IF( GT_16( hMdDec->spar_md_cfg.nchan_transport, 1 ) )
    3235             :     {
    3236             :         Word16 order;
    3237       98064 :         IF( hMdDec->spar_hoa_md_flag )
    3238             :         {
    3239       10949 :             order = 1;
    3240       10949 :             move16();
    3241             :         }
    3242             :         ELSE
    3243             :         {
    3244       87115 :             order = sba_order_internal;
    3245       87115 :             move16();
    3246             :         }
    3247       98064 :         ivas_get_spar_md_from_dirac_fx( azi_dirac_fx, ele_dirac_fx, diffuseness_fx, 1, NULL, NULL, &hMdDec->spar_md, &hMdDec->spar_md_cfg, end_band, num_bands_out, order, dtx_vad, NULL, st_ivas->hQMetaData->useLowerRes, active_w_vlbr, dyn_active_w_flag );
    3248             : 
    3249             :         /* temporarily copy frame-wise prediction coefficients in DirAC bands*/
    3250      392256 :         FOR( pred_idx = 0; pred_idx < FOA_CHANNELS - 1; pred_idx++ )
    3251             :         {
    3252     1470960 :             FOR( band = SPAR_DIRAC_SPLIT_START_BAND; band < IVAS_MAX_NUM_BANDS; band++ )
    3253             :             {
    3254     1176768 :                 pred_re_20ms_fx[band][pred_idx] = hMdDec->spar_md.band_coeffs[band].pred_re_fx[pred_idx]; /*Q22*/
    3255     1176768 :                 move32();
    3256             :             }
    3257             :         }
    3258             :     }
    3259             : 
    3260             :     Word16 num_md_sub_frames;
    3261      135969 :     num_md_sub_frames = ivas_get_spar_dec_md_num_subframes( sba_order_internal, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->last_active_ivas_total_brate );
    3262             : 
    3263             :     Word16 order;
    3264      135969 :     IF( hMdDec->spar_hoa_md_flag )
    3265             :     {
    3266       10949 :         order = 1;
    3267       10949 :         move16();
    3268             :     }
    3269             :     ELSE
    3270             :     {
    3271      125020 :         order = sba_order_internal;
    3272      125020 :         move16();
    3273             :     }
    3274      135969 :     ivas_get_spar_md_from_dirac_fx( azi_dirac_fx, ele_dirac_fx, diffuseness_fx, num_md_sub_frames, NULL, NULL, &hMdDec->spar_md, &hMdDec->spar_md_cfg, end_band, idiv1616( num_bands_out, bw ), order, dtx_vad, NULL, st_ivas->hQMetaData->useLowerRes, active_w_vlbr, dyn_active_w_flag );
    3275             : 
    3276      135969 :     test();
    3277      135969 :     IF( st_ivas->hQMetaData->useLowerRes && dtx_vad )
    3278             :     {
    3279       55635 :         FOR( band = SPAR_DIRAC_SPLIT_START_BAND; band < IVAS_MAX_NUM_BANDS; band++ )
    3280             :         {
    3281       44508 :             FOR( block = 1; block < num_md_sub_frames; block++ )
    3282             :             {
    3283           0 :                 FOR( i = 0; i < FOA_CHANNELS - 1; i++ ) /* pred coefficient index (index 0, 1, 2 predicts Y, Z, X respectively) */
    3284             :                 {
    3285           0 :                     hMdDec->spar_md.band_coeffs[( band + ( block * IVAS_MAX_NUM_BANDS ) )].pred_re_fx[i] = hMdDec->spar_md.band_coeffs[band].pred_re_fx[i]; /*Q22*/
    3286           0 :                     move32();
    3287             :                 }
    3288           0 :                 FOR( i = 0; i < FOA_CHANNELS - 1; i++ ) /* pred coefficient index (index 0, 1, 2 predicts Y, Z, X respectively) */
    3289             :                 {
    3290           0 :                     hMdDec->spar_md.band_coeffs[( band + ( block * IVAS_MAX_NUM_BANDS ) )].P_re_fx[i] = hMdDec->spar_md.band_coeffs[band].P_re_fx[i]; /*Q22*/
    3291           0 :                     move32();
    3292             :                 }
    3293             :             }
    3294             :         }
    3295             :     }
    3296             : 
    3297             :     /* expand DirAC TC 20ms MD for residual channels to all subframes*/
    3298      646398 :     FOR( block = 0; block < num_md_sub_frames; block++ )
    3299             :     {
    3300     2552145 :         FOR( band = SPAR_DIRAC_SPLIT_START_BAND; band < IVAS_MAX_NUM_BANDS; band++ )
    3301             :         {
    3302     8166864 :             FOR( pred_idx = 0; pred_idx < FOA_CHANNELS - 1; pred_idx++ ) /* pred coefficient index (index 0, 1, 2 predicts Y, Z, X respectively) */
    3303             :             {
    3304     6125148 :                 IF( ivas_is_res_channel( add( pred_idx, 1 ), hMdDec->spar_md_cfg.nchan_transport ) )
    3305             :                 {
    3306             :                     /* use 20ms coefficients only for residual channels */
    3307     2998192 :                     hMdDec->spar_md.band_coeffs[( band + ( block * IVAS_MAX_NUM_BANDS ) )].pred_re_fx[pred_idx] = pred_re_20ms_fx[band][pred_idx]; /*Q22*/
    3308     2998192 :                     move32();
    3309             :                 }
    3310             :             }
    3311             :         }
    3312             :     }
    3313             : 
    3314      655695 :     FOR( b = i_mult( end_band, bw ); b < num_bands_out; b++ )
    3315             :     {
    3316      519726 :         hMdDec->valid_bands[b] = 1;
    3317      519726 :         move16();
    3318             :     }
    3319             : 
    3320      135969 :     return;
    3321             : }

Generated by: LCOV version 1.14