Commit e5627b9e authored by PLAINSI's avatar PLAINSI
Browse files

Merge branch 'main' into dlb_mc_160kbps

parents 9e9741ee 67aaefcf
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -63,7 +63,7 @@ if [ $BUILD -eq 1 ];then
	make clean
	
    # Replace free -> free_, malloc -> malloc_, calloc -> calloc_
	./scripts/prepare_mem_dryrun.py
	python3 ./scripts/prepare_mem_dryrun.py

	# Enable WMOPS and disable DEBUGGING
	sed -i.bak -e "s/\/\*\s*\(#define\s*WMOPS\)\s*\*\//\1/g" lib_com/options.h

lib_com/ivas_cnst.h

100644 → 100755
+27 −0
Original line number Diff line number Diff line
@@ -174,6 +174,10 @@ typedef enum
#define BINAURAL_CHANNELS                       2                           /* number of channels for binaural output configuration */
#define CPE_CHANNELS                            2                           /* number of CPE (stereo) channels */
#define FOA_CHANNELS                            4                           /* number of FOA channels */
#ifdef HODIRAC
#define HOA2_CHANNELS                           9
#endif

#define MAX_NUM_OBJECTS                         4                           /* max. number of audio objects */

#define MAX_SCE                                 MAX_NUM_OBJECTS             /* max. number of SCEs */
@@ -905,7 +909,11 @@ typedef enum
 * DirAC Constants 
 *----------------------------------------------------------------------------------*/

#ifdef HODIRAC
#define DIRAC_MAX_ANA_CHANS                     11                          /* Maximum number of channels for DirAC analysis */
#else
#define DIRAC_MAX_ANA_CHANS                     FOA_CHANNELS                /* Maximum number of channels for DirAC analysis */
#endif

#define DIRAC_NUM_DIMS                          3                           /* number of directions to estimate (X,Y,Z) */
#define DIRAC_MAX_NBANDS                        12                          /* Maximum number of frequency bands for the DirAC Side Parameter decoding */
@@ -919,6 +927,11 @@ typedef enum
#define DIRAC_NO_FB_BANDS_MAX                   MDFT_FB_BANDS_240
#define DELAY_DIRAC_ENC_CMP_NS_PARAM_ISM        ( IVAS_ENC_DELAY_NS + IVAS_DEC_DELAY_NS ) /* == 12 ms */

#ifdef HODIRAC
#define DIRAC_HO_NUMSECTORS                     2
#define NUM_ANA_SECTORS 2
#endif


/* DirAC renderer setup */
typedef enum
@@ -977,7 +990,17 @@ typedef enum

#define SPAR_CONFIG_BW                          FB

#ifndef SPAR_TUNING
#define IVAS_SPAR_MAX_CH                        (FOA_CHANNELS + 2 * ( IVAS_MAX_SBA_ORDER - 1 )) /* FOA + planar HOA */
#else
#define IVAS_SPAR_MAX_CH                        ((( IVAS_MAX_SBA_ORDER ) * ( IVAS_MAX_SBA_ORDER )) + 2) /* HOA2 + pHOA3*/
#define IVAS_HBR_MAX_DECOR_CHS                  (2)
#endif

#ifdef HODIRAC
#define IVAS_SPAR_MAX_FB_IN_CHAN               11
#endif


#define IVAS_SPAR_P_LOWERTRI                    ((IVAS_SPAR_MAX_CH - 1) * (IVAS_SPAR_MAX_CH - 2)) >> 1
#define IVAS_SPAR_MAX_C_COEFF                   (IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS) * ( IVAS_SPAR_MAX_DMX_CHS - 1)
@@ -1186,7 +1209,11 @@ enum
#define MASA_ANGLE_TOLERANCE                    0.5f
#define MASA_LIMIT_NO_BANDS_SUR_COH             8
#define MINIMUM_BIT_BUDGET_NORMAL_META          100
#ifdef HODIRAC
#define DIFF_DFRATIO_2BIT_LIMIT_IDX_HODIRAC     4
#endif
#define DIFF_DFRATIO_2BIT_LIMIT_IDX             3

