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

Generated by: LCOV version 1.14