LCOV - code coverage report
Current view: top level - lib_enc - ivas_spar_md_enc.c (source / functions) Hit Total Coverage
Test: Coverage on main @ fec202a8f89be4a2f278a9fc377bfb58b58fab11 Lines: 565 591 95.6 %
Date: 2025-09-11 08:49:05 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 "options.h"
      35             : #include "prot.h"
      36             : #include "ivas_prot.h"
      37             : #ifdef DEBUGGING
      38             : #include "debug.h"
      39             : #endif
      40             : #include "math.h"
      41             : #include "ivas_rom_com.h"
      42             : #include <assert.h>
      43             : #include "wmc_auto.h"
      44             : 
      45             : /*------------------------------------------------------------------------------------------*
      46             :  * PreProcessor
      47             :  *------------------------------------------------------------------------------------------*/
      48             : 
      49             : static const float pr_boost_range[2] = { 0.1f, 0.4f };
      50             : 
      51             : typedef enum ivas_strats_t
      52             : {
      53             :     START,
      54             :     BASE,
      55             :     BASE_DIFF,
      56             :     BASE_NOEC,
      57             :     FOUR_A,
      58             :     FOUR_B,
      59             :     FOUR_C,
      60             :     FOUR_D,
      61             :     NO_STRAT
      62             : } ivas_strats_t;
      63             : 
      64             : 
      65             : /*------------------------------------------------------------------------------------------*
      66             :  * Static functions declaration
      67             :  *------------------------------------------------------------------------------------------*/
      68             : 
      69             : static void ivas_band_mixer( float *cov_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], const int16_t num_ch, int16_t *num_bands, int16_t red_band_fact );
      70             : 
      71             : static int16_t ivas_get_huffman_coded_bs( ivas_spar_md_enc_state_t *hMdEnc, BSTR_ENC_HANDLE hMetaData, const int16_t nB, const int16_t qsi, const int16_t bands_bw );
      72             : 
      73             : static int16_t ivas_get_arith_coded_bs( ivas_spar_md_enc_state_t *hMdEnc, BSTR_ENC_HANDLE hMetaData, const int16_t *pDo_diff, const int16_t bands_bw, const int16_t nB, const int16_t qsi, const int16_t strat, const int32_t ivas_total_brate );
      74             : 
      75             : static void ivas_spar_set_enc_config( ivas_spar_md_enc_state_t *hMdEnc, int16_t *max_freq_per_chan, const int16_t nchan_transport, float *pFC, const int16_t nchan_inp );
      76             : 
      77             : static void ivas_select_next_strat( ivas_strats_t prior_strat, ivas_strats_t cs[MAX_QUANT_STRATS], const int16_t dmx_switch, const int16_t dtx_vad );
      78             : 
      79             : static void ivas_store_prior_coeffs( ivas_spar_md_enc_state_t *hMdEnc, const int16_t num_bands, const int16_t strat, const int16_t dtx_vad, const int16_t qsi );
      80             : 
      81             : static void ivas_write_spar_md_bitstream( ivas_spar_md_enc_state_t *hMdEnc, const int16_t nB, const int16_t bands_bw, BSTR_ENC_HANDLE hMetaData, const int32_t ivas_total_brate, const int16_t strat, const int16_t qsi );
      82             : 
      83             : static void ivas_spar_quant_pred_coeffs_dtx( ivas_spar_md_t *pSpar_md, const float *pValues, const int16_t ndm, int16_t *pIndex, const int16_t dim1, float *pQuant );
      84             : 
      85             : static void ivas_quant_p_per_band_dtx( float *pP_mat, const int16_t num_dec, const int16_t num_dmx, int16_t *ppIdx_pd, float *pP_out, const int16_t num_ch );
      86             : 
      87             : static void ivas_write_parameter_bitstream_dtx( ivas_spar_md_t *pSpar_md, BSTR_ENC_HANDLE hMetaData, int16_t *num_dmx, int16_t *num_dec, const int16_t num_bands );
      88             : 
      89             : static void ivas_quant_p_per_band( ivas_band_coeffs_t *pband_coeffs, ivas_band_coeffs_ind_t *pBand_coeffs_idx, ivas_quant_strat_t *pQs, const int16_t num_ch );
      90             : 
      91             : static void ivas_quant_c_per_band( ivas_band_coeffs_t *pband_coeffs, ivas_band_coeffs_ind_t *pBand_coeffs_idx, ivas_quant_strat_t *pQs, const int16_t ndec, const int16_t ndm );
      92             : 
      93             : static void ivas_quant_pred_coeffs_per_band( ivas_band_coeffs_t *pband_coeffs, ivas_band_coeffs_ind_t *pBand_coeffs_idx, ivas_quant_strat_t *pQs, const int16_t num_ch );
      94             : 
      95             : 
      96             : /*-------------------------------------------------------------------------
      97             :  * ivas_spar_md_enc_open()
      98             :  *
      99             :  * Allocate and initialize SPAR MD encoder handle
     100             :  *------------------------------------------------------------------------*/
     101             : 
     102       15788 : ivas_error ivas_spar_md_enc_open(
     103             :     ivas_spar_md_enc_state_t **hMdEnc_in,       /* i/o: SPAR MD encoder handle  */
     104             :     const ENCODER_CONFIG_HANDLE hEncoderConfig, /* i  : configuration structure */
     105             :     const int16_t sba_order                     /* i  : Ambisonic (SBA) order   */
     106             : )
     107             : {
     108             :     ivas_spar_md_enc_state_t *hMdEnc;
     109             :     ivas_error error;
     110             :     int16_t num_channels, i, j;
     111       15788 :     error = IVAS_ERR_OK;
     112             : 
     113       15788 :     if ( ( hMdEnc = (ivas_spar_md_enc_state_t *) malloc( sizeof( ivas_spar_md_enc_state_t ) ) ) == NULL )
     114             :     {
     115           0 :         return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD encoder" );
     116             :     }
     117             : 
     118       15788 :     num_channels = ivas_sba_get_nchan_metadata( sba_order, hEncoderConfig->ivas_total_brate );
     119             : 
     120       15788 :     if ( ( hMdEnc->spar_md.band_coeffs = (ivas_band_coeffs_t *) malloc( IVAS_MAX_NUM_BANDS * sizeof( ivas_band_coeffs_t ) ) ) == NULL )
     121             :     {
     122           0 :         return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for band_coeffs in SPAR MD" );
     123             :     }
     124       15788 :     if ( ( hMdEnc->mixer_mat = (float ***) malloc( num_channels * sizeof( float ** ) ) ) == NULL )
     125             :     {
     126           0 :         return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" );
     127             :     }
     128       91127 :     for ( i = 0; i < num_channels; i++ )
     129             :     {
     130       75339 :         if ( ( hMdEnc->mixer_mat[i] = (float **) malloc( num_channels * sizeof( float * ) ) ) == NULL )
     131             :         {
     132           0 :             return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" );
     133             :         }
     134      489188 :         for ( j = 0; j < num_channels; j++ )
     135             :         {
     136      413849 :             if ( ( hMdEnc->mixer_mat[i][j] = (float *) malloc( IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL )
     137             :             {
     138           0 :                 return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" );
     139             :             }
     140             :         }
     141             :     }
     142             : 
     143       15788 :     if ( ( hMdEnc->mixer_mat_local = (float ***) malloc( num_channels * sizeof( float ** ) ) ) == NULL )
     144             :     {
     145           0 :         return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" );
     146             :     }
     147       91127 :     for ( i = 0; i < num_channels; i++ )
     148             :     {
     149       75339 :         if ( ( hMdEnc->mixer_mat_local[i] = (float **) malloc( num_channels * sizeof( float * ) ) ) == NULL )
     150             :         {
     151           0 :             return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" );
     152             :         }
     153      489188 :         for ( j = 0; j < num_channels; j++ )
     154             :         {
     155      413849 :             if ( ( hMdEnc->mixer_mat_local[i][j] = (float *) malloc( IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL )
     156             :             {
     157           0 :                 return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" );
     158             :             }
     159             :         }
     160             :     }
     161             : 
     162       15788 :     if ( ( error = ivas_spar_md_enc_init( hMdEnc, hEncoderConfig, sba_order ) ) != IVAS_ERR_OK )
     163             :     {
     164           0 :         return error;
     165             :     }
     166             : 
     167       15788 :     *hMdEnc_in = hMdEnc;
     168             : 
     169       15788 :     return error;
     170             : }
     171             : 
     172             : 
     173             : /*-------------------------------------------------------------------------
     174             :  * ivas_spar_md_enc_close()
     175             :  *
     176             :  * Deallocate SPAR MD encoder handle
     177             :  *------------------------------------------------------------------------*/
     178             : 
     179       15788 : void ivas_spar_md_enc_close(
     180             :     ivas_spar_md_enc_state_t **hMdEnc_in /* i/o: SPAR MD encoder handle      */
     181             : )
     182             : {
     183             :     int16_t num_channels, i, j;
     184             :     ivas_spar_md_enc_state_t *hMdEnc;
     185             : 
     186       15788 :     if ( hMdEnc_in == NULL || *hMdEnc_in == NULL )
     187             :     {
     188           0 :         return;
     189             :     }
     190             : 
     191       15788 :     hMdEnc = *hMdEnc_in;
     192       15788 :     num_channels = hMdEnc->num_umx_ch;
     193             : 
     194       15788 :     if ( hMdEnc->spar_md.band_coeffs != NULL )
     195             :     {
     196       15788 :         free( hMdEnc->spar_md.band_coeffs );
     197       15788 :         hMdEnc->spar_md.band_coeffs = NULL;
     198             :     }
     199       15788 :     if ( hMdEnc->mixer_mat != NULL )
     200             :     {
     201       91127 :         for ( i = 0; i < num_channels; i++ )
     202             :         {
     203      489188 :             for ( j = 0; j < num_channels; j++ )
     204             :             {
     205      413849 :                 free( hMdEnc->mixer_mat[i][j] );
     206             :             }
     207       75339 :             free( hMdEnc->mixer_mat[i] );
     208             :         }
     209       15788 :         free( hMdEnc->mixer_mat );
     210             :     }
     211             : 
     212       15788 :     if ( hMdEnc->mixer_mat_local != NULL )
     213             :     {
     214       91127 :         for ( i = 0; i < num_channels; i++ )
     215             :         {
     216             : 
     217      489188 :             for ( j = 0; j < num_channels; j++ )
     218             :             {
     219      413849 :                 free( hMdEnc->mixer_mat_local[i][j] );
     220             :             }
     221       75339 :             free( hMdEnc->mixer_mat_local[i] );
     222             :         }
     223       15788 :         free( hMdEnc->mixer_mat_local );
     224             :     }
     225             : 
     226       15788 :     free( *hMdEnc_in );
     227       15788 :     *hMdEnc_in = NULL;
     228             : 
     229       15788 :     return;
     230             : }
     231             : 
     232             : 
     233             : /*-----------------------------------------------------------------------------------------*
     234             :  * Function ivas_spar_md_enc_init()
     235             :  *
     236             :  * SPAR MD encoder initialization
     237             :  *-----------------------------------------------------------------------------------------*/
     238             : 
     239       19638 : ivas_error ivas_spar_md_enc_init(
     240             :     ivas_spar_md_enc_state_t *hMdEnc,           /* o  : MD encoder handle        */
     241             :     const ENCODER_CONFIG_HANDLE hEncoderConfig, /* i  : configuration structure  */
     242             :     const int16_t sba_order                     /* i  : Ambisonic (SBA) order    */
     243             : )
     244             : {
     245             :     float pFC[IVAS_MAX_NUM_BANDS];
     246             :     int16_t table_idx;
     247             :     float PR_minmax[2];
     248             :     int16_t num_channels, i, j, k;
     249             : 
     250       19638 :     ivas_sba_get_spar_hoa_md_flag( sba_order, hEncoderConfig->ivas_total_brate, &hMdEnc->spar_hoa_md_flag, &hMdEnc->spar_hoa_dirac2spar_md_flag );
     251       19638 :     num_channels = ivas_sba_get_nchan_metadata( sba_order, hEncoderConfig->ivas_total_brate );
     252       19638 :     ivas_sba_get_spar_hoa_ch_ind( num_channels, hEncoderConfig->ivas_total_brate, hMdEnc->HOA_md_ind );
     253       19638 :     table_idx = ivas_get_spar_table_idx( hEncoderConfig->ivas_total_brate, sba_order, SPAR_CONFIG_BW, NULL, NULL );
     254             : 
     255       19638 :     hMdEnc->spar_md.prior_dyn_active_w_flag = 0;
     256             : 
     257             : #ifndef DEBUG_AGC_ENCODER_CMD_OPTION
     258       19638 :     ivas_spar_set_bitrate_config( &hMdEnc->spar_md_cfg, table_idx, ( hMdEnc->spar_hoa_md_flag ) ? IVAS_MAX_NUM_BANDS : SPAR_DIRAC_SPLIT_START_BAND,
     259       19638 :                                   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 ) );
     260             : #else
     261             :     ivas_spar_set_bitrate_config( &hMdEnc->spar_md_cfg, table_idx, ( hMdEnc->spar_hoa_md_flag ) ? IVAS_MAX_NUM_BANDS : SPAR_DIRAC_SPLIT_START_BAND,
     262             :                                   hMdEnc->spar_hoa_dirac2spar_md_flag, 1, hEncoderConfig->Opt_PCA_ON, ivas_agc_enc_get_flag( hEncoderConfig->Opt_AGC_ON, ivas_spar_br_table_consts[table_idx].nchan_transport ) );
     263             : #endif
     264             : 
     265             :     /* get FB coefficients */
     266      255294 :     for ( i = 0; i < IVAS_MAX_NUM_BANDS; i++ )
     267             :     {
     268      235656 :         pFC[i] = ivas_fb_fcs_12band_1ms[i] * hEncoderConfig->input_Fs * 0.5f;
     269             :     }
     270             : 
     271       19638 :     ivas_spar_set_enc_config( hMdEnc, hMdEnc->spar_md_cfg.max_freq_per_chan, hMdEnc->spar_md_cfg.nchan_transport, pFC, num_channels );
     272             : 
     273       19638 :     if ( hMdEnc->spar_md_cfg.nchan_transport != 2 && ( ( hMdEnc->spar_md_cfg.remix_unmix_order == 1 ) || ( hMdEnc->spar_md_cfg.remix_unmix_order == 2 ) ) )
     274             :     {
     275           0 :         return IVAS_ERR_INTERNAL;
     276             :     }
     277             : 
     278       19638 :     ivas_spar_arith_coeffs_com_init( &hMdEnc->arith_coeffs, &hMdEnc->spar_md_cfg, table_idx, ENC );
     279       19638 :     ivas_spar_huff_coeffs_com_init( &hMdEnc->huff_coeffs, NULL, table_idx, ENC );
     280             : 
     281       19638 :     if ( hEncoderConfig->Opt_DTX_ON == 1 )
     282             :     {
     283             :         /* DTX quant init */
     284        2920 :         PR_minmax[0] = hMdEnc->spar_md_cfg.quant_strat[0].PR.min;
     285        2920 :         PR_minmax[1] = hMdEnc->spar_md_cfg.quant_strat[0].PR.max;
     286        2920 :         ivas_spar_quant_dtx_init( &hMdEnc->spar_md, PR_minmax );
     287             :     }
     288             : 
     289       19638 :     hMdEnc->spar_md_cfg.prior_strat = START;
     290       19638 :     hMdEnc->spar_md_cfg.prev_quant_idx = -1;
     291             : 
     292      110671 :     for ( i = 0; i < num_channels; i++ )
     293             :     {
     294      569926 :         for ( j = 0; j < num_channels; j++ )
     295             :         {
     296     6225609 :             for ( k = 0; k < IVAS_MAX_NUM_BANDS; k++ )
     297             :             {
     298     5746716 :                 hMdEnc->mixer_mat[i][j][k] = 0;
     299             :             }
     300             :         }
     301             :     }
     302             : 
     303       19638 :     ivas_clear_band_coeffs( hMdEnc->spar_md.band_coeffs, IVAS_MAX_NUM_BANDS );
     304       19638 :     ivas_clear_band_coeff_idx( hMdEnc->spar_md.band_coeffs_idx, IVAS_MAX_NUM_BANDS );
     305       19638 :     ivas_clear_band_coeff_idx( hMdEnc->spar_md_prior.band_coeffs_idx, IVAS_MAX_NUM_BANDS );
     306       19638 :     ivas_clear_band_coeff_idx( hMdEnc->spar_md_prior.band_coeffs_idx_mapped, IVAS_MAX_NUM_BANDS );
     307             : 
     308       19638 :     return IVAS_ERR_OK;
     309             : }
     310             : 
     311             : 
     312             : /*-----------------------------------------------------------------------------------------*
     313             :  * Function ivas_spar_set_enc_config()
     314             :  *
     315             :  * Set configuration for SPAR MD encoder
     316             :  *-----------------------------------------------------------------------------------------*/
     317             : 
     318       19638 : static void ivas_spar_set_enc_config(
     319             :     ivas_spar_md_enc_state_t *hMdEnc,
     320             :     int16_t *max_freq_per_chan,
     321             :     const int16_t nchan_transport,
     322             :     float *pFC,
     323             :     const int16_t nchan_inp )
     324             : {
     325             :     int16_t i, j;
     326             :     int16_t tmp_dmx_ch;
     327             : 
     328       65347 :     for ( i = 0; i < nchan_transport; i++ )
     329             :     {
     330       45709 :         if ( max_freq_per_chan != NULL )
     331             :         {
     332       45709 :             hMdEnc->spar_md_cfg.max_freq_per_chan[i] = ( max_freq_per_chan[i] != 0 ) ? max_freq_per_chan[i] : max_freq_per_chan[0];
     333             :         }
     334             :         else
     335             :         {
     336           0 :             hMdEnc->spar_md_cfg.max_freq_per_chan[i] = IVAS_SPAR_FOA_DFLT_FREQ_PER_CHAN;
     337             :         }
     338             :     }
     339       19638 :     hMdEnc->num_umx_ch = nchan_inp;
     340       19638 :     hMdEnc->num_decorr = nchan_inp - 1;
     341             : 
     342      255294 :     for ( i = 0; i < IVAS_MAX_NUM_BANDS; i++ )
     343             :     {
     344      235656 :         tmp_dmx_ch = 0;
     345      784164 :         for ( j = 0; j < nchan_transport; j++ )
     346             :         {
     347      548508 :             if ( pFC[i] < hMdEnc->spar_md_cfg.max_freq_per_chan[j] )
     348             :             {
     349      548508 :                 tmp_dmx_ch += 1;
     350             :             }
     351             :         }
     352             : 
     353      235656 :         hMdEnc->spar_md_cfg.num_dmx_chans_per_band[i] = tmp_dmx_ch;
     354      235656 :         hMdEnc->spar_md_cfg.num_decorr_per_band[i] = hMdEnc->num_umx_ch - tmp_dmx_ch;
     355             :     }
     356             : 
     357       19638 :     return;
     358             : }
     359             : 
     360             : 
     361             : /*-----------------------------------------------------------------------------------------*
     362             :  * Function ivas_band_limit_dmx_matrix()
     363             :  *
     364             :  * Band limit downmix matrix
     365             :  *-----------------------------------------------------------------------------------------*/
     366             : 
     367     2523413 : static void ivas_band_limit_dmx_matrix(
     368             :     ivas_spar_md_enc_state_t *hMdEnc, /* i/o: SPAR MD encoder handle      */
     369             :     const int16_t num_ch,
     370             :     const int16_t num_bands,
     371             :     const int16_t bands_bw )
     372             : {
     373             :     int16_t i, j, b, ndm;
     374             : 
     375    22722579 :     for ( b = 0; b < num_bands; b++ )
     376             :     {
     377    20199166 :         ndm = hMdEnc->spar_md_cfg.num_dmx_chans_per_band[b * bands_bw];
     378             : 
     379    63669192 :         for ( i = ndm; i < num_ch; i++ )
     380             :         {
     381   280619374 :             for ( j = 0; j < num_ch; j++ )
     382             :             {
     383   237149348 :                 hMdEnc->mixer_mat[i][j][b] = 0;
     384             :             }
     385             :         }
     386             :     }
     387             : 
     388     2523413 :     return;
     389             : }
     390             : 
     391             : 
     392             : /*-----------------------------------------------------------------------------------------*
     393             :  * Function ivas_band_mixing()
     394             :  *
     395             :  * Band mixing downmix matrix
     396             :  *-----------------------------------------------------------------------------------------*/
     397             : 
     398      199311 : static void ivas_band_mixing(
     399             :     ivas_spar_md_enc_state_t *hMdEnc, /* i/o: SPAR MD encoder handle      */
     400             :     const int16_t num_ch,
     401             :     const int16_t num_bands,
     402             :     const int16_t nchan_transport,
     403             :     const int16_t upmixed_bands )
     404             : {
     405             :     int16_t i, j, k, b;
     406             :     int16_t red_band_fact;
     407             : 
     408      199311 :     red_band_fact = upmixed_bands / num_bands;
     409             : 
     410      404154 :     for ( i = 0; i < nchan_transport; i++ )
     411             :     {
     412     1024215 :         for ( j = 0; j < num_ch; j++ )
     413             :         {
     414     3939732 :             for ( k = num_bands - 1; k >= 0; k-- )
     415             :             {
     416     9675336 :                 for ( b = red_band_fact - 1; b >= 0; b-- )
     417             :                 {
     418     6554976 :                     hMdEnc->mixer_mat[i][j][red_band_fact * k + b] = hMdEnc->mixer_mat[i][j][k];
     419             :                 }
     420             :             }
     421      819372 :             for ( k = red_band_fact * num_bands; k < upmixed_bands; k++ )
     422             :             {
     423           0 :                 hMdEnc->mixer_mat[i][j][k] = hMdEnc->mixer_mat[i][j][( red_band_fact * num_bands ) - 1];
     424             :             }
     425             :         }
     426             :     }
     427      199311 :     return;
     428             : }
     429             : 
     430             : 
     431             : /*-----------------------------------------------------------------------------------------*
     432             :  * Function write_metadata_buffer()
     433             :  *
     434             :  *
     435             :  *-----------------------------------------------------------------------------------------*/
     436             : 
     437     3959147 : static void write_metadata_buffer(
     438             :     BSTR_ENC_HANDLE hMetaData_tmp,
     439             :     BSTR_ENC_HANDLE hMetaData,
     440             :     const int16_t bit_pos_start,
     441             :     const int16_t next_ind_start )
     442             : {
     443             :     int16_t i;
     444             : 
     445     3959147 :     if ( hMetaData->nb_bits_tot > 0 )
     446             :     {
     447     3959147 :         restore_metadata_buffer( hMetaData, next_ind_start, bit_pos_start );
     448             :     }
     449             : 
     450   547688299 :     for ( i = 0; i < hMetaData_tmp->nb_ind_tot; i++ )
     451             :     {
     452             : #if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS )
     453             :         push_next_indice_( hMetaData_tmp->ind_list[i].function_name, hMetaData, hMetaData_tmp->ind_list[i].value, hMetaData_tmp->ind_list[i].nb_bits );
     454             : #else
     455   543729152 :         push_next_indice( hMetaData, hMetaData_tmp->ind_list[i].value, hMetaData_tmp->ind_list[i].nb_bits );
     456             : #endif
     457             :     }
     458             : 
     459     3959147 :     return;
     460             : }
     461             : 
     462             : 
     463             : /*-----------------------------------------------------------------------------------------*
     464             :  * Function ivas_spar_md_enc_process()
     465             :  *
     466             :  * SPAR FoA Meta Data generation process
     467             :  *-----------------------------------------------------------------------------------------*/
     468             : 
     469     2511926 : ivas_error ivas_spar_md_enc_process(
     470             :     ivas_spar_md_enc_state_t *hMdEnc,           /* i/o: SPAR MD encoder handle      */
     471             :     const ENCODER_CONFIG_HANDLE hEncoderConfig, /* i  : configuration structure     */
     472             :     float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH],
     473             :     float *cov_dtx_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH],
     474             :     BSTR_ENC_HANDLE hMetaData, /* i/o: MetaData handle             */
     475             :     const int16_t dtx_vad,
     476             :     const int16_t nchan_inp,
     477             :     const int16_t sba_order,                                                    /* i  : Ambisonic (SBA) order       */
     478             :     float *prior_mixer[IVAS_MAX_FB_MIXER_OUT_CH][IVAS_MAX_SPAR_FB_MIXER_IN_CH], /* i  : prior mixer_matrix                     */
     479             :     const int16_t dyn_active_w_flag,                                            /* i  : flag to indicate dynamic active W      */
     480             :     const int16_t dirac_mono_flag                                               /* i  : flag to indicate mono only mode in SBA */
     481             : )
     482             : {
     483             :     float pred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS];
     484             :     float dm_fv_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS];
     485             :     int16_t i, j, b, qsi, ndm, ndec, num_ch, num_quant_strats;
     486             :     float pred_coeffs_re_local[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS];
     487             :     int16_t k, bwidth, num_bands, num_bands_full, num_bands_bw;
     488             :     int16_t active_w, nchan_transport, dmx_switch, strat;
     489     2511926 :     int16_t nB, bands_bw, packed_ok = 0;
     490             :     ivas_strats_t cs[MAX_CODING_STRATS];
     491             :     int16_t code_strat;
     492             :     int16_t bit_pos_start, next_ind_start;
     493             :     BSTR_ENC_DATA hMetaData_tmp;
     494             :     Indice *ind_list_tmp;
     495             :     int16_t md_indices_allocated;
     496             :     int16_t max_num_indices_tmp;
     497             :     float Wscale[IVAS_MAX_NUM_BANDS];
     498             :     float P_quant_re_prior[SPAR_DIRAC_SPLIT_START_BAND][FOA_CHANNELS - 1];
     499             : 
     500             :     /*extra 16 bits for arithmetic coder as overshoot check is after a symbol is written*/
     501     2511926 :     md_indices_allocated = hMdEnc->spar_md_cfg.max_bits_per_blk + IVAS_SPAR_ARITH_OVERSHOOT_BITS;
     502     2511926 :     if ( ( ind_list_tmp = (Indice *) malloc( sizeof( Indice ) * md_indices_allocated ) ) == NULL )
     503             :     {
     504           0 :         return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD encoder indices" );
     505             :     }
     506             : 
     507     2511926 :     num_quant_strats = hMdEnc->spar_md_cfg.num_quant_strats;
     508     2511926 :     num_ch = ivas_sba_get_nchan_metadata( sba_order, hEncoderConfig->ivas_total_brate );
     509     2511926 :     active_w = ( hMdEnc->spar_md_cfg.active_w == 1 ) || ( dyn_active_w_flag == 1 );
     510     2511926 :     nchan_transport = hMdEnc->spar_md_cfg.nchan_transport;
     511             : 
     512     2511926 :     bwidth = ivas_get_bw_idx_from_sample_rate( hEncoderConfig->input_Fs );
     513     2511926 :     bwidth = min( bwidth, hEncoderConfig->max_bwidth );
     514             :     int16_t active_w_vlbr;
     515     2511926 :     active_w_vlbr = ( hEncoderConfig->ivas_total_brate < IVAS_24k4 ) ? 1 : 0;
     516     2511926 :     num_bands = ivas_get_num_bands_from_bw_idx( SPAR_CONFIG_BW );
     517     2511926 :     if ( hMdEnc->spar_hoa_md_flag == 0 )
     518             :     {
     519     2302595 :         num_bands = min( num_bands, SPAR_DIRAC_SPLIT_START_BAND );
     520             :     }
     521     2511926 :     num_bands_full = num_bands;
     522     2511926 :     num_bands_bw = ivas_get_num_bands_from_bw_idx( bwidth );
     523             : 
     524     2511926 :     if ( dtx_vad == 0 )
     525             :     {
     526       70545 :         for ( i = 0; i < nchan_inp; i++ )
     527             :         {
     528      282180 :             for ( j = 0; j < nchan_inp; j++ )
     529             :             {
     530      225744 :                 cov_real[i][j] = cov_dtx_real[i][j];
     531             :             }
     532             :         }
     533             :     }
     534             : 
     535    13526749 :     for ( i = 0; i < nchan_inp; i++ )
     536             :     {
     537    64215028 :         for ( j = 0; j < nchan_inp; j++ )
     538             :         {
     539    71431933 :             for ( k = num_bands_bw; k < IVAS_MAX_NUM_BANDS; k++ )
     540             :             {
     541    18231728 :                 cov_real[i][j][k] = 0;
     542             :             }
     543             :         }
     544             :     }
     545             : 
     546     2511926 :     if ( hEncoderConfig->ivas_total_brate == BRATE_SPAR_Q_STRAT && sba_order == SBA_FOA_ORDER )
     547             :     {
     548             :         /* make sure that qsi is always 0 (temporary bits are '00') */
     549      219368 :         num_quant_strats = 1;
     550             :     }
     551             : 
     552     2511926 :     hMetaData_tmp.ind_list = ind_list_tmp;
     553     2511926 :     hMetaData_tmp.nb_bits_tot = 0;
     554     2511926 :     max_num_indices_tmp = MAX_BITS_METADATA;
     555     2511926 :     hMetaData_tmp.ivas_max_num_indices = &max_num_indices_tmp;
     556     2511926 :     hMetaData_tmp.ivas_ind_list_zero = (Indice **) ( &hMetaData_tmp.ind_list );
     557     2511926 :     hMetaData_tmp.st_ivas = NULL;
     558             : 
     559             :     /* Save state of metadata bitstream buffer */
     560     2511926 :     bit_pos_start = hMetaData->nb_bits_tot;
     561     2511926 :     next_ind_start = hMetaData->nb_ind_tot;
     562             : 
     563     2511926 :     dmx_switch = 0;
     564             : 
     565     2511926 :     if ( dtx_vad == 0 )
     566             :     {
     567       14109 :         nB = SPAR_DTX_BANDS;
     568       14109 :         bands_bw = num_bands / nB;
     569             : 
     570       14109 :         ivas_band_mixer( cov_real, num_ch, &num_bands, bands_bw );
     571             :     }
     572     2497817 :     else if ( hEncoderConfig->ivas_total_brate < IVAS_24k4 )
     573             :     {
     574      181741 :         bands_bw = 2;
     575      181741 :         nB = num_bands / bands_bw;
     576             : 
     577      181741 :         ivas_band_mixer( cov_real, num_ch, &num_bands, bands_bw );
     578             :     }
     579             :     else
     580             :     {
     581     2316076 :         nB = num_bands;
     582     2316076 :         bands_bw = 1;
     583             :     }
     584     2511926 :     if ( hMdEnc->spar_hoa_md_flag && hMdEnc->spar_hoa_dirac2spar_md_flag )
     585             :     {
     586      575390 :         for ( b = SPAR_DIRAC_SPLIT_START_BAND; b < num_bands; b++ )
     587             :         {
     588     1841248 :             for ( i = 0; i < DIRAC_TO_SPAR_HBR_PRED_CHS; i++ )
     589             :             {
     590     1380936 :                 pred_coeffs_re_local[i][b] = hMdEnc->spar_md.band_coeffs[b].pred_re[i];
     591             :             }
     592             :         }
     593             :     }
     594             : 
     595     2511926 :     if ( hEncoderConfig->ivas_total_brate < IVAS_24k4 )
     596             :     {
     597     1658043 :         for ( b = 0; b < num_bands * bands_bw; b++ )
     598             :         {
     599     1473816 :             mvr2r( hMdEnc->spar_md.band_coeffs[b].P_quant_re, P_quant_re_prior[b], FOA_CHANNELS - 1 );
     600             :         }
     601             :     }
     602             : 
     603     2511926 :     ivas_compute_spar_params( cov_real, dm_fv_re, 0, hMdEnc->mixer_mat, 0, nB, dtx_vad, num_ch, bands_bw, active_w, active_w_vlbr, &hMdEnc->spar_md_cfg, &hMdEnc->spar_md, Wscale, 0, dyn_active_w_flag );
     604             : 
     605     2511926 :     if ( dirac_mono_flag )
     606             :     {
     607             :         int16_t i_ts;
     608          64 :         int16_t num_md_sub_frames = 1;
     609             : 
     610          64 :         ndec = hMdEnc->spar_md_cfg.num_decorr_per_band[0];
     611          64 :         ndm = hMdEnc->spar_md_cfg.num_dmx_chans_per_band[0];
     612             : 
     613         128 :         for ( i_ts = 0; i_ts < num_md_sub_frames; i_ts++ )
     614             :         {
     615         832 :             for ( b = 0; b < IVAS_MAX_NUM_BANDS; b++ )
     616             :             {
     617        3072 :                 for ( j = 0; j < ndm + ndec - 1; j++ )
     618             :                 {
     619        2304 :                     hMdEnc->spar_md.band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].pred_re[j] = 0.0f;
     620             :                 }
     621        1536 :                 for ( j = 0; j < ndec; j++ )
     622             :                 {
     623        2304 :                     for ( k = 0; k < ndm - 1; k++ )
     624             :                     {
     625        1536 :                         hMdEnc->spar_md.band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].C_re[j][k] = 0.0f;
     626             :                     }
     627             :                 }
     628             : 
     629        1536 :                 for ( j = 0; j < ndec; j++ )
     630             :                 {
     631         768 :                     hMdEnc->spar_md.band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].P_re[j] = 0.0f;
     632             :                 }
     633             :             }
     634             :         }
     635             :     }
     636             : 
     637    13526749 :     for ( i = 0; i < num_ch; i++ )
     638             :     {
     639    64215028 :         for ( j = 0; j < num_ch; j++ )
     640             :         {
     641   531250697 :             for ( b = 0; b < num_bands; b++ )
     642             :             {
     643   478050492 :                 hMdEnc->mixer_mat_local[i][j][b] = hMdEnc->mixer_mat[i][j][b];
     644             :             }
     645             :         }
     646             :     }
     647             : #ifdef DEBUG_LBR_SBA
     648             :     float dirac_md_kbps = (float) ( hMetaData->nb_bits_tot ) * 50 / 1000;
     649             : #endif
     650     2511926 :     code_strat = 0;
     651             : #ifdef DEBUG_SBA_MD_DUMP
     652             :     ndec = -1;
     653             : #endif
     654             : #ifdef DEBUG_SPAR_MD_TARGET_TUNING
     655             :     for ( qsi = 0; qsi < 1; qsi++ )
     656             : #else
     657     2523413 :     for ( qsi = 0; qsi < num_quant_strats; qsi++ )
     658             : #endif
     659             :     {
     660             : #ifdef SPAR_HOA_DBG
     661             :         fprintf( stdout, "qsi = %d\n", qsi );
     662             : #endif
     663    22722579 :         for ( b = 0; b < num_bands; b++ )
     664             :         {
     665    20199166 :             ndm = hMdEnc->spar_md_cfg.num_dmx_chans_per_band[b * bands_bw];
     666    20199166 :             ndec = hMdEnc->spar_md_cfg.num_decorr_per_band[b * bands_bw];
     667             : 
     668    20199166 :             if ( dtx_vad == 1 )
     669             :             {
     670    20170948 :                 if ( ndm != num_ch )
     671             :                 {
     672    17242244 :                     ivas_quant_p_per_band( &hMdEnc->spar_md.band_coeffs[b], &hMdEnc->spar_md.band_coeffs_idx[b], &hMdEnc->spar_md_cfg.quant_strat[qsi], num_ch );
     673             :                 }
     674    20170948 :                 ivas_quant_pred_coeffs_per_band( &hMdEnc->spar_md.band_coeffs[b], &hMdEnc->spar_md.band_coeffs_idx[b], &hMdEnc->spar_md_cfg.quant_strat[qsi], num_ch );
     675    20170948 :                 if ( active_w_vlbr )
     676             :                 {
     677     2963232 :                     for ( i = 0; i < 3; i++ )
     678             :                     {
     679             :                         int16_t i2;
     680     2222424 :                         i2 = 0;
     681     2222424 :                         switch ( i ) /* PRED (Y,Z,X) and DECD (Y,X,Z) coeffs are in different orders */
     682             :                         {
     683      740808 :                             case 0:
     684      740808 :                                 i2 = 0;
     685      740808 :                                 break;
     686      740808 :                             case 1:
     687      740808 :                                 i2 = 2;
     688      740808 :                                 break;
     689      740808 :                             case 2:
     690      740808 :                                 i2 = 1;
     691      740808 :                                 break;
     692             :                         }
     693     2222424 :                         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[i] != 0.0f ) && ( cov_real[i + 1][i + 1][b] != 0.0f ) )
     694             :                         {
     695             :                             /* bump up the Pred coeff */
     696             :                             float PR_uq, PR_step;
     697             :                             ivas_quant_strat_t qs;
     698       92030 :                             qs = hMdEnc->spar_md_cfg.quant_strat[qsi];
     699       92030 :                             PR_uq = hMdEnc->spar_md.band_coeffs[b].pred_re[i];
     700       92030 :                             PR_step = ( qs.PR.max - qs.PR.min ) / ( qs.PR.q_levels[0] - 1 );
     701             : 
     702             :                             int16_t PR_sign;
     703       92030 :                             PR_sign = ( PR_uq > 0 ) - ( PR_uq < 0 );
     704             : 
     705       92030 :                             hMdEnc->spar_md.band_coeffs_idx[b].pred_index_re[i] = PR_sign;
     706             : 
     707             :                             /* deindex the modified coefficient */
     708       92030 :                             hMdEnc->spar_md.band_coeffs[b].pred_quant_re[i] = PR_sign * PR_step;
     709             :                         }
     710             :                     }
     711             :                 }
     712             :             }
     713             :             else
     714             :             {
     715       28218 :                 if ( ndm != num_ch )
     716             :                 {
     717       28218 :                     ivas_quant_p_per_band_dtx( hMdEnc->spar_md.band_coeffs[b].P_re, ndec, ndm, &hMdEnc->spar_md.band_coeffs_idx[b].decd_index_re[0], hMdEnc->spar_md.band_coeffs[b].P_quant_re, num_ch );
     718             :                 }
     719             : 
     720      112872 :                 for ( i = 0; i < num_ch - 1; i++ )
     721             :                 {
     722       84654 :                     hMdEnc->spar_md.band_coeffs[b].pred_quant_re[i] = 0;
     723             :                 }
     724       28218 :                 ivas_spar_quant_pred_coeffs_dtx( &hMdEnc->spar_md, hMdEnc->spar_md.band_coeffs[b].pred_re, ndm, hMdEnc->spar_md.band_coeffs_idx[b].pred_index_re, num_ch - 1, hMdEnc->spar_md.band_coeffs[b].pred_quant_re );
     725             :             }
     726             :         }
     727             : 
     728    11060771 :         for ( i = 0; i < num_ch - 1; i++ )
     729             :         {
     730    80740284 :             for ( b = 0; b < num_bands; b++ )
     731             :             {
     732    72202926 :                 pred_coeffs_re[i][b] = Wscale[b] * hMdEnc->spar_md.band_coeffs[b].pred_quant_re[i];
     733             :             }
     734             :         }
     735             : 
     736     2523413 :         if ( hMdEnc->spar_hoa_md_flag && hMdEnc->spar_hoa_dirac2spar_md_flag )
     737             :         {
     738      575390 :             for ( b = SPAR_DIRAC_SPLIT_START_BAND; b < num_bands; b++ )
     739             :             {
     740     1841248 :                 for ( i = 0; i < DIRAC_TO_SPAR_HBR_PRED_CHS; i++ )
     741             :                 {
     742             :                     /* Use the prediction coeffs computed based on DirAC MD to generate mixer matrix */
     743     1380936 :                     pred_coeffs_re[i][b] = pred_coeffs_re_local[i][b];
     744     1380936 :                     hMdEnc->spar_md.band_coeffs[b].pred_quant_re[i] = 0;
     745     1380936 :                     hMdEnc->spar_md.band_coeffs_idx[b].pred_index_re[i] = 0;
     746             :                 }
     747             :             }
     748             :         }
     749             : 
     750     2523413 :         ivas_create_fullr_dmx_mat( pred_coeffs_re, dm_fv_re, hMdEnc->mixer_mat, num_ch, 0, num_bands, active_w, &hMdEnc->spar_md_cfg );
     751             : 
     752    22722579 :         for ( b = 0; b < num_bands; b++ )
     753             :         {
     754    20199166 :             ndm = hMdEnc->spar_md_cfg.num_dmx_chans_per_band[b * bands_bw];
     755    20199166 :             ndec = hMdEnc->spar_md_cfg.num_decorr_per_band[b * bands_bw];
     756             : 
     757   112601258 :             for ( i = 0; i < num_ch; i++ )
     758             :             {
     759    92402092 :                 hMdEnc->mixer_mat[0][i][b] *= Wscale[b];
     760             :             }
     761             : 
     762    20199166 :             if ( ( ndm != num_ch ) && ( ndm != 1 ) )
     763             :             {
     764    11270028 :                 ivas_calc_c_p_coeffs( &hMdEnc->spar_md, cov_real, 0, hMdEnc->mixer_mat, num_ch, ndm, b, dtx_vad, 0, dyn_active_w_flag );
     765             : 
     766    11270028 :                 if ( dirac_mono_flag )
     767             :                 {
     768         512 :                     ndec = hMdEnc->spar_md_cfg.num_decorr_per_band[0];
     769         512 :                     ndm = hMdEnc->spar_md_cfg.num_dmx_chans_per_band[0];
     770        1024 :                     for ( j = 0; j < ndec; j++ )
     771             :                     {
     772        1536 :                         for ( k = 0; k < ndm - 1; k++ )
     773             :                         {
     774        1024 :                             hMdEnc->spar_md.band_coeffs[b].C_re[j][k] = 0.0f;
     775             :                         }
     776             :                     }
     777             :                 }
     778             : #ifdef SPAR_HOA_DBG
     779             :                 /*fprintf(stderr, "\n\n C coefficients: band %d\n", b);
     780             : 
     781             :                 for (i = 0; i < num_ch - ndm; i++)
     782             :                 {
     783             :                         for (j = 0; j < ndm - 1; j++)
     784             :                         {
     785             :                                 fprintf(stderr, "%f, ", hMdEnc->spar_md.band_coeffs[b].C_re[i][j]);
     786             :                         }
     787             :                         fprintf(stderr, "\n");
     788             :                 }
     789             :                 fprintf(stderr, "\n\n"); */
     790             : #endif
     791             : 
     792    11270028 :                 ivas_quant_c_per_band( &hMdEnc->spar_md.band_coeffs[b], &hMdEnc->spar_md.band_coeffs_idx[b],
     793    11270028 :                                        &hMdEnc->spar_md_cfg.quant_strat[qsi], ndec, ndm );
     794             :             }
     795             :         }
     796             : 
     797             :         /* band limit downmix matrix */
     798     2523413 :         ivas_band_limit_dmx_matrix( hMdEnc, num_ch, num_bands, bands_bw );
     799             : 
     800             :         /* band mixing */
     801     2523413 :         if ( bands_bw > 1 )
     802             :         {
     803      199311 :             ivas_band_mixing( hMdEnc, num_ch, num_bands, nchan_transport, num_bands_full );
     804             :         }
     805             : 
     806     2523413 :         if ( dtx_vad == 0 )
     807             :         {
     808       14109 :             ivas_write_parameter_bitstream_dtx( &hMdEnc->spar_md, hMetaData, hMdEnc->spar_md_cfg.num_dmx_chans_per_band, hMdEnc->spar_md_cfg.num_decorr_per_band, num_bands );
     809       14109 :             break;
     810             :         }
     811             : 
     812     2509304 :         ivas_select_next_strat( hMdEnc->spar_md_cfg.prior_strat, cs, dmx_switch, dtx_vad );
     813             : 
     814     6548547 :         for ( i = 0; i < MAX_CODING_STRATS; i++ )
     815             :         {
     816     6050683 :             strat = cs[i];
     817     6050683 :             if ( strat != NO_STRAT )
     818             :             {
     819     6030517 :                 reset_indices_enc( &hMetaData_tmp, md_indices_allocated );
     820             : 
     821     6030517 :                 ivas_write_spar_md_bitstream( hMdEnc, num_bands, bands_bw, &hMetaData_tmp, hEncoderConfig->ivas_total_brate, strat, qsi );
     822             : 
     823             :                 /*write to main buffer if its a valid bitstream*/
     824     6030517 :                 if ( hMetaData_tmp.nb_bits_tot > 0 )
     825             :                 {
     826     4889843 :                     if ( hMetaData->nb_bits_tot == bit_pos_start || hMetaData_tmp.nb_bits_tot < ( hMetaData->nb_bits_tot - bit_pos_start ) )
     827             :                     {
     828     3959147 :                         write_metadata_buffer( &hMetaData_tmp, hMetaData, bit_pos_start, next_ind_start );
     829     3959147 :                         code_strat = strat;
     830             :                     }
     831             : 
     832     4889843 :                     if ( hMetaData->nb_bits_tot - bit_pos_start + ( ( ( hEncoderConfig->ivas_total_brate == IVAS_256k ) && ( sba_order == SBA_FOA_ORDER ) ) ? 1 : 0 ) <= hMdEnc->spar_md_cfg.tgt_bits_per_blk )
     833             :                     {
     834     2011440 :                         packed_ok = 1;
     835     2011440 :                         break;
     836             :                     }
     837             :                 }
     838             :             }
     839             :         }
     840             : 
     841     2509304 :         if ( packed_ok == 1 )
     842             :         {
     843     2011440 :             break;
     844             :         }
     845             : 
     846             :         /*only if valid bitstream was written to main buffer*/
     847      497864 :         if ( hMetaData->nb_bits_tot > bit_pos_start )
     848             :         {
     849      486377 :             if ( hMetaData->nb_bits_tot - bit_pos_start + ( ( ( hEncoderConfig->ivas_total_brate == IVAS_256k ) && ( sba_order == SBA_FOA_ORDER ) ) ? 1 : 0 ) <= hMdEnc->spar_md_cfg.max_bits_per_blk )
     850             :             {
     851      486377 :                 packed_ok = 1;
     852      486377 :                 break;
     853             :             }
     854             :         }
     855             :     }
     856             : 
     857             : #ifdef DEBUGGING
     858             :     if ( dtx_vad == 1 )
     859             :     {
     860             :         assert( packed_ok == 1 );
     861             :     }
     862             :     if ( hEncoderConfig->ivas_total_brate >= IVAS_256k )
     863             :     {
     864             :         assert( qsi == 0 );
     865             :     }
     866             : #endif
     867             : 
     868             :     /* Reuse mixer matrix values for unsent bands */
     869     2511926 :     if ( hEncoderConfig->ivas_total_brate < IVAS_24k4 )
     870             :     {
     871      916163 :         for ( k = num_bands - 1; k >= 0; k-- )
     872             :         {
     873     2205752 :             for ( b = bands_bw - 1; b >= 0; b-- )
     874             :             {
     875     1473816 :                 mvr2r( hMdEnc->spar_md.band_coeffs[k].P_quant_re, hMdEnc->spar_md.band_coeffs[bands_bw * k + b].P_quant_re, FOA_CHANNELS - 1 );
     876             :             }
     877             :         }
     878             :     }
     879             : 
     880     2511926 :     if ( ( hEncoderConfig->ivas_total_brate < IVAS_24k4 ) && ( code_strat > 3 ) )
     881             :     {
     882      534465 :         for ( b = 0; b < num_bands * bands_bw; b += 2 * bands_bw )
     883             :         {
     884      356310 :             if ( ( b == 0 ) && ( code_strat % 2 == 0 ) )
     885             :             {
     886       90819 :                 b += 2;
     887             :             }
     888      712620 :             for ( i = 0; i < 1; i++ )
     889             :             {
     890     1781550 :                 for ( j = 0; j < 4; j++ )
     891             :                 {
     892     1425240 :                     hMdEnc->mixer_mat[i][j][b] = prior_mixer[i][j][b];
     893     1425240 :                     hMdEnc->mixer_mat[i][j][b + 1] = prior_mixer[i][j][b + 1];
     894             :                 }
     895             :             }
     896             : 
     897      356310 :             mvr2r( P_quant_re_prior[b], hMdEnc->spar_md.band_coeffs[b].P_quant_re, FOA_CHANNELS - 1 );
     898      356310 :             mvr2r( P_quant_re_prior[b + 1], hMdEnc->spar_md.band_coeffs[b + 1].P_quant_re, FOA_CHANNELS - 1 );
     899             :         }
     900             :     }
     901             : #ifdef DEBUG_LBR_SBA
     902             :     char f_name[100];
     903             :     int16_t nbands = 1;
     904             :     int16_t num_subframes = 1;
     905             :     int16_t num_elements = 6;
     906             :     int16_t num_block_group = 1;
     907             :     int16_t byte_size = sizeof( float );
     908             : 
     909             :     float sba_md_kbps = (float) hMetaData->nb_bits_tot * 50 / 1000;
     910             :     float spar_md_kbps = sba_md_kbps - dirac_md_kbps;
     911             :     float corebr_kbps = (float) hEncoderConfig->ivas_total_brate / 1000 - sba_md_kbps;
     912             : 
     913             :     sprintf( f_name, "SBA_MD_bitrate.bin" );
     914             :     ( frame == 0 ) ? dbgwrite( &nbands, sizeof( nbands ), 1, 1, f_name ) : false;
     915             :     ( frame == 0 ) ? dbgwrite( &num_elements, sizeof( num_elements ), 1, 1, f_name ) : false;
     916             :     ( frame == 0 ) ? dbgwrite( &num_subframes, sizeof( num_subframes ), 1, 1, f_name ) : false;
     917             :     ( frame == 0 ) ? dbgwrite( &num_block_group, sizeof( num_block_group ), 1, 1, f_name ) : false;
     918             :     ( frame == 0 ) ? dbgwrite( &byte_size, sizeof( byte_size ), 1, 1, f_name ) : false;
     919             : 
     920             :     for ( b = 0; b < nbands; b++ )
     921             :     {
     922             :         for ( int16_t sf = 0; sf < num_subframes; sf++ )
     923             :         {
     924             :             for ( int16_t bl = 0; bl < num_block_group; bl++ )
     925             :             {
     926             :                 float fqsi = (float) qsi;
     927             :                 float fcode = (float) code_strat;
     928             : 
     929             :                 dbgwrite( &dirac_md_kbps, byte_size, 1, 1, f_name );
     930             :                 dbgwrite( &spar_md_kbps, byte_size, 1, 1, f_name );
     931             :                 dbgwrite( &sba_md_kbps, byte_size, 1, 1, f_name );
     932             :                 dbgwrite( &fqsi, byte_size, 1, 1, f_name );
     933             :                 dbgwrite( &fcode, byte_size, 1, 1, f_name );
     934             :                 dbgwrite( &corebr_kbps, byte_size, 1, 1, f_name );
     935             :                 // fprintf(stdout, "%f\t%f\t%f\t%d\t%d\n", dirac_md_kbps, spar_md_kbps, sba_md_kbps, qsi, code_strat );
     936             :             }
     937             :         }
     938             :     }
     939             : #endif
     940             : #ifdef SPAR_HOA_DBG
     941             :     /*if ( strat >= 4 )
     942             :     {
     943             :             for ( b = 0; b < nB; b++ )
     944             :             {
     945             :                     b = 0;
     946             :                     fprintf( stdout, "\n\nMETADATA PR: band %d, qsi %d\n\n", b, qsi );
     947             :                     for ( i = 0; i < num_ch - 1; i++ )
     948             :                     {
     949             :                             fprintf( stdout, "i: %d -- %f\t %d\t %d\n", i, //hMdEnc->spar_md.band_coeffs[b].pred_re[i],
     950             :                                              hMdEnc->spar_md.band_coeffs[b].pred_quant_re[i],
     951             :                                              hMdEnc->spar_md_prior.band_coeffs_idx[b].pred_index_re[i],
     952             :                                              hMdEnc->spar_md.band_coeffs_idx[b].pred_index_re[i] );
     953             :                     }
     954             :                     fprintf( stdout, "\n\n METADATA C: band %d\n\n", b );
     955             :                     int16_t k = 0;
     956             :                     for ( i = 0; i < ndec; i++ )
     957             :                     {
     958             :                             for ( j = 0; j < ( ndm - 1 ); j++ )
     959             :                             {
     960             :                                     fprintf( stdout, "i: %d -- %f\t %d\t %d\n", i, // hMdEnc->spar_md.band_coeffs[b].C_re[i][j],
     961             :                                                      hMdEnc->spar_md.band_coeffs[b].C_quant_re[i][j],
     962             :                                                      hMdEnc->spar_md_prior.band_coeffs_idx[b].drct_index_re[k],
     963             :                                                      hMdEnc->spar_md.band_coeffs_idx[b].drct_index_re[k] );
     964             :                                     k++;
     965             :                             }
     966             :                     }
     967             :                     fprintf( stdout, "\n\n METADATA Pd: band %d\n\n", b );
     968             :                     for ( i = 0; i < num_ch - ndm; i++ )
     969             :                     {
     970             :                             fprintf( stdout, "i: %d -- %f\t %d\t %d\n", i, //hMdEnc->spar_md.band_coeffs[b].P_re[i][i],
     971             :                                              hMdEnc->spar_md.band_coeffs[b].P_quant_re[i][i],
     972             :                                              hMdEnc->spar_md_prior.band_coeffs_idx[b].decd_index_re[i],
     973             :                                              hMdEnc->spar_md.band_coeffs_idx[b].decd_index_re[i] );
     974             :                     }
     975             :                     fprintf( stdout, "\n\n" );
     976             :             }
     977             :     }*/
     978             :     b = 0;
     979             :     ndm = hMdEnc->spar_md_cfg.num_dmx_chans_per_band[b * bands_bw];
     980             : 
     981             :     fprintf( stdout, "\n\n Metadata PR (15x1), C(15x15), P(15x15): band %d\n", b );
     982             :     for ( i = 0; i < num_ch - 1; i++ )
     983             :     {
     984             :         fprintf( stdout, "i: %d -- %.2f\t|\t", i, hMdEnc->spar_md.band_coeffs[b].pred_quant_re[i] );
     985             :         if ( i < num_ch - ndm )
     986             :         {
     987             :             for ( j = 0; j < ndm - 1; j++ )
     988             :             {
     989             :                 fprintf( stdout, "%.2f\t", hMdEnc->spar_md.band_coeffs[b].C_quant_re[i][j] );
     990             :             }
     991             :             fprintf( stdout, "|\t" );
     992             :             for ( j = 0; j < num_ch - ndm; j++ )
     993             :             {
     994             :                 fprintf( stdout, "%.2f\t", hMdEnc->spar_md.band_coeffs[b].P_quant_re[j] );
     995             :             }
     996             :         }
     997             :         fprintf( stdout, "\n" );
     998             :     }
     999             :     fprintf( stdout, "\n" );
    1000             : #endif
    1001             : #ifdef DEBUG_SBA_MD_DUMP
    1002             :     {
    1003             :         char f_name[100];
    1004             :         int16_t n_bands = 1, num_subframes = 1, num_block_groups = 1, num_elements = 1, byte_size = sizeof( int16_t );
    1005             :         sprintf( f_name, "spar_qsi.bin" );
    1006             :         ( frame == 0 ) ? dbgwrite( &n_bands, sizeof( nB ), 1, 1, f_name ) : false;
    1007             :         ( frame == 0 ) ? dbgwrite( &num_elements, sizeof( num_elements ), 1, 1, f_name ) : false;
    1008             :         ( frame == 0 ) ? dbgwrite( &num_subframes, sizeof( num_subframes ), 1, 1, f_name ) : false;
    1009             :         ( frame == 0 ) ? dbgwrite( &num_block_groups, sizeof( num_block_groups ), 1, 1, f_name ) : false;
    1010             :         ( frame == 0 ) ? dbgwrite( &byte_size, sizeof( byte_size ), 1, 1, f_name ) : false;
    1011             :         dbgwrite( &qsi, sizeof( int16_t ), 1, 1, f_name );
    1012             :         sprintf( f_name, "spar_strat.bin" );
    1013             :         ( frame == 0 ) ? dbgwrite( &n_bands, sizeof( nB ), 1, 1, f_name ) : false;
    1014             :         ( frame == 0 ) ? dbgwrite( &num_elements, sizeof( num_elements ), 1, 1, f_name ) : false;
    1015             :         ( frame == 0 ) ? dbgwrite( &num_subframes, sizeof( num_subframes ), 1, 1, f_name ) : false;
    1016             :         ( frame == 0 ) ? dbgwrite( &num_block_groups, sizeof( num_block_groups ), 1, 1, f_name ) : false;
    1017             :         ( frame == 0 ) ? dbgwrite( &byte_size, sizeof( byte_size ), 1, 1, f_name ) : false;
    1018             :         dbgwrite( &strat, sizeof( int16_t ), 1, 1, f_name );
    1019             :         byte_size = sizeof( float );
    1020             :         for ( b = 0; b < nB; b++ )
    1021             :         {
    1022             :             ndm = hMdEnc->spar_md_cfg.num_dmx_chans_per_band[b * bands_bw];
    1023             : 
    1024             :             sprintf( f_name, "spar_band_pred_coeffs.bin" );
    1025             :             ( b == 0 && frame == 0 ) ? dbgwrite( &nB, sizeof( nB ), 1, 1, f_name ) : false;
    1026             :             num_elements = num_ch - 1;
    1027             :             ( b == 0 && frame == 0 ) ? dbgwrite( &num_elements, sizeof( num_elements ), 1, 1, f_name ) : false;
    1028             :             ( b == 0 && frame == 0 ) ? dbgwrite( &num_subframes, sizeof( num_subframes ), 1, 1, f_name ) : false;
    1029             :             ( b == 0 && frame == 0 ) ? dbgwrite( &num_block_groups, sizeof( num_block_groups ), 1, 1, f_name ) : false;
    1030             :             ( b == 0 && frame == 0 ) ? dbgwrite( &byte_size, sizeof( byte_size ), 1, 1, f_name ) : false;
    1031             :             for ( i = 0; i < num_ch - 1; i++ )
    1032             :             {
    1033             :                 dbgwrite( &hMdEnc->spar_md.band_coeffs[b].pred_re[i], sizeof( float ), 1, 1, f_name );
    1034             :             }
    1035             :             sprintf( f_name, "spar_band_C_coeffs.bin" );
    1036             :             ( b == 0 && frame == 0 ) ? dbgwrite( &nB, sizeof( nB ), 1, 1, f_name ) : false;
    1037             :             num_elements = ndec * ( ndm - 1 );
    1038             :             ( b == 0 && frame == 0 ) ? dbgwrite( &num_elements, sizeof( num_elements ), 1, 1, f_name ) : false;
    1039             :             ( b == 0 && frame == 0 ) ? dbgwrite( &num_subframes, sizeof( num_subframes ), 1, 1, f_name ) : false;
    1040             :             ( b == 0 && frame == 0 ) ? dbgwrite( &num_block_groups, sizeof( num_block_groups ), 1, 1, f_name ) : false;
    1041             :             ( b == 0 && frame == 0 ) ? dbgwrite( &byte_size, sizeof( byte_size ), 1, 1, f_name ) : false;
    1042             :             for ( i = 0; i < ndec; i++ )
    1043             :             {
    1044             :                 for ( j = 0; j < ( ndm - 1 ); j++ )
    1045             :                 {
    1046             :                     dbgwrite( &hMdEnc->spar_md.band_coeffs[b].C_re[i][j], sizeof( float ), 1, 1, f_name );
    1047             :                 }
    1048             :             }
    1049             :             sprintf( f_name, "spar_band_P_coeffs.bin" );
    1050             :             ( b == 0 && frame == 0 ) ? dbgwrite( &nB, sizeof( nB ), 1, 1, f_name ) : false;
    1051             :             num_elements = num_ch - ndm;
    1052             :             ( b == 0 && frame == 0 ) ? dbgwrite( &num_elements, sizeof( num_elements ), 1, 1, f_name ) : false;
    1053             :             ( b == 0 && frame == 0 ) ? dbgwrite( &num_subframes, sizeof( num_subframes ), 1, 1, f_name ) : false;
    1054             :             ( b == 0 && frame == 0 ) ? dbgwrite( &num_block_groups, sizeof( num_block_groups ), 1, 1, f_name ) : false;
    1055             :             ( b == 0 && frame == 0 ) ? dbgwrite( &byte_size, sizeof( byte_size ), 1, 1, f_name ) : false;
    1056             :             for ( i = 0; i < num_ch - ndm; i++ )
    1057             :             {
    1058             :                 dbgwrite( &hMdEnc->spar_md.band_coeffs[b].P_re[i], sizeof( float ), 1, 1, f_name );
    1059             :             }
    1060             :             sprintf( f_name, "spar_band_pred_coeffs_quant.bin" );
    1061             :             ( b == 0 && frame == 0 ) ? dbgwrite( &nB, sizeof( nB ), 1, 1, f_name ) : false;
    1062             :             num_elements = num_ch - 1;
    1063             :             ( b == 0 && frame == 0 ) ? dbgwrite( &num_elements, sizeof( num_elements ), 1, 1, f_name ) : false;
    1064             :             ( b == 0 && frame == 0 ) ? dbgwrite( &num_subframes, sizeof( num_subframes ), 1, 1, f_name ) : false;
    1065             :             ( b == 0 && frame == 0 ) ? dbgwrite( &num_block_groups, sizeof( num_block_groups ), 1, 1, f_name ) : false;
    1066             :             ( b == 0 && frame == 0 ) ? dbgwrite( &byte_size, sizeof( byte_size ), 1, 1, f_name ) : false;
    1067             :             for ( i = 0; i < num_ch - 1; i++ )
    1068             :             {
    1069             :                 dbgwrite( &hMdEnc->spar_md.band_coeffs[b].pred_quant_re[i], sizeof( float ), 1, 1, f_name );
    1070             :             }
    1071             :             sprintf( f_name, "spar_band_C_coeffs_quant.bin" );
    1072             :             ( b == 0 && frame == 0 ) ? dbgwrite( &nB, sizeof( nB ), 1, 1, f_name ) : false;
    1073             :             num_elements = ndec * ( ndm - 1 );
    1074             :             ( b == 0 && frame == 0 ) ? dbgwrite( &num_elements, sizeof( num_elements ), 1, 1, f_name ) : false;
    1075             :             ( b == 0 && frame == 0 ) ? dbgwrite( &num_subframes, sizeof( num_subframes ), 1, 1, f_name ) : false;
    1076             :             ( b == 0 && frame == 0 ) ? dbgwrite( &num_block_groups, sizeof( num_block_groups ), 1, 1, f_name ) : false;
    1077             :             ( b == 0 && frame == 0 ) ? dbgwrite( &byte_size, sizeof( byte_size ), 1, 1, f_name ) : false;
    1078             :             for ( i = 0; i < ndec; i++ )
    1079             :             {
    1080             :                 for ( j = 0; j < ( ndm - 1 ); j++ )
    1081             :                 {
    1082             :                     dbgwrite( &hMdEnc->spar_md.band_coeffs[b].C_quant_re[i][j], sizeof( float ), 1, 1, f_name );
    1083             :                 }
    1084             :             }
    1085             :             sprintf( f_name, "spar_band_P_coeffs_quant.bin" );
    1086             :             ( b == 0 && frame == 0 ) ? dbgwrite( &nB, sizeof( nB ), 1, 1, f_name ) : false;
    1087             :             num_elements = num_ch - ndm;
    1088             :             ( b == 0 && frame == 0 ) ? dbgwrite( &num_elements, sizeof( num_elements ), 1, 1, f_name ) : false;
    1089             :             ( b == 0 && frame == 0 ) ? dbgwrite( &num_subframes, sizeof( num_subframes ), 1, 1, f_name ) : false;
    1090             :             ( b == 0 && frame == 0 ) ? dbgwrite( &num_block_groups, sizeof( num_block_groups ), 1, 1, f_name ) : false;
    1091             :             ( b == 0 && frame == 0 ) ? dbgwrite( &byte_size, sizeof( byte_size ), 1, 1, f_name ) : false;
    1092             :             for ( i = 0; i < num_ch - ndm; i++ )
    1093             :             {
    1094             :                 dbgwrite( &hMdEnc->spar_md.band_coeffs[b].P_quant_re[i], sizeof( float ), 1, 1, f_name );
    1095             :             }
    1096             :         }
    1097             :     }
    1098             : #endif
    1099             : #ifdef DEBUG_SPAR_MD_TARGET_TUNING
    1100             :     int16_t md_bits = hMetaData->nb_bits_tot - bit_pos_start + ( ( ( hEncoderConfig->ivas_total_brate == IVAS_256k ) && ( sba_order == SBA_FOA_ORDER ) ) ? 1 : 0 );
    1101             :     FILE *fp = fopen( "spar_md_bitrate.txt", "a" );
    1102             : 
    1103             :     fprintf( fp, "%d\t %d \t %d\n", md_bits, qsi, code_strat );
    1104             :     fclose( fp );
    1105             : #endif
    1106             : 
    1107     2511926 :     ivas_store_prior_coeffs( hMdEnc, num_bands, code_strat, dtx_vad, qsi );
    1108             : 
    1109     2511926 :     hMdEnc->spar_md.dtx_vad = dtx_vad;
    1110     2511926 :     hMdEnc->spar_md.num_bands = num_bands;
    1111             : 
    1112     2511926 :     free( ind_list_tmp );
    1113             : 
    1114     2511926 :     return IVAS_ERR_OK;
    1115             : }
    1116             : 
    1117             : 
    1118             : /*-----------------------------------------------------------------------------------------*
    1119             :  * Function ivas_band_mixer()
    1120             :  *
    1121             :  * band mixer
    1122             :  *-----------------------------------------------------------------------------------------*/
    1123             : 
    1124      195850 : static void ivas_band_mixer(
    1125             :     float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH],
    1126             :     const int16_t num_ch,
    1127             :     int16_t *num_bands,
    1128             :     int16_t red_band_fact )
    1129             : {
    1130             :     int16_t i, j, k, b, orig_band, rem_band;
    1131             :     float avg_cov;
    1132             : 
    1133      195850 :     orig_band = *num_bands;
    1134      195850 :     *num_bands /= red_band_fact;
    1135      195850 :     rem_band = orig_band - ( *num_bands * red_band_fact );
    1136             : 
    1137      979250 :     for ( i = 0; i < num_ch; i++ )
    1138             :     {
    1139     3917000 :         for ( j = 0; j < num_ch; j++ )
    1140             :         {
    1141    12082912 :             for ( k = 0; k < *num_bands - 1; k++ )
    1142             :             {
    1143     8949312 :                 avg_cov = 0.0f;
    1144    27299424 :                 for ( b = 0; b < red_band_fact; b++ )
    1145             :                 {
    1146    18350112 :                     avg_cov += cov_real[i][j][red_band_fact * k + b];
    1147             :                 }
    1148     8949312 :                 cov_real[i][j][k] = avg_cov;
    1149             :             }
    1150             : 
    1151     3133600 :             avg_cov = 0.0f;
    1152     9852288 :             for ( b = 0; b < red_band_fact + rem_band; b++ )
    1153             :             {
    1154     6718688 :                 avg_cov += cov_real[i][j][red_band_fact * ( *num_bands - 1 ) + b];
    1155             :             }
    1156             : 
    1157     3133600 :             cov_real[i][j][*num_bands - 1] = avg_cov;
    1158             :         }
    1159             :     }
    1160             : 
    1161      195850 :     return;
    1162             : }
    1163             : 
    1164             : 
    1165             : /*-----------------------------------------------------------------------------------------*
    1166             :  * Function ivas_write_spar_md_bitstream()
    1167             :  *
    1168             :  * Write MD parameters into bitstream
    1169             :  *-----------------------------------------------------------------------------------------*/
    1170             : 
    1171     6030517 : static void ivas_write_spar_md_bitstream(
    1172             :     ivas_spar_md_enc_state_t *hMdEnc,
    1173             :     const int16_t nB,
    1174             :     const int16_t bands_bw,
    1175             :     BSTR_ENC_HANDLE hMetaData,
    1176             :     const int32_t ivas_total_brate,
    1177             :     const int16_t strat,
    1178             :     const int16_t qsi )
    1179             : {
    1180             :     int16_t no_ec, i;
    1181             :     int16_t do_diff[IVAS_MAX_NUM_BANDS];
    1182             :     int16_t entropy_coding_result;
    1183             : 
    1184     6030517 :     if ( strat == NO_STRAT )
    1185             :     {
    1186           0 :         return;
    1187             :     }
    1188             : 
    1189             :     /* write quant strat */
    1190     6030517 :     if ( ivas_total_brate >= BRATE_SPAR_Q_STRAT )
    1191             :     {
    1192      628452 :         push_next_indice( hMetaData, qsi >> 1, hMdEnc->spar_md_cfg.quant_strat_bits - 1 );
    1193             :     }
    1194             :     else
    1195             :     {
    1196     5402065 :         push_next_indice( hMetaData, qsi, hMdEnc->spar_md_cfg.quant_strat_bits );
    1197             :     }
    1198             : 
    1199     6030517 :     no_ec = 0;
    1200             : 
    1201     6030517 :     if ( ivas_total_brate < IVAS_24k4 )
    1202             :     {
    1203      548559 :         switch ( strat )
    1204             :         {
    1205      185202 :             case BASE:
    1206      185202 :                 push_next_indice( hMetaData, bands_bw - 1, SPAR_NUM_CODING_STRAT_BITS );
    1207      185202 :                 break;
    1208      185202 :             case BASE_NOEC:
    1209      185202 :                 push_next_indice( hMetaData, bands_bw + 1, SPAR_NUM_CODING_STRAT_BITS );
    1210      185202 :                 no_ec = 1;
    1211      185202 :                 break;
    1212      178155 :             case FOUR_A:
    1213             :             case FOUR_C:
    1214             :             case FOUR_B:
    1215             :             case FOUR_D:
    1216      178155 :                 push_next_indice( hMetaData, strat, SPAR_NUM_CODING_STRAT_BITS );
    1217      178155 :                 break;
    1218             :         }
    1219             :         /* for LBR SBA 40MS MD never do time diff */
    1220     2742795 :         for ( i = 0; i < nB; i++ )
    1221             :         {
    1222     2194236 :             do_diff[i] = 0;
    1223             :         }
    1224             :     }
    1225             :     else
    1226             :     {
    1227     5481958 :         switch ( strat )
    1228             :         {
    1229     2324102 :             case BASE:
    1230     2324102 :                 push_next_indice( hMetaData, bands_bw - 1, SPAR_NUM_CODING_STRAT_BITS );
    1231    21754242 :                 for ( i = 0; i < nB; i++ )
    1232             :                 {
    1233    19430140 :                     do_diff[i] = 0;
    1234             :                 }
    1235     2324102 :                 break;
    1236     1612009 :             case BASE_NOEC:
    1237     1612009 :                 push_next_indice( hMetaData, bands_bw + 1, SPAR_NUM_CODING_STRAT_BITS );
    1238    14508081 :                 for ( i = 0; i < nB; i++ )
    1239             :                 {
    1240    12896072 :                     do_diff[i] = 0;
    1241             :                 }
    1242     1612009 :                 no_ec = 1;
    1243     1612009 :                 break;
    1244      426201 :             case FOUR_A:
    1245      426201 :                 push_next_indice( hMetaData, 4, SPAR_NUM_CODING_STRAT_BITS );
    1246     3835809 :                 for ( i = 0; i < nB; i++ )
    1247             :                 {
    1248     3409608 :                     do_diff[i] = ( ( ( i + 1 ) & 3 ) != 0 );
    1249             :                 }
    1250      426201 :                 ivas_map_prior_coeffs_quant( &hMdEnc->spar_md_prior, &hMdEnc->spar_md_cfg, qsi, nB );
    1251      426201 :                 break;
    1252      390851 :             case FOUR_B:
    1253      390851 :                 push_next_indice( hMetaData, 5, SPAR_NUM_CODING_STRAT_BITS );
    1254     3517659 :                 for ( i = 0; i < nB; i++ )
    1255             :                 {
    1256     3126808 :                     do_diff[i] = ( ( ( i + 1 ) & 3 ) != 1 );
    1257             :                 }
    1258      390851 :                 ivas_map_prior_coeffs_quant( &hMdEnc->spar_md_prior, &hMdEnc->spar_md_cfg, qsi, nB );
    1259      390851 :                 break;
    1260      371729 :             case FOUR_C:
    1261      371729 :                 push_next_indice( hMetaData, 6, SPAR_NUM_CODING_STRAT_BITS );
    1262     3345561 :                 for ( i = 0; i < nB; i++ )
    1263             :                 {
    1264     2973832 :                     do_diff[i] = ( ( ( i + 1 ) & 3 ) != 2 );
    1265             :                 }
    1266      371729 :                 ivas_map_prior_coeffs_quant( &hMdEnc->spar_md_prior, &hMdEnc->spar_md_cfg, qsi, nB );
    1267      371729 :                 break;
    1268      357066 :             case FOUR_D:
    1269      357066 :                 push_next_indice( hMetaData, 7, SPAR_NUM_CODING_STRAT_BITS );
    1270     3213594 :                 for ( i = 0; i < nB; i++ )
    1271             :                 {
    1272     2856528 :                     do_diff[i] = ( ( ( i + 1 ) & 3 ) != 3 );
    1273             :                 }
    1274      357066 :                 ivas_map_prior_coeffs_quant( &hMdEnc->spar_md_prior, &hMdEnc->spar_md_cfg, qsi, nB );
    1275      357066 :                 break;
    1276             :         }
    1277     6030517 :     }
    1278             : 
    1279             : #ifdef SPAR_HOA_DBG
    1280             :     if ( strat < 2 )
    1281             :         fprintf( stdout, "\n\n no_ec = %d, strat = %d\n", no_ec, strat - 1 );
    1282             :     else
    1283             :         fprintf( stdout, "\n\n no_ec = %d, strat = %d\n", no_ec, strat );
    1284             : #endif
    1285     6030517 :     if ( no_ec == 1 )
    1286             :     {
    1287             :         entropy_coding_result =
    1288     1797211 :             ivas_get_huffman_coded_bs( hMdEnc, hMetaData, nB, qsi,
    1289             :                                        bands_bw );
    1290             :     }
    1291             :     else
    1292             :     {
    1293             :         entropy_coding_result =
    1294     4233306 :             ivas_get_arith_coded_bs( hMdEnc, hMetaData, do_diff, bands_bw, nB, qsi,
    1295             :                                      strat, ivas_total_brate );
    1296             :     }
    1297             : 
    1298     6030517 :     if ( entropy_coding_result < 0 )
    1299             :     {
    1300     1140674 :         hMetaData->nb_bits_tot = 0;
    1301             :     }
    1302             : 
    1303     6030517 :     return;
    1304             : }
    1305             : 
    1306             : 
    1307             : /*-----------------------------------------------------------------------------------------*
    1308             :  * Function ivas_get_huffman_coded_bs()
    1309             :  *
    1310             :  * Generate huffman coded bitstream
    1311             :  *-----------------------------------------------------------------------------------------*/
    1312     1797211 : static int16_t ivas_get_huffman_coded_bs(
    1313             :     ivas_spar_md_enc_state_t *hMdEnc,
    1314             :     BSTR_ENC_HANDLE hMetaData,
    1315             :     const int16_t nB,
    1316             :     const int16_t qsi,
    1317             :     const int16_t bands_bw )
    1318             : {
    1319             :     int16_t i, j;
    1320             :     int16_t pred_coeff_dim, pred_offset;
    1321             : 
    1322    14586451 :     for ( i = 0; i < nB; i++ )
    1323             :     {
    1324             :         int16_t code, len;
    1325             :         int16_t ndm, ndec;
    1326    13522513 :         ndm = hMdEnc->spar_md_cfg.num_dmx_chans_per_band[i * bands_bw];
    1327    13522513 :         ndec = hMdEnc->spar_md_cfg.num_decorr_per_band[i * bands_bw];
    1328             : 
    1329    13522513 :         pred_coeff_dim = ndm + ndec - 1;
    1330    13522513 :         pred_offset = 0;
    1331    13522513 :         if ( hMdEnc->spar_hoa_md_flag && hMdEnc->spar_hoa_dirac2spar_md_flag )
    1332             :         {
    1333           0 :             if ( i >= SPAR_DIRAC_SPLIT_START_BAND )
    1334             :             {
    1335           0 :                 pred_offset = DIRAC_TO_SPAR_HBR_PRED_CHS;
    1336             :             }
    1337             :         }
    1338             : 
    1339    53473247 :         for ( j = pred_offset; j < pred_coeff_dim; j++ )
    1340             :         {
    1341    40310596 :             ivas_huffman_encode( &hMdEnc->huff_coeffs.pred_huff_re[qsi], hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j], &code, &len );
    1342    40310596 :             if ( ( hMetaData->nb_bits_tot + len ) > hMdEnc->spar_md_cfg.max_bits_per_blk )
    1343             :             {
    1344      733273 :                 return -1;
    1345             :             }
    1346    39950734 :             push_next_indice( hMetaData, code, len );
    1347             :         }
    1348             : 
    1349    27483852 :         for ( j = 0; j < ndec * ( ndm - 1 ); j++ )
    1350             :         {
    1351    14409007 :             ivas_huffman_encode( &hMdEnc->huff_coeffs.drct_huff_re[qsi], hMdEnc->spar_md.band_coeffs_idx[i].drct_index_re[j], &code, &len );
    1352    14409007 :             if ( ( hMetaData->nb_bits_tot + len ) > hMdEnc->spar_md_cfg.max_bits_per_blk )
    1353             :             {
    1354       87806 :                 return -1;
    1355             :             }
    1356    14321201 :             push_next_indice( hMetaData, code, len );
    1357             :         }
    1358             : 
    1359    40638075 :         for ( j = 0; j < ndec; j++ )
    1360             :         {
    1361    27848835 :             ivas_huffman_encode( &hMdEnc->huff_coeffs.decd_huff_re[qsi], hMdEnc->spar_md.band_coeffs_idx[i].decd_index_re[j], &code, &len );
    1362    27848835 :             if ( ( hMetaData->nb_bits_tot + len ) > hMdEnc->spar_md_cfg.max_bits_per_blk )
    1363             :             {
    1364      285605 :                 return -1;
    1365             :             }
    1366    27563230 :             push_next_indice( hMetaData, code, len );
    1367             :         }
    1368             :     }
    1369             : 
    1370     1063938 :     return 0;
    1371             : }
    1372             : 
    1373             : 
    1374             : /*-----------------------------------------------------------------------------------------*
    1375             :  * Function ivas_get_arith_coded_bs()
    1376             :  *
    1377             :  * Generate arithmetic coded bitstream
    1378             :  *-----------------------------------------------------------------------------------------*/
    1379     4233306 : static int16_t ivas_get_arith_coded_bs(
    1380             :     ivas_spar_md_enc_state_t *hMdEnc,
    1381             :     BSTR_ENC_HANDLE hMetaData,
    1382             :     const int16_t *pDo_diff,
    1383             :     const int16_t bands_bw,
    1384             :     const int16_t nB,
    1385             :     const int16_t qsi,
    1386             :     const int16_t strat,
    1387             :     const int32_t ivas_total_brate )
    1388             : {
    1389             :     int16_t i, any_diff;
    1390             :     int16_t j;
    1391             :     ivas_cell_dim_t pred_cell_dims[IVAS_MAX_NUM_BANDS];
    1392             :     ivas_cell_dim_t drct_cell_dims[IVAS_MAX_NUM_BANDS];
    1393             :     ivas_cell_dim_t decd_cell_dims[IVAS_MAX_NUM_BANDS];
    1394             :     ivas_cell_dim_t decx_cell_dims[IVAS_MAX_NUM_BANDS];
    1395             :     int16_t symbol_arr_re[IVAS_MAX_INPUT_LEN];
    1396             :     int16_t symbol_arr_old_re[IVAS_MAX_INPUT_LEN];
    1397             :     int16_t arith_result;
    1398             : 
    1399    37483650 :     for ( i = 0; i < nB; i++ )
    1400             :     {
    1401             :         int16_t ndm, ndec;
    1402    33250344 :         ndm = hMdEnc->spar_md_cfg.num_dmx_chans_per_band[bands_bw * i];
    1403    33250344 :         ndec = hMdEnc->spar_md_cfg.num_decorr_per_band[bands_bw * i];
    1404             : 
    1405    33250344 :         if ( ( ivas_total_brate < IVAS_24k4 ) && ( strat > 3 ) && ( ( ( i % 2 == 1 ) && ( strat % 2 == 0 ) ) || ( ( i % 2 == 0 ) && ( strat % 2 == 1 ) ) ) )
    1406             :         {
    1407      356310 :             pred_cell_dims[i].dim1 = 0;
    1408      356310 :             pred_cell_dims[i].dim2 = 0;
    1409      356310 :             drct_cell_dims[i].dim1 = 0;
    1410      356310 :             drct_cell_dims[i].dim2 = 0;
    1411      356310 :             decd_cell_dims[i].dim1 = 0;
    1412      356310 :             decd_cell_dims[i].dim2 = 0;
    1413      356310 :             decx_cell_dims[i].dim1 = 0;
    1414      356310 :             decx_cell_dims[i].dim2 = 0;
    1415             :         }
    1416             :         else
    1417             :         {
    1418    32894034 :             pred_cell_dims[i].dim1 = ndm + ndec - 1;
    1419    32894034 :             if ( hMdEnc->spar_hoa_md_flag && hMdEnc->spar_hoa_dirac2spar_md_flag )
    1420             :             {
    1421     1380936 :                 if ( i >= SPAR_DIRAC_SPLIT_START_BAND )
    1422             :                 {
    1423      460312 :                     pred_cell_dims[i].dim1 -= ( FOA_CHANNELS - 1 );
    1424             :                 }
    1425             :             }
    1426    32894034 :             pred_cell_dims[i].dim2 = 1;
    1427    32894034 :             drct_cell_dims[i].dim1 = ndec;
    1428    32894034 :             drct_cell_dims[i].dim2 = ndm - 1;
    1429    32894034 :             decd_cell_dims[i].dim1 = ndec;
    1430    32894034 :             decd_cell_dims[i].dim2 = 1;
    1431    32894034 :             decx_cell_dims[i].dim1 = ( ndec * ( ndec - 1 ) ) >> 1;
    1432    32894034 :             decx_cell_dims[i].dim2 = 1;
    1433             :         }
    1434             :     }
    1435             : 
    1436     4233306 :     any_diff = 0;
    1437    25507725 :     for ( i = 0; i < nB; i++ )
    1438             :     {
    1439    22820266 :         if ( pDo_diff[i] != 0 )
    1440             :         {
    1441     1545847 :             any_diff = 1;
    1442     1545847 :             break;
    1443             :         }
    1444             :     }
    1445     4233306 :     if ( hMdEnc->spar_hoa_md_flag && hMdEnc->spar_hoa_dirac2spar_md_flag )
    1446             :     {
    1447     1496014 :         for ( i = 0; i < nB; i++ )
    1448             :         {
    1449     1380936 :             if ( i >= SPAR_DIRAC_SPLIT_START_BAND )
    1450             :             {
    1451     1869320 :                 for ( j = 0; j < pred_cell_dims[i].dim1; j++ )
    1452             :                 {
    1453     1409008 :                     hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j] =
    1454     1409008 :                         hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j + DIRAC_TO_SPAR_HBR_PRED_CHS];
    1455             : 
    1456     1409008 :                     if ( any_diff == 1 )
    1457             :                     {
    1458           0 :                         hMdEnc->spar_md_prior.band_coeffs_idx_mapped[i].pred_index_re[j] =
    1459           0 :                             hMdEnc->spar_md_prior.band_coeffs_idx_mapped[i].pred_index_re[j + DIRAC_TO_SPAR_HBR_PRED_CHS];
    1460             :                     }
    1461             :                 }
    1462             :             }
    1463             :         }
    1464             :     }
    1465     4233306 :     ivas_copy_band_coeffs_idx_to_arr( hMdEnc->spar_md.band_coeffs_idx, nB, symbol_arr_re, pred_cell_dims, PRED_COEFF );
    1466             : 
    1467     4233306 :     if ( any_diff == 1 )
    1468             :     {
    1469     1545847 :         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 );
    1470             :     }
    1471             : 
    1472     4233306 :     arith_result = ivas_arith_encode_cmplx_cell_array( &hMdEnc->arith_coeffs.pred_arith_re[qsi], &hMdEnc->arith_coeffs.pred_arith_re_diff[qsi], pDo_diff, nB,
    1473     4233306 :                                                        symbol_arr_re, symbol_arr_old_re, pred_cell_dims, hMetaData, any_diff, hMdEnc->spar_md_cfg.max_bits_per_blk );
    1474     4233306 :     if ( arith_result < 0 )
    1475             :     {
    1476       20982 :         return -1;
    1477             :     }
    1478             : 
    1479     4212324 :     if ( hMdEnc->spar_hoa_md_flag && hMdEnc->spar_hoa_dirac2spar_md_flag )
    1480             :     {
    1481     1496014 :         for ( i = 0; i < nB; i++ )
    1482             :         {
    1483     1380936 :             if ( i >= SPAR_DIRAC_SPLIT_START_BAND )
    1484             :             {
    1485     1869320 :                 for ( j = pred_cell_dims[i].dim1 - 1; j >= 0; j-- )
    1486             :                 {
    1487     1409008 :                     hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j + DIRAC_TO_SPAR_HBR_PRED_CHS] =
    1488     1409008 :                         hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j];
    1489             :                 }
    1490     1841248 :                 for ( j = 0; j < DIRAC_TO_SPAR_HBR_PRED_CHS; j++ )
    1491             :                 {
    1492     1380936 :                     hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j] = 0;
    1493             :                 }
    1494             :             }
    1495             :         }
    1496             :     }
    1497             : 
    1498     4212324 :     ivas_copy_band_coeffs_idx_to_arr( hMdEnc->spar_md.band_coeffs_idx, nB, symbol_arr_re, drct_cell_dims, DRCT_COEFF );
    1499             : 
    1500     4212324 :     if ( any_diff == 1 )
    1501             :     {
    1502     1545847 :         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 );
    1503             :     }
    1504             : 
    1505             : 
    1506     4212324 :     arith_result = ivas_arith_encode_cmplx_cell_array( &hMdEnc->arith_coeffs.drct_arith_re[qsi], &hMdEnc->arith_coeffs.drct_arith_re_diff[qsi], pDo_diff, nB,
    1507     4212324 :                                                        symbol_arr_re, symbol_arr_old_re, drct_cell_dims, hMetaData, any_diff, hMdEnc->spar_md_cfg.max_bits_per_blk );
    1508     4212324 :     if ( arith_result < 0 )
    1509             :     {
    1510         146 :         return -1;
    1511             :     }
    1512             : 
    1513     4212178 :     ivas_copy_band_coeffs_idx_to_arr( hMdEnc->spar_md.band_coeffs_idx, nB, symbol_arr_re, decd_cell_dims, DECD_COEFF );
    1514             : 
    1515     4212178 :     if ( any_diff == 1 )
    1516             :     {
    1517     1545701 :         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 );
    1518             :     }
    1519             : 
    1520     4212178 :     arith_result = ivas_arith_encode_cmplx_cell_array( &hMdEnc->arith_coeffs.decd_arith_re[qsi], &hMdEnc->arith_coeffs.decd_arith_re_diff[qsi], pDo_diff, nB,
    1521     4212178 :                                                        symbol_arr_re, symbol_arr_old_re, decd_cell_dims, hMetaData, any_diff, hMdEnc->spar_md_cfg.max_bits_per_blk );
    1522     4212178 :     if ( arith_result < 0 )
    1523             :     {
    1524      386273 :         return -1;
    1525             :     }
    1526             : 
    1527     3825905 :     ivas_copy_band_coeffs_idx_to_arr( hMdEnc->spar_md.band_coeffs_idx, nB, symbol_arr_re, decx_cell_dims, DECX_COEFF );
    1528             : 
    1529     3825905 :     if ( any_diff == 1 )
    1530             :     {
    1531     1531985 :         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 );
    1532             :     }
    1533             : 
    1534     3825905 :     return 0;
    1535             : }
    1536             : 
    1537             : 
    1538             : /*-----------------------------------------------------------------------------------------*
    1539             :  * Function ivas_select_next_strat()
    1540             :  *
    1541             :  * Select next strategy
    1542             :  *-----------------------------------------------------------------------------------------*/
    1543             : 
    1544     2509304 : static void ivas_select_next_strat(
    1545             :     ivas_strats_t prior_strat,
    1546             :     ivas_strats_t cs[MAX_QUANT_STRATS],
    1547             :     const int16_t dmx_switch,
    1548             :     const int16_t dtx_vad )
    1549             : {
    1550     2509304 :     cs[0] = BASE;
    1551     2509304 :     cs[1] = BASE_NOEC;
    1552     2509304 :     if ( dmx_switch == 0 && dtx_vad )
    1553             :     {
    1554     2509304 :         switch ( prior_strat )
    1555             :         {
    1556       25874 :             case START:
    1557       25874 :                 cs[2] = NO_STRAT;
    1558       25874 :                 break;
    1559      754984 :             case BASE:
    1560      754984 :                 cs[2] = FOUR_A;
    1561      754984 :                 break;
    1562           0 :             case BASE_DIFF:
    1563           0 :                 cs[2] = FOUR_A;
    1564           0 :                 break;
    1565       56177 :             case BASE_NOEC:
    1566       56177 :                 cs[2] = FOUR_A;
    1567       56177 :                 break;
    1568      447681 :             case FOUR_A:
    1569      447681 :                 cs[2] = FOUR_B;
    1570      447681 :                 break;
    1571      423621 :             case FOUR_B:
    1572      423621 :                 cs[2] = FOUR_C;
    1573      423621 :                 break;
    1574      406204 :             case FOUR_C:
    1575      406204 :                 cs[2] = FOUR_D;
    1576      406204 :                 break;
    1577      394763 :             case FOUR_D:
    1578      394763 :                 cs[2] = FOUR_A;
    1579      394763 :                 break;
    1580           0 :             default:
    1581           0 :                 assert( !"bad value of prior_strat" );
    1582             :         }
    1583           0 :     }
    1584             : 
    1585     2509304 :     return;
    1586             : }
    1587             : 
    1588             : 
    1589             : /*-----------------------------------------------------------------------------------------*
    1590             :  * Function ivas_store_prior_coeffs()
    1591             :  *
    1592             :  * Store prior coeffs
    1593             :  *-----------------------------------------------------------------------------------------*/
    1594             : 
    1595     2511926 : static void ivas_store_prior_coeffs(
    1596             :     ivas_spar_md_enc_state_t *hMdEnc,
    1597             :     const int16_t num_bands,
    1598             :     const int16_t strat,
    1599             :     const int16_t dtx_vad,
    1600             :     const int16_t qsi )
    1601             : {
    1602             :     int16_t i, j, b;
    1603     2511926 :     if ( dtx_vad == 0 )
    1604             :     {
    1605       14109 :         hMdEnc->spar_md_cfg.prior_strat = START;
    1606             :     }
    1607             :     else
    1608             :     {
    1609     2497817 :         hMdEnc->spar_md_cfg.prior_strat = strat;
    1610             :     }
    1611             : 
    1612     2511926 :     hMdEnc->spar_md_cfg.prev_quant_idx = qsi;
    1613             : 
    1614    22633040 :     for ( i = 0; i < num_bands; i++ )
    1615             :     {
    1616    20121114 :         b = i;
    1617             : 
    1618   221332254 :         for ( j = 0; j < IVAS_SPAR_MAX_CH - 1; j++ )
    1619             :         {
    1620   201211140 :             hMdEnc->spar_md_prior.band_coeffs_idx[i].pred_index_re[j] = hMdEnc->spar_md.band_coeffs_idx[b].pred_index_re[j];
    1621   201211140 :             hMdEnc->spar_md_prior.band_coeffs_idx[i].decd_index_re[j] = hMdEnc->spar_md.band_coeffs_idx[b].decd_index_re[j];
    1622             :         }
    1623   442664508 :         for ( j = 0; j < IVAS_SPAR_MAX_C_COEFF; j++ )
    1624             :         {
    1625   422543394 :             hMdEnc->spar_md_prior.band_coeffs_idx[i].drct_index_re[j] = hMdEnc->spar_md.band_coeffs_idx[b].drct_index_re[j];
    1626             :         }
    1627             :     }
    1628             : 
    1629     2511926 :     return;
    1630             : }
    1631             : 
    1632             : 
    1633             : /*-----------------------------------------------------------------------------------------*
    1634             :  * Function ivas_spar_quant_pred_coeffs_dtx()
    1635             :  *
    1636             :  * Calculate quantization pred coeffs
    1637             :  *-----------------------------------------------------------------------------------------*/
    1638             : 
    1639       28218 : static void ivas_spar_quant_pred_coeffs_dtx(
    1640             :     ivas_spar_md_t *pSpar_md,
    1641             :     const float *pValues,
    1642             :     const int16_t ndm,
    1643             :     int16_t *pIndex,
    1644             :     const int16_t dim1,
    1645             :     float *pQuant )
    1646             : {
    1647             :     int16_t i;
    1648             :     int16_t q_lvl;
    1649             :     float pr_min_max[2];
    1650             : 
    1651       28218 :     pr_min_max[0] = pSpar_md->min_max[0];
    1652       28218 :     pr_min_max[1] = pSpar_md->min_max[1];
    1653             : 
    1654      112872 :     for ( i = 0; i < dim1; i++ )
    1655             :     {
    1656       84654 :         q_lvl = dtx_pr_real_q_levels[ndm - 1][i];
    1657       84654 :         ivas_quantise_real_values( &pValues[i], q_lvl, pr_min_max[0], pr_min_max[1], &pIndex[i], &pQuant[i], 1 );
    1658             :     }
    1659             : 
    1660       28218 :     return;
    1661             : }
    1662             : 
    1663             : 
    1664             : /*-----------------------------------------------------------------------------------------*
    1665             :  * Function ivas_quant_p_per_band_dtx()
    1666             :  *
    1667             :  * Calculate quantization p
    1668             :  *-----------------------------------------------------------------------------------------*/
    1669             : 
    1670       28218 : static void ivas_quant_p_per_band_dtx(
    1671             :     float *pP_mat,
    1672             :     const int16_t num_dec,
    1673             :     const int16_t num_dmx,
    1674             :     int16_t *ppIdx_pd,
    1675             :     float *pP_out,
    1676             :     const int16_t num_ch )
    1677             : {
    1678             :     int16_t i;
    1679       28218 :     int16_t dim = num_ch - num_dmx;
    1680             : 
    1681       28218 :     if ( num_dec == num_ch - 1 )
    1682             :     {
    1683       68616 :         for ( i = 0; i < dim; i++ )
    1684             :         {
    1685       51462 :             if ( pP_mat[i] < pr_boost_range[1] && pP_mat[i] > pr_boost_range[0] )
    1686             :             {
    1687       14698 :                 pP_mat[i] = pr_boost_range[1];
    1688             :             }
    1689             :         }
    1690             :     }
    1691             : 
    1692       28218 :     if ( dim != num_dec )
    1693             :     {
    1694           0 :         assert( !"Not Supported!" );
    1695             :     }
    1696             : 
    1697      101808 :     for ( i = 0; i < dim; i++ )
    1698             :     {
    1699       73590 :         ivas_quantise_real_values( &pP_mat[i], dtx_pd_real_q_levels[num_ch - num_dec - 1][i], dtx_pd_real_min_max[0], dtx_pd_real_min_max[1], &ppIdx_pd[i], &pP_out[i], 1 );
    1700             :     }
    1701             : 
    1702       28218 :     return;
    1703             : }
    1704             : 
    1705             : /*-----------------------------------------------------------------------------------------*
    1706             :  * Function ivas_write_parameter_bitstream_dtx()
    1707             :  *
    1708             :  * Write MD DTX parameters into bitstream
    1709             :  *-----------------------------------------------------------------------------------------*/
    1710             : 
    1711       14109 : static void ivas_write_parameter_bitstream_dtx(
    1712             :     ivas_spar_md_t *pSpar_md,
    1713             :     BSTR_ENC_HANDLE hMetaData,
    1714             :     int16_t *num_dmx,
    1715             :     int16_t *num_dec,
    1716             :     const int16_t num_bands )
    1717             : {
    1718             :     int16_t i, j;
    1719             :     float val;
    1720             :     int16_t idx;
    1721             :     float pr_min_max[2];
    1722             :     int16_t zero_pad_bits, sid_bits_len;
    1723             :     int16_t sba_spar_bitlen;
    1724             : 
    1725       14109 :     sid_bits_len = hMetaData->nb_bits_tot;
    1726       14109 :     pr_min_max[0] = pSpar_md->min_max[0];
    1727       14109 :     pr_min_max[1] = pSpar_md->min_max[1];
    1728             : 
    1729       42327 :     for ( i = 0; i < num_bands; i++ )
    1730             :     {
    1731       28218 :         int16_t ndm = num_dmx[i];
    1732       28218 :         int16_t ndec = num_dec[i];
    1733             : 
    1734      112872 :         for ( j = 0; j < FOA_CHANNELS - 1; j++ )
    1735             :         {
    1736             :             int16_t pr, pd;
    1737             :             int16_t pr_q_lvls, pd_q_lvls, pr_pd_bits;
    1738             :             int16_t pr_idx_1, pr_idx_2, pd_idx_1, pd_idx_2;
    1739             :             uint16_t value;
    1740             : 
    1741       84654 :             pr_idx_1 = pr_pr_idx_pairs[ndm - 1][j][0];
    1742       84654 :             pr_idx_2 = pr_pr_idx_pairs[ndm - 1][j][1];
    1743       84654 :             pd_idx_1 = pr_pd_idx_pairs[ndm - 1][j][0];
    1744       84654 :             pd_idx_2 = pr_pd_idx_pairs[ndm - 1][j][1];
    1745             : 
    1746       84654 :             if ( pr_idx_1 != 0 || pd_idx_1 != 0 || pr_idx_2 != 0 || pd_idx_2 != 0 )
    1747             :             {
    1748       84654 :                 pr_q_lvls = dtx_pr_real_q_levels[ndm - 1][pd_idx_1 - 1];
    1749       84654 :                 pr = pSpar_md->band_coeffs_idx[i].pred_index_re[pd_idx_1 - 1];
    1750             : 
    1751       84654 :                 if ( ( j + 1 ) > ndec )
    1752             :                 {
    1753       11064 :                     pd_q_lvls = 1;
    1754       11064 :                     pd = 0;
    1755             :                 }
    1756             :                 else
    1757             :                 {
    1758       73590 :                     pd_q_lvls = dtx_pd_real_q_levels[ndm - 1][pd_idx_2 - 1];
    1759       73590 :                     pd = pSpar_md->band_coeffs_idx[i].decd_index_re[pd_idx_2 - 1];
    1760             :                 }
    1761       84654 :                 val = dtx_pd_real_min_max[0];
    1762       84654 :                 ivas_quantise_real_values( &val, pd_q_lvls, dtx_pd_real_min_max[0], dtx_pd_real_min_max[1], &idx, &val, 1 );
    1763             : 
    1764       84654 :                 pd -= idx;
    1765             : 
    1766       84654 :                 val = pr_min_max[0];
    1767       84654 :                 ivas_quantise_real_values( &val, pr_q_lvls, pr_min_max[0], pr_min_max[1], &idx, &val, 1 );
    1768             : 
    1769       84654 :                 pr -= idx;
    1770       84654 :                 pr_pd_bits = ivas_get_bits_to_encode( pd_q_lvls * pr_q_lvls );
    1771             : 
    1772       84654 :                 value = (uint16_t) ( pr * pd_q_lvls + pd );
    1773             : 
    1774       84654 :                 push_next_indice( hMetaData, value, pr_pd_bits );
    1775             :             }
    1776             :         }
    1777             :     }
    1778             : 
    1779       14109 :     sid_bits_len = hMetaData->nb_bits_tot - sid_bits_len;
    1780       14109 :     sba_spar_bitlen = ivas_sba_spar_sid_bitlen( num_dmx[0] );
    1781       14109 :     zero_pad_bits = sba_spar_bitlen - sid_bits_len;
    1782             : 
    1783       14109 :     assert( zero_pad_bits >= 0 );
    1784       14109 :     if ( num_dmx[0] == 2 )
    1785             :     {
    1786        5532 :         zero_pad_bits -= 1;
    1787             :     }
    1788             : 
    1789       19641 :     while ( zero_pad_bits > 0 )
    1790             :     {
    1791        5532 :         j = min( zero_pad_bits, 16 );
    1792        5532 :         push_next_indice( hMetaData, 0, j );
    1793        5532 :         zero_pad_bits -= j;
    1794             :     }
    1795             : 
    1796       14109 :     return;
    1797             : }
    1798             : 
    1799             : 
    1800             : /*-----------------------------------------------------------------------------------------*
    1801             :  * Function ivas_quant_pred_coeffs_per_band()
    1802             :  *
    1803             :  * Quantization of prediction coefficients
    1804             :  *-----------------------------------------------------------------------------------------*/
    1805             : 
    1806    20170948 : static void ivas_quant_pred_coeffs_per_band(
    1807             :     ivas_band_coeffs_t *pband_coeffs,
    1808             :     ivas_band_coeffs_ind_t *pBand_coeffs_idx,
    1809             :     ivas_quant_strat_t *pQs,
    1810             :     const int16_t num_ch )
    1811             : {
    1812    20170948 :     ivas_quantise_real_values( pband_coeffs->pred_re, pQs->PR.q_levels[0], pQs->PR.min, pQs->PR.max, pBand_coeffs_idx->pred_index_re, pband_coeffs->pred_quant_re, ( num_ch - 1 ) );
    1813             : 
    1814    20170948 :     return;
    1815             : }
    1816             : 
    1817             : 
    1818             : /*-----------------------------------------------------------------------------------------*
    1819             :  * Function ivas_quant_c_per_band()
    1820             :  *
    1821             :  * Quantization of cross prediction c coeffs for each band
    1822             :  *-----------------------------------------------------------------------------------------*/
    1823             : 
    1824    11270028 : static void ivas_quant_c_per_band(
    1825             :     ivas_band_coeffs_t *pband_coeffs,
    1826             :     ivas_band_coeffs_ind_t *pBand_coeffs_idx,
    1827             :     ivas_quant_strat_t *pQs,
    1828             :     const int16_t ndec,
    1829             :     const int16_t ndm )
    1830             : {
    1831             :     int16_t i;
    1832             :     int16_t j, k;
    1833             :     float C_re[IVAS_SPAR_MAX_C_COEFF];
    1834    11270028 :     k = 0;
    1835    36738752 :     for ( i = 0; i < ndec; i++ )
    1836             :     {
    1837    77801120 :         for ( j = 0; j < ndm - 1; j++ )
    1838             :         {
    1839    52332396 :             C_re[k] = pband_coeffs->C_re[i][j];
    1840    52332396 :             k++;
    1841             :         }
    1842             :     }
    1843    11270028 :     ivas_quantise_real_values( C_re, pQs->C.q_levels[0], pQs->C.min, pQs->C.max, pBand_coeffs_idx->drct_index_re, C_re, ndec * ( ndm - 1 ) );
    1844    11270028 :     k = 0;
    1845    36738752 :     for ( i = 0; i < ndec; i++ )
    1846             :     {
    1847    77801120 :         for ( j = 0; j < ndm - 1; j++ )
    1848             :         {
    1849    52332396 :             pband_coeffs->C_quant_re[i][j] = C_re[k];
    1850    52332396 :             k++;
    1851             :         }
    1852             :     }
    1853             : 
    1854    11270028 :     return;
    1855             : }
    1856             : 
    1857             : 
    1858             : /*-----------------------------------------------------------------------------------------*
    1859             :  * Function ivas_quant_p_per_band()
    1860             :  *
    1861             :  * Quantization of decorrelation p coeffs for each band
    1862             :  *-----------------------------------------------------------------------------------------*/
    1863             : 
    1864    17242244 : static void ivas_quant_p_per_band(
    1865             :     ivas_band_coeffs_t *pband_coeffs,
    1866             :     ivas_band_coeffs_ind_t *pBand_coeffs_idx,
    1867             :     ivas_quant_strat_t *pQs,
    1868             :     const int16_t num_ch )
    1869             : {
    1870    17242244 :     ivas_quantise_real_values( pband_coeffs->P_re, pQs->P_r.q_levels[0], pQs->P_r.min, pQs->P_r.max, pBand_coeffs_idx->decd_index_re, pband_coeffs->P_quant_re, num_ch - 1 );
    1871             : 
    1872    17242244 :     return;
    1873             : }

Generated by: LCOV version 1.14