LCOV - code coverage report
Current view: top level - lib_enc - ivas_spar_md_enc_fx.c (source / functions) Hit Total Coverage
Test: Coverage on main @ cede165d26d1b794bfc5f5f6f9ec19d4d64a9a3b Lines: 814 845 96.3 %
Date: 2025-11-01 03:16:20 Functions: 20 20 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 <string.h>
      35             : #include "options.h"
      36             : #include "prot_fx.h"
      37             : #include "ivas_prot_fx.h"
      38             : #include "math.h"
      39             : #include "ivas_rom_com.h"
      40             : #include <assert.h>
      41             : #include "wmc_auto.h"
      42             : 
      43             : /*------------------------------------------------------------------------------------------*
      44             :  * PreProcessor
      45             :  *------------------------------------------------------------------------------------------*/
      46             : /*Q28*/
      47             : static const Word32 pr_boost_range_fx[2] = { 26843546 /*.1f in Q28*/, 107374182 /*.4f in Q28*/ };
      48             : 
      49             : typedef enum ivas_strats_t
      50             : {
      51             :     START,
      52             :     BASE,
      53             :     BASE_DIFF,
      54             :     BASE_NOEC,
      55             :     FOUR_A,
      56             :     FOUR_B,
      57             :     FOUR_C,
      58             :     FOUR_D,
      59             :     NO_STRAT
      60             : } ivas_strats_t;
      61             : 
      62             : 
      63             : /*------------------------------------------------------------------------------------------*
      64             :  * Static functions declaration
      65             :  *------------------------------------------------------------------------------------------*/
      66             : static void ivas_band_mixer_fx( Word32 *cov_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], Word16 *cov_real_q[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], const Word16 num_ch, Word16 *num_bands, Word16 red_band_fact );
      67             : 
      68             : static Word16 ivas_get_huffman_coded_bs_fx( ivas_spar_md_enc_state_t *hMdEnc, BSTR_ENC_HANDLE hMetaData, const Word16 nB, const Word16 qsi, const Word16 bands_bw );
      69             : 
      70             : 
      71             : static Word16 ivas_get_arith_coded_bs_fx( ivas_spar_md_enc_state_t *hMdEnc, BSTR_ENC_HANDLE hMetaData, const Word16 *pDo_diff, const Word16 bands_bw, const Word16 nB, const Word16 qsi, const Word16 strat, const Word32 ivas_total_brate );
      72             : 
      73             : 
      74             : static void ivas_spar_set_enc_config_fx( ivas_spar_md_enc_state_t *hMdEnc, Word16 *max_freq_per_chan, const Word16 nchan_transport, Word32 *pFC, const Word16 nchan_inp );
      75             : 
      76             : static void ivas_select_next_strat_fx( ivas_strats_t prior_strat, ivas_strats_t cs[MAX_QUANT_STRATS], const Word16 dmx_switch, const Word16 dtx_vad );
      77             : 
      78             : static void ivas_store_prior_coeffs_fx( ivas_spar_md_enc_state_t *hMdEnc, const Word16 num_bands, const Word16 strat, const Word16 dtx_vad, const Word16 qsi );
      79             : 
      80             : static void ivas_write_spar_md_bitstream_fx( ivas_spar_md_enc_state_t *hMdEnc, const Word16 nB, const Word16 bands_bw, BSTR_ENC_HANDLE hMetaData, const Word32 ivas_total_brate, const Word16 strat, const Word16 qsi );
      81             : 
      82             : 
      83             : static void ivas_spar_quant_pred_coeffs_dtx_fx( ivas_spar_md_t *pSpar_md, const Word32 *pValues, const Word16 ndm, Word16 *pIndex, const Word16 dim1, Word32 *pQuant );
      84             : static void ivas_quant_p_per_band_dtx_fx( Word32 *pP_mat, const Word16 num_dec, const Word16 num_dmx, Word16 *ppIdx_pd, Word32 *pP_out, const Word16 num_ch );
      85             : static void ivas_write_parameter_bitstream_dtx_fx( ivas_spar_md_t *pSpar_md, BSTR_ENC_HANDLE hMetaData, Word16 *num_dmx, Word16 *num_dec, const Word16 num_bands );
      86             : 
      87             : static void ivas_quant_p_per_band_fx( ivas_band_coeffs_t *pband_coeffs, ivas_band_coeffs_ind_t *pBand_coeffs_idx, ivas_quant_strat_t *pQs, const Word16 num_ch );
      88             : static void ivas_quant_c_per_band_fx( ivas_band_coeffs_t *pband_coeffs, ivas_band_coeffs_ind_t *pBand_coeffs_idx, ivas_quant_strat_t *pQs, const Word16 ndec, const Word16 ndm, const Word16 q_C );
      89             : static void ivas_quant_pred_coeffs_per_band_fx( ivas_band_coeffs_t *pband_coeffs, ivas_band_coeffs_ind_t *pBand_coeffs_idx, ivas_quant_strat_t *pQs, const Word16 num_ch );
      90             : 
      91             : /*-------------------------------------------------------------------------
      92             :  * ivas_spar_md_enc_open()
      93             :  *
      94             :  * Allocate and initialize SPAR MD encoder handle
      95             :  *------------------------------------------------------------------------*/
      96             : 
      97        1637 : ivas_error ivas_spar_md_enc_open_fx(
      98             :     ivas_spar_md_enc_state_t **hMdEnc_in,       /* i/o: SPAR MD encoder handle  */
      99             :     const ENCODER_CONFIG_HANDLE hEncoderConfig, /* i  : configuration structure */
     100             :     const Word16 sba_order                      /* i  : Ambisonic (SBA) order   */
     101             : )
     102             : {
     103             :     ivas_spar_md_enc_state_t *hMdEnc;
     104             :     ivas_error error;
     105             :     Word16 num_channels, i, j;
     106        1637 :     error = IVAS_ERR_OK;
     107        1637 :     move32();
     108        1637 :     IF( ( hMdEnc = (ivas_spar_md_enc_state_t *) malloc( sizeof( ivas_spar_md_enc_state_t ) ) ) == NULL )
     109             :     {
     110           0 :         return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD encoder" );
     111             :     }
     112             : 
     113        1637 :     num_channels = ivas_sba_get_nchan_metadata_fx( sba_order, hEncoderConfig->ivas_total_brate );
     114             : 
     115        1637 :     IF( ( hMdEnc->spar_md.band_coeffs = (ivas_band_coeffs_t *) malloc( IVAS_MAX_NUM_BANDS * sizeof( ivas_band_coeffs_t ) ) ) == NULL )
     116             :     {
     117           0 :         return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for band_coeffs in SPAR MD" );
     118             :     }
     119        1637 :     memset( hMdEnc->spar_md.band_coeffs, 0, IVAS_MAX_NUM_BANDS * sizeof( ivas_band_coeffs_t ) );
     120             : 
     121        1637 :     IF( ( hMdEnc->mixer_mat_fx = (Word32 ***) malloc( 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        9360 :     FOR( i = 0; i < num_channels; i++ )
     126             :     {
     127        7723 :         IF( ( hMdEnc->mixer_mat_fx[i] = (Word32 **) malloc( 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       49430 :         FOR( j = 0; j < num_channels; j++ )
     132             :         {
     133       41707 :             IF( ( hMdEnc->mixer_mat_fx[i][j] = (Word32 *) malloc( 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        1637 :     hMdEnc->q_mixer_mat_fx = 0;
     140        1637 :     move16();
     141        1637 :     IF( NE_32( ( error = ivas_spar_md_enc_init_fx( hMdEnc, hEncoderConfig, sba_order ) ), IVAS_ERR_OK ) )
     142             :     {
     143           0 :         return error;
     144             :     }
     145             : 
     146        1637 :     *hMdEnc_in = hMdEnc;
     147             : 
     148        1637 :     return error;
     149             : }
     150             : /*-------------------------------------------------------------------------
     151             :  * ivas_spar_md_enc_close()
     152             :  *
     153             :  * Deallocate SPAR MD encoder handle
     154             :  *------------------------------------------------------------------------*/
     155             : 
     156        1637 : void ivas_spar_md_enc_close_fx(
     157             :     ivas_spar_md_enc_state_t **hMdEnc_in /* i/o: SPAR MD encoder handle      */
     158             : )
     159             : {
     160             :     Word16 num_channels, i, j;
     161             :     ivas_spar_md_enc_state_t *hMdEnc;
     162             : 
     163        1637 :     test();
     164        1637 :     IF( hMdEnc_in == NULL || *hMdEnc_in == NULL )
     165             :     {
     166           0 :         return;
     167             :     }
     168             : 
     169        1637 :     hMdEnc = *hMdEnc_in;
     170        1637 :     num_channels = hMdEnc->num_umx_ch;
     171        1637 :     move16();
     172             : 
     173        1637 :     IF( hMdEnc->spar_md.band_coeffs != NULL )
     174             :     {
     175        1637 :         free( hMdEnc->spar_md.band_coeffs );
     176        1637 :         hMdEnc->spar_md.band_coeffs = NULL;
     177             :     }
     178        1637 :     IF( hMdEnc->mixer_mat_fx != NULL )
     179             :     {
     180        9360 :         FOR( i = 0; i < num_channels; i++ )
     181             :         {
     182       49430 :             FOR( j = 0; j < num_channels; j++ )
     183             :             {
     184       41707 :                 free( hMdEnc->mixer_mat_fx[i][j] );
     185             :             }
     186        7723 :             free( hMdEnc->mixer_mat_fx[i] );
     187             :         }
     188        1637 :         free( hMdEnc->mixer_mat_fx );
     189             :     }
     190             : 
     191        1637 :     free( *hMdEnc_in );
     192        1637 :     *hMdEnc_in = NULL;
     193             : 
     194        1637 :     return;
     195             : }
     196             : 
     197             : 
     198             : /*-----------------------------------------------------------------------------------------*
     199             :  * Function ivas_spar_md_enc_init()
     200             :  *
     201             :  * SPAR MD encoder initialization
     202             :  *-----------------------------------------------------------------------------------------*/
     203             : 
     204        1955 : ivas_error ivas_spar_md_enc_init_fx(
     205             :     ivas_spar_md_enc_state_t *hMdEnc,           /* o  : MD encoder handle        */
     206             :     const ENCODER_CONFIG_HANDLE hEncoderConfig, /* i  : configuration structure  */
     207             :     const Word16 sba_order                      /* i  : Ambisonic (SBA) order    */
     208             : )
     209             : {
     210             :     Word32 pFC[IVAS_MAX_NUM_BANDS];
     211             :     Word16 table_idx;
     212             :     Word16 num_channels, i, j, k;
     213             :     Word32 PR_minmax_fx[2];
     214        1955 :     ivas_sba_get_spar_hoa_md_flag_fx( sba_order, hEncoderConfig->ivas_total_brate, &hMdEnc->spar_hoa_md_flag, &hMdEnc->spar_hoa_dirac2spar_md_flag );
     215        1955 :     num_channels = ivas_sba_get_nchan_metadata_fx( sba_order, hEncoderConfig->ivas_total_brate );
     216        1955 :     ivas_sba_get_spar_hoa_ch_ind_fx( num_channels, hEncoderConfig->ivas_total_brate, hMdEnc->HOA_md_ind );
     217        1955 :     table_idx = ivas_get_spar_table_idx_fx( hEncoderConfig->ivas_total_brate, sba_order, SPAR_CONFIG_BW, NULL, NULL );
     218             : 
     219        1955 :     hMdEnc->spar_md.prior_dyn_active_w_flag = 0;
     220        1955 :     move16();
     221             :     Word16 num_bands;
     222        1955 :     IF( hMdEnc->spar_hoa_md_flag != 0 )
     223             :     {
     224         259 :         num_bands = IVAS_MAX_NUM_BANDS;
     225         259 :         move16();
     226             :     }
     227             :     ELSE
     228             :     {
     229        1696 :         num_bands = SPAR_DIRAC_SPLIT_START_BAND;
     230        1696 :         move16();
     231             :     }
     232             : 
     233        1955 :     ivas_spar_set_bitrate_config_fx( &hMdEnc->spar_md_cfg, table_idx, num_bands,
     234        1955 :                                      hMdEnc->spar_hoa_dirac2spar_md_flag, 1, hEncoderConfig->Opt_PCA_ON, ivas_agc_enc_get_flag( ivas_spar_br_table_consts[table_idx].nchan_transport ) ); // TODO: some log operations pending.
     235             :     /* get FB coefficients */
     236       25415 :     FOR( i = 0; i < IVAS_MAX_NUM_BANDS; i++ )
     237             :     {
     238       23460 :         pFC[i] = L_shr( Mpy_32_32( ivas_fb_fcs_12band_1ms_fx[i], hEncoderConfig->input_Fs ), 1 ); // Q0
     239       23460 :         move32();
     240             :     }
     241             : 
     242        1955 :     ivas_spar_set_enc_config_fx( hMdEnc, hMdEnc->spar_md_cfg.max_freq_per_chan, hMdEnc->spar_md_cfg.nchan_transport, pFC, num_channels );
     243        1955 :     test();
     244        1955 :     test();
     245        1955 :     IF( NE_16( hMdEnc->spar_md_cfg.nchan_transport, 2 ) && ( EQ_16( hMdEnc->spar_md_cfg.remix_unmix_order, 1 ) || EQ_16( hMdEnc->spar_md_cfg.remix_unmix_order, 2 ) ) )
     246             :     {
     247           0 :         return IVAS_ERR_INTERNAL;
     248             :     }
     249             : 
     250        1955 :     ivas_spar_arith_coeffs_com_init_fx( &hMdEnc->arith_coeffs, &hMdEnc->spar_md_cfg, table_idx, ENC );
     251        1955 :     ivas_spar_huff_coeffs_com_init_fx( &hMdEnc->huff_coeffs, NULL, table_idx, ENC );
     252        1955 :     IF( EQ_16( hEncoderConfig->Opt_DTX_ON, 1 ) )
     253             :     {
     254             :         /* DTX quant init */
     255         143 :         PR_minmax_fx[0] = hMdEnc->spar_md_cfg.quant_strat[0].PR.min_fx;
     256         143 :         move32();
     257         143 :         PR_minmax_fx[1] = hMdEnc->spar_md_cfg.quant_strat[0].PR.max_fx;
     258         143 :         move32();
     259         143 :         ivas_spar_quant_dtx_init_fx( &hMdEnc->spar_md, PR_minmax_fx );
     260             :     }
     261        1955 :     hMdEnc->spar_md_cfg.prior_strat = START;
     262        1955 :     move16();
     263        1955 :     hMdEnc->spar_md_cfg.prev_quant_idx = -1;
     264        1955 :     move16();
     265       10950 :     FOR( i = 0; i < num_channels; i++ )
     266             :     {
     267       55790 :         FOR( j = 0; j < num_channels; j++ )
     268             :         {
     269      608335 :             FOR( k = 0; k < IVAS_MAX_NUM_BANDS; k++ )
     270             :             {
     271      561540 :                 hMdEnc->mixer_mat_fx[i][j][k] = 0;
     272      561540 :                 move32();
     273             :             }
     274             :         }
     275             :     }
     276        1955 :     hMdEnc->q_mixer_mat_fx = 0;
     277        1955 :     move16();
     278        1955 :     ivas_clear_band_coeffs_fx( hMdEnc->spar_md.band_coeffs, IVAS_MAX_NUM_BANDS );
     279        1955 :     ivas_clear_band_coeff_idx( hMdEnc->spar_md.band_coeffs_idx, IVAS_MAX_NUM_BANDS );
     280        1955 :     ivas_clear_band_coeff_idx( hMdEnc->spar_md_prior.band_coeffs_idx, IVAS_MAX_NUM_BANDS );
     281        1955 :     ivas_clear_band_coeff_idx( hMdEnc->spar_md_prior.band_coeffs_idx_mapped, IVAS_MAX_NUM_BANDS );
     282             : 
     283        1955 :     return IVAS_ERR_OK;
     284             : }
     285             : /*-----------------------------------------------------------------------------------------*
     286             :  * Function ivas_spar_set_enc_config()
     287             :  *
     288             :  * Set configuration for SPAR MD encoder
     289             :  *-----------------------------------------------------------------------------------------*/
     290             : 
     291        1955 : static void ivas_spar_set_enc_config_fx(
     292             :     ivas_spar_md_enc_state_t *hMdEnc,
     293             :     Word16 *max_freq_per_chan,
     294             :     const Word16 nchan_transport,
     295             :     Word32 *pFC, // Input Q0
     296             :     const Word16 nchan_inp )
     297             : {
     298             :     Word16 i, j;
     299             :     Word16 tmp_dmx_ch;
     300             : 
     301        6367 :     FOR( i = 0; i < nchan_transport; i++ )
     302             :     {
     303        4412 :         IF( max_freq_per_chan != NULL )
     304             :         {
     305        4412 :             IF( max_freq_per_chan[i] != 0 )
     306             :             {
     307        4412 :                 hMdEnc->spar_md_cfg.max_freq_per_chan[i] = max_freq_per_chan[i];
     308             :             }
     309             :             ELSE
     310             :             {
     311           0 :                 hMdEnc->spar_md_cfg.max_freq_per_chan[i] = max_freq_per_chan[0];
     312             :             }
     313        4412 :             move16();
     314             :         }
     315             :         ELSE
     316             :         {
     317           0 :             hMdEnc->spar_md_cfg.max_freq_per_chan[i] = IVAS_SPAR_FOA_DFLT_FREQ_PER_CHAN;
     318           0 :             move16();
     319             :         }
     320             :     }
     321        1955 :     hMdEnc->num_umx_ch = nchan_inp;
     322        1955 :     move16();
     323        1955 :     hMdEnc->num_decorr = sub( nchan_inp, 1 );
     324        1955 :     move16();
     325       25415 :     FOR( i = 0; i < IVAS_MAX_NUM_BANDS; i++ )
     326             :     {
     327       23460 :         tmp_dmx_ch = 0;
     328       23460 :         move16();
     329       76404 :         FOR( j = 0; j < nchan_transport; j++ )
     330             :         {
     331       52944 :             IF( LT_32( pFC[i], hMdEnc->spar_md_cfg.max_freq_per_chan[j] ) )
     332             :             {
     333       52944 :                 tmp_dmx_ch = add( tmp_dmx_ch, 1 );
     334             :             }
     335             :         }
     336             : 
     337       23460 :         hMdEnc->spar_md_cfg.num_dmx_chans_per_band[i] = tmp_dmx_ch;
     338       23460 :         move16();
     339       23460 :         hMdEnc->spar_md_cfg.num_decorr_per_band[i] = sub( hMdEnc->num_umx_ch, tmp_dmx_ch );
     340       23460 :         move16();
     341             :     }
     342             : 
     343        1955 :     return;
     344             : }
     345             : /*-----------------------------------------------------------------------------------------*
     346             :  * Function ivas_band_limit_dmx_matrix()
     347             :  *
     348             :  * Band limit downmix matrix
     349             :  *-----------------------------------------------------------------------------------------*/
     350             : 
     351      161621 : static void ivas_band_limit_dmx_matrix_fx(
     352             :     ivas_spar_md_enc_state_t *hMdEnc, /* i/o: SPAR MD encoder handle      */
     353             :     const Word16 num_ch,
     354             :     const Word16 num_bands,
     355             :     const Word16 bands_bw )
     356             : {
     357             :     Word16 i, j, b, ndm;
     358             : 
     359     1478143 :     FOR( b = 0; b < num_bands; b++ )
     360             :     {
     361     1316522 :         ndm = hMdEnc->spar_md_cfg.num_dmx_chans_per_band[b * bands_bw];
     362     1316522 :         move16();
     363             : 
     364     4371874 :         FOR( i = ndm; i < num_ch; i++ )
     365             :         {
     366    21983080 :             FOR( j = 0; j < num_ch; j++ )
     367             :             {
     368    18927728 :                 hMdEnc->mixer_mat_fx[i][j][b] = 0;
     369    18927728 :                 move32();
     370             :             }
     371             :         }
     372             :     }
     373             : 
     374      161621 :     return;
     375             : }
     376             : 
     377             : 
     378             : /*-----------------------------------------------------------------------------------------*
     379             :  * Function ivas_band_mixing()
     380             :  *
     381             :  * Band mixing downmix matrix
     382             :  *-----------------------------------------------------------------------------------------*/
     383             : 
     384       15349 : static void ivas_band_mixing_fx(
     385             :     ivas_spar_md_enc_state_t *hMdEnc, /* i/o: SPAR MD encoder handle      */
     386             :     const Word16 num_ch,
     387             :     const Word16 num_bands,
     388             :     const Word16 nchan_transport,
     389             :     const Word16 upmixed_bands )
     390             : {
     391             :     Word16 i, j, k, b;
     392             :     Word16 red_band_fact;
     393             : 
     394       15349 :     red_band_fact = idiv1616( upmixed_bands, num_bands );
     395             : 
     396       31461 :     FOR( i = 0; i < nchan_transport; i++ )
     397             :     {
     398       80560 :         FOR( j = 0; j < num_ch; j++ )
     399             :         {
     400      303296 :             FOR( k = num_bands - 1; k >= 0; k-- )
     401             :             {
     402      754432 :                 FOR( b = red_band_fact - 1; b >= 0; b-- )
     403             :                 {
     404      515584 :                     hMdEnc->mixer_mat_fx[i][j][red_band_fact * k + b] = hMdEnc->mixer_mat_fx[i][j][k];
     405      515584 :                     move32();
     406             :                 }
     407             :             }
     408       64448 :             FOR( k = red_band_fact * num_bands; k < upmixed_bands; k++ )
     409             :             {
     410           0 :                 hMdEnc->mixer_mat_fx[i][j][k] = hMdEnc->mixer_mat_fx[i][j][( red_band_fact * num_bands ) - 1];
     411           0 :                 move32();
     412             :             }
     413             :         }
     414             :     }
     415             : 
     416       15349 :     return;
     417             : }
     418             : 
     419             : 
     420             : /*-----------------------------------------------------------------------------------------*
     421             :  * Function write_metadata_buffer()
     422             :  *
     423             :  *
     424             :  *-----------------------------------------------------------------------------------------*/
     425             : 
     426      237591 : static void write_metadata_buffer_fx(
     427             :     BSTR_ENC_HANDLE hMetaData_tmp,
     428             :     BSTR_ENC_HANDLE hMetaData,
     429             :     const Word16 bit_pos_start,
     430             :     const Word16 next_ind_start )
     431             : {
     432             :     Word16 i;
     433             : 
     434      237591 :     IF( hMetaData->nb_bits_tot > 0 )
     435             :     {
     436      237591 :         restore_metadata_buffer_fx( hMetaData, next_ind_start, bit_pos_start );
     437             :     }
     438             : 
     439    38221215 :     FOR( i = 0; i < hMetaData_tmp->nb_ind_tot; i++ )
     440             :     {
     441             : #if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS )
     442             :         push_next_indice_( hMetaData_tmp->ind_list[i].function_name, hMetaData, hMetaData_tmp->ind_list[i].value, hMetaData_tmp->ind_list[i].nb_bits );
     443             : #else
     444    37983624 :         push_next_indice( hMetaData, hMetaData_tmp->ind_list[i].value, hMetaData_tmp->ind_list[i].nb_bits );
     445             : #endif
     446             :     }
     447             : 
     448      237591 :     return;
     449             : }
     450             : 
     451             : /*-----------------------------------------------------------------------------------------*
     452             :  * Function ivas_spar_md_enc_process()
     453             :  *
     454             :  * SPAR FoA Meta Data generation process
     455             :  *-----------------------------------------------------------------------------------------*/
     456             : 
     457      160500 : ivas_error ivas_spar_md_enc_process_fx(
     458             :     ivas_spar_md_enc_state_t *hMdEnc,                        /* i/o: SPAR MD encoder handle      */
     459             :     const ENCODER_CONFIG_HANDLE hEncoderConfig,              /* i  : configuration structure     */
     460             :     Word32 *cov_real_fx[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], /*Q(cov_real_q)*/
     461             :     Word16 *cov_real_q[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH],
     462             :     Word32 *cov_dtx_real_fx[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], /*Q(cov_dtx_real_q)*/
     463             :     Word16 *cov_dtx_real_q[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH],
     464             :     BSTR_ENC_HANDLE hMetaData, /* i/o: MetaData handle             */
     465             :     const Word16 dtx_vad,
     466             :     const Word16 nchan_inp,
     467             :     const Word16 sba_order,                                                      /* i  : Ambisonic (SBA) order       */
     468             :     Word32 *prior_mixer[IVAS_MAX_FB_MIXER_OUT_CH][IVAS_MAX_SPAR_FB_MIXER_IN_CH], /* i  : prior mixer_matrix     Q(q_prior_mixer)                */
     469             :     Word16 *q_prior_mixer,                                                       /* i/o  : q for prior mixer_matrix                     */
     470             :     const Word16 dyn_active_w_flag,                                              /* i  : flag to indicate dynamic active W      */
     471             :     const Word16 dirac_mono_flag,                                                /* i  : flag to indicate mono only mode in SBA */
     472             :     const Word16 nchan_out )
     473             : {
     474             :     Word32 pred_coeffs_re_fx[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS];
     475             :     Word32 dm_fv_re_fx[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS];
     476             :     Word16 q_dm_fv_re;
     477             :     Word16 i, j, b, qsi, ndm, ndec, num_ch, num_quant_strats;
     478             :     Word32 pred_coeffs_re_local_fx[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS];
     479             :     Word16 k, bwidth, num_bands, num_bands_full, num_bands_bw;
     480             :     Word16 active_w, nchan_transport, dmx_switch, strat;
     481      160500 :     Word16 nB, bands_bw, bands_bw_log2, packed_ok = 0;
     482      160500 :     move16();
     483             :     ivas_strats_t cs[MAX_CODING_STRATS];
     484             :     Word16 code_strat;
     485             :     Word16 bit_pos_start, next_ind_start;
     486             :     BSTR_ENC_DATA hMetaData_tmp;
     487             :     Indice *ind_list_tmp;
     488             :     Word16 md_indices_allocated;
     489             :     Word16 max_num_indices_tmp;
     490             :     Word32 Wscale_fx[IVAS_MAX_NUM_BANDS];
     491             :     Word16 q_Wscale[IVAS_MAX_NUM_BANDS];
     492             :     Word32 P_quant_re_prior[SPAR_DIRAC_SPLIT_START_BAND][FOA_CHANNELS - 1];
     493             :     Word16 Q_P_quant_re_prior[SPAR_DIRAC_SPLIT_START_BAND];
     494             : 
     495             :     /*extra 16 bits for arithmetic coder as overshoot check is after a symbol is written*/
     496      160500 :     md_indices_allocated = add( hMdEnc->spar_md_cfg.max_bits_per_blk, IVAS_SPAR_ARITH_OVERSHOOT_BITS );
     497      160500 :     IF( ( ind_list_tmp = (Indice *) malloc( sizeof( Indice ) * md_indices_allocated ) ) == NULL )
     498             :     {
     499           0 :         return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD encoder indices" );
     500             :     }
     501             : 
     502      160500 :     num_quant_strats = hMdEnc->spar_md_cfg.num_quant_strats;
     503      160500 :     move16();
     504      160500 :     num_ch = ivas_sba_get_nchan_metadata_fx( sba_order, hEncoderConfig->ivas_total_brate );
     505      160500 :     test();
     506      160500 :     active_w = EQ_16( hMdEnc->spar_md_cfg.active_w, 1 ) || EQ_16( dyn_active_w_flag, 1 );
     507      160500 :     nchan_transport = hMdEnc->spar_md_cfg.nchan_transport;
     508      160500 :     move16();
     509             : 
     510      160500 :     bwidth = ivas_get_bw_idx_from_sample_rate_fx( hEncoderConfig->input_Fs );
     511      160500 :     bwidth = s_min( bwidth, hEncoderConfig->max_bwidth );
     512             :     Word16 active_w_vlbr;
     513      160500 :     IF( LT_32( hEncoderConfig->ivas_total_brate, IVAS_24k4 ) )
     514             :     {
     515       13553 :         active_w_vlbr = 1;
     516       13553 :         move16();
     517             :     }
     518             :     ELSE
     519             :     {
     520      146947 :         active_w_vlbr = 0;
     521      146947 :         move16();
     522             :     }
     523      160500 :     num_bands = ivas_get_num_bands_from_bw_idx( SPAR_CONFIG_BW );
     524      160500 :     IF( hMdEnc->spar_hoa_md_flag == 0 )
     525             :     {
     526      138460 :         num_bands = s_min( num_bands, SPAR_DIRAC_SPLIT_START_BAND );
     527             :     }
     528      160500 :     num_bands_full = num_bands;
     529      160500 :     move16();
     530      160500 :     num_bands_bw = ivas_get_num_bands_from_bw_idx( bwidth );
     531             : 
     532      160500 :     IF( dtx_vad == 0 )
     533             :     {
     534        8025 :         FOR( i = 0; i < nchan_inp; i++ )
     535             :         {
     536       32100 :             FOR( j = 0; j < nchan_inp; j++ )
     537             :             {
     538       25680 :                 cov_real_fx[i][j] = cov_dtx_real_fx[i][j];
     539      333840 :                 FOR( k = 0; k < IVAS_MAX_NUM_BANDS; k++ )
     540             :                 {
     541      308160 :                     cov_real_q[i][j][k] = cov_dtx_real_q[i][j][k];
     542      308160 :                     move16();
     543             :                 }
     544             :             }
     545             :         }
     546             :     }
     547             : 
     548      904700 :     FOR( i = 0; i < nchan_inp; i++ )
     549             :     {
     550     4688660 :         FOR( j = 0; j < nchan_inp; j++ )
     551             :         {
     552     4654420 :             FOR( k = num_bands_bw; k < IVAS_MAX_NUM_BANDS; k++ )
     553             :             {
     554      709960 :                 cov_real_fx[i][j][k] = 0;
     555      709960 :                 move32();
     556             :             }
     557             :         }
     558             :     }
     559             : 
     560      160500 :     test();
     561      160500 :     if ( EQ_32( hEncoderConfig->ivas_total_brate, BRATE_SPAR_Q_STRAT ) && EQ_16( sba_order, SBA_FOA_ORDER ) )
     562             :     {
     563             :         /* make sure that qsi is always 0 (temporary bits are '00') */
     564       11620 :         num_quant_strats = 1;
     565       11620 :         move16();
     566             :     }
     567             : 
     568      160500 :     hMetaData_tmp.ind_list = ind_list_tmp;
     569      160500 :     hMetaData_tmp.nb_bits_tot = 0;
     570      160500 :     move16();
     571      160500 :     max_num_indices_tmp = MAX_BITS_METADATA;
     572      160500 :     move16();
     573      160500 :     hMetaData_tmp.ivas_max_num_indices = &max_num_indices_tmp;
     574      160500 :     hMetaData_tmp.ivas_ind_list_zero = (Indice **) ( &hMetaData_tmp.ind_list );
     575      160500 :     hMetaData_tmp.st_ivas = NULL;
     576             : 
     577             :     /* Save state of metadata bitstream buffer */
     578      160500 :     bit_pos_start = hMetaData->nb_bits_tot;
     579      160500 :     move16();
     580      160500 :     next_ind_start = hMetaData->nb_ind_tot;
     581      160500 :     move16();
     582      160500 :     dmx_switch = 0;
     583      160500 :     move16();
     584             : 
     585      160500 :     IF( dtx_vad == 0 )
     586             :     {
     587        1605 :         nB = SPAR_DTX_BANDS;
     588        1605 :         move16();
     589        1605 :         bands_bw = shr( num_bands, SPAR_DTX_BANDS_LOG2 );
     590             : 
     591        1605 :         ivas_band_mixer_fx( cov_real_fx, cov_real_q, num_ch, &num_bands, bands_bw );
     592             :     }
     593      158895 :     ELSE IF( LT_32( hEncoderConfig->ivas_total_brate, IVAS_24k4 ) )
     594             :     {
     595       13369 :         bands_bw = 2;
     596       13369 :         move16();
     597       13369 :         bands_bw_log2 = 1;
     598       13369 :         move16();
     599       13369 :         nB = shr( num_bands, bands_bw_log2 );
     600             : 
     601       13369 :         ivas_band_mixer_fx( cov_real_fx, cov_real_q, num_ch, &num_bands, bands_bw );
     602             :     }
     603             :     ELSE
     604             :     {
     605      145526 :         nB = num_bands;
     606      145526 :         move16();
     607      145526 :         bands_bw = 1;
     608      145526 :         move16();
     609             :     }
     610             : 
     611      160500 :     test();
     612      160500 :     IF( hMdEnc->spar_hoa_md_flag && hMdEnc->spar_hoa_dirac2spar_md_flag )
     613             :     {
     614       60500 :         FOR( b = SPAR_DIRAC_SPLIT_START_BAND; b < num_bands; b++ )
     615             :         {
     616      193600 :             FOR( i = 0; i < DIRAC_TO_SPAR_HBR_PRED_CHS; i++ )
     617             :             {
     618      145200 :                 pred_coeffs_re_local_fx[i][b] = hMdEnc->spar_md.band_coeffs[b].pred_re_fx[i]; // Q28
     619      145200 :                 move32();
     620             :             }
     621             :         }
     622             :     }
     623             : 
     624      160500 :     IF( LT_32( hEncoderConfig->ivas_total_brate, IVAS_24k4 ) )
     625             :     {
     626      121977 :         FOR( b = 0; b < i_mult( num_bands, bands_bw ); b++ )
     627             :         {
     628      108424 :             Copy32( hMdEnc->spar_md.band_coeffs[b].P_quant_re_fx, P_quant_re_prior[b], sub( FOA_CHANNELS, 1 ) );
     629      108424 :             Q_P_quant_re_prior[b] = hMdEnc->spar_md.band_coeffs[b].q_P_re_fx;
     630             :         }
     631             :     }
     632             : 
     633      160500 :     ivas_compute_spar_params_enc_fx( cov_real_fx, cov_real_q, dm_fv_re_fx, &q_dm_fv_re, 0, hMdEnc->mixer_mat_fx, &hMdEnc->q_mixer_mat_fx, 0, nB, dtx_vad, num_ch, bands_bw, active_w, active_w_vlbr, &hMdEnc->spar_md_cfg, &hMdEnc->spar_md, Wscale_fx, q_Wscale, 0, dyn_active_w_flag );
     634             : 
     635      160500 :     IF( dirac_mono_flag )
     636             :     {
     637             :         Word16 i_ts;
     638          64 :         Word16 num_md_sub_frames = 1;
     639          64 :         move16();
     640             : 
     641          64 :         ndec = hMdEnc->spar_md_cfg.num_decorr_per_band[0];
     642          64 :         move16();
     643          64 :         ndm = hMdEnc->spar_md_cfg.num_dmx_chans_per_band[0];
     644          64 :         move16();
     645             : 
     646         128 :         FOR( i_ts = 0; i_ts < num_md_sub_frames; i_ts++ )
     647             :         {
     648         832 :             FOR( b = 0; b < IVAS_MAX_NUM_BANDS; b++ )
     649             :             {
     650        3072 :                 FOR( j = 0; j < ndm + ndec - 1; j++ )
     651             :                 {
     652        2304 :                     hMdEnc->spar_md.band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].pred_re_fx[j] = 0;
     653        2304 :                     move32();
     654             :                 }
     655        1536 :                 FOR( j = 0; j < ndec; j++ )
     656             :                 {
     657        2304 :                     FOR( k = 0; k < ndm - 1; k++ )
     658             :                     {
     659        1536 :                         hMdEnc->spar_md.band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].C_re_fx[j][k] = 0;
     660        1536 :                         move32();
     661             :                     }
     662             :                 }
     663             : 
     664        1536 :                 FOR( j = 0; j < ndec; j++ )
     665             :                 {
     666         768 :                     hMdEnc->spar_md.band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].P_re_fx[j] = 0;
     667         768 :                     move32();
     668             :                 }
     669             :             }
     670             :         }
     671             :     }
     672             : 
     673      160500 :     code_strat = 0;
     674      160500 :     move16();
     675      161621 :     FOR( qsi = 0; qsi < num_quant_strats; qsi++ )
     676             :     {
     677     1478143 :         FOR( b = 0; b < num_bands; b++ )
     678             :         {
     679     1316522 :             ndm = hMdEnc->spar_md_cfg.num_dmx_chans_per_band[b * bands_bw];
     680     1316522 :             move16();
     681     1316522 :             ndec = hMdEnc->spar_md_cfg.num_decorr_per_band[b * bands_bw];
     682     1316522 :             move16();
     683             : 
     684     1316522 :             IF( EQ_16( dtx_vad, 1 ) )
     685             :             {
     686     1313312 :                 IF( NE_16( ndm, num_ch ) )
     687             :                 {
     688     1160272 :                     ivas_quant_p_per_band_fx( &hMdEnc->spar_md.band_coeffs[b], &hMdEnc->spar_md.band_coeffs_idx[b], &hMdEnc->spar_md_cfg.quant_strat[qsi], num_ch );
     689             :                 }
     690     1313312 :                 ivas_quant_pred_coeffs_per_band_fx( &hMdEnc->spar_md.band_coeffs[b], &hMdEnc->spar_md.band_coeffs_idx[b], &hMdEnc->spar_md_cfg.quant_strat[qsi], num_ch );
     691     1313312 :                 IF( active_w_vlbr )
     692             :                 {
     693      219904 :                     FOR( i = 0; i < 3; i++ )
     694             :                     {
     695             :                         Word16 i2;
     696      164928 :                         i2 = 0;
     697      164928 :                         move16();
     698      164928 :                         SWITCH( i ) /* PRED (Y,Z,X) and DECD (Y,X,Z) coeffs are in different orders */
     699             :                         {
     700       54976 :                             case 0:
     701       54976 :                                 i2 = 0;
     702       54976 :                                 move16();
     703       54976 :                                 BREAK;
     704       54976 :                             case 1:
     705       54976 :                                 i2 = 2;
     706       54976 :                                 move16();
     707       54976 :                                 BREAK;
     708       54976 :                             case 2:
     709       54976 :                                 i2 = 1;
     710       54976 :                                 move16();
     711       54976 :                                 BREAK;
     712             :                         }
     713      164928 :                         test();
     714      164928 :                         test();
     715      164928 :                         test();
     716      164928 :                         IF( ( hMdEnc->spar_md.band_coeffs_idx[b].pred_index_re[i] == 0 ) && ( hMdEnc->spar_md.band_coeffs_idx[b].decd_index_re[i2] == 0 ) && ( hMdEnc->spar_md.band_coeffs[b].pred_re_fx[i] != 0 ) && ( cov_real_fx[i + 1][i + 1][b] != 0 ) )
     717             :                         {
     718             :                             /* bump up the Pred coeff */
     719             :                             Word32 PR_uq;
     720             :                             Word16 PR_step;
     721             :                             ivas_quant_strat_t qs;
     722             :                             Word16 PR_step_e;
     723        3675 :                             qs = hMdEnc->spar_md_cfg.quant_strat[qsi];
     724        3675 :                             PR_uq = hMdEnc->spar_md.band_coeffs[b].pred_re_fx[i]; // Q28
     725        3675 :                             move32();
     726        3675 :                             PR_step = BASOP_Util_Divide3216_Scale( L_sub( qs.PR.max_fx, qs.PR.min_fx ), sub( qs.PR.q_levels[0], 1 ), &PR_step_e );
     727        3675 :                             PR_step_e = sub( PR_step_e, Q12 );
     728             : 
     729             :                             Word16 PR_sign;
     730        3675 :                             PR_sign = sub( extract_l( GT_32( PR_uq, 0 ) ), extract_l( LT_32( PR_uq, 0 ) ) );
     731             : 
     732        3675 :                             hMdEnc->spar_md.band_coeffs_idx[b].pred_index_re[i] = PR_sign;
     733        3675 :                             move16();
     734             : 
     735             :                             /* deindex the modified coefficient */
     736        3675 :                             hMdEnc->spar_md.band_coeffs[b].pred_quant_re_fx[i] = L_shl( L_mult0( PR_sign, PR_step ), add( Q13, PR_step_e ) ); // Q28
     737        3675 :                             move32();
     738             :                         }
     739             :                     }
     740             :                 }
     741             :             }
     742             :             ELSE
     743             :             {
     744        3210 :                 IF( NE_16( ndm, num_ch ) )
     745             :                 {
     746        3210 :                     ivas_quant_p_per_band_dtx_fx( hMdEnc->spar_md.band_coeffs[b].P_re_fx, ndec, ndm, &hMdEnc->spar_md.band_coeffs_idx[b].decd_index_re[0], hMdEnc->spar_md.band_coeffs[b].P_quant_re_fx, num_ch );
     747             :                 }
     748             : 
     749       12840 :                 FOR( i = 0; i < num_ch - 1; i++ )
     750             :                 {
     751        9630 :                     hMdEnc->spar_md.band_coeffs[b].pred_quant_re_fx[i] = 0;
     752        9630 :                     move32();
     753             :                 }
     754        3210 :                 ivas_spar_quant_pred_coeffs_dtx_fx( &hMdEnc->spar_md, hMdEnc->spar_md.band_coeffs[b].pred_re_fx, ndm, hMdEnc->spar_md.band_coeffs_idx[b].pred_index_re, sub( num_ch, 1 ), hMdEnc->spar_md.band_coeffs[b].pred_quant_re_fx );
     755             :             }
     756             :         }
     757      748684 :         FOR( i = 0; i < num_ch - 1; i++ )
     758             :         {
     759     5763029 :             FOR( b = 0; b < num_bands; b++ )
     760             :             {
     761     5175966 :                 pred_coeffs_re_fx[i][b] = L_shl( Mpy_32_32( Wscale_fx[b], hMdEnc->spar_md.band_coeffs[b].pred_quant_re_fx[i] ), sub( Q31, q_Wscale[b] ) ); // Q28
     762     5175966 :                 move32();
     763             :             }
     764             :         }
     765             : 
     766      161621 :         test();
     767      161621 :         IF( hMdEnc->spar_hoa_md_flag && hMdEnc->spar_hoa_dirac2spar_md_flag )
     768             :         {
     769       60500 :             FOR( b = SPAR_DIRAC_SPLIT_START_BAND; b < num_bands; b++ )
     770             :             {
     771      193600 :                 FOR( i = 0; i < DIRAC_TO_SPAR_HBR_PRED_CHS; i++ )
     772             :                 {
     773             :                     /* Use the prediction coeffs computed based on DirAC MD to generate mixer matrix */
     774      145200 :                     pred_coeffs_re_fx[i][b] = pred_coeffs_re_local_fx[i][b];
     775      145200 :                     move32();
     776      145200 :                     hMdEnc->spar_md.band_coeffs[b].pred_quant_re_fx[i] = 0;
     777      145200 :                     move32();
     778      145200 :                     hMdEnc->spar_md.band_coeffs_idx[b].pred_index_re[i] = 0;
     779      145200 :                     move16();
     780             :                 }
     781             :             }
     782             :         }
     783             : 
     784      161621 :         ivas_create_fullr_dmx_mat_fx( pred_coeffs_re_fx, Q28, dm_fv_re_fx, q_dm_fv_re, hMdEnc->mixer_mat_fx, &hMdEnc->q_mixer_mat_fx, num_ch, 0, num_bands, active_w, &hMdEnc->spar_md_cfg );
     785      161621 :         Word16 Wscale_e = Q31;
     786      161621 :         move16();
     787             :         /* Common q for Wscale buffer */
     788     1478143 :         FOR( b = 0; b < num_bands; b++ )
     789             :         {
     790     1316522 :             if ( GT_16( Wscale_e, q_Wscale[b] ) )
     791             :             {
     792       45277 :                 Wscale_e = q_Wscale[b];
     793       45277 :                 move16();
     794             :             }
     795             :         }
     796     1478143 :         FOR( b = 0; b < num_bands; b++ )
     797             :         {
     798     1316522 :             Wscale_fx[b] = L_shr( Wscale_fx[b], sub( q_Wscale[b], Wscale_e ) ); // Q(Wscale_e)
     799     1316522 :             move32();
     800             :         }
     801      161621 :         Wscale_e = sub( Q31, Wscale_e ); // Wscale_e is now exp of Wscale
     802             :         /*mixer-q adjusted for Wscale multplication below */
     803      161621 :         hMdEnc->q_mixer_mat_fx = sub( hMdEnc->q_mixer_mat_fx, Wscale_e );
     804      161621 :         move16();
     805     1478143 :         FOR( b = 0; b < num_bands; b++ )
     806             :         {
     807     1316522 :             ndm = hMdEnc->spar_md_cfg.num_dmx_chans_per_band[b * bands_bw];
     808     1316522 :             move16();
     809     1316522 :             ndec = hMdEnc->spar_md_cfg.num_decorr_per_band[b * bands_bw];
     810     1316522 :             move16();
     811             : 
     812     7809010 :             FOR( i = 0; i < num_ch; i++ )
     813             :             {
     814     6492488 :                 hMdEnc->mixer_mat_fx[0][i][b] = Mpy_32_32( hMdEnc->mixer_mat_fx[0][i][b], Wscale_fx[b] );
     815     6492488 :                 move32();
     816    37581872 :                 FOR( j = 1; j < num_ch; j++ )
     817             :                 {
     818    31089384 :                     hMdEnc->mixer_mat_fx[j][i][b] = L_shr( hMdEnc->mixer_mat_fx[j][i][b], Wscale_e ); // Q(hMdEnc->q_mixer_mat_fx)
     819    31089384 :                     move32();
     820             :                 }
     821             :             }
     822     1316522 :             test();
     823     1316522 :             IF( NE_16( ndm, num_ch ) && NE_16( ndm, 1 ) )
     824             :             {
     825      862622 :                 ivas_calc_c_p_coeffs_enc_fx( &hMdEnc->spar_md, cov_real_fx, cov_real_q, 0, hMdEnc->mixer_mat_fx, hMdEnc->q_mixer_mat_fx, num_ch, ndm, b, dtx_vad, 0, dyn_active_w_flag );
     826             : 
     827      862622 :                 IF( dirac_mono_flag )
     828             :                 {
     829         512 :                     ndec = hMdEnc->spar_md_cfg.num_decorr_per_band[0];
     830         512 :                     move16();
     831         512 :                     ndm = hMdEnc->spar_md_cfg.num_dmx_chans_per_band[0];
     832         512 :                     move16();
     833        1024 :                     FOR( j = 0; j < ndec; j++ )
     834             :                     {
     835        1536 :                         FOR( k = 0; k < ndm - 1; k++ )
     836             :                         {
     837        1024 :                             hMdEnc->spar_md.band_coeffs[b].C_re_fx[j][k] = 0;
     838        1024 :                             move32();
     839             :                         }
     840             :                     }
     841             :                 }
     842      862622 :                 ivas_quant_c_per_band_fx( &hMdEnc->spar_md.band_coeffs[b], &hMdEnc->spar_md.band_coeffs_idx[b],
     843      862622 :                                           &hMdEnc->spar_md_cfg.quant_strat[qsi], ndec, ndm, hMdEnc->spar_md.band_coeffs[b].q_C_re_fx );
     844             :             }
     845             :         }
     846             : 
     847             :         /* band limit downmix matrix */
     848      161621 :         ivas_band_limit_dmx_matrix_fx( hMdEnc, num_ch, num_bands, bands_bw );
     849             : 
     850             :         /* band mixing */
     851      161621 :         IF( GT_16( bands_bw, 1 ) )
     852             :         {
     853       15349 :             ivas_band_mixing_fx( hMdEnc, num_ch, num_bands, nchan_transport, num_bands_full );
     854             :         }
     855             : 
     856      161621 :         IF( dtx_vad == 0 )
     857             :         {
     858        1605 :             ivas_write_parameter_bitstream_dtx_fx( &hMdEnc->spar_md, hMetaData, hMdEnc->spar_md_cfg.num_dmx_chans_per_band, hMdEnc->spar_md_cfg.num_decorr_per_band, num_bands );
     859        1605 :             BREAK;
     860             :         }
     861             : 
     862      160016 :         ivas_select_next_strat_fx( hMdEnc->spar_md_cfg.prior_strat, cs, dmx_switch, dtx_vad );
     863             : 
     864      402903 :         FOR( i = 0; i < MAX_CODING_STRATS; i++ )
     865             :         {
     866      365779 :             strat = cs[i];
     867      365779 :             move16();
     868      365779 :             IF( NE_16( strat, NO_STRAT ) )
     869             :             {
     870      363756 :                 reset_indices_enc_fx( &hMetaData_tmp, md_indices_allocated );
     871             : 
     872      363756 :                 ivas_write_spar_md_bitstream_fx( hMdEnc, num_bands, bands_bw, &hMetaData_tmp, hEncoderConfig->ivas_total_brate, strat, qsi );
     873             : 
     874             :                 /*write to main buffer if its a valid bitstream*/
     875      363756 :                 IF( hMetaData_tmp.nb_bits_tot > 0 )
     876             :                 {
     877      288634 :                     test();
     878      288634 :                     IF( EQ_16( hMetaData->nb_bits_tot, bit_pos_start ) || LT_16( hMetaData_tmp.nb_bits_tot, sub( hMetaData->nb_bits_tot, bit_pos_start ) ) )
     879             :                     {
     880      237591 :                         write_metadata_buffer_fx( &hMetaData_tmp, hMetaData, bit_pos_start, next_ind_start );
     881      237591 :                         code_strat = strat;
     882      237591 :                         move16();
     883             :                     }
     884             :                     Word16 add_bit;
     885      288634 :                     test();
     886      288634 :                     IF( ( EQ_32( hEncoderConfig->ivas_total_brate, IVAS_256k ) && EQ_16( sba_order, SBA_FOA_ORDER ) ) )
     887             :                     {
     888       13366 :                         add_bit = 1;
     889       13366 :                         move16();
     890             :                     }
     891             :                     ELSE
     892             :                     {
     893      275268 :                         add_bit = 0;
     894      275268 :                         move16();
     895             :                     }
     896      288634 :                     IF( LE_16( add( sub( hMetaData->nb_bits_tot, bit_pos_start ), add_bit ), hMdEnc->spar_md_cfg.tgt_bits_per_blk ) )
     897             :                     {
     898      122892 :                         packed_ok = 1;
     899      122892 :                         move16();
     900      122892 :                         BREAK;
     901             :                     }
     902             :                 }
     903             :             }
     904             :         }
     905             : 
     906      160016 :         IF( EQ_16( packed_ok, 1 ) )
     907             :         {
     908      122892 :             BREAK;
     909             :         }
     910             : 
     911             :         /*only if valid bitstream was written to main buffer*/
     912       37124 :         IF( GT_16( hMetaData->nb_bits_tot, bit_pos_start ) )
     913             :         {
     914             :             Word16 add_bit;
     915       36003 :             test();
     916       36003 :             IF( EQ_32( hEncoderConfig->ivas_total_brate, IVAS_256k ) && EQ_16( sba_order, SBA_FOA_ORDER ) )
     917             :             {
     918           0 :                 add_bit = 1;
     919           0 :                 move16();
     920             :             }
     921             :             ELSE
     922             :             {
     923       36003 :                 add_bit = 0;
     924       36003 :                 move16();
     925             :             }
     926       36003 :             IF( LE_16( add( sub( hMetaData->nb_bits_tot, bit_pos_start ), add_bit ), hMdEnc->spar_md_cfg.max_bits_per_blk ) )
     927             :             {
     928       36003 :                 packed_ok = 1;
     929       36003 :                 move16();
     930       36003 :                 BREAK;
     931             :             }
     932             :         }
     933             :     }
     934      160500 :     IF( GT_16( hMdEnc->q_mixer_mat_fx, *q_prior_mixer ) )
     935             :     {
     936       85445 :         FOR( i = 0; i < num_ch; i++ )
     937             :         {
     938      341780 :             FOR( j = 0; j < num_ch; j++ )
     939             :             {
     940     3554512 :                 FOR( b = 0; b < IVAS_MAX_NUM_BANDS; b++ )
     941             :                 {
     942     3281088 :                     hMdEnc->mixer_mat_fx[i][j][b] = L_shr( hMdEnc->mixer_mat_fx[i][j][b], sub( hMdEnc->q_mixer_mat_fx, *q_prior_mixer ) );
     943     3281088 :                     move32();
     944             :                 }
     945             :             }
     946             :         }
     947       17089 :         hMdEnc->q_mixer_mat_fx = *q_prior_mixer;
     948       17089 :         move16();
     949             :     }
     950             :     ELSE
     951             :     {
     952      519150 :         FOR( i = 0; i < nchan_out; i++ )
     953             :         {
     954     2287495 :             FOR( j = 0; j < num_ch; j++ )
     955             :             {
     956    24852828 :                 FOR( b = 0; b < IVAS_MAX_NUM_BANDS; b++ )
     957             :                 {
     958    22941072 :                     prior_mixer[i][j][b] = L_shr( prior_mixer[i][j][b], sub( *q_prior_mixer, hMdEnc->q_mixer_mat_fx ) );
     959    22941072 :                     move32();
     960             :                 }
     961             :             }
     962             :         }
     963      143411 :         *q_prior_mixer = hMdEnc->q_mixer_mat_fx;
     964      143411 :         move16();
     965             :     }
     966             : 
     967             :     /* Reuse mixer matrix values for unsent bands */
     968      160500 :     IF( LT_32( hEncoderConfig->ivas_total_brate, IVAS_24k4 ) )
     969             :     {
     970       67397 :         FOR( k = num_bands - 1; k >= 0; k-- )
     971             :         {
     972      162268 :             FOR( b = bands_bw - 1; b >= 0; b-- )
     973             :             {
     974      108424 :                 Copy32( hMdEnc->spar_md.band_coeffs[k].P_quant_re_fx, hMdEnc->spar_md.band_coeffs[add( i_mult( bands_bw, k ), b )].P_quant_re_fx, sub( FOA_CHANNELS, 1 ) );
     975      108424 :                 hMdEnc->spar_md.band_coeffs[add( i_mult( bands_bw, k ), b )].q_P_re_fx = hMdEnc->spar_md.band_coeffs[k].q_P_re_fx;
     976      108424 :                 move16();
     977             :             }
     978             :         }
     979             :     }
     980             : 
     981      160500 :     test();
     982      160500 :     IF( ( LT_32( hEncoderConfig->ivas_total_brate, IVAS_24k4 ) ) && GT_16( code_strat, 3 ) )
     983             :     {
     984       38859 :         FOR( b = 0; b < num_bands * bands_bw; b += 2 * bands_bw )
     985             :         {
     986       25906 :             test();
     987       25906 :             IF( ( b == 0 ) && ( s_and( code_strat, 1 ) == 0 ) )
     988             :             {
     989        6675 :                 b = add( b, 2 );
     990             :             }
     991             : 
     992       51812 :             FOR( i = 0; i < 1; i++ )
     993             :             {
     994      129530 :                 FOR( j = 0; j < 4; j++ )
     995             :                 {
     996      103624 :                     hMdEnc->mixer_mat_fx[i][j][b] = prior_mixer[i][j][b];
     997      103624 :                     move32();
     998      103624 :                     hMdEnc->mixer_mat_fx[i][j][b + 1] = prior_mixer[i][j][b + 1];
     999      103624 :                     move32();
    1000             :                 }
    1001             :             }
    1002             : 
    1003       25906 :             Copy32( P_quant_re_prior[b], hMdEnc->spar_md.band_coeffs[b].P_quant_re_fx, sub( FOA_CHANNELS, 1 ) );
    1004       25906 :             Copy32( P_quant_re_prior[b + 1], hMdEnc->spar_md.band_coeffs[b + 1].P_quant_re_fx, sub( FOA_CHANNELS, 1 ) );
    1005       25906 :             hMdEnc->spar_md.band_coeffs[b].q_P_re_fx = Q_P_quant_re_prior[b];
    1006       25906 :             hMdEnc->spar_md.band_coeffs[b + 1].q_P_re_fx = Q_P_quant_re_prior[b + 1];
    1007       25906 :             move16();
    1008       25906 :             move16();
    1009             :         }
    1010             :     }
    1011             : 
    1012      160500 :     ivas_store_prior_coeffs_fx( hMdEnc, num_bands, code_strat, dtx_vad, qsi );
    1013             : 
    1014      160500 :     hMdEnc->spar_md.dtx_vad = dtx_vad;
    1015      160500 :     move16();
    1016      160500 :     hMdEnc->spar_md.num_bands = num_bands;
    1017      160500 :     move16();
    1018             : 
    1019      160500 :     free( ind_list_tmp );
    1020             : 
    1021      160500 :     return IVAS_ERR_OK;
    1022             : }
    1023             : 
    1024             : 
    1025             : /*-----------------------------------------------------------------------------------------*
    1026             :  * Function ivas_band_mixer()
    1027             :  *
    1028             :  * band mixer
    1029             :  *-----------------------------------------------------------------------------------------*/
    1030             : 
    1031       14974 : static void ivas_band_mixer_fx(
    1032             :     Word32 *cov_real_fx[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], // Q(cov_real_q)
    1033             :     Word16 *cov_real_q[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH],
    1034             :     const Word16 num_ch,
    1035             :     Word16 *num_bands,
    1036             :     Word16 red_band_fact )
    1037             : {
    1038             :     Word16 i, j, k, b, orig_band, rem_band;
    1039             :     Word32 avg_cov;
    1040             :     Word16 avg_cov_e;
    1041             : 
    1042       14974 :     orig_band = *num_bands;
    1043       14974 :     move16();
    1044       14974 :     *num_bands = idiv1616( *num_bands, red_band_fact );
    1045       14974 :     move16();
    1046       14974 :     rem_band = sub( orig_band, i_mult( *num_bands, red_band_fact ) );
    1047             : 
    1048       74870 :     FOR( i = 0; i < num_ch; i++ )
    1049             :     {
    1050      299480 :         FOR( j = 0; j < num_ch; j++ )
    1051             :         {
    1052      906976 :             FOR( k = 0; k < *num_bands - 1; k++ )
    1053             :             {
    1054      667392 :                 avg_cov_e = 0;
    1055      667392 :                 move16();
    1056      667392 :                 avg_cov = 0;
    1057      667392 :                 move32();
    1058     2053536 :                 FOR( b = 0; b < red_band_fact; b++ )
    1059             :                 {
    1060     1386144 :                     avg_cov = BASOP_Util_Add_Mant32Exp( avg_cov, avg_cov_e, cov_real_fx[i][j][red_band_fact * k + b], sub( Q31, cov_real_q[i][j][red_band_fact * k + b] ), &avg_cov_e );
    1061             :                 }
    1062      667392 :                 cov_real_fx[i][j][k] = avg_cov;
    1063      667392 :                 move32();
    1064      667392 :                 cov_real_q[i][j][k] = sub( Q31, avg_cov_e );
    1065      667392 :                 move16();
    1066             :             }
    1067             : 
    1068      239584 :             avg_cov_e = 0;
    1069      239584 :             move16();
    1070      239584 :             avg_cov = 0;
    1071      239584 :             move32();
    1072      770112 :             FOR( b = 0; b < red_band_fact + rem_band; b++ )
    1073             :             {
    1074      530528 :                 avg_cov = BASOP_Util_Add_Mant32Exp( avg_cov, avg_cov_e, cov_real_fx[i][j][red_band_fact * ( *num_bands - 1 ) + b], sub( Q31, cov_real_q[i][j][red_band_fact * ( *num_bands - 1 ) + b] ), &avg_cov_e );
    1075             :             }
    1076             : 
    1077      239584 :             cov_real_fx[i][j][*num_bands - 1] = avg_cov;
    1078      239584 :             move32();
    1079      239584 :             cov_real_q[i][j][*num_bands - 1] = sub( Q31, avg_cov_e );
    1080      239584 :             move16();
    1081             :         }
    1082             :     }
    1083             : 
    1084       14974 :     return;
    1085             : }
    1086             : 
    1087             : /*-----------------------------------------------------------------------------------------*
    1088             :  * Function ivas_write_spar_md_bitstream()
    1089             :  *
    1090             :  * Write MD parameters into bitstream
    1091             :  *-----------------------------------------------------------------------------------------*/
    1092      363756 : static void ivas_write_spar_md_bitstream_fx(
    1093             :     ivas_spar_md_enc_state_t *hMdEnc,
    1094             :     const Word16 nB,
    1095             :     const Word16 bands_bw,
    1096             :     BSTR_ENC_HANDLE hMetaData,
    1097             :     const Word32 ivas_total_brate,
    1098             :     const Word16 strat,
    1099             :     const Word16 qsi )
    1100             : {
    1101             :     Word16 no_ec, i;
    1102             :     Word16 do_diff[IVAS_MAX_NUM_BANDS];
    1103             :     Word16 entropy_coding_result;
    1104             : 
    1105      363756 :     IF( EQ_16( strat, NO_STRAT ) )
    1106             :     {
    1107           0 :         return;
    1108             :     }
    1109             : 
    1110             :     /* write quant strat */
    1111      363756 :     IF( GE_32( ivas_total_brate, BRATE_SPAR_Q_STRAT ) )
    1112             :     {
    1113       43885 :         push_next_indice( hMetaData, shr( qsi, 1 ), sub( hMdEnc->spar_md_cfg.quant_strat_bits, 1 ) );
    1114             :     }
    1115             :     ELSE
    1116             :     {
    1117      319871 :         push_next_indice( hMetaData, qsi, hMdEnc->spar_md_cfg.quant_strat_bits );
    1118             :     }
    1119             : 
    1120      363756 :     no_ec = 0;
    1121      363756 :     move16();
    1122             : 
    1123      363756 :     IF( LT_32( ivas_total_brate, IVAS_24k4 ) )
    1124             :     {
    1125       40441 :         SWITCH( strat )
    1126             :         {
    1127       13744 :             case BASE:
    1128       13744 :                 push_next_indice( hMetaData, sub( bands_bw, 1 ), SPAR_NUM_CODING_STRAT_BITS );
    1129       13744 :                 BREAK;
    1130       13744 :             case BASE_NOEC:
    1131       13744 :                 push_next_indice( hMetaData, add( bands_bw, 1 ), SPAR_NUM_CODING_STRAT_BITS );
    1132       13744 :                 no_ec = 1;
    1133       13744 :                 move16();
    1134       13744 :                 BREAK;
    1135       12953 :             case FOUR_A:
    1136             :             case FOUR_C:
    1137             :             case FOUR_B:
    1138             :             case FOUR_D:
    1139       12953 :                 push_next_indice( hMetaData, strat, SPAR_NUM_CODING_STRAT_BITS );
    1140       12953 :                 BREAK;
    1141             :         }
    1142             :         /* for LBR SBA 40MS MD never do time diff */
    1143      202205 :         FOR( i = 0; i < nB; i++ )
    1144             :         {
    1145      161764 :             do_diff[i] = 0;
    1146      161764 :             move16();
    1147             :         }
    1148             :     }
    1149             :     ELSE
    1150             :     {
    1151      323315 :         SWITCH( strat )
    1152             :         {
    1153      146272 :             case BASE:
    1154      146272 :                 push_next_indice( hMetaData, sub( bands_bw, 1 ), SPAR_NUM_CODING_STRAT_BITS );
    1155     1404608 :                 FOR( i = 0; i < nB; i++ )
    1156             :                 {
    1157     1258336 :                     do_diff[i] = 0;
    1158     1258336 :                     move16();
    1159             :                 }
    1160      146272 :                 BREAK;
    1161       90496 :             case BASE_NOEC:
    1162       90496 :                 push_next_indice( hMetaData, add( bands_bw, 1 ), SPAR_NUM_CODING_STRAT_BITS );
    1163      814464 :                 FOR( i = 0; i < nB; i++ )
    1164             :                 {
    1165      723968 :                     do_diff[i] = 0;
    1166      723968 :                     move16();
    1167             :                 }
    1168       90496 :                 no_ec = 1;
    1169       90496 :                 move16();
    1170       90496 :                 BREAK;
    1171       24503 :             case FOUR_A:
    1172       24503 :                 push_next_indice( hMetaData, 4, SPAR_NUM_CODING_STRAT_BITS );
    1173      220527 :                 FOR( i = 0; i < nB; i++ )
    1174             :                 {
    1175      196024 :                     do_diff[i] = ( ( s_and( ( add( i, 1 ) ), 3 ) ) != 0 );
    1176      196024 :                     move16();
    1177             :                 }
    1178       24503 :                 ivas_map_prior_coeffs_quant( &hMdEnc->spar_md_prior, &hMdEnc->spar_md_cfg, qsi, nB );
    1179       24503 :                 BREAK;
    1180       21949 :             case FOUR_B:
    1181       21949 :                 push_next_indice( hMetaData, 5, SPAR_NUM_CODING_STRAT_BITS );
    1182      197541 :                 FOR( i = 0; i < nB; i++ )
    1183             :                 {
    1184      175592 :                     do_diff[i] = extract_l( NE_16( ( s_and( ( add( i, 1 ) ), 3 ) ), 1 ) );
    1185      175592 :                     move16();
    1186             :                 }
    1187       21949 :                 ivas_map_prior_coeffs_quant( &hMdEnc->spar_md_prior, &hMdEnc->spar_md_cfg, qsi, nB );
    1188       21949 :                 BREAK;
    1189       20538 :             case FOUR_C:
    1190       20538 :                 push_next_indice( hMetaData, 6, SPAR_NUM_CODING_STRAT_BITS );
    1191      184842 :                 FOR( i = 0; i < nB; i++ )
    1192             :                 {
    1193      164304 :                     do_diff[i] = extract_l( NE_16( ( s_and( ( add( i, 1 ) ), 3 ) ), 2 ) );
    1194      164304 :                     move16();
    1195             :                 }
    1196       20538 :                 ivas_map_prior_coeffs_quant( &hMdEnc->spar_md_prior, &hMdEnc->spar_md_cfg, qsi, nB );
    1197       20538 :                 BREAK;
    1198       19557 :             case FOUR_D:
    1199       19557 :                 push_next_indice( hMetaData, 7, SPAR_NUM_CODING_STRAT_BITS );
    1200      176013 :                 FOR( i = 0; i < nB; i++ )
    1201             :                 {
    1202      156456 :                     do_diff[i] = extract_l( NE_16( ( s_and( ( add( i, 1 ) ), 3 ) ), 3 ) );
    1203      156456 :                     move16();
    1204             :                 }
    1205       19557 :                 ivas_map_prior_coeffs_quant( &hMdEnc->spar_md_prior, &hMdEnc->spar_md_cfg, qsi, nB );
    1206       19557 :                 BREAK;
    1207             :         }
    1208      363756 :     }
    1209             : 
    1210      363756 :     IF( EQ_16( no_ec, 1 ) )
    1211             :     {
    1212             :         entropy_coding_result =
    1213      104240 :             ivas_get_huffman_coded_bs_fx( hMdEnc, hMetaData, nB, qsi,
    1214             :                                           bands_bw );
    1215      104240 :         move16();
    1216             :     }
    1217             :     ELSE
    1218             :     {
    1219             :         entropy_coding_result =
    1220      259516 :             ivas_get_arith_coded_bs_fx( hMdEnc, hMetaData, do_diff, bands_bw, nB, qsi,
    1221             :                                         strat, ivas_total_brate );
    1222      259516 :         move16();
    1223             :     }
    1224             : 
    1225      363756 :     if ( entropy_coding_result < 0 )
    1226             :     {
    1227       75122 :         hMetaData->nb_bits_tot = 0;
    1228       75122 :         move16();
    1229             :     }
    1230             : 
    1231      363756 :     return;
    1232             : }
    1233             : 
    1234             : 
    1235             : /*-----------------------------------------------------------------------------------------*
    1236             :  * Function ivas_get_huffman_coded_bs()
    1237             :  *
    1238             :  * Generate huffman coded bitstream
    1239             :  *-----------------------------------------------------------------------------------------*/
    1240      104240 : static Word16 ivas_get_huffman_coded_bs_fx(
    1241             :     ivas_spar_md_enc_state_t *hMdEnc,
    1242             :     BSTR_ENC_HANDLE hMetaData,
    1243             :     const Word16 nB,
    1244             :     const Word16 qsi,
    1245             :     const Word16 bands_bw )
    1246             : {
    1247             :     Word16 i, j;
    1248             :     Word16 pred_coeff_dim, pred_offset;
    1249             : 
    1250      830052 :     FOR( i = 0; i < nB; i++ )
    1251             :     {
    1252             :         Word16 code, len;
    1253             :         Word16 ndm, ndec;
    1254      772161 :         ndm = hMdEnc->spar_md_cfg.num_dmx_chans_per_band[i * bands_bw];
    1255      772161 :         ndec = hMdEnc->spar_md_cfg.num_decorr_per_band[i * bands_bw];
    1256      772161 :         move16();
    1257      772161 :         move16();
    1258             : 
    1259      772161 :         pred_coeff_dim = sub( add( ndm, ndec ), 1 );
    1260      772161 :         pred_offset = 0;
    1261      772161 :         move16();
    1262      772161 :         test();
    1263      772161 :         IF( hMdEnc->spar_hoa_md_flag && hMdEnc->spar_hoa_dirac2spar_md_flag )
    1264             :         {
    1265           0 :             if ( GE_16( i, SPAR_DIRAC_SPLIT_START_BAND ) )
    1266             :             {
    1267           0 :                 pred_offset = DIRAC_TO_SPAR_HBR_PRED_CHS;
    1268           0 :                 move16();
    1269             :             }
    1270             :         }
    1271             : 
    1272     3050891 :         FOR( j = pred_offset; j < pred_coeff_dim; j++ )
    1273             :         {
    1274     2301883 :             ivas_huffman_encode_fx( &hMdEnc->huff_coeffs.pred_huff_re[qsi], hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j], &code, &len );
    1275     2301883 :             IF( GT_16( ( add( hMetaData->nb_bits_tot, len ) ), hMdEnc->spar_md_cfg.max_bits_per_blk ) )
    1276             :             {
    1277       46349 :                 return -1;
    1278             :             }
    1279     2278730 :             push_next_indice( hMetaData, code, len );
    1280             :         }
    1281             : 
    1282      749008 :         Word16 n = imult1616( ndec, sub( ndm, 1 ) );
    1283     1657787 :         FOR( j = 0; j < n; j++ )
    1284             :         {
    1285      915708 :             ivas_huffman_encode_fx( &hMdEnc->huff_coeffs.drct_huff_re[qsi], hMdEnc->spar_md.band_coeffs_idx[i].drct_index_re[j], &code, &len );
    1286      915708 :             IF( GT_16( ( add( hMetaData->nb_bits_tot, len ) ), hMdEnc->spar_md_cfg.max_bits_per_blk ) )
    1287             :             {
    1288        6929 :                 return -1;
    1289             :             }
    1290      908779 :             push_next_indice( hMetaData, code, len );
    1291             :         }
    1292             : 
    1293     2239623 :         FOR( j = 0; j < ndec; j++ )
    1294             :         {
    1295     1513811 :             ivas_huffman_encode_fx( &hMdEnc->huff_coeffs.decd_huff_re[qsi], hMdEnc->spar_md.band_coeffs_idx[i].decd_index_re[j], &code, &len );
    1296     1513811 :             IF( GT_16( ( add( hMetaData->nb_bits_tot, len ) ), hMdEnc->spar_md_cfg.max_bits_per_blk ) )
    1297             :             {
    1298       16267 :                 return -1;
    1299             :             }
    1300     1497544 :             push_next_indice( hMetaData, code, len );
    1301             :         }
    1302             :     }
    1303             : 
    1304       57891 :     return 0;
    1305             : }
    1306             : 
    1307             : 
    1308             : /*-----------------------------------------------------------------------------------------*
    1309             :  * Function ivas_get_arith_coded_bs()
    1310             :  *
    1311             :  * Generate arithmetic coded bitstream
    1312             :  *-----------------------------------------------------------------------------------------*/
    1313             : 
    1314      259516 : static Word16 ivas_get_arith_coded_bs_fx(
    1315             :     ivas_spar_md_enc_state_t *hMdEnc,
    1316             :     BSTR_ENC_HANDLE hMetaData,
    1317             :     const Word16 *pDo_diff,
    1318             :     const Word16 bands_bw,
    1319             :     const Word16 nB,
    1320             :     const Word16 qsi,
    1321             :     const Word16 strat,
    1322             :     const Word32 ivas_total_brate )
    1323             : {
    1324             :     Word16 i, any_diff;
    1325             :     Word16 j;
    1326             :     ivas_cell_dim_t pred_cell_dims[IVAS_MAX_NUM_BANDS];
    1327             :     ivas_cell_dim_t drct_cell_dims[IVAS_MAX_NUM_BANDS];
    1328             :     ivas_cell_dim_t decd_cell_dims[IVAS_MAX_NUM_BANDS];
    1329             :     ivas_cell_dim_t decx_cell_dims[IVAS_MAX_NUM_BANDS];
    1330             :     Word16 symbol_arr_re[IVAS_MAX_INPUT_LEN];
    1331             :     Word16 symbol_arr_old_re[IVAS_MAX_INPUT_LEN];
    1332             :     Word16 arith_result;
    1333             : 
    1334     2317016 :     FOR( i = 0; i < nB; i++ )
    1335             :     {
    1336             :         Word16 ndm, ndec;
    1337     2057500 :         ndm = hMdEnc->spar_md_cfg.num_dmx_chans_per_band[bands_bw * i];
    1338     2057500 :         ndec = hMdEnc->spar_md_cfg.num_decorr_per_band[bands_bw * i];
    1339     2057500 :         move16();
    1340     2057500 :         move16();
    1341             : 
    1342     2057500 :         test();
    1343     2057500 :         test();
    1344     2057500 :         test();
    1345     2057500 :         test();
    1346     2057500 :         test();
    1347     2057500 :         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 ) ) ) ) )
    1348             :         {
    1349       25906 :             pred_cell_dims[i].dim1 = 0;
    1350       25906 :             pred_cell_dims[i].dim2 = 0;
    1351       25906 :             drct_cell_dims[i].dim1 = 0;
    1352       25906 :             drct_cell_dims[i].dim2 = 0;
    1353       25906 :             decd_cell_dims[i].dim1 = 0;
    1354       25906 :             decd_cell_dims[i].dim2 = 0;
    1355       25906 :             decx_cell_dims[i].dim1 = 0;
    1356       25906 :             decx_cell_dims[i].dim2 = 0;
    1357       25906 :             move16();
    1358       25906 :             move16();
    1359       25906 :             move16();
    1360       25906 :             move16();
    1361       25906 :             move16();
    1362       25906 :             move16();
    1363       25906 :             move16();
    1364       25906 :             move16();
    1365             :         }
    1366             :         ELSE
    1367             :         {
    1368     2031594 :             pred_cell_dims[i].dim1 = sub( add( ndm, ndec ), 1 );
    1369     2031594 :             move16();
    1370     2031594 :             test();
    1371     2031594 :             IF( hMdEnc->spar_hoa_md_flag && hMdEnc->spar_hoa_dirac2spar_md_flag )
    1372             :             {
    1373      145200 :                 IF( GE_16( i, SPAR_DIRAC_SPLIT_START_BAND ) )
    1374             :                 {
    1375       48400 :                     pred_cell_dims[i].dim1 = sub( pred_cell_dims[i].dim1, ( FOA_CHANNELS - 1 ) );
    1376       48400 :                     move16();
    1377             :                 }
    1378             :             }
    1379     2031594 :             pred_cell_dims[i].dim2 = 1;
    1380     2031594 :             drct_cell_dims[i].dim1 = ndec;
    1381     2031594 :             drct_cell_dims[i].dim2 = sub( ndm, 1 );
    1382     2031594 :             decd_cell_dims[i].dim1 = ndec;
    1383     2031594 :             decd_cell_dims[i].dim2 = 1;
    1384     2031594 :             decx_cell_dims[i].dim1 = shr( ( imult1616( ndec, sub( ndec, 1 ) ) ), 1 );
    1385     2031594 :             decx_cell_dims[i].dim2 = 1;
    1386     2031594 :             move16();
    1387     2031594 :             move16();
    1388     2031594 :             move16();
    1389     2031594 :             move16();
    1390     2031594 :             move16();
    1391     2031594 :             move16();
    1392     2031594 :             move16();
    1393             :         }
    1394             :     }
    1395             : 
    1396      259516 :     any_diff = 0;
    1397      259516 :     move16();
    1398     1646589 :     FOR( i = 0; i < nB; i++ )
    1399             :     {
    1400     1473620 :         IF( pDo_diff[i] != 0 )
    1401             :         {
    1402       86547 :             any_diff = 1;
    1403       86547 :             move16();
    1404       86547 :             BREAK;
    1405             :         }
    1406             :     }
    1407             : 
    1408      259516 :     test();
    1409      259516 :     IF( hMdEnc->spar_hoa_md_flag && hMdEnc->spar_hoa_dirac2spar_md_flag )
    1410             :     {
    1411      157300 :         FOR( i = 0; i < nB; i++ )
    1412             :         {
    1413      145200 :             IF( GE_16( i, SPAR_DIRAC_SPLIT_START_BAND ) )
    1414             :             {
    1415      196960 :                 FOR( j = 0; j < pred_cell_dims[i].dim1; j++ )
    1416             :                 {
    1417      148560 :                     hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j] =
    1418      148560 :                         hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j + DIRAC_TO_SPAR_HBR_PRED_CHS];
    1419      148560 :                     move16();
    1420      148560 :                     IF( EQ_16( any_diff, 1 ) )
    1421             :                     {
    1422           0 :                         hMdEnc->spar_md_prior.band_coeffs_idx_mapped[i].pred_index_re[j] =
    1423           0 :                             hMdEnc->spar_md_prior.band_coeffs_idx_mapped[i].pred_index_re[j + DIRAC_TO_SPAR_HBR_PRED_CHS];
    1424           0 :                         move16();
    1425             :                     }
    1426             :                 }
    1427             :             }
    1428             :         }
    1429             :     }
    1430      259516 :     ivas_copy_band_coeffs_idx_to_arr( hMdEnc->spar_md.band_coeffs_idx, nB, symbol_arr_re, pred_cell_dims, PRED_COEFF );
    1431             : 
    1432      259516 :     IF( EQ_16( any_diff, 1 ) )
    1433             :     {
    1434       86547 :         ivas_copy_band_coeffs_idx_to_arr( hMdEnc->spar_md_prior.band_coeffs_idx_mapped, nB, symbol_arr_old_re, pred_cell_dims, PRED_COEFF );
    1435             :     }
    1436             : 
    1437      259516 :     arith_result = ivas_arith_encode_cmplx_cell_array_fx( &hMdEnc->arith_coeffs.pred_arith_re[qsi], &hMdEnc->arith_coeffs.pred_arith_re_diff[qsi], pDo_diff, nB,
    1438      259516 :                                                           symbol_arr_re, symbol_arr_old_re, pred_cell_dims, hMetaData, any_diff, hMdEnc->spar_md_cfg.max_bits_per_blk );
    1439      259516 :     move16();
    1440      259516 :     IF( arith_result < 0 )
    1441             :     {
    1442         969 :         return -1;
    1443             :     }
    1444             : 
    1445      258547 :     test();
    1446      258547 :     IF( hMdEnc->spar_hoa_md_flag && hMdEnc->spar_hoa_dirac2spar_md_flag )
    1447             :     {
    1448      157300 :         FOR( i = 0; i < nB; i++ )
    1449             :         {
    1450      145200 :             IF( GE_16( i, SPAR_DIRAC_SPLIT_START_BAND ) )
    1451             :             {
    1452      196960 :                 FOR( j = pred_cell_dims[i].dim1 - 1; j >= 0; j-- )
    1453             :                 {
    1454      148560 :                     hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j + DIRAC_TO_SPAR_HBR_PRED_CHS] =
    1455      148560 :                         hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j];
    1456      148560 :                     move16();
    1457             :                 }
    1458      193600 :                 FOR( j = 0; j < DIRAC_TO_SPAR_HBR_PRED_CHS; j++ )
    1459             :                 {
    1460      145200 :                     hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j] = 0;
    1461      145200 :                     move16();
    1462             :                 }
    1463             :             }
    1464             :         }
    1465             :     }
    1466             : 
    1467      258547 :     ivas_copy_band_coeffs_idx_to_arr( hMdEnc->spar_md.band_coeffs_idx, nB, symbol_arr_re, drct_cell_dims, DRCT_COEFF );
    1468             : 
    1469      258547 :     IF( EQ_16( any_diff, 1 ) )
    1470             :     {
    1471       86547 :         ivas_copy_band_coeffs_idx_to_arr( hMdEnc->spar_md_prior.band_coeffs_idx_mapped, nB, symbol_arr_old_re, drct_cell_dims, DRCT_COEFF );
    1472             :     }
    1473             : 
    1474             : 
    1475      258547 :     arith_result = ivas_arith_encode_cmplx_cell_array_fx( &hMdEnc->arith_coeffs.drct_arith_re[qsi], &hMdEnc->arith_coeffs.drct_arith_re_diff[qsi], pDo_diff, nB,
    1476      258547 :                                                           symbol_arr_re, symbol_arr_old_re, drct_cell_dims, hMetaData, any_diff, hMdEnc->spar_md_cfg.max_bits_per_blk );
    1477      258547 :     move16();
    1478             : 
    1479      258547 :     IF( arith_result < 0 )
    1480             :     {
    1481           4 :         return -1;
    1482             :     }
    1483             : 
    1484      258543 :     ivas_copy_band_coeffs_idx_to_arr( hMdEnc->spar_md.band_coeffs_idx, nB, symbol_arr_re, decd_cell_dims, DECD_COEFF );
    1485             : 
    1486      258543 :     IF( EQ_16( any_diff, 1 ) )
    1487             :     {
    1488       86543 :         ivas_copy_band_coeffs_idx_to_arr( hMdEnc->spar_md_prior.band_coeffs_idx_mapped, nB, symbol_arr_old_re, decd_cell_dims, DECD_COEFF );
    1489             :     }
    1490             : 
    1491      258543 :     arith_result = ivas_arith_encode_cmplx_cell_array_fx( &hMdEnc->arith_coeffs.decd_arith_re[qsi], &hMdEnc->arith_coeffs.decd_arith_re_diff[qsi], pDo_diff, nB,
    1492      258543 :                                                           symbol_arr_re, symbol_arr_old_re, decd_cell_dims, hMetaData, any_diff, hMdEnc->spar_md_cfg.max_bits_per_blk );
    1493      258543 :     move16();
    1494             : 
    1495      258543 :     IF( arith_result < 0 )
    1496             :     {
    1497       27800 :         return -1;
    1498             :     }
    1499             : 
    1500      230743 :     ivas_copy_band_coeffs_idx_to_arr( hMdEnc->spar_md.band_coeffs_idx, nB, symbol_arr_re, decx_cell_dims, DECX_COEFF );
    1501             : 
    1502      230743 :     IF( EQ_16( any_diff, 1 ) )
    1503             :     {
    1504       85534 :         ivas_copy_band_coeffs_idx_to_arr( hMdEnc->spar_md_prior.band_coeffs_idx_mapped, nB, symbol_arr_old_re, decx_cell_dims, DECX_COEFF );
    1505             :     }
    1506             : 
    1507      230743 :     return 0;
    1508             : }
    1509             : 
    1510             : 
    1511             : /*-----------------------------------------------------------------------------------------*
    1512             :  * Function ivas_select_next_strat()
    1513             :  *
    1514             :  * Select next strategy
    1515             :  *-----------------------------------------------------------------------------------------*/
    1516      160016 : static void ivas_select_next_strat_fx(
    1517             :     ivas_strats_t prior_strat,
    1518             :     ivas_strats_t cs[MAX_QUANT_STRATS],
    1519             :     const Word16 dmx_switch,
    1520             :     const Word16 dtx_vad )
    1521             : {
    1522      160016 :     cs[0] = BASE;
    1523      160016 :     move16();
    1524      160016 :     cs[1] = BASE_NOEC;
    1525      160016 :     move16();
    1526             : 
    1527      160016 :     test();
    1528      160016 :     IF( dmx_switch == 0 && dtx_vad )
    1529             :     {
    1530      160016 :         SWITCH( prior_strat )
    1531             :         {
    1532        2603 :             case START:
    1533        2603 :                 cs[2] = NO_STRAT;
    1534        2603 :                 move16();
    1535        2603 :                 BREAK;
    1536       58839 :             case BASE:
    1537       58839 :                 cs[2] = FOUR_A;
    1538       58839 :                 move16();
    1539       58839 :                 BREAK;
    1540           0 :             case BASE_DIFF:
    1541           0 :                 cs[2] = FOUR_A;
    1542           0 :                 move16();
    1543           0 :                 BREAK;
    1544        3030 :             case BASE_NOEC:
    1545        3030 :                 cs[2] = FOUR_A;
    1546        3030 :                 move16();
    1547        3030 :                 BREAK;
    1548       25931 :             case FOUR_A:
    1549       25931 :                 cs[2] = FOUR_B;
    1550       25931 :                 move16();
    1551       25931 :                 BREAK;
    1552       24213 :             case FOUR_B:
    1553       24213 :                 cs[2] = FOUR_C;
    1554       24213 :                 move16();
    1555       24213 :                 BREAK;
    1556       23162 :             case FOUR_C:
    1557       23162 :                 cs[2] = FOUR_D;
    1558       23162 :                 move16();
    1559       23162 :                 BREAK;
    1560       22238 :             case FOUR_D:
    1561       22238 :                 cs[2] = FOUR_A;
    1562       22238 :                 move16();
    1563       22238 :                 BREAK;
    1564           0 :             default:
    1565           0 :                 assert( !"bad value of prior_strat" );
    1566             :         }
    1567           0 :     }
    1568             : 
    1569      160016 :     return;
    1570             : }
    1571             : 
    1572             : /*-----------------------------------------------------------------------------------------*
    1573             :  * Function ivas_store_prior_coeffs()
    1574             :  *
    1575             :  * Store prior coeffs
    1576             :  *-----------------------------------------------------------------------------------------*/
    1577      160500 : static void ivas_store_prior_coeffs_fx(
    1578             :     ivas_spar_md_enc_state_t *hMdEnc,
    1579             :     const Word16 num_bands,
    1580             :     const Word16 strat,
    1581             :     const Word16 dtx_vad,
    1582             :     const Word16 qsi )
    1583             : {
    1584             :     Word16 i, j, b;
    1585      160500 :     IF( dtx_vad == 0 )
    1586             :     {
    1587        1605 :         hMdEnc->spar_md_cfg.prior_strat = START;
    1588        1605 :         move16();
    1589             :     }
    1590             :     ELSE
    1591             :     {
    1592      158895 :         hMdEnc->spar_md_cfg.prior_strat = strat;
    1593      158895 :         move16();
    1594             :     }
    1595             : 
    1596      160500 :     hMdEnc->spar_md_cfg.prev_quant_idx = qsi;
    1597      160500 :     move16();
    1598             : 
    1599     1469554 :     FOR( i = 0; i < num_bands; i++ )
    1600             :     {
    1601     1309054 :         b = i;
    1602     1309054 :         move16();
    1603             : 
    1604    14399594 :         FOR( j = 0; j < IVAS_SPAR_MAX_CH - 1; j++ )
    1605             :         {
    1606    13090540 :             hMdEnc->spar_md_prior.band_coeffs_idx[i].pred_index_re[j] = hMdEnc->spar_md.band_coeffs_idx[b].pred_index_re[j];
    1607    13090540 :             move16();
    1608    13090540 :             hMdEnc->spar_md_prior.band_coeffs_idx[i].decd_index_re[j] = hMdEnc->spar_md.band_coeffs_idx[b].decd_index_re[j];
    1609    13090540 :             move16();
    1610             :         }
    1611    28799188 :         FOR( j = 0; j < IVAS_SPAR_MAX_C_COEFF; j++ )
    1612             :         {
    1613    27490134 :             hMdEnc->spar_md_prior.band_coeffs_idx[i].drct_index_re[j] = hMdEnc->spar_md.band_coeffs_idx[b].drct_index_re[j];
    1614    27490134 :             move16();
    1615             :         }
    1616             :     }
    1617             : 
    1618      160500 :     return;
    1619             : }
    1620             : 
    1621             : /*-----------------------------------------------------------------------------------------*
    1622             :  * Function ivas_spar_quant_pred_coeffs_dtx()
    1623             :  *
    1624             :  * Calculate quantization pred coeffs
    1625             :  *-----------------------------------------------------------------------------------------*/
    1626        3210 : static void ivas_spar_quant_pred_coeffs_dtx_fx(
    1627             :     ivas_spar_md_t *pSpar_md,
    1628             :     const Word32 *pValues, // Q28
    1629             :     const Word16 ndm,
    1630             :     Word16 *pIndex,
    1631             :     const Word16 dim1,
    1632             :     Word32 *pQuant // Q28
    1633             : )
    1634             : {
    1635             :     Word16 i;
    1636             :     Word16 q_lvl;
    1637             :     Word32 pr_min_max[2];
    1638             : 
    1639        3210 :     pr_min_max[0] = pSpar_md->min_max_fx[0]; // Q28
    1640        3210 :     move32();
    1641        3210 :     pr_min_max[1] = pSpar_md->min_max_fx[1]; // Q28
    1642        3210 :     move32();
    1643             : 
    1644       12840 :     FOR( i = 0; i < dim1; i++ )
    1645             :     {
    1646        9630 :         q_lvl = dtx_pr_real_q_levels[ndm - 1][i];
    1647        9630 :         move16();
    1648        9630 :         ivas_quantise_real_values_enc_fx( &pValues[i], q_lvl, pr_min_max[0], pr_min_max[1], &pIndex[i], &pQuant[i], 1 );
    1649             :     }
    1650             : 
    1651        3210 :     return;
    1652             : }
    1653             : 
    1654             : 
    1655             : /*-----------------------------------------------------------------------------------------*
    1656             :  * Function ivas_quant_p_per_band_dtx()
    1657             :  *
    1658             :  * Calculate quantization p
    1659             :  *-----------------------------------------------------------------------------------------*/
    1660        3210 : static void ivas_quant_p_per_band_dtx_fx(
    1661             :     Word32 *pP_mat, // Q28
    1662             :     const Word16 num_dec,
    1663             :     const Word16 num_dmx,
    1664             :     Word16 *ppIdx_pd,
    1665             :     Word32 *pP_out, // Q28
    1666             :     const Word16 num_ch )
    1667             : {
    1668             :     Word16 i;
    1669        3210 :     Word16 dim = sub( num_ch, num_dmx );
    1670             : 
    1671        3210 :     IF( EQ_16( num_dec, sub( num_ch, 1 ) ) )
    1672             :     {
    1673        6736 :         FOR( i = 0; i < dim; i++ )
    1674             :         {
    1675        5052 :             test();
    1676        5052 :             IF( LT_32( pP_mat[i], pr_boost_range_fx[1] ) && GT_32( pP_mat[i], pr_boost_range_fx[0] ) )
    1677             :             {
    1678        1912 :                 pP_mat[i] = pr_boost_range_fx[1]; // Q28
    1679        1912 :                 move32();
    1680             :             }
    1681             :         }
    1682             :     }
    1683             : 
    1684        3210 :     IF( NE_16( dim, num_dec ) )
    1685             :     {
    1686           0 :         assert( !"Not Supported!" );
    1687             :     }
    1688             : 
    1689       11314 :     FOR( i = 0; i < dim; i++ )
    1690             :     {
    1691        8104 :         ivas_quantise_real_values_enc_fx( &pP_mat[i], dtx_pd_real_q_levels[num_ch - num_dec - 1][i], dtx_pd_real_min_max_fx[0], dtx_pd_real_min_max_fx[1], &ppIdx_pd[i], &pP_out[i], 1 );
    1692             :     }
    1693             : 
    1694        3210 :     return;
    1695             : }
    1696             : /*-----------------------------------------------------------------------------------------*
    1697             :  * Function ivas_write_parameter_bitstream_dtx()
    1698             :  *
    1699             :  * Write MD DTX parameters into bitstream
    1700             :  *-----------------------------------------------------------------------------------------*/
    1701             : 
    1702        1605 : static void ivas_write_parameter_bitstream_dtx_fx(
    1703             :     ivas_spar_md_t *pSpar_md,
    1704             :     BSTR_ENC_HANDLE hMetaData,
    1705             :     Word16 *num_dmx,
    1706             :     Word16 *num_dec,
    1707             :     const Word16 num_bands )
    1708             : {
    1709             :     Word16 i, j;
    1710             :     Word32 val;
    1711             :     Word16 idx;
    1712             :     Word32 pr_min_max[2];
    1713             :     Word16 zero_pad_bits, sid_bits_len;
    1714             :     Word16 sba_spar_bitlen;
    1715             : 
    1716        1605 :     sid_bits_len = hMetaData->nb_bits_tot;
    1717        1605 :     move16();
    1718        1605 :     pr_min_max[0] = pSpar_md->min_max_fx[0];
    1719        1605 :     move32();
    1720        1605 :     pr_min_max[1] = pSpar_md->min_max_fx[1];
    1721        1605 :     move32();
    1722             : 
    1723        4815 :     FOR( i = 0; i < num_bands; i++ )
    1724             :     {
    1725        3210 :         Word16 ndm = num_dmx[i];
    1726        3210 :         move16();
    1727        3210 :         Word16 ndec = num_dec[i];
    1728        3210 :         move16();
    1729             : 
    1730       12840 :         FOR( j = 0; j < FOA_CHANNELS - 1; j++ )
    1731             :         {
    1732             :             Word16 pr, pd;
    1733             :             Word16 pr_q_lvls, pd_q_lvls, pr_pd_bits;
    1734             :             Word16 pr_idx_1, pr_idx_2, pd_idx_1, pd_idx_2;
    1735             :             UWord16 value;
    1736             : 
    1737        9630 :             pr_idx_1 = pr_pr_idx_pairs[ndm - 1][j][0];
    1738        9630 :             move16();
    1739        9630 :             pr_idx_2 = pr_pr_idx_pairs[ndm - 1][j][1];
    1740        9630 :             move16();
    1741        9630 :             pd_idx_1 = pr_pd_idx_pairs[ndm - 1][j][0];
    1742        9630 :             move16();
    1743        9630 :             pd_idx_2 = pr_pd_idx_pairs[ndm - 1][j][1];
    1744        9630 :             move16();
    1745             : 
    1746        9630 :             test();
    1747        9630 :             test();
    1748        9630 :             test();
    1749        9630 :             IF( pr_idx_1 != 0 || pd_idx_1 != 0 || pr_idx_2 != 0 || pd_idx_2 != 0 )
    1750             :             {
    1751        9630 :                 pr_q_lvls = dtx_pr_real_q_levels[ndm - 1][pd_idx_1 - 1];
    1752        9630 :                 move16();
    1753        9630 :                 pr = pSpar_md->band_coeffs_idx[i].pred_index_re[pd_idx_1 - 1];
    1754        9630 :                 move16();
    1755             : 
    1756        9630 :                 IF( GT_16( add( j, 1 ), ndec ) )
    1757             :                 {
    1758        1526 :                     pd_q_lvls = 1;
    1759        1526 :                     move16();
    1760        1526 :                     pd = 0;
    1761        1526 :                     move16();
    1762             :                 }
    1763             :                 ELSE
    1764             :                 {
    1765        8104 :                     pd_q_lvls = dtx_pd_real_q_levels[ndm - 1][pd_idx_2 - 1];
    1766        8104 :                     move16();
    1767        8104 :                     pd = pSpar_md->band_coeffs_idx[i].decd_index_re[pd_idx_2 - 1];
    1768        8104 :                     move16();
    1769             :                 }
    1770        9630 :                 val = dtx_pd_real_min_max_fx[0];
    1771        9630 :                 move32();
    1772        9630 :                 ivas_quantise_real_values_enc_fx( &val, pd_q_lvls, dtx_pd_real_min_max_fx[0], dtx_pd_real_min_max_fx[1], &idx, &val, 1 );
    1773             : 
    1774        9630 :                 pd = sub( pd, idx );
    1775             : 
    1776        9630 :                 val = pr_min_max[0];
    1777        9630 :                 move32();
    1778        9630 :                 ivas_quantise_real_values_enc_fx( &val, pr_q_lvls, pr_min_max[0], pr_min_max[1], &idx, &val, 1 );
    1779             : 
    1780        9630 :                 pr = sub( pr, idx );
    1781        9630 :                 pr_pd_bits = ivas_get_bits_to_encode( i_mult( pd_q_lvls, pr_q_lvls ) );
    1782             : 
    1783        9630 :                 value = (UWord16) ( add( i_mult( pr, pd_q_lvls ), pd ) );
    1784             : 
    1785        9630 :                 push_next_indice( hMetaData, value, pr_pd_bits );
    1786             :             }
    1787             :         }
    1788             :     }
    1789             : 
    1790        1605 :     sid_bits_len = sub( hMetaData->nb_bits_tot, sid_bits_len );
    1791        1605 :     sba_spar_bitlen = ivas_sba_spar_sid_bitlen_fx( num_dmx[0] );
    1792        1605 :     zero_pad_bits = sub( sba_spar_bitlen, sid_bits_len );
    1793             : 
    1794        1605 :     assert( zero_pad_bits >= 0 );
    1795        1605 :     IF( EQ_16( num_dmx[0], 2 ) )
    1796             :     {
    1797         763 :         zero_pad_bits = sub( zero_pad_bits, 1 );
    1798             :     }
    1799             : 
    1800        2368 :     WHILE( zero_pad_bits > 0 )
    1801             :     {
    1802         763 :         j = s_min( zero_pad_bits, 16 );
    1803         763 :         push_next_indice( hMetaData, 0, j );
    1804         763 :         zero_pad_bits = sub( zero_pad_bits, j );
    1805             :     }
    1806             : 
    1807        1605 :     return;
    1808             : }
    1809             : 
    1810             : 
    1811             : /*-----------------------------------------------------------------------------------------*
    1812             :  * Function ivas_quant_pred_coeffs_per_band()
    1813             :  *
    1814             :  * Quantization of prediction coefficients
    1815             :  *-----------------------------------------------------------------------------------------*/
    1816     1313312 : static void ivas_quant_pred_coeffs_per_band_fx(
    1817             :     ivas_band_coeffs_t *pband_coeffs,
    1818             :     ivas_band_coeffs_ind_t *pBand_coeffs_idx,
    1819             :     ivas_quant_strat_t *pQs,
    1820             :     const Word16 num_ch )
    1821             : {
    1822     1313312 :     ivas_quantise_real_values_enc_fx( pband_coeffs->pred_re_fx, pQs->PR.q_levels[0], pQs->PR.min_fx, pQs->PR.max_fx, pBand_coeffs_idx->pred_index_re, pband_coeffs->pred_quant_re_fx, sub( num_ch, 1 ) );
    1823             : 
    1824     1313312 :     return;
    1825             : }
    1826             : 
    1827             : /*-----------------------------------------------------------------------------------------*
    1828             :  * Function ivas_quant_c_per_band()
    1829             :  *
    1830             :  * Quantization of cross prediction c coeffs for each band
    1831             :  *-----------------------------------------------------------------------------------------*/
    1832      862622 : static void ivas_quant_c_per_band_fx(
    1833             :     ivas_band_coeffs_t *pband_coeffs,
    1834             :     ivas_band_coeffs_ind_t *pBand_coeffs_idx,
    1835             :     ivas_quant_strat_t *pQs,
    1836             :     const Word16 ndec,
    1837             :     const Word16 ndm,
    1838             :     const Word16 q_C )
    1839             : {
    1840             :     Word16 i;
    1841             :     Word16 j, k;
    1842             :     Word32 C_re[IVAS_SPAR_MAX_C_COEFF];
    1843      862622 :     k = 0;
    1844      862622 :     move16();
    1845     3015394 :     FOR( i = 0; i < ndec; i++ )
    1846             :     {
    1847     7028256 :         FOR( j = 0; j < ndm - 1; j++ )
    1848             :         {
    1849     4875484 :             C_re[k] = pband_coeffs->C_re_fx[i][j];
    1850     4875484 :             move32();
    1851     4875484 :             k++;
    1852             :         }
    1853             :     }
    1854      862622 :     ivas_quantise_real_values_enc_fx_varq( C_re, pQs->C.q_levels[0], pQs->C.min_fx, pQs->C.max_fx, pBand_coeffs_idx->drct_index_re, C_re, ndec * ( ndm - 1 ), q_C );
    1855      862622 :     k = 0;
    1856      862622 :     move16();
    1857     3015394 :     FOR( i = 0; i < ndec; i++ )
    1858             :     {
    1859     7028256 :         FOR( j = 0; j < ndm - 1; j++ )
    1860             :         {
    1861     4875484 :             pband_coeffs->C_quant_re_fx[i][j] = C_re[k];
    1862     4875484 :             move32();
    1863     4875484 :             k++;
    1864             :         }
    1865             :     }
    1866             : 
    1867      862622 :     return;
    1868             : }
    1869             : 
    1870             : 
    1871             : /*-----------------------------------------------------------------------------------------*
    1872             :  * Function ivas_quant_p_per_band()
    1873             :  *
    1874             :  * Quantization of decorrelation p coeffs for each band
    1875             :  *-----------------------------------------------------------------------------------------*/
    1876     1160272 : static void ivas_quant_p_per_band_fx(
    1877             :     ivas_band_coeffs_t *pband_coeffs,
    1878             :     ivas_band_coeffs_ind_t *pBand_coeffs_idx,
    1879             :     ivas_quant_strat_t *pQs,
    1880             :     const Word16 num_ch )
    1881             : {
    1882     1160272 :     ivas_quantise_real_values_enc_fx( pband_coeffs->P_re_fx, pQs->P_r.q_levels[0], pQs->P_r.min_fx, pQs->P_r.max_fx, pBand_coeffs_idx->decd_index_re, pband_coeffs->P_quant_re_fx, sub( num_ch, 1 ) );
    1883             : 
    1884     1160272 :     return;
    1885             : }

Generated by: LCOV version 1.14