#define DIFF_DFRATIO_1BIT_LIMIT_IDX             6
#define DIFF_EC_HUFF_BAND_LIMIT                 8
#define DIFF_EC_HUFF_GR0_LIMIT                  8
+15 −2
Original line number Diff line number Diff line
@@ -50,8 +50,11 @@ static void ivas_set_up_cov_smoothing(
    ivas_cov_smooth_state_t *hCovState,
    ivas_filterbank_t *pFb,
    const float max_update_rate,
    const int16_t min_pool_size,
    const int16_t min_pool_size
#ifndef FIX_331_ALL_BRS
    ,
    const int16_t nchan_inp /* i  : number of input channels       */
#endif
    ,
    const int32_t ivas_total_brate )
{
@@ -90,7 +93,9 @@ static void ivas_set_up_cov_smoothing(
            }
        }
    }
    else if ( nchan_inp <= FOA_CHANNELS )
    else
#ifndef FIX_331_ALL_BRS
        if ( nchan_inp <= FOA_CHANNELS )
    {
        for ( j = 0; j < pFb->filterbank_num_bands; j++ )
        {
@@ -112,6 +117,7 @@ static void ivas_set_up_cov_smoothing(
    }
    else
    {
#endif
        for ( j = 0; j < pFb->filterbank_num_bands; j++ )
        {
            float update_factor;
@@ -131,7 +137,9 @@ static void ivas_set_up_cov_smoothing(
                hCovState->pSmoothing_factor[j] = max_update_rate;
            }
        }
#ifndef FIX_331_ALL_BRS
    }
#endif
    hCovState->prior_bank_idx = -1;

    return;
@@ -178,7 +186,12 @@ ivas_error ivas_spar_covar_smooth_enc_open(
        }
    }


#ifndef FIX_331_ALL_BRS
    ivas_set_up_cov_smoothing( hCovState, pFb, cov_smooth_cfg->max_update_rate, cov_smooth_cfg->min_pool_size, nchan_inp, ivas_total_brate );
#else
    ivas_set_up_cov_smoothing( hCovState, pFb, cov_smooth_cfg->max_update_rate, cov_smooth_cfg->min_pool_size, ivas_total_brate );
#endif

    *hCovState_out = hCovState;

+292 −8
Original line number Diff line number Diff line
@@ -71,8 +71,10 @@ ivas_error ivas_dirac_config(
    int16_t spar_dirac_split_band;
    IVAS_FB_MIXER_HANDLE hFbMdft;
    SBA_MODE sba_mode;

    int16_t *dirac_to_spar_md_bands;


    error = IVAS_ERR_OK;

    if ( enc_dec == ENC )
@@ -128,7 +130,14 @@ ivas_error ivas_dirac_config(
    if ( sba_mode == SBA_MODE_SPAR )
    {
        hConfig->nbands = IVAS_MAX_NUM_BANDS;

        spar_dirac_split_band = min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND );
#ifdef HODIRAC
        if ( sba_order > 1 && ivas_total_brate > IVAS_256k )
        {
            spar_dirac_split_band = 0;
        }
#endif
    }
    else
    {
@@ -164,6 +173,16 @@ ivas_error ivas_dirac_config(
            {
                hConfig->enc_param_start_band = spar_dirac_split_band;
            }
#ifdef HODIRAC
            if ( sba_order > 1 && ivas_total_brate > IVAS_256k )
            {
                hConfig->dec_param_estim = FALSE;
                hConfig->enc_param_start_band = 0;

                set_c( (int8_t *) hQMetaData->twoDirBands, (int8_t) 1, hQMetaData->q_direction[0].cfg.nbands );
                hQMetaData->numTwoDirBands = (uint8_t) hQMetaData->q_direction[0].cfg.nbands;
            }
#endif
        }
        else
        {
@@ -176,7 +195,9 @@ ivas_error ivas_dirac_config(

    if ( sba_mode == SBA_MODE_SPAR )
    {
        ivas_dirac_config_bands( band_grouping, IVAS_MAX_NUM_BANDS, (int16_t) ( Fs * INV_CLDFB_BANDWIDTH + 0.5f ),
        ivas_dirac_config_bands( band_grouping,
                                 IVAS_MAX_NUM_BANDS,
                                 (int16_t) ( Fs * INV_CLDFB_BANDWIDTH + 0.5f ),
                                 dirac_to_spar_md_bands, hQMetaData->useLowerBandRes, hConfig->enc_param_start_band, hFbMdft );
    }
    else
@@ -354,13 +375,45 @@ ivas_error ivas_dirac_sba_config(
        else
        {
            hQMetaData->useLowerBandRes = 0;
#ifdef HODIRAC
            if ( !( sba_order > 1 && sba_total_brate > IVAS_256k ) )
#endif
            {
                nbands_coded = nbands - 1; /* always combine the last two bands */
            }
        }

        if ( ( error = ivas_qmetadata_allocate_memory( hQMetaData, nbands_coded, 1, 0 ) ) != IVAS_ERR_OK )
        {
            int16_t no_dirs = 1;
#ifdef HODIRAC
            if ( sba_order > 1 && sba_total_brate > IVAS_256k )
            {
                no_dirs = 2;
            }
#endif

            if ( ( error = ivas_qmetadata_allocate_memory( hQMetaData, nbands_coded, no_dirs, 0 ) ) != IVAS_ERR_OK )
            {
                return error;
            }
#ifdef HODIRAC_FIX_BR_SWITCHING_DTX
            if ( sba_order > 1 && sba_total_brate > IVAS_256k )
            {
                int16_t dir, j;
                for ( dir = 0; dir < hQMetaData->no_directions; dir++ )
                {
                    for ( j = 0; j < nbands_coded; j++ )
                    {
                        for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ )
                        {
                            hQMetaData->q_direction[dir].band_data[j].energy_ratio_index[i] = 0;
                            hQMetaData->q_direction[dir].band_data[j].energy_ratio_index_mod[i] = 0;
                        }
                    }
                }
            }
#endif
        }

        if ( sba_total_brate <= IVAS_13k2 )
        {
@@ -452,11 +505,19 @@ ivas_error ivas_dirac_sba_config(
        }
        if ( sba_total_brate >= IVAS_96k )
        {
            if ( ( error = ivas_qmetadata_allocate_memory( hQMetaData, 6, 1, 0 ) ) != IVAS_ERR_OK )
            {
                int16_t no_dirs = 1;
#ifdef HODIRAC
                if ( sba_order > 1 && sba_total_brate > IVAS_256k )
                {
                    no_dirs = 2;
                }
#endif
                if ( ( error = ivas_qmetadata_allocate_memory( hQMetaData, 6, no_dirs, 0 ) ) != IVAS_ERR_OK )
                {
                    return error;
                }

            }
            nbands_wb = 4;
        }
        else
@@ -484,8 +545,17 @@ ivas_error ivas_dirac_sba_config(
            for ( i = 0; i < hQMetaData->no_directions; i++ )
            {
                hQMetaData->q_direction[i].cfg.search_effort = 1;
#ifdef HODIRAC
                if ( sba_order > 1 && sba_total_brate > IVAS_256k )
                {
                    hQMetaData->q_direction[i].cfg.start_band = 0;
                }
                else
#endif
                {
                    hQMetaData->q_direction[i].cfg.start_band = nbands_wb;
                }
            }

            *element_mode = IVAS_CPE_MDCT;
        }
@@ -787,6 +857,220 @@ void deindex_spherical_component(
    return;
}

#ifdef HODIRAC
void calculate_hodirac_sector_parameters(
    float RealBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* i: signal vector (L+1)^2 x N_bins, real part */
    float ImagBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* i: signal vector, imaginary part*/
    const int16_t N_bins,                                         /* i: number of bins */
    const float beta,                                             /* i: forgetting factor for average filtering */
    const int16_t *band_grouping,                                 /* i: indices of band groups */
    const int16_t N_bands,                                        /* i: number of bands (groups) */
    const int16_t enc_param_start_band,                           /* i: first band to process */
    float *azi,                                                   /* o: array of sector azimuth angles, flat */
    float *ele,                                                   /* o: array of sector elevation angles, flat */
    float *diff,                                                  /* o: array of sector diffuseness values, flat*/
    float *ene                                                    /* o: array of sector energy values, flat*/
)
{
    int16_t i_sec, i_bin, i_band;

    float p_real, p_imag, normI, energy, tmp_diff;

    float sec_I_vec_x[NUM_ANA_SECTORS];
    float sec_I_vec_y[NUM_ANA_SECTORS];
    float sec_I_vec_z[NUM_ANA_SECTORS];

    static int16_t firstrun_sector_params = 1;

    static float sec_I_vec_smth_x[NUM_ANA_SECTORS][IVAS_MAX_NUM_BANDS];
    static float sec_I_vec_smth_y[NUM_ANA_SECTORS][IVAS_MAX_NUM_BANDS];
    static float sec_I_vec_smth_z[NUM_ANA_SECTORS][IVAS_MAX_NUM_BANDS];

    static float energy_smth[NUM_ANA_SECTORS][IVAS_MAX_NUM_BANDS];
    static float azi_prev[NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS];
    static float ele_prev[NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS];

#ifdef DEBUGGING
    assert( N_bins <= DIRAC_NO_FB_BANDS_MAX );
#endif

    for ( i_sec = 0; i_sec < NUM_ANA_SECTORS; i_sec++ )
    {

        float *p_sec_I_vec_x = &sec_I_vec_x[i_sec];
        float *p_sec_I_vec_y = &sec_I_vec_y[i_sec];
        float *p_sec_I_vec_z = &sec_I_vec_z[i_sec];

        const float *p_c_weights = c_weights;

        float *p_ImagBuffer_0 = ImagBuffer[0];
        float *p_ImagBuffer_1 = ImagBuffer[1];
        float *p_ImagBuffer_2 = ImagBuffer[2];
        float *p_ImagBuffer_3 = ImagBuffer[3];
        float *p_ImagBuffer_4 = ImagBuffer[4];
        float *p_ImagBuffer_5 = ImagBuffer[5];
        float *p_ImagBuffer_6 = ImagBuffer[6];
        float *p_ImagBuffer_8 = ImagBuffer[8];

        float *p_RealBuffer_0 = RealBuffer[0];
        float *p_RealBuffer_1 = RealBuffer[1];
        float *p_RealBuffer_2 = RealBuffer[2];
        float *p_RealBuffer_3 = RealBuffer[3];
        float *p_RealBuffer_4 = RealBuffer[4];
        float *p_RealBuffer_5 = RealBuffer[5];
        float *p_RealBuffer_6 = RealBuffer[6];
        float *p_RealBuffer_8 = RealBuffer[8];

        for ( i_band = enc_param_start_band; i_band < N_bands; i_band++ )
        {
            float *p_azi = &azi[i_sec * N_bands + i_band];
            float *p_ele = &ele[i_sec * N_bands + i_band];
            float *p_ene = &ene[i_sec * N_bands + i_band];

            float *p_diff = &diff[i_sec * N_bands + i_band];
            float *p_azi_prev = &azi_prev[i_sec * N_bands + i_band];
            float *p_ele_prev = &ele_prev[i_sec * N_bands + i_band];

            float *p_energy_smth = &energy_smth[i_sec][i_band];
            float *p_sec_I_vec_smth_x = &sec_I_vec_smth_x[i_sec][i_band];
            float *p_sec_I_vec_smth_y = &sec_I_vec_smth_y[i_sec][i_band];
            float *p_sec_I_vec_smth_z = &sec_I_vec_smth_z[i_sec][i_band];

            *p_sec_I_vec_x = 0.f;
            *p_sec_I_vec_y = 0.f;
            *p_sec_I_vec_z = 0.f;
            energy = 0.f;

            if ( i_sec == 0 )
            {
                for ( i_bin = band_grouping[i_band]; i_bin < band_grouping[i_band + 1]; i_bin++ )
                {
                    float w = *( p_c_weights++ );
                    float sec_w_imag, sec_x_imag, sec_y_imag, sec_z_imag;
                    float sec_w_real, sec_x_real, sec_y_real, sec_z_real;

                    sec_w_imag = 1.772454f * *( p_ImagBuffer_0 ) + 1.772454f * *( p_ImagBuffer_1 );
                    sec_x_imag = 1.772454f * *( p_ImagBuffer_3++ ) + 1.023326f * *( p_ImagBuffer_4++ );
                    sec_y_imag = 0.590818f * *( p_ImagBuffer_0++ ) + 1.772454f * *( p_ImagBuffer_1++ ) - 0.590817f * *( p_ImagBuffer_6++ ) - 1.023326f * *( p_ImagBuffer_8++ );
                    sec_z_imag = 1.772454f * *( p_ImagBuffer_2++ ) + 1.023326f * *( p_ImagBuffer_5++ );

                    sec_w_real = 1.772454f * *( p_RealBuffer_0 ) + 1.772454f * *( p_RealBuffer_1 );
                    sec_x_real = 1.772454f * *( p_RealBuffer_3++ ) + 1.023326f * *( p_RealBuffer_4++ );
                    sec_y_real = 0.590818f * *( p_RealBuffer_0++ ) + 1.772454f * *( p_RealBuffer_1++ ) - 0.590817f * *( p_RealBuffer_6++ ) - 1.023326f * *( p_RealBuffer_8++ );
                    sec_z_real = 1.772454f * *( p_RealBuffer_2++ ) + 1.023326f * *( p_RealBuffer_5++ );

                    p_real = sec_w_real * w;
                    p_imag = sec_w_imag * w;

                    *p_sec_I_vec_x += p_real * sec_x_real + p_imag * sec_x_imag;
                    *p_sec_I_vec_y += p_real * sec_y_real + p_imag * sec_y_imag;
                    *p_sec_I_vec_z += p_real * sec_z_real + p_imag * sec_z_imag;

                    energy += 0.5f * ( p_real * p_real + p_imag * p_imag + sec_x_real * sec_x_real + sec_x_imag * sec_x_imag +
                                       sec_y_real * sec_y_real + sec_y_imag * sec_y_imag +
                                       sec_z_real * sec_z_real + sec_z_imag * sec_z_imag );
                }
            }
            else
            {
                for ( i_bin = band_grouping[i_band]; i_bin < band_grouping[i_band + 1]; i_bin++ )
                {
                    float w = *( p_c_weights++ );
                    float sec_w_imag, sec_x_imag, sec_y_imag, sec_z_imag;
                    float sec_w_real, sec_x_real, sec_y_real, sec_z_real;

                    sec_w_imag = 1.772454f * *(p_ImagBuffer_0) -1.772454f * *( p_ImagBuffer_1 );
                    sec_x_imag = 1.772454f * *( p_ImagBuffer_3++ ) - 1.023326f * *( p_ImagBuffer_4++ );
                    sec_y_imag = -0.590818f * *( p_ImagBuffer_0++ ) + 1.772454f * *( p_ImagBuffer_1++ ) + 0.590817f * *( p_ImagBuffer_6++ ) + 1.023326f * *( p_ImagBuffer_8++ );
                    sec_z_imag = 1.772454f * *( p_ImagBuffer_2++ ) - 1.023326f * *( p_ImagBuffer_5++ );

                    sec_w_real = 1.772454f * *(p_RealBuffer_0) -1.772454f * *( p_RealBuffer_1 );
                    sec_x_real = 1.772454f * *( p_RealBuffer_3++ ) - 1.023326f * *( p_RealBuffer_4++ );
                    sec_y_real = -0.590818f * *( p_RealBuffer_0++ ) + 1.772454f * *( p_RealBuffer_1++ ) + 0.590817f * *( p_RealBuffer_6++ ) + 1.023326f * *( p_RealBuffer_8++ );
                    sec_z_real = 1.772454f * *( p_RealBuffer_2++ ) - 1.023326f * *( p_RealBuffer_5++ );

                    p_real = sec_w_real * w;
                    p_imag = sec_w_imag * w;

                    *p_sec_I_vec_x += p_real * sec_x_real + p_imag * sec_x_imag;
                    *p_sec_I_vec_y += p_real * sec_y_real + p_imag * sec_y_imag;
                    *p_sec_I_vec_z += p_real * sec_z_real + p_imag * sec_z_imag;

                    energy += 0.5f * ( p_real * p_real + p_imag * p_imag + sec_x_real * sec_x_real + sec_x_imag * sec_x_imag +
                                       sec_y_real * sec_y_real + sec_y_imag * sec_y_imag +
                                       sec_z_real * sec_z_real + sec_z_imag * sec_z_imag );
                }
            }

            if ( firstrun_sector_params )
            {
                *p_sec_I_vec_smth_x = *p_sec_I_vec_x;
                *p_sec_I_vec_smth_y = *p_sec_I_vec_y;
                *p_sec_I_vec_smth_z = *p_sec_I_vec_z;
                *p_energy_smth = energy;
            }
            else
            {
                float w = ( 1.0f - beta );
                *p_sec_I_vec_smth_x = w * *p_sec_I_vec_x + beta * *p_sec_I_vec_smth_x;
                *p_sec_I_vec_smth_y = w * *p_sec_I_vec_y + beta * *p_sec_I_vec_smth_y;
                *p_sec_I_vec_smth_z = w * *p_sec_I_vec_z + beta * *p_sec_I_vec_smth_z;
                *p_energy_smth = w * energy + beta * *p_energy_smth;
            }

            if ( energy < EPSILON )
            {
                *p_azi = 0.f;
                *p_ele = 0.f;
                *p_ene = 0.f;
                *p_diff = 1.f;
            }
            else
            {
                normI = sqrtf( *p_sec_I_vec_smth_x * *p_sec_I_vec_smth_x +
                               *p_sec_I_vec_smth_y * *p_sec_I_vec_smth_y +
                               *p_sec_I_vec_smth_z * *p_sec_I_vec_smth_z );
                *p_azi = atan2f( *p_sec_I_vec_smth_y, *p_sec_I_vec_smth_x ) * _180_OVER_PI;
                *p_ele = asinf( *p_sec_I_vec_smth_z / ( normI + EPSILON ) ) * _180_OVER_PI;
                *p_ene = *p_energy_smth;
                *p_diff = 1.f - normI / ( *p_energy_smth + EPSILON );
            }

            tmp_diff = *p_diff;

            if ( tmp_diff < 0.0f )
            {
                *p_diff = 0.f;
            }
            if ( tmp_diff > 0.5f )
            {
                if ( firstrun_sector_params )
                {
                    *p_azi = 0.f;
                    *p_ele = 0.f;
                }
                else
                {
                    *p_azi = 2.f * ( 1.f - tmp_diff ) * *p_azi + ( 2.f * tmp_diff - 1.f ) * *p_azi_prev;
                    *p_ele = 2.f * ( 1.f - tmp_diff ) * *p_ele + ( 2.f * tmp_diff - 1.f ) * *p_ele_prev;
                }
            }
            else
            {
                *p_azi_prev = *p_azi;
                *p_ele_prev = *p_ele;
            }
#ifdef HODIRAC_CHECK_VALUE_RANGE
            assert( *p_azi >= -180.f && *p_azi <= 180.f );
            assert( *p_ele >= -90.f && *p_ele <= 90.f );
#endif
        } // i_band
    }     // i_sec

    firstrun_sector_params = 0;
}
#endif


/*-----------------------------------------------------------------------*
 * Local functions
+65 −3
Original line number Diff line number Diff line
@@ -106,6 +106,10 @@ ivas_error ivas_fb_set_cfg(
    const int16_t num_out_chans,   /* i  : number of FB output channels*/
    const int16_t active_w_mixing, /* i  : active_w_mixing flag        */
    const int32_t sampling_rate    /* i  : sampling rate               */
#ifdef HODIRAC
    ,
    const int16_t nchan_fb_in /* i: number of dirac analysis channels */
#endif
)
{
    IVAS_FB_CFG *pFb_cfg;
@@ -117,6 +121,9 @@ ivas_error ivas_fb_set_cfg(

    pFb_cfg->num_in_chans = num_in_chans;
    pFb_cfg->num_out_chans = num_out_chans;
#ifdef HODIRAC
    pFb_cfg->nchan_fb_in = nchan_fb_in;
#endif

    pFb_cfg->pcm_offset = 0; /* note: in SPAR decoder, this parameter is overwritten later */
    pFb_cfg->active_w_mixing = active_w_mixing;
@@ -219,7 +226,11 @@ ivas_error ivas_FB_mixer_open(
    }
    else if ( fb_cfg->active_w_mixing )
    {
#ifdef HODIRAC
        num_chs_alloc = max( fb_cfg->num_in_chans, fb_cfg->nchan_fb_in );
#else
        num_chs_alloc = fb_cfg->num_in_chans;
#endif
    }
    else
    {
@@ -259,7 +270,11 @@ ivas_error ivas_FB_mixer_open(
    }
    else
    {
#ifdef HODIRAC
        num_chs_alloc = max( fb_cfg->num_in_chans, fb_cfg->nchan_fb_in );
#else
        num_chs_alloc = fb_cfg->num_in_chans;
#endif
    }

    for ( i = 0; i < num_chs_alloc; i++ )
@@ -274,8 +289,11 @@ ivas_error ivas_FB_mixer_open(
    if ( ( fb_cfg->active_w_mixing != -1 ) && ( fb_cfg->num_out_chans > 0 ) )
    {
        float *pTemp_mem;

#ifdef HODIRAC
        if ( ( pTemp_mem = (float *) malloc( sizeof( float ) * fb_cfg->num_out_chans * max( fb_cfg->num_in_chans, fb_cfg->nchan_fb_in ) * IVAS_MAX_NUM_BANDS ) ) == NULL )
#else
        if ( ( pTemp_mem = (float *) malloc( sizeof( float ) * fb_cfg->num_out_chans * fb_cfg->num_in_chans * IVAS_MAX_NUM_BANDS ) ) == NULL )
#endif
        {
            return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for FB mixer" );
        }
@@ -386,7 +404,11 @@ void ivas_FB_mixer_close(
    }
    else if ( fb_cfg->active_w_mixing )
    {
#ifdef HODIRAC
        num_chs_alloc = max( fb_cfg->num_in_chans, fb_cfg->nchan_fb_in );
#else
        num_chs_alloc = fb_cfg->num_in_chans;
#endif
    }
    else
    {
@@ -419,8 +441,14 @@ void ivas_FB_mixer_close(
        }
        else
        {
#ifdef HODIRAC
            num_chs_alloc = max( fb_cfg->num_in_chans, fb_cfg->nchan_fb_in );
#else
            num_chs_alloc = fb_cfg->num_in_chans;
#endif
        }


        for ( i = 0; i < num_chs_alloc; i++ )
        {
            free( hFbMixer->ppFilterbank_prior_input[i] );
@@ -498,6 +526,10 @@ void ivas_fb_mixer_pcm_ingest(
    float pcm_in[][L_FRAME48k],    /* i  : input audio channels        */
    float **ppOut_pcm,             /* o  : output audio channels       */
    const int16_t frame_len        /* i  : frame length                */
#ifdef SPAR_TUNING
    ,
    const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH]
#endif
)
{
    int16_t i;
@@ -520,7 +552,15 @@ void ivas_fb_mixer_pcm_ingest(
    for ( i = 0; i < fb_cfg->num_in_chans; i++ )
    {
        mvr2r( &hFbMixer->ppFilterbank_prior_input[i][fb_cfg->prior_input_length - frame_len], ppOut_pcm[i], frame_len );
#ifdef HODIRAC
#ifdef SPAR_TUNING
        mvr2r( pcm_in[HOA_md_ind[i]], &ppOut_pcm[i][frame_len], frame_len );
#else
        mvr2r( pcm_in[HOA_keep_ind_spar[i]], &ppOut_pcm[i][frame_len], frame_len );
#endif
#else
        mvr2r( pcm_in[i], &ppOut_pcm[i][frame_len], frame_len );
#endif
    }

    for ( i = 0; i < num_chs_ingest; i++ )
@@ -542,11 +582,21 @@ void ivas_fb_mixer_update_prior_input(
    IVAS_FB_MIXER_HANDLE hFbMixer, /* i/o: FB mixer handle          */
    float *pcm_in[],               /* i  : input audio channels     */
    const int16_t length           /* i  : length of time slot      */
#ifdef HODIRAC
    ,
    const int16_t nchan_fb_in
#endif
)
{
    int16_t i;

    for ( i = 0; i < hFbMixer->fb_cfg->num_in_chans; i++ )
    for ( i = 0; i <
#ifdef HODIRAC
                 nchan_fb_in;
#else
                 hFbMixer->fb_cfg->num_in_chans;
#endif
          i++ )
    {
        mvr2r( &hFbMixer->ppFilterbank_prior_input[i][length], hFbMixer->ppFilterbank_prior_input[i], hFbMixer->fb_cfg->prior_input_length - length );
        mvr2r( pcm_in[i], &hFbMixer->ppFilterbank_prior_input[i][hFbMixer->fb_cfg->prior_input_length - length], length );
@@ -569,6 +619,10 @@ void ivas_fb_mixer_get_windowed_fr(
    float *frame_f_imag[],         /* o  : imag freq domain values            */
    const int16_t length,          /* i  : number of new samples in time slot */
    const int16_t mdft_len         /* i  : MDFT frame length                  */
#ifdef HODIRAC
    ,
    int16_t nchan_fb_in
#endif
)
{
    int16_t ch_idx, j, offset, rev_offset;
@@ -583,7 +637,14 @@ void ivas_fb_mixer_get_windowed_fr(
    rev_offset = (int16_t) ( 2 * mdft_len - hFbMixer->ana_window_offset );
    set_zero( fr_in_block, offset );

    for ( ch_idx = 0; ch_idx < hFbMixer->fb_cfg->num_in_chans; ch_idx++ )
    for ( ch_idx = 0; ch_idx <
#ifdef HODIRAC
                      nchan_fb_in
#else
                      hFbMixer->fb_cfg->num_in_chans
#endif
          ;
          ch_idx++ )
    {
        mvr2r( &hFbMixer->ppFilterbank_prior_input[ch_idx][offset + hFbMixer->fb_cfg->windowed_fr_offset], &fr_in_block[offset], n_old_samples - offset );
        mvr2r( pcm_in[ch_idx], &fr_in_block[n_old_samples], n_new_samples );
@@ -708,6 +769,7 @@ void ivas_fb_mixer_process(
                    {
                        int16_t start_offset = pFb->fb_consts.pFilterbank_bins_start_offset[i];
                        int16_t num_bins = pFb->fb_consts.pFilterbank_bins_per_band[i];

                        float mixer_const = hFbMixer->prior_mixer[ch][j][i];

                        pFilterbank_bin_to_band_re = pFb->fb_consts.ppFilterbank_FRs[0][i];
Loading