From bf675ce2f02420382c09937666d5fec169b16f93 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Wed, 5 Apr 2023 15:35:31 +0200 Subject: [PATCH 01/66] implement sector-based higher-order DirAC processing --- lib_com/ivas_cnst.h | 13 + lib_com/ivas_dirac_com.c | 258 ++++++++++++- lib_com/ivas_fb_mixer.c | 81 +++- lib_com/ivas_prot.h | 65 +++- lib_com/ivas_qmetadata_com.c | 37 +- lib_com/ivas_rom_com.c | 11 +- lib_com/ivas_rom_com.h | 21 ++ lib_com/ivas_spar_com.c | 4 + lib_com/ivas_stat_com.h | 3 + lib_com/options.h | 9 +- lib_dec/ivas_dec.c | 18 +- lib_dec/ivas_dirac_dec.c | 440 +++++++++++++++++----- lib_dec/ivas_dirac_output_synthesis_dec.c | 340 +++++++++++++++-- lib_dec/ivas_init_dec.c | 25 +- lib_dec/ivas_masa_dec.c | 16 +- lib_dec/ivas_qmetadata_dec.c | 44 ++- lib_dec/ivas_sba_dec.c | 18 +- lib_dec/ivas_spar_decoder.c | 14 +- lib_dec/ivas_spar_md_dec.c | 9 +- lib_enc/ivas_dirac_enc.c | 166 +++++++- lib_enc/ivas_enc.c | 6 +- lib_enc/ivas_enc_cov_handler.c | 13 + lib_enc/ivas_init_enc.c | 4 + lib_enc/ivas_ism_param_enc.c | 14 +- lib_enc/ivas_masa_enc.c | 7 +- lib_enc/ivas_mc_param_enc.c | 14 +- lib_enc/ivas_mcmasa_enc.c | 35 +- lib_enc/ivas_qmetadata_enc.c | 119 ++++-- lib_enc/ivas_sba_enc.c | 24 +- lib_enc/ivas_spar_encoder.c | 83 +++- lib_rend/lib_rend.c | 12 + 31 files changed, 1713 insertions(+), 210 deletions(-) mode change 100644 => 100755 lib_com/ivas_cnst.h mode change 100755 => 100644 lib_com/options.h mode change 100644 => 100755 lib_dec/ivas_dirac_output_synthesis_dec.c diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h old mode 100644 new mode 100755 index 8f0059d092..ce8389def9 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -903,7 +903,11 @@ typedef enum * DirAC Constants *----------------------------------------------------------------------------------*/ +#ifdef HODIRAC +#define DIRAC_MAX_ANA_CHANS 16 /* 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 */ @@ -917,6 +921,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 @@ -1179,7 +1188,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 4 +#else #define DIFF_DFRATIO_2BIT_LIMIT_IDX 3 +#endif #define DIFF_DFRATIO_1BIT_LIMIT_IDX 6 #define DIFF_EC_HUFF_BAND_LIMIT 8 #define DIFF_EC_HUFF_GR0_LIMIT 8 diff --git a/lib_com/ivas_dirac_com.c b/lib_com/ivas_dirac_com.c index 01f133a3b7..4c2c8c7d17 100644 --- a/lib_com/ivas_dirac_com.c +++ b/lib_com/ivas_dirac_com.c @@ -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 ) @@ -127,8 +129,19 @@ ivas_error ivas_dirac_config( if ( sba_mode == SBA_MODE_SPAR ) { +#ifdef HODIRAC_FAT_BANDS + hConfig->nbands = 6; +#else hConfig->nbands = IVAS_MAX_NUM_BANDS; +#endif + spar_dirac_split_band = min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND ); +#ifdef HODIRAC + if ( sba_order > 1 ) + { + spar_dirac_split_band = 0; + } +#endif } else { @@ -162,6 +175,16 @@ ivas_error ivas_dirac_config( { hConfig->enc_param_start_band = spar_dirac_split_band; } +#ifdef HODIRAC + if ( sba_order > 1 ) + { + 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 { @@ -174,7 +197,13 @@ 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, +#ifdef HODIRAC_FAT_BANDS + hConfig->nbands, +#else + IVAS_MAX_NUM_BANDS, +#endif + (int16_t) ( Fs * INV_CLDFB_BANDWIDTH + 0.5f ), dirac_to_spar_md_bands, hQMetaData->useLowerBandRes, hConfig->enc_param_start_band, hFbMdft ); } else @@ -351,12 +380,27 @@ ivas_error ivas_dirac_sba_config( else { hQMetaData->useLowerBandRes = 0; - nbands_coded = nbands - 1; /* always combine the last two bands */ +#ifdef HODIRAC + if ( !( sba_order > 1 ) ) +#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 ) { - return error; + int16_t no_dirs = 1; +#ifdef HODIRAC + if ( sba_order > 1 ) + { + no_dirs = 2; + } +#endif + + if ( ( error = ivas_qmetadata_allocate_memory( hQMetaData, nbands_coded, no_dirs, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } } if ( sba_total_brate <= IVAS_13k2 ) @@ -410,7 +454,12 @@ ivas_error ivas_dirac_sba_config( hQMetaData->metadata_max_bits = MAX16B; /* no limit */ } - hQMetaData->metadata_max_bits = (int16_t) ceilf( (float) hQMetaData->metadata_max_bits * hQMetaData->q_direction[0].cfg.nbands / 5 ); +#ifdef HODIRAC_FAT_BANDS + if ( sba_total_brate <= IVAS_128k ) +#endif + { + hQMetaData->metadata_max_bits = (int16_t) ceilf( (float) hQMetaData->metadata_max_bits * hQMetaData->q_direction[0].cfg.nbands / 5 ); + } hQMetaData->qmetadata_max_bit_req = QMETADATA_MAXBIT_REQ_SBA >> 1; return error; @@ -449,11 +498,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 ) { - return error; + int16_t no_dirs = 1; +#ifdef HODIRAC + if ( sba_order > 1 ) + { + no_dirs = 2; + } +#endif + if ( ( error = ivas_qmetadata_allocate_memory( hQMetaData, 6, no_dirs, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } } - nbands_wb = 4; } else @@ -481,7 +538,16 @@ ivas_error ivas_dirac_sba_config( for ( i = 0; i < hQMetaData->no_directions; i++ ) { hQMetaData->q_direction[i].cfg.search_effort = 1; - hQMetaData->q_direction[i].cfg.start_band = nbands_wb; +#ifdef HODIRAC + if ( sba_order > 1 ) + { + hQMetaData->q_direction[i].cfg.start_band = 0; + } + else +#endif + { + hQMetaData->q_direction[i].cfg.start_band = nbands_wb; + } } *element_mode = IVAS_CPE_MDCT; @@ -784,6 +850,180 @@ 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, theta, phi, tmp_diff; + float sec_w_real[NUM_ANA_SECTORS]; + float sec_x_real[NUM_ANA_SECTORS]; + float sec_y_real[NUM_ANA_SECTORS]; + float sec_z_real[NUM_ANA_SECTORS]; + float sec_w_imag[NUM_ANA_SECTORS]; + float sec_x_imag[NUM_ANA_SECTORS]; + float sec_y_imag[NUM_ANA_SECTORS]; + float sec_z_imag[NUM_ANA_SECTORS]; + + 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_w_real = &sec_w_real[i_sec]; + float *p_sec_x_real = &sec_x_real[i_sec]; + float *p_sec_y_real = &sec_y_real[i_sec]; + float *p_sec_z_real = &sec_z_real[i_sec]; + + float *p_sec_w_imag = &sec_w_imag[i_sec]; + float *p_sec_x_imag = &sec_x_imag[i_sec]; + float *p_sec_y_imag = &sec_y_imag[i_sec]; + float *p_sec_z_imag = &sec_z_imag[i_sec]; + + for ( i_band = enc_param_start_band; i_band < N_bands; i_band++ ) + { + sec_I_vec_x[i_sec] = 0.f; + sec_I_vec_y[i_sec] = 0.f; + sec_I_vec_z[i_sec] = 0.f; + energy = 0.f; + + for ( i_bin = band_grouping[i_band]; i_bin < band_grouping[i_band + 1]; i_bin++ ) + { + if ( i_sec == 0 ) + { + *p_sec_w_imag = 1.772454e+00f * ImagBuffer[0][i_bin] + 1.023327e+00f * 1.732050776481628f * ImagBuffer[1][i_bin]; + *p_sec_x_imag = 1.023327e+00f * 1.732050776481628f * ImagBuffer[3][i_bin] + 4.576456e-01f * 2.236068010330200f * ImagBuffer[4][i_bin]; + *p_sec_y_imag = 5.908180e-01f * ImagBuffer[0][i_bin] + 1.023327e+00f * 1.732050776481628f * ImagBuffer[1][i_bin] - 2.642218e-01f * 2.236068010330200f * ImagBuffer[6][i_bin] - 4.576456e-01f * 2.236068010330200f * ImagBuffer[8][i_bin]; + *p_sec_z_imag = 1.023327e+00f * 1.732050776481628f * ImagBuffer[2][i_bin] + 4.576456e-01f * 2.236068010330200f * ImagBuffer[5][i_bin]; + + *p_sec_w_real = 1.772454e+00f * RealBuffer[0][i_bin] + 1.023327e+00f * 1.732050776481628f * RealBuffer[1][i_bin]; + *p_sec_x_real = 1.023327e+00f * 1.732050776481628f * RealBuffer[3][i_bin] + 4.576456e-01f * 2.236068010330200f * RealBuffer[4][i_bin]; + *p_sec_y_real = 5.908180e-01f * RealBuffer[0][i_bin] + 1.023327e+00f * 1.732050776481628f * RealBuffer[1][i_bin] - 2.642218e-01f * 2.236068010330200f * RealBuffer[6][i_bin] - 4.576456e-01f * 2.236068010330200f * RealBuffer[8][i_bin]; + *p_sec_z_real = 1.023327e+00f * 1.732050776481628f * RealBuffer[2][i_bin] + 4.576456e-01f * 2.236068010330200f * RealBuffer[5][i_bin]; + } + else + { + *p_sec_w_imag = 1.772454e+00f * ImagBuffer[0][i_bin] - 1.023327e+00f * 1.732050776481628f * ImagBuffer[1][i_bin]; + *p_sec_x_imag = 1.023327e+00f * 1.732050776481628f * ImagBuffer[3][i_bin] - 4.576456e-01f * 2.236068010330200f * ImagBuffer[4][i_bin]; + *p_sec_y_imag = -5.908180e-01f * ImagBuffer[0][i_bin] + 1.023327e+00f * 1.732050776481628f * ImagBuffer[1][i_bin] + 2.642218e-01f * 2.236068010330200f * ImagBuffer[6][i_bin] + 4.576456e-01f * 2.236068010330200f * ImagBuffer[8][i_bin]; + *p_sec_z_imag = 1.023327e+00f * 1.732050776481628f * ImagBuffer[2][i_bin] - 4.576456e-01f * 2.236068010330200f * ImagBuffer[5][i_bin]; + + *p_sec_w_real = 1.772454e+00f * RealBuffer[0][i_bin] - 1.023327e+00f * 1.732050776481628f * RealBuffer[1][i_bin]; + *p_sec_x_real = 1.023327e+00f * 1.732050776481628f * RealBuffer[3][i_bin] - 4.576456e-01f * 2.236068010330200f * RealBuffer[4][i_bin]; + *p_sec_y_real = -5.908180e-01f * RealBuffer[0][i_bin] + 1.023327e+00f * 1.732050776481628f * RealBuffer[1][i_bin] + 2.642218e-01f * 2.236068010330200f * RealBuffer[6][i_bin] + 4.576456e-01f * 2.236068010330200f * RealBuffer[8][i_bin]; + *p_sec_z_real = 1.023327e+00f * 1.732050776481628f * RealBuffer[2][i_bin] - 4.576456e-01f * 2.236068010330200f * RealBuffer[5][i_bin]; + } + + // active intensity + p_real = *p_sec_w_real; + p_imag = *p_sec_w_imag; + // freq weighting + p_real *= c_weights[i_bin]; + p_imag *= c_weights[i_bin]; + sec_I_vec_x[i_sec] += p_real * *p_sec_x_real + p_imag * *p_sec_x_imag; + sec_I_vec_y[i_sec] += p_real * *p_sec_y_real + p_imag * *p_sec_y_imag; + sec_I_vec_z[i_sec] += p_real * *p_sec_z_real + p_imag * *p_sec_z_imag; + + energy += 0.5f * ( p_real * p_real + p_imag * p_imag + *p_sec_x_real * *p_sec_x_real + *p_sec_x_imag * *p_sec_x_imag + + *p_sec_y_real * *p_sec_y_real + *p_sec_y_imag * *p_sec_y_imag + + *p_sec_z_real * *p_sec_z_real + *p_sec_z_imag * *p_sec_z_imag ); + } + + // time-smoothing + if ( firstrun_sector_params ) + { + sec_I_vec_smth_x[i_sec][i_band] = sec_I_vec_x[i_sec]; + sec_I_vec_smth_y[i_sec][i_band] = sec_I_vec_y[i_sec]; + sec_I_vec_smth_z[i_sec][i_band] = sec_I_vec_z[i_sec]; + energy_smth[i_sec][i_band] = energy; + } + else + { + sec_I_vec_smth_x[i_sec][i_band] = ( 1.0f - beta ) * sec_I_vec_x[i_sec] + beta * sec_I_vec_smth_x[i_sec][i_band]; + sec_I_vec_smth_y[i_sec][i_band] = ( 1.0f - beta ) * sec_I_vec_y[i_sec] + beta * sec_I_vec_smth_y[i_sec][i_band]; + sec_I_vec_smth_z[i_sec][i_band] = ( 1.0f - beta ) * sec_I_vec_z[i_sec] + beta * sec_I_vec_smth_z[i_sec][i_band]; + energy_smth[i_sec][i_band] = ( 1.0f - beta ) * energy + beta * energy_smth[i_sec][i_band]; + } + + if ( energy < EPSILON ) + { + azi[i_sec * N_bands + i_band] = 0.f; + ele[i_sec * N_bands + i_band] = 0.f; + ene[i_sec * N_bands + i_band] = 0.f; + diff[i_sec * N_bands + i_band] = 1.f; + } + else + { + normI = sqrtf( sec_I_vec_smth_x[i_sec][i_band] * sec_I_vec_smth_x[i_sec][i_band] + + sec_I_vec_smth_y[i_sec][i_band] * sec_I_vec_smth_y[i_sec][i_band] + + sec_I_vec_smth_z[i_sec][i_band] * sec_I_vec_smth_z[i_sec][i_band] ); + theta = asinf( sec_I_vec_smth_z[i_sec][i_band] / ( normI + EPSILON ) ); + phi = atan2f( sec_I_vec_smth_y[i_sec][i_band], sec_I_vec_smth_x[i_sec][i_band] ); + azi[i_sec * N_bands + i_band] = phi * _180_OVER_PI; + ele[i_sec * N_bands + i_band] = theta * _180_OVER_PI; + ene[i_sec * N_bands + i_band] = energy_smth[i_sec][i_band]; + diff[i_sec * N_bands + i_band] = 1.f - normI / ( energy_smth[i_sec][i_band] + EPSILON ); + } + + // post + tmp_diff = diff[i_sec * N_bands + i_band]; + assert( tmp_diff < 1.0001f && tmp_diff > -0.0001f ); + if ( tmp_diff < 0.0f ) + { + diff[i_sec * N_bands + i_band] = 0.f; + } + if ( tmp_diff > 0.5f ) + { + if ( firstrun_sector_params ) + { + azi[i_sec * N_bands + i_band] = 0.f; + ele[i_sec * N_bands + i_band] = 0.f; + } + else + { + azi[i_sec * N_bands + i_band] = 2.f * ( 1.f - tmp_diff ) * azi[i_sec * N_bands + i_band] + ( 2.f * tmp_diff - 1.f ) * azi_prev[i_sec * N_bands + i_band]; + ele[i_sec * N_bands + i_band] = 2.f * ( 1.f - tmp_diff ) * ele[i_sec * N_bands + i_band] + ( 2.f * tmp_diff - 1.f ) * ele_prev[i_sec * N_bands + i_band]; + } + } + else + { + azi_prev[i_sec * N_bands + i_band] = azi[i_sec * N_bands + i_band]; + ele_prev[i_sec * N_bands + i_band] = ele[i_sec * N_bands + i_band]; + } + } // i_band + } // i_sec + + firstrun_sector_params = 0; +} +#endif + /*-----------------------------------------------------------------------* * Local functions diff --git a/lib_com/ivas_fb_mixer.c b/lib_com/ivas_fb_mixer.c index 3e0d68049a..0fc1c2fe04 100644 --- a/lib_com/ivas_fb_mixer.c +++ b/lib_com/ivas_fb_mixer.c @@ -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_dirac_ana /* 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_dirac_ana = nchan_dirac_ana; +#endif pFb_cfg->pcm_offset = 0; /* note: in SPAR decoder, this parameter is overwritten later */ pFb_cfg->active_w_mixing = active_w_mixing; @@ -215,11 +222,19 @@ 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_dirac_ana ); +#else num_chs_alloc = fb_cfg->num_in_chans; +#endif } else { +#ifdef HODIRAC + num_chs_alloc = max( fb_cfg->num_out_chans, fb_cfg->nchan_dirac_ana ); +#else num_chs_alloc = fb_cfg->num_out_chans; +#endif } for ( i = 0; i < num_chs_alloc; i++ ) @@ -251,7 +266,11 @@ ivas_error ivas_FB_mixer_open( } else { +#ifdef HODIRAC + num_chs_alloc = max( fb_cfg->num_in_chans, fb_cfg->nchan_dirac_ana ); +#else num_chs_alloc = fb_cfg->num_in_chans; +#endif } for ( i = 0; i < num_chs_alloc; i++ ) @@ -267,7 +286,13 @@ ivas_error ivas_FB_mixer_open( { float *pTemp_mem; - if ( ( pTemp_mem = (float *) malloc( sizeof( float ) * fb_cfg->num_out_chans * fb_cfg->num_in_chans * IVAS_MAX_NUM_BANDS ) ) == NULL ) + if ( ( pTemp_mem = (float *) malloc( sizeof( float ) * fb_cfg->num_out_chans * +#ifdef HODIRAC + max( fb_cfg->num_in_chans, fb_cfg->nchan_dirac_ana ) * +#else + fb_cfg->num_in_chans * +#endif + IVAS_MAX_NUM_BANDS ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for FB mixer" ); } @@ -378,11 +403,19 @@ 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_dirac_ana ); +#else num_chs_alloc = fb_cfg->num_in_chans; +#endif } else { +#ifdef HODIRAC + num_chs_alloc = max( fb_cfg->num_out_chans, fb_cfg->nchan_dirac_ana ); +#else num_chs_alloc = fb_cfg->num_out_chans; +#endif } if ( hFbMixer != NULL ) @@ -405,10 +438,17 @@ void ivas_FB_mixer_close( { num_chs_alloc = 0; } + else { +#ifdef HODIRAC + num_chs_alloc = max( fb_cfg->num_in_chans, fb_cfg->nchan_dirac_ana ); +#else num_chs_alloc = fb_cfg->num_in_chans; +#endif } + + for ( i = 0; i < num_chs_alloc; i++ ) { free( hFbMixer->ppFilterbank_prior_input[i] ); @@ -504,7 +544,11 @@ 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 + mvr2r( pcm_in[HOA_keep_ind[i]], &ppOut_pcm[i][frame_len], frame_len ); +#else mvr2r( pcm_in[i], &ppOut_pcm[i][frame_len], frame_len ); +#endif } for ( i = 0; i < num_chs_ingest; i++ ) @@ -530,7 +574,13 @@ void ivas_fb_mixer_update_prior_input( { int16_t i; - for ( i = 0; i < hFbMixer->fb_cfg->num_in_chans; i++ ) + for ( i = 0; i < +#ifdef HODIRAC + max( hFbMixer->fb_cfg->num_in_chans, hFbMixer->fb_cfg->nchan_dirac_ana ); +#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 ); @@ -553,6 +603,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 + , + const int16_t hodirac /* i: flag for skipping non-planar 3rd-order ambisonic channels*/ +#endif ) { int16_t ch_idx, j, offset, rev_offset; @@ -561,14 +615,32 @@ void ivas_fb_mixer_get_windowed_fr( float fr_in_block[L_FRAME48k * 2]; const float *win_ptr; +#ifdef HODIRAC + int16_t nchan_ana = max( hFbMixer->fb_cfg->nchan_dirac_ana, hFbMixer->fb_cfg->num_in_chans ); +#endif + n_old_samples = min( ( hFbMixer->fb_cfg->prior_input_length - hFbMixer->fb_cfg->windowed_fr_offset ), ( 2 * mdft_len ) ); n_new_samples = max( 0, 2 * length - n_old_samples ); offset = (int16_t) ( 2 * mdft_len - length - hFbMixer->ana_window_offset ); 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_ana +#else + hFbMixer->fb_cfg->num_in_chans +#endif + ; + ch_idx++ ) { +#ifdef HODIRAC + if ( hodirac && ch_idx >= 10 && ch_idx <= 14 ) + { + continue; + } +#endif + 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 ); win_ptr = hFbMixer->pAna_window; @@ -678,7 +750,7 @@ void ivas_fb_mixer_process( for ( j = 0; j < hFbMixer->fb_cfg->num_in_chans; j++ ) { - if ( in_out_mixer_map[ch][j] != 0 ) + if ( in_out_mixer_map[ch][j] !=0 ) { float filterbank_mixer_bins_re[L_FRAME48k]; float filterbank_mixer_bins_im[L_FRAME48k]; @@ -692,6 +764,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]; diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index c51321d667..ff98f08f9b 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -2961,6 +2961,10 @@ void mdct_read_IGF_bits( ivas_error ivas_qmetadata_enc_encode( BSTR_ENC_HANDLE hMetaData, /* i/o: metadata bitstream handle */ IVAS_QMETADATA *hQMetaData /* i/o: q_metadata handle */ +#ifdef HODIRAC + , + int16_t hodirac /* i: flag to indicate sector processing */ +#endif ); void reset_metadata_spatial( @@ -2987,6 +2991,10 @@ int16_t ivas_qmetadata_dec_decode( IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ uint16_t *bitstream, /* i : bitstream */ int16_t *index /* i/o: bitstream position */ +#ifdef HODIRAC + , + int16_t hodirac /* i: flag to indicate sector processing */ +#endif ); /*! r: number of bits read */ @@ -3006,6 +3014,9 @@ void ivas_qmetadata_to_dirac( MASA_DECODER_HANDLE hMasa, /* i : MASA decoder structure */ const int32_t ivas_total_brate, /* i : IVAS total bitrate */ const SBA_MODE sba_mode, /* i : SBA mode */ +#ifdef HODIRAC + const int16_t sba_analysis_order, /* i sba order*/ +#endif int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ ); @@ -3201,7 +3212,12 @@ void ivas_dirac_param_est_enc( float **pp_fr_real, float **pp_fr_imag, const int16_t input_frame, - const SBA_MODE sba_mode + const SBA_MODE sba_mode +#ifdef HODIRAC + , + const int16_t hodirac, + const int16_t nchan_dirac_ana +#endif ); @@ -3393,6 +3409,9 @@ void ivas_dirac_dec_read_BS( IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q metadata */ int16_t *nb_bits, /* o : number of bits read */ const SBA_MODE sba_mode, /* i : SBA mode */ +#ifdef HODIRAC + const int16_t sba_analysis_order, /* i sba order*/ +#endif int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ ); @@ -3510,6 +3529,10 @@ void ivas_dirac_dec_output_synthesis_process_slot( const IVAS_OUTPUT_SETUP hOutSetup, /* i : output setup structure */ const int16_t nchan_transport, /* i : number of transport channels */ const int16_t index_slot +#ifdef HODIRAC + , + const int16_t hodirac +#endif ); void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( @@ -3518,6 +3541,10 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */ const int16_t nchan_transport, /* i : number of transport channels */ const float *onset_filter +#ifdef HODIRAC + , + const int16_t hodirac /* i: flag for sector-based processing */ +#endif ); void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls( @@ -3567,6 +3594,10 @@ void ivas_dirac_dec_compute_directional_responses( const float *surCohRatio, const int16_t shd_rot_max_order, /* i : split-order rotation method */ const float *p_Rmat /* i : rotation matrix */ +#ifdef HODIRAC + , + const int16_t hodirac /* i : flag for sector based dirac processing */ +#endif ); void ivas_dirac_dec_get_frequency_axis( @@ -3574,6 +3605,22 @@ void ivas_dirac_dec_get_frequency_axis( const int32_t output_Fs, /* i : sampling frequency */ const int16_t num_freq_bands ); /* i : number of frequency bands */ +#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*/ +); +#endif + void ivas_param_mc_metadata_open( const MC_LS_SETUP mc_ls_setup, /* i : MC ls setup */ const int16_t lfe_index, /* i : channel index of LFE */ @@ -4602,6 +4649,10 @@ void masa_compensate_two_dir_energy_ratio_index( const int16_t ratio_index_2, /* i : Input ratio for direction 2 */ int16_t *ratio_index_mod1, /* o : Output modified ratio for direction 1 */ int16_t *ratio_index_mod2 /* o : Output modified ratio for direction 2 */ +#ifdef HODIRAC + , + int16_t hodirac /* i: flag to indicate sector processing */ +#endif ); void ivas_set_qmetadata_maxbit_req( @@ -4909,6 +4960,10 @@ void computeReferencePower_enc( const int16_t enc_param_start_band, /* i : first band to process */ const int16_t num_freq_bands, /* i : Number of frequency bands */ const SBA_MODE sba_mode /* i : SBA mode */ +#ifdef HODIRAC + , + int16_t nchan_ana /* i : no of analysis channels */ +#endif ); ivas_error ivas_mono_dmx_renderer_open( @@ -5033,6 +5088,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_Fs /* i : sampling rate */ +#ifdef HODIRAC + , + const int16_t nachan_dirac_ana /* i: number of dirac analysis channels */ +#endif ); ivas_error ivas_FB_mixer_open( @@ -5074,6 +5133,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 + , + const int16_t hodirac /* i: flag for skipping non-planar 3rd-order ambisonic channels*/ +#endif ); void ivas_fb_mixer_process( diff --git a/lib_com/ivas_qmetadata_com.c b/lib_com/ivas_qmetadata_com.c index 0f2491bad3..3081d409ff 100644 --- a/lib_com/ivas_qmetadata_com.c +++ b/lib_com/ivas_qmetadata_com.c @@ -508,24 +508,41 @@ void masa_compensate_two_dir_energy_ratio_index( const int16_t ratio_index_2, /* i : Input ratio for direction 2 */ int16_t *ratio_index_mod1, /* o : Output modified ratio for direction 1 */ int16_t *ratio_index_mod2 /* o : Output modified ratio for direction 2 */ +#ifdef HODIRAC + , + int16_t hodirac /* i: flag to indicate sector processing */ +#endif ) { - float ratio1, ratio2, ratioSum; + float ratio1, ratio2; +#ifndef HODIRAC + float ratioSum; +#endif ratio1 = 1.0f - diffuseness_reconstructions[ratio_index_1]; ratio2 = 1.0f - diffuseness_reconstructions[ratio_index_2]; - ratioSum = ratio1 + ratio2; - if ( ratio1 >= ratio2 ) - { - ratio2 = ratio2 / ratio1 * ratioSum; - ratio1 = ratioSum; - } - else +#ifdef HODIRAC + if ( !hodirac ) +#endif { - ratio1 = ratio1 / ratio2 * ratioSum; - ratio2 = ratioSum; +#ifdef HODIRAC + float ratioSum; +#endif + + ratioSum = ratio1 + ratio2; + if ( ratio1 >= ratio2 ) + { + ratio2 = ratio2 / ratio1 * ratioSum; + ratio1 = ratioSum; + } + else + { + ratio1 = ratio1 / ratio2 * ratioSum; + ratio2 = ratioSum; + } } + *ratio_index_mod1 = masa_sq( 1.0f - ratio1, diffuseness_thresholds, DIRAC_DIFFUSE_LEVELS ); *ratio_index_mod2 = masa_sq( 1.0f - ratio2, diffuseness_thresholds, DIRAC_DIFFUSE_LEVELS ); diff --git a/lib_com/ivas_rom_com.c b/lib_com/ivas_rom_com.c index f04538c479..e4e463f63b 100644 --- a/lib_com/ivas_rom_com.c +++ b/lib_com/ivas_rom_com.c @@ -893,7 +893,9 @@ const int16_t DirAC_block_grouping_5ms_MDFT[MAX_PARAM_SPATIAL_SUBFRAMES + 1] = 0, 1, 2, 3, 4 }; - +#ifdef HODIRAC +const float c_weights[DIRAC_NO_FB_BANDS_MAX] = { 9.962447e-02f, 9.627997e-01f, 9.926667e-01f, 9.981028e-01f, 9.996648e-01f, 1.000000e+00f, 9.997692e-01f, 9.992002e-01f, 9.983890e-01f, 9.973818e-01f, 9.962037e-01f, 9.948692e-01f, 9.933876e-01f, 9.917654e-01f, 9.900073e-01f, 9.881169e-01f, 9.860975e-01f, 9.839516e-01f, 9.816818e-01f, 9.792906e-01f, 9.767801e-01f, 9.741527e-01f, 9.714106e-01f, 9.685560e-01f, 9.655913e-01f, 9.625187e-01f, 9.593406e-01f, 9.560594e-01f, 9.526774e-01f, 9.491970e-01f, 9.456208e-01f, 9.419512e-01f, 9.381908e-01f, 9.343420e-01f, 9.304075e-01f, 9.263898e-01f, 9.222915e-01f, 9.181152e-01f, 9.138636e-01f, 9.095392e-01f, 9.051447e-01f, 9.006827e-01f, 8.961559e-01f, 8.915668e-01f, 8.869181e-01f, 8.822123e-01f, 8.774521e-01f, 8.726400e-01f, 8.677785e-01f, 8.628702e-01f, 8.579176e-01f, 8.529231e-01f, 8.478893e-01f, 8.428184e-01f, 8.377130e-01f, 8.325753e-01f, 8.274077e-01f, 8.222124e-01f, 8.169917e-01f, 8.117478e-01f, 8.064829e-01f, 8.011990e-01f, 7.958982e-01f, 7.905827e-01f, 7.852543e-01f, 7.799150e-01f, 7.745667e-01f, 7.692112e-01f, 7.638505e-01f, 7.584861e-01f, 7.531199e-01f, 7.477535e-01f, 7.423885e-01f, 7.370265e-01f, 7.316691e-01f, 7.263176e-01f, 7.209736e-01f, 7.156384e-01f, 7.103134e-01f, 7.049999e-01f, 6.996990e-01f, 6.944121e-01f, 6.891403e-01f, 6.838847e-01f, 6.786464e-01f, 6.734265e-01f, 6.682258e-01f, 6.630455e-01f, 6.578863e-01f, 6.527492e-01f, 6.476350e-01f, 6.425445e-01f, 6.374784e-01f, 6.324376e-01f, 6.274226e-01f, 6.224341e-01f, 6.174729e-01f, 6.125393e-01f, 6.076341e-01f, 6.027577e-01f, 5.979106e-01f, 5.930932e-01f, 5.883061e-01f, 5.835497e-01f, 5.788242e-01f, 5.741301e-01f, 5.694676e-01f, 5.648372e-01f, 5.602390e-01f, 5.556734e-01f, 5.511404e-01f, 5.466405e-01f, 5.421737e-01f, 5.377402e-01f, 5.333402e-01f, 5.289738e-01f, 5.246411e-01f, 5.203422e-01f, 5.160771e-01f, 5.118460e-01f, 5.076489e-01f, 5.034858e-01f, 4.993567e-01f, 4.952616e-01f, 4.912005e-01f, 4.871734e-01f, 4.831802e-01f, 4.792209e-01f, 4.752955e-01f, 4.714037e-01f, 4.675457e-01f, 4.637212e-01f, 4.599302e-01f, 4.561725e-01f, 4.524481e-01f, 4.487567e-01f, 4.450983e-01f, 4.414728e-01f, 4.378799e-01f, 4.343195e-01f, 4.307915e-01f, 4.272956e-01f, 4.238318e-01f, 4.203997e-01f, 4.169993e-01f, 4.136303e-01f, 4.102926e-01f, 4.069859e-01f, 4.037101e-01f, 4.004649e-01f, 3.972501e-01f, 3.940655e-01f, 3.909109e-01f, 3.877861e-01f, 3.846909e-01f, 3.816250e-01f, 3.785882e-01f, 3.755803e-01f, 3.726010e-01f, 3.696501e-01f, 3.667275e-01f, 3.638328e-01f, 3.609658e-01f, 3.581263e-01f, 3.553141e-01f, 3.525289e-01f, 3.497705e-01f, 3.470387e-01f, 3.443331e-01f, 3.416537e-01f, 3.390001e-01f, 3.363720e-01f, 3.337694e-01f, 3.311919e-01f, 3.286393e-01f, 3.261114e-01f, 3.236079e-01f, 3.211286e-01f, 3.186733e-01f, 3.162418e-01f, 3.138337e-01f, 3.114490e-01f, 3.090872e-01f, 3.067484e-01f, 3.044321e-01f, 3.021382e-01f, 2.998664e-01f, 2.976166e-01f, 2.953885e-01f, 2.931819e-01f, 2.909966e-01f, 2.888323e-01f, 2.866889e-01f, 2.845661e-01f, 2.824637e-01f, 2.803816e-01f, 2.783194e-01f, 2.762770e-01f, 2.742543e-01f, 2.722509e-01f, 2.702667e-01f, 2.683014e-01f, 2.663550e-01f, 2.644271e-01f, 2.625177e-01f, 2.606264e-01f, 2.587531e-01f, 2.568977e-01f, 2.550599e-01f, 2.532395e-01f, 2.514364e-01f, 2.496503e-01f, 2.478811e-01f, 2.461287e-01f, 2.443928e-01f, 2.426732e-01f, 2.409698e-01f, 2.392824e-01f, 2.376109e-01f, 2.359550e-01f, 2.343146e-01f, 2.326895e-01f, 2.310797e-01f, 2.294848e-01f, 2.279047e-01f, 2.263394e-01f, 2.247886e-01f, 2.232521e-01f, 2.217299e-01f, 2.202217e-01f, 2.187274e-01f, 2.172469e-01f, 2.157800e-01f, 2.143266e-01f, 2.128865e-01f, 2.114596e-01f, 2.100457e-01f, 2.086447e-01f, 2.072564e-01f, 2.058808e-01f }; +#endif /*----------------------------------------------------------------------* * SPAR ROM tables @@ -1471,9 +1473,16 @@ const int16_t dtx_pr_real_q_levels[3][3] = { { 9,9,9 },{ 9,7,9 },{ 9,5,7 } }; const int16_t pr_pr_idx_pairs[3][3][2] = { { { 0, 0 },{ 0, 0 },{ 0, 0 } },{ { 0, 0 },{ 0, 0 },{ 0, 0 } },{ { 0, 0 },{ 1, 3 },{ 0, 0 } } }; const int16_t pr_pd_idx_pairs[3][3][2] = { { { 1, 1 },{ 2, 2 },{ 3, 3 } },{ { 1, 1 },{ 3, 2 },{ 2, 0 } },{ { 2, 1 },{ 0, 0 },{ 0, 0 } } }; +#ifdef HODIRAC +const int16_t remix_order_set[1][DIRAC_MAX_ANA_CHANS] = { /* WYZX --> WYXZ... */ + { 0, 1, 3, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 } +}; +#else const int16_t remix_order_set[1][IVAS_SPAR_MAX_CH] = { /* WYZX --> WYXZ... */ { 0, 1, 3, 2, 4, 5, 6, 7} }; +#endif + const int16_t keep_planar[IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS] = { 1, 1, 1, 1 }; const int16_t HOA_keep_ind[IVAS_SPAR_MAX_CH] = {0, 1, 2, 3, 4, 8, 9, 15}; diff --git a/lib_com/ivas_rom_com.h b/lib_com/ivas_rom_com.h index a095c9e4b4..813525c11d 100644 --- a/lib_com/ivas_rom_com.h +++ b/lib_com/ivas_rom_com.h @@ -165,6 +165,23 @@ extern const int16_t DirAC_band_grouping_5[5 + 1]; extern const int16_t DirAC_block_grouping[MAX_PARAM_SPATIAL_SUBFRAMES + 1]; extern const int16_t DirAC_block_grouping_5ms_MDFT[MAX_PARAM_SPATIAL_SUBFRAMES + 1]; +#ifdef HODIRAC +extern const float c_weights[DIRAC_NO_FB_BANDS_MAX]; +#endif + +#ifdef HODIRAC +extern const float w_nm[NUM_ANA_SECTORS][9]; +extern const float x_nm[NUM_ANA_SECTORS][9]; +extern const float y_nm[NUM_ANA_SECTORS][9]; +extern const float z_nm[NUM_ANA_SECTORS][9]; +#else +#define NUM_ANA_SECTORS 1 +extern const float w_nm[NUM_ANA_SECTORS][9]; +extern const float x_nm[NUM_ANA_SECTORS][9]; +extern const float y_nm[NUM_ANA_SECTORS][9]; +extern const float z_nm[NUM_ANA_SECTORS][9]; +#endif + /*------------------------------------------------------------------------------------------* * SPAR ROM tables *------------------------------------------------------------------------------------------*/ @@ -176,7 +193,11 @@ extern const ivas_huff_models_t ivas_huff_pred_r_consts[TOTAL_PRED_QUANT_STRATS_ extern const ivas_huff_models_t ivas_huff_drct_r_consts[TOTAL_DRCT_QUANT_STRATS]; extern const ivas_huff_models_t ivas_huff_decd_r_consts[TOTAL_DECD_QUANT_STRATS]; extern const ivas_spar_br_table_t ivas_spar_br_table_consts[IVAS_SPAR_BR_TABLE_LEN]; +#ifdef HODIRAC +extern const int16_t remix_order_set[1][DIRAC_MAX_ANA_CHANS]; +#else extern const int16_t remix_order_set[1][IVAS_SPAR_MAX_CH]; +#endif extern const int16_t keep_planar[IVAS_SPAR_MAX_CH - FOA_CHANNELS]; extern const int16_t HOA_keep_ind[IVAS_SPAR_MAX_CH]; diff --git a/lib_com/ivas_spar_com.c b/lib_com/ivas_spar_com.c index cb6ff23fc0..b1484b97ed 100644 --- a/lib_com/ivas_spar_com.c +++ b/lib_com/ivas_spar_com.c @@ -1669,7 +1669,11 @@ void ivas_get_spar_md_from_dirac( remix_order = remix_order_set[hSpar_md_cfg->remix_unmix_order]; num_ch = ivas_sba_get_nchan_metadata( order ); +#ifdef HODIRAC + hoa2_ch = 6; +#else hoa2_ch = ivas_sba_get_nchan_metadata( SBA_HOA2_ORDER ); +#endif foa_ch = FOA_CHANNELS; diff_norm_order1 = 3.0f; diff_norm_order2 = 5.0f; diff --git a/lib_com/ivas_stat_com.h b/lib_com/ivas_stat_com.h index eedb65dbf3..6c9b468dba 100644 --- a/lib_com/ivas_stat_com.h +++ b/lib_com/ivas_stat_com.h @@ -709,6 +709,9 @@ typedef struct ivas_fb_mixer_cfg_t int16_t fb_latency; int16_t num_in_chans; int16_t num_out_chans; +#ifdef HODIRAC + int16_t nchan_dirac_ana; +#endif int16_t pcm_offset; int16_t fade_len; /* this sets the stride length; no delay is introduced */ int16_t prior_input_length; diff --git a/lib_com/options.h b/lib_com/options.h old mode 100755 new mode 100644 index 3c6e1aa960..564e65b5b6 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -112,7 +112,7 @@ /*#define TDREND_HRTF_TABLE_METHODS*/ /* Enable HRTF lookup from tables, for testing & evaluation. Supply file in table format to use. Note that a suitable HR filter lookup method should be written if the filters sample point grids are not in the formats. */ /*#define TDREND_STANDALONE*/ /* Used when renderer is built in standalone form, without IVAS encoding/decoding (see scripts/object_renderer_standalone). This is just here to ensure this is cleaned out by prepare_instrumentation.sh */ -/*#define DEBUG_SBA*/ /* debug DIRAC/SPAR in-out */ +/*#define DEBUG_SBA*/ /* debug DIRAC/SPAR in-out */ #ifdef DEBUG_SBA /*#define DEBUG_SBA_AUDIO_DUMP*/ /* SBA intermediate audio wav file dumping */ /*#define DEBUG_SBA_MD_DUMP*/ /* SBA metadata and variable file dumping */ @@ -148,7 +148,14 @@ #define DISCRETE_ISM_DTX_CNG /* FhG/VA: contribution 15 - DTX/CNG for (discrete) ISM */ #define NCHAN_ISM_PARAMETER /* VA: make 'nchan_ism' parameter part of st_ivas/hEncoderConfig */ +#define HODIRAC /* FhG: Sector-based HO-DirAC method for SBA at high bitrates */ + +#ifdef HODIRAC_DEBUG +//#define HODIRAC_WRITE_PARAMS +///#define HODIRAC_READ_PARAMS +#endif /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ + #endif diff --git a/lib_dec/ivas_dec.c b/lib_dec/ivas_dec.c index 0983aee6cb..45284ef3ce 100644 --- a/lib_dec/ivas_dec.c +++ b/lib_dec/ivas_dec.c @@ -279,7 +279,11 @@ ivas_error ivas_dec( if ( st_ivas->ivas_format == SBA_FORMAT ) { - ivas_dirac_dec_read_BS( ivas_total_brate, st, st_ivas->hDirAC, st_ivas->hQMetaData, &nb_bits_metadata[0], st_ivas->sba_mode, 0 ); + ivas_dirac_dec_read_BS( ivas_total_brate, st, st_ivas->hDirAC, st_ivas->hQMetaData, &nb_bits_metadata[0], st_ivas->sba_mode, +#ifdef HODIRAC + st_ivas->sba_analysis_order, +#endif + 0 ); } else { @@ -294,7 +298,17 @@ ivas_error ivas_dec( if ( st_ivas->hQMetaData != NULL ) { st = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0] : st_ivas->hCPE[0]->hCoreCoder[0]; - ivas_dirac_dec_read_BS( ivas_total_brate, st, st_ivas->hDirAC, st_ivas->hQMetaData, &nb_bits_metadata[0], st_ivas->sba_mode, st_ivas->hSpar->dirac_to_spar_md_bands ); + ivas_dirac_dec_read_BS( + ivas_total_brate, + st, + st_ivas->hDirAC, + st_ivas->hQMetaData, + &nb_bits_metadata[0], + st_ivas->sba_mode, +#ifdef HODIRAC + st_ivas->sba_analysis_order, +#endif + st_ivas->hSpar->dirac_to_spar_md_bands ); } if ( ( error = ivas_spar_dec( st_ivas, nb_bits_metadata ) ) != IVAS_ERR_OK ) diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index 4d3d1adb3c..06c44a716f 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -255,6 +255,50 @@ ivas_error ivas_dirac_dec_config( assert( hDirAC->nb_subframes <= MAX_PARAM_SPATIAL_SUBFRAMES ); } +#ifdef HODIRAC + if ( st_ivas->ivas_format == SBA_FORMAT && flag_config == DIRAC_RECONFIGURE && ( ( ivas_total_brate >= IVAS_256k && st_ivas->hDecoderConfig->last_ivas_total_brate < IVAS_256k ) || ( ivas_total_brate < IVAS_256k && st_ivas->hDecoderConfig->last_ivas_total_brate >= IVAS_256k ) ) ) + { + if ( st_ivas->hDecoderConfig->ivas_total_brate >= IVAS_256k && hDirAC->azimuth2 == NULL ) + { + hDirAC->azimuth2 = (int16_t **) malloc( hDirAC->dirac_md_buffer_length * sizeof( int16_t * ) ); + hDirAC->elevation2 = (int16_t **) malloc( hDirAC->dirac_md_buffer_length * sizeof( int16_t * ) ); + hDirAC->energy_ratio2 = (float **) malloc( hDirAC->dirac_md_buffer_length * sizeof( float * ) ); + hDirAC->spreadCoherence2 = (float **) malloc( hDirAC->dirac_md_buffer_length * sizeof( float * ) ); + for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) + { + hDirAC->azimuth2[i] = (int16_t *) malloc( hDirAC->num_freq_bands * sizeof( int16_t ) ); + set_s( hDirAC->azimuth2[i], 0, hDirAC->num_freq_bands ); + hDirAC->elevation2[i] = (int16_t *) malloc( hDirAC->num_freq_bands * sizeof( int16_t ) ); + set_s( hDirAC->elevation2[i], 0, hDirAC->num_freq_bands ); + hDirAC->energy_ratio2[i] = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ); + set_f( hDirAC->energy_ratio2[i], 0.0f, hDirAC->num_freq_bands ); + hDirAC->spreadCoherence2[i] = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ); + set_f( hDirAC->spreadCoherence2[i], 0.0f, hDirAC->num_freq_bands ); + } + } + else if ( st_ivas->hDecoderConfig->ivas_total_brate < IVAS_256k && hDirAC->azimuth2 != NULL ) + { + for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) + { + free( hDirAC->azimuth2[i] ); + free( hDirAC->elevation2[i] ); + free( hDirAC->energy_ratio2[i] ); + free( hDirAC->spreadCoherence2[i] ); + } + + free( hDirAC->azimuth2 ); + free( hDirAC->elevation2 ); + free( hDirAC->energy_ratio2 ); + free( hDirAC->spreadCoherence2 ); + + hDirAC->azimuth2 = NULL; + hDirAC->elevation2 = NULL; + hDirAC->energy_ratio2 = NULL; + hDirAC->spreadCoherence2 = NULL; + } + } +#endif + /* band config needed only for SPAR with FOA output */ if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_FOA && st_ivas->sba_mode == SBA_MODE_SPAR ) { @@ -929,7 +973,11 @@ ivas_error ivas_dirac_dec_config( set_f( hDirAC->surroundingCoherence[i], 0.0f, hDirAC->num_freq_bands ); } - if ( st_ivas->ivas_format == MASA_FORMAT ) + if ( st_ivas->ivas_format == MASA_FORMAT +#ifdef HODIRAC + || ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->hDecoderConfig->ivas_total_brate >= IVAS_256k ) +#endif + ) { if ( ( hDirAC->azimuth2 = (int16_t **) malloc( hDirAC->dirac_md_buffer_length * sizeof( int16_t * ) ) ) == NULL ) { @@ -990,7 +1038,7 @@ ivas_error ivas_dirac_dec_config( hDirAC->dithering_seed = DIRAC_DITH_SEED; st_ivas->hDirAC = hDirAC; - } + } /* flag_config == DIRAC_OPEN */ return error; } @@ -1311,11 +1359,19 @@ static ivas_error ivas_dirac_alloc_mem( hDirAC->h_output_synthesis_psd_state.direct_responses_square = hDirAC_mem->direct_responses_square; /* Target and smoothed nrg factors/gains */ +#ifdef HODIRAC + if ( ( hDirAC_mem->cy_cross_dir_smooth = (float *) malloc( sizeof( float ) * size * DIRAC_HO_NUMSECTORS ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); + } + set_zero( hDirAC_mem->cy_cross_dir_smooth, size * DIRAC_HO_NUMSECTORS ); +#else if ( ( hDirAC_mem->cy_cross_dir_smooth = (float *) malloc( sizeof( float ) * size ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); } set_zero( hDirAC_mem->cy_cross_dir_smooth, size ); +#endif if ( hDirAC->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD ) { @@ -1337,11 +1393,21 @@ static ivas_error ivas_dirac_alloc_mem( hDirAC->h_output_synthesis_psd_state.cy_auto_diff_smooth = hDirAC_mem->cy_auto_diff_smooth; /*Responses (gains/factors)*/ +#ifdef HODIRAC + if ( ( hDirAC_mem->direct_responses = (float *) malloc( sizeof( float ) * size * DIRAC_HO_NUMSECTORS) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); + } + set_zero( hDirAC_mem->direct_responses, size * DIRAC_HO_NUMSECTORS ); +#else if ( ( hDirAC_mem->direct_responses = (float *) malloc( sizeof( float ) * size ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); } set_zero( hDirAC_mem->direct_responses, size ); +#endif + + hDirAC->h_output_synthesis_psd_state.direct_responses = hDirAC_mem->direct_responses; /* Prototypes */ @@ -1378,6 +1444,14 @@ static ivas_error ivas_dirac_alloc_mem( /* Gains/power factors*/ hDirAC_mem->direct_power_factor = NULL; hDirAC_mem->diffuse_power_factor = NULL; +#ifdef HODIRAC + if ( ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) || + ( renderer_type != RENDERER_BINAURAL_PARAMETRIC && renderer_type != RENDERER_BINAURAL_PARAMETRIC_ROOM && renderer_type != RENDERER_STEREO_PARAMETRIC ) ) + { + hDirAC_mem->direct_power_factor = (float *) malloc( sizeof( float ) * num_freq_bands * DIRAC_HO_NUMSECTORS ); + hDirAC_mem->diffuse_power_factor = (float *) malloc( sizeof( float ) * num_freq_bands * DIRAC_HO_NUMSECTORS ); + } +#else if ( renderer_type != RENDERER_BINAURAL_PARAMETRIC && renderer_type != RENDERER_BINAURAL_PARAMETRIC_ROOM && renderer_type != RENDERER_STEREO_PARAMETRIC ) { if ( ( hDirAC_mem->direct_power_factor = (float *) malloc( sizeof( float ) * num_freq_bands ) ) == NULL ) @@ -1390,6 +1464,7 @@ static ivas_error ivas_dirac_alloc_mem( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); } } +#endif hDirAC->h_output_synthesis_psd_state.direct_power_factor = hDirAC_mem->direct_power_factor; hDirAC->h_output_synthesis_psd_state.diffuse_power_factor = hDirAC_mem->diffuse_power_factor; @@ -1512,7 +1587,10 @@ void ivas_dirac_dec_read_BS( IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata */ int16_t *nb_bits, /* o : number of bits read */ const SBA_MODE sba_mode, /* i : SBA mode */ - int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ +#ifdef HODIRAC + const int16_t sba_analysis_order, /* i sba order*/ +#endif + int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ ) { int16_t i, j, b, dir, orig_dirac_bands; @@ -1607,7 +1685,12 @@ void ivas_dirac_dec_read_BS( hQMetaData->q_direction[0].cfg.nblocks = MAX_PARAM_SPATIAL_SUBFRAMES; } - *nb_bits += ivas_qmetadata_dec_decode( hQMetaData, st->bit_stream, &( st->next_bit_pos ) ); + *nb_bits += ivas_qmetadata_dec_decode( hQMetaData, st->bit_stream, &( st->next_bit_pos ) +#ifdef HODIRAC + , + ( sba_analysis_order > 1 ) +#endif + ); } #ifdef DEBUGGING @@ -1674,7 +1757,13 @@ void ivas_dirac_dec_read_BS( if ( hDirAC != NULL ) { - ivas_qmetadata_to_dirac( hQMetaData, hDirAC, NULL, ivas_total_brate, sba_mode, dirac_to_spar_md_bands ); + ivas_qmetadata_to_dirac( hQMetaData, hDirAC, NULL, ivas_total_brate, sba_mode +#ifdef HODIRAC + , + sba_analysis_order +#endif + , + dirac_to_spar_md_bands ); } return; @@ -1693,7 +1782,10 @@ void ivas_qmetadata_to_dirac( MASA_DECODER_HANDLE hMasa, /* i : MASA decoder structure */ const int32_t ivas_total_brate, /* i : IVAS total bitrate */ const SBA_MODE sba_mode, /* i : SBA mode */ - int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ +#ifdef HODIRAC + const int16_t sba_analysis_order, /* i sba order*/ +#endif + int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ ) { int16_t block, band; @@ -1706,9 +1798,21 @@ void ivas_qmetadata_to_dirac( int16_t *band_mapping; int16_t *band_grouping; int16_t start_band; - int16_t nbands; - int16_t nblocks; + int16_t nbands = 0; + int16_t nblocks = 0; int16_t qBand_idx; +#ifdef HODIRAC + int16_t idx_sec = 0; + int16_t no_secs = 1; +#endif + +#ifdef HODIRAC_READ_PARAMS + static FILE *f_secparams = 0; + if ( f_secparams == 0 ) + { + f_secparams = fopen( "sector_params.txt", "r" ); + } +#endif q_direction = &( hQMetaData->q_direction[0] ); hDirAC->numSimultaneousDirections = hQMetaData->no_directions; @@ -1860,6 +1964,9 @@ void ivas_qmetadata_to_dirac( int16_t num_slots_in_subfr; int16_t tmp_write_idx_param_band; int16_t tmp_write_idx_band; +#ifdef HODIRAC + float diffuseness_sec = 0.f; +#endif num_slots_in_subfr = hDirAC->hConfig->dec_param_estim ? CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES : 1; /* ungroup */ @@ -1878,7 +1985,9 @@ void ivas_qmetadata_to_dirac( } else { +#ifndef HODIRAC assert( ( hQMetaData->no_directions == 1 ) && "Only 1 direction supported in SBA mode!" ); +#endif start_band = hDirAC->hConfig->enc_param_start_band; if ( sba_mode == SBA_MODE_SPAR ) @@ -1901,6 +2010,38 @@ void ivas_qmetadata_to_dirac( } } +#ifdef HODIRAC_READ_PARAMS + /* popular sector parameters from file */ + int16_t idx_f; + int idx_f_f, idx_sec_f; + float azi_secs[4][4][DIRAC_MAX_NBANDS], ele_secs[4][4][DIRAC_MAX_NBANDS], ene_secs[4][4][DIRAC_MAX_NBANDS], diff_secs[4][4][DIRAC_MAX_NBANDS], diff[4][DIRAC_MAX_NBANDS]; + assert( hDirAC->nb_subframes <= 4 ); + for ( block = 0; block < hDirAC->nb_subframes; block++ ) + { + int16_t block_qmetadata; + + block_qmetadata = min( block, nblocks - 1 ); + block_qmetadata = max( block_qmetadata, 0 ); + + assert( block_qmetadata == block ); // does this ever happen? + for ( idx_f = 0; idx_f < nbands; idx_f++ ) + { + for ( idx_sec = 0; idx_sec < 4; idx_sec++ ) + { + if ( 7 != fscanf( f_secparams, "%i %i %f %f %f %f %f\n", &idx_f_f, &idx_sec_f, &azi_secs[block_qmetadata][idx_sec][idx_f], &ele_secs[block_qmetadata][idx_sec][idx_f], &ene_secs[block_qmetadata][idx_sec][idx_f], &diff_secs[block_qmetadata][idx_sec][idx_f], &diff[block_qmetadata][idx_f] ) ) + { + printf( "ERROR reading parameters!\n" ); + exit( -1 ); + } + if ( azi_secs[block_qmetadata][idx_sec][idx_f] < 0.f ) + { + azi_secs[block_qmetadata][idx_sec][idx_f] += 360.f; + } + } + } + } +#endif + /* Low-Bands with no spatial data transmitted, analysis at decoder side */ for ( band = 0; band < start_band; band++ ) { @@ -1917,111 +2058,176 @@ void ivas_qmetadata_to_dirac( } /* Bands with spatial data transmitted */ - - for ( band = start_band; band < nbands; band++ ) +#ifdef HODIRAC + if ( sba_analysis_order > 1 ) { - band_start = band_grouping[band]; - band_end = band_grouping[band + 1]; - tmp_write_idx_param_band = hDirAC->dirac_bs_md_write_idx; - - if ( sba_mode == SBA_MODE_SPAR ) - { - qBand_idx = dirac_to_spar_md_bands[band] - start_band; - } - else - { - qBand_idx = band; - } - diffuseness = 1.0f - q_direction->band_data[qBand_idx].energy_ratio[0]; -#ifdef DEBUG_MODE_DIRAC - dbgwrite( &diffuseness, sizeof( float ), 1, 1, "./res/dirac_dec_diffuseness.dat" ); + no_secs = DIRAC_HO_NUMSECTORS; + } + for ( idx_sec = 0; idx_sec < no_secs; idx_sec++ ) #endif - diff_idx = q_direction->band_data[qBand_idx].energy_ratio_index[0]; - - for ( block = 0; block < hDirAC->nb_subframes; block++ ) + { + for ( band = start_band; band < nbands; band++ ) { - int16_t block_qmetadata; - - ts_start = hDirAC->block_grouping[block]; - ts_end = hDirAC->block_grouping[block + 1]; - - block_qmetadata = min( block, nblocks - 1 ); - block_qmetadata = max( block_qmetadata, 0 ); + band_start = band_grouping[band]; + band_end = band_grouping[band + 1]; + tmp_write_idx_param_band = hDirAC->dirac_bs_md_write_idx; - if ( q_direction->band_data[qBand_idx].azimuth[block_qmetadata] < 0.f ) + if ( sba_mode == SBA_MODE_SPAR ) + { + qBand_idx = dirac_to_spar_md_bands[band] - start_band; + } + else { - q_direction->band_data[qBand_idx].azimuth[block_qmetadata] += 360.f; + qBand_idx = band; } - azimuth = q_direction->band_data[qBand_idx].azimuth[block_qmetadata]; - elevation = q_direction->band_data[qBand_idx].elevation[block_qmetadata]; + diffuseness = 1.0f - q_direction->band_data[qBand_idx].energy_ratio[0]; +#ifdef DEBUG_MODE_DIRAC + dbgwrite( &diffuseness, sizeof( float ), 1, 1, "./res/dirac_dec_diffuseness.dat" ); +#endif + diff_idx = q_direction->band_data[qBand_idx].energy_ratio_index[0]; - for ( b = band_start; b < band_end; b++ ) + for ( block = 0; block < hDirAC->nb_subframes; block++ ) { - tmp_write_idx_band = tmp_write_idx_param_band; - azi = (int16_t) ( azimuth + rand_triangular_signed( seed_ptr ) * dirac_dithering_azi_scale[diff_idx] + 0.5f ); - ele = (int16_t) ( elevation + rand_triangular_signed( seed_ptr ) * dirac_dithering_ele_scale[diff_idx] + 0.5f ); - /* limit the elevation to [-90, 90] */ - ele = min( 90, ele ); - ele = max( -90, ele ); + int16_t block_qmetadata; + + ts_start = hDirAC->block_grouping[block]; + ts_end = hDirAC->block_grouping[block + 1]; + + block_qmetadata = min( block, nblocks - 1 ); + block_qmetadata = max( block_qmetadata, 0 ); - if ( ivas_total_brate > IVAS_SID_5k2 && q_direction->coherence_band_data != NULL ) +#ifdef HODIRAC + if ( q_direction[idx_sec].band_data[qBand_idx].azimuth[block_qmetadata] < 0.f ) { - hDirAC->spreadCoherence[tmp_write_idx_band][b] = q_direction->coherence_band_data[qBand_idx].spread_coherence[block] / 255.0f; + q_direction[idx_sec].band_data[qBand_idx].azimuth[block_qmetadata] += 360.f; } - else +#else + if ( q_direction->band_data[qBand_idx].azimuth[block_qmetadata] < 0.f ) { - hDirAC->spreadCoherence[tmp_write_idx_band][b] = 0.0f; + q_direction->band_data[qBand_idx].azimuth[block_qmetadata] += 360.f; } +#endif - if ( ivas_total_brate > IVAS_SID_5k2 && q_direction->coherence_band_data != NULL ) + +#ifdef HODIRAC + if ( hMasa == NULL && sba_analysis_order > 1 ) { - hDirAC->surroundingCoherence[tmp_write_idx_band][b] = hQMetaData->surcoh_band_data[qBand_idx].surround_coherence[0] / 255.0f; + azimuth = q_direction[idx_sec].band_data[qBand_idx].azimuth[block_qmetadata]; + elevation = q_direction[idx_sec].band_data[qBand_idx].elevation[block_qmetadata]; + diffuseness = 1.f - q_direction[0].band_data[qBand_idx].energy_ratio[block_qmetadata]; + diffuseness_sec = q_direction[1].band_data[qBand_idx].energy_ratio[block_qmetadata]; + assert( diffuseness_sec < 1.0001f && diffuseness_sec > -0.0001f ); } else +#endif { - hDirAC->surroundingCoherence[tmp_write_idx_band][b] = 0.0f; + azimuth = q_direction->band_data[qBand_idx].azimuth[block_qmetadata]; + elevation = q_direction->band_data[qBand_idx].elevation[block_qmetadata]; } - hDirAC->energy_ratio1[tmp_write_idx_band][b] = q_direction->band_data[qBand_idx].energy_ratio[0]; +#ifdef HODIRAC_READ_PARAMS + int16_t tmp_i; + tmp_i = 0; + ( idx_sec == 0 ) ? ( tmp_i = 1 ) : ( ( idx_sec == 1 ) ? ( tmp_i = 2 ) : ( tmp_i = -99 ) ); + assert( tmp_i < 3 ); + azimuth = azi_secs[block_qmetadata][tmp_i][qBand_idx]; + elevation = ele_secs[block_qmetadata][tmp_i][qBand_idx]; + diffuseness = diff[block_qmetadata][qBand_idx]; - if ( hDirAC->hConfig->dec_param_estim == FALSE ) + if ( azimuth < 0.f ) { - hDirAC->elevation[tmp_write_idx_band][b] = ele; - hDirAC->azimuth[tmp_write_idx_band][b] = azi; - hDirAC->diffuseness_vector[tmp_write_idx_band][b] = diffuseness; + azimuth += 360.f; } - else + diffuseness_sec = 1.f - ( diff_secs[block_qmetadata][1][qBand_idx] / ( diff_secs[block_qmetadata][1][qBand_idx] + diff_secs[block_qmetadata][2][qBand_idx] + EPSILON ) ); +#endif + + for ( b = band_start; b < band_end; b++ ) { - for ( ts = ts_start; ts < ts_end; ts++ ) + tmp_write_idx_band = tmp_write_idx_param_band; + +#ifdef HODIRAC + if ( sba_analysis_order > 1 ) { - hDirAC->elevation[tmp_write_idx_band][b] = ele; - hDirAC->azimuth[tmp_write_idx_band][b] = azi; - hDirAC->diffuseness_vector[tmp_write_idx_band][b] = diffuseness; - tmp_write_idx_band = ( tmp_write_idx_band + 1 ) % hDirAC->dirac_md_buffer_length; + azi = (int16_t) ( azimuth + 0.5f ); + ele = (int16_t) ( elevation + 0.5f ); + } + else +#endif + { + azi = (int16_t) ( azimuth + rand_triangular_signed( seed_ptr ) * dirac_dithering_azi_scale[diff_idx] + 0.5f ); + ele = (int16_t) ( elevation + rand_triangular_signed( seed_ptr ) * dirac_dithering_ele_scale[diff_idx] + 0.5f ); + /* limit the elevation to [-90, 90] */ + ele = min( 90, ele ); + ele = max( -90, ele ); } - } - } /* for ( band = ...) */ - tmp_write_idx_param_band = ( tmp_write_idx_param_band + num_slots_in_subfr ) % hDirAC->dirac_md_buffer_length; - } /* for ( block =...) */ - } -#ifdef DEBUG_MODE_DIRAC - { - for ( block = 0; block < hDirAC->nb_subframes; block++ ) - { - int16_t block_qmetadata; + if ( ivas_total_brate > IVAS_SID_5k2 && q_direction->coherence_band_data != NULL ) + { + hDirAC->spreadCoherence[tmp_write_idx_band][b] = q_direction->coherence_band_data[qBand_idx].spread_coherence[block] / 255.0f; + } + else + { + hDirAC->spreadCoherence[tmp_write_idx_band][b] = 0.0f; + } - block_qmetadata = min( block, nblocks - 1 ); - block_qmetadata = max( block_qmetadata, 0 ); - for ( band = start_band; band < nbands; band++ ) - { - dbgwrite( &q_direction->band_data[band].azimuth[block_qmetadata], sizeof( float ), 1, 1, "./res/dirac_dec_azi.dat" ); - dbgwrite( &q_direction->band_data[band].elevation[block_qmetadata], sizeof( float ), 1, 1, "./res/dirac_dec_ele.dat" ); - } - } - } + if ( ivas_total_brate > IVAS_SID_5k2 && q_direction->coherence_band_data != NULL ) + { + hDirAC->surroundingCoherence[tmp_write_idx_band][b] = hQMetaData->surcoh_band_data[qBand_idx].surround_coherence[0] / 255.0f; + } + else + { + hDirAC->surroundingCoherence[tmp_write_idx_band][b] = 0.0f; + } + + hDirAC->energy_ratio1[tmp_write_idx_band][b] = q_direction->band_data[qBand_idx].energy_ratio[0]; + + if ( hDirAC->hConfig->dec_param_estim == FALSE ) + { + + hDirAC->diffuseness_vector[tmp_write_idx_band][b] = diffuseness; + +#ifdef HODIRAC + if ( sba_analysis_order > 1 ) + { + if ( idx_sec == 0 ) + { + hDirAC->elevation[tmp_write_idx_band][b] = ele; + hDirAC->azimuth[tmp_write_idx_band][b] = azi; + hDirAC->energy_ratio1[tmp_write_idx_band][b] = 0.f; // not in use + } + else + { + assert( idx_sec == 1 ); + hDirAC->elevation2[tmp_write_idx_band][b] = ele; + hDirAC->azimuth2[tmp_write_idx_band][b] = azi; + hDirAC->energy_ratio2[tmp_write_idx_band][b] = 1.f - diffuseness_sec; + } + } + else #endif + { + hDirAC->elevation[tmp_write_idx_band][b] = ele; + hDirAC->azimuth[tmp_write_idx_band][b] = azi; + } + } + else + { + for ( ts = ts_start; ts < ts_end; ts++ ) + { + hDirAC->elevation[tmp_write_idx_band][b] = ele; + hDirAC->azimuth[tmp_write_idx_band][b] = azi; + hDirAC->diffuseness_vector[tmp_write_idx_band][b] = diffuseness; + tmp_write_idx_band = ( tmp_write_idx_band + 1 ) % hDirAC->dirac_md_buffer_length; + } + } + } + + tmp_write_idx_param_band = ( tmp_write_idx_param_band + num_slots_in_subfr ) % hDirAC->dirac_md_buffer_length; + + } /* for ( block =...) */ + } /* for ( band = ...) */ + } /* for ( idx_sec = ...)*/ /* Bands not transmitted -> zeroed*/ for ( b = band_grouping[band]; b < hDirAC->num_freq_bands; b++ ) @@ -2057,6 +2263,38 @@ void ivas_qmetadata_to_dirac( } } +#ifdef HODIRAC_WRITE_PARAMS + if ( hMasa == NULL && sba_analysis_order > 1 ) + { + static FILE *f_params = 0; + int16_t tmp_write_idx_band = 0; + + if ( f_params == 0 ) + f_params = fopen( "param_dec", "w" ); + + tmp_write_idx_band = hDirAC->dirac_bs_md_write_idx; + for ( block = 0; block < hDirAC->nb_subframes; block++ ) + { + int16_t block_qmetadata; + + block_qmetadata = min( block, nblocks - 1 ); + block_qmetadata = max( block_qmetadata, 0 ); + + for ( band = 0; band < hDirAC->num_freq_bands; band++ ) + { + fprintf( f_params, "%d ", hDirAC->azimuth[tmp_write_idx_band][band] ); + fprintf( f_params, "%d ", hDirAC->elevation[tmp_write_idx_band][band] ); + fprintf( f_params, "%f ", hDirAC->diffuseness_vector[tmp_write_idx_band][band] ); + + fprintf( f_params, "%d ", hDirAC->azimuth2[tmp_write_idx_band][band] ); + fprintf( f_params, "%d ", hDirAC->elevation2[tmp_write_idx_band][band] ); + fprintf( f_params, "%f\n", 1.0f - hDirAC->energy_ratio2[tmp_write_idx_band][band] ); + } + tmp_write_idx_band = ( tmp_write_idx_band + 1 ) % hDirAC->dirac_md_buffer_length; + } + } +#endif + /* update buffer write index */ if ( hDirAC->hConfig->dec_param_estim == FALSE ) { @@ -2249,7 +2487,12 @@ void ivas_dirac_dec( subframe_idx, surCohRatio, st_ivas->hHeadTrackData->shd_rot_max_order, - p_Rmat ); + p_Rmat +#ifdef HODIRAC + , + st_ivas->sba_analysis_order > 1 +#endif + ); } else { @@ -2260,7 +2503,12 @@ void ivas_dirac_dec( subframe_idx, surCohRatio, 0, - 0 ); + 0 +#ifdef HODIRAC + , + st_ivas->sba_analysis_order > 1 +#endif + ); } } @@ -2556,7 +2804,13 @@ void ivas_dirac_dec( st_ivas->hVBAPdata, hDirAC->hOutSetup, nchan_transport, - index_slot ); + index_slot +#ifdef HODIRAC + , + st_ivas->sba_analysis_order > 1 +#endif + + ); } else { @@ -2567,7 +2821,12 @@ void ivas_dirac_dec( st_ivas->hVBAPdata, hDirAC->hOutSetup, nchan_transport, - index_slot ); + index_slot +#ifdef HODIRAC + , + st_ivas->sba_analysis_order > 1 +#endif + ); } if ( hDirAC->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD ) @@ -2592,7 +2851,12 @@ void ivas_dirac_dec( Cldfb_ImagBuffer, hDirAC, nchan_transport, - p_onset_filter ); + p_onset_filter +#ifdef HODIRAC + , + st_ivas->sba_analysis_order > 1 +#endif + ); } else { diff --git a/lib_dec/ivas_dirac_output_synthesis_dec.c b/lib_dec/ivas_dirac_output_synthesis_dec.c old mode 100644 new mode 100755 index 3541bc5cfe..3b84837bd6 --- a/lib_dec/ivas_dirac_output_synthesis_dec.c +++ b/lib_dec/ivas_dirac_output_synthesis_dec.c @@ -167,10 +167,17 @@ ivas_error ivas_dirac_dec_output_synthesis_open( } /* target PSD buffers */ +#ifdef HODIRAC + if ( ( dirac_output_synthesis_state->cy_cross_dir_smooth_prev = (float *) malloc( hDirAC->num_freq_bands * hDirAC->num_outputs_dir * DIRAC_HO_NUMSECTORS * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis\n" ) ); + } +#else if ( ( dirac_output_synthesis_state->cy_cross_dir_smooth_prev = (float *) malloc( hDirAC->num_freq_bands * hDirAC->num_outputs_dir * sizeof( float ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis\n" ) ); } +#endif if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) { @@ -204,10 +211,17 @@ ivas_error ivas_dirac_dec_output_synthesis_open( } /* direct and diffuse gain buffers */ +#ifdef HODIRAC + if ( ( dirac_output_synthesis_state->gains_dir_prev = (float *) malloc( hDirAC->num_freq_bands * hDirAC->num_outputs_dir * DIRAC_HO_NUMSECTORS * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis\n" ) ); + } +#else if ( ( dirac_output_synthesis_state->gains_dir_prev = (float *) malloc( hDirAC->num_freq_bands * hDirAC->num_outputs_dir * sizeof( float ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis\n" ) ); } +#endif if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) { @@ -364,7 +378,11 @@ void ivas_dirac_dec_output_synthesis_init( set_zero( h_dirac_output_synthesis_state->cy_auto_dir_smooth_prev, hDirAC->num_freq_bands * hDirAC->num_outputs_dir ); } +#ifdef HODIRAC + set_zero( h_dirac_output_synthesis_state->cy_cross_dir_smooth_prev, hDirAC->num_freq_bands * hDirAC->num_outputs_dir * DIRAC_HO_NUMSECTORS ); +#else set_zero( h_dirac_output_synthesis_state->cy_cross_dir_smooth_prev, hDirAC->num_freq_bands * hDirAC->num_outputs_dir ); +#endif if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) { set_zero( h_dirac_output_synthesis_state->cy_auto_diff_smooth_prev, h_dirac_output_synthesis_params->max_band_decorr * hDirAC->num_outputs_diff ); @@ -382,8 +400,11 @@ void ivas_dirac_dec_output_synthesis_init( { set_zero( h_dirac_output_synthesis_state->proto_power_smooth_prev, hDirAC->num_freq_bands * hDirAC->num_protos_dir ); } - +#ifdef HODIRAC + set_zero( h_dirac_output_synthesis_state->gains_dir_prev, hDirAC->num_freq_bands * hDirAC->num_outputs_dir * DIRAC_HO_NUMSECTORS ); +#else set_zero( h_dirac_output_synthesis_state->gains_dir_prev, hDirAC->num_freq_bands * hDirAC->num_outputs_dir ); +#endif if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) { @@ -518,7 +539,12 @@ void ivas_dirac_dec_output_synthesis_process_slot( const VBAP_HANDLE hVBAPdata, /* i : VBAP structure */ const IVAS_OUTPUT_SETUP hOutSetup, /* i : output setup structure */ const int16_t nchan_transport, /* i : number of transport channels*/ - const int16_t index_slot ) + const int16_t index_slot +#ifdef HODIRAC + , + const int16_t hodirac +#endif +) { int16_t num_freq_bands, num_channels_dir; int16_t num_freq_bands_diff, num_channels_diff; @@ -550,7 +576,52 @@ void ivas_dirac_dec_output_synthesis_process_slot( num_channels_dir = hOutSetup.nchan_out_woLFE; } - if ( hDirAC->hConfig->dec_param_estim == TRUE ) +#ifdef HODIRAC + if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD && hodirac ) + { + ivas_dirac_dec_compute_directional_responses( hDirAC, + hVBAPdata, + NULL, + index_slot, + index_slot / MAX_PARAM_SPATIAL_SUBFRAMES, NULL, + 2, + p_Rmat, + hodirac ); + } + if ( hDirAC->hConfig->dec_param_estim == FALSE && hodirac ) + { + if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) + { + v_multc( hDirAC->energy_ratio1[hDirAC->dirac_read_idx], -1.f, aux_buf, num_freq_bands ); + v_addc( aux_buf, 1.f, aux_buf, num_freq_bands ); + mvr2r( hDirAC->energy_ratio1[hDirAC->dirac_read_idx], + h_dirac_output_synthesis_state->direct_power_factor, + num_freq_bands ); + mvr2r( aux_buf, + h_dirac_output_synthesis_state->diffuse_power_factor, + num_freq_bands ); + + v_multc( hDirAC->energy_ratio2[hDirAC->dirac_read_idx], -1.f, aux_buf, num_freq_bands ); + v_addc( aux_buf, 1.f, aux_buf, num_freq_bands ); + mvr2r( hDirAC->energy_ratio2[hDirAC->dirac_read_idx], + &h_dirac_output_synthesis_state->direct_power_factor[hDirAC->num_freq_bands], + num_freq_bands ); + mvr2r( aux_buf, + &h_dirac_output_synthesis_state->diffuse_power_factor[hDirAC->num_freq_bands], + num_freq_bands ); + } + else + { + ivas_dirac_dec_compute_gain_factors( num_freq_bands, + hDirAC->diffuseness_vector[hDirAC->dirac_read_idx], + h_dirac_output_synthesis_params->max_band_decorr, + h_dirac_output_synthesis_state->direct_power_factor, + h_dirac_output_synthesis_state->diffuse_power_factor ); + } + } + else // ( hDirAC->hConfig->dec_param_estim == TRUE ) +#endif + if ( hDirAC->hConfig->dec_param_estim == TRUE ) { /* compute direct responses */ ivas_dirac_dec_compute_directional_responses( hDirAC, @@ -559,7 +630,12 @@ void ivas_dirac_dec_output_synthesis_process_slot( index_slot, index_slot / MAX_PARAM_SPATIAL_SUBFRAMES, NULL, 2, - p_Rmat ); + p_Rmat +#ifdef HODIRAC + , + 0 +#endif + ); if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) { @@ -696,7 +772,12 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals */ DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */ const int16_t nchan_transport, /* i : number of transport channels */ - const float *onset_filter ) + const float *onset_filter +#ifdef HODIRAC + , + const int16_t hodirac /* i: flag for sector-based processing */ +#endif +) { int16_t buf_idx, ch_idx, i, l; int16_t num_freq_bands, num_freq_bands_diff; @@ -716,6 +797,12 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( int16_t nchan_transport_foa; int16_t ch_idx_diff; +#ifdef HODIRAC + float aux_buf[CLDFB_NO_CHANNELS_MAX]; + float ratio[DIRAC_HO_NUMSECTORS * CLDFB_NO_CHANNELS_MAX]; + const float *diffuseness; +#endif + /* collect some often used parameters */ h_dirac_output_synthesis_params = hDirAC->h_output_synthesis_psd_params; h_dirac_output_synthesis_state = hDirAC->h_output_synthesis_psd_state; @@ -728,11 +815,75 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( num_channels_diff = hDirAC->num_outputs_diff; nchan_transport_foa = min( 4, nchan_transport ); +#ifdef HODIRAC + diffuseness = hDirAC->diffuseness_vector[hDirAC->dirac_read_idx]; +#endif + /*-----------------------------------------------------------------* * comput target Gains *-----------------------------------------------------------------*/ - if ( hDirAC->hConfig->dec_param_estim == FALSE ) +#ifdef HODIRAC + if ( hodirac ) + { + assert( hDirAC->hConfig->dec_param_estim == FALSE ); + /*Direct gain*/ + for ( ch_idx = 0; ch_idx < nchan_transport_foa; ch_idx++ ) + { + v_multc( diffuseness, + 1.f, + &h_dirac_output_synthesis_state.cy_cross_dir_smooth[ch_idx * num_freq_bands], + num_freq_bands ); + v_multc( &h_dirac_output_synthesis_state.cy_cross_dir_smooth[ch_idx * num_freq_bands], + h_dirac_output_synthesis_params.diffuse_compensation_factor_decorr - 1.f, + &h_dirac_output_synthesis_state.cy_cross_dir_smooth[ch_idx * num_freq_bands], + num_freq_bands_diff ); + v_multc( &h_dirac_output_synthesis_state.cy_cross_dir_smooth[ch_idx * num_freq_bands + num_freq_bands_diff], + h_dirac_output_synthesis_params.diffuse_compensation_factor - 1.f, + &h_dirac_output_synthesis_state.cy_cross_dir_smooth[ch_idx * num_freq_bands + num_freq_bands_diff], + num_freq_bands - num_freq_bands_diff ); + + for ( l = 0; l < num_freq_bands; l++ ) + { + h_dirac_output_synthesis_state.cy_cross_dir_smooth[ch_idx * num_freq_bands + l] = sqrtf( 1.f + h_dirac_output_synthesis_state.cy_cross_dir_smooth[ch_idx * num_freq_bands + l] ); + } + } + + /*Directional gain*/ + for ( ch_idx = nchan_transport_foa; ch_idx < num_channels_dir; ch_idx++ ) + { + for ( l = 0; l < num_freq_bands; l++ ) + { + aux_buf[l] = 1.f - diffuseness[l]; + ratio[l] = 1.f - h_dirac_output_synthesis_state.direct_power_factor[hDirAC->num_freq_bands + l]; + ratio[l + num_freq_bands] = 1.f - ratio[l]; + } + + v_mult( aux_buf, ratio, ratio, num_freq_bands ); + v_mult( aux_buf, &ratio[num_freq_bands], &ratio[num_freq_bands], num_freq_bands ); + + v_mult( ratio, + &h_dirac_output_synthesis_state.direct_responses[ch_idx * num_freq_bands], + &h_dirac_output_synthesis_state.cy_cross_dir_smooth[ch_idx * num_freq_bands], + num_freq_bands ); + v_mult( &ratio[num_freq_bands], + &h_dirac_output_synthesis_state.direct_responses[ch_idx * num_freq_bands + num_freq_bands * num_channels_dir], + &h_dirac_output_synthesis_state.cy_cross_dir_smooth[ch_idx * num_freq_bands + num_freq_bands * num_channels_dir], + num_freq_bands ); + } + + /*Diffuse gain*/ + for ( ch_idx = nchan_transport_foa; ch_idx < num_channels_diff; ch_idx++ ) + { + v_multc( h_dirac_output_synthesis_state.diffuse_power_factor, + hDirAC->diffuse_response_function[ch_idx], + &h_dirac_output_synthesis_state.cy_auto_diff_smooth[ch_idx * num_freq_bands_diff], + num_freq_bands_diff ); + } + } + else +#endif + if ( hDirAC->hConfig->dec_param_estim == FALSE ) { /*Direct gain*/ for ( ch_idx = 0; ch_idx < nchan_transport_foa; ch_idx++ ) @@ -805,6 +956,39 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( *( p_gains_dir++ ) = g2; } } +#ifdef HODIRAC + if ( hodirac ) + { + // wkr: additional gains for second sector, hard coded to two sectors + p_cy_cross_dir_smooth = h_dirac_output_synthesis_state.cy_cross_dir_smooth + num_freq_bands * num_channels_dir; + p_gains_dir = h_dirac_output_synthesis_state.cy_cross_dir_smooth_prev + num_freq_bands * num_channels_dir; + + /*Direct gains*/ + for ( ch_idx = 0; ch_idx < nchan_transport_foa; ch_idx++ ) + { + for ( l = 0; l < num_freq_bands; l++ ) + { + p_cy_cross_dir_smooth++; + p_gains_dir++; + } + } + + /*Directional gains*/ + for ( ch_idx = nchan_transport_foa; ch_idx < num_channels_dir; ch_idx++ ) + { + for ( l = 0; l < num_freq_bands; l++ ) + { + g1 = 0.3679f + onset_filter[l] * ( 0.1175f - 0.3679f ); + g2 = ( 1.f - g1 ) * *( p_gains_dir ); + g2 += g1 * ( *( p_cy_cross_dir_smooth++ ) ); + g2 = max( g2, -DIRAC_GAIN_LIMIT ); + g2 = min( g2, DIRAC_GAIN_LIMIT ); + *( p_gains_dir++ ) = g2; + } + } + } +#endif + /*Diffuse gains*/ p_cy_auto_diff_smooth = h_dirac_output_synthesis_state.cy_auto_diff_smooth + nchan_transport_foa * num_freq_bands_diff; @@ -848,26 +1032,76 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( /*Directional stream*/ for ( ch_idx = nchan_transport_foa; ch_idx < num_channels_dir; ch_idx++ ) { - p_proto = h_dirac_output_synthesis_state.proto_direct_buffer_f + - buf_idx * 2 * num_freq_bands * num_protos_dir + - proto_direct_index[ch_idx] * 2 * num_freq_bands; - if ( proto_direct_index[ch_idx] == 0 ) +#ifdef HODIRAC + if ( hodirac ) { - for ( l = 0; l < num_freq_bands; l++ ) + if ( proto_direct_index[ch_idx] == 0 ) + { + float *p_proto2; + float gs1, gs2; + p_proto = h_dirac_output_synthesis_state.proto_direct_buffer_f + + buf_idx * 2 * num_freq_bands * num_protos_dir + + proto_direct_index[0] * 2 * num_freq_bands; + p_proto2 = h_dirac_output_synthesis_state.proto_direct_buffer_f + + buf_idx * 2 * num_freq_bands * num_protos_dir + + proto_direct_index[1] * 2 * num_freq_bands; + for ( l = 0; l < num_freq_bands; l++ ) + { + gs1 = g1 * ( *( p_gains_dir ) ) + g2 * ( *( p_gains_dir_prev ) ); + gs2 = g1 * ( *( p_gains_dir + num_freq_bands * num_channels_dir ) ) + g2 * ( *( p_gains_dir_prev + num_freq_bands * num_channels_dir ) ); + p_gains_dir++; + p_gains_dir_prev++; + + output_real[l * num_channels_dir + ch_idx] = 0.5f * gs1 * ( 1.772454e+00f * ( *p_proto ) + 1.023327e+00f * ( *p_proto2 ) ) + // s1 + 0.5f * gs2 * ( 1.772454e+00f * ( *p_proto ) - 1.023327e+00f * ( *p_proto2 ) ); // s2 + p_proto++; + p_proto2++; + output_imag[l * num_channels_dir + ch_idx] = 0.5f * gs1 * ( 1.772454e+00f * ( *p_proto ) + 1.023327e+00f * ( *p_proto2 ) ) + + 0.5f * gs2 * ( 1.772454e+00f * ( *p_proto ) - 1.023327e+00f * ( *p_proto2 ) ); + p_proto++; + p_proto2++; + } + } + else { - g = g1 * ( *( p_gains_dir++ ) ) + g2 * ( *( p_gains_dir_prev++ ) ); - output_real[l * num_channels_dir + ch_idx] = g * ( *( p_proto++ ) ); - output_imag[l * num_channels_dir + ch_idx] = g * ( *( p_proto++ ) ); + p_proto = h_dirac_output_synthesis_state.proto_direct_buffer_f + + buf_idx * 2 * num_freq_bands * num_protos_dir + + proto_direct_index[ch_idx] * 2 * num_freq_bands; + for ( l = 0; l < num_freq_bands; l++ ) + { + p_gains_dir++; + p_gains_dir_prev++; + + + output_real[l * num_channels_dir + ch_idx] = *( p_proto++ ); + output_imag[l * num_channels_dir + ch_idx] = *( p_proto++ ); + } } } else +#endif { - for ( l = 0; l < num_freq_bands; l++ ) + p_proto = h_dirac_output_synthesis_state.proto_direct_buffer_f + + buf_idx * 2 * num_freq_bands * num_protos_dir + + proto_direct_index[ch_idx] * 2 * num_freq_bands; + if ( proto_direct_index[ch_idx] == 0 ) + { + for ( l = 0; l < num_freq_bands; l++ ) + { + g = g1 * ( *( p_gains_dir++ ) ) + g2 * ( *( p_gains_dir_prev++ ) ); + output_real[l * num_channels_dir + ch_idx] = g * ( *( p_proto++ ) ); + output_imag[l * num_channels_dir + ch_idx] = g * ( *( p_proto++ ) ); + } + } + else { - p_gains_dir++; - p_gains_dir_prev++; - output_real[l * num_channels_dir + ch_idx] = *( p_proto++ ); - output_imag[l * num_channels_dir + ch_idx] = *( p_proto++ ); + for ( l = 0; l < num_freq_bands; l++ ) + { + p_gains_dir++; + p_gains_dir_prev++; + output_real[l * num_channels_dir + ch_idx] = *( p_proto++ ); + output_imag[l * num_channels_dir + ch_idx] = *( p_proto++ ); + } } } } @@ -945,16 +1179,24 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( } } - /*-----------------------------------------------------------------* - * update buffers - *-----------------------------------------------------------------*/ +/*-----------------------------------------------------------------* + * update buffers + *-----------------------------------------------------------------*/ - /* store estimates for next synthesis block */ +/* store estimates for next synthesis block */ +#ifdef HODIRAC + mvr2r( h_dirac_output_synthesis_state.cy_cross_dir_smooth_prev, h_dirac_output_synthesis_state.gains_dir_prev, num_freq_bands * num_channels_dir * DIRAC_HO_NUMSECTORS ); +#else mvr2r( h_dirac_output_synthesis_state.cy_cross_dir_smooth_prev, h_dirac_output_synthesis_state.gains_dir_prev, num_freq_bands * num_channels_dir ); +#endif mvr2r( h_dirac_output_synthesis_state.cy_auto_diff_smooth_prev, h_dirac_output_synthesis_state.gains_diff_prev, num_freq_bands_diff * num_channels_diff ); - /* reset values */ +/* reset values */ +#ifdef HODIRAC + set_zero( h_dirac_output_synthesis_state.cy_cross_dir_smooth, num_freq_bands * num_channels_dir * DIRAC_HO_NUMSECTORS ); +#else set_zero( h_dirac_output_synthesis_state.cy_cross_dir_smooth, num_freq_bands * num_channels_dir ); +#endif set_zero( h_dirac_output_synthesis_state.cy_auto_diff_smooth, num_freq_bands_diff * num_channels_diff ); return; @@ -1489,6 +1731,10 @@ void ivas_dirac_dec_compute_directional_responses( const float *surCohRatio, const int16_t shd_rot_max_order, /* i : split-order rotation method */ const float *p_Rmat /* i : rotation matrix */ +#ifdef HODIRAC + , + const int16_t hodirac /* i : flag for sector based dirac processing */ +#endif ) { int16_t k, l; @@ -1522,8 +1768,20 @@ void ivas_dirac_dec_compute_directional_responses( elevation = hDirAC->elevation[hDirAC->dirac_read_idx]; if ( hDirAC->numSimultaneousDirections == 2 ) { - azimuth2 = hDirAC->azimuth2[direction_idx]; - elevation2 = hDirAC->elevation2[direction_idx]; +#ifdef HODIRAC + if ( hodirac ) + { + assert( DIRAC_HO_NUMSECTORS == 2 ); + assert( direction_idx >= 0 ); + azimuth2 = hDirAC->azimuth2[hDirAC->dirac_read_idx]; + elevation2 = hDirAC->elevation2[hDirAC->dirac_read_idx]; + } + else +#endif + { + azimuth2 = hDirAC->azimuth2[direction_idx]; + elevation2 = hDirAC->elevation2[direction_idx]; + } } codingBand = -1; @@ -1557,6 +1815,35 @@ void ivas_dirac_dec_compute_directional_responses( /* HOA3 PANNING */ if ( hDirAC->panningConf == DIRAC_PANNING_HOA3 ) { +#ifdef HODIRAC + set_f( direct_response_hoa, 1.0f, MAX_OUTPUT_CHANNELS ); + set_f( direct_response_dir2, 1.0f, MAX_OUTPUT_CHANNELS ); + if ( p_Rmat != 0 ) + { + ivas_dirac_dec_get_response_split_order( azimuth[k], elevation[k], direct_response_hoa, shd_rot_max_order, p_Rmat ); + if ( hodirac ) + { + ivas_dirac_dec_get_response_split_order( azimuth2[k], elevation2[k], direct_response_dir2, shd_rot_max_order, p_Rmat ); + } + } + else + { + ivas_dirac_dec_get_response( azimuth[k], elevation[k], direct_response_hoa, hDirAC->hOutSetup.ambisonics_order ); + if ( hodirac ) + { + ivas_dirac_dec_get_response( azimuth2[k], elevation2[k], direct_response_dir2, hDirAC->hOutSetup.ambisonics_order ); + } + } + + if ( hMasa == NULL && hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) + { + mvr2r_inc( direct_response_hoa, 1, &hDirAC->h_output_synthesis_psd_state.direct_responses[k], hDirAC->num_freq_bands, num_channels_dir ); + if ( hodirac ) + { + mvr2r_inc( direct_response_dir2, 1, &hDirAC->h_output_synthesis_psd_state.direct_responses[k + hDirAC->num_freq_bands * num_channels_dir], hDirAC->num_freq_bands, num_channels_dir ); + } + } +#else set_f( direct_response_hoa, 1.0f, MAX_OUTPUT_CHANNELS ); if ( p_Rmat != 0 ) { @@ -1571,6 +1858,7 @@ void ivas_dirac_dec_compute_directional_responses( { mvr2r_inc( direct_response_hoa, 1, &hDirAC->h_output_synthesis_psd_state.direct_responses[k], hDirAC->num_freq_bands, num_channels_dir ); } +#endif else if ( ( ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) && ( hMasa != NULL ) ) || hDirAC->synthesisConf == DIRAC_SYNTHESIS_PSD_SHD || hDirAC->synthesisConf == DIRAC_SYNTHESIS_MONO ) { diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index 5c19eca256..1af6ec4142 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -956,7 +956,21 @@ ivas_error ivas_init_decoder( } } - if ( ( error = ivas_dirac_sba_config( st_ivas->hQMetaData, &st_ivas->nchan_transport, &st_ivas->nSCE, &st_ivas->nCPE, &st_ivas->element_mode_init, ivas_total_brate, st_ivas->sba_analysis_order, st_ivas->sba_mode, IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_dirac_sba_config( + st_ivas->hQMetaData, + &st_ivas->nchan_transport, + &st_ivas->nSCE, + &st_ivas->nCPE, + &st_ivas->element_mode_init, + ivas_total_brate, + st_ivas->sba_analysis_order, + st_ivas->sba_mode, +#ifdef HODIRAC + st_ivas->sba_analysis_order > 1 ? IVAS_MAX_NUM_BANDS : ( IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ) +#else + IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND +#endif + ) ) != IVAS_ERR_OK ) { return error; } @@ -979,6 +993,15 @@ ivas_error ivas_init_decoder( int16_t band_grouping[IVAS_MAX_NUM_BANDS + 1]; st_ivas->hSpar->enc_param_start_band = min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND ); +#ifdef HODIRAC + if ( st_ivas->sba_analysis_order > 1 ) + { + st_ivas->hSpar->enc_param_start_band = 0; + + set_c( (int8_t *) st_ivas->hQMetaData->twoDirBands, (int8_t) 1, st_ivas->hQMetaData->q_direction[0].cfg.nbands ); + st_ivas->hQMetaData->numTwoDirBands = (uint8_t) st_ivas->hQMetaData->q_direction[0].cfg.nbands; + } +#endif ivas_dirac_config_bands( band_grouping, IVAS_MAX_NUM_BANDS, (int16_t) ( st_ivas->hDecoderConfig->output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ), st_ivas->hSpar->dirac_to_spar_md_bands, st_ivas->hQMetaData->useLowerBandRes, st_ivas->hSpar->enc_param_start_band, 0 ); diff --git a/lib_dec/ivas_masa_dec.c b/lib_dec/ivas_masa_dec.c index 9e2540e968..80c61385b2 100644 --- a/lib_dec/ivas_masa_dec.c +++ b/lib_dec/ivas_masa_dec.c @@ -196,7 +196,12 @@ ivas_error ivas_masa_decode( /* Remove already read bits from the bit budget */ hQMetaData->metadata_max_bits -= *nb_bits_read; - *nb_bits_read += ivas_qmetadata_dec_decode( hQMetaData, st->bit_stream, &st->next_bit_pos ); + *nb_bits_read += ivas_qmetadata_dec_decode( hQMetaData, st->bit_stream, &st->next_bit_pos +#ifdef HODIRAC + , + 0 +#endif + ); /* Get direction decoding quality. EC 1 and 2 are handled by the default value. */ if ( hQMetaData->ec_flag == 2 ) @@ -279,7 +284,14 @@ ivas_error ivas_masa_decode( } if ( st_ivas->hDirAC != NULL ) { - ivas_qmetadata_to_dirac( hQMetaData, st_ivas->hDirAC, hMasa, ivas_total_brate, SBA_MODE_NONE, 0 ); + ivas_qmetadata_to_dirac( hQMetaData, st_ivas->hDirAC, hMasa, ivas_total_brate, + SBA_MODE_NONE +#ifdef HODIRAC + , + st_ivas->sba_analysis_order +#endif + , + 0 ); } st->next_bit_pos = next_bit_pos_orig; diff --git a/lib_dec/ivas_qmetadata_dec.c b/lib_dec/ivas_qmetadata_dec.c index 9c6597fdcb..fe1412d7c1 100644 --- a/lib_dec/ivas_qmetadata_dec.c +++ b/lib_dec/ivas_qmetadata_dec.c @@ -106,6 +106,10 @@ int16_t ivas_qmetadata_dec_decode( IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: hQMetaData handle */ uint16_t *bitstream, /* i : bitstream */ int16_t *index /* i/o: bitstream position */ +#ifdef HODIRAC + , + int16_t hodirac /* i: flag to indicate sector processing */ +#endif ) { int16_t d, b, m; @@ -224,14 +228,37 @@ int16_t ivas_qmetadata_dec_decode( diffRatio = diffuseness_reconstructions[hQMetaData->q_direction[0].band_data[b].energy_ratio_index[0]]; dfRatio_qsteps = 1 << dfRatio_bits[dir2band]; - dfRatio = usdequant( hQMetaData->q_direction[1].band_data[dir2band].energy_ratio_index[0], 0.5f, 0.5f / ( dfRatio_qsteps - 1 ) ); +#ifdef HODIRAC + /* already encoded as total and ratios in HODIRAC*/ + if ( hodirac ) + { + dfRatio = usdequant( hQMetaData->q_direction[1].band_data[dir2band].energy_ratio_index[0], 0.0f, 1.f / ( dfRatio_qsteps - 1 ) ); + dir1ratio = 1.f - diffRatio; + dir2ratio = dfRatio; + } + else +#endif + { + dfRatio = usdequant( hQMetaData->q_direction[1].band_data[dir2band].energy_ratio_index[0], 0.5f, 0.5f / ( dfRatio_qsteps - 1 ) ); + + dir1ratio = dfRatio * ( 1.0f - diffRatio ); + dir2ratio = ( 1.0f - diffRatio ) - dir1ratio; + } - dir1ratio = dfRatio * ( 1.0f - diffRatio ); - dir2ratio = ( 1.0f - diffRatio ) - dir1ratio; /* Requantize the 1 - dirRatio separately for each direction to obtain inverted dirRatio index. These are used in further decoding. */ hQMetaData->q_direction[0].band_data[b].energy_ratio_index[0] = masa_sq( 1.0f - dir1ratio, diffuseness_thresholds, DIRAC_DIFFUSE_LEVELS ); - hQMetaData->q_direction[1].band_data[dir2band].energy_ratio_index[0] = masa_sq( 1.0f - dir2ratio, diffuseness_thresholds, DIRAC_DIFFUSE_LEVELS ); +#ifdef HODIRAC + if ( hodirac ) + { + float tmp; + hQMetaData->q_direction[1].band_data[dir2band].energy_ratio_index[0] = usquant( dir2ratio, &tmp, 0.0f, 1.f / ( DIRAC_DIFFUSE_LEVELS - 1 ), DIRAC_DIFFUSE_LEVELS ); + } + else +#endif + { + hQMetaData->q_direction[1].band_data[dir2band].energy_ratio_index[0] = masa_sq( 1.0f - dir2ratio, diffuseness_thresholds, DIRAC_DIFFUSE_LEVELS ); + } for ( m = 0; m < hQMetaData->q_direction[0].cfg.nblocks; m++ ) { @@ -287,7 +314,12 @@ int16_t ivas_qmetadata_dec_decode( index_dirRatio1Inv = hQMetaData->q_direction[0].band_data[b].energy_ratio_index[0]; index_dirRatio2Inv = hQMetaData->q_direction[1].band_data[dir2band].energy_ratio_index[0]; - masa_compensate_two_dir_energy_ratio_index( index_dirRatio1Inv, index_dirRatio2Inv, &index_dirRatio1Inv_mod, &index_dirRatio2Inv_mod ); + masa_compensate_two_dir_energy_ratio_index( index_dirRatio1Inv, index_dirRatio2Inv, &index_dirRatio1Inv_mod, &index_dirRatio2Inv_mod +#ifdef HODIRAC + , + hodirac +#endif + ); for ( m = 0; m < hQMetaData->q_direction[0].cfg.nblocks; m++ ) { @@ -646,6 +678,7 @@ int16_t ivas_qmetadata_dec_decode( } /* Scale energy ratios that sum to over one */ +#ifndef HODIRAC for ( b = 0; b < hQMetaData->q_direction[0].cfg.nbands; b++ ) { float ratioSum; @@ -658,6 +691,7 @@ int16_t ivas_qmetadata_dec_decode( set_f( hQMetaData->q_direction[1].band_data[b].energy_ratio, hQMetaData->q_direction[1].band_data[b].energy_ratio[0] / ratioSum, nblocks ); } } +#endif } /* Store status information for renderer use */ diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c index 745ea1b9ba..17676e17de 100644 --- a/lib_dec/ivas_sba_dec.c +++ b/lib_dec/ivas_sba_dec.c @@ -65,6 +65,7 @@ ivas_error ivas_sba_dec_reconfigure( RENDERER_TYPE old_renderer_type; DECODER_CONFIG_HANDLE hDecoderConfig; ivas_error error; + int16_t band_grouping[IVAS_MAX_NUM_BANDS + 1]; error = IVAS_ERR_OK; @@ -122,6 +123,7 @@ ivas_error ivas_sba_dec_reconfigure( else { int16_t sba_order_internal; + SPAR_DEC_HANDLE hSpar = st_ivas->hSpar; sba_order_internal = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); @@ -245,7 +247,21 @@ ivas_error ivas_sba_dec_reconfigure( if ( st_ivas->sba_mode == SBA_MODE_SPAR ) { - if ( ( error = ivas_dirac_sba_config( st_ivas->hQMetaData, &st_ivas->nchan_transport, &st_ivas->nSCE, &st_ivas->nCPE, &st_ivas->element_mode_init, ivas_total_brate, st_ivas->sba_analysis_order, st_ivas->sba_mode, IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_dirac_sba_config( + st_ivas->hQMetaData, + &st_ivas->nchan_transport, + &st_ivas->nSCE, + &st_ivas->nCPE, + &st_ivas->element_mode_init, + ivas_total_brate, + st_ivas->sba_analysis_order, + st_ivas->sba_mode, +#ifdef HODIRAC + st_ivas->sba_analysis_order > 1 ? IVAS_MAX_NUM_BANDS : ( IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ) +#else + IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND +#endif + ) ) != IVAS_ERR_OK ) { return error; } diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c index 01e4db2ed4..864220a90c 100644 --- a/lib_dec/ivas_spar_decoder.c +++ b/lib_dec/ivas_spar_decoder.c @@ -104,7 +104,12 @@ ivas_error ivas_spar_dec_open( /* set FB config. */ active_w_mixing = -1; - if ( ( error = ivas_fb_set_cfg( &fb_cfg, SBA_FORMAT, SBA_MODE_SPAR, num_channels_internal, num_channels_internal, active_w_mixing, output_Fs ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_fb_set_cfg( &fb_cfg, SBA_FORMAT, SBA_MODE_SPAR, num_channels_internal, num_channels_internal, active_w_mixing, output_Fs +#ifdef HODIRAC + , + 0 +#endif + ) ) != IVAS_ERR_OK ) { return error; } @@ -820,6 +825,7 @@ void ivas_spar_get_parameters( { if ( hSpar->i_subframe > 3 ) { + par_mat[out_ch][in_ch][spar_band] = ( 1.0f - weight ) * hSpar->hMdDec->mixer_mat_prev[ts0][out_ch][in_ch][spar_band] + weight * hSpar->hMdDec->mixer_mat_prev[ts1][out_ch][in_ch][spar_band]; } @@ -1113,11 +1119,7 @@ void ivas_spar_dec_upmixer( for ( in_ch = 0; in_ch < numch_in; in_ch++ ) { - if ( b_skip_mat[out_ch][in_ch] ) - { - continue; - } - else if ( cldfb_band < CLDFB_PAR_WEIGHT_START_BAND ) /* tuning parameter, depends on how much SPAR Filters overlap for the CLDFB bands */ + if ( cldfb_band < CLDFB_PAR_WEIGHT_START_BAND ) /* tuning parameter, depends on how much SPAR Filters overlap for the CLDFB bands */ { spar_band = bin2band->p_cldfb_map_to_spar_band[cldfb_band]; cldfb_par = mixer_mat[out_ch][in_ch][spar_band]; diff --git a/lib_dec/ivas_spar_md_dec.c b/lib_dec/ivas_spar_md_dec.c index 3b47d6500e..67460100e3 100644 --- a/lib_dec/ivas_spar_md_dec.c +++ b/lib_dec/ivas_spar_md_dec.c @@ -673,6 +673,7 @@ void ivas_spar_md_dec_process( #endif /* SPAR to DirAC conversion */ + ivas_spar_to_dirac( st_ivas, hMdDec, dtx_vad, num_bands_out ); /* set correct number of bands*/ @@ -1388,7 +1389,7 @@ void ivas_spar_dec_gen_umx_mat( } } -#ifdef DEBUG_SBA_MD_DUMP +#if DEBUG_SBA_MD_DUMP { static FILE *f_mat = 0; @@ -2565,7 +2566,11 @@ void ivas_spar_to_dirac( dirac_to_spar_md_bands = st_ivas->hSpar->dirac_to_spar_md_bands; enc_param_start_band = st_ivas->hSpar->enc_param_start_band; - if ( hDirAC != NULL ) + if ( hDirAC != NULL +#ifdef HODIRAC + && st_ivas->sba_analysis_order <= 1 +#endif + ) { band_grouping = hDirAC->band_grouping; #ifdef ENABLE_DITHER diff --git a/lib_enc/ivas_dirac_enc.c b/lib_enc/ivas_dirac_enc.c index 43bc94fb04..33dc01670e 100644 --- a/lib_enc/ivas_dirac_enc.c +++ b/lib_enc/ivas_dirac_enc.c @@ -99,7 +99,19 @@ ivas_error ivas_dirac_enc_open( } else { - if ( ( error = ivas_fb_set_cfg( &fb_cfg, SBA_FORMAT, SBA_MODE_DIRAC, DIRAC_MAX_ANA_CHANS, 0, 0, input_Fs ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_fb_set_cfg( &fb_cfg, SBA_FORMAT, SBA_MODE_DIRAC, +#ifdef HODIRAC + FOA_CHANNELS +#else + DIRAC_MAX_ANA_CHANS +#endif + , + 0, 0, input_Fs +#ifdef HODIRAC + , + FOA_CHANNELS +#endif + ) ) != IVAS_ERR_OK ) { return error; } @@ -364,7 +376,13 @@ void ivas_dirac_enc( set_zero( data_f[2], input_frame ); } - ivas_dirac_param_est_enc( hDirAC, &( hQMetaData->q_direction[0] ), hQMetaData->useLowerRes, data_f, NULL, NULL, input_frame, SBA_MODE_DIRAC ); + ivas_dirac_param_est_enc( hDirAC, &( hQMetaData->q_direction[0] ), hQMetaData->useLowerRes, data_f, NULL, NULL, input_frame, SBA_MODE_DIRAC +#ifdef HODIRAC + , + 0, + FOA_CHANNELS +#endif + ); /* encode parameters */ if ( sba_planar || hQMetaData->useLowerRes ) @@ -376,7 +394,12 @@ void ivas_dirac_enc( } } - ivas_qmetadata_enc_encode( hMetaData, hQMetaData ); + ivas_qmetadata_enc_encode( hMetaData, hQMetaData +#ifdef HODIRAC + , + 0 +#endif + ); *nb_bits_metadata = hMetaData->nb_bits_tot; @@ -540,6 +563,10 @@ void computeReferencePower_enc( const int16_t enc_param_start_band, /* i : first band to process */ const int16_t num_freq_bands, /* i : Number of frequency bands */ const SBA_MODE sba_mode /* i : SBA mode */ +#ifdef HODIRAC + , + int16_t nchan_ana /* i : no of analysis channels */ +#endif ) { int16_t brange[2]; @@ -559,7 +586,11 @@ void computeReferencePower_enc( reference_power_W[i] += ( Cldfb_RealBuffer[0][j] * Cldfb_RealBuffer[0][j] ) + ( Cldfb_ImagBuffer[0][j] * Cldfb_ImagBuffer[0][j] ); } reference_power[i] += reference_power_W[i]; +#ifdef HODIRAC + for ( ch_idx = 1; ch_idx < nchan_ana; ch_idx++ ) +#else for ( ch_idx = 1; ch_idx < DIRAC_MAX_ANA_CHANS; ch_idx++ ) +#endif { /* abs()^2 */ for ( j = brange[0]; j < brange[1]; j++ ) @@ -596,7 +627,13 @@ void ivas_dirac_param_est_enc( float **pp_fr_real, float **pp_fr_imag, const int16_t input_frame, - const SBA_MODE sba_mode ) + const SBA_MODE sba_mode +#ifdef HODIRAC + , + const int16_t hodirac, + const int16_t nchan_dirac_ana +#endif +) { int16_t i, d, ts, index, l_ts, num_freq_bands; int16_t band_m_idx, block_m_idx; @@ -617,8 +654,30 @@ void ivas_dirac_param_est_enc( float reference_power[CLDFB_NO_COL_MAX][DIRAC_NO_FB_BANDS_MAX]; +#ifdef HODIRAC + float azi_secs[4 * DIRAC_MAX_ANA_CHANS * DIRAC_MAX_NBANDS] = { 0 }; + float ele_secs[4 * DIRAC_MAX_ANA_CHANS * DIRAC_MAX_NBANDS] = { 0 }; + float diff_secs[4 * DIRAC_MAX_ANA_CHANS * DIRAC_MAX_NBANDS] = { 0 }; + float ene_secs[4 * DIRAC_MAX_ANA_CHANS * DIRAC_MAX_NBANDS] = { 0 }; +#endif + +#ifdef HODIRAC_WRITE_PARAMS + static FILE *f_secparams = 0; +#endif + push_wmops( "dirac_enc_param_est" ); +#ifdef HODIRAC + num_freq_bands = hDirAC->hConfig->nbands; +#endif + +#ifdef HODIRAC_WRITE_PARAMS + if ( f_secparams == 0 ) + { + f_secparams = fopen( "sector_params.txt", "w" ); + } +#endif + /* Initialization */ l_ts = input_frame / MAX_PARAM_SPATIAL_SUBFRAMES; if ( useLowerRes ) @@ -640,7 +699,11 @@ void ivas_dirac_param_est_enc( } /* Copy current frame to memory for delay compensation */ +#ifdef HODIRAC + for ( i = 0; i < nchan_dirac_ana; i++ ) +#else for ( i = 0; i < DIRAC_MAX_ANA_CHANS; i++ ) +#endif { pcm_in[i] = &data_f[i][0]; p_Cldfb_RealBuffer[i] = &Cldfb_RealBuffer[i][0]; @@ -665,10 +728,19 @@ void ivas_dirac_param_est_enc( { if ( hDirAC->hFbMixer ) { - ivas_fb_mixer_get_windowed_fr( hDirAC->hFbMixer, pcm_in, p_Cldfb_RealBuffer, p_Cldfb_ImagBuffer, l_ts, l_ts ); + ivas_fb_mixer_get_windowed_fr( hDirAC->hFbMixer, pcm_in, p_Cldfb_RealBuffer, p_Cldfb_ImagBuffer, l_ts, l_ts +#ifdef HODIRAC + , + hodirac +#endif + ); ivas_fb_mixer_update_prior_input( hDirAC->hFbMixer, pcm_in, l_ts ); +#ifdef HODIRAC + for ( i = 0; i < nchan_dirac_ana; i++ ) +#else for ( i = 0; i < DIRAC_MAX_ANA_CHANS; i++ ) +#endif { pcm_in[i] += l_ts; } @@ -679,14 +751,19 @@ void ivas_dirac_param_est_enc( assert( pp_fr_real ); assert( pp_fr_imag ); #endif +#ifdef HODIRAC + for ( i = 0; i < nchan_dirac_ana; i++ ) +#else for ( i = 0; i < DIRAC_MAX_ANA_CHANS; i++ ) +#endif { mvr2r( &pp_fr_real[i][block_m_idx * l_ts], Cldfb_RealBuffer[i], l_ts ); mvr2r( &pp_fr_imag[i][block_m_idx * l_ts], Cldfb_ImagBuffer[i], l_ts ); } } - +#ifndef HODIRAC num_freq_bands = hDirAC->hConfig->nbands; +#endif computeReferencePower_enc( hDirAC->band_grouping, @@ -695,7 +772,16 @@ void ivas_dirac_param_est_enc( reference_power[ts], hDirAC->hConfig->enc_param_start_band, num_freq_bands, - sba_mode ); +#ifdef HODIRAC + hodirac ? SBA_MODE_DIRAC : sba_mode +#else + sba_mode +#endif +#ifdef HODIRAC + , + FOA_CHANNELS +#endif + ); computeIntensityVector_enc( hDirAC, @@ -726,6 +812,37 @@ void ivas_dirac_param_est_enc( mvr2r( reference_power[ts], &( hDirAC->buffer_energy[( index - 1 ) * num_freq_bands] ), num_freq_bands ); computeDiffuseness_mdft( hDirAC->buffer_intensity_real, hDirAC->buffer_energy, num_freq_bands, hDirAC->no_col_avg_diff, diffuseness_vector ); +#ifdef HODIRAC + if ( hodirac ) + { + + calculate_hodirac_sector_parameters( + Cldfb_RealBuffer, + Cldfb_ImagBuffer, + l_ts, + 0.20f, + hDirAC->band_grouping, + hDirAC->hConfig->nbands, + hDirAC->hConfig->enc_param_start_band, + azi_secs, ele_secs, diff_secs, ene_secs ); + +#ifdef HODIRAC_WRITE_PARAMS + for ( i = 0; i < num_freq_bands; i++ ) + { + for ( uint16_t j = 0; j < 4; j++ ) + { + fprintf( f_secparams, "%d %d %f %f %f %f %f\n", i, j, + azi_secs[j * num_freq_bands + i], + ele_secs[j * num_freq_bands + i], + ene_secs[j * num_freq_bands + i], + diff_secs[j * num_freq_bands + i], + diffuseness_vector[i] ); + } + } + +#endif // HODIRAC_WRITE_PARAMS + } +#endif // HODIRAC for ( band_m_idx = 0; band_m_idx < hDirAC->hConfig->nbands; band_m_idx++ ) { @@ -769,8 +886,41 @@ void ivas_dirac_param_est_enc( dir_v[d] = hDirAC->direction_vector_m[d][block_m_idx][band_m_idx]; } - ivas_qmetadata_direction_vector_to_azimuth_elevation( dir_v, &q_direction->band_data[band_m_idx].azimuth[block_m_idx], &q_direction->band_data[band_m_idx].elevation[block_m_idx] ); + ivas_qmetadata_direction_vector_to_azimuth_elevation( + dir_v, + &q_direction->band_data[band_m_idx].azimuth[block_m_idx], + &q_direction->band_data[band_m_idx].elevation[block_m_idx] ); + } + /* Sectors */ +#ifdef HODIRAC + if ( hodirac ) + { + for ( band_m_idx = 0; band_m_idx < hDirAC->hConfig->nbands; band_m_idx++ ) + { + q_direction->band_data[band_m_idx].azimuth[block_m_idx] = azi_secs[band_m_idx]; + q_direction->band_data[band_m_idx].elevation[block_m_idx] = ele_secs[band_m_idx]; + // q_direction->band_data[band_m_idx].energy_ratio[block_m_idx] = 1.f - diffuseness_vector[band_m_idx]; // set later + + q_direction[1].band_data[band_m_idx].azimuth[block_m_idx] = azi_secs[num_freq_bands + band_m_idx]; + q_direction[1].band_data[band_m_idx].elevation[block_m_idx] = ele_secs[num_freq_bands + band_m_idx]; + q_direction[1].band_data[band_m_idx].energy_ratio[block_m_idx] = ( 1.f - diff_secs[band_m_idx] ) / ( ( 1.f - diff_secs[band_m_idx] ) + ( 1.f - diff_secs[num_freq_bands + band_m_idx] ) + EPSILON ); +#ifdef HODIRAC_WRITE_PARAMS + { + static FILE *f_a = 0; + if ( f_a == 0 ) + f_a = fopen( "param_enc", "w" ); + fprintf( f_a, "%f %f %f %f %f %f\n", + q_direction->band_data[band_m_idx].azimuth[block_m_idx], + q_direction->band_data[band_m_idx].elevation[block_m_idx], + diffuseness_vector[band_m_idx], + q_direction[1].band_data[band_m_idx].azimuth[block_m_idx], + q_direction[1].band_data[band_m_idx].elevation[block_m_idx], + q_direction[1].band_data[band_m_idx].energy_ratio[block_m_idx] ); + } +#endif + } } +#endif } /* Diffuseness */ diff --git a/lib_enc/ivas_enc.c b/lib_enc/ivas_enc.c index 1e4ba82207..8ff941c03c 100644 --- a/lib_enc/ivas_enc.c +++ b/lib_enc/ivas_enc.c @@ -132,7 +132,11 @@ ivas_error ivas_enc( /* bypass EVS coding in float precision, emulating EVS encoder/decoder delay */ for ( i = 0; i < n; i++ ) { - if ( ( ivas_format == SBA_FORMAT ) && ( st_ivas->sba_mode == SBA_MODE_SPAR ) ) + if ( ( ivas_format == SBA_FORMAT ) && ( st_ivas->sba_mode == SBA_MODE_SPAR ) +#ifdef HODIRAC + & !( st_ivas->sba_analysis_order > 1 ) +#endif + ) { hp20( data_f[HOA_keep_ind[i]], input_frame, st_ivas->mem_hp20_in[i], input_Fs ); } diff --git a/lib_enc/ivas_enc_cov_handler.c b/lib_enc/ivas_enc_cov_handler.c index e117cfc5a5..e7b389c6bc 100644 --- a/lib_enc/ivas_enc_cov_handler.c +++ b/lib_enc/ivas_enc_cov_handler.c @@ -34,6 +34,9 @@ #include "options.h" #include "prot.h" #include "ivas_prot.h" +#ifdef HODIRAC +#include "ivas_rom_com.h" +#endif #ifdef DEBUGGING #include "debug.h" #endif @@ -267,9 +270,19 @@ static void ivas_band_cov( { for ( j = i; j < num_chans; j++ ) { + +#ifdef HODIRAC + int16_t i1 = HOA_keep_ind[i]; + int16_t j1 = HOA_keep_ind[j]; +#endif + for ( k = 0; k < num_bins; k++ ) { +#ifdef HODIRAC + pV_re[k] = ppIn_FR_real[i1][k] * ppIn_FR_real[j1][k] + ppIn_FR_imag[i1][k] * ppIn_FR_imag[j1][k]; +#else pV_re[k] = ppIn_FR_real[i][k] * ppIn_FR_real[j][k] + ppIn_FR_imag[i][k] * ppIn_FR_imag[j][k]; +#endif } for ( k = start_band; k < end_band; k++ ) diff --git a/lib_enc/ivas_init_enc.c b/lib_enc/ivas_init_enc.c index dfaa321605..c29c373434 100644 --- a/lib_enc/ivas_init_enc.c +++ b/lib_enc/ivas_init_enc.c @@ -184,7 +184,11 @@ int16_t getNumChanAnalysis( n = st_ivas->nSCE + CPE_CHANNELS * st_ivas->nCPE; if ( st_ivas->hEncoderConfig->ivas_format == SBA_FORMAT ) { +#ifdef HODIRAC + n = ( st_ivas->sba_analysis_order + 1 ) * ( st_ivas->sba_analysis_order + 1 ); +#else n = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order ); +#endif } else if ( st_ivas->hEncoderConfig->ivas_format == MC_FORMAT && ( st_ivas->mc_mode == MC_MODE_PARAMMC || st_ivas->mc_mode == MC_MODE_MCMASA ) ) { diff --git a/lib_enc/ivas_ism_param_enc.c b/lib_enc/ivas_ism_param_enc.c index 63c1fcea81..ec5108def7 100644 --- a/lib_enc/ivas_ism_param_enc.c +++ b/lib_enc/ivas_ism_param_enc.c @@ -320,7 +320,12 @@ ivas_error ivas_param_ism_enc_open( #endif /* set FB config. */ - if ( ( error = ivas_fb_set_cfg( &fb_cfg, ISM_FORMAT, SBA_MODE_NONE, st_ivas->hEncoderConfig->nchan_inp, 0, 0, input_Fs ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_fb_set_cfg( &fb_cfg, ISM_FORMAT, SBA_MODE_NONE, st_ivas->hEncoderConfig->nchan_inp, 0, 0, input_Fs +#ifdef HODIRAC + , + 0 +#endif + ) ) != IVAS_ERR_OK ) { return error; } @@ -442,7 +447,12 @@ void ivas_param_ism_enc( for ( ts = 0; ts < num_time_slots; ts++ ) { - ivas_fb_mixer_get_windowed_fr( hDirAC->hFbMixer, pcm_in, p_fb_RealBuffer, p_fb_ImagBuffer, l_ts, l_ts ); + ivas_fb_mixer_get_windowed_fr( hDirAC->hFbMixer, pcm_in, p_fb_RealBuffer, p_fb_ImagBuffer, l_ts, l_ts +#ifdef HODIRAC + , + 0 +#endif + ); ivas_fb_mixer_update_prior_input( hDirAC->hFbMixer, pcm_in, l_ts ); diff --git a/lib_enc/ivas_masa_enc.c b/lib_enc/ivas_masa_enc.c index 3655c1994a..0cc7a46131 100644 --- a/lib_enc/ivas_masa_enc.c +++ b/lib_enc/ivas_masa_enc.c @@ -311,7 +311,12 @@ ivas_error ivas_masa_encode( } /* Encode metadata */ - ivas_qmetadata_enc_encode( hMetaData, hQMetaData ); + ivas_qmetadata_enc_encode( hMetaData, hQMetaData +#ifdef HODIRAC + , + 0 +#endif + ); *nb_bits_metadata = hMetaData->nb_bits_tot; diff --git a/lib_enc/ivas_mc_param_enc.c b/lib_enc/ivas_mc_param_enc.c index db9945d0ce..cce33e9a5b 100644 --- a/lib_enc/ivas_mc_param_enc.c +++ b/lib_enc/ivas_mc_param_enc.c @@ -140,7 +140,12 @@ ivas_error ivas_param_mc_enc_open( hParamMC->dmx_factors = ivas_param_mc_conf[config_index].dmx_fac; /* set FB config. */ - if ( ( error = ivas_fb_set_cfg( &fb_cfg, MC_FORMAT, SBA_MODE_DIRAC, nchan_inp, 0, 0, input_Fs ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_fb_set_cfg( &fb_cfg, MC_FORMAT, SBA_MODE_DIRAC, nchan_inp, 0, 0, input_Fs +#ifdef HODIRAC + , + 0 +#endif + ) ) != IVAS_ERR_OK ) { return error; } @@ -682,7 +687,12 @@ static void ivas_param_mc_param_est_enc( for ( ts = start_ts; ts < num_time_slots; ts++ ) { - ivas_fb_mixer_get_windowed_fr( hParamMC->hFbMixer, pcm_in, p_slot_frame_f_real, p_slot_frame_f_imag, l_ts, 2 * l_ts ); + ivas_fb_mixer_get_windowed_fr( hParamMC->hFbMixer, pcm_in, p_slot_frame_f_real, p_slot_frame_f_imag, l_ts, 2 * l_ts +#ifdef HODIRAC + , + 0 +#endif + ); ivas_fb_mixer_update_prior_input( hParamMC->hFbMixer, pcm_in, l_ts ); for ( i = 0; i < nchan_input; i++ ) { diff --git a/lib_enc/ivas_mcmasa_enc.c b/lib_enc/ivas_mcmasa_enc.c index 866e4e176c..271ab03359 100644 --- a/lib_enc/ivas_mcmasa_enc.c +++ b/lib_enc/ivas_mcmasa_enc.c @@ -188,7 +188,12 @@ ivas_error ivas_mcmasa_enc_open( } /* set FB config. */ - if ( ( error = ivas_fb_set_cfg( &fb_cfg, MASA_FORMAT, SBA_MODE_NONE, numAnalysisChannels, 0, 0, input_Fs ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_fb_set_cfg( &fb_cfg, MASA_FORMAT, SBA_MODE_NONE, numAnalysisChannels, 0, 0, input_Fs +#ifdef HODIRAC + , + 0 +#endif + ) ) != IVAS_ERR_OK ) { return error; } @@ -219,7 +224,12 @@ ivas_error ivas_mcmasa_enc_open( else { /* Allocate and initialize FB mixer handle for LFE channel */ - if ( ( error = ivas_fb_set_cfg( &fb_cfgLfe, MASA_FORMAT, SBA_MODE_NONE, 1, 0, 0, input_Fs ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_fb_set_cfg( &fb_cfgLfe, MASA_FORMAT, SBA_MODE_NONE, 1, 0, 0, input_Fs +#ifdef HODIRAC + , + 0 +#endif + ) ) != IVAS_ERR_OK ) { return error; } @@ -835,7 +845,12 @@ void ivas_mcmasa_param_est_enc( for ( ts = mrange[0]; ts < mrange[1]; ts++ ) { - ivas_fb_mixer_get_windowed_fr( hMcMasa->hFbMixer, pcm_in, p_Chnl_RealBuffer, p_Chnl_ImagBuffer, l_ts, l_ts ); + ivas_fb_mixer_get_windowed_fr( hMcMasa->hFbMixer, pcm_in, p_Chnl_RealBuffer, p_Chnl_ImagBuffer, l_ts, l_ts +#ifdef HODIRAC + , + 0 +#endif + ); ivas_fb_mixer_update_prior_input( hMcMasa->hFbMixer, pcm_in, l_ts ); for ( i = 0; i < numAnalysisChannels; i++ ) { @@ -977,7 +992,12 @@ void ivas_mcmasa_param_est_enc( reference_power[ts], 0, num_freq_bands, - SBA_MODE_NONE ); + SBA_MODE_NONE +#ifdef HODIRAC + , + FOA_CHANNELS +#endif + ); /* Fill buffers of length "averaging_length" time slots for intensity and energy */ hMcMasa->index_buffer_intensity = ( hMcMasa->index_buffer_intensity % hMcMasa->no_col_avg_diff ) + 1; /* averaging_length = 32 */ @@ -1706,7 +1726,12 @@ static void computeLfeEnergy( for ( ts = mrange[0]; ts < mrange[1]; ts++ ) { - ivas_fb_mixer_get_windowed_fr( hMcMasa->hFbMixerLfe, pcm_in, p_Chnl_RealBuffer, p_Chnl_ImagBuffer, l_ts, l_ts ); + ivas_fb_mixer_get_windowed_fr( hMcMasa->hFbMixerLfe, pcm_in, p_Chnl_RealBuffer, p_Chnl_ImagBuffer, l_ts, l_ts +#ifdef HODIRAC + , + 0 +#endif + ); ivas_fb_mixer_update_prior_input( hMcMasa->hFbMixerLfe, pcm_in, l_ts ); pcm_in[0] += l_ts; diff --git a/lib_enc/ivas_qmetadata_enc.c b/lib_enc/ivas_qmetadata_enc.c index ac4f83a657..2a47ec1932 100644 --- a/lib_enc/ivas_qmetadata_enc.c +++ b/lib_enc/ivas_qmetadata_enc.c @@ -52,7 +52,12 @@ static float direction_distance( float elevation[DIRAC_MAX_NBANDS][MAX_PARAM_SPA #endif -static void ivas_qmetadata_quantize_diffuseness_nrg_ratios( IVAS_QMETADATA_HANDLE hQMetaData, int16_t *needed_bits, int16_t *nbits_diff, int16_t *dfRatioBits ); +static void ivas_qmetadata_quantize_diffuseness_nrg_ratios( IVAS_QMETADATA_HANDLE hQMetaData, int16_t *needed_bits, int16_t *nbits_diff, int16_t *dfRatioBits +#ifdef HODIRAC + , + int16_t hodirac /* i: flag to indicate sector processing */ +#endif +); static int16_t ivas_qmetadata_entropy_encode_diffuseness( BSTR_ENC_HANDLE hMetaData, IVAS_QDIRECTION *q_direction, uint16_t *diffuseness_index_max_ec_frame ); @@ -127,6 +132,10 @@ static int16_t calc_var_azi( const IVAS_QDIRECTION *q_direction, const int16_t d ivas_error ivas_qmetadata_enc_encode( BSTR_ENC_HANDLE hMetaData, /* i/o: metadata bitstream handle */ IVAS_QMETADATA *hQMetaData /* i/o: metadata handle */ +#ifdef HODIRAC + , + int16_t hodirac /* i: flag to indicate sector processing */ +#endif ) { int16_t i, bit_pos_start, bit_pos_start_coh; @@ -210,7 +219,12 @@ ivas_error ivas_qmetadata_enc_encode( assert( ndirections == 2 ); #endif /* Reorder 2dir bands for more efficient encoding. */ - ivas_qmetadata_reorder_2dir_bands( hQMetaData ); +#ifdef HODIRAC + if ( !hodirac ) +#endif + { + ivas_qmetadata_reorder_2dir_bands( hQMetaData ); + } d = 0; for ( i = hQMetaData->q_direction[1].cfg.start_band; i < hQMetaData->q_direction[1].cfg.nbands; i++ ) { @@ -244,7 +258,12 @@ ivas_error ivas_qmetadata_enc_encode( } /*Quantization of the Diffuseness */ - ivas_qmetadata_quantize_diffuseness_nrg_ratios( hQMetaData, bits_dir_raw_pre, bits_diff, dfRatio_bits ); + ivas_qmetadata_quantize_diffuseness_nrg_ratios( hQMetaData, bits_dir_raw_pre, bits_diff, dfRatio_bits +#ifdef HODIRAC + , + hodirac +#endif + ); bits_diff_sum = 0; bits_diff[0] = ivas_qmetadata_entropy_encode_diffuseness( hMetaData, &( hQMetaData->q_direction[0] ), &diffuseness_index_max_ec_frame_pre[0] ); @@ -1047,7 +1066,12 @@ static void ivas_qmetadata_quantize_diffuseness_nrg_ratios( IVAS_QMETADATA_HANDLE hQMetaData, int16_t *needed_bits, int16_t *nbits_diff, - int16_t *dfRatioBits ) + int16_t *dfRatioBits +#ifdef HODIRAC + , + int16_t hodirac /* i: flag to indicate sector processing */ +#endif +) { int16_t j, k, dir2band; int16_t index_dirRatio1Inv, index_dirRatio2Inv, index_dirRatio1Inv_mod, index_dirRatio2Inv_mod; @@ -1063,18 +1087,31 @@ static void ivas_qmetadata_quantize_diffuseness_nrg_ratios( { if ( hQMetaData->no_directions == 2 && hQMetaData->twoDirBands[j] == 1 ) { - float dirRatio1, dirRatio2, diffRatio, sumRatio, dfRatio, dfRatioQ, diffRatioQ, dirRatio1Q, dirRatio2Q; + float diffRatio, dfRatio, dfRatioQ, diffRatioQ, dirRatio1Q, dirRatio2Q; + float dirRatio1, dirRatio2, sumRatio; int16_t dfRatio_index, dfRatio_qsteps, dfRatio_bits; /* With 2dir metadata, we quantize and transmit diffuse-to-total ratio (diffRatio) and * distribution factor of direct-to-total ratios (dFRatio). This is more efficient and * accurate than simple separate quantization of each direct-to-total ratio or their * separate inverses. */ - dirRatio1 = hQMetaData->q_direction[0].band_data[j].energy_ratio[0]; - dirRatio2 = hQMetaData->q_direction[1].band_data[dir2band].energy_ratio[0]; - sumRatio = dirRatio1 + dirRatio2; - diffRatio = 1.0f - sumRatio; - dfRatio = sumRatio < EPSILON ? 0.5f : dirRatio1 / sumRatio; +#ifdef HODIRAC + if ( hodirac ) + { + /* already encoded as total and ratios in HODIRAC*/ + diffRatio = 1.f - hQMetaData->q_direction[0].band_data[j].energy_ratio[0]; + dfRatio = hQMetaData->q_direction[1].band_data[dir2band].energy_ratio[0]; + } + else +#endif + { + dirRatio1 = hQMetaData->q_direction[0].band_data[j].energy_ratio[0]; + dirRatio2 = hQMetaData->q_direction[1].band_data[dir2band].energy_ratio[0]; + sumRatio = dirRatio1 + dirRatio2; + diffRatio = 1.0f - sumRatio; + dfRatio = sumRatio < EPSILON ? 0.5f : dirRatio1 / sumRatio; + } + index_diff = masa_sq( diffRatio, diffuseness_thresholds, DIRAC_DIFFUSE_LEVELS ); diffRatioQ = diffuseness_reconstructions[index_diff]; @@ -1084,11 +1121,23 @@ static void ivas_qmetadata_quantize_diffuseness_nrg_ratios( dfRatioBits[dir2band] = dfRatio_bits; dfRatio_qsteps = ( 1 << dfRatio_bits ); - dfRatio_index = usquant( dfRatio, &dfRatioQ, 0.5f, 0.5f / ( dfRatio_qsteps - 1 ), dfRatio_qsteps ); +#ifdef HODIRAC + if ( hodirac ) + { + dfRatio_index = usquant( dfRatio, &dfRatioQ, 0.0f, 1.f / ( dfRatio_qsteps - 1 ), dfRatio_qsteps ); + dirRatio1Q = 1.f - diffRatioQ; + dirRatio2Q = dfRatioQ; + } + else +#endif + { + dfRatio_index = usquant( dfRatio, &dfRatioQ, 0.5f, 0.5f / ( dfRatio_qsteps - 1 ), dfRatio_qsteps ); + + /* Direction quantization requires also separately quantized direct-to-total ratios. Thus, we calculate them. */ + dirRatio1Q = dfRatioQ * ( 1.0f - diffRatioQ ); + dirRatio2Q = ( 1.0f - diffRatioQ ) - dirRatio1Q; + } - /* Direction quantization requires also separately quantized direct-to-total ratios. Thus, we calculate them. */ - dirRatio1Q = dfRatioQ * ( 1.0f - diffRatioQ ); - dirRatio2Q = ( 1.0f - diffRatioQ ) - dirRatio1Q; index_dirRatio1Inv = masa_sq( 1.0f - dirRatio1Q, diffuseness_thresholds, DIRAC_DIFFUSE_LEVELS ); @@ -1101,8 +1150,18 @@ static void ivas_qmetadata_quantize_diffuseness_nrg_ratios( hQMetaData->q_direction[0].band_data[j].energy_ratio[k] = dirRatio1Q; } nbits_diff[0] += MASA_BITS_ER; +#ifdef HODIRAC + if ( hodirac ) + { + float tmp; + index_dirRatio2Inv = usquant( dirRatio2Q, &tmp, 0.0f, 1.f / ( DIRAC_DIFFUSE_LEVELS - 1 ), DIRAC_DIFFUSE_LEVELS ); + } + else +#endif + { + index_dirRatio2Inv = masa_sq( 1.0f - dirRatio2Q, diffuseness_thresholds, DIRAC_DIFFUSE_LEVELS ); + } - index_dirRatio2Inv = masa_sq( 1.0f - dirRatio2Q, diffuseness_thresholds, DIRAC_DIFFUSE_LEVELS ); for ( k = 0; k < hQMetaData->q_direction[1].cfg.nblocks; k++ ) { hQMetaData->q_direction[1].band_data[dir2band].energy_ratio_index[k] = dfRatio_index; @@ -1114,7 +1173,12 @@ static void ivas_qmetadata_quantize_diffuseness_nrg_ratios( * fact that with 2dir data, it is harder to achieve separate high direct-to-total ratio values * which are assumed by the direction quantization system. In practice, this improves direction * accuracy when it is perceptual meaningful. */ - masa_compensate_two_dir_energy_ratio_index( index_dirRatio1Inv, index_dirRatio2Inv, &index_dirRatio1Inv_mod, &index_dirRatio2Inv_mod ); + masa_compensate_two_dir_energy_ratio_index( index_dirRatio1Inv, index_dirRatio2Inv, &index_dirRatio1Inv_mod, &index_dirRatio2Inv_mod +#ifdef HODIRAC + , + hodirac +#endif + ); for ( k = 0; k < hQMetaData->q_direction[0].cfg.nblocks; k++ ) { @@ -4775,14 +4839,23 @@ static void ivas_qmetadata_reorder_2dir_bands( hQMetaData->q_direction[0].band_data[band].distance[sf] = hQMetaData->q_direction[1].band_data[band].distance[sf]; hQMetaData->q_direction[1].band_data[band].distance[sf] = uint8_tmp; - uint8_tmp = hQMetaData->q_direction[0].coherence_band_data[band].spread_coherence[sf]; - hQMetaData->q_direction[0].coherence_band_data[band].spread_coherence[sf] = hQMetaData->q_direction[1].coherence_band_data[band].spread_coherence[sf]; - hQMetaData->q_direction[1].coherence_band_data[band].spread_coherence[sf] = uint8_tmp; +#ifdef HODIRAC + if ( hQMetaData->coherence_flag ) +#endif + { + uint8_tmp = hQMetaData->q_direction[0].coherence_band_data[band].spread_coherence[sf]; + hQMetaData->q_direction[0].coherence_band_data[band].spread_coherence[sf] = hQMetaData->q_direction[1].coherence_band_data[band].spread_coherence[sf]; + hQMetaData->q_direction[1].coherence_band_data[band].spread_coherence[sf] = uint8_tmp; + } + } +#ifdef HODIRAC + if ( hQMetaData->coherence_flag ) +#endif + { + flt_tmp = hQMetaData->q_direction[0].band_data[band].energy_ratio[0]; + hQMetaData->q_direction[0].band_data[band].energy_ratio[0] = hQMetaData->q_direction[1].band_data[band].energy_ratio[0]; + hQMetaData->q_direction[1].band_data[band].energy_ratio[0] = flt_tmp; } - - flt_tmp = hQMetaData->q_direction[0].band_data[band].energy_ratio[0]; - hQMetaData->q_direction[0].band_data[band].energy_ratio[0] = hQMetaData->q_direction[1].band_data[band].energy_ratio[0]; - hQMetaData->q_direction[1].band_data[band].energy_ratio[0] = flt_tmp; } } } diff --git a/lib_enc/ivas_sba_enc.c b/lib_enc/ivas_sba_enc.c index d3aab0a6e8..11cb280073 100644 --- a/lib_enc/ivas_sba_enc.c +++ b/lib_enc/ivas_sba_enc.c @@ -138,9 +138,13 @@ ivas_error ivas_sba_enc_reconfigure( { int16_t i, n_old; float **old_mem_hp20_in; - +#ifdef HODIRAC + n_old = ( analysis_order_old + 1 ) * ( analysis_order_old + 1 ); + n = ( st_ivas->sba_analysis_order + 1 ) * ( st_ivas->sba_analysis_order + 1 ); +#else n_old = ivas_sba_get_nchan_metadata( analysis_order_old ); n = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order ); +#endif if ( n > n_old ) { @@ -241,6 +245,10 @@ ivas_error ivas_sba_enc_reconfigure( if ( ( sba_mode_old != st_ivas->sba_mode ) || ( nchan_transport_old != st_ivas->nchan_transport ) ) { +#ifdef HODIRAC + int16_t nchan_dirac_ana; + nchan_dirac_ana = ( st_ivas->sba_analysis_order + 1 ) * ( st_ivas->sba_analysis_order + 1 ); +#endif /* FB mixer handle */ if ( st_ivas->sba_mode == SBA_MODE_SPAR ) { @@ -267,7 +275,18 @@ ivas_error ivas_sba_enc_reconfigure( { IVAS_FB_CFG *fb_cfg; - if ( ( error = ivas_fb_set_cfg( &fb_cfg, SBA_FORMAT, SBA_MODE_DIRAC, DIRAC_MAX_ANA_CHANS, 0, 0, hEncoderConfig->input_Fs ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_fb_set_cfg( &fb_cfg, SBA_FORMAT, SBA_MODE_DIRAC, +#ifdef HODIRAC + nchan_dirac_ana, +#else + DIRAC_MAX_ANA_CHANS, +#endif + 0, 0, hEncoderConfig->input_Fs +#ifdef HODIRAC + , + nchan_dirac_ana +#endif + ) ) != IVAS_ERR_OK ) { return error; } @@ -319,6 +338,5 @@ ivas_error ivas_sba_enc_reconfigure( return error; } } - return error; } diff --git a/lib_enc/ivas_spar_encoder.c b/lib_enc/ivas_spar_encoder.c index c659979d2b..84bedf8f91 100644 --- a/lib_enc/ivas_spar_encoder.c +++ b/lib_enc/ivas_spar_encoder.c @@ -66,6 +66,9 @@ ivas_error ivas_spar_enc_open( ENCODER_CONFIG_HANDLE hEncoderConfig; IVAS_FB_CFG *fb_cfg; int16_t nchan_inp, nchan_transport, sba_order_internal; +#ifdef HODIRAC + int16_t nchan_dirac_ana; +#endif int16_t table_idx, active_w_mixing; int32_t input_Fs, ivas_total_brate; ivas_error error; @@ -89,6 +92,9 @@ ivas_error ivas_spar_enc_open( assert( nchan_inp <= hEncoderConfig->nchan_inp ); ivas_total_brate = hEncoderConfig->ivas_total_brate; +#ifdef HODIRAC + nchan_dirac_ana = ( st_ivas->sba_analysis_order + 1 ) * ( st_ivas->sba_analysis_order + 1 ); +#endif nchan_transport = ivas_get_sba_num_TCs( hEncoderConfig->ivas_total_brate, sba_order_internal ); // bw = ivas_get_bw_idx_from_sample_rate(pCfg->input_Fs); @@ -103,7 +109,12 @@ ivas_error ivas_spar_enc_open( /* set FB config. */ active_w_mixing = ivas_spar_br_table_consts[table_idx].active_w; - ivas_fb_set_cfg( &fb_cfg, SBA_FORMAT, SBA_MODE_SPAR, nchan_inp, nchan_transport, active_w_mixing, input_Fs ); + ivas_fb_set_cfg( &fb_cfg, SBA_FORMAT, SBA_MODE_SPAR, nchan_inp, nchan_transport, active_w_mixing, input_Fs +#ifdef HODIRAC + , + nchan_dirac_ana +#endif + ); fb_cfg->remix_order = remix_order_set[hSpar->hMdEnc->spar_md_cfg.remix_unmix_order]; /* FB mixer handle */ @@ -389,10 +400,19 @@ static ivas_error ivas_spar_enc_process( float data_f[][L_FRAME48k] /* i/o: input/transport audio channels */ ) { +#ifdef HODIRAC + float pcm_tmp[DIRAC_MAX_ANA_CHANS][L_FRAME48k * 2]; + float *p_pcm_tmp[DIRAC_MAX_ANA_CHANS]; + float *ppIn_FR_real[DIRAC_MAX_ANA_CHANS], *ppIn_FR_imag[DIRAC_MAX_ANA_CHANS]; +#else float pcm_tmp[IVAS_SPAR_MAX_CH][L_FRAME48k * 2]; float *p_pcm_tmp[IVAS_SPAR_MAX_CH]; + float *ppIn_FR_real[IVAS_SPAR_MAX_CH], *ppIn_FR_imag[IVAS_SPAR_MAX_CH]; +#endif + int16_t i, j, b, i_ts, input_frame, dtx_vad; int16_t transient_det[2]; + int32_t ivas_total_brate, input_Fs; float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; float *cov_dtx_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; @@ -404,10 +424,12 @@ static ivas_error ivas_spar_enc_process( SPAR_ENC_HANDLE hSpar = st_ivas->hSpar; IVAS_QMETADATA_HANDLE hQMetaData = st_ivas->hQMetaData; int16_t ts, l_ts, orig_dirac_bands, num_del_samples; - float *ppIn_FR_real[IVAS_SPAR_MAX_CH], *ppIn_FR_imag[IVAS_SPAR_MAX_CH]; float w_del_buf[IVAS_FB_1MS_48K_SAMP]; float dir[3], avg_dir[3]; float energySum, vecLen; +#ifdef HODIRAC + int16_t nchan_dirac_ana; +#endif push_wmops( "ivas_spar_enc_process" ); @@ -425,11 +447,17 @@ static ivas_error ivas_spar_enc_process( sba_order = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); nchan_inp = ivas_sba_get_nchan_metadata( sba_order ); assert( nchan_inp <= hEncoderConfig->nchan_inp ); +#ifdef HODIRAC + nchan_dirac_ana = hSpar->hFbMixer->fb_cfg->nchan_dirac_ana; + nchan_transport = st_ivas->nchan_transport; +#endif +#ifndef HODIRAC for ( i = FOA_CHANNELS + 1; i < nchan_inp; i++ ) { mvr2r( data_f[HOA_keep_ind[i]], data_f[i], input_frame ); } +#endif /*-----------------------------------------------------------------------------------------* * Transient detector @@ -449,7 +477,11 @@ static ivas_error ivas_spar_enc_process( * FB mixer ingest *-----------------------------------------------------------------------------------------*/ +#ifdef HODIRAC + for ( i = 0; i < nchan_dirac_ana; i++ ) +#else for ( i = 0; i < nchan_inp; i++ ) +#endif { p_pcm_tmp[i] = pcm_tmp[i]; } @@ -458,7 +490,11 @@ static ivas_error ivas_spar_enc_process( ivas_fb_mixer_pcm_ingest( hSpar->hFbMixer, data_f, p_pcm_tmp, input_frame ); /* prepare Parameter MDFT analysis */ +#ifdef HODIRAC + for ( i = 0; i < nchan_dirac_ana; i++ ) +#else for ( i = 0; i < nchan_inp; i++ ) +#endif { ppIn_FR_real[i] = p_pcm_tmp[i]; ppIn_FR_imag[i] = p_pcm_tmp[i] + input_frame; @@ -469,10 +505,19 @@ static ivas_error ivas_spar_enc_process( for ( ts = 0; ts < MAX_PARAM_SPATIAL_SUBFRAMES; ts++ ) { - ivas_fb_mixer_get_windowed_fr( hSpar->hFbMixer, p_pcm_tmp, ppIn_FR_real, ppIn_FR_imag, l_ts, l_ts ); + ivas_fb_mixer_get_windowed_fr( hSpar->hFbMixer, p_pcm_tmp, ppIn_FR_real, ppIn_FR_imag, l_ts, l_ts +#ifdef HODIRAC + , + st_ivas->sba_analysis_order > 1 +#endif + ); ivas_fb_mixer_update_prior_input( hSpar->hFbMixer, p_pcm_tmp, l_ts ); +#ifdef HODIRAC + for ( i = 0; i < nchan_dirac_ana; i++ ) +#else for ( i = 0; i < nchan_inp; i++ ) +#endif { p_pcm_tmp[i] += l_ts; ppIn_FR_real[i] += l_ts; @@ -481,7 +526,11 @@ static ivas_error ivas_spar_enc_process( } /* turn pointers back to the local buffer, needed for the following processing */ +#ifdef HODIRAC + for ( i = 0; i < nchan_dirac_ana; i++ ) +#else for ( i = 0; i < nchan_inp; i++ ) +#endif { ppIn_FR_real[i] = pcm_tmp[i]; ppIn_FR_imag[i] = pcm_tmp[i] + input_frame; @@ -494,7 +543,13 @@ static ivas_error ivas_spar_enc_process( * DirAC encoding *-----------------------------------------------------------------------------------------*/ - ivas_dirac_param_est_enc( st_ivas->hDirAC, hQMetaData->q_direction, hQMetaData->useLowerRes, data_f, ppIn_FR_real, ppIn_FR_imag, input_frame, st_ivas->sba_mode ); + ivas_dirac_param_est_enc( st_ivas->hDirAC, hQMetaData->q_direction, hQMetaData->useLowerRes, data_f, ppIn_FR_real, ppIn_FR_imag, input_frame, st_ivas->sba_mode +#ifdef HODIRAC + , + st_ivas->sba_analysis_order > 1, + nchan_dirac_ana +#endif + ); if ( hQMetaData->q_direction->cfg.nbands > 0 ) { @@ -504,7 +559,12 @@ static ivas_error ivas_spar_enc_process( { /* WB 4TC mode bit : disable for now*/ push_next_indice( hMetaData, 0, 1 ); - ivas_qmetadata_enc_encode( hMetaData, hQMetaData ); + ivas_qmetadata_enc_encode( hMetaData, hQMetaData +#ifdef HODIRAC + , + st_ivas->sba_analysis_order > 1 +#endif + ); } else { @@ -611,7 +671,18 @@ static ivas_error ivas_spar_enc_process( } } - ivas_enc_cov_handler_process( hSpar->hCovEnc, ppIn_FR_real, ppIn_FR_imag, cov_real, cov_dtx_real, hSpar->hFbMixer->pFb, 0, hSpar->hFbMixer->pFb->filterbank_num_bands, nchan_inp, dtx_vad, transient_det ); + ivas_enc_cov_handler_process( + hSpar->hCovEnc, + ppIn_FR_real, + ppIn_FR_imag, + cov_real, + cov_dtx_real, + hSpar->hFbMixer->pFb, + 0, + hSpar->hFbMixer->pFb->filterbank_num_bands, + nchan_inp, + dtx_vad, + transient_det ); nchan_transport = st_ivas->nchan_transport; /*-----------------------------------------------------------------------------------------* diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 37851cf1ab..fd13c83e1d 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -2195,6 +2195,10 @@ static ivas_error initMasaDummyDecForMcOut( output_config = getIvasAudioConfigFromRendAudioConfig( outConfig ); decDummy->hDecoderConfig->output_config = output_config; +#ifdef HODIRAC + decDummy->sba_analysis_order = 1; +#endif + decDummy->hDecoderConfig->ivas_total_brate = IVAS_512k; /* Todo Nokia: This is preventing initialization of 2TC as 1TC, should be fixed properly in ivas_dirac_dec_config() */ decDummy->sba_mode = SBA_MODE_NONE; /* Todo Nokia: This is done to prevent ivas_dirac_dec_config() to not use uninitialized value. It could be considered if this should not be even accessed when not in SBA. */ decDummy->mc_mode = MC_MODE_NONE; /* Todo Nokia: This should be also refactored in such way that it is not checked if not in MC mode */ @@ -2281,6 +2285,10 @@ static ivas_error initMasaDummyDecForSbaOut( decDummy->sba_mode = SBA_MODE_NONE; /* Todo Nokia: This is done to prevent ivas_dirac_dec_config() to not use uninitialized value. It could be considered if this should not be even accessed when not in SBA. */ decDummy->mc_mode = MC_MODE_NONE; /* Todo Nokia: This should be also refactored in such way that it is not checked if not in MC mode */ +#ifdef HODIRAC + decDummy->sba_analysis_order = 1; +#endif + ivas_output_init( &( decDummy->hOutSetup ), output_config ); ivas_output_init( &( decDummy->hIntSetup ), output_config ); decDummy->renderer_type = RENDERER_DIRAC; @@ -2346,6 +2354,10 @@ static ivas_error initMasaDummyDecForBinauralOut( output_config = decDummy->hDecoderConfig->output_config; +#ifdef HODIRAC + decDummy->sba_analysis_order = 1; +#endif + decDummy->hDecoderConfig->ivas_total_brate = IVAS_512k; /* Todo Nokia: This is preventing initialization of 2TC as 1TC, should be fixed properly in ivas_dirac_dec_config() */ decDummy->sba_mode = SBA_MODE_NONE; /* Todo Nokia: This is done to prevent ivas_dirac_dec_config() to not use uninitialized value. It could be considered if this should not be even accessed when not in SBA. */ decDummy->mc_mode = MC_MODE_NONE; /* Todo Nokia: This should be also refactored in such way that it is not checked if not in MC mode */ -- GitLab From b576a9de5589f1d097f322892b5d344d7f14b512 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Thu, 6 Apr 2023 16:13:21 +0200 Subject: [PATCH 02/66] optimize sector filtering in encoder --- lib_com/ivas_dirac_com.c | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/lib_com/ivas_dirac_com.c b/lib_com/ivas_dirac_com.c index 4c2c8c7d17..ca68604d76 100644 --- a/lib_com/ivas_dirac_com.c +++ b/lib_com/ivas_dirac_com.c @@ -918,27 +918,27 @@ void calculate_hodirac_sector_parameters( { if ( i_sec == 0 ) { - *p_sec_w_imag = 1.772454e+00f * ImagBuffer[0][i_bin] + 1.023327e+00f * 1.732050776481628f * ImagBuffer[1][i_bin]; - *p_sec_x_imag = 1.023327e+00f * 1.732050776481628f * ImagBuffer[3][i_bin] + 4.576456e-01f * 2.236068010330200f * ImagBuffer[4][i_bin]; - *p_sec_y_imag = 5.908180e-01f * ImagBuffer[0][i_bin] + 1.023327e+00f * 1.732050776481628f * ImagBuffer[1][i_bin] - 2.642218e-01f * 2.236068010330200f * ImagBuffer[6][i_bin] - 4.576456e-01f * 2.236068010330200f * ImagBuffer[8][i_bin]; - *p_sec_z_imag = 1.023327e+00f * 1.732050776481628f * ImagBuffer[2][i_bin] + 4.576456e-01f * 2.236068010330200f * ImagBuffer[5][i_bin]; - - *p_sec_w_real = 1.772454e+00f * RealBuffer[0][i_bin] + 1.023327e+00f * 1.732050776481628f * RealBuffer[1][i_bin]; - *p_sec_x_real = 1.023327e+00f * 1.732050776481628f * RealBuffer[3][i_bin] + 4.576456e-01f * 2.236068010330200f * RealBuffer[4][i_bin]; - *p_sec_y_real = 5.908180e-01f * RealBuffer[0][i_bin] + 1.023327e+00f * 1.732050776481628f * RealBuffer[1][i_bin] - 2.642218e-01f * 2.236068010330200f * RealBuffer[6][i_bin] - 4.576456e-01f * 2.236068010330200f * RealBuffer[8][i_bin]; - *p_sec_z_real = 1.023327e+00f * 1.732050776481628f * RealBuffer[2][i_bin] + 4.576456e-01f * 2.236068010330200f * RealBuffer[5][i_bin]; + *p_sec_w_imag = 1.772454f * ImagBuffer[0][i_bin] + 1.772454f * ImagBuffer[1][i_bin]; + *p_sec_x_imag = 1.772454f * ImagBuffer[3][i_bin] + 1.023326f * ImagBuffer[4][i_bin]; + *p_sec_y_imag = 0.590818f * ImagBuffer[0][i_bin] + 1.772454f * ImagBuffer[1][i_bin] - 0.590817f * ImagBuffer[6][i_bin] - 1.023326f * ImagBuffer[8][i_bin]; + *p_sec_z_imag = 1.772454f * ImagBuffer[2][i_bin] + 1.023326f * ImagBuffer[5][i_bin]; + + *p_sec_w_real = 1.772454f * RealBuffer[0][i_bin] + 1.772454f * RealBuffer[1][i_bin]; + *p_sec_x_real = 1.772454f * RealBuffer[3][i_bin] + 1.023326f * RealBuffer[4][i_bin]; + *p_sec_y_real = 0.590818f * RealBuffer[0][i_bin] + 1.772454f * RealBuffer[1][i_bin] - 0.590817f * RealBuffer[6][i_bin] - 1.023326f * RealBuffer[8][i_bin]; + *p_sec_z_real = 1.772454f * RealBuffer[2][i_bin] + 1.023326f * RealBuffer[5][i_bin]; } else { - *p_sec_w_imag = 1.772454e+00f * ImagBuffer[0][i_bin] - 1.023327e+00f * 1.732050776481628f * ImagBuffer[1][i_bin]; - *p_sec_x_imag = 1.023327e+00f * 1.732050776481628f * ImagBuffer[3][i_bin] - 4.576456e-01f * 2.236068010330200f * ImagBuffer[4][i_bin]; - *p_sec_y_imag = -5.908180e-01f * ImagBuffer[0][i_bin] + 1.023327e+00f * 1.732050776481628f * ImagBuffer[1][i_bin] + 2.642218e-01f * 2.236068010330200f * ImagBuffer[6][i_bin] + 4.576456e-01f * 2.236068010330200f * ImagBuffer[8][i_bin]; - *p_sec_z_imag = 1.023327e+00f * 1.732050776481628f * ImagBuffer[2][i_bin] - 4.576456e-01f * 2.236068010330200f * ImagBuffer[5][i_bin]; - - *p_sec_w_real = 1.772454e+00f * RealBuffer[0][i_bin] - 1.023327e+00f * 1.732050776481628f * RealBuffer[1][i_bin]; - *p_sec_x_real = 1.023327e+00f * 1.732050776481628f * RealBuffer[3][i_bin] - 4.576456e-01f * 2.236068010330200f * RealBuffer[4][i_bin]; - *p_sec_y_real = -5.908180e-01f * RealBuffer[0][i_bin] + 1.023327e+00f * 1.732050776481628f * RealBuffer[1][i_bin] + 2.642218e-01f * 2.236068010330200f * RealBuffer[6][i_bin] + 4.576456e-01f * 2.236068010330200f * RealBuffer[8][i_bin]; - *p_sec_z_real = 1.023327e+00f * 1.732050776481628f * RealBuffer[2][i_bin] - 4.576456e-01f * 2.236068010330200f * RealBuffer[5][i_bin]; + *p_sec_w_imag = 1.772454f * ImagBuffer[0][i_bin] - 1.772454f * ImagBuffer[1][i_bin]; + *p_sec_x_imag = 1.772454f * ImagBuffer[3][i_bin] - 1.023326f * ImagBuffer[4][i_bin]; + *p_sec_y_imag = -0.590818f * ImagBuffer[0][i_bin] + 1.772454f * ImagBuffer[1][i_bin] + 0.590817f * ImagBuffer[6][i_bin] + 1.023326f * ImagBuffer[8][i_bin]; + *p_sec_z_imag = 1.772454f * ImagBuffer[2][i_bin] - 1.023326f * ImagBuffer[5][i_bin]; + + *p_sec_w_real = 1.772454f * RealBuffer[0][i_bin] - 1.772454f * RealBuffer[1][i_bin]; + *p_sec_x_real = 1.772454f * RealBuffer[3][i_bin] - 1.023326f * RealBuffer[4][i_bin]; + *p_sec_y_real = -0.590818f * RealBuffer[0][i_bin] + 1.772454f * RealBuffer[1][i_bin] + 0.590817f * RealBuffer[6][i_bin] + 1.023326f * RealBuffer[8][i_bin]; + *p_sec_z_real = 1.772454f * RealBuffer[2][i_bin] - 1.023326f * RealBuffer[5][i_bin]; } // active intensity -- GitLab From a70996757bb90bab2477895b667d1b986c231052 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Tue, 11 Apr 2023 14:22:19 +0200 Subject: [PATCH 03/66] optimize FB buffers --- lib_com/ivas_cnst.h | 8 +++++ lib_com/ivas_fb_mixer.c | 41 +++++++++++--------------- lib_com/ivas_prot.h | 8 +++-- lib_com/ivas_rom_com.c | 5 ++++ lib_com/ivas_rom_com.h | 5 ++++ lib_com/ivas_stat_com.h | 2 +- lib_enc/ivas_dirac_enc.c | 17 +++++++---- lib_enc/ivas_enc_cov_handler.c | 4 +-- lib_enc/ivas_ism_param_enc.c | 9 ++++-- lib_enc/ivas_mc_param_enc.c | 16 ++++++++-- lib_enc/ivas_mcmasa_enc.c | 18 +++++++++--- lib_enc/ivas_sba_enc.c | 24 ++++++++++++--- lib_enc/ivas_spar_encoder.c | 54 ++++++++++++++++++++++++---------- 13 files changed, 148 insertions(+), 63 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index ce8389def9..425ae50e75 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -170,6 +170,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 */ @@ -987,6 +991,10 @@ typedef enum #define SPAR_CONFIG_BW FB #define IVAS_SPAR_MAX_CH (FOA_CHANNELS + 2 * ( IVAS_MAX_SBA_ORDER - 1 )) /* FOA + planar HOA */ +#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) diff --git a/lib_com/ivas_fb_mixer.c b/lib_com/ivas_fb_mixer.c index 0fc1c2fe04..2e8fda221a 100644 --- a/lib_com/ivas_fb_mixer.c +++ b/lib_com/ivas_fb_mixer.c @@ -108,7 +108,7 @@ ivas_error ivas_fb_set_cfg( const int32_t sampling_rate /* i : sampling rate */ #ifdef HODIRAC , - const int16_t nchan_dirac_ana /* i: number of dirac analysis channels */ + const int16_t nchan_fb_in /* i: number of dirac analysis channels */ #endif ) { @@ -122,7 +122,7 @@ 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_dirac_ana = nchan_dirac_ana; + pFb_cfg->nchan_fb_in = nchan_fb_in; #endif pFb_cfg->pcm_offset = 0; /* note: in SPAR decoder, this parameter is overwritten later */ @@ -223,7 +223,7 @@ 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_dirac_ana ); + num_chs_alloc = max( fb_cfg->num_in_chans, fb_cfg->nchan_fb_in ); #else num_chs_alloc = fb_cfg->num_in_chans; #endif @@ -231,7 +231,7 @@ ivas_error ivas_FB_mixer_open( else { #ifdef HODIRAC - num_chs_alloc = max( fb_cfg->num_out_chans, fb_cfg->nchan_dirac_ana ); + num_chs_alloc = max( fb_cfg->num_out_chans, fb_cfg->nchan_fb_in ); #else num_chs_alloc = fb_cfg->num_out_chans; #endif @@ -267,7 +267,7 @@ ivas_error ivas_FB_mixer_open( else { #ifdef HODIRAC - num_chs_alloc = max( fb_cfg->num_in_chans, fb_cfg->nchan_dirac_ana ); + num_chs_alloc = max( fb_cfg->num_in_chans, fb_cfg->nchan_fb_in ); #else num_chs_alloc = fb_cfg->num_in_chans; #endif @@ -288,7 +288,7 @@ ivas_error ivas_FB_mixer_open( if ( ( pTemp_mem = (float *) malloc( sizeof( float ) * fb_cfg->num_out_chans * #ifdef HODIRAC - max( fb_cfg->num_in_chans, fb_cfg->nchan_dirac_ana ) * + max( fb_cfg->num_in_chans, fb_cfg->nchan_fb_in ) * #else fb_cfg->num_in_chans * #endif @@ -404,7 +404,7 @@ 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_dirac_ana ); + num_chs_alloc = max( fb_cfg->num_in_chans, fb_cfg->nchan_fb_in ); #else num_chs_alloc = fb_cfg->num_in_chans; #endif @@ -412,7 +412,7 @@ void ivas_FB_mixer_close( else { #ifdef HODIRAC - num_chs_alloc = max( fb_cfg->num_out_chans, fb_cfg->nchan_dirac_ana ); + num_chs_alloc = max( fb_cfg->num_out_chans, fb_cfg->nchan_fb_in ); #else num_chs_alloc = fb_cfg->num_out_chans; #endif @@ -442,7 +442,7 @@ void ivas_FB_mixer_close( else { #ifdef HODIRAC - num_chs_alloc = max( fb_cfg->num_in_chans, fb_cfg->nchan_dirac_ana ); + num_chs_alloc = max( fb_cfg->num_in_chans, fb_cfg->nchan_fb_in ); #else num_chs_alloc = fb_cfg->num_in_chans; #endif @@ -545,7 +545,7 @@ void ivas_fb_mixer_pcm_ingest( { mvr2r( &hFbMixer->ppFilterbank_prior_input[i][fb_cfg->prior_input_length - frame_len], ppOut_pcm[i], frame_len ); #ifdef HODIRAC - mvr2r( pcm_in[HOA_keep_ind[i]], &ppOut_pcm[i][frame_len], frame_len ); + mvr2r( pcm_in[HOA_keep_ind_spar[i]], &ppOut_pcm[i][frame_len], frame_len ); #else mvr2r( pcm_in[i], &ppOut_pcm[i][frame_len], frame_len ); #endif @@ -570,13 +570,17 @@ 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 < #ifdef HODIRAC - max( hFbMixer->fb_cfg->num_in_chans, hFbMixer->fb_cfg->nchan_dirac_ana ); + nchan_fb_in; #else hFbMixer->fb_cfg->num_in_chans; #endif @@ -605,7 +609,7 @@ void ivas_fb_mixer_get_windowed_fr( const int16_t mdft_len /* i : MDFT frame length */ #ifdef HODIRAC , - const int16_t hodirac /* i: flag for skipping non-planar 3rd-order ambisonic channels*/ + int16_t nchan_fb_in #endif ) { @@ -615,10 +619,6 @@ void ivas_fb_mixer_get_windowed_fr( float fr_in_block[L_FRAME48k * 2]; const float *win_ptr; -#ifdef HODIRAC - int16_t nchan_ana = max( hFbMixer->fb_cfg->nchan_dirac_ana, hFbMixer->fb_cfg->num_in_chans ); -#endif - n_old_samples = min( ( hFbMixer->fb_cfg->prior_input_length - hFbMixer->fb_cfg->windowed_fr_offset ), ( 2 * mdft_len ) ); n_new_samples = max( 0, 2 * length - n_old_samples ); offset = (int16_t) ( 2 * mdft_len - length - hFbMixer->ana_window_offset ); @@ -627,20 +627,13 @@ void ivas_fb_mixer_get_windowed_fr( for ( ch_idx = 0; ch_idx < #ifdef HODIRAC - nchan_ana + nchan_fb_in #else hFbMixer->fb_cfg->num_in_chans #endif ; ch_idx++ ) { -#ifdef HODIRAC - if ( hodirac && ch_idx >= 10 && ch_idx <= 14 ) - { - continue; - } -#endif - 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 ); win_ptr = hFbMixer->pAna_window; diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index ff98f08f9b..dc2a8c008f 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -3216,7 +3216,7 @@ void ivas_dirac_param_est_enc( #ifdef HODIRAC , const int16_t hodirac, - const int16_t nchan_dirac_ana + const int16_t nchan_fb_in #endif ); @@ -5124,6 +5124,10 @@ 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 ); void ivas_fb_mixer_get_windowed_fr( @@ -5135,7 +5139,7 @@ void ivas_fb_mixer_get_windowed_fr( const int16_t mdft_len /* i : MDFT frame length */ #ifdef HODIRAC , - const int16_t hodirac /* i: flag for skipping non-planar 3rd-order ambisonic channels*/ + int16_t nchan_fb_in #endif ); diff --git a/lib_com/ivas_rom_com.c b/lib_com/ivas_rom_com.c index e4e463f63b..e3223012e1 100644 --- a/lib_com/ivas_rom_com.c +++ b/lib_com/ivas_rom_com.c @@ -1484,7 +1484,12 @@ const int16_t remix_order_set[1][IVAS_SPAR_MAX_CH] = { /* WYZX --> WYXZ... */ #endif const int16_t keep_planar[IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS] = { 1, 1, 1, 1 }; +#ifdef HODIRAC +const int16_t HOA_keep_ind[IVAS_SPAR_MAX_FB_IN_CHAN] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 15}; +const int16_t HOA_keep_ind_spar[IVAS_SPAR_MAX_CH] = {0, 1, 2, 3, 4, 8, 9, 10}; +#else const int16_t HOA_keep_ind[IVAS_SPAR_MAX_CH] = {0, 1, 2, 3, 4, 8, 9, 15}; +#endif /*----------------------------------------------------------------------* diff --git a/lib_com/ivas_rom_com.h b/lib_com/ivas_rom_com.h index 813525c11d..3cc20fda5e 100644 --- a/lib_com/ivas_rom_com.h +++ b/lib_com/ivas_rom_com.h @@ -199,7 +199,12 @@ extern const int16_t remix_order_set[1][DIRAC_MAX_ANA_CHANS]; extern const int16_t remix_order_set[1][IVAS_SPAR_MAX_CH]; #endif extern const int16_t keep_planar[IVAS_SPAR_MAX_CH - FOA_CHANNELS]; +#ifdef HODIRAC +extern const int16_t HOA_keep_ind[11]; +extern const int16_t HOA_keep_ind_spar[IVAS_SPAR_MAX_CH]; +#else extern const int16_t HOA_keep_ind[IVAS_SPAR_MAX_CH]; +#endif extern const float dtx_pd_real_min_max[2]; extern const int16_t dtx_pd_real_q_levels[3][3]; diff --git a/lib_com/ivas_stat_com.h b/lib_com/ivas_stat_com.h index 6c9b468dba..2ec4f2346c 100644 --- a/lib_com/ivas_stat_com.h +++ b/lib_com/ivas_stat_com.h @@ -710,7 +710,7 @@ typedef struct ivas_fb_mixer_cfg_t int16_t num_in_chans; int16_t num_out_chans; #ifdef HODIRAC - int16_t nchan_dirac_ana; + int16_t nchan_fb_in; #endif int16_t pcm_offset; int16_t fade_len; /* this sets the stride length; no delay is introduced */ diff --git a/lib_enc/ivas_dirac_enc.c b/lib_enc/ivas_dirac_enc.c index 33dc01670e..04a48e2d9a 100644 --- a/lib_enc/ivas_dirac_enc.c +++ b/lib_enc/ivas_dirac_enc.c @@ -631,7 +631,7 @@ void ivas_dirac_param_est_enc( #ifdef HODIRAC , const int16_t hodirac, - const int16_t nchan_dirac_ana + const int16_t nchan_fb_in #endif ) { @@ -700,7 +700,7 @@ void ivas_dirac_param_est_enc( /* Copy current frame to memory for delay compensation */ #ifdef HODIRAC - for ( i = 0; i < nchan_dirac_ana; i++ ) + for ( i = 0; i < nchan_fb_in; i++ ) #else for ( i = 0; i < DIRAC_MAX_ANA_CHANS; i++ ) #endif @@ -731,13 +731,18 @@ void ivas_dirac_param_est_enc( ivas_fb_mixer_get_windowed_fr( hDirAC->hFbMixer, pcm_in, p_Cldfb_RealBuffer, p_Cldfb_ImagBuffer, l_ts, l_ts #ifdef HODIRAC , - hodirac + hDirAC->hFbMixer->fb_cfg->num_in_chans +#endif + ); + ivas_fb_mixer_update_prior_input( hDirAC->hFbMixer, pcm_in, l_ts +#ifdef HODIRAC + , + hDirAC->hFbMixer->fb_cfg->num_in_chans #endif ); - ivas_fb_mixer_update_prior_input( hDirAC->hFbMixer, pcm_in, l_ts ); #ifdef HODIRAC - for ( i = 0; i < nchan_dirac_ana; i++ ) + for ( i = 0; i < nchan_fb_in; i++ ) #else for ( i = 0; i < DIRAC_MAX_ANA_CHANS; i++ ) #endif @@ -752,7 +757,7 @@ void ivas_dirac_param_est_enc( assert( pp_fr_imag ); #endif #ifdef HODIRAC - for ( i = 0; i < nchan_dirac_ana; i++ ) + for ( i = 0; i < nchan_fb_in; i++ ) #else for ( i = 0; i < DIRAC_MAX_ANA_CHANS; i++ ) #endif diff --git a/lib_enc/ivas_enc_cov_handler.c b/lib_enc/ivas_enc_cov_handler.c index e7b389c6bc..9cad98049b 100644 --- a/lib_enc/ivas_enc_cov_handler.c +++ b/lib_enc/ivas_enc_cov_handler.c @@ -272,8 +272,8 @@ static void ivas_band_cov( { #ifdef HODIRAC - int16_t i1 = HOA_keep_ind[i]; - int16_t j1 = HOA_keep_ind[j]; + int16_t i1 = HOA_keep_ind_spar[i]; + int16_t j1 = HOA_keep_ind_spar[j]; #endif for ( k = 0; k < num_bins; k++ ) diff --git a/lib_enc/ivas_ism_param_enc.c b/lib_enc/ivas_ism_param_enc.c index ec5108def7..056799dcdf 100644 --- a/lib_enc/ivas_ism_param_enc.c +++ b/lib_enc/ivas_ism_param_enc.c @@ -450,11 +450,16 @@ void ivas_param_ism_enc( ivas_fb_mixer_get_windowed_fr( hDirAC->hFbMixer, pcm_in, p_fb_RealBuffer, p_fb_ImagBuffer, l_ts, l_ts #ifdef HODIRAC , - 0 + hDirAC->hFbMixer->fb_cfg->num_in_chans #endif ); - ivas_fb_mixer_update_prior_input( hDirAC->hFbMixer, pcm_in, l_ts ); + ivas_fb_mixer_update_prior_input( hDirAC->hFbMixer, pcm_in, l_ts +#ifdef HODIRAC + , + hDirAC->hFbMixer->fb_cfg->num_in_chans +#endif + ); #ifdef NCHAN_ISM_PARAMETER for ( i = 0; i < nchan_ism; i++ ) diff --git a/lib_enc/ivas_mc_param_enc.c b/lib_enc/ivas_mc_param_enc.c index cce33e9a5b..58eae8c0e4 100644 --- a/lib_enc/ivas_mc_param_enc.c +++ b/lib_enc/ivas_mc_param_enc.c @@ -678,7 +678,12 @@ static void ivas_param_mc_param_est_enc( for ( ts = 0; ts < start_ts; ts++ ) { - ivas_fb_mixer_update_prior_input( hParamMC->hFbMixer, pcm_in, l_ts ); + ivas_fb_mixer_update_prior_input( hParamMC->hFbMixer, pcm_in, l_ts +#ifdef HODIRAC + , + hParamMC->hFbMixer->fb_cfg->num_in_chans +#endif + ); for ( i = 0; i < nchan_input; i++ ) { pcm_in[i] += l_ts; @@ -690,10 +695,15 @@ static void ivas_param_mc_param_est_enc( ivas_fb_mixer_get_windowed_fr( hParamMC->hFbMixer, pcm_in, p_slot_frame_f_real, p_slot_frame_f_imag, l_ts, 2 * l_ts #ifdef HODIRAC , - 0 + hParamMC->hFbMixer->fb_cfg->num_in_chans +#endif + ); + ivas_fb_mixer_update_prior_input( hParamMC->hFbMixer, pcm_in, l_ts +#ifdef HODIRAC + , + hParamMC->hFbMixer->fb_cfg->num_in_chans #endif ); - ivas_fb_mixer_update_prior_input( hParamMC->hFbMixer, pcm_in, l_ts ); for ( i = 0; i < nchan_input; i++ ) { pcm_in[i] += l_ts; diff --git a/lib_enc/ivas_mcmasa_enc.c b/lib_enc/ivas_mcmasa_enc.c index 271ab03359..736623672f 100644 --- a/lib_enc/ivas_mcmasa_enc.c +++ b/lib_enc/ivas_mcmasa_enc.c @@ -848,10 +848,15 @@ void ivas_mcmasa_param_est_enc( ivas_fb_mixer_get_windowed_fr( hMcMasa->hFbMixer, pcm_in, p_Chnl_RealBuffer, p_Chnl_ImagBuffer, l_ts, l_ts #ifdef HODIRAC , - 0 + hMcMasa->hFbMixer->fb_cfg->num_in_chans +#endif + ); + ivas_fb_mixer_update_prior_input( hMcMasa->hFbMixer, pcm_in, l_ts +#ifdef HODIRAC + , + hMcMasa->hFbMixer->fb_cfg->num_in_chans #endif ); - ivas_fb_mixer_update_prior_input( hMcMasa->hFbMixer, pcm_in, l_ts ); for ( i = 0; i < numAnalysisChannels; i++ ) { pcm_in[i] += l_ts; @@ -1729,10 +1734,15 @@ static void computeLfeEnergy( ivas_fb_mixer_get_windowed_fr( hMcMasa->hFbMixerLfe, pcm_in, p_Chnl_RealBuffer, p_Chnl_ImagBuffer, l_ts, l_ts #ifdef HODIRAC , - 0 + hMcMasa->hFbMixerLfe->fb_cfg->num_in_chans +#endif + ); + ivas_fb_mixer_update_prior_input( hMcMasa->hFbMixerLfe, pcm_in, l_ts +#ifdef HODIRAC + , + hMcMasa->hFbMixerLfe->fb_cfg->num_in_chans #endif ); - ivas_fb_mixer_update_prior_input( hMcMasa->hFbMixerLfe, pcm_in, l_ts ); pcm_in[0] += l_ts; /* Compute low frequency energy for LFE, for other channels it is computed in ivas_chnl_param_est_enc() */ diff --git a/lib_enc/ivas_sba_enc.c b/lib_enc/ivas_sba_enc.c index 11cb280073..4b83f3881f 100644 --- a/lib_enc/ivas_sba_enc.c +++ b/lib_enc/ivas_sba_enc.c @@ -246,8 +246,24 @@ ivas_error ivas_sba_enc_reconfigure( if ( ( sba_mode_old != st_ivas->sba_mode ) || ( nchan_transport_old != st_ivas->nchan_transport ) ) { #ifdef HODIRAC - int16_t nchan_dirac_ana; - nchan_dirac_ana = ( st_ivas->sba_analysis_order + 1 ) * ( st_ivas->sba_analysis_order + 1 ); + int16_t nchan_fb_in; + nchan_fb_in = 0; + if ( st_ivas->sba_analysis_order == 1 ) + { + nchan_fb_in = FOA_CHANNELS; + } + else if ( st_ivas->sba_analysis_order == 2 ) + { + nchan_fb_in = 9; + } + else if ( st_ivas->sba_analysis_order == 3 ) + { + nchan_fb_in = 11; + } + else + { + assert( 0 && "sba_order must be 1,2, or 3!" ); + } #endif /* FB mixer handle */ if ( st_ivas->sba_mode == SBA_MODE_SPAR ) @@ -277,14 +293,14 @@ ivas_error ivas_sba_enc_reconfigure( if ( ( error = ivas_fb_set_cfg( &fb_cfg, SBA_FORMAT, SBA_MODE_DIRAC, #ifdef HODIRAC - nchan_dirac_ana, + nchan_fb_in, #else DIRAC_MAX_ANA_CHANS, #endif 0, 0, hEncoderConfig->input_Fs #ifdef HODIRAC , - nchan_dirac_ana + nchan_fb_in #endif ) ) != IVAS_ERR_OK ) { diff --git a/lib_enc/ivas_spar_encoder.c b/lib_enc/ivas_spar_encoder.c index 84bedf8f91..838680c791 100644 --- a/lib_enc/ivas_spar_encoder.c +++ b/lib_enc/ivas_spar_encoder.c @@ -67,7 +67,7 @@ ivas_error ivas_spar_enc_open( IVAS_FB_CFG *fb_cfg; int16_t nchan_inp, nchan_transport, sba_order_internal; #ifdef HODIRAC - int16_t nchan_dirac_ana; + int16_t nchan_fb_in; #endif int16_t table_idx, active_w_mixing; int32_t input_Fs, ivas_total_brate; @@ -93,7 +93,23 @@ ivas_error ivas_spar_enc_open( ivas_total_brate = hEncoderConfig->ivas_total_brate; #ifdef HODIRAC - nchan_dirac_ana = ( st_ivas->sba_analysis_order + 1 ) * ( st_ivas->sba_analysis_order + 1 ); + nchan_fb_in = 0; + if ( st_ivas->sba_analysis_order == 1 ) + { + nchan_fb_in = FOA_CHANNELS; + } + else if ( st_ivas->sba_analysis_order == 2 ) + { + nchan_fb_in = 9; + } + else if ( st_ivas->sba_analysis_order == 3 ) + { + nchan_fb_in = 11; + } + else + { + assert( 0 && "sba_order must be 1,2, or 3!" ); + } #endif nchan_transport = ivas_get_sba_num_TCs( hEncoderConfig->ivas_total_brate, sba_order_internal ); @@ -112,7 +128,7 @@ ivas_error ivas_spar_enc_open( ivas_fb_set_cfg( &fb_cfg, SBA_FORMAT, SBA_MODE_SPAR, nchan_inp, nchan_transport, active_w_mixing, input_Fs #ifdef HODIRAC , - nchan_dirac_ana + nchan_fb_in #endif ); fb_cfg->remix_order = remix_order_set[hSpar->hMdEnc->spar_md_cfg.remix_unmix_order]; @@ -428,7 +444,7 @@ static ivas_error ivas_spar_enc_process( float dir[3], avg_dir[3]; float energySum, vecLen; #ifdef HODIRAC - int16_t nchan_dirac_ana; + int16_t nchan_fb_in; #endif push_wmops( "ivas_spar_enc_process" ); @@ -448,16 +464,19 @@ static ivas_error ivas_spar_enc_process( nchan_inp = ivas_sba_get_nchan_metadata( sba_order ); assert( nchan_inp <= hEncoderConfig->nchan_inp ); #ifdef HODIRAC - nchan_dirac_ana = hSpar->hFbMixer->fb_cfg->nchan_dirac_ana; + nchan_fb_in = hSpar->hFbMixer->fb_cfg->nchan_fb_in; nchan_transport = st_ivas->nchan_transport; #endif -#ifndef HODIRAC +#ifdef HODIRAC + for ( i = FOA_CHANNELS + 1; i < nchan_fb_in; i++ ) +#else for ( i = FOA_CHANNELS + 1; i < nchan_inp; i++ ) +#endif { mvr2r( data_f[HOA_keep_ind[i]], data_f[i], input_frame ); } -#endif + /*-----------------------------------------------------------------------------------------* * Transient detector @@ -478,7 +497,7 @@ static ivas_error ivas_spar_enc_process( *-----------------------------------------------------------------------------------------*/ #ifdef HODIRAC - for ( i = 0; i < nchan_dirac_ana; i++ ) + for ( i = 0; i < nchan_fb_in; i++ ) #else for ( i = 0; i < nchan_inp; i++ ) #endif @@ -491,7 +510,7 @@ static ivas_error ivas_spar_enc_process( /* prepare Parameter MDFT analysis */ #ifdef HODIRAC - for ( i = 0; i < nchan_dirac_ana; i++ ) + for ( i = 0; i < nchan_fb_in; i++ ) #else for ( i = 0; i < nchan_inp; i++ ) #endif @@ -505,16 +524,21 @@ static ivas_error ivas_spar_enc_process( for ( ts = 0; ts < MAX_PARAM_SPATIAL_SUBFRAMES; ts++ ) { - ivas_fb_mixer_get_windowed_fr( hSpar->hFbMixer, p_pcm_tmp, ppIn_FR_real, ppIn_FR_imag, l_ts, l_ts + ivas_fb_mixer_get_windowed_fr( hSpar->hFbMixer, p_pcm_tmp, ppIn_FR_real, ppIn_FR_imag, l_ts, l_ts #ifdef HODIRAC , - st_ivas->sba_analysis_order > 1 + nchan_fb_in +#endif + ); + ivas_fb_mixer_update_prior_input( hSpar->hFbMixer, p_pcm_tmp, l_ts +#ifdef HODIRAC + , + nchan_fb_in #endif ); - ivas_fb_mixer_update_prior_input( hSpar->hFbMixer, p_pcm_tmp, l_ts ); #ifdef HODIRAC - for ( i = 0; i < nchan_dirac_ana; i++ ) + for ( i = 0; i < nchan_fb_in; i++ ) #else for ( i = 0; i < nchan_inp; i++ ) #endif @@ -527,7 +551,7 @@ static ivas_error ivas_spar_enc_process( /* turn pointers back to the local buffer, needed for the following processing */ #ifdef HODIRAC - for ( i = 0; i < nchan_dirac_ana; i++ ) + for ( i = 0; i < nchan_fb_in; i++ ) #else for ( i = 0; i < nchan_inp; i++ ) #endif @@ -547,7 +571,7 @@ static ivas_error ivas_spar_enc_process( #ifdef HODIRAC , st_ivas->sba_analysis_order > 1, - nchan_dirac_ana + st_ivas->sba_analysis_order > 1 ? HOA2_CHANNELS : FOA_CHANNELS #endif ); -- GitLab From 59cb35263d195d6ce6a330abdbb8bca3017d4eb5 Mon Sep 17 00:00:00 2001 From: rtyag Date: Wed, 12 Apr 2023 15:24:06 +1000 Subject: [PATCH 04/66] temp workaround to avoid crash in transform_azimuth_dir2() when dir1 azimuth is 180 and dir0 azimuth is -180 --- lib_com/options.h | 2 +- lib_enc/ivas_qmetadata_enc.c | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 564e65b5b6..34e314c299 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -149,7 +149,7 @@ #define NCHAN_ISM_PARAMETER /* VA: make 'nchan_ism' parameter part of st_ivas/hEncoderConfig */ #define HODIRAC /* FhG: Sector-based HO-DirAC method for SBA at high bitrates */ - +#define HODIRAC_CRASH_FIX #ifdef HODIRAC_DEBUG //#define HODIRAC_WRITE_PARAMS ///#define HODIRAC_READ_PARAMS diff --git a/lib_enc/ivas_qmetadata_enc.c b/lib_enc/ivas_qmetadata_enc.c index 2a47ec1932..6f30a9986c 100644 --- a/lib_enc/ivas_qmetadata_enc.c +++ b/lib_enc/ivas_qmetadata_enc.c @@ -4931,6 +4931,16 @@ static void transform_azimuth_dir2( { hQMetaData->q_direction[1].band_data[i].azimuth[b] += 360; } +#ifdef HODIRAC_CRASH_FIX + if ( hQMetaData->q_direction[1].band_data[i].azimuth[b] >= 180 ) + { + hQMetaData->q_direction[1].band_data[i].azimuth[b] -= 360; + } + if ( hQMetaData->q_direction[1].band_data[i].azimuth[b] < -180 ) + { + hQMetaData->q_direction[1].band_data[i].azimuth[b] += 360; + } +#endif #ifdef DEBUGGING assert( hQMetaData->q_direction[1].band_data[i].azimuth[b] < 180 && hQMetaData->q_direction[1].band_data[i].azimuth[b] >= -180 ); #endif -- GitLab From e1fb1132f749323d238c286f94014cc6a3a4a447 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Tue, 11 Apr 2023 16:54:44 +0200 Subject: [PATCH 05/66] fix DirAC parameter array size --- lib_enc/ivas_dirac_enc.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib_enc/ivas_dirac_enc.c b/lib_enc/ivas_dirac_enc.c index 04a48e2d9a..68f387151f 100644 --- a/lib_enc/ivas_dirac_enc.c +++ b/lib_enc/ivas_dirac_enc.c @@ -655,10 +655,10 @@ void ivas_dirac_param_est_enc( float reference_power[CLDFB_NO_COL_MAX][DIRAC_NO_FB_BANDS_MAX]; #ifdef HODIRAC - float azi_secs[4 * DIRAC_MAX_ANA_CHANS * DIRAC_MAX_NBANDS] = { 0 }; - float ele_secs[4 * DIRAC_MAX_ANA_CHANS * DIRAC_MAX_NBANDS] = { 0 }; - float diff_secs[4 * DIRAC_MAX_ANA_CHANS * DIRAC_MAX_NBANDS] = { 0 }; - float ene_secs[4 * DIRAC_MAX_ANA_CHANS * DIRAC_MAX_NBANDS] = { 0 }; + float azi_secs[2 * DIRAC_MAX_ANA_CHANS * DIRAC_MAX_NBANDS] = { 0 }; + float ele_secs[2 * DIRAC_MAX_ANA_CHANS * DIRAC_MAX_NBANDS] = { 0 }; + float diff_secs[2 * DIRAC_MAX_ANA_CHANS * DIRAC_MAX_NBANDS] = { 0 }; + float ene_secs[2 * DIRAC_MAX_ANA_CHANS * DIRAC_MAX_NBANDS] = { 0 }; #endif #ifdef HODIRAC_WRITE_PARAMS -- GitLab From 724771bf5e542c5c01993dd2a94c35aa5e2d044b Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Wed, 12 Apr 2023 09:28:45 +0200 Subject: [PATCH 06/66] disable unnecessary direction-vector calculation in HO-DirAC estimator --- lib_enc/ivas_dirac_enc.c | 88 +++++++++++++++++++++++----------------- 1 file changed, 50 insertions(+), 38 deletions(-) diff --git a/lib_enc/ivas_dirac_enc.c b/lib_enc/ivas_dirac_enc.c index 68f387151f..fe74eef58f 100644 --- a/lib_enc/ivas_dirac_enc.c +++ b/lib_enc/ivas_dirac_enc.c @@ -728,13 +728,13 @@ void ivas_dirac_param_est_enc( { if ( hDirAC->hFbMixer ) { - ivas_fb_mixer_get_windowed_fr( hDirAC->hFbMixer, pcm_in, p_Cldfb_RealBuffer, p_Cldfb_ImagBuffer, l_ts, l_ts + ivas_fb_mixer_get_windowed_fr( hDirAC->hFbMixer, pcm_in, p_Cldfb_RealBuffer, p_Cldfb_ImagBuffer, l_ts, l_ts #ifdef HODIRAC , hDirAC->hFbMixer->fb_cfg->num_in_chans #endif ); - ivas_fb_mixer_update_prior_input( hDirAC->hFbMixer, pcm_in, l_ts + ivas_fb_mixer_update_prior_input( hDirAC->hFbMixer, pcm_in, l_ts #ifdef HODIRAC , hDirAC->hFbMixer->fb_cfg->num_in_chans @@ -796,15 +796,20 @@ void ivas_dirac_param_est_enc( num_freq_bands, intensity_real ); - computeDirectionVectors( - intensity_real[0], - intensity_real[1], - intensity_real[2], - hDirAC->hConfig->enc_param_start_band, - num_freq_bands, - direction_vector[0], - direction_vector[1], - direction_vector[2] ); +#ifdef HODIRAC + if ( !hodirac ) +#endif + { + computeDirectionVectors( + intensity_real[0], + intensity_real[1], + intensity_real[2], + hDirAC->hConfig->enc_param_start_band, + num_freq_bands, + direction_vector[0], + direction_vector[1], + direction_vector[2] ); + } /* fill buffers of length "averaging_length" time slots for intensity and energy */ hDirAC->index_buffer_intensity = ( hDirAC->index_buffer_intensity % hDirAC->no_col_avg_diff ) + 1; /* averaging_length = 32 */ @@ -863,38 +868,45 @@ void ivas_dirac_param_est_enc( } } - for ( band_m_idx = 0; band_m_idx < hDirAC->hConfig->nbands; band_m_idx++ ) +#ifdef HODIRAC + if ( !hodirac ) +#endif + { - renormalization_factor[band_m_idx] = EPSILON; - for ( d = 0; d < DIRAC_NUM_DIMS; d++ ) - { - renormalization_factor[band_m_idx] += ( hDirAC->direction_vector_m[d][block_m_idx][band_m_idx] * hDirAC->direction_vector_m[d][block_m_idx][band_m_idx] ); - } - renormalization_factor[band_m_idx] = sqrtf( renormalization_factor[band_m_idx] ); - if ( renormalization_factor[band_m_idx] > EPSILON ) - { - hDirAC->direction_vector_m[0][block_m_idx][band_m_idx] /= renormalization_factor[band_m_idx]; - hDirAC->direction_vector_m[1][block_m_idx][band_m_idx] /= renormalization_factor[band_m_idx]; - hDirAC->direction_vector_m[2][block_m_idx][band_m_idx] /= renormalization_factor[band_m_idx]; - } - else + for ( band_m_idx = 0; band_m_idx < hDirAC->hConfig->nbands; band_m_idx++ ) { - hDirAC->direction_vector_m[0][block_m_idx][band_m_idx] = 1; - hDirAC->direction_vector_m[1][block_m_idx][band_m_idx] = 0; - hDirAC->direction_vector_m[2][block_m_idx][band_m_idx] = 0; - } + renormalization_factor[band_m_idx] = EPSILON; + for ( d = 0; d < DIRAC_NUM_DIMS; d++ ) + { + renormalization_factor[band_m_idx] += ( hDirAC->direction_vector_m[d][block_m_idx][band_m_idx] * hDirAC->direction_vector_m[d][block_m_idx][band_m_idx] ); + } + renormalization_factor[band_m_idx] = sqrtf( renormalization_factor[band_m_idx] ); - /* save the elevation and azimuth values to be used later by the ivas_dirac_QuantizeParameters function */ - for ( d = 0; d < DIRAC_NUM_DIMS; d++ ) - { - dir_v[d] = hDirAC->direction_vector_m[d][block_m_idx][band_m_idx]; - } + if ( renormalization_factor[band_m_idx] > EPSILON ) + { + hDirAC->direction_vector_m[0][block_m_idx][band_m_idx] /= renormalization_factor[band_m_idx]; + hDirAC->direction_vector_m[1][block_m_idx][band_m_idx] /= renormalization_factor[band_m_idx]; + hDirAC->direction_vector_m[2][block_m_idx][band_m_idx] /= renormalization_factor[band_m_idx]; + } + else + { + hDirAC->direction_vector_m[0][block_m_idx][band_m_idx] = 1; + hDirAC->direction_vector_m[1][block_m_idx][band_m_idx] = 0; + hDirAC->direction_vector_m[2][block_m_idx][band_m_idx] = 0; + } - ivas_qmetadata_direction_vector_to_azimuth_elevation( - dir_v, - &q_direction->band_data[band_m_idx].azimuth[block_m_idx], - &q_direction->band_data[band_m_idx].elevation[block_m_idx] ); + /* save the elevation and azimuth values to be used later by the ivas_dirac_QuantizeParameters function */ + for ( d = 0; d < DIRAC_NUM_DIMS; d++ ) + { + dir_v[d] = hDirAC->direction_vector_m[d][block_m_idx][band_m_idx]; + } + + ivas_qmetadata_direction_vector_to_azimuth_elevation( + dir_v, + &q_direction->band_data[band_m_idx].azimuth[block_m_idx], + &q_direction->band_data[band_m_idx].elevation[block_m_idx] ); + } } /* Sectors */ #ifdef HODIRAC -- GitLab From 17f468a60531cbb60bdb6cfa8fc44af42b71d869 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Wed, 12 Apr 2023 10:32:18 +0200 Subject: [PATCH 07/66] optimize DirAC parameter estimation in the encoder --- lib_com/ivas_dirac_com.c | 193 +++++++++++++++++++++++++-------------- 1 file changed, 122 insertions(+), 71 deletions(-) diff --git a/lib_com/ivas_dirac_com.c b/lib_com/ivas_dirac_com.c index ca68604d76..76aa036be8 100644 --- a/lib_com/ivas_dirac_com.c +++ b/lib_com/ivas_dirac_com.c @@ -867,7 +867,7 @@ void calculate_hodirac_sector_parameters( { int16_t i_sec, i_bin, i_band; - float p_real, p_imag, normI, energy, theta, phi, tmp_diff; + float p_real, p_imag, normI, energy, tmp_diff; float sec_w_real[NUM_ANA_SECTORS]; float sec_x_real[NUM_ANA_SECTORS]; float sec_y_real[NUM_ANA_SECTORS]; @@ -907,115 +907,166 @@ void calculate_hodirac_sector_parameters( float *p_sec_y_imag = &sec_y_imag[i_sec]; float *p_sec_z_imag = &sec_z_imag[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++ ) { - sec_I_vec_x[i_sec] = 0.f; - sec_I_vec_y[i_sec] = 0.f; - sec_I_vec_z[i_sec] = 0.f; + 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; - for ( i_bin = band_grouping[i_band]; i_bin < band_grouping[i_band + 1]; i_bin++ ) + if ( i_sec == 0 ) { - if ( i_sec == 0 ) + for ( i_bin = band_grouping[i_band]; i_bin < band_grouping[i_band + 1]; i_bin++ ) { - *p_sec_w_imag = 1.772454f * ImagBuffer[0][i_bin] + 1.772454f * ImagBuffer[1][i_bin]; - *p_sec_x_imag = 1.772454f * ImagBuffer[3][i_bin] + 1.023326f * ImagBuffer[4][i_bin]; - *p_sec_y_imag = 0.590818f * ImagBuffer[0][i_bin] + 1.772454f * ImagBuffer[1][i_bin] - 0.590817f * ImagBuffer[6][i_bin] - 1.023326f * ImagBuffer[8][i_bin]; - *p_sec_z_imag = 1.772454f * ImagBuffer[2][i_bin] + 1.023326f * ImagBuffer[5][i_bin]; - - *p_sec_w_real = 1.772454f * RealBuffer[0][i_bin] + 1.772454f * RealBuffer[1][i_bin]; - *p_sec_x_real = 1.772454f * RealBuffer[3][i_bin] + 1.023326f * RealBuffer[4][i_bin]; - *p_sec_y_real = 0.590818f * RealBuffer[0][i_bin] + 1.772454f * RealBuffer[1][i_bin] - 0.590817f * RealBuffer[6][i_bin] - 1.023326f * RealBuffer[8][i_bin]; - *p_sec_z_real = 1.772454f * RealBuffer[2][i_bin] + 1.023326f * RealBuffer[5][i_bin]; + float w = *( p_c_weights++ ); + + + *p_sec_w_imag = 1.772454f * *( p_ImagBuffer_0 ) + 1.772454f * *( p_ImagBuffer_1 ); + *p_sec_x_imag = 1.772454f * *( p_ImagBuffer_3++ ) + 1.023326f * *( p_ImagBuffer_4++ ); + *p_sec_y_imag = 0.590818f * *( p_ImagBuffer_0++ ) + 1.772454f * *( p_ImagBuffer_1++ ) - 0.590817f * *( p_ImagBuffer_6++ ) - 1.023326f * *( p_ImagBuffer_8++ ); + *p_sec_z_imag = 1.772454f * *( p_ImagBuffer_2++ ) + 1.023326f * *( p_ImagBuffer_5++ ); + + *p_sec_w_real = 1.772454f * *( p_RealBuffer_0 ) + 1.772454f * *( p_RealBuffer_1 ); + *p_sec_x_real = 1.772454f * *( p_RealBuffer_3++ ) + 1.023326f * *( p_RealBuffer_4++ ); + *p_sec_y_real = 0.590818f * *( p_RealBuffer_0++ ) + 1.772454f * *( p_RealBuffer_1++ ) - 0.590817f * *( p_RealBuffer_6++ ) - 1.023326f * *( p_RealBuffer_8++ ); + *p_sec_z_real = 1.772454f * *( p_RealBuffer_2++ ) + 1.023326f * *( p_RealBuffer_5++ ); + + p_real = *p_sec_w_real * w; + p_imag = *p_sec_w_imag * w; + + *p_sec_I_vec_x += p_real * *p_sec_x_real + p_imag * *p_sec_x_imag; + *p_sec_I_vec_y += p_real * *p_sec_y_real + p_imag * *p_sec_y_imag; + *p_sec_I_vec_z += p_real * *p_sec_z_real + p_imag * *p_sec_z_imag; + + energy += 0.5f * ( p_real * p_real + p_imag * p_imag + *p_sec_x_real * *p_sec_x_real + *p_sec_x_imag * *p_sec_x_imag + + *p_sec_y_real * *p_sec_y_real + *p_sec_y_imag * *p_sec_y_imag + + *p_sec_z_real * *p_sec_z_real + *p_sec_z_imag * *p_sec_z_imag ); } - else + } + else + { + for ( i_bin = band_grouping[i_band]; i_bin < band_grouping[i_band + 1]; i_bin++ ) { - *p_sec_w_imag = 1.772454f * ImagBuffer[0][i_bin] - 1.772454f * ImagBuffer[1][i_bin]; - *p_sec_x_imag = 1.772454f * ImagBuffer[3][i_bin] - 1.023326f * ImagBuffer[4][i_bin]; - *p_sec_y_imag = -0.590818f * ImagBuffer[0][i_bin] + 1.772454f * ImagBuffer[1][i_bin] + 0.590817f * ImagBuffer[6][i_bin] + 1.023326f * ImagBuffer[8][i_bin]; - *p_sec_z_imag = 1.772454f * ImagBuffer[2][i_bin] - 1.023326f * ImagBuffer[5][i_bin]; - - *p_sec_w_real = 1.772454f * RealBuffer[0][i_bin] - 1.772454f * RealBuffer[1][i_bin]; - *p_sec_x_real = 1.772454f * RealBuffer[3][i_bin] - 1.023326f * RealBuffer[4][i_bin]; - *p_sec_y_real = -0.590818f * RealBuffer[0][i_bin] + 1.772454f * RealBuffer[1][i_bin] + 0.590817f * RealBuffer[6][i_bin] + 1.023326f * RealBuffer[8][i_bin]; - *p_sec_z_real = 1.772454f * RealBuffer[2][i_bin] - 1.023326f * RealBuffer[5][i_bin]; - } + float w = *( p_c_weights++ ); + + + *p_sec_w_imag = 1.772454f * *(p_ImagBuffer_0) -1.772454f * *( p_ImagBuffer_1 ); + *p_sec_x_imag = 1.772454f * *( p_ImagBuffer_3++ ) - 1.023326f * *( p_ImagBuffer_4++ ); + *p_sec_y_imag = -0.590818f * *( p_ImagBuffer_0++ ) + 1.772454f * *( p_ImagBuffer_1++ ) + 0.590817f * *( p_ImagBuffer_6++ ) + 1.023326f * *( p_ImagBuffer_8++ ); + *p_sec_z_imag = 1.772454f * *( p_ImagBuffer_2++ ) - 1.023326f * *( p_ImagBuffer_5++ ); + + *p_sec_w_real = 1.772454f * *(p_RealBuffer_0) -1.772454f * *( p_RealBuffer_1 ); + *p_sec_x_real = 1.772454f * *( p_RealBuffer_3++ ) - 1.023326f * *( p_RealBuffer_4++ ); + *p_sec_y_real = -0.590818f * *( p_RealBuffer_0++ ) + 1.772454f * *( p_RealBuffer_1++ ) + 0.590817f * *( p_RealBuffer_6++ ) + 1.023326f * *( p_RealBuffer_8++ ); + *p_sec_z_real = 1.772454f * *( p_RealBuffer_2++ ) - 1.023326f * *( p_RealBuffer_5++ ); - // active intensity - p_real = *p_sec_w_real; - p_imag = *p_sec_w_imag; - // freq weighting - p_real *= c_weights[i_bin]; - p_imag *= c_weights[i_bin]; - sec_I_vec_x[i_sec] += p_real * *p_sec_x_real + p_imag * *p_sec_x_imag; - sec_I_vec_y[i_sec] += p_real * *p_sec_y_real + p_imag * *p_sec_y_imag; - sec_I_vec_z[i_sec] += p_real * *p_sec_z_real + p_imag * *p_sec_z_imag; - - energy += 0.5f * ( p_real * p_real + p_imag * p_imag + *p_sec_x_real * *p_sec_x_real + *p_sec_x_imag * *p_sec_x_imag + - *p_sec_y_real * *p_sec_y_real + *p_sec_y_imag * *p_sec_y_imag + - *p_sec_z_real * *p_sec_z_real + *p_sec_z_imag * *p_sec_z_imag ); + p_real = *p_sec_w_real * w; + p_imag = *p_sec_w_imag * w; + + *p_sec_I_vec_x += p_real * *p_sec_x_real + p_imag * *p_sec_x_imag; + *p_sec_I_vec_y += p_real * *p_sec_y_real + p_imag * *p_sec_y_imag; + *p_sec_I_vec_z += p_real * *p_sec_z_real + p_imag * *p_sec_z_imag; + + energy += 0.5f * ( p_real * p_real + p_imag * p_imag + *p_sec_x_real * *p_sec_x_real + *p_sec_x_imag * *p_sec_x_imag + + *p_sec_y_real * *p_sec_y_real + *p_sec_y_imag * *p_sec_y_imag + + *p_sec_z_real * *p_sec_z_real + *p_sec_z_imag * *p_sec_z_imag ); + } } - // time-smoothing if ( firstrun_sector_params ) { - sec_I_vec_smth_x[i_sec][i_band] = sec_I_vec_x[i_sec]; - sec_I_vec_smth_y[i_sec][i_band] = sec_I_vec_y[i_sec]; - sec_I_vec_smth_z[i_sec][i_band] = sec_I_vec_z[i_sec]; - energy_smth[i_sec][i_band] = energy; + *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 { - sec_I_vec_smth_x[i_sec][i_band] = ( 1.0f - beta ) * sec_I_vec_x[i_sec] + beta * sec_I_vec_smth_x[i_sec][i_band]; - sec_I_vec_smth_y[i_sec][i_band] = ( 1.0f - beta ) * sec_I_vec_y[i_sec] + beta * sec_I_vec_smth_y[i_sec][i_band]; - sec_I_vec_smth_z[i_sec][i_band] = ( 1.0f - beta ) * sec_I_vec_z[i_sec] + beta * sec_I_vec_smth_z[i_sec][i_band]; - energy_smth[i_sec][i_band] = ( 1.0f - beta ) * energy + beta * energy_smth[i_sec][i_band]; + 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 ) { - azi[i_sec * N_bands + i_band] = 0.f; - ele[i_sec * N_bands + i_band] = 0.f; - ene[i_sec * N_bands + i_band] = 0.f; - diff[i_sec * N_bands + i_band] = 1.f; + *p_azi = 0.f; + *p_ele = 0.f; + *p_ene = 0.f; + *p_diff = 1.f; } else { - normI = sqrtf( sec_I_vec_smth_x[i_sec][i_band] * sec_I_vec_smth_x[i_sec][i_band] + - sec_I_vec_smth_y[i_sec][i_band] * sec_I_vec_smth_y[i_sec][i_band] + - sec_I_vec_smth_z[i_sec][i_band] * sec_I_vec_smth_z[i_sec][i_band] ); - theta = asinf( sec_I_vec_smth_z[i_sec][i_band] / ( normI + EPSILON ) ); - phi = atan2f( sec_I_vec_smth_y[i_sec][i_band], sec_I_vec_smth_x[i_sec][i_band] ); - azi[i_sec * N_bands + i_band] = phi * _180_OVER_PI; - ele[i_sec * N_bands + i_band] = theta * _180_OVER_PI; - ene[i_sec * N_bands + i_band] = energy_smth[i_sec][i_band]; - diff[i_sec * N_bands + i_band] = 1.f - normI / ( energy_smth[i_sec][i_band] + EPSILON ); + 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 ); } - // post - tmp_diff = diff[i_sec * N_bands + i_band]; - assert( tmp_diff < 1.0001f && tmp_diff > -0.0001f ); + tmp_diff = *p_diff; + if ( tmp_diff < 0.0f ) { - diff[i_sec * N_bands + i_band] = 0.f; + *p_diff = 0.f; } if ( tmp_diff > 0.5f ) { if ( firstrun_sector_params ) { - azi[i_sec * N_bands + i_band] = 0.f; - ele[i_sec * N_bands + i_band] = 0.f; + *p_azi = 0.f; + *p_ele = 0.f; } else { - azi[i_sec * N_bands + i_band] = 2.f * ( 1.f - tmp_diff ) * azi[i_sec * N_bands + i_band] + ( 2.f * tmp_diff - 1.f ) * azi_prev[i_sec * N_bands + i_band]; - ele[i_sec * N_bands + i_band] = 2.f * ( 1.f - tmp_diff ) * ele[i_sec * N_bands + i_band] + ( 2.f * tmp_diff - 1.f ) * ele_prev[i_sec * N_bands + i_band]; + *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 { - azi_prev[i_sec * N_bands + i_band] = azi[i_sec * N_bands + i_band]; - ele_prev[i_sec * N_bands + i_band] = ele[i_sec * N_bands + i_band]; + *p_azi_prev = *p_azi; + *p_ele_prev = *p_ele; } } // i_band } // i_sec -- GitLab From 4c23eaf758d02a8818fc14d3486d749aa11b98ca Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Wed, 12 Apr 2023 13:02:55 +0200 Subject: [PATCH 08/66] disable unnecessary processing --- lib_enc/ivas_dirac_enc.c | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/lib_enc/ivas_dirac_enc.c b/lib_enc/ivas_dirac_enc.c index fe74eef58f..0dfa0d0d30 100644 --- a/lib_enc/ivas_dirac_enc.c +++ b/lib_enc/ivas_dirac_enc.c @@ -854,17 +854,32 @@ void ivas_dirac_param_est_enc( } #endif // HODIRAC - for ( band_m_idx = 0; band_m_idx < hDirAC->hConfig->nbands; band_m_idx++ ) +#ifdef HODIRAC + if ( hodirac ) + { + for ( band_m_idx = 0; band_m_idx < hDirAC->hConfig->nbands; band_m_idx++ ) + { + norm_tmp = reference_power[ts][band_m_idx] * ( 1 - diffuseness_vector[band_m_idx] ); + + hDirAC->diffuseness_m[band_m_idx] += reference_power[ts][band_m_idx] * diffuseness_vector[band_m_idx]; + renormalization_factor_diff[band_m_idx] += reference_power[ts][band_m_idx]; + } + } + else +#endif { - norm_tmp = reference_power[ts][band_m_idx] * ( 1 - diffuseness_vector[band_m_idx] ); + for ( band_m_idx = 0; band_m_idx < hDirAC->hConfig->nbands; band_m_idx++ ) + { + norm_tmp = reference_power[ts][band_m_idx] * ( 1 - diffuseness_vector[band_m_idx] ); - hDirAC->direction_vector_m[0][block_m_idx][band_m_idx] += norm_tmp * direction_vector[0][band_m_idx]; - hDirAC->direction_vector_m[1][block_m_idx][band_m_idx] += norm_tmp * direction_vector[1][band_m_idx]; - hDirAC->direction_vector_m[2][block_m_idx][band_m_idx] += norm_tmp * direction_vector[2][band_m_idx]; - renormalization_factor[band_m_idx] += norm_tmp; + hDirAC->direction_vector_m[0][block_m_idx][band_m_idx] += norm_tmp * direction_vector[0][band_m_idx]; + hDirAC->direction_vector_m[1][block_m_idx][band_m_idx] += norm_tmp * direction_vector[1][band_m_idx]; + hDirAC->direction_vector_m[2][block_m_idx][band_m_idx] += norm_tmp * direction_vector[2][band_m_idx]; + renormalization_factor[band_m_idx] += norm_tmp; - hDirAC->diffuseness_m[band_m_idx] += reference_power[ts][band_m_idx] * diffuseness_vector[band_m_idx]; - renormalization_factor_diff[band_m_idx] += reference_power[ts][band_m_idx]; + hDirAC->diffuseness_m[band_m_idx] += reference_power[ts][band_m_idx] * diffuseness_vector[band_m_idx]; + renormalization_factor_diff[band_m_idx] += reference_power[ts][band_m_idx]; + } } } -- GitLab From 5091abc96c207cbd7a5c59ede58ccf6c307f0a8c Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Wed, 12 Apr 2023 13:04:21 +0200 Subject: [PATCH 09/66] fix formatting in lib_com/ivas_dirac_com.c --- lib_com/ivas_dirac_com.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib_com/ivas_dirac_com.c b/lib_com/ivas_dirac_com.c index 76aa036be8..048054a328 100644 --- a/lib_com/ivas_dirac_com.c +++ b/lib_com/ivas_dirac_com.c @@ -957,7 +957,6 @@ void calculate_hodirac_sector_parameters( { float w = *( p_c_weights++ ); - *p_sec_w_imag = 1.772454f * *( p_ImagBuffer_0 ) + 1.772454f * *( p_ImagBuffer_1 ); *p_sec_x_imag = 1.772454f * *( p_ImagBuffer_3++ ) + 1.023326f * *( p_ImagBuffer_4++ ); *p_sec_y_imag = 0.590818f * *( p_ImagBuffer_0++ ) + 1.772454f * *( p_ImagBuffer_1++ ) - 0.590817f * *( p_ImagBuffer_6++ ) - 1.023326f * *( p_ImagBuffer_8++ ); @@ -986,7 +985,6 @@ void calculate_hodirac_sector_parameters( { float w = *( p_c_weights++ ); - *p_sec_w_imag = 1.772454f * *(p_ImagBuffer_0) -1.772454f * *( p_ImagBuffer_1 ); *p_sec_x_imag = 1.772454f * *( p_ImagBuffer_3++ ) - 1.023326f * *( p_ImagBuffer_4++ ); *p_sec_y_imag = -0.590818f * *( p_ImagBuffer_0++ ) + 1.772454f * *( p_ImagBuffer_1++ ) + 0.590817f * *( p_ImagBuffer_6++ ) + 1.023326f * *( p_ImagBuffer_8++ ); -- GitLab From c53da5ecbd32b7ec380b09868f4a9fe605730ec2 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Wed, 12 Apr 2023 13:33:53 +0200 Subject: [PATCH 10/66] reduce DIRAC_MAX_ANA_CHANS from 16 to 11 --- lib_com/ivas_cnst.h | 2 +- lib_com/ivas_rom_com.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 425ae50e75..b50e4b74e4 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -908,7 +908,7 @@ typedef enum *----------------------------------------------------------------------------------*/ #ifdef HODIRAC -#define DIRAC_MAX_ANA_CHANS 16 /* Maximum number of channels for DirAC analysis */ +#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 diff --git a/lib_com/ivas_rom_com.c b/lib_com/ivas_rom_com.c index e3223012e1..09b3cadef9 100644 --- a/lib_com/ivas_rom_com.c +++ b/lib_com/ivas_rom_com.c @@ -1475,7 +1475,7 @@ const int16_t pr_pd_idx_pairs[3][3][2] = { { { 1, 1 },{ 2, 2 },{ 3, 3 } },{ { 1, #ifdef HODIRAC const int16_t remix_order_set[1][DIRAC_MAX_ANA_CHANS] = { /* WYZX --> WYXZ... */ - { 0, 1, 3, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 } + { 0, 1, 3, 2, 4, 5, 6, 7, 8, 9, 10 } }; #else const int16_t remix_order_set[1][IVAS_SPAR_MAX_CH] = { /* WYZX --> WYXZ... */ -- GitLab From dfb770a142044dbc5a00e152fca408f1da4f0b23 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Wed, 12 Apr 2023 14:31:35 +0200 Subject: [PATCH 11/66] avoid storing filtered sector signals in the estimator --- lib_com/ivas_dirac_com.c | 85 +++++++++++++++++----------------------- 1 file changed, 36 insertions(+), 49 deletions(-) diff --git a/lib_com/ivas_dirac_com.c b/lib_com/ivas_dirac_com.c index 048054a328..e61634ad5f 100644 --- a/lib_com/ivas_dirac_com.c +++ b/lib_com/ivas_dirac_com.c @@ -868,14 +868,6 @@ void calculate_hodirac_sector_parameters( int16_t i_sec, i_bin, i_band; float p_real, p_imag, normI, energy, tmp_diff; - float sec_w_real[NUM_ANA_SECTORS]; - float sec_x_real[NUM_ANA_SECTORS]; - float sec_y_real[NUM_ANA_SECTORS]; - float sec_z_real[NUM_ANA_SECTORS]; - float sec_w_imag[NUM_ANA_SECTORS]; - float sec_x_imag[NUM_ANA_SECTORS]; - float sec_y_imag[NUM_ANA_SECTORS]; - float sec_z_imag[NUM_ANA_SECTORS]; float sec_I_vec_x[NUM_ANA_SECTORS]; float sec_I_vec_y[NUM_ANA_SECTORS]; @@ -897,15 +889,6 @@ void calculate_hodirac_sector_parameters( for ( i_sec = 0; i_sec < NUM_ANA_SECTORS; i_sec++ ) { - float *p_sec_w_real = &sec_w_real[i_sec]; - float *p_sec_x_real = &sec_x_real[i_sec]; - float *p_sec_y_real = &sec_y_real[i_sec]; - float *p_sec_z_real = &sec_z_real[i_sec]; - - float *p_sec_w_imag = &sec_w_imag[i_sec]; - float *p_sec_x_imag = &sec_x_imag[i_sec]; - float *p_sec_y_imag = &sec_y_imag[i_sec]; - float *p_sec_z_imag = &sec_z_imag[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]; @@ -956,27 +939,29 @@ void calculate_hodirac_sector_parameters( 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; - *p_sec_w_imag = 1.772454f * *( p_ImagBuffer_0 ) + 1.772454f * *( p_ImagBuffer_1 ); - *p_sec_x_imag = 1.772454f * *( p_ImagBuffer_3++ ) + 1.023326f * *( p_ImagBuffer_4++ ); - *p_sec_y_imag = 0.590818f * *( p_ImagBuffer_0++ ) + 1.772454f * *( p_ImagBuffer_1++ ) - 0.590817f * *( p_ImagBuffer_6++ ) - 1.023326f * *( p_ImagBuffer_8++ ); - *p_sec_z_imag = 1.772454f * *( p_ImagBuffer_2++ ) + 1.023326f * *( p_ImagBuffer_5++ ); + 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++ ); - *p_sec_w_real = 1.772454f * *( p_RealBuffer_0 ) + 1.772454f * *( p_RealBuffer_1 ); - *p_sec_x_real = 1.772454f * *( p_RealBuffer_3++ ) + 1.023326f * *( p_RealBuffer_4++ ); - *p_sec_y_real = 0.590818f * *( p_RealBuffer_0++ ) + 1.772454f * *( p_RealBuffer_1++ ) - 0.590817f * *( p_RealBuffer_6++ ) - 1.023326f * *( p_RealBuffer_8++ ); - *p_sec_z_real = 1.772454f * *( p_RealBuffer_2++ ) + 1.023326f * *( p_RealBuffer_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 = *p_sec_w_real * w; - p_imag = *p_sec_w_imag * w; + p_real = sec_w_real * w; + p_imag = sec_w_imag * w; - *p_sec_I_vec_x += p_real * *p_sec_x_real + p_imag * *p_sec_x_imag; - *p_sec_I_vec_y += p_real * *p_sec_y_real + p_imag * *p_sec_y_imag; - *p_sec_I_vec_z += p_real * *p_sec_z_real + p_imag * *p_sec_z_imag; + *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 + *p_sec_x_real * *p_sec_x_real + *p_sec_x_imag * *p_sec_x_imag + - *p_sec_y_real * *p_sec_y_real + *p_sec_y_imag * *p_sec_y_imag + - *p_sec_z_real * *p_sec_z_real + *p_sec_z_imag * *p_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 @@ -984,27 +969,29 @@ void calculate_hodirac_sector_parameters( 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; - *p_sec_w_imag = 1.772454f * *(p_ImagBuffer_0) -1.772454f * *( p_ImagBuffer_1 ); - *p_sec_x_imag = 1.772454f * *( p_ImagBuffer_3++ ) - 1.023326f * *( p_ImagBuffer_4++ ); - *p_sec_y_imag = -0.590818f * *( p_ImagBuffer_0++ ) + 1.772454f * *( p_ImagBuffer_1++ ) + 0.590817f * *( p_ImagBuffer_6++ ) + 1.023326f * *( p_ImagBuffer_8++ ); - *p_sec_z_imag = 1.772454f * *( p_ImagBuffer_2++ ) - 1.023326f * *( p_ImagBuffer_5++ ); + 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++ ); - *p_sec_w_real = 1.772454f * *(p_RealBuffer_0) -1.772454f * *( p_RealBuffer_1 ); - *p_sec_x_real = 1.772454f * *( p_RealBuffer_3++ ) - 1.023326f * *( p_RealBuffer_4++ ); - *p_sec_y_real = -0.590818f * *( p_RealBuffer_0++ ) + 1.772454f * *( p_RealBuffer_1++ ) + 0.590817f * *( p_RealBuffer_6++ ) + 1.023326f * *( p_RealBuffer_8++ ); - *p_sec_z_real = 1.772454f * *( p_RealBuffer_2++ ) - 1.023326f * *( p_RealBuffer_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 = *p_sec_w_real * w; - p_imag = *p_sec_w_imag * w; + p_real = sec_w_real * w; + p_imag = sec_w_imag * w; - *p_sec_I_vec_x += p_real * *p_sec_x_real + p_imag * *p_sec_x_imag; - *p_sec_I_vec_y += p_real * *p_sec_y_real + p_imag * *p_sec_y_imag; - *p_sec_I_vec_z += p_real * *p_sec_z_real + p_imag * *p_sec_z_imag; + *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 + *p_sec_x_real * *p_sec_x_real + *p_sec_x_imag * *p_sec_x_imag + - *p_sec_y_real * *p_sec_y_real + *p_sec_y_imag * *p_sec_y_imag + - *p_sec_z_real * *p_sec_z_real + *p_sec_z_imag * *p_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 ); } } -- GitLab From 7432a9fad473d04e411148be60d7b3975bc91539 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Wed, 12 Apr 2023 14:56:33 +0200 Subject: [PATCH 12/66] skip one unnecessary line in HO-DirAC --- lib_enc/ivas_dirac_enc.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib_enc/ivas_dirac_enc.c b/lib_enc/ivas_dirac_enc.c index 0dfa0d0d30..9362e9fee5 100644 --- a/lib_enc/ivas_dirac_enc.c +++ b/lib_enc/ivas_dirac_enc.c @@ -859,8 +859,6 @@ void ivas_dirac_param_est_enc( { for ( band_m_idx = 0; band_m_idx < hDirAC->hConfig->nbands; band_m_idx++ ) { - norm_tmp = reference_power[ts][band_m_idx] * ( 1 - diffuseness_vector[band_m_idx] ); - hDirAC->diffuseness_m[band_m_idx] += reference_power[ts][band_m_idx] * diffuseness_vector[band_m_idx]; renormalization_factor_diff[band_m_idx] += reference_power[ts][band_m_idx]; } -- GitLab From 11891d40862b54ebda36c0f07cbaca1abb99417a Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Mon, 17 Apr 2023 16:43:22 +0200 Subject: [PATCH 13/66] fix direct-gain calculation --- lib_dec/ivas_dirac_output_synthesis_dec.c | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/lib_dec/ivas_dirac_output_synthesis_dec.c b/lib_dec/ivas_dirac_output_synthesis_dec.c index 3b84837bd6..fc1638f492 100755 --- a/lib_dec/ivas_dirac_output_synthesis_dec.c +++ b/lib_dec/ivas_dirac_output_synthesis_dec.c @@ -835,18 +835,15 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( &h_dirac_output_synthesis_state.cy_cross_dir_smooth[ch_idx * num_freq_bands], num_freq_bands ); v_multc( &h_dirac_output_synthesis_state.cy_cross_dir_smooth[ch_idx * num_freq_bands], - h_dirac_output_synthesis_params.diffuse_compensation_factor_decorr - 1.f, - &h_dirac_output_synthesis_state.cy_cross_dir_smooth[ch_idx * num_freq_bands], - num_freq_bands_diff ); - v_multc( &h_dirac_output_synthesis_state.cy_cross_dir_smooth[ch_idx * num_freq_bands + num_freq_bands_diff], h_dirac_output_synthesis_params.diffuse_compensation_factor - 1.f, - &h_dirac_output_synthesis_state.cy_cross_dir_smooth[ch_idx * num_freq_bands + num_freq_bands_diff], - num_freq_bands - num_freq_bands_diff ); + &h_dirac_output_synthesis_state.cy_cross_dir_smooth[ch_idx * num_freq_bands], + num_freq_bands ); for ( l = 0; l < num_freq_bands; l++ ) { h_dirac_output_synthesis_state.cy_cross_dir_smooth[ch_idx * num_freq_bands + l] = sqrtf( 1.f + h_dirac_output_synthesis_state.cy_cross_dir_smooth[ch_idx * num_freq_bands + l] ); } + } /*Directional gain*/ @@ -937,8 +934,8 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( g1 = 0.3679f + onset_filter[l] * ( 0.1175f - 0.3679f ); g2 = ( 1.f - g1 ) * *( p_gains_dir ); g2 += g1 * ( *( p_cy_cross_dir_smooth++ ) ); - g2 = max( g2, 0.85f ); - g2 = min( g2, 1.15f ); + g2 = max( g2, 0.99f ); + g2 = min( g2, 2.0f ); *( p_gains_dir++ ) = g2; } } -- GitLab From 63941ae62b6bbdb057f5acda8176cf1bfd782b1b Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Tue, 18 Apr 2023 14:45:04 +0200 Subject: [PATCH 14/66] restrict direct-gain modifications to HO-DirAC mode --- lib_dec/ivas_dirac_output_synthesis_dec.c | 39 +++++++++++++++++------ 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/lib_dec/ivas_dirac_output_synthesis_dec.c b/lib_dec/ivas_dirac_output_synthesis_dec.c index fc1638f492..34bb6cb32f 100755 --- a/lib_dec/ivas_dirac_output_synthesis_dec.c +++ b/lib_dec/ivas_dirac_output_synthesis_dec.c @@ -843,7 +843,6 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( { h_dirac_output_synthesis_state.cy_cross_dir_smooth[ch_idx * num_freq_bands + l] = sqrtf( 1.f + h_dirac_output_synthesis_state.cy_cross_dir_smooth[ch_idx * num_freq_bands + l] ); } - } /*Directional gain*/ @@ -926,17 +925,37 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( p_cy_cross_dir_smooth = h_dirac_output_synthesis_state.cy_cross_dir_smooth; p_gains_dir = h_dirac_output_synthesis_state.cy_cross_dir_smooth_prev; - /*Direct gains*/ - for ( ch_idx = 0; ch_idx < nchan_transport_foa; ch_idx++ ) +/*Direct gains*/ +#ifdef HODIRAC + if ( hodirac ) { - for ( l = 0; l < num_freq_bands; l++ ) + for ( ch_idx = 0; ch_idx < nchan_transport_foa; ch_idx++ ) { - g1 = 0.3679f + onset_filter[l] * ( 0.1175f - 0.3679f ); - g2 = ( 1.f - g1 ) * *( p_gains_dir ); - g2 += g1 * ( *( p_cy_cross_dir_smooth++ ) ); - g2 = max( g2, 0.99f ); - g2 = min( g2, 2.0f ); - *( p_gains_dir++ ) = g2; + for ( l = 0; l < num_freq_bands; l++ ) + { + g1 = 0.3679f + onset_filter[l] * ( 0.1175f - 0.3679f ); + g2 = ( 1.f - g1 ) * *( p_gains_dir ); + g2 += g1 * ( *( p_cy_cross_dir_smooth++ ) ); + g2 = max( g2, 0.99f ); + g2 = min( g2, 2.0f ); + *( p_gains_dir++ ) = g2; + } + } + } + else +#endif + { + for ( ch_idx = 0; ch_idx < nchan_transport_foa; ch_idx++ ) + { + for ( l = 0; l < num_freq_bands; l++ ) + { + g1 = 0.3679f + onset_filter[l] * ( 0.1175f - 0.3679f ); + g2 = ( 1.f - g1 ) * *( p_gains_dir ); + g2 += g1 * ( *( p_cy_cross_dir_smooth++ ) ); + g2 = max( g2, 0.85f ); + g2 = min( g2, 1.15f ); + *( p_gains_dir++ ) = g2; + } } } -- GitLab From 42eacc6cf0eb7b2871e4a6ba766fb070bb42de68 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Wed, 19 Apr 2023 15:30:17 +0200 Subject: [PATCH 15/66] add a temporary check for the value range of the DoA angles in the estimator for debugging --- lib_com/ivas_dirac_com.c | 4 ++++ lib_com/options.h | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/lib_com/ivas_dirac_com.c b/lib_com/ivas_dirac_com.c index e61634ad5f..815590d95f 100644 --- a/lib_com/ivas_dirac_com.c +++ b/lib_com/ivas_dirac_com.c @@ -1053,6 +1053,10 @@ void calculate_hodirac_sector_parameters( *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 diff --git a/lib_com/options.h b/lib_com/options.h index 34e314c299..b64e3c521a 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -150,7 +150,11 @@ #define HODIRAC /* FhG: Sector-based HO-DirAC method for SBA at high bitrates */ #define HODIRAC_CRASH_FIX + +#define HODIRAC_DEBUG + #ifdef HODIRAC_DEBUG +#define HODIRAC_CHECK_VALUE_RANGE //#define HODIRAC_WRITE_PARAMS ///#define HODIRAC_READ_PARAMS #endif -- GitLab From 5a8ca6f95a8e6c4f33ae82d3644dae56f7343482 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Thu, 20 Apr 2023 11:54:22 +0200 Subject: [PATCH 16/66] disable debug options --- lib_com/ivas_dirac_com.c | 4 ++-- lib_com/options.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib_com/ivas_dirac_com.c b/lib_com/ivas_dirac_com.c index 815590d95f..5afc94a140 100644 --- a/lib_com/ivas_dirac_com.c +++ b/lib_com/ivas_dirac_com.c @@ -1054,8 +1054,8 @@ void calculate_hodirac_sector_parameters( *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 ); + assert( *p_azi >= -180.f && *p_azi <= 180.f ); + assert( *p_ele >= -90.f && *p_ele <= 90.f ); #endif } // i_band } // i_sec diff --git a/lib_com/options.h b/lib_com/options.h index b64e3c521a..38f57377f6 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -151,10 +151,10 @@ #define HODIRAC /* FhG: Sector-based HO-DirAC method for SBA at high bitrates */ #define HODIRAC_CRASH_FIX -#define HODIRAC_DEBUG +/*#define HODIRAC_DEBUG*/ #ifdef HODIRAC_DEBUG -#define HODIRAC_CHECK_VALUE_RANGE +//#define HODIRAC_CHECK_VALUE_RANGE //#define HODIRAC_WRITE_PARAMS ///#define HODIRAC_READ_PARAMS #endif -- GitLab From e1049aefeed80dfe34ca99b1006140e60e2ddb29 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Mon, 3 Apr 2023 14:20:10 +0200 Subject: [PATCH 17/66] implement new prediction formula with sector DoAs --- lib_com/ivas_prot.h | 9 +++ lib_com/ivas_spar_com.c | 120 +++++++++++++++++++++++++++++++++++- lib_com/options.h | 4 +- lib_dec/ivas_spar_md_dec.c | 68 +++++++++++++++++++- lib_enc/ivas_spar_encoder.c | 52 +++++++++++++++- 5 files changed, 242 insertions(+), 11 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index dc2a8c008f..ce8760b06f 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -4185,6 +4185,11 @@ void ivas_get_spar_md_from_dirac( float azi_dirac[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES], float ele_dirac[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES], float diffuseness[IVAS_MAX_NUM_BANDS], +#ifdef HODIRAC + float azi_dirac2[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES], + float ele_dirac2[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES], + float ratio[IVAS_MAX_NUM_BANDS], +#endif const int16_t n_ts, float ***mixer_mat, ivas_spar_md_t *hSpar_md, @@ -4194,6 +4199,10 @@ void ivas_get_spar_md_from_dirac( const int16_t order, const int16_t dtx_vad, float Wscale_d[IVAS_MAX_NUM_BANDS] +#ifdef HODIRAC + , + int16_t hodirac +#endif ); ivas_error ivas_spar_md_dec_open( diff --git a/lib_com/ivas_spar_com.c b/lib_com/ivas_spar_com.c index b1484b97ed..b5eab73d2c 100644 --- a/lib_com/ivas_spar_com.c +++ b/lib_com/ivas_spar_com.c @@ -1640,6 +1640,11 @@ void ivas_get_spar_md_from_dirac( float azi_dirac[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES], float ele_dirac[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES], float diffuseness[IVAS_MAX_NUM_BANDS], +#ifdef HODIRAC + float azi_dirac2[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES], + float ele_dirac2[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES], + float ratio[IVAS_MAX_NUM_BANDS], +#endif const int16_t n_ts, float ***mixer_mat, ivas_spar_md_t *hSpar_md, @@ -1648,12 +1653,21 @@ void ivas_get_spar_md_from_dirac( const int16_t end_band, const int16_t order, const int16_t dtx_vad, - float Wscale_d[IVAS_MAX_NUM_BANDS] ) + float Wscale_d[IVAS_MAX_NUM_BANDS] +#ifdef HODIRAC + , + int16_t hodirac +#endif +) { int16_t num_ch, band, i, j; int16_t block, ch; float response_avg[MAX_OUTPUT_CHANNELS]; float response[MAX_PARAM_SPATIAL_SUBFRAMES][MAX_OUTPUT_CHANNELS]; +#ifdef HODIRAC + float response_avg2[MAX_OUTPUT_CHANNELS]; + float response2[MAX_PARAM_SPATIAL_SUBFRAMES][MAX_OUTPUT_CHANNELS]; +#endif float cov_real_dirac[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS]; float *pCov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; float dm_fv_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS]; @@ -1662,6 +1676,10 @@ void ivas_get_spar_md_from_dirac( float **ppMixer_mat[IVAS_MAX_FB_MIXER_OUT_CH]; float *pMixer_mat[IVAS_MAX_FB_MIXER_OUT_CH][IVAS_MAX_SPAR_FB_MIXER_IN_CH]; float en_ratio_fac, diff_norm_order1, diff_norm_order2, diff_norm_order3; +#ifdef HODIRAC + float w1 = 0; + float w2 = 0; +#endif int16_t ndm, foa_ch, hoa2_ch; float P_dir_fact[IVAS_SPAR_MAX_CH - 1]; const int16_t *remix_order; @@ -1743,15 +1761,34 @@ void ivas_get_spar_md_from_dirac( /*SPAR from DirAC*/ set_f( response_avg, 0.0f, MAX_OUTPUT_CHANNELS ); +#ifdef HODIRAC + if ( hodirac ) + { + set_f( response_avg2, 0.0f, MAX_OUTPUT_CHANNELS ); + } +#endif + if ( n_ts > 1 ) { ivas_dirac_dec_get_response( (int16_t) azi_dirac[band][i_ts], (int16_t) ele_dirac[band][i_ts], response_avg, order ); +#ifdef HODIRAC + if ( hodirac ) + { + ivas_dirac_dec_get_response( (int16_t) azi_dirac2[band][i_ts], (int16_t) ele_dirac2[band][i_ts], response_avg2, order ); + } +#endif } else { for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ ) { ivas_dirac_dec_get_response( (int16_t) azi_dirac[band][block], (int16_t) ele_dirac[band][block], &( response[block][0] ), order ); +#ifdef HODIRAC + if ( hodirac ) + { + ivas_dirac_dec_get_response( (int16_t) azi_dirac2[band][block], (int16_t) ele_dirac2[band][block], &( response2[block][0] ), order ); + } +#endif } /* average responses in all subframes*/ @@ -1806,6 +1843,56 @@ void ivas_get_spar_md_from_dirac( { response_avg[ch] /= norm; } + +#ifdef HODIRAC + if ( hodirac ) + { + + for ( ch = 0; ch < num_ch_order; ch++ ) + { + for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ ) + { + response_avg2[ch] += response2[block][ch]; + } + response_avg2[ch] /= MAX_PARAM_SPATIAL_SUBFRAMES; + } + + norm = 0.0f; + for ( ch = 1; ch < foa_ch; ch++ ) + { + norm += response_avg2[ch] * response_avg2[ch]; + } + norm = max( EPSILON, sqrtf( norm ) ); + for ( ch = 1; ch < foa_ch; ch++ ) + { + response_avg2[ch] /= norm; + } + + /*normalize 2nd order*/ + norm = 0.0f; + for ( ch = foa_ch; ch < min( hoa2_ch_order, num_ch_order ); ch++ ) + { + norm += response_avg2[ch] * response_avg2[ch]; + } + norm = max( EPSILON, sqrtf( norm ) ); + for ( ch = foa_ch; ch < min( hoa2_ch_order, num_ch_order ); ch++ ) + { + response_avg2[ch] /= norm; + } + + /*normalize 3rd order*/ + norm = 0.0f; + for ( ch = hoa2_ch_order; ch < num_ch_order; ch++ ) + { + norm += response_avg2[ch] * response_avg2[ch]; + } + norm = max( EPSILON, sqrtf( norm ) ); + for ( ch = hoa2_ch_order; ch < num_ch_order; ch++ ) + { + response_avg2[ch] /= norm; + } + } +#endif } } @@ -1813,7 +1900,23 @@ void ivas_get_spar_md_from_dirac( { response_avg[i] = response_avg[HOA_keep_ind[i]]; } +#ifdef HODIRAC + if ( hodirac ) + { + for ( i = FOA_CHANNELS + 1; i < num_ch; i++ ) + { + response_avg2[i] = response_avg2[HOA_keep_ind[i]]; + } + } +#endif en_ratio_fac = ( 1.0f - diffuseness[band] ); +#ifdef HODIRAC + if ( hodirac ) + { + w1 = ratio[band] * ratio[band]; + w2 = ( 1.0f - ratio[band] ) * ( 1.0f - ratio[band] ); + } +#endif for ( i = 0; i < num_ch; i++ ) { @@ -1828,8 +1931,10 @@ void ivas_get_spar_md_from_dirac( else { cov_real_dirac[i][j][band] = en_ratio_fac * response_avg[i] * response_avg[j]; + if ( hSpar_md_cfg->nchan_transport <= 2 ) { + cov_real_dirac[i][j][band] *= en_ratio_fac; if ( ( i >= ndm ) && ( dtx_vad == 1 ) ) { @@ -1870,7 +1975,16 @@ void ivas_get_spar_md_from_dirac( } else { - cov_real_dirac[i][j][band] = en_ratio_fac * response_avg[i] * response_avg[j]; +#ifdef HODIRAC + if ( hodirac ) + { + cov_real_dirac[i][j][band] = en_ratio_fac * ( w1 * response_avg[i] * response_avg[j] + w2 * response_avg2[i] * response_avg2[j] ); + } + else +#endif + { + cov_real_dirac[i][j][band] = en_ratio_fac * response_avg[i] * response_avg[j]; + } } } } @@ -1884,7 +1998,7 @@ void ivas_get_spar_md_from_dirac( } } -#ifdef DEBUG_SPAR_WRITE_OUT_COV +#ifdef DEBUG_SBA_MD_DUMP { static FILE *fid = 0; int16_t k = 0; diff --git a/lib_com/options.h b/lib_com/options.h index 38f57377f6..b82c4ca67f 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -151,11 +151,11 @@ #define HODIRAC /* FhG: Sector-based HO-DirAC method for SBA at high bitrates */ #define HODIRAC_CRASH_FIX -/*#define HODIRAC_DEBUG*/ +#define HODIRAC_DEBUG #ifdef HODIRAC_DEBUG //#define HODIRAC_CHECK_VALUE_RANGE -//#define HODIRAC_WRITE_PARAMS +#define HODIRAC_WRITE_PARAMS ///#define HODIRAC_READ_PARAMS #endif diff --git a/lib_dec/ivas_spar_md_dec.c b/lib_dec/ivas_spar_md_dec.c index 67460100e3..de18094e90 100644 --- a/lib_dec/ivas_spar_md_dec.c +++ b/lib_dec/ivas_spar_md_dec.c @@ -1389,7 +1389,7 @@ void ivas_spar_dec_gen_umx_mat( } } -#if DEBUG_SBA_MD_DUMP +#ifdef DEBUG_SBA_MD_DUMP { static FILE *f_mat = 0; @@ -2542,6 +2542,11 @@ void ivas_spar_to_dirac( int16_t sba_order_internal; float azi_dirac[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES]; float ele_dirac[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES]; +#ifdef HODIRAC + float azi_dirac2[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES]; + float ele_dirac2[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES]; + float ratio[IVAS_MAX_NUM_BANDS]; +#endif int16_t azi[IVAS_MAX_NUM_BANDS]; int16_t ele[IVAS_MAX_NUM_BANDS]; float dvx[IVAS_MAX_NUM_BANDS], dvy[IVAS_MAX_NUM_BANDS], dvz[IVAS_MAX_NUM_BANDS]; @@ -2739,15 +2744,50 @@ void ivas_spar_to_dirac( } azi_dirac[band][block] = st_ivas->hQMetaData->q_direction->band_data[dirac_band_idx].azimuth[block]; ele_dirac[band][block] = st_ivas->hQMetaData->q_direction->band_data[dirac_band_idx].elevation[block]; +#ifdef HODIRAC + if ( st_ivas->sba_analysis_order > 1 ) + { + azi_dirac2[band][block] = st_ivas->hQMetaData->q_direction[1].band_data[dirac_band_idx].azimuth[block]; + ele_dirac2[band][block] = st_ivas->hQMetaData->q_direction[1].band_data[dirac_band_idx].elevation[block]; + } +#endif } diffuseness[band] = 1.0f - st_ivas->hQMetaData->q_direction->band_data[dirac_band_idx].energy_ratio[0]; +#ifdef HODIRAC + if ( st_ivas->sba_analysis_order > 1 ) + { + ratio[band] = st_ivas->hQMetaData->q_direction[1].band_data[dirac_band_idx].energy_ratio[0]; + } +#endif } /* DirAC MD averaged over 4 subframes and converted to SPAR format similar to encoder processing */ if ( hMdDec->spar_md_cfg.nchan_transport > 1 ) { - ivas_get_spar_md_from_dirac( azi_dirac, ele_dirac, diffuseness, 1, NULL, &hMdDec->spar_md, &hMdDec->spar_md_cfg, end_band, num_bands_out, ( hMdDec->spar_hoa_md_flag ) ? 1 : sba_order_internal, dtx_vad, NULL ); + ivas_get_spar_md_from_dirac( + azi_dirac, + ele_dirac, + diffuseness, +#ifdef HODIRAC + azi_dirac2, + ele_dirac2, + ratio, +#endif + 1, + NULL, + &hMdDec->spar_md, + &hMdDec->spar_md_cfg, + end_band, + num_bands_out, + ( hMdDec->spar_hoa_md_flag ) ? 1 : sba_order_internal, + dtx_vad, + NULL +#ifdef HODIRAC + , + st_ivas->sba_analysis_order > 1 +#endif + ); /* temporarily copy frame-wise prediction coefficients in DirAC bands*/ for ( pred_idx = 0; pred_idx < FOA_CHANNELS - 1; pred_idx++ ) @@ -2759,7 +2799,29 @@ void ivas_spar_to_dirac( } } - ivas_get_spar_md_from_dirac( azi_dirac, ele_dirac, diffuseness, MAX_PARAM_SPATIAL_SUBFRAMES, NULL, &hMdDec->spar_md, &hMdDec->spar_md_cfg, end_band, num_bands_out, ( hMdDec->spar_hoa_md_flag ) ? 1 : sba_order_internal, dtx_vad, NULL ); + ivas_get_spar_md_from_dirac( + azi_dirac, + ele_dirac, + diffuseness, +#ifdef HODIRAC + azi_dirac2, + ele_dirac2, + ratio, +#endif + MAX_PARAM_SPATIAL_SUBFRAMES, + NULL, + &hMdDec->spar_md, + &hMdDec->spar_md_cfg, + end_band, + num_bands_out, + ( hMdDec->spar_hoa_md_flag ) ? 1 : sba_order_internal, + dtx_vad, + NULL +#ifdef HODIRAC + , + st_ivas->sba_analysis_order > 1 +#endif + ); /* expand DirAC TC 20ms MD for residual channels to all subframes*/ for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ ) diff --git a/lib_enc/ivas_spar_encoder.c b/lib_enc/ivas_spar_encoder.c index 838680c791..50735f262c 100644 --- a/lib_enc/ivas_spar_encoder.c +++ b/lib_enc/ivas_spar_encoder.c @@ -721,6 +721,11 @@ static ivas_error ivas_spar_enc_process( { float azi_dirac[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES]; float ele_dirac[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES]; +#ifdef HODIRAC + float azi_dirac2[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES]; + float ele_dirac2[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES]; + float ratio[IVAS_MAX_NUM_BANDS]; +#endif float diffuseness[IVAS_MAX_NUM_BANDS]; float Wscale_d[IVAS_MAX_NUM_BANDS]; int16_t d_start_band, d_end_band; @@ -734,10 +739,31 @@ static ivas_error ivas_spar_enc_process( dirac_band_idx = hSpar->dirac_to_spar_md_bands[b] - d_start_band; for ( i_ts = 0; i_ts < hQMetaData->q_direction->cfg.nblocks; i_ts++ ) { - azi_dirac[b][i_ts] = hQMetaData->q_direction->band_data[dirac_band_idx].azimuth[i_ts]; - ele_dirac[b][i_ts] = hQMetaData->q_direction->band_data[dirac_band_idx].elevation[i_ts]; + azi_dirac[b][i_ts] = hQMetaData->q_direction[0].band_data[dirac_band_idx].azimuth[i_ts]; + ele_dirac[b][i_ts] = hQMetaData->q_direction[0].band_data[dirac_band_idx].elevation[i_ts]; +#ifdef HODIRAC + if ( st_ivas->sba_analysis_order > 1 ) + { + azi_dirac2[b][i_ts] = hQMetaData->q_direction[1].band_data[dirac_band_idx].azimuth[i_ts] + hQMetaData->q_direction[0].band_data[dirac_band_idx].azimuth[i_ts] - 180.f; + if ( azi_dirac2[b][i_ts] < -180.f ) + { + azi_dirac2[b][i_ts] += 360.f; + } + if ( azi_dirac2[b][i_ts] >= 180.f ) + { + azi_dirac2[b][i_ts] -= 360.f; + } + ele_dirac2[b][i_ts] = hQMetaData->q_direction[1].band_data[dirac_band_idx].elevation[i_ts]; + } +#endif } diffuseness[b] = 1.0f - hQMetaData->q_direction->band_data[dirac_band_idx].energy_ratio[0]; +#ifdef HODIRAC + if ( st_ivas->sba_analysis_order > 1 ) + { + ratio[b] = hQMetaData->q_direction[1].band_data[dirac_band_idx].energy_ratio[0]; + } +#endif } if ( d_start_band >= 6 && dtx_vad == 1 ) @@ -757,7 +783,27 @@ static ivas_error ivas_spar_enc_process( Wscale_d[b] = min( 2.0f, max( Wscale_d[b], 1.0f ) ); } - ivas_get_spar_md_from_dirac( azi_dirac, ele_dirac, diffuseness, 1, hSpar->hMdEnc->mixer_mat, &hSpar->hMdEnc->spar_md, &hSpar->hMdEnc->spar_md_cfg, d_start_band, d_end_band, ( hSpar->hMdEnc->spar_hoa_md_flag ) ? 1 : sba_order, dtx_vad, Wscale_d ); + ivas_get_spar_md_from_dirac( + azi_dirac, + ele_dirac, + diffuseness, +#ifdef HODIRAC + azi_dirac2, + ele_dirac2, + ratio, +#endif + 1, + hSpar->hMdEnc->mixer_mat, + &hSpar->hMdEnc->spar_md, + &hSpar->hMdEnc->spar_md_cfg, + d_start_band, + d_end_band, + ( hSpar->hMdEnc->spar_hoa_md_flag ) ? 1 : sba_order, dtx_vad, Wscale_d +#ifdef HODIRAC + , + st_ivas->sba_analysis_order > 1 +#endif + ); } if ( hSpar->hMdEnc->spar_hoa_md_flag ) -- GitLab From b33ef432ac1407919966fb3848b71d73e49ff2a9 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Fri, 21 Apr 2023 09:21:15 +0200 Subject: [PATCH 18/66] wrap prediction changes in new define HODIRAC_PRED --- lib_com/ivas_prot.h | 4 ++-- lib_com/ivas_spar_com.c | 24 ++++++++++++------------ lib_com/options.h | 7 ++++--- lib_dec/ivas_spar_md_dec.c | 14 +++++++------- lib_enc/ivas_spar_encoder.c | 10 +++++----- 5 files changed, 30 insertions(+), 29 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index ce8760b06f..b10050caff 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -4185,7 +4185,7 @@ void ivas_get_spar_md_from_dirac( float azi_dirac[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES], float ele_dirac[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES], float diffuseness[IVAS_MAX_NUM_BANDS], -#ifdef HODIRAC +#ifdef HODIRAC_PRED float azi_dirac2[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES], float ele_dirac2[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES], float ratio[IVAS_MAX_NUM_BANDS], @@ -4199,7 +4199,7 @@ void ivas_get_spar_md_from_dirac( const int16_t order, const int16_t dtx_vad, float Wscale_d[IVAS_MAX_NUM_BANDS] -#ifdef HODIRAC +#ifdef HODIRAC_PRED , int16_t hodirac #endif diff --git a/lib_com/ivas_spar_com.c b/lib_com/ivas_spar_com.c index b5eab73d2c..75f1a3351f 100644 --- a/lib_com/ivas_spar_com.c +++ b/lib_com/ivas_spar_com.c @@ -1640,7 +1640,7 @@ void ivas_get_spar_md_from_dirac( float azi_dirac[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES], float ele_dirac[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES], float diffuseness[IVAS_MAX_NUM_BANDS], -#ifdef HODIRAC +#ifdef HODIRAC_PRED float azi_dirac2[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES], float ele_dirac2[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES], float ratio[IVAS_MAX_NUM_BANDS], @@ -1654,7 +1654,7 @@ void ivas_get_spar_md_from_dirac( const int16_t order, const int16_t dtx_vad, float Wscale_d[IVAS_MAX_NUM_BANDS] -#ifdef HODIRAC +#ifdef HODIRAC_PRED , int16_t hodirac #endif @@ -1664,7 +1664,7 @@ void ivas_get_spar_md_from_dirac( int16_t block, ch; float response_avg[MAX_OUTPUT_CHANNELS]; float response[MAX_PARAM_SPATIAL_SUBFRAMES][MAX_OUTPUT_CHANNELS]; -#ifdef HODIRAC +#ifdef HODIRAC_PRED float response_avg2[MAX_OUTPUT_CHANNELS]; float response2[MAX_PARAM_SPATIAL_SUBFRAMES][MAX_OUTPUT_CHANNELS]; #endif @@ -1676,7 +1676,7 @@ void ivas_get_spar_md_from_dirac( float **ppMixer_mat[IVAS_MAX_FB_MIXER_OUT_CH]; float *pMixer_mat[IVAS_MAX_FB_MIXER_OUT_CH][IVAS_MAX_SPAR_FB_MIXER_IN_CH]; float en_ratio_fac, diff_norm_order1, diff_norm_order2, diff_norm_order3; -#ifdef HODIRAC +#ifdef HODIRAC_PRED float w1 = 0; float w2 = 0; #endif @@ -1687,7 +1687,7 @@ void ivas_get_spar_md_from_dirac( remix_order = remix_order_set[hSpar_md_cfg->remix_unmix_order]; num_ch = ivas_sba_get_nchan_metadata( order ); -#ifdef HODIRAC +#ifdef HODIRAC_PRED hoa2_ch = 6; #else hoa2_ch = ivas_sba_get_nchan_metadata( SBA_HOA2_ORDER ); @@ -1761,7 +1761,7 @@ void ivas_get_spar_md_from_dirac( /*SPAR from DirAC*/ set_f( response_avg, 0.0f, MAX_OUTPUT_CHANNELS ); -#ifdef HODIRAC +#ifdef HODIRAC_PRED if ( hodirac ) { set_f( response_avg2, 0.0f, MAX_OUTPUT_CHANNELS ); @@ -1771,7 +1771,7 @@ void ivas_get_spar_md_from_dirac( if ( n_ts > 1 ) { ivas_dirac_dec_get_response( (int16_t) azi_dirac[band][i_ts], (int16_t) ele_dirac[band][i_ts], response_avg, order ); -#ifdef HODIRAC +#ifdef HODIRAC_PRED if ( hodirac ) { ivas_dirac_dec_get_response( (int16_t) azi_dirac2[band][i_ts], (int16_t) ele_dirac2[band][i_ts], response_avg2, order ); @@ -1783,7 +1783,7 @@ void ivas_get_spar_md_from_dirac( for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ ) { ivas_dirac_dec_get_response( (int16_t) azi_dirac[band][block], (int16_t) ele_dirac[band][block], &( response[block][0] ), order ); -#ifdef HODIRAC +#ifdef HODIRAC_PRED if ( hodirac ) { ivas_dirac_dec_get_response( (int16_t) azi_dirac2[band][block], (int16_t) ele_dirac2[band][block], &( response2[block][0] ), order ); @@ -1844,7 +1844,7 @@ void ivas_get_spar_md_from_dirac( response_avg[ch] /= norm; } -#ifdef HODIRAC +#ifdef HODIRAC_PRED if ( hodirac ) { @@ -1900,7 +1900,7 @@ void ivas_get_spar_md_from_dirac( { response_avg[i] = response_avg[HOA_keep_ind[i]]; } -#ifdef HODIRAC +#ifdef HODIRAC_PRED if ( hodirac ) { for ( i = FOA_CHANNELS + 1; i < num_ch; i++ ) @@ -1910,7 +1910,7 @@ void ivas_get_spar_md_from_dirac( } #endif en_ratio_fac = ( 1.0f - diffuseness[band] ); -#ifdef HODIRAC +#ifdef HODIRAC_PRED if ( hodirac ) { w1 = ratio[band] * ratio[band]; @@ -1975,7 +1975,7 @@ void ivas_get_spar_md_from_dirac( } else { -#ifdef HODIRAC +#ifdef HODIRAC_PRED if ( hodirac ) { cov_real_dirac[i][j][band] = en_ratio_fac * ( w1 * response_avg[i] * response_avg[j] + w2 * response_avg2[i] * response_avg2[j] ); diff --git a/lib_com/options.h b/lib_com/options.h index b82c4ca67f..fb91be4f29 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -150,13 +150,14 @@ #define HODIRAC /* FhG: Sector-based HO-DirAC method for SBA at high bitrates */ #define HODIRAC_CRASH_FIX +#define HODIRAC_PRED -#define HODIRAC_DEBUG +/*#define HODIRAC_DEBUG*/ #ifdef HODIRAC_DEBUG //#define HODIRAC_CHECK_VALUE_RANGE -#define HODIRAC_WRITE_PARAMS -///#define HODIRAC_READ_PARAMS +//#define HODIRAC_WRITE_PARAMS +//#define HODIRAC_READ_PARAMS #endif /* ################## End DEVELOPMENT switches ######################### */ diff --git a/lib_dec/ivas_spar_md_dec.c b/lib_dec/ivas_spar_md_dec.c index de18094e90..2db860a5d8 100644 --- a/lib_dec/ivas_spar_md_dec.c +++ b/lib_dec/ivas_spar_md_dec.c @@ -2542,7 +2542,7 @@ void ivas_spar_to_dirac( int16_t sba_order_internal; float azi_dirac[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES]; float ele_dirac[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES]; -#ifdef HODIRAC +#ifdef HODIRAC_PRED float azi_dirac2[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES]; float ele_dirac2[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES]; float ratio[IVAS_MAX_NUM_BANDS]; @@ -2744,7 +2744,7 @@ void ivas_spar_to_dirac( } azi_dirac[band][block] = st_ivas->hQMetaData->q_direction->band_data[dirac_band_idx].azimuth[block]; ele_dirac[band][block] = st_ivas->hQMetaData->q_direction->band_data[dirac_band_idx].elevation[block]; -#ifdef HODIRAC +#ifdef HODIRAC_PRED if ( st_ivas->sba_analysis_order > 1 ) { azi_dirac2[band][block] = st_ivas->hQMetaData->q_direction[1].band_data[dirac_band_idx].azimuth[block]; @@ -2754,7 +2754,7 @@ void ivas_spar_to_dirac( } diffuseness[band] = 1.0f - st_ivas->hQMetaData->q_direction->band_data[dirac_band_idx].energy_ratio[0]; -#ifdef HODIRAC +#ifdef HODIRAC_PRED if ( st_ivas->sba_analysis_order > 1 ) { ratio[band] = st_ivas->hQMetaData->q_direction[1].band_data[dirac_band_idx].energy_ratio[0]; @@ -2769,7 +2769,7 @@ void ivas_spar_to_dirac( azi_dirac, ele_dirac, diffuseness, -#ifdef HODIRAC +#ifdef HODIRAC_PRED azi_dirac2, ele_dirac2, ratio, @@ -2783,7 +2783,7 @@ void ivas_spar_to_dirac( ( hMdDec->spar_hoa_md_flag ) ? 1 : sba_order_internal, dtx_vad, NULL -#ifdef HODIRAC +#ifdef HODIRAC_PRED , st_ivas->sba_analysis_order > 1 #endif @@ -2803,7 +2803,7 @@ void ivas_spar_to_dirac( azi_dirac, ele_dirac, diffuseness, -#ifdef HODIRAC +#ifdef HODIRAC_PRED azi_dirac2, ele_dirac2, ratio, @@ -2817,7 +2817,7 @@ void ivas_spar_to_dirac( ( hMdDec->spar_hoa_md_flag ) ? 1 : sba_order_internal, dtx_vad, NULL -#ifdef HODIRAC +#ifdef HODIRAC_PRED , st_ivas->sba_analysis_order > 1 #endif diff --git a/lib_enc/ivas_spar_encoder.c b/lib_enc/ivas_spar_encoder.c index 50735f262c..8c7c892ebd 100644 --- a/lib_enc/ivas_spar_encoder.c +++ b/lib_enc/ivas_spar_encoder.c @@ -721,7 +721,7 @@ static ivas_error ivas_spar_enc_process( { float azi_dirac[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES]; float ele_dirac[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES]; -#ifdef HODIRAC +#ifdef HODIRAC_PRED float azi_dirac2[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES]; float ele_dirac2[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES]; float ratio[IVAS_MAX_NUM_BANDS]; @@ -741,7 +741,7 @@ static ivas_error ivas_spar_enc_process( { azi_dirac[b][i_ts] = hQMetaData->q_direction[0].band_data[dirac_band_idx].azimuth[i_ts]; ele_dirac[b][i_ts] = hQMetaData->q_direction[0].band_data[dirac_band_idx].elevation[i_ts]; -#ifdef HODIRAC +#ifdef HODIRAC_PRED if ( st_ivas->sba_analysis_order > 1 ) { azi_dirac2[b][i_ts] = hQMetaData->q_direction[1].band_data[dirac_band_idx].azimuth[i_ts] + hQMetaData->q_direction[0].band_data[dirac_band_idx].azimuth[i_ts] - 180.f; @@ -758,7 +758,7 @@ static ivas_error ivas_spar_enc_process( #endif } diffuseness[b] = 1.0f - hQMetaData->q_direction->band_data[dirac_band_idx].energy_ratio[0]; -#ifdef HODIRAC +#ifdef HODIRAC_PRED if ( st_ivas->sba_analysis_order > 1 ) { ratio[b] = hQMetaData->q_direction[1].band_data[dirac_band_idx].energy_ratio[0]; @@ -787,7 +787,7 @@ static ivas_error ivas_spar_enc_process( azi_dirac, ele_dirac, diffuseness, -#ifdef HODIRAC +#ifdef HODIRAC_PRED azi_dirac2, ele_dirac2, ratio, @@ -799,7 +799,7 @@ static ivas_error ivas_spar_enc_process( d_start_band, d_end_band, ( hSpar->hMdEnc->spar_hoa_md_flag ) ? 1 : sba_order, dtx_vad, Wscale_d -#ifdef HODIRAC +#ifdef HODIRAC_PRED , st_ivas->sba_analysis_order > 1 #endif -- GitLab From 723654a6d28a95ccec4a742b2cc063edddb70f1d Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Fri, 21 Apr 2023 13:49:15 +0200 Subject: [PATCH 19/66] improve prediction formula for HO-DirAC case --- lib_com/ivas_spar_com.c | 89 ++++++++++++++++++++++------------------- 1 file changed, 47 insertions(+), 42 deletions(-) diff --git a/lib_com/ivas_spar_com.c b/lib_com/ivas_spar_com.c index 75f1a3351f..0561b5afbd 100644 --- a/lib_com/ivas_spar_com.c +++ b/lib_com/ivas_spar_com.c @@ -1915,73 +1915,78 @@ void ivas_get_spar_md_from_dirac( { w1 = ratio[band] * ratio[band]; w2 = ( 1.0f - ratio[band] ) * ( 1.0f - ratio[band] ); - } -#endif - for ( i = 0; i < num_ch; i++ ) - { - for ( j = 0; j < num_ch; j++ ) + for ( i = 0; i < num_ch; i++ ) { - if ( i == j ) + for ( j = 0; j < num_ch; j++ ) { - if ( i == 0 ) + cov_real_dirac[i][j][band] = en_ratio_fac * ( w1 * response_avg[i] * response_avg[j] + w2 * response_avg2[i] * response_avg2[j] ); + if ( i == j ) { - cov_real_dirac[i][i][band] = 1.0f; + cov_real_dirac[i][j][band] += diffuseness[band]; } - else + } + } + } + else +#endif + { + for ( i = 0; i < num_ch; i++ ) + { + for ( j = 0; j < num_ch; j++ ) + { + if ( i == j ) { - cov_real_dirac[i][j][band] = en_ratio_fac * response_avg[i] * response_avg[j]; - - if ( hSpar_md_cfg->nchan_transport <= 2 ) + if ( i == 0 ) { + cov_real_dirac[i][i][band] = 1.0f; + } + else + { + cov_real_dirac[i][j][band] = en_ratio_fac * response_avg[i] * response_avg[j]; - cov_real_dirac[i][j][band] *= en_ratio_fac; - if ( ( i >= ndm ) && ( dtx_vad == 1 ) ) + if ( hSpar_md_cfg->nchan_transport <= 2 ) { - cov_real_dirac[i][j][band] += ( 1.0f - ( en_ratio_fac * en_ratio_fac ) ) * P_dir_fact[i - ndm]; + + cov_real_dirac[i][j][band] *= en_ratio_fac; + if ( ( i >= ndm ) && ( dtx_vad == 1 ) ) + { + cov_real_dirac[i][j][band] += ( 1.0f - ( en_ratio_fac * en_ratio_fac ) ) * P_dir_fact[i - ndm]; + } + else + { + if ( i < foa_ch ) + { + cov_real_dirac[i][j][band] += ( 1.0f - ( en_ratio_fac * en_ratio_fac ) ) / diff_norm_order1; + } + else if ( i < hoa2_ch ) + { + cov_real_dirac[i][j][band] += ( 1.0f - ( en_ratio_fac * en_ratio_fac ) ) / diff_norm_order2; + } + else + { + cov_real_dirac[i][j][band] += ( 1.0f - ( en_ratio_fac * en_ratio_fac ) ) / diff_norm_order3; + } + } } else { if ( i < foa_ch ) { - cov_real_dirac[i][j][band] += ( 1.0f - ( en_ratio_fac * en_ratio_fac ) ) / diff_norm_order1; + cov_real_dirac[i][j][band] += ( 1.0f - en_ratio_fac ) / diff_norm_order1; } else if ( i < hoa2_ch ) { - cov_real_dirac[i][j][band] += ( 1.0f - ( en_ratio_fac * en_ratio_fac ) ) / diff_norm_order2; + cov_real_dirac[i][j][band] += ( 1.0f - en_ratio_fac ) / diff_norm_order2; } else { - cov_real_dirac[i][j][band] += ( 1.0f - ( en_ratio_fac * en_ratio_fac ) ) / diff_norm_order3; + cov_real_dirac[i][j][band] += ( 1.0f - en_ratio_fac ) / diff_norm_order3; } } } - else - { - if ( i < foa_ch ) - { - cov_real_dirac[i][j][band] += ( 1.0f - en_ratio_fac ) / diff_norm_order1; - } - else if ( i < hoa2_ch ) - { - cov_real_dirac[i][j][band] += ( 1.0f - en_ratio_fac ) / diff_norm_order2; - } - else - { - cov_real_dirac[i][j][band] += ( 1.0f - en_ratio_fac ) / diff_norm_order3; - } - } - } - } - else - { -#ifdef HODIRAC_PRED - if ( hodirac ) - { - cov_real_dirac[i][j][band] = en_ratio_fac * ( w1 * response_avg[i] * response_avg[j] + w2 * response_avg2[i] * response_avg2[j] ); } else -#endif { cov_real_dirac[i][j][band] = en_ratio_fac * response_avg[i] * response_avg[j]; } -- GitLab From eb5a9dd3ecaa4a758a05a3c18160b75c4d98dac7 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Fri, 21 Apr 2023 16:21:08 +0200 Subject: [PATCH 20/66] disable HODIRA_PRED for the time being --- lib_com/options.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index fb91be4f29..55b90b45c0 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -150,7 +150,7 @@ #define HODIRAC /* FhG: Sector-based HO-DirAC method for SBA at high bitrates */ #define HODIRAC_CRASH_FIX -#define HODIRAC_PRED +/*#define HODIRAC_PRED*/ /*#define HODIRAC_DEBUG*/ -- GitLab From ba1338a5633f8d106d25de487bdd329f9db4bac1 Mon Sep 17 00:00:00 2001 From: rtyag Date: Mon, 24 Apr 2023 19:42:54 +1000 Subject: [PATCH 21/66] SPAR HOA2 + pHOA3 + HO DIRAC at 512 kbps --- apps/renderer.c | 4 + lib_com/ivas_cnst.h | 6 + lib_com/ivas_fb_mixer.c | 10 +- lib_com/ivas_prot.h | 45 +++- lib_com/ivas_rom_com.c | 18 +- lib_com/ivas_rom_com.h | 3 +- lib_com/ivas_sba_config.c | 73 +++++- lib_com/ivas_spar_com.c | 14 +- lib_com/options.h | 3 + lib_dec/ivas_dec.c | 7 +- lib_dec/ivas_dirac_dec.c | 63 ++++- lib_dec/ivas_dirac_output_synthesis_dec.c | 8 + lib_dec/ivas_output_config.c | 7 +- lib_dec/ivas_rom_dec.c | 11 + lib_dec/ivas_rom_dec.h | 6 +- lib_dec/ivas_sba_rendering_internal.c | 14 +- lib_dec/ivas_spar_decoder.c | 188 ++++++++++++-- lib_dec/ivas_spar_md_dec.c | 291 ++++++++++++++++++---- lib_dec/ivas_stat_dec.h | 8 +- lib_enc/ivas_enc_cov_handler.c | 33 ++- lib_enc/ivas_spar_encoder.c | 32 ++- lib_enc/ivas_spar_md_enc.c | 63 ++++- lib_enc/ivas_stat_enc.h | 4 + lib_rend/lib_rend.c | 16 +- lib_rend/lib_rend.h | 8 +- 25 files changed, 823 insertions(+), 112 deletions(-) diff --git a/apps/renderer.c b/apps/renderer.c index c2fb6add8a..07b3c8383e 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -673,7 +673,11 @@ int main( } /* === Configure === */ +#ifdef FIX_392_LATE_REVERB + if ( ( error = IVAS_REND_InitConfig( hIvasRend, args.outConfig.audioConfig ) ) != IVAS_ERR_OK ) +#else if ( ( error = IVAS_REND_InitConfig( hIvasRend, ( args.outConfig.audioConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) || ( args.outConfig.audioConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL ) ) ) != IVAS_ERR_OK ) +#endif { fprintf( stderr, "Error in Renderer Config Init\n" ); exit( -1 ); diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index b50e4b74e4..9e3c0efacd 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -990,7 +990,13 @@ typedef enum #define SPAR_CONFIG_BW FB +#ifndef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT #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 diff --git a/lib_com/ivas_fb_mixer.c b/lib_com/ivas_fb_mixer.c index 2e8fda221a..1fede52de3 100644 --- a/lib_com/ivas_fb_mixer.c +++ b/lib_com/ivas_fb_mixer.c @@ -526,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_HOA2_PLANAR_HOA3_DECOR_OPT + , + const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] +#endif ) { int16_t i; @@ -545,7 +549,11 @@ void ivas_fb_mixer_pcm_ingest( { mvr2r( &hFbMixer->ppFilterbank_prior_input[i][fb_cfg->prior_input_length - frame_len], ppOut_pcm[i], frame_len ); #ifdef HODIRAC +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + 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 @@ -743,7 +751,7 @@ void ivas_fb_mixer_process( for ( j = 0; j < hFbMixer->fb_cfg->num_in_chans; j++ ) { - if ( in_out_mixer_map[ch][j] !=0 ) + if ( in_out_mixer_map[ch][j] != 0 ) { float filterbank_mixer_bins_re[L_FRAME48k]; float filterbank_mixer_bins_im[L_FRAME48k]; diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index b10050caff..8e7517da30 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -3279,14 +3279,31 @@ int16_t ivas_sba_get_nchan( /*! r: number of ambisonics metadata channels */ int16_t ivas_sba_get_nchan_metadata( const int16_t sba_order /* i : Ambisonic (SBA) order */ +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + , + const int32_t ivas_total_brate +#endif ); +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +void ivas_sba_get_spar_hoa_ch_ind( + const int16_t num_md_chs, /* i : number of MD channels */ + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] ); + +/*! r: flag indicating to code SPAR HOA MD for all bands */ +void ivas_sba_get_spar_hoa_md_flag( + const int16_t sba_order, /* i : Ambisonic (SBA) order */ + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + int16_t *spar_hoa_md_flag, + int16_t *spar_hoa_dirac2spar_md_flag ); +#else /*! r: flag indicating to code SPAR HOA MD for all bands */ int16_t ivas_sba_get_spar_hoa_md_flag( const int16_t sba_order, /* i : Ambisonic (SBA) order */ const int32_t ivas_total_brate /* i : IVAS total bitrate */ ); - +#endif void ivas_sba_zero_vert_comp( float sba_data[][L_FRAME48k], /* i/o: SBA data frame */ const int16_t sba_order, /* i : Ambisonic (SBA) order */ @@ -4205,6 +4222,12 @@ void ivas_get_spar_md_from_dirac( #endif ); +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +int16_t ivas_get_spar_dec_md_num_subframes( + const int16_t sba_order, /* i : Ambisonic (SBA) order */ + const int32_t ivas_total_brate ); +#endif + ivas_error ivas_spar_md_dec_open( ivas_spar_md_dec_state_t **hMdDec_out, /* i/o: SPAR MD decoder handle */ const DECODER_CONFIG_HANDLE hDecoderConfig, /* i : configuration structure */ @@ -4255,11 +4278,19 @@ void ivas_spar_update_md_hist( void ivas_spar_smooth_md_dtx( ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ const int16_t num_bands_out /* i : number of output bands */ + #ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + , + const int16_t num_md_sub_frames /* i : number of metadata subframes */ +#endif ); void ivas_spar_setup_md_smoothing( ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ const int16_t num_bands_out /* i : number of output bands */ +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + , + const int16_t num_md_sub_frames /* i : number of metadata subframes */ +#endif ); void ivas_spar_dec_gen_umx_mat( @@ -4267,6 +4298,10 @@ void ivas_spar_dec_gen_umx_mat( const int16_t nchan_transport, /* i : number of transport channels */ const int16_t num_bands_out, /* i : number of output bands */ const int16_t bfi /* i : bad frame indicator */ +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + , + const int16_t num_md_sub_frames +#endif ); /* Covariance module */ @@ -4294,6 +4329,10 @@ void ivas_enc_cov_handler_process( const int16_t nchan_inp, const int16_t dtx_vad, const int16_t transient_det[2] +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + , + const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] +#endif ); ivas_error ivas_spar_covar_smooth_enc_open( @@ -5121,6 +5160,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_length /* i : frame length */ +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + , + const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] +#endif ); void ivas_dirac_enc_spar_delay_synchro( diff --git a/lib_com/ivas_rom_com.c b/lib_com/ivas_rom_com.c index 09b3cadef9..81b2781270 100644 --- a/lib_com/ivas_rom_com.c +++ b/lib_com/ivas_rom_com.c @@ -952,11 +952,19 @@ const ivas_spar_br_table_t ivas_spar_br_table_consts[IVAS_SPAR_BR_TABLE_LEN] = { 512000, 0, SBA_FOA_ORDER, FB, 24000, 4, WYXZ, 0, 0,{ { 128000, 128000, 128000 },{ 128000, 128000, 128000 },{ 128000, 128000, 128000 }, {118450, 118450, 128000 } }, // not yet optimized { { 31, 1, 1, 1 },{ 1, 1, 1, 1 },{ 1, 1, 1, 1 } }, 1, 2, 0 }, +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + { 512000, 0, SBA_HOA2_ORDER, FB, 24000, 4, WYXZ, 0, 0,{ { 124000, 124000, 128000 },{ 124000, 124000, 128000 },{ 125200, 118450, 128000 },{ 76300, 73000, 128000 } }, // not yet optimized + { { 31, 11, 11, 1 },{ 1, 1, 1, 1 },{ 1, 1, 1, 1 } }, 1, 2, 0 }, + + { 512000, 0, SBA_HOA3_ORDER, FB, 24000, 4, WYXZ, 0, 0,{ { 118000, 118000, 128000 },{ 118000, 118000, 128000 },{ 117200, 109250, 128000 },{ 72300, 69000, 128000 } }, // not yet optimized + { { 31, 11, 11, 1 },{ 1, 1, 1, 1 },{ 1, 1, 1, 1 } }, 1, 2, 0 }, +#else { 512000, 0, SBA_HOA2_ORDER, FB, 24000, 4, WYXZ, 0, 0,{ { 128000, 128000, 128000 },{ 128000, 128000, 128000 },{ 128000, 128000, 128000 },{ 97700, 93300, 128000 } }, // not yet optimized { { 31, 11, 11, 1 },{ 1, 1, 1, 1 },{ 1, 1, 1, 1 } }, 1, 2, 0 }, { 512000, 0, SBA_HOA3_ORDER, FB, 24000, 4, WYXZ, 0, 0,{ { 128000, 128000, 128000 },{ 128000, 128000, 128000 },{ 127200, 122550, 128000 },{ 76300, 73550, 128000 } }, // not yet optimized { { 31, 11, 11, 1 },{ 1, 1, 1, 1 },{ 1, 1, 1, 1 } }, 1, 2, 0 }, +#endif }; const ivas_freq_models_t ivas_arith_pred_r_consts[TOTAL_PRED_QUANT_STRATS_ARITH] = @@ -1482,11 +1490,19 @@ const int16_t remix_order_set[1][IVAS_SPAR_MAX_CH] = { /* WYZX --> WYXZ... */ { 0, 1, 3, 2, 4, 5, 6, 7} }; #endif - +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +const int16_t keep_planar[IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS] = { 1, 1, 1, 1, 1, 1 }; +#else const int16_t keep_planar[IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS] = { 1, 1, 1, 1 }; +#endif #ifdef HODIRAC const int16_t HOA_keep_ind[IVAS_SPAR_MAX_FB_IN_CHAN] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 15}; +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +const int16_t HOA_keep_ind_spar[IVAS_SPAR_MAX_CH] = {0, 1, 2, 3, 4, 8, 9, 10, 10, 10, 10}; +const int16_t HOA_keep_ind_spar512[IVAS_SPAR_MAX_CH] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; +#else const int16_t HOA_keep_ind_spar[IVAS_SPAR_MAX_CH] = {0, 1, 2, 3, 4, 8, 9, 10}; +#endif #else const int16_t HOA_keep_ind[IVAS_SPAR_MAX_CH] = {0, 1, 2, 3, 4, 8, 9, 15}; #endif diff --git a/lib_com/ivas_rom_com.h b/lib_com/ivas_rom_com.h index 3cc20fda5e..851466a682 100644 --- a/lib_com/ivas_rom_com.h +++ b/lib_com/ivas_rom_com.h @@ -200,8 +200,9 @@ extern const int16_t remix_order_set[1][IVAS_SPAR_MAX_CH]; #endif extern const int16_t keep_planar[IVAS_SPAR_MAX_CH - FOA_CHANNELS]; #ifdef HODIRAC -extern const int16_t HOA_keep_ind[11]; +extern const int16_t HOA_keep_ind[IVAS_SPAR_MAX_FB_IN_CHAN]; extern const int16_t HOA_keep_ind_spar[IVAS_SPAR_MAX_CH]; +extern const int16_t HOA_keep_ind_spar512[IVAS_SPAR_MAX_CH]; #else extern const int16_t HOA_keep_ind[IVAS_SPAR_MAX_CH]; #endif diff --git a/lib_com/ivas_sba_config.c b/lib_com/ivas_sba_config.c index 44131d5bd2..0b3a15a774 100644 --- a/lib_com/ivas_sba_config.c +++ b/lib_com/ivas_sba_config.c @@ -235,6 +235,10 @@ int16_t ivas_sba_get_nchan( /*! r: number of ambisonics metadata channels */ int16_t ivas_sba_get_nchan_metadata( const int16_t sba_order /* i : Ambisonic (SBA) order */ +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + , + const int32_t ivas_total_brate +#endif ) { int16_t nb_channels; @@ -245,8 +249,19 @@ int16_t ivas_sba_get_nchan_metadata( } else { - /* FOA + planar HOA */ - nb_channels = FOA_CHANNELS + 2 * ( sba_order - 1 ); +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + if ( ivas_total_brate >= IVAS_512k ) + { + nb_channels = ( SBA_HOA2_ORDER + 1 ) * ( SBA_HOA2_ORDER + 1 ); + nb_channels += 2; + nb_channels = min( nb_channels, ( sba_order + 1 ) * ( sba_order + 1 ) ); + } + else +#endif + { + /* FOA + planar HOA */ + nb_channels = FOA_CHANNELS + 2 * ( sba_order - 1 ); + } } return ( nb_channels ); @@ -259,6 +274,58 @@ int16_t ivas_sba_get_nchan_metadata( *-------------------------------------------------------------------*/ /*! r: flag indicating to code SPAR HOA MD for all bands */ +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +void ivas_sba_get_spar_hoa_ch_ind( + const int16_t num_md_chs, /* i : number of MD channels */ + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] ) +{ + int16_t ch; + const int16_t *hoa_ind; + + if ( ivas_total_brate >= IVAS_512k ) + { + hoa_ind = HOA_keep_ind_spar512; + } + else + { + hoa_ind = HOA_keep_ind_spar; + } + for ( ch = 0; ch < num_md_chs; ch++ ) + { + HOA_md_ind[ch] = hoa_ind[ch]; + } + + return; +} + +void ivas_sba_get_spar_hoa_md_flag( + const int16_t sba_order, /* i : Ambisonic (SBA) order */ + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + int16_t *spar_hoa_md_flag, + int16_t *spar_hoa_dirac2spar_md_flag ) +{ + if ( sba_order > 1 && ivas_total_brate >= IVAS_256k ) + { + *spar_hoa_md_flag = 1; + } + else + { + *spar_hoa_md_flag = 0; + } + + if ( sba_order > 1 && ivas_total_brate >= IVAS_512k ) + { + *spar_hoa_dirac2spar_md_flag = 0; + } + else + { + *spar_hoa_dirac2spar_md_flag = 1; + } + + return; +} +#else int16_t ivas_sba_get_spar_hoa_md_flag( const int16_t sba_order, /* i : Ambisonic (SBA) order */ const int32_t ivas_total_brate /* i : IVAS total bitrate */ @@ -277,6 +344,8 @@ int16_t ivas_sba_get_spar_hoa_md_flag( return spar_hoa_md_flag; } +#endif + /*-------------------------------------------------------------------* * ivas_sba_zero_vert_comp() diff --git a/lib_com/ivas_spar_com.c b/lib_com/ivas_spar_com.c index 0561b5afbd..5482876545 100644 --- a/lib_com/ivas_spar_com.c +++ b/lib_com/ivas_spar_com.c @@ -1686,11 +1686,21 @@ void ivas_get_spar_md_from_dirac( remix_order = remix_order_set[hSpar_md_cfg->remix_unmix_order]; - num_ch = ivas_sba_get_nchan_metadata( order ); + num_ch = ivas_sba_get_nchan_metadata( order +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + , + IVAS_256k /*dummy value as order is always 1 in this function*/ +#endif + ); #ifdef HODIRAC_PRED hoa2_ch = 6; #else - hoa2_ch = ivas_sba_get_nchan_metadata( SBA_HOA2_ORDER ); + hoa2_ch = ivas_sba_get_nchan_metadata( SBA_HOA2_ORDER +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + , + IVAS_256k /*dummy value as order is always 1 in this function*/ +#endif + ); #endif foa_ch = FOA_CHANNELS; diff_norm_order1 = 3.0f; diff --git a/lib_com/options.h b/lib_com/options.h index 55b90b45c0..1a15ac3a62 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -151,6 +151,8 @@ #define HODIRAC /* FhG: Sector-based HO-DirAC method for SBA at high bitrates */ #define HODIRAC_CRASH_FIX /*#define HODIRAC_PRED*/ +#define SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +//#define DIRAC_DRCT_GAIN_DISABLE /*#define HODIRAC_DEBUG*/ @@ -159,6 +161,7 @@ //#define HODIRAC_WRITE_PARAMS //#define HODIRAC_READ_PARAMS #endif +#define FIX_392_LATE_REVERB /* DLB : Issue 392: keep late reverb by default off when output config is not BINAURAL_ROOM*/ /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_dec/ivas_dec.c b/lib_dec/ivas_dec.c index 45284ef3ce..6aa3fa608e 100644 --- a/lib_dec/ivas_dec.c +++ b/lib_dec/ivas_dec.c @@ -357,7 +357,12 @@ ivas_error ivas_dec( if ( st_ivas->sba_mode == SBA_MODE_SPAR ) { - ivas_spar_dec_gen_umx_mat( st_ivas->hSpar->hMdDec, st_ivas->nchan_transport, IVAS_MAX_NUM_BANDS, st_ivas->bfi ); + ivas_spar_dec_gen_umx_mat( st_ivas->hSpar->hMdDec, st_ivas->nchan_transport, IVAS_MAX_NUM_BANDS, st_ivas->bfi +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + , + ivas_get_spar_dec_md_num_subframes( st_ivas->sba_order, st_ivas->hDecoderConfig->ivas_total_brate ) +#endif + ); } ivas_sba_dirac_stereo_dec( st_ivas, output, output_frame, st_ivas->ivas_format == MC_FORMAT ); diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index 06c44a716f..9036f92fb8 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -65,7 +65,12 @@ static void protoSignalComputation1( float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRA static void protoSignalComputation2( float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], float *proto_frame_f, float *proto_direct_buffer_f, float *reference_power, float *proto_power_smooth, const int16_t isloudspeaker, const int16_t slot_index, const int16_t num_freq_bands, MASA_STEREO_TYPE_DETECT *stereo_type_detect ); -static void protoSignalComputation4( float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], float *proto_frame_f, float *proto_direct_buffer_f, float *reference_power, float *proto_power_smooth, const int16_t slot_index, const int16_t num_outputs_diff, const int16_t num_freq_bands, const float *mtx_hoa_decoder, const int16_t nchan_transport ); +static void protoSignalComputation4( float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], float *proto_frame_f, float *proto_direct_buffer_f, float *reference_power, float *proto_power_smooth, const int16_t slot_index, const int16_t num_outputs_diff, const int16_t num_freq_bands, const float *mtx_hoa_decoder, const int16_t nchan_transport +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + , + const int16_t *sba_map_tc_ind +#endif +); static void ivas_dirac_dec_compute_diffuse_proto( DIRAC_DEC_HANDLE hDirAC, const int16_t slot_idx ); @@ -172,7 +177,12 @@ ivas_error ivas_dirac_dec_config( nchan_transport_orig = st_ivas->nchan_transport; if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR && !( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) { - st_ivas->nchan_transport = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order ); + st_ivas->nchan_transport = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + , + st_ivas->hDecoderConfig->ivas_total_brate +#endif + ); } nchan_transport = st_ivas->nchan_transport; @@ -456,6 +466,17 @@ ivas_error ivas_dirac_dec_config( } set_s( hDirAC->proto_index_diff, 0, hDirAC->num_outputs_diff ); +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + hDirAC->sba_map_tc = sba_map_tc; + if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR ) + { + if ( st_ivas->sba_order > SBA_FOA_ORDER && ivas_total_brate >= IVAS_512k ) + { + hDirAC->sba_map_tc = sba_map_tc_512; + } + } +#endif + if ( nchan_transport == 1 ) { hDirAC->num_protos_ambi = 1; @@ -561,10 +582,17 @@ ivas_error ivas_dirac_dec_config( for ( k = 0; k < min( hDirAC->num_outputs_dir, hDirAC->num_protos_dir ); k++ ) { +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + if ( hDirAC->sba_map_tc[k] < hDirAC->num_outputs_dir ) + { + hDirAC->proto_index_dir[hDirAC->sba_map_tc[k]] = k; + } +#else if ( sba_map_tc[k] < hDirAC->num_outputs_dir ) { hDirAC->proto_index_dir[sba_map_tc[k]] = k; } +#endif } } } @@ -1394,7 +1422,7 @@ static ivas_error ivas_dirac_alloc_mem( /*Responses (gains/factors)*/ #ifdef HODIRAC - if ( ( hDirAC_mem->direct_responses = (float *) malloc( sizeof( float ) * size * DIRAC_HO_NUMSECTORS) ) == NULL ) + if ( ( hDirAC_mem->direct_responses = (float *) malloc( sizeof( float ) * size * DIRAC_HO_NUMSECTORS ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); } @@ -2268,7 +2296,7 @@ void ivas_qmetadata_to_dirac( { static FILE *f_params = 0; int16_t tmp_write_idx_band = 0; - + if ( f_params == 0 ) f_params = fopen( "param_dec", "w" ); @@ -2529,11 +2557,19 @@ void ivas_dirac_dec( /* CLDFB Analysis*/ for ( ch = 0; ch < nchan_transport; ch++ ) { +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + cldfbAnalysis_ts( &( output_f[hDirAC->sba_map_tc[ch]][hDirAC->num_freq_bands * index_slot] ), + Cldfb_RealBuffer[ch][0], + Cldfb_ImagBuffer[ch][0], + hDirAC->num_freq_bands, + st_ivas->cldfbAnaDec[ch] ); +#else cldfbAnalysis_ts( &( output_f[sba_map_tc[ch]][hDirAC->num_freq_bands * index_slot] ), Cldfb_RealBuffer[ch][0], Cldfb_ImagBuffer[ch][0], hDirAC->num_freq_bands, st_ivas->cldfbAnaDec[ch] ); +#endif } } @@ -2612,7 +2648,12 @@ void ivas_dirac_dec( slot_idx, hDirAC->num_outputs_diff, hDirAC->num_freq_bands, hDirAC->hoa_decoder, - nchan_transport ); + nchan_transport +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + , + hDirAC->sba_map_tc +#endif + ); break; case 2: protoSignalComputation2( Cldfb_RealBuffer, Cldfb_ImagBuffer, @@ -3732,7 +3773,12 @@ static void protoSignalComputation4( const int16_t num_outputs_diff, const int16_t num_freq_bands, const float *mtx_hoa_decoder, - const int16_t nchan_transport ) + const int16_t nchan_transport +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + , + const int16_t *sba_map_tc_ind +#endif +) { int16_t k, l; int16_t n; @@ -3758,8 +3804,13 @@ static void protoSignalComputation4( proto_frame_f[2 * l * num_freq_bands + 2 * k + 1] = 0.f; for ( n = 0; n < nchan_transport; n++ ) { +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + proto_frame_f[2 * l * num_freq_bands + 2 * k] += RealBuffer[n][0][k] * mtx_hoa_decoder[l * 16 + sba_map_tc_ind[n]]; + proto_frame_f[2 * l * num_freq_bands + 2 * k + 1] += ImagBuffer[n][0][k] * mtx_hoa_decoder[l * 16 + sba_map_tc_ind[n]]; +#else proto_frame_f[2 * l * num_freq_bands + 2 * k] += RealBuffer[n][0][k] * mtx_hoa_decoder[l * 16 + sba_map_tc[n]]; proto_frame_f[2 * l * num_freq_bands + 2 * k + 1] += ImagBuffer[n][0][k] * mtx_hoa_decoder[l * 16 + sba_map_tc[n]]; +#endif } } } diff --git a/lib_dec/ivas_dirac_output_synthesis_dec.c b/lib_dec/ivas_dirac_output_synthesis_dec.c index 34bb6cb32f..1208c86dff 100755 --- a/lib_dec/ivas_dirac_output_synthesis_dec.c +++ b/lib_dec/ivas_dirac_output_synthesis_dec.c @@ -938,6 +938,9 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( g2 += g1 * ( *( p_cy_cross_dir_smooth++ ) ); g2 = max( g2, 0.99f ); g2 = min( g2, 2.0f ); +#ifdef DIRAC_DRCT_GAIN_DISABLE + g2 = 1.0f; +#endif *( p_gains_dir++ ) = g2; } } @@ -1135,8 +1138,13 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( for ( l = 0; l < num_freq_bands_diff; l++ ) { g = g1 * ( *( p_gains_diff++ ) ) + g2 * ( *( p_gains_diff_prev++ ) ); +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + output_real[l * num_channels_dir + hDirAC->sba_map_tc[ch_idx]] += g * ( *( p_proto++ ) ); /* maps ch_idx 5 to 8 */ + output_imag[l * num_channels_dir + hDirAC->sba_map_tc[ch_idx]] += g * ( *( p_proto++ ) ); +#else output_real[l * num_channels_dir + sba_map_tc[ch_idx]] += g * ( *( p_proto++ ) ); /* maps ch_idx 5 to 8 */ output_imag[l * num_channels_dir + sba_map_tc[ch_idx]] += g * ( *( p_proto++ ) ); +#endif } } else diff --git a/lib_dec/ivas_output_config.c b/lib_dec/ivas_output_config.c index f38e810ce3..6a155c01d3 100644 --- a/lib_dec/ivas_output_config.c +++ b/lib_dec/ivas_output_config.c @@ -152,7 +152,12 @@ void ivas_renderer_select( if ( st_ivas->hDecoderConfig->Opt_Headrotation ) { - nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order ); + nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + , + st_ivas->hDecoderConfig->ivas_total_brate +#endif + ); if ( nchan_internal == 2 ) { st_ivas->hHeadTrackData->shd_rot_max_order = 1; diff --git a/lib_dec/ivas_rom_dec.c b/lib_dec/ivas_rom_dec.c index 78d4eafea1..7d69730147 100644 --- a/lib_dec/ivas_rom_dec.c +++ b/lib_dec/ivas_rom_dec.c @@ -520,10 +520,21 @@ const float ap_split_frequencies[DIRAC_DECORR_NUM_SPLIT_BANDS + 1] = 0.0f, 0.125f, 0.375f, 1.0f }; +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +const int16_t sba_map_tc[11] = +{ + 0, 1, 2, 3, 4, 8, 9, 15, 5, 6, 7 +}; +const int16_t sba_map_tc_512[11] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 15 +}; +#else const int16_t sba_map_tc[8] = { 0, 1, 2, 3, 4, 8, 9, 15 }; +#endif /*----------------------------------------------------------------------------------* diff --git a/lib_dec/ivas_rom_dec.h b/lib_dec/ivas_rom_dec.h index 4366077bbb..062efc0e54 100644 --- a/lib_dec/ivas_rom_dec.h +++ b/lib_dec/ivas_rom_dec.h @@ -111,8 +111,12 @@ extern const float ap_lattice_coeffs_3[DIRAC_DECORR_FILTER_LEN_3 * DIRAC_MAX_NUM extern const float *const ap_lattice_coeffs[DIRAC_DECORR_NUM_SPLIT_BANDS]; extern const float ap_split_frequencies[DIRAC_DECORR_NUM_SPLIT_BANDS + 1]; +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +extern const int16_t sba_map_tc[11]; +extern const int16_t sba_map_tc_512[11]; +#else extern const int16_t sba_map_tc[8]; - +#endif /*----------------------------------------------------------------------------------* * FASTCONV and PARAMETRIC binaural renderer ROM tables diff --git a/lib_dec/ivas_sba_rendering_internal.c b/lib_dec/ivas_sba_rendering_internal.c index a80986b39e..152e0b3b76 100644 --- a/lib_dec/ivas_sba_rendering_internal.c +++ b/lib_dec/ivas_sba_rendering_internal.c @@ -353,7 +353,12 @@ void ivas_sba_upmixer_renderer( push_wmops( "ivas_sba_upmixer_renderer" ); - nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order ); + nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + , + st_ivas->hDecoderConfig->ivas_total_brate +#endif + ); if ( st_ivas->nchan_transport >= 3 ) { @@ -581,7 +586,12 @@ void ivas_sba_mix_matrix_determiner( /* Mixing matrix determiner */ num_bands_out = hSpar->hFbMixer->pFb->filterbank_num_bands; - ivas_spar_dec_gen_umx_mat( hSpar->hMdDec, nchan_transport, num_bands_out, bfi ); + ivas_spar_dec_gen_umx_mat( hSpar->hMdDec, nchan_transport, num_bands_out, bfi +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + , + MAX_PARAM_SPATIAL_SUBFRAMES +#endif + ); return; } diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c index 864220a90c..1109746715 100644 --- a/lib_dec/ivas_spar_decoder.c +++ b/lib_dec/ivas_spar_decoder.c @@ -71,10 +71,19 @@ ivas_error ivas_spar_dec_open( IVAS_FB_CFG *fb_cfg; int16_t i, j, b, active_w_mixing; int32_t output_Fs; +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + int16_t num_decor_chs; +#endif error = IVAS_ERR_OK; sba_order_internal = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); - num_channels_internal = ivas_sba_get_nchan_metadata( sba_order_internal ); + num_channels_internal = ivas_sba_get_nchan_metadata( sba_order_internal +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + , + st_ivas->hDecoderConfig->ivas_total_brate +#endif + ); + hSpar = st_ivas->hSpar; if ( !spar_reconfig_flag ) @@ -87,12 +96,30 @@ ivas_error ivas_spar_dec_open( } output_Fs = st_ivas->hDecoderConfig->output_Fs; +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + if ( num_channels_internal > ( SBA_HOA2_ORDER + 1 ) * ( SBA_HOA2_ORDER + 1 ) ) + { + num_decor_chs = IVAS_HBR_MAX_DECOR_CHS; + } + else + { + num_decor_chs = num_channels_internal - 1; + } +#endif +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + /* TD decorr. */ + if ( ( error = ivas_td_decorr_dec_open( &hSpar->hTdDecorr, output_Fs, num_decor_chs + 1, 1 ) ) != IVAS_ERR_OK ) + { + return error; + } +#else /* TD decorr. */ if ( ( error = ivas_td_decorr_dec_open( &hSpar->hTdDecorr, output_Fs, num_channels_internal, 1 ) ) != IVAS_ERR_OK ) { return error; } +#endif /* MD handle */ if ( ( error = ivas_spar_md_dec_open( &hSpar->hMdDec, st_ivas->hDecoderConfig, num_channels_internal, sba_order_internal, st_ivas->sid_format ) ) != IVAS_ERR_OK ) @@ -640,6 +667,9 @@ static void ivas_spar_dec_MD( { int16_t num_channels, table_idx, num_bands_out, bfi, sba_order; int32_t ivas_total_brate; +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + int16_t num_md_sub_frames; +#endif DECODER_CONFIG_HANDLE hDecoderConfig = st_ivas->hDecoderConfig; SPAR_DEC_HANDLE hSpar = st_ivas->hSpar; @@ -652,7 +682,17 @@ static void ivas_spar_dec_MD( sba_order = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); bfi = st_ivas->bfi; ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; - num_channels = ivas_sba_get_nchan_metadata( sba_order ); + num_channels = ivas_sba_get_nchan_metadata( sba_order +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + , + ivas_total_brate +#endif + ); + +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + num_md_sub_frames = ivas_get_spar_dec_md_num_subframes( sba_order, st_ivas->hDecoderConfig->ivas_total_brate ); +#endif + num_bands_out = hSpar->hFbMixer->pFb->filterbank_num_bands; if ( ivas_total_brate > FRAME_NO_DATA && !bfi ) @@ -711,7 +751,13 @@ static void ivas_spar_dec_MD( if ( st0->m_old_frame_type == ZERO_FRAME && ivas_total_brate == IVAS_SID_5k2 && st0->prev_bfi == 0 && hSpar->hMdDec->spar_md_cfg.nchan_transport == 1 ) { - ivas_spar_setup_md_smoothing( hSpar->hMdDec, num_bands_out ); + ivas_spar_setup_md_smoothing( hSpar->hMdDec, num_bands_out + +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + , + num_md_sub_frames +#endif + ); } else { @@ -722,7 +768,12 @@ static void ivas_spar_dec_MD( { if ( !bfi ) { - ivas_spar_smooth_md_dtx( hSpar->hMdDec, num_bands_out ); + ivas_spar_smooth_md_dtx( hSpar->hMdDec, num_bands_out +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + , + num_md_sub_frames +#endif + ); } set_s( hSpar->hMdDec->valid_bands, 0, IVAS_MAX_NUM_BANDS ); @@ -862,7 +913,12 @@ static void ivas_spar_get_skip_mat( const int16_t num_ch_out, const int16_t num_ch_in, const int16_t num_spar_bands, - int16_t skip_mat[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH] ) + int16_t skip_mat[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH] +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + , + const int16_t num_md_sub_frames +#endif +) { int16_t spar_band, out_ch, in_ch; int16_t i_ts, skip_flag; @@ -873,6 +929,45 @@ static void ivas_spar_get_skip_mat( { skip_mat[out_ch][in_ch] = 1; skip_flag = 1; +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + for ( i_ts = 0; i_ts < MAX_PARAM_SPATIAL_SUBFRAMES; i_ts++ ) + { + for ( spar_band = 0; spar_band < num_spar_bands; spar_band++ ) + { + if ( hSpar->hMdDec->mixer_mat_prev[1 + i_ts][out_ch][in_ch][spar_band] != 0.0f ) + { + skip_flag = 0; + break; + } + } + + if ( skip_flag == 0 ) + { + skip_mat[out_ch][in_ch] = 0; + break; + } + } + if ( skip_mat[out_ch][in_ch] == 1 ) + { + for ( i_ts = 0; i_ts < num_md_sub_frames; i_ts++ ) + { + for ( spar_band = 0; spar_band < num_spar_bands; spar_band++ ) + { + if ( hSpar->hMdDec->mixer_mat[out_ch][in_ch][spar_band + i_ts * MAX_PARAM_SPATIAL_SUBFRAMES] != 0.0f ) + { + skip_flag = 0; + break; + } + } + + if ( skip_flag == 0 ) + { + skip_mat[out_ch][in_ch] = 0; + break; + } + } + } +#else for ( i_ts = 0; i_ts < MAX_PARAM_SPATIAL_SUBFRAMES; i_ts++ ) { @@ -891,6 +986,7 @@ static void ivas_spar_get_skip_mat( break; } } +#endif } } @@ -924,6 +1020,9 @@ void ivas_spar_dec_upmixer( int16_t b_skip_mat[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; DECODER_CONFIG_HANDLE hDecoderConfig; SPAR_DEC_HANDLE hSpar; +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + int16_t num_md_sub_frames, md_sf_idx; +#endif push_wmops( "ivas_spar_dec_upmixer" ); @@ -936,6 +1035,10 @@ void ivas_spar_dec_upmixer( numch_in = hSpar->hFbMixer->fb_cfg->num_in_chans; numch_out = hSpar->hFbMixer->fb_cfg->num_out_chans; +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + num_md_sub_frames = ivas_get_spar_dec_md_num_subframes( st_ivas->sba_order, hDecoderConfig->ivas_total_brate ); +#endif + #ifdef DEBUG_SPAR_BYPASS_EVS_CODEC /* by-pass core-coder */ /*write the core coder output to a file for debugging*/ @@ -1025,12 +1128,33 @@ void ivas_spar_dec_upmixer( if ( hSpar->hMdDec->td_decorr_flag ) { - ivas_td_decorr_process( hSpar->hTdDecorr, output, pPcm_tmp, output_frame ); + ivas_td_decorr_process( hSpar->hTdDecorr, output, pPcm_tmp, output_frame ); +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + if ( hSpar->hTdDecorr->num_apd_outputs >= ( nchan_internal - nchan_transport ) ) + { + for ( i = 0; i < nchan_internal - nchan_transport; i++ ) + { + mvr2r( pPcm_tmp[hSpar->hTdDecorr->num_apd_outputs - 1 - i], output[nchan_internal - 1 - i], output_frame ); + } + } + else + { + for ( i = 0; i < nchan_internal - nchan_transport; i++ ) + { + set_zero( output[nchan_internal - 1 - i], output_frame ); + } + for ( i = 0; i < hSpar->hTdDecorr->num_apd_outputs; i++ ) + { + mvr2r( pPcm_tmp[hSpar->hTdDecorr->num_apd_outputs - 1 - i], output[nchan_internal - 1 - i], output_frame ); + } + } +#else for ( i = 0; i < nchan_internal - nchan_transport; i++ ) { mvr2r( pPcm_tmp[hSpar->hTdDecorr->num_apd_outputs - 1 - i], output[nchan_internal - 1 - i], output_frame ); } +#endif } hSpar->hFbMixer->fb_cfg->num_in_chans = num_in_ingest; @@ -1069,7 +1193,12 @@ void ivas_spar_dec_upmixer( * Gen umx mat *---------------------------------------------------------------------*/ - ivas_spar_dec_gen_umx_mat( hSpar->hMdDec, nchan_transport, num_bands_out, st_ivas->bfi ); + ivas_spar_dec_gen_umx_mat( hSpar->hMdDec, nchan_transport, num_bands_out, st_ivas->bfi +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + , + num_md_sub_frames +#endif + ); /*---------------------------------------------------------------------* @@ -1080,7 +1209,12 @@ void ivas_spar_dec_upmixer( /* apply parameters */ /* determine if we can skip certain data */ - ivas_spar_get_skip_mat( hSpar, numch_out, numch_in, num_spar_bands, b_skip_mat ); /* this can be precomputed based on bitrate and format*/ + ivas_spar_get_skip_mat( hSpar, numch_out, numch_in, num_spar_bands, b_skip_mat +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + , + num_md_sub_frames +#endif + ); /* this can be precomputed based on bitrate and format*/ numch_out_dirac = hDecoderConfig->nchan_out; @@ -1119,23 +1253,28 @@ void ivas_spar_dec_upmixer( for ( in_ch = 0; in_ch < numch_in; in_ch++ ) { - if ( cldfb_band < CLDFB_PAR_WEIGHT_START_BAND ) /* tuning parameter, depends on how much SPAR Filters overlap for the CLDFB bands */ - { - spar_band = bin2band->p_cldfb_map_to_spar_band[cldfb_band]; - cldfb_par = mixer_mat[out_ch][in_ch][spar_band]; - } - else +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + if ( b_skip_mat[out_ch][in_ch] == 0 ) +#endif { - cldfb_par = 0.0f; - for ( spar_band = bin2band->p_spar_start_bands[cldfb_band]; spar_band < num_spar_bands; spar_band++ ) + if ( cldfb_band < CLDFB_PAR_WEIGHT_START_BAND ) /* tuning parameter, depends on how much SPAR Filters overlap for the CLDFB bands */ { - /* accumulate contributions from all SPAR bands */ - cldfb_par += mixer_mat[out_ch][in_ch][spar_band] * bin2band->pp_cldfb_weights_per_spar_band[cldfb_band][spar_band]; + spar_band = bin2band->p_cldfb_map_to_spar_band[cldfb_band]; + cldfb_par = mixer_mat[out_ch][in_ch][spar_band]; + } + else + { + cldfb_par = 0.0f; + for ( spar_band = bin2band->p_spar_start_bands[cldfb_band]; spar_band < num_spar_bands; spar_band++ ) + { + /* accumulate contributions from all SPAR bands */ + cldfb_par += mixer_mat[out_ch][in_ch][spar_band] * bin2band->pp_cldfb_weights_per_spar_band[cldfb_band][spar_band]; + } } - } - out_re[out_ch] += cldfb_in_ts_re[in_ch][ts][cldfb_band] * cldfb_par; - out_im[out_ch] += cldfb_in_ts_im[in_ch][ts][cldfb_band] * cldfb_par; + out_re[out_ch] += cldfb_in_ts_re[in_ch][ts][cldfb_band] * cldfb_par; + out_im[out_ch] += cldfb_in_ts_im[in_ch][ts][cldfb_band] * cldfb_par; + } } } @@ -1215,6 +1354,9 @@ void ivas_spar_dec_upmixer( /* Dump audio signal after cldfbSynthesis */ ivas_spar_dump_signal_wav( output_frame, NULL, output, hSpar->numOutChannels, spar_foa_dec_wav[3], "cldfbSynthesis()" ); #endif +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + md_sf_idx = ( num_md_sub_frames == MAX_PARAM_SPATIAL_SUBFRAMES ) ? i_sf : 0; +#endif split_band = SPAR_DIRAC_SPLIT_START_BAND; if ( split_band < IVAS_MAX_NUM_BANDS ) @@ -1232,7 +1374,11 @@ void ivas_spar_dec_upmixer( { for ( b = 0; b < num_spar_bands; b++ ) { +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + hSpar->hMdDec->mixer_mat_prev[4][out_ch][in_ch][b] = hSpar->hMdDec->mixer_mat[out_ch][in_ch][b + md_sf_idx * IVAS_MAX_NUM_BANDS]; +#else hSpar->hMdDec->mixer_mat_prev[4][out_ch][in_ch][b] = hSpar->hMdDec->mixer_mat[out_ch][in_ch][b + i_sf * IVAS_MAX_NUM_BANDS]; +#endif } } } diff --git a/lib_dec/ivas_spar_md_dec.c b/lib_dec/ivas_spar_md_dec.c index 2db860a5d8..fbb8b9b5dd 100644 --- a/lib_dec/ivas_spar_md_dec.c +++ b/lib_dec/ivas_spar_md_dec.c @@ -63,7 +63,13 @@ static const int16_t ivas_spar_dec_plc_spatial_target[IVAS_SPAR_MAX_CH] = { 1, 0 * Static functions declaration *------------------------------------------------------------------------------------------*/ -static void ivas_get_spar_matrices( ivas_spar_md_dec_state_t *hMdDec, const int16_t num_bands_out, const int16_t n_ts, const int16_t bw, const int16_t dtx_vad, const int16_t nB, const int16_t sba_order ); +static void ivas_get_spar_matrices( ivas_spar_md_dec_state_t *hMdDec, const int16_t num_bands_out, const int16_t n_ts, const int16_t bw, const int16_t dtx_vad, const int16_t nB, +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + const int16_t numch_out +#else + const int16_t sba_order +#endif +); static void ivas_decode_arith_bs( ivas_spar_md_dec_state_t *hMdDec, Decoder_State *st, const uint16_t qsi, const int16_t nB, const int16_t bands_bw, int16_t *pDo_diff, const int16_t freq_diff, const int16_t planarCP ); @@ -75,9 +81,24 @@ static void ivas_get_band_idx_from_differential( ivas_spar_md_t *pSpar_md, const static void ivas_mat_col_rearrange( float in_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], const int16_t order[IVAS_SPAR_MAX_CH], const int16_t i_ts, float ***mixer_mat, const int16_t bands, const int16_t num_ch ); -static void ivas_spar_dec_compute_ramp_down_post_matrix( ivas_spar_md_dec_state_t *hMdDec, const int16_t num_bands, const int16_t bfi ); +static void ivas_spar_dec_compute_ramp_down_post_matrix( ivas_spar_md_dec_state_t *hMdDec, const int16_t num_bands, const int16_t bfi +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + , + const int16_t num_md_sub_frames +#endif +); -static void ivas_spar_md_fill_invalid_bands( ivas_spar_dec_matrices_t *pSpar_coeffs, ivas_spar_dec_matrices_t *pSpar_coeffs_prev, const int16_t *valid_bands, int16_t *base_band_age, const int16_t num_bands, const int16_t sba_order ); +static void ivas_spar_md_fill_invalid_bands( ivas_spar_dec_matrices_t *pSpar_coeffs, ivas_spar_dec_matrices_t *pSpar_coeffs_prev, const int16_t *valid_bands, int16_t *base_band_age, const int16_t num_bands, +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + const int16_t numch_out +#else + const int16_t sba_order +#endif +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + , + const int16_t num_md_sub_frames +#endif +); static ivas_error ivas_spar_set_dec_config( ivas_spar_md_dec_state_t *hMdDec, const int16_t nchan_transport, float *pFC ); @@ -97,11 +118,19 @@ static void ivas_spar_dec_parse_md_bs( ivas_spar_md_dec_state_t *hMdDec, Decoder static ivas_error ivas_spar_md_dec_matrix_open( ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ const int16_t num_channels /* i : number of internal channels */ +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + , + const int16_t num_md_sub_frames +#endif ) { int16_t i, j; +#ifndef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + int16_t num_md_sub_frames; + num_md_sub_frames = MAX_PARAM_SPATIAL_SUBFRAMES; +#endif - if ( ( hMdDec->spar_md.band_coeffs = (ivas_band_coeffs_t *) malloc( IVAS_MAX_NUM_BANDS * MAX_PARAM_SPATIAL_SUBFRAMES * sizeof( ivas_band_coeffs_t ) ) ) == NULL ) + if ( ( hMdDec->spar_md.band_coeffs = (ivas_band_coeffs_t *) malloc( IVAS_MAX_NUM_BANDS * num_md_sub_frames * sizeof( ivas_band_coeffs_t ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for band_coeffs in SPAR MD" ); } @@ -117,7 +146,7 @@ static ivas_error ivas_spar_md_dec_matrix_open( } for ( j = 0; j < num_channels; j++ ) { - if ( ( hMdDec->mixer_mat[i][j] = (float *) malloc( MAX_PARAM_SPATIAL_SUBFRAMES * IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL ) + if ( ( hMdDec->mixer_mat[i][j] = (float *) malloc( num_md_sub_frames * IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); } @@ -136,7 +165,7 @@ static ivas_error ivas_spar_md_dec_matrix_open( } for ( j = 0; j < num_channels; j++ ) { - if ( ( hMdDec->spar_coeffs.C_re[i][j] = (float *) malloc( MAX_PARAM_SPATIAL_SUBFRAMES * IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL ) + if ( ( hMdDec->spar_coeffs.C_re[i][j] = (float *) malloc( num_md_sub_frames * IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); } @@ -155,7 +184,7 @@ static ivas_error ivas_spar_md_dec_matrix_open( } for ( j = 0; j < num_channels; j++ ) { - if ( ( hMdDec->spar_coeffs.P_re[i][j] = (float *) malloc( MAX_PARAM_SPATIAL_SUBFRAMES * IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL ) + if ( ( hMdDec->spar_coeffs.P_re[i][j] = (float *) malloc( num_md_sub_frames * IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); } @@ -241,7 +270,24 @@ static ivas_error ivas_spar_md_dec_matrix_open( return IVAS_ERR_OK; } +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +int16_t ivas_get_spar_dec_md_num_subframes( + const int16_t sba_order, /* i : Ambisonic (SBA) order */ + const int32_t ivas_total_brate ) +{ + int16_t num_subframes; + num_subframes = MAX_PARAM_SPATIAL_SUBFRAMES; + if ( sba_order > SBA_FOA_ORDER ) + { + if ( ivas_total_brate >= IVAS_512k ) + { + num_subframes = 1; + } + } + return ( num_subframes ); +} +#endif /*------------------------------------------------------------------------- * ivas_spar_md_dec_open() * @@ -258,6 +304,9 @@ ivas_error ivas_spar_md_dec_open( { ivas_spar_md_dec_state_t *hMdDec; ivas_error error; +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + int16_t num_md_sub_frames; +#endif error = IVAS_ERR_OK; @@ -266,7 +315,15 @@ ivas_error ivas_spar_md_dec_open( return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD decoder" ); } - if ( ( error = ivas_spar_md_dec_matrix_open( hMdDec, num_channels ) ) != IVAS_ERR_OK ) +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + num_md_sub_frames = ivas_get_spar_dec_md_num_subframes( sba_order, hDecoderConfig->ivas_total_brate ); +#endif + if ( ( error = ivas_spar_md_dec_matrix_open( hMdDec, num_channels +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + , + num_md_sub_frames +#endif + ) ) != IVAS_ERR_OK ) { return error; } @@ -442,8 +499,16 @@ ivas_error ivas_spar_md_dec_init( int16_t i, j, k; int16_t nchan_transport; float pFC[IVAS_MAX_NUM_BANDS], PR_minmax[2]; - +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + ivas_sba_get_spar_hoa_md_flag( sba_order, hDecoderConfig->ivas_total_brate, &hMdDec->spar_hoa_md_flag, &hMdDec->spar_hoa_dirac2spar_md_flag ); +#else hMdDec->spar_hoa_md_flag = ivas_sba_get_spar_hoa_md_flag( sba_order, hDecoderConfig->ivas_total_brate ); +#endif + +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + ivas_sba_get_spar_hoa_ch_ind( num_channels, hDecoderConfig->ivas_total_brate, hMdDec->HOA_md_ind ); +#endif + hMdDec->spar_md.num_bands = ( hMdDec->spar_hoa_md_flag ) ? IVAS_MAX_NUM_BANDS : min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND ); ivas_spar_set_bitrate_config( &hMdDec->spar_md_cfg, hMdDec->table_idx, hMdDec->spar_md.num_bands ); @@ -558,7 +623,12 @@ static ivas_error ivas_spar_set_dec_config( hMdDec->spar_md_cfg.max_freq_per_chan[i] = ivas_spar_br_table_consts[hMdDec->table_idx].fpcs; } - nchan = ivas_sba_get_nchan_metadata( ivas_spar_br_table_consts[hMdDec->table_idx].sba_order ); + nchan = ivas_sba_get_nchan_metadata( ivas_spar_br_table_consts[hMdDec->table_idx].sba_order +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + , + ivas_spar_br_table_consts[hMdDec->table_idx].ivas_total_brate +#endif + ); switch ( nchan ) { @@ -618,8 +688,20 @@ void ivas_spar_md_dec_process( { int16_t j, k, b, bw, dtx_vad, nB, i_ts; ivas_spar_md_dec_state_t *hMdDec; +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + int16_t num_md_chs; +#endif + int16_t num_md_sub_frames; hMdDec = st_ivas->hSpar->hMdDec; +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + num_md_chs = ivas_sba_get_nchan_metadata( sba_order, st_ivas->hDecoderConfig->ivas_total_brate ); +#endif +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + num_md_sub_frames = ivas_get_spar_dec_md_num_subframes( sba_order, st_ivas->hDecoderConfig->ivas_total_brate ); +#else + num_md_sub_frames = MAX_PARAM_SPATIAL_SUBFRAMES; +#endif ivas_spar_dec_parse_md_bs( hMdDec, st0, &nB, &bw, &dtx_vad, st_ivas->hDecoderConfig->ivas_total_brate, ivas_spar_br_table_consts[hMdDec->table_idx].usePlanarCoeff, st_ivas->hQMetaData->sba_inactive_mode ); @@ -629,7 +711,12 @@ void ivas_spar_md_dec_process( char f_name[100]; int16_t num_bands = nB; int16_t num_subframes = 1, num_block_groups = 1, num_elements = 1, byte_size = sizeof( float ); - int16_t num_ch = ivas_sba_get_nchan_metadata( sba_order ); + int16_t num_ch = ivas_sba_get_nchan_metadata( sba_order +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + , + st_ivas->hDecoderConfig->ivas_total_brate +#endif + ); for ( b = 0; b < num_bands; b++ ) { sprintf( f_name, "spar_band_pred_coeffs_dec.bin" ); @@ -673,9 +760,14 @@ void ivas_spar_md_dec_process( #endif /* SPAR to DirAC conversion */ - - ivas_spar_to_dirac( st_ivas, hMdDec, dtx_vad, num_bands_out ); - +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + if ( hMdDec->spar_hoa_dirac2spar_md_flag == 1 ) +#else + if ( hMdDec->spar_hoa_md_flag == 0 ) +#endif + { + ivas_spar_to_dirac( st_ivas, hMdDec, dtx_vad, num_bands_out ); + } /* set correct number of bands*/ nB = IVAS_MAX_NUM_BANDS; if ( bw == IVAS_RED_BAND_FACT ) @@ -684,7 +776,7 @@ void ivas_spar_md_dec_process( } /* expand DirAC MD to all time slots */ - for ( i_ts = 1; i_ts < MAX_PARAM_SPATIAL_SUBFRAMES; i_ts++ ) + for ( i_ts = 1; i_ts < num_md_sub_frames; i_ts++ ) { for ( b = 0; b < hMdDec->spar_md.num_bands; b++ ) { @@ -708,7 +800,13 @@ void ivas_spar_md_dec_process( } } - ivas_get_spar_matrices( hMdDec, num_bands_out, MAX_PARAM_SPATIAL_SUBFRAMES, bw, dtx_vad, nB, sba_order ); + ivas_get_spar_matrices( hMdDec, num_bands_out, num_md_sub_frames, bw, dtx_vad, nB, +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + num_md_chs +#else + sba_order +#endif + ); #ifdef DEBUG_SPAR_DIRAC_WRITE_OUT_PRED_PARS { @@ -727,7 +825,17 @@ void ivas_spar_md_dec_process( hMdDec->valid_bands[b] = 1; } - ivas_spar_md_fill_invalid_bands( &hMdDec->spar_coeffs, &hMdDec->spar_coeffs_prev, &hMdDec->valid_bands[0], &hMdDec->base_band_age[0], num_bands_out, sba_order ); + ivas_spar_md_fill_invalid_bands( &hMdDec->spar_coeffs, &hMdDec->spar_coeffs_prev, &hMdDec->valid_bands[0], &hMdDec->base_band_age[0], num_bands_out, +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + num_md_chs +#else + sba_order +#endif +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + , + num_md_sub_frames +#endif + ); hMdDec->dtx_md_smoothing_cntr = 1; @@ -747,6 +855,10 @@ void ivas_spar_md_dec_process( void ivas_spar_smooth_md_dtx( ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ const int16_t num_bands_out /* i : number of output bands */ +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + , + const int16_t num_md_sub_frames /* i : number of metadata subframes */ +#endif ) { int16_t j, k, b, dmx_ch; @@ -782,7 +894,11 @@ void ivas_spar_smooth_md_dtx( } /* expand MD to all time slots */ +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + for ( int16_t i_ts = 1; i_ts < num_md_sub_frames; i_ts++ ) +#else for ( int16_t i_ts = 1; i_ts < MAX_PARAM_SPATIAL_SUBFRAMES; i_ts++ ) +#endif { for ( b = 0; b < num_bands_out; b++ ) { @@ -822,6 +938,10 @@ void ivas_spar_smooth_md_dtx( void ivas_spar_setup_md_smoothing( ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ const int16_t num_bands_out /* i : number of output bands */ +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + , + const int16_t num_md_sub_frames /* i : number of metadata subframes */ +#endif ) { /* copy the coeffs */ @@ -873,7 +993,12 @@ void ivas_spar_setup_md_smoothing( } } - ivas_spar_smooth_md_dtx( hMdDec, num_bands_out ); + ivas_spar_smooth_md_dtx( hMdDec, num_bands_out +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + , + num_md_sub_frames +#endif + ); return; } @@ -953,14 +1078,24 @@ static void ivas_get_spar_matrices( const int16_t bw, const int16_t dtx_vad, const int16_t nB, - const int16_t sba_order ) +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + const int16_t numch_out +#else + const int16_t sba_order +#endif +) { +#ifndef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT int16_t numch_out, num_bands, dmx_ch, split_band; +#else + int16_t num_bands, dmx_ch, split_band; +#endif int16_t i, j, k, m, b, i_ts, active_w; const int16_t *order; float active_w_dm_fac, re; - +#ifndef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT numch_out = ivas_sba_get_nchan_metadata( sba_order ); +#endif num_bands = num_bands_out; order = remix_order_set[hMdDec->spar_md_cfg.remix_unmix_order]; @@ -1343,13 +1478,21 @@ void ivas_spar_dec_gen_umx_mat( const int16_t nchan_transport, /* i : number of transport channels */ const int16_t num_bands_out, /* i : number of output bands */ const int16_t bfi /* i : bad frame indicator */ +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + , + const int16_t num_md_sub_frames +#endif ) { int16_t i, j, b, i_ts, num_out_ch; num_out_ch = hMdDec->spar_md_cfg.num_umx_chs; +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + for ( i_ts = 0; i_ts < num_md_sub_frames; i_ts++ ) +#else for ( i_ts = 0; i_ts < MAX_PARAM_SPATIAL_SUBFRAMES; i_ts++ ) +#endif { if ( hMdDec->td_decorr_flag == 1 ) { @@ -1410,7 +1553,12 @@ void ivas_spar_dec_gen_umx_mat( #endif } - ivas_spar_dec_compute_ramp_down_post_matrix( hMdDec, num_bands_out, bfi ); + ivas_spar_dec_compute_ramp_down_post_matrix( hMdDec, num_bands_out, bfi +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + , + num_md_sub_frames +#endif + ); return; } @@ -1739,7 +1887,8 @@ static void ivas_decode_arith_bs( const int16_t freq_diff, const int16_t planarCP ) { - int16_t i, j, ndm, ndec; + int16_t i, ndm, ndec; + int16_t j; ivas_cell_dim_t pred_cell_dims[IVAS_MAX_NUM_BANDS]; ivas_cell_dim_t drct_cell_dims[IVAS_MAX_NUM_BANDS]; ivas_cell_dim_t decd_cell_dims[IVAS_MAX_NUM_BANDS]; @@ -1754,7 +1903,11 @@ static void ivas_decode_arith_bs( ndec = hMdDec->spar_md_cfg.num_decorr_per_band[bands_bw * i]; pred_cell_dims[i].dim1 = ndm + ndec - 1; +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + if ( hMdDec->spar_hoa_md_flag && hMdDec->spar_hoa_dirac2spar_md_flag ) +#else if ( hMdDec->spar_hoa_md_flag ) +#endif { if ( i >= SPAR_DIRAC_SPLIT_START_BAND ) { @@ -1782,7 +1935,11 @@ static void ivas_decode_arith_bs( if ( any_diff == 1 ) { +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + if ( hMdDec->spar_hoa_md_flag && hMdDec->spar_hoa_dirac2spar_md_flag ) +#else if ( hMdDec->spar_hoa_md_flag ) +#endif { for ( i = 0; i < nB; i++ ) { @@ -1804,7 +1961,11 @@ static void ivas_decode_arith_bs( ivas_fill_band_coeffs_idx( hMdDec->spar_md.band_coeffs_idx, nB, symbol_arr_re, pred_cell_dims, PRED_COEFF, planarCP ); +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + if ( hMdDec->spar_hoa_md_flag && hMdDec->spar_hoa_dirac2spar_md_flag ) +#else if ( hMdDec->spar_hoa_md_flag ) +#endif { for ( i = 0; i < nB; i++ ) { @@ -2070,7 +2231,11 @@ static void ivas_decode_huffman_bs( drct_dim = ndec * ( ndm - 1 ); decd_dim = ndec; pred_offset = 0; +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + if ( hMdDec->spar_hoa_md_flag && hMdDec->spar_hoa_dirac2spar_md_flag ) +#else if ( hMdDec->spar_hoa_md_flag ) +#endif { if ( i >= SPAR_DIRAC_SPLIT_START_BAND ) { @@ -2083,7 +2248,11 @@ static void ivas_decode_huffman_bs( ivas_huffman_decode( &hMdDec->huff_coeffs.pred_huff_re[qsi], st0, &hMdDec->spar_md.band_coeffs_idx[i].pred_index_re[j] ); } +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + if ( hMdDec->spar_hoa_md_flag && hMdDec->spar_hoa_dirac2spar_md_flag ) +#else if ( hMdDec->spar_hoa_md_flag ) +#endif { if ( i >= SPAR_DIRAC_SPLIT_START_BAND ) { @@ -2136,16 +2305,25 @@ static void ivas_spar_md_fill_invalid_bands( const int16_t *valid_bands, int16_t *base_band_age, const int16_t num_bands, - const int16_t sba_order /* i : SBA order */ +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + const int16_t num_channels +#else + const int16_t sba_order +#endif +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + , + const int16_t num_md_sub_frames +#endif ) { int16_t i, j, b, all_valid; int16_t valid_band_idx[IVAS_MAX_NUM_BANDS], idx = -1; int16_t last_valid_band_idx[IVAS_MAX_NUM_BANDS]; float w = 0; +#ifndef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT int16_t num_channels; - num_channels = ivas_sba_get_nchan_metadata( sba_order ); +#endif set_s( valid_band_idx, 0, IVAS_MAX_NUM_BANDS ); set_s( last_valid_band_idx, 0, IVAS_MAX_NUM_BANDS ); @@ -2232,7 +2410,11 @@ static void ivas_spar_md_fill_invalid_bands( { for ( j = 0; j < num_channels; j++ ) { +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + for ( i_ts = 1; i_ts < num_md_sub_frames; i_ts++ ) +#else for ( i_ts = 1; i_ts < MAX_PARAM_SPATIAL_SUBFRAMES; i_ts++ ) +#endif { pSpar_coeffs->C_re[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] = pSpar_coeffs->C_re[i][j][b]; pSpar_coeffs->P_re[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] = pSpar_coeffs->P_re[i][j][b]; @@ -2256,7 +2438,12 @@ static void ivas_spar_md_fill_invalid_bands( static void ivas_spar_dec_compute_ramp_down_post_matrix( ivas_spar_md_dec_state_t *hMdDec, const int16_t num_bands_out, - const int16_t bfi ) + const int16_t bfi +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + , + const int16_t num_md_sub_frames +#endif +) { int16_t num_in_ch, num_out_ch, i, j, b; @@ -2295,7 +2482,11 @@ static void ivas_spar_dec_compute_ramp_down_post_matrix( } /* apply the post matrix */ +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + for ( int16_t i_ts = 0; i_ts < num_md_sub_frames; i_ts++ ) +#else for ( int16_t i_ts = 0; i_ts < MAX_PARAM_SPATIAL_SUBFRAMES; i_ts++ ) +#endif { for ( i = 0; i < num_out_ch; i++ ) { @@ -2765,24 +2956,24 @@ void ivas_spar_to_dirac( /* DirAC MD averaged over 4 subframes and converted to SPAR format similar to encoder processing */ if ( hMdDec->spar_md_cfg.nchan_transport > 1 ) { - ivas_get_spar_md_from_dirac( - azi_dirac, - ele_dirac, + ivas_get_spar_md_from_dirac( + azi_dirac, + ele_dirac, diffuseness, #ifdef HODIRAC_PRED azi_dirac2, ele_dirac2, ratio, #endif - 1, - NULL, - &hMdDec->spar_md, - &hMdDec->spar_md_cfg, - end_band, - num_bands_out, - ( hMdDec->spar_hoa_md_flag ) ? 1 : sba_order_internal, - dtx_vad, - NULL + 1, + NULL, + &hMdDec->spar_md, + &hMdDec->spar_md_cfg, + end_band, + num_bands_out, + ( hMdDec->spar_hoa_md_flag ) ? 1 : sba_order_internal, + dtx_vad, + NULL #ifdef HODIRAC_PRED , st_ivas->sba_analysis_order > 1 @@ -2799,24 +2990,24 @@ void ivas_spar_to_dirac( } } - ivas_get_spar_md_from_dirac( - azi_dirac, - ele_dirac, - diffuseness, + ivas_get_spar_md_from_dirac( + azi_dirac, + ele_dirac, + diffuseness, #ifdef HODIRAC_PRED azi_dirac2, ele_dirac2, ratio, #endif - MAX_PARAM_SPATIAL_SUBFRAMES, - NULL, - &hMdDec->spar_md, - &hMdDec->spar_md_cfg, - end_band, - num_bands_out, - ( hMdDec->spar_hoa_md_flag ) ? 1 : sba_order_internal, - dtx_vad, - NULL + MAX_PARAM_SPATIAL_SUBFRAMES, + NULL, + &hMdDec->spar_md, + &hMdDec->spar_md_cfg, + end_band, + num_bands_out, + ( hMdDec->spar_hoa_md_flag ) ? 1 : sba_order_internal, + dtx_vad, + NULL #ifdef HODIRAC_PRED , st_ivas->sba_analysis_order > 1 diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index ab95c31b5e..fa24c39f9a 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -713,6 +713,9 @@ typedef struct ivas_dirac_dec_data_structure PARAM_ISM_RENDERING_HANDLE hParamIsmRendering; IVAS_FB_MIXER_HANDLE hFbMdft; int16_t dirac_to_spar_md_bands[DIRAC_MAX_NBANDS]; +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + const int16_t *sba_map_tc; +#endif } DIRAC_DEC_DATA, *DIRAC_DEC_HANDLE; @@ -809,6 +812,10 @@ typedef struct ivas_spar_md_dec_state_t int16_t table_idx; int16_t dtx_vad; int16_t spar_hoa_md_flag; +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + int16_t spar_hoa_dirac2spar_md_flag; + int16_t HOA_md_ind[IVAS_SPAR_MAX_CH]; +#endif } ivas_spar_md_dec_state_t; @@ -860,7 +867,6 @@ typedef struct ivas_spar_dec_lib_t int16_t numOutChannels; int16_t pca_ingest_channels; #endif - } SPAR_DEC_DATA, *SPAR_DEC_HANDLE; diff --git a/lib_enc/ivas_enc_cov_handler.c b/lib_enc/ivas_enc_cov_handler.c index 9cad98049b..dceaf38d5f 100644 --- a/lib_enc/ivas_enc_cov_handler.c +++ b/lib_enc/ivas_enc_cov_handler.c @@ -56,7 +56,12 @@ * Local functions declarations *------------------------------------------------------------------------------------------*/ -static void ivas_band_cov( float **ppIn_FR_real, float **ppIn_FR_imag, const int16_t num_chans, const int16_t num_bins, int16_t stride, float **pFb_bin_to_band, const int16_t *pFb_start_bin_per_band, const int16_t *pFb_active_bins_per_band, const int16_t start_band, const int16_t end_band, float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH] ); +static void ivas_band_cov( float **ppIn_FR_real, float **ppIn_FR_imag, const int16_t num_chans, const int16_t num_bins, int16_t stride, float **pFb_bin_to_band, const int16_t *pFb_start_bin_per_band, const int16_t *pFb_active_bins_per_band, const int16_t start_band, const int16_t end_band, float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH] +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + , + const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] +#endif +); /*------------------------------------------------------------------------- * ivas_spar_covar_enc_open() @@ -155,7 +160,12 @@ void ivas_enc_cov_handler_process( const int16_t end_band, const int16_t num_ch, const int16_t dtx_vad, - const int16_t transient_det[2] ) + const int16_t transient_det[2] +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + , + const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] +#endif +) { int16_t i, j; int16_t dtx_cov_flag; @@ -168,7 +178,12 @@ void ivas_enc_cov_handler_process( pFb->fb_bin_to_band.p_short_stride_start_bin_per_band, pFb->fb_bin_to_band.p_short_stride_num_bins_per_band, start_band, end_band, - cov_real ); + cov_real +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + , + HOA_md_ind +#endif + ); #ifdef DEBUG_SPAR_WRITE_OUT_COV { @@ -260,7 +275,12 @@ static void ivas_band_cov( const int16_t *pFb_active_bins_per_band, const int16_t start_band, const int16_t end_band, - float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH] ) + float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH] +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + , + const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] +#endif +) { int16_t i, j, k; float pV_re[L_FRAME48k]; @@ -272,8 +292,13 @@ static void ivas_band_cov( { #ifdef HODIRAC +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + int16_t i1 = HOA_md_ind[i]; + int16_t j1 = HOA_md_ind[j]; +#else int16_t i1 = HOA_keep_ind_spar[i]; int16_t j1 = HOA_keep_ind_spar[j]; +#endif #endif for ( k = 0; k < num_bins; k++ ) diff --git a/lib_enc/ivas_spar_encoder.c b/lib_enc/ivas_spar_encoder.c index 8c7c892ebd..236b9208e0 100644 --- a/lib_enc/ivas_spar_encoder.c +++ b/lib_enc/ivas_spar_encoder.c @@ -88,7 +88,12 @@ ivas_error ivas_spar_enc_open( input_Fs = hEncoderConfig->input_Fs; sba_order_internal = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); - nchan_inp = ivas_sba_get_nchan_metadata( sba_order_internal ); + nchan_inp = ivas_sba_get_nchan_metadata( sba_order_internal +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + , + hEncoderConfig->ivas_total_brate +#endif + ); assert( nchan_inp <= hEncoderConfig->nchan_inp ); ivas_total_brate = hEncoderConfig->ivas_total_brate; @@ -461,7 +466,12 @@ static ivas_error ivas_spar_enc_process( input_frame = (int16_t) ( input_Fs / FRAMES_PER_SEC ); sba_order = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); - nchan_inp = ivas_sba_get_nchan_metadata( sba_order ); + nchan_inp = ivas_sba_get_nchan_metadata( sba_order +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + , + hEncoderConfig->ivas_total_brate +#endif + ); assert( nchan_inp <= hEncoderConfig->nchan_inp ); #ifdef HODIRAC nchan_fb_in = hSpar->hFbMixer->fb_cfg->nchan_fb_in; @@ -506,7 +516,12 @@ static ivas_error ivas_spar_enc_process( } /* run Filter Bank overlapping MDFT analysis first, then we can use the temporary buffer for Parameter MDFT analysis*/ - ivas_fb_mixer_pcm_ingest( hSpar->hFbMixer, data_f, p_pcm_tmp, input_frame ); + ivas_fb_mixer_pcm_ingest( hSpar->hFbMixer, data_f, p_pcm_tmp, input_frame +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + , + hSpar->hMdEnc->HOA_md_ind +#endif + ); /* prepare Parameter MDFT analysis */ #ifdef HODIRAC @@ -706,7 +721,12 @@ static ivas_error ivas_spar_enc_process( hSpar->hFbMixer->pFb->filterbank_num_bands, nchan_inp, dtx_vad, - transient_det ); + transient_det +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + , + hSpar->hMdEnc->HOA_md_ind +#endif + ); nchan_transport = st_ivas->nchan_transport; /*-----------------------------------------------------------------------------------------* @@ -717,7 +737,9 @@ static ivas_error ivas_spar_enc_process( { ivas_spar_md_enc_process( hSpar->hMdEnc, hEncoderConfig, cov_real, cov_dtx_real, hMetaData, dtx_vad, nchan_inp, sba_order ); } - +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + if ( hSpar->hMdEnc->spar_hoa_dirac2spar_md_flag ) +#endif { float azi_dirac[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES]; float ele_dirac[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES]; diff --git a/lib_enc/ivas_spar_md_enc.c b/lib_enc/ivas_spar_md_enc.c index 645f690ac0..e2b8310fe2 100644 --- a/lib_enc/ivas_spar_md_enc.c +++ b/lib_enc/ivas_spar_md_enc.c @@ -119,7 +119,12 @@ ivas_error ivas_spar_md_enc_open( return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD encoder" ); } - num_channels = ivas_sba_get_nchan_metadata( sba_order ); + num_channels = ivas_sba_get_nchan_metadata( sba_order +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + , + hEncoderConfig->ivas_total_brate +#endif + ); if ( ( hMdEnc->spar_md.band_coeffs = (ivas_band_coeffs_t *) malloc( IVAS_MAX_NUM_BANDS * sizeof( ivas_band_coeffs_t ) ) ) == NULL ) { @@ -314,9 +319,20 @@ ivas_error ivas_spar_md_enc_init( float PR_minmax[2]; int16_t num_channels, i, j, k; +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + ivas_sba_get_spar_hoa_md_flag( sba_order, hEncoderConfig->ivas_total_brate, &hMdEnc->spar_hoa_md_flag, &hMdEnc->spar_hoa_dirac2spar_md_flag ); +#else hMdEnc->spar_hoa_md_flag = ivas_sba_get_spar_hoa_md_flag( sba_order, hEncoderConfig->ivas_total_brate ); - num_channels = ivas_sba_get_nchan_metadata( sba_order ); - +#endif + num_channels = ivas_sba_get_nchan_metadata( sba_order +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + , + hEncoderConfig->ivas_total_brate +#endif + ); +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + ivas_sba_get_spar_hoa_ch_ind( num_channels, hEncoderConfig->ivas_total_brate, hMdEnc->HOA_md_ind ); +#endif table_idx = ivas_get_spar_table_idx( hEncoderConfig->ivas_total_brate, sba_order, SPAR_CONFIG_BW, NULL, NULL ); 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 ); @@ -548,9 +564,9 @@ ivas_error ivas_spar_md_enc_process( { float pred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS]; float dm_fv_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS]; + int16_t i, j, b, qsi, ndm, ndec, num_ch, num_quant_strats; + int16_t planarCP; float pred_coeffs_re_local[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS]; - int16_t i, b, qsi, ndm, ndec, num_ch, num_quant_strats; - int16_t j, planarCP; int16_t k, bwidth, num_bands, num_bands_full, num_bands_bw; int16_t active_w, nchan_transport, dmx_switch, strat; int16_t nB, bands_bw, packed_ok = 0; @@ -562,7 +578,12 @@ ivas_error ivas_spar_md_enc_process( float Wscale[IVAS_MAX_NUM_BANDS]; num_quant_strats = hMdEnc->spar_md_cfg.num_quant_strats; - num_ch = ivas_sba_get_nchan_metadata( sba_order ); + num_ch = ivas_sba_get_nchan_metadata( sba_order +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + , + hEncoderConfig->ivas_total_brate +#endif + ); active_w = hMdEnc->spar_md_cfg.active_w; nchan_transport = hMdEnc->spar_md_cfg.nchan_transport; @@ -626,8 +647,11 @@ ivas_error ivas_spar_md_enc_process( nB = num_bands; bands_bw = 1; } - +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + if ( hMdEnc->spar_hoa_md_flag && hMdEnc->spar_hoa_dirac2spar_md_flag ) +#else if ( hMdEnc->spar_hoa_md_flag ) +#endif { for ( b = SPAR_DIRAC_SPLIT_START_BAND; b < num_bands; b++ ) { @@ -766,7 +790,11 @@ ivas_error ivas_spar_md_enc_process( } } +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + if ( hMdEnc->spar_hoa_md_flag && hMdEnc->spar_hoa_dirac2spar_md_flag ) +#else if ( hMdEnc->spar_hoa_md_flag ) +#endif { for ( b = SPAR_DIRAC_SPLIT_START_BAND; b < num_bands; b++ ) { @@ -1264,7 +1292,11 @@ static void ivas_get_huffman_coded_bs( pred_coeff_dim = ndm + ndec - 1; pred_offset = 0; +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + if ( hMdEnc->spar_hoa_md_flag && hMdEnc->spar_hoa_dirac2spar_md_flag ) +#else if ( hMdEnc->spar_hoa_md_flag ) +#endif { if ( i >= SPAR_DIRAC_SPLIT_START_BAND ) { @@ -1339,7 +1371,8 @@ static void ivas_get_arith_coded_bs( const int16_t qsi, const int16_t planarCP ) { - int16_t i, j, any_diff; + int16_t i, any_diff; + int16_t j; ivas_cell_dim_t pred_cell_dims[IVAS_MAX_NUM_BANDS]; ivas_cell_dim_t drct_cell_dims[IVAS_MAX_NUM_BANDS]; ivas_cell_dim_t decd_cell_dims[IVAS_MAX_NUM_BANDS]; @@ -1353,13 +1386,18 @@ static void ivas_get_arith_coded_bs( ndm = hMdEnc->spar_md_cfg.num_dmx_chans_per_band[bands_bw * i]; ndec = hMdEnc->spar_md_cfg.num_decorr_per_band[bands_bw * i]; pred_cell_dims[i].dim1 = ndm + ndec - 1; +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + if ( hMdEnc->spar_hoa_md_flag && hMdEnc->spar_hoa_dirac2spar_md_flag ) +#else if ( hMdEnc->spar_hoa_md_flag ) +#endif { if ( i >= SPAR_DIRAC_SPLIT_START_BAND ) { pred_cell_dims[i].dim1 -= ( FOA_CHANNELS - 1 ); } } + pred_cell_dims[i].dim2 = 1; drct_cell_dims[i].dim1 = ndec; drct_cell_dims[i].dim2 = ndm - 1; @@ -1378,7 +1416,11 @@ static void ivas_get_arith_coded_bs( break; } } +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + if ( hMdEnc->spar_hoa_md_flag && hMdEnc->spar_hoa_dirac2spar_md_flag ) +#else if ( hMdEnc->spar_hoa_md_flag ) +#endif { for ( i = 0; i < nB; i++ ) { @@ -1398,6 +1440,7 @@ static void ivas_get_arith_coded_bs( } } } + ivas_copy_band_coeffs_idx_to_arr( hMdEnc->spar_md.band_coeffs_idx, nB, symbol_arr_re, pred_cell_dims, PRED_COEFF, planarCP ); if ( any_diff == 1 ) @@ -1408,7 +1451,11 @@ static void ivas_get_arith_coded_bs( ivas_arith_encode_cmplx_cell_array( &hMdEnc->arith_coeffs.pred_arith_re[qsi], &hMdEnc->arith_coeffs.pred_arith_re_diff[qsi], pDo_diff, nB, symbol_arr_re, symbol_arr_old_re, pred_cell_dims, hMetaData, any_diff ); +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + if ( hMdEnc->spar_hoa_md_flag && hMdEnc->spar_hoa_dirac2spar_md_flag ) +#else if ( hMdEnc->spar_hoa_md_flag ) +#endif { for ( i = 0; i < nB; i++ ) { diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index 598a618ee8..fc8d99933c 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -676,6 +676,10 @@ typedef struct ivas_spar_md_enc_state_t ivas_huff_coeffs_t huff_coeffs; int16_t table_idx; int16_t spar_hoa_md_flag; +#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + int16_t spar_hoa_dirac2spar_md_flag; + int16_t HOA_md_ind[IVAS_SPAR_MAX_CH]; +#endif } ivas_spar_md_enc_state_t; /* PCA structure */ diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index fd13c83e1d..4c7858650f 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -3660,11 +3660,20 @@ ivas_error IVAS_REND_FeedInputMasaMetadata( *-------------------------------------------------------------------*/ ivas_error IVAS_REND_InitConfig( - IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ +#ifdef FIX_392_LATE_REVERB + const IVAS_REND_AudioConfig outAudioConfig /* i : output audioConfig */ +#else const bool rendererConfigEnabled /* i : flag indicating if a renderer configuration file was supplied */ +#endif ) { ivas_error error; +#ifdef FIX_392_LATE_REVERB + bool rendererConfigEnabled; + + rendererConfigEnabled = ( getAudioConfigType( outAudioConfig ) == IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL ); +#endif if ( rendererConfigEnabled ) { @@ -3681,8 +3690,11 @@ ivas_error IVAS_REND_InitConfig( { return error; } - +#ifdef FIX_392_LATE_REVERB + if ( ( error = ivas_render_config_init_from_rom( &hIvasRend->hRendererConfig, outAudioConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_render_config_init_from_rom( &hIvasRend->hRendererConfig, hIvasRend->rendererConfigEnabled ) ) != IVAS_ERR_OK ) +#endif { return error; } diff --git a/lib_rend/lib_rend.h b/lib_rend/lib_rend.h index 99b33dc381..ec4c05a6d6 100644 --- a/lib_rend/lib_rend.h +++ b/lib_rend/lib_rend.h @@ -228,8 +228,12 @@ ivas_error IVAS_REND_FeedInputMasaMetadata( ); ivas_error IVAS_REND_InitConfig( - IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ - const bool rendererConfigEnabled /* i : flag indicating if a renderer configuration file was supplied */ + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ +#ifdef FIX_392_LATE_REVERB + const IVAS_REND_AudioConfig outAudioConfig /* i : output audioConfig */ +#else + const bool rendererConfigEnabled /* i : flag indicating if a renderer configuration file was supplied */ +#endif ); int16_t IVAS_REND_GetRenderConfig( -- GitLab From 61ee70644a72b0f569d21f4fd7fffc6f1a80a158 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Mon, 24 Apr 2023 13:24:40 +0200 Subject: [PATCH 22/66] fix MASA non-BE-ness --- lib_com/ivas_cnst.h | 6 +++--- lib_com/ivas_prot.h | 7 +++++++ lib_com/ivas_qmetadata_com.c | 24 ++++++++++++++++++++++++ lib_enc/ivas_qmetadata_enc.c | 29 +++++++++++++++++++---------- 4 files changed, 53 insertions(+), 13 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 9e3c0efacd..513ff60e66 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -1203,10 +1203,10 @@ enum #define MASA_LIMIT_NO_BANDS_SUR_COH 8 #define MINIMUM_BIT_BUDGET_NORMAL_META 100 #ifdef HODIRAC -#define DIFF_DFRATIO_2BIT_LIMIT_IDX 4 -#else -#define DIFF_DFRATIO_2BIT_LIMIT_IDX 3 +#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 diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 8e7517da30..0fec40068b 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -4708,6 +4708,13 @@ void ivas_set_qmetadata_maxbit_req( const IVAS_FORMAT ivas_format /* i : IVAS format */ ); +#ifdef HODIRAC +/*! r: Bits to be used for quantizing distribution ratio of direct-to-total ratios */ +int16_t ivas_get_df_ratio_bits_hodirac( + int16_t index_diff /* i : Index of quantized diffuse-to-total ratio */ +); +#endif + /*! r: Bits to be used for quantizing distribution ratio of direct-to-total ratios */ int16_t ivas_get_df_ratio_bits( int16_t index_diff /* i : Index of quantized diffuse-to-total ratio */ diff --git a/lib_com/ivas_qmetadata_com.c b/lib_com/ivas_qmetadata_com.c index 3081d409ff..efcdbb0931 100644 --- a/lib_com/ivas_qmetadata_com.c +++ b/lib_com/ivas_qmetadata_com.c @@ -626,6 +626,30 @@ void ivas_qmetadata_direction_vector_to_azimuth_elevation( return; } +#ifdef HODIRAC +/*! r: bits to be used for quantizing ratio of ratios */ +int16_t ivas_get_df_ratio_bits_hodirac( + int16_t index_diff /* i : index of quantized diffuse-to-total ratio */ +) +{ + int16_t dfRatio_bits; + + if ( index_diff >= DIFF_DFRATIO_1BIT_LIMIT_IDX ) + { + dfRatio_bits = 1; + } + else if ( index_diff >= DIFF_DFRATIO_2BIT_LIMIT_IDX_HODIRAC ) + { + dfRatio_bits = 2; + } + else + { + dfRatio_bits = 3; + } + + return dfRatio_bits; +} +#endif /*--------------------------------------------------------------- * ivas_get_df_ratio_bits() diff --git a/lib_enc/ivas_qmetadata_enc.c b/lib_enc/ivas_qmetadata_enc.c index 6f30a9986c..6daa4be4a7 100644 --- a/lib_enc/ivas_qmetadata_enc.c +++ b/lib_enc/ivas_qmetadata_enc.c @@ -614,8 +614,8 @@ ivas_error ivas_qmetadata_enc_encode( { for ( j = 0; j < nblocks; j++ ) { - fprintf( pF_azi, " %+5.2f ", (int16_t) ( 100.f * q_direction->band_data[i].azimuth[j] ) / 100.f ); - fprintf( pF_ele, " %+5.2f ", (int16_t) ( 100.f * q_direction->band_data[i].elevation[j] ) / 100.f ); + fprintf( pF_azi, " %+5.2f ", ( int16_t )( 100.f * q_direction->band_data[i].azimuth[j] ) / 100.f ); + fprintf( pF_ele, " %+5.2f ", ( int16_t )( 100.f * q_direction->band_data[i].elevation[j] ) / 100.f ); fprintf( pF_ratio, " %1.3f ", q_direction->band_data[i].energy_ratio[j] ); if ( q_direction->coherence_band_data != NULL ) { @@ -649,7 +649,7 @@ ivas_error ivas_qmetadata_enc_encode( } } - j = (int16_t) ( hMetaData->nb_bits_tot ); + j = ( int16_t )( hMetaData->nb_bits_tot ); dbgwrite( &j, sizeof( int16_t ), 1, 1, "./res/IVAS_QMETADATA_bits.bin" ); } #endif @@ -704,7 +704,7 @@ void ivas_qmetadata_enc_sid_encode( if ( sba_mode == SBA_MODE_SPAR ) { /* TODO: still use old sid frame size to keep bitexactness */ - metadata_sid_bits = (int16_t) ( 5000 /*IVAS_SID_5k2*/ - SID_2k40 ) / FRAMES_PER_SEC - ( SPAR_DTX_BANDS * SPAR_SID_BITS_TAR_PER_BAND ) - 1; /* -1 for inactive mode header bit*/ + metadata_sid_bits = ( int16_t )( 5000 /*IVAS_SID_5k2*/ - SID_2k40 ) / FRAMES_PER_SEC - ( SPAR_DTX_BANDS * SPAR_SID_BITS_TAR_PER_BAND ) - 1; /* -1 for inactive mode header bit*/ } else { @@ -885,8 +885,8 @@ void ivas_qmetadata_enc_sid_encode( /*direction_distance( elevation_orig, azimuth_orig, q_direction->elevation, q_direction->azimuth, nbands, nblocks, mat_dist );*/ for ( b = start_band; b < nbands; b++ ) { - fprintf( pF_azi, " %+5.2f ", (int16_t) ( 100.f * avg_azimuth[b] ) / 100.f ); - fprintf( pF_ele, " %+5.2f ", (int16_t) ( 100.f * avg_elevation[b] ) / 100.f ); + fprintf( pF_azi, " %+5.2f ", ( int16_t )( 100.f * avg_azimuth[b] ) / 100.f ); + fprintf( pF_ele, " %+5.2f ", ( int16_t )( 100.f * avg_elevation[b] ) / 100.f ); fprintf( pF_ratio, " %1.3f ", q_direction->band_data[b].energy_ratio[0] ); } fprintf( pF_azi, "\n" ); @@ -946,7 +946,7 @@ void reset_metadata_spatial( { assert( hMetaData->ind_list[0].nb_bits == 1 ); hMetaData->ind_list[0].value = 1; - metadata_sid_bits = (int16_t) ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; + metadata_sid_bits = ( int16_t )( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; while ( hMetaData->nb_bits_tot < metadata_sid_bits ) { push_next_indice( hMetaData, 0, 1 ); /*fill bit*/ @@ -1116,7 +1116,16 @@ static void ivas_qmetadata_quantize_diffuseness_nrg_ratios( index_diff = masa_sq( diffRatio, diffuseness_thresholds, DIRAC_DIFFUSE_LEVELS ); diffRatioQ = diffuseness_reconstructions[index_diff]; - dfRatio_bits = ivas_get_df_ratio_bits( index_diff ); +#ifdef HODIRAC + if ( hodirac ) + { + dfRatio_bits = ivas_get_df_ratio_bits_hodirac( index_diff ); + } + else +#endif + { + dfRatio_bits = ivas_get_df_ratio_bits( index_diff ); + } dfRatioBits[dir2band] = dfRatio_bits; @@ -1277,7 +1286,7 @@ static void ivas_diffuseness_huff_ec_prepare( { av += q_direction->band_data[b].energy_ratio_index[0]; } - av = (int16_t) ( 0.5f + av / (float) nbands ); + av = ( int16_t )( 0.5f + av / (float) nbands ); *best_av = av; *diffuseness_bits_huff = MAX16B; @@ -1791,7 +1800,7 @@ static int16_t mean_removed_GR_new( int16_t sh_idx[MASA_MAXIMUM_CODING_SUBBANDS]; int16_t max_ns[MASA_MAXIMUM_CODING_SUBBANDS]; - av = (int16_t) ( 0.5f + sum_s( (const int16_t *) idx, len ) / (float) len ); + av = ( int16_t )( 0.5f + sum_s( (const int16_t *) idx, len ) / (float) len ); *p_av = av; for ( i = 0; i < len; i++ ) { -- GitLab From e9a97b69cb5dfa37cff5e6254a00229696f1c6b6 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Mon, 24 Apr 2023 16:07:15 +0200 Subject: [PATCH 23/66] fix bitrate-switching crash under HODIRAC_FIX_BR_SWITCHING_CRASH --- lib_com/options.h | 2 ++ lib_enc/ivas_sba_enc.c | 7 ++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 1a15ac3a62..6ee03b3625 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -154,6 +154,8 @@ #define SPAR_HOA2_PLANAR_HOA3_DECOR_OPT //#define DIRAC_DRCT_GAIN_DISABLE +#define HODIRAC_FIX_BR_SWITCHING_CRASH + /*#define HODIRAC_DEBUG*/ #ifdef HODIRAC_DEBUG diff --git a/lib_enc/ivas_sba_enc.c b/lib_enc/ivas_sba_enc.c index 4b83f3881f..52c7e0afb5 100644 --- a/lib_enc/ivas_sba_enc.c +++ b/lib_enc/ivas_sba_enc.c @@ -243,7 +243,12 @@ ivas_error ivas_sba_enc_reconfigure( hEncoderConfig->element_mode_init = IVAS_CPE_MDCT; } - if ( ( sba_mode_old != st_ivas->sba_mode ) || ( nchan_transport_old != st_ivas->nchan_transport ) ) + if ( ( sba_mode_old != st_ivas->sba_mode ) || ( nchan_transport_old != st_ivas->nchan_transport ) +#ifdef HODIRAC_FIX_BR_SWITCHING_CRASH + || ( ivas_total_brate >= IVAS_512k && hEncoderConfig->last_ivas_total_brate < IVAS_512k ) + || ( ivas_total_brate < IVAS_512k && hEncoderConfig->last_ivas_total_brate >= IVAS_512k ) +#endif + ) { #ifdef HODIRAC int16_t nchan_fb_in; -- GitLab From 256201477ba6803336c9184c55f678fa26485e83 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Mon, 24 Apr 2023 17:44:25 +0200 Subject: [PATCH 24/66] fix bitstream mismatch in HO-DirAC modes --- lib_dec/ivas_qmetadata_dec.c | 51 ++++++++++++++++++++++++++---------- 1 file changed, 37 insertions(+), 14 deletions(-) diff --git a/lib_dec/ivas_qmetadata_dec.c b/lib_dec/ivas_qmetadata_dec.c index fe1412d7c1..d6e27b19a3 100644 --- a/lib_dec/ivas_qmetadata_dec.c +++ b/lib_dec/ivas_qmetadata_dec.c @@ -199,20 +199,43 @@ int16_t ivas_qmetadata_dec_decode( bits_diff_sum += ivas_qmetadata_entropy_decode_diffuseness( bitstream, index, &( hQMetaData->q_direction[0] ), &diffuseness_index_max_ec_frame_pre[0] ); - if ( hQMetaData->no_directions == 2 ) +#ifdef HODIRAC + if ( hodirac ) { - /* Calculate bits for dfRatio */ - dir2band = 0; - for ( b = hQMetaData->q_direction[0].cfg.start_band; b < hQMetaData->q_direction[0].cfg.nbands; b++ ) + if ( hQMetaData->no_directions == 2 ) { - if ( hQMetaData->twoDirBands[b] == 1 ) + /* Calculate bits for dfRatio */ + dir2band = 0; + for ( b = hQMetaData->q_direction[0].cfg.start_band; b < hQMetaData->q_direction[0].cfg.nbands; b++ ) { - dfRatio_bits[dir2band] = ivas_get_df_ratio_bits( hQMetaData->q_direction[0].band_data[b].energy_ratio_index[0] ); - dir2band++; + if ( hQMetaData->twoDirBands[b] == 1 ) + { + dfRatio_bits[dir2band] = ivas_get_df_ratio_bits_hodirac( hQMetaData->q_direction[0].band_data[b].energy_ratio_index[0] ); + dir2band++; + } } + + bits_diff_sum += ivas_qmetadata_entropy_decode_df_ratio( bitstream, index, &( hQMetaData->q_direction[1] ), dfRatio_bits ); } + } + else +#endif + { + if ( hQMetaData->no_directions == 2 ) + { + /* Calculate bits for dfRatio */ + dir2band = 0; + for ( b = hQMetaData->q_direction[0].cfg.start_band; b < hQMetaData->q_direction[0].cfg.nbands; b++ ) + { + if ( hQMetaData->twoDirBands[b] == 1 ) + { + dfRatio_bits[dir2band] = ivas_get_df_ratio_bits( hQMetaData->q_direction[0].band_data[b].energy_ratio_index[0] ); + dir2band++; + } + } - bits_diff_sum += ivas_qmetadata_entropy_decode_df_ratio( bitstream, index, &( hQMetaData->q_direction[1] ), dfRatio_bits ); + bits_diff_sum += ivas_qmetadata_entropy_decode_df_ratio( bitstream, index, &( hQMetaData->q_direction[1] ), dfRatio_bits ); + } } /* Calculate direct-to-total energy ratios for both directions from diffuse-to-total ratio and distribution factor of direct-to-total ratios */ @@ -605,8 +628,8 @@ int16_t ivas_qmetadata_dec_decode( { for ( m = 0; m < q_direction->cfg.nblocks; m++ ) { - fprintf( pF_azi, " %+5.2f ", (int16_t) ( 100.f * q_direction->band_data[b].azimuth[m] ) / 100.f ); - fprintf( pF_ele, " %+5.2f ", (int16_t) ( 100.f * q_direction->band_data[b].elevation[m] ) / 100.f ); + fprintf( pF_azi, " %+5.2f ", ( int16_t )( 100.f * q_direction->band_data[b].azimuth[m] ) / 100.f ); + fprintf( pF_ele, " %+5.2f ", ( int16_t )( 100.f * q_direction->band_data[b].elevation[m] ) / 100.f ); fprintf( pF_ratio, " %1.3f ", q_direction->band_data[b].energy_ratio[m] ); if ( q_direction->coherence_band_data != NULL ) { @@ -756,7 +779,7 @@ int16_t ivas_qmetadata_dec_sid_decode( if ( sba_mode == SBA_MODE_SPAR ) { /* TODO: still use old sid frame size to keep bitexactness */ - metadata_sid_bits = (int16_t) ( 5000 /*IVAS_SID_5k2*/ - SID_2k40 ) / FRAMES_PER_SEC - ( SPAR_DTX_BANDS * 18 ) - 1; /* -1 for inactive mode header bit*/ + metadata_sid_bits = ( int16_t )( 5000 /*IVAS_SID_5k2*/ - SID_2k40 ) / FRAMES_PER_SEC - ( SPAR_DTX_BANDS * 18 ) - 1; /* -1 for inactive mode header bit*/ } else { @@ -917,8 +940,8 @@ int16_t ivas_qmetadata_dec_sid_decode( { for ( m = 0; m < nblocks; m++ ) { - fprintf( pF_azi, " %+5.2f ", (int16_t) ( 100.f * q_direction->band_data[b].azimuth[m] ) / 100.f ); - fprintf( pF_ele, " %+5.2f ", (int16_t) ( 100.f * q_direction->band_data[b].elevation[m] ) / 100.f ); + fprintf( pF_azi, " %+5.2f ", ( int16_t )( 100.f * q_direction->band_data[b].azimuth[m] ) / 100.f ); + fprintf( pF_ele, " %+5.2f ", ( int16_t )( 100.f * q_direction->band_data[b].elevation[m] ) / 100.f ); fprintf( pF_ratio, " %1.3f ", q_direction->band_data[b].energy_ratio[m] ); } } @@ -3316,7 +3339,7 @@ static void decode_combined_index( for ( i = len - 1; i > 0; i-- ) { - index[i] = (uint16_t) ( comb_index / base[i] ); + index[i] = ( uint16_t )( comb_index / base[i] ); comb_index -= index[i] * base[i]; } -- GitLab From 981b459177cad4ca45bab6f6e3344e586c7e66a2 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Mon, 24 Apr 2023 18:17:08 +0200 Subject: [PATCH 25/66] fix decoder crash with bitrate switching --- lib_dec/ivas_sba_dec.c | 7 ++++++- lib_enc/ivas_sba_enc.c | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c index 17676e17de..9301fb45cb 100644 --- a/lib_dec/ivas_sba_dec.c +++ b/lib_dec/ivas_sba_dec.c @@ -136,7 +136,12 @@ ivas_error ivas_sba_dec_reconfigure( hSpar->hPCA = NULL; } - if ( nchan_transport_old != ivas_get_sba_num_TCs( ivas_total_brate, sba_order_internal ) ) + if ( nchan_transport_old != ivas_get_sba_num_TCs( ivas_total_brate, sba_order_internal ) +#ifdef HODIRAC_FIX_BR_SWITCHING_CRASH + || ( last_ivas_total_brate >= IVAS_512k && ivas_total_brate < IVAS_512k ) + || ( last_ivas_total_brate < IVAS_512k && ivas_total_brate >= IVAS_512k ) +#endif + ) { ivas_spar_dec_close( &( st_ivas->hSpar ), hDecoderConfig->output_Fs, 1 ); diff --git a/lib_enc/ivas_sba_enc.c b/lib_enc/ivas_sba_enc.c index 52c7e0afb5..6bec0860e8 100644 --- a/lib_enc/ivas_sba_enc.c +++ b/lib_enc/ivas_sba_enc.c @@ -245,8 +245,8 @@ ivas_error ivas_sba_enc_reconfigure( if ( ( sba_mode_old != st_ivas->sba_mode ) || ( nchan_transport_old != st_ivas->nchan_transport ) #ifdef HODIRAC_FIX_BR_SWITCHING_CRASH + || ( ivas_total_brate < IVAS_512k && hEncoderConfig->last_ivas_total_brate >= IVAS_512k ) || ( ivas_total_brate >= IVAS_512k && hEncoderConfig->last_ivas_total_brate < IVAS_512k ) - || ( ivas_total_brate < IVAS_512k && hEncoderConfig->last_ivas_total_brate >= IVAS_512k ) #endif ) { -- GitLab From 10288f90ffa0074c86459aa7e9d2a4e0f2b9464f Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Tue, 25 Apr 2023 10:23:43 +0200 Subject: [PATCH 26/66] fix bug in smoke test --- ci/smoke_test.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/smoke_test.sh b/ci/smoke_test.sh index 2062ff5080..008bdec07e 100755 --- a/ci/smoke_test.sh +++ b/ci/smoke_test.sh @@ -62,7 +62,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 -- GitLab From f6916a5fb3b959f6b0e31c4e700010dd36988134 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Tue, 25 Apr 2023 15:29:52 +0200 Subject: [PATCH 27/66] allow 11 TCs in DirAC decoder --- lib_dec/ivas_dirac_dec.c | 1 + 1 file changed, 1 insertion(+) diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index 9036f92fb8..393a5e2ccf 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -2637,6 +2637,7 @@ void ivas_dirac_dec( { switch ( nchan_transport ) { + case 11: case 8: case 6: case 4: -- GitLab From ec0998eed3f9c6de912a8ea639161c29730adb48 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Wed, 26 Apr 2023 15:23:09 +0200 Subject: [PATCH 28/66] only allocate the larger DirAC buffers when in HO mode --- lib_dec/ivas_dirac_dec.c | 109 +++++++++++++--------- lib_dec/ivas_dirac_output_synthesis_dec.c | 29 ++++-- 2 files changed, 87 insertions(+), 51 deletions(-) diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index 393a5e2ccf..f4a28b09c8 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -51,7 +51,12 @@ * Local function prototypes *-----------------------------------------------------------------------*/ -static ivas_error ivas_dirac_alloc_mem( DIRAC_DEC_HANDLE hDirAC, const RENDERER_TYPE renderer_type, DIRAC_DEC_STACK_MEM_HANDLE hDirAC_mem ); +static ivas_error ivas_dirac_alloc_mem( DIRAC_DEC_HANDLE hDirAC, const RENDERER_TYPE renderer_type, DIRAC_DEC_STACK_MEM_HANDLE hDirAC_mem +#ifdef HODIRAC + , + int16_t hodirac +#endif +); static void ivas_dirac_free_mem( DIRAC_DEC_STACK_MEM_HANDLE hDirAC_mem ); @@ -259,8 +264,8 @@ ivas_error ivas_dirac_dec_config( if ( flag_config == DIRAC_OPEN ) { - hDirAC->slot_size = (int16_t) ( ( output_Fs / FRAMES_PER_SEC ) / CLDFB_NO_COL_MAX ); - hDirAC->subframe_nbslots = (int16_t) ( CLDFB_NO_COL_MAX * 5.f / 20.f + 0.5f ); + hDirAC->slot_size = ( int16_t )( ( output_Fs / FRAMES_PER_SEC ) / CLDFB_NO_COL_MAX ); + hDirAC->subframe_nbslots = ( int16_t )( CLDFB_NO_COL_MAX * 5.f / 20.f + 0.5f ); hDirAC->nb_subframes = CLDFB_NO_COL_MAX / hDirAC->subframe_nbslots; assert( hDirAC->nb_subframes <= MAX_PARAM_SPATIAL_SUBFRAMES ); } @@ -350,7 +355,7 @@ ivas_error ivas_dirac_dec_config( if ( flag_config == DIRAC_OPEN ) { - hDirAC->num_freq_bands = (int16_t) ( output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ); + hDirAC->num_freq_bands = ( int16_t )( output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ); if ( ( hDirAC->frequency_axis = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); @@ -879,7 +884,12 @@ ivas_error ivas_dirac_dec_config( { ivas_dirac_free_mem( &( hDirAC->stack_mem ) ); } - if ( ( error = ivas_dirac_alloc_mem( hDirAC, st_ivas->renderer_type, &( hDirAC->stack_mem ) ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_dirac_alloc_mem( hDirAC, st_ivas->renderer_type, &( hDirAC->stack_mem ) +#ifdef HODIRAC + , + st_ivas->sba_analysis_order > 1 +#endif + ) ) != IVAS_ERR_OK ) { return error; } @@ -1326,9 +1336,18 @@ void ivas_dirac_dec_close( static ivas_error ivas_dirac_alloc_mem( DIRAC_DEC_HANDLE hDirAC, const RENDERER_TYPE renderer_type, - DIRAC_DEC_STACK_MEM_HANDLE hDirAC_mem ) + DIRAC_DEC_STACK_MEM_HANDLE hDirAC_mem +#ifdef HODIRAC + , + int16_t hodirac +#endif +) { int16_t num_freq_bands, num_freq_bands_diff, size; +#ifdef HODIRAC + int16_t size_ho; + int16_t size_pf; +#endif int16_t num_outputs_dir, num_outputs_diff; int16_t num_protos_dir; @@ -1341,6 +1360,18 @@ static ivas_error ivas_dirac_alloc_mem( num_outputs_diff = hDirAC->num_outputs_diff; size = num_freq_bands * num_outputs_dir; +#ifdef HODIRAC + if ( hodirac ) + { + size_ho = size * DIRAC_HO_NUMSECTORS; + size_pf = num_freq_bands * DIRAC_HO_NUMSECTORS; + } + else + { + size_ho = size; + size_pf = num_freq_bands; + } +#endif /* PSD related buffers */ hDirAC_mem->cy_auto_dir_smooth = NULL; @@ -1388,18 +1419,14 @@ static ivas_error ivas_dirac_alloc_mem( /* Target and smoothed nrg factors/gains */ #ifdef HODIRAC - if ( ( hDirAC_mem->cy_cross_dir_smooth = (float *) malloc( sizeof( float ) * size * DIRAC_HO_NUMSECTORS ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); - } - set_zero( hDirAC_mem->cy_cross_dir_smooth, size * DIRAC_HO_NUMSECTORS ); + if ( ( hDirAC_mem->cy_cross_dir_smooth = (float *) malloc( sizeof( float ) * size_ho ) ) == NULL ) #else if ( ( hDirAC_mem->cy_cross_dir_smooth = (float *) malloc( sizeof( float ) * size ) ) == NULL ) +#endif { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); } set_zero( hDirAC_mem->cy_cross_dir_smooth, size ); -#endif if ( hDirAC->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD ) { @@ -1422,18 +1449,14 @@ static ivas_error ivas_dirac_alloc_mem( /*Responses (gains/factors)*/ #ifdef HODIRAC - if ( ( hDirAC_mem->direct_responses = (float *) malloc( sizeof( float ) * size * DIRAC_HO_NUMSECTORS ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); - } - set_zero( hDirAC_mem->direct_responses, size * DIRAC_HO_NUMSECTORS ); + if ( ( hDirAC_mem->direct_responses = (float *) malloc( sizeof( float ) * size_ho ) ) == NULL ) #else if ( ( hDirAC_mem->direct_responses = (float *) malloc( sizeof( float ) * size ) ) == NULL ) +#endif { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); } set_zero( hDirAC_mem->direct_responses, size ); -#endif hDirAC->h_output_synthesis_psd_state.direct_responses = hDirAC_mem->direct_responses; @@ -1472,27 +1495,27 @@ static ivas_error ivas_dirac_alloc_mem( /* Gains/power factors*/ hDirAC_mem->direct_power_factor = NULL; hDirAC_mem->diffuse_power_factor = NULL; -#ifdef HODIRAC - if ( ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) || - ( renderer_type != RENDERER_BINAURAL_PARAMETRIC && renderer_type != RENDERER_BINAURAL_PARAMETRIC_ROOM && renderer_type != RENDERER_STEREO_PARAMETRIC ) ) - { - hDirAC_mem->direct_power_factor = (float *) malloc( sizeof( float ) * num_freq_bands * DIRAC_HO_NUMSECTORS ); - hDirAC_mem->diffuse_power_factor = (float *) malloc( sizeof( float ) * num_freq_bands * DIRAC_HO_NUMSECTORS ); - } -#else + if ( renderer_type != RENDERER_BINAURAL_PARAMETRIC && renderer_type != RENDERER_BINAURAL_PARAMETRIC_ROOM && renderer_type != RENDERER_STEREO_PARAMETRIC ) { +#ifdef HODIRAC + if ( ( hDirAC_mem->direct_power_factor = (float *) malloc( sizeof( float ) * size_pf ) ) == NULL ) +#else if ( ( hDirAC_mem->direct_power_factor = (float *) malloc( sizeof( float ) * num_freq_bands ) ) == NULL ) +#endif { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); } - +#ifdef HODIRAC + if ( ( hDirAC_mem->diffuse_power_factor = (float *) malloc( sizeof( float ) * size_pf ) ) == NULL ) +#else if ( ( hDirAC_mem->diffuse_power_factor = (float *) malloc( sizeof( float ) * num_freq_bands ) ) == NULL ) +#endif { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); } } -#endif + hDirAC->h_output_synthesis_psd_state.direct_power_factor = hDirAC_mem->direct_power_factor; hDirAC->h_output_synthesis_psd_state.diffuse_power_factor = hDirAC_mem->diffuse_power_factor; @@ -1618,7 +1641,7 @@ void ivas_dirac_dec_read_BS( #ifdef HODIRAC const int16_t sba_analysis_order, /* i sba order*/ #endif - int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ + int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ ) { int16_t i, j, b, dir, orig_dirac_bands; @@ -1628,7 +1651,7 @@ void ivas_dirac_dec_read_BS( if ( !st->bfi && ivas_total_brate > IVAS_SID_5k2 ) { next_bit_pos_orig = st->next_bit_pos; - st->next_bit_pos = (int16_t) ( ivas_total_brate / FRAMES_PER_SEC - 1 ); + st->next_bit_pos = ( int16_t )( ivas_total_brate / FRAMES_PER_SEC - 1 ); /* 1 bit flag for signaling metadata to read */ b = st->bit_stream[( st->next_bit_pos )--]; @@ -1732,7 +1755,7 @@ void ivas_dirac_dec_read_BS( next_bit_pos_orig = st->next_bit_pos; /* subtract mode signaling bits, since bitstream was moved after mode reading */ - st->next_bit_pos = (int16_t) ( ivas_total_brate / FRAMES_PER_SEC - 1 - SID_FORMAT_NBITS ); + st->next_bit_pos = ( int16_t )( ivas_total_brate / FRAMES_PER_SEC - 1 - SID_FORMAT_NBITS ); /* 1 bit flag for SPAR/DirAC, already read in read format function */ b = st->bit_stream[( st->next_bit_pos )--]; ( *nb_bits )++; @@ -1811,9 +1834,9 @@ void ivas_qmetadata_to_dirac( const int32_t ivas_total_brate, /* i : IVAS total bitrate */ const SBA_MODE sba_mode, /* i : SBA mode */ #ifdef HODIRAC - const int16_t sba_analysis_order, /* i sba order*/ + const int16_t sba_analysis_order, /* i sba order*/ #endif - int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ + int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ ) { int16_t block, band; @@ -2176,14 +2199,14 @@ void ivas_qmetadata_to_dirac( #ifdef HODIRAC if ( sba_analysis_order > 1 ) { - azi = (int16_t) ( azimuth + 0.5f ); - ele = (int16_t) ( elevation + 0.5f ); + azi = ( int16_t )( azimuth + 0.5f ); + ele = ( int16_t )( elevation + 0.5f ); } else #endif { - azi = (int16_t) ( azimuth + rand_triangular_signed( seed_ptr ) * dirac_dithering_azi_scale[diff_idx] + 0.5f ); - ele = (int16_t) ( elevation + rand_triangular_signed( seed_ptr ) * dirac_dithering_ele_scale[diff_idx] + 0.5f ); + azi = ( int16_t )( azimuth + rand_triangular_signed( seed_ptr ) * dirac_dithering_azi_scale[diff_idx] + 0.5f ); + ele = ( int16_t )( elevation + rand_triangular_signed( seed_ptr ) * dirac_dithering_ele_scale[diff_idx] + 0.5f ); /* limit the elevation to [-90, 90] */ ele = min( 90, ele ); ele = max( -90, ele ); @@ -2404,10 +2427,10 @@ void ivas_dirac_dec( { for ( i = 0; i < output_frame; i++ ) { - tmp[nchan_transport * i + n] = (int16_t) ( output_f[n][i] + 0.5f ); + tmp[nchan_transport * i + n] = ( int16_t )( output_f[n][i] + 0.5f ); } } - sprintf( file_name, "./res/ivas_dirac_dec_DMX%d.%d.pcm", nchan_transport, (int16_t) ( output_frame * 0.05 ) ); + sprintf( file_name, "./res/ivas_dirac_dec_DMX%d.%d.pcm", nchan_transport, ( int16_t )( output_frame * 0.05 ) ); dbgwrite( tmp, sizeof( int16_t ), nchan_transport * output_frame, 1, file_name ); } #endif @@ -3953,8 +3976,8 @@ static void computeDirectionAngles( z = *( intensity_real_z++ ) * intensityNorm; } radius = sqrtf( x * x + y * y ); - azimuth[k] = (int16_t) ( max( -180.0f, min( 180.0f, atan2f( y, x ) / EVS_PI * 180.0f ) ) + 0.5f ); - elevation[k] = (int16_t) ( max( -90.0f, min( 180.0f, atan2f( z, radius ) / EVS_PI * 180.0f ) ) + 0.5f ); + azimuth[k] = ( int16_t )( max( -180.0f, min( 180.0f, atan2f( y, x ) / EVS_PI * 180.0f ) ) + 0.5f ); + elevation[k] = ( int16_t )( max( -90.0f, min( 180.0f, atan2f( z, radius ) / EVS_PI * 180.0f ) ) + 0.5f ); } return; @@ -4239,8 +4262,8 @@ static void rotateAziEle_DirAC( dv_r_2 = p_Rmat[6] * dv_0 + p_Rmat[7] * dv_1 + p_Rmat[8] * dv_2; /*Conversion spherical to cartesian coordinates*/ - azi[b] = (int16_t) ( atan2f( dv_r_1, dv_r_0 ) * _180_OVER_PI ); - ele[b] = (int16_t) ( atan2f( dv_r_2, sqrtf( dv_r_0 * dv_r_0 + dv_r_1 * dv_r_1 ) ) * _180_OVER_PI ); + azi[b] = ( int16_t )( atan2f( dv_r_1, dv_r_0 ) * _180_OVER_PI ); + ele[b] = ( int16_t )( atan2f( dv_r_2, sqrtf( dv_r_0 * dv_r_0 + dv_r_1 * dv_r_1 ) ) * _180_OVER_PI ); } pop_wmops(); diff --git a/lib_dec/ivas_dirac_output_synthesis_dec.c b/lib_dec/ivas_dirac_output_synthesis_dec.c index 1208c86dff..8ddb91ee0d 100755 --- a/lib_dec/ivas_dirac_output_synthesis_dec.c +++ b/lib_dec/ivas_dirac_output_synthesis_dec.c @@ -1209,18 +1209,31 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( /* store estimates for next synthesis block */ #ifdef HODIRAC - mvr2r( h_dirac_output_synthesis_state.cy_cross_dir_smooth_prev, h_dirac_output_synthesis_state.gains_dir_prev, num_freq_bands * num_channels_dir * DIRAC_HO_NUMSECTORS ); -#else - mvr2r( h_dirac_output_synthesis_state.cy_cross_dir_smooth_prev, h_dirac_output_synthesis_state.gains_dir_prev, num_freq_bands * num_channels_dir ); + if ( hodirac ) + { + mvr2r( h_dirac_output_synthesis_state.cy_cross_dir_smooth_prev, h_dirac_output_synthesis_state.gains_dir_prev, num_freq_bands * num_channels_dir * DIRAC_HO_NUMSECTORS ); + } + else #endif + { + mvr2r( h_dirac_output_synthesis_state.cy_cross_dir_smooth_prev, h_dirac_output_synthesis_state.gains_dir_prev, num_freq_bands * num_channels_dir ); + } + mvr2r( h_dirac_output_synthesis_state.cy_auto_diff_smooth_prev, h_dirac_output_synthesis_state.gains_diff_prev, num_freq_bands_diff * num_channels_diff ); /* reset values */ #ifdef HODIRAC - set_zero( h_dirac_output_synthesis_state.cy_cross_dir_smooth, num_freq_bands * num_channels_dir * DIRAC_HO_NUMSECTORS ); -#else - set_zero( h_dirac_output_synthesis_state.cy_cross_dir_smooth, num_freq_bands * num_channels_dir ); + if ( hodirac ) + { + set_zero( h_dirac_output_synthesis_state.cy_cross_dir_smooth, num_freq_bands * num_channels_dir * DIRAC_HO_NUMSECTORS ); + } + else #endif + { + set_zero( h_dirac_output_synthesis_state.cy_cross_dir_smooth, num_freq_bands * num_channels_dir ); + } + + set_zero( h_dirac_output_synthesis_state.cy_auto_diff_smooth, num_freq_bands_diff * num_channels_diff ); return; @@ -1674,8 +1687,8 @@ static void ivas_dirac_dec_get_response_split_order( dv_r_1 = p_Rmat[3] * dv_0 + p_Rmat[4] * dv_1 + p_Rmat[5] * dv_2; dv_r_2 = p_Rmat[6] * dv_0 + p_Rmat[7] * dv_1 + p_Rmat[8] * dv_2; - index_azimuth = ( (int16_t) ( atan2f( dv_r_1, dv_r_0 ) * _180_OVER_PI ) + 180 ) % 360; - index_elevation = (int16_t) ( atan2f( dv_r_2, sqrtf( dv_r_0 * dv_r_0 + dv_r_1 * dv_r_1 ) ) * _180_OVER_PI ) + 90; + index_azimuth = ( ( int16_t )( atan2f( dv_r_1, dv_r_0 ) * _180_OVER_PI ) + 180 ) % 360; + index_elevation = ( int16_t )( atan2f( dv_r_2, sqrtf( dv_r_0 * dv_r_0 + dv_r_1 * dv_r_1 ) ) * _180_OVER_PI ) + 90; e = index_elevation > 90 ? -1 : 1; el = index_elevation > 90 ? 180 - index_elevation : index_elevation; -- GitLab From 0af330d5cbe32815a1e366c8a4f63c12244904ad Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Fri, 28 Apr 2023 11:05:21 +0200 Subject: [PATCH 29/66] re-enable MASA code in ivas_qmetadata_dec_decode --- lib_dec/ivas_qmetadata_dec.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/lib_dec/ivas_qmetadata_dec.c b/lib_dec/ivas_qmetadata_dec.c index d6e27b19a3..dcc1e06f24 100644 --- a/lib_dec/ivas_qmetadata_dec.c +++ b/lib_dec/ivas_qmetadata_dec.c @@ -701,20 +701,23 @@ int16_t ivas_qmetadata_dec_decode( } /* Scale energy ratios that sum to over one */ -#ifndef HODIRAC - for ( b = 0; b < hQMetaData->q_direction[0].cfg.nbands; b++ ) +#ifdef HODIRAC + if ( !hodirac ) +#endif { - float ratioSum; + for ( b = 0; b < hQMetaData->q_direction[0].cfg.nbands; b++ ) + { + float ratioSum; - ratioSum = hQMetaData->q_direction[0].band_data[b].energy_ratio[0] + hQMetaData->q_direction[1].band_data[b].energy_ratio[0]; + ratioSum = hQMetaData->q_direction[0].band_data[b].energy_ratio[0] + hQMetaData->q_direction[1].band_data[b].energy_ratio[0]; - if ( ratioSum > 1.0f ) - { - set_f( hQMetaData->q_direction[0].band_data[b].energy_ratio, hQMetaData->q_direction[0].band_data[b].energy_ratio[0] / ratioSum, nblocks ); - set_f( hQMetaData->q_direction[1].band_data[b].energy_ratio, hQMetaData->q_direction[1].band_data[b].energy_ratio[0] / ratioSum, nblocks ); + if ( ratioSum > 1.0f ) + { + set_f( hQMetaData->q_direction[0].band_data[b].energy_ratio, hQMetaData->q_direction[0].band_data[b].energy_ratio[0] / ratioSum, nblocks ); + set_f( hQMetaData->q_direction[1].band_data[b].energy_ratio, hQMetaData->q_direction[1].band_data[b].energy_ratio[0] / ratioSum, nblocks ); + } } } -#endif } /* Store status information for renderer use */ -- GitLab From 49a8c09bbc2e44e7045c5f59fd82d84795549d82 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Fri, 28 Apr 2023 14:20:40 +0200 Subject: [PATCH 30/66] remove leftovers of the experimental switch HODIRAC_FAT_BANDS --- lib_com/ivas_dirac_com.c | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/lib_com/ivas_dirac_com.c b/lib_com/ivas_dirac_com.c index 5afc94a140..2345bacc71 100644 --- a/lib_com/ivas_dirac_com.c +++ b/lib_com/ivas_dirac_com.c @@ -129,11 +129,7 @@ ivas_error ivas_dirac_config( if ( sba_mode == SBA_MODE_SPAR ) { -#ifdef HODIRAC_FAT_BANDS - hConfig->nbands = 6; -#else hConfig->nbands = IVAS_MAX_NUM_BANDS; -#endif spar_dirac_split_band = min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND ); #ifdef HODIRAC @@ -198,11 +194,7 @@ ivas_error ivas_dirac_config( if ( sba_mode == SBA_MODE_SPAR ) { ivas_dirac_config_bands( band_grouping, -#ifdef HODIRAC_FAT_BANDS - hConfig->nbands, -#else IVAS_MAX_NUM_BANDS, -#endif (int16_t) ( Fs * INV_CLDFB_BANDWIDTH + 0.5f ), dirac_to_spar_md_bands, hQMetaData->useLowerBandRes, hConfig->enc_param_start_band, hFbMdft ); } @@ -454,12 +446,7 @@ ivas_error ivas_dirac_sba_config( hQMetaData->metadata_max_bits = MAX16B; /* no limit */ } -#ifdef HODIRAC_FAT_BANDS - if ( sba_total_brate <= IVAS_128k ) -#endif - { - hQMetaData->metadata_max_bits = (int16_t) ceilf( (float) hQMetaData->metadata_max_bits * hQMetaData->q_direction[0].cfg.nbands / 5 ); - } + hQMetaData->metadata_max_bits = (int16_t) ceilf( (float) hQMetaData->metadata_max_bits * hQMetaData->q_direction[0].cfg.nbands / 5 ); hQMetaData->qmetadata_max_bit_req = QMETADATA_MAXBIT_REQ_SBA >> 1; return error; -- GitLab From 5e8c2dd3565f97f3ced982a3e3ad863e357e9dbb Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Fri, 28 Apr 2023 14:36:25 +0200 Subject: [PATCH 31/66] only allocate more memory for cy_cross_dir_smooth_prev and gains_dir_prev when it is actually used --- lib_com/ivas_prot.h | 8 +++++ lib_dec/ivas_dirac_dec.c | 37 ++++++++++++++------- lib_dec/ivas_dirac_output_synthesis_dec.c | 39 ++++++++++++++++++++--- 3 files changed, 69 insertions(+), 15 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index aa0cca19f9..6ba2d90db7 100755 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -3524,11 +3524,19 @@ ivas_error ivas_dirac_dec_output_synthesis_open( const RENDERER_TYPE renderer_type, /* i : renderer type */ const int16_t nchan_transport, /* i : number of transport channels */ const int32_t output_Fs /* i : output sampling rate */ +#ifdef HODIRAC + , + const int16_t hodirac /* i : flag to indicate HO-DirAC mode*/ +#endif ); void ivas_dirac_dec_output_synthesis_init( DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */ const int16_t nchan_out_woLFE /* i : number of output audio channels without LFE */ +#ifdef HODIRAC + , + const int16_t hodirac /* flag to indicate HO-DirAC mode */ +#endif ); void ivas_dirac_dec_output_synthesis_close( diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index f76d499e73..64ae843081 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -773,7 +773,12 @@ ivas_error ivas_dirac_dec_config( /* output synthesis */ if ( flag_config == DIRAC_OPEN ) { - if ( ( ivas_dirac_dec_output_synthesis_open( hDirAC, st_ivas->renderer_type, nchan_transport, output_Fs ) ) != IVAS_ERR_OK ) + if ( ( ivas_dirac_dec_output_synthesis_open( hDirAC, st_ivas->renderer_type, nchan_transport, output_Fs +#ifdef HODIRAC + , + st_ivas->sba_analysis_order > 1 +#endif + ) ) != IVAS_ERR_OK ) { return error; } @@ -783,7 +788,12 @@ ivas_error ivas_dirac_dec_config( { ivas_dirac_dec_output_synthesis_close( hDirAC ); - if ( ( ivas_dirac_dec_output_synthesis_open( hDirAC, st_ivas->renderer_type, nchan_transport, output_Fs ) ) != IVAS_ERR_OK ) + if ( ( ivas_dirac_dec_output_synthesis_open( hDirAC, st_ivas->renderer_type, nchan_transport, output_Fs +#ifdef HODIRAC + , + st_ivas->sba_analysis_order > 1 +#endif + ) ) != IVAS_ERR_OK ) { return error; } @@ -877,7 +887,12 @@ ivas_error ivas_dirac_dec_config( } /* output synthesis */ - ivas_dirac_dec_output_synthesis_init( hDirAC, nchan_out_woLFE ); + ivas_dirac_dec_output_synthesis_init( hDirAC, nchan_out_woLFE +#ifdef HODIRAC + , + st_ivas->sba_analysis_order +#endif + ); /* Allocate stack memory */ if ( flag_config != DIRAC_OPEN ) @@ -886,10 +901,10 @@ ivas_error ivas_dirac_dec_config( } if ( ( error = ivas_dirac_alloc_mem( hDirAC, st_ivas->renderer_type, &( hDirAC->stack_mem ) #ifdef HODIRAC - , + , st_ivas->sba_analysis_order > 1 #endif - ) ) != IVAS_ERR_OK ) + ) ) != IVAS_ERR_OK ) { return error; } @@ -1329,10 +1344,10 @@ void ivas_dirac_dec_close( static ivas_error ivas_dirac_alloc_mem( DIRAC_DEC_HANDLE hDirAC, const RENDERER_TYPE renderer_type, - DIRAC_DEC_STACK_MEM_HANDLE hDirAC_mem + DIRAC_DEC_STACK_MEM_HANDLE hDirAC_mem #ifdef HODIRAC - , - int16_t hodirac + , + int16_t hodirac #endif ) { @@ -1634,7 +1649,7 @@ void ivas_dirac_dec_read_BS( #ifdef HODIRAC const int16_t sba_analysis_order, /* i sba order*/ #endif - int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ + int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ ) { int16_t i, j, b, dir, orig_dirac_bands; @@ -1827,9 +1842,9 @@ void ivas_qmetadata_to_dirac( const int32_t ivas_total_brate, /* i : IVAS total bitrate */ const SBA_MODE sba_mode, /* i : SBA mode */ #ifdef HODIRAC - const int16_t sba_analysis_order, /* i sba order*/ + const int16_t sba_analysis_order, /* i sba order*/ #endif - int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ + int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ ) { int16_t block, band; diff --git a/lib_dec/ivas_dirac_output_synthesis_dec.c b/lib_dec/ivas_dirac_output_synthesis_dec.c index 4893c93883..4174063410 100755 --- a/lib_dec/ivas_dirac_output_synthesis_dec.c +++ b/lib_dec/ivas_dirac_output_synthesis_dec.c @@ -91,9 +91,16 @@ ivas_error ivas_dirac_dec_output_synthesis_open( RENDERER_TYPE renderer_type, /* i : renderer type */ const int16_t nchan_transport, /* i : number of transport channels*/ const int32_t output_Fs /* i : output sampling rate */ +#ifdef HODIRAC + , + const int16_t hodirac /* i : flag to indicate HO-DirAC mode*/ +#endif ) { int16_t idx, ch_idx; +#ifdef HODIRAC + int16_t size; +#endif float tmp; uint16_t num_diffuse_responses; float temp_alpha_synthesis[CLDFB_NO_CHANNELS_MAX]; @@ -168,7 +175,15 @@ ivas_error ivas_dirac_dec_output_synthesis_open( /* target PSD buffers */ #ifdef HODIRAC - if ( ( dirac_output_synthesis_state->cy_cross_dir_smooth_prev = (float *) malloc( hDirAC->num_freq_bands * hDirAC->num_outputs_dir * DIRAC_HO_NUMSECTORS * sizeof( float ) ) ) == NULL ) + if ( hodirac ) + { + size = hDirAC->num_freq_bands * hDirAC->num_outputs_dir * DIRAC_HO_NUMSECTORS; + } + else + { + size = hDirAC->num_freq_bands * hDirAC->num_outputs_dir; + } + if ( ( dirac_output_synthesis_state->cy_cross_dir_smooth_prev = (float *) malloc( size * sizeof( float ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis\n" ) ); } @@ -212,7 +227,7 @@ ivas_error ivas_dirac_dec_output_synthesis_open( /* direct and diffuse gain buffers */ #ifdef HODIRAC - if ( ( dirac_output_synthesis_state->gains_dir_prev = (float *) malloc( hDirAC->num_freq_bands * hDirAC->num_outputs_dir * DIRAC_HO_NUMSECTORS * sizeof( float ) ) ) == NULL ) + if ( ( dirac_output_synthesis_state->gains_dir_prev = (float *) malloc( size * sizeof( float ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis\n" ) ); } @@ -360,8 +375,16 @@ ivas_error ivas_dirac_dec_output_synthesis_open( void ivas_dirac_dec_output_synthesis_init( DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */ const int16_t nchan_out_woLFE /* i : number of output audio channels without LFE */ +#ifdef HODIRAC + , + const int16_t hodirac /* flag to indicate HO-DirAC mode */ +#endif ) { +#ifdef HODIRAC + int16_t size; +#endif + DIRAC_OUTPUT_SYNTHESIS_PARAMS *h_dirac_output_synthesis_params; DIRAC_OUTPUT_SYNTHESIS_STATE *h_dirac_output_synthesis_state; @@ -379,7 +402,15 @@ void ivas_dirac_dec_output_synthesis_init( } #ifdef HODIRAC - set_zero( h_dirac_output_synthesis_state->cy_cross_dir_smooth_prev, hDirAC->num_freq_bands * hDirAC->num_outputs_dir * DIRAC_HO_NUMSECTORS ); + if ( hodirac ) + { + size = hDirAC->num_freq_bands * hDirAC->num_outputs_dir * DIRAC_HO_NUMSECTORS; + } + else + { + size = hDirAC->num_freq_bands * hDirAC->num_outputs_dir; + } + set_zero( h_dirac_output_synthesis_state->cy_cross_dir_smooth_prev, size ); #else set_zero( h_dirac_output_synthesis_state->cy_cross_dir_smooth_prev, hDirAC->num_freq_bands * hDirAC->num_outputs_dir ); #endif @@ -401,7 +432,7 @@ void ivas_dirac_dec_output_synthesis_init( set_zero( h_dirac_output_synthesis_state->proto_power_smooth_prev, hDirAC->num_freq_bands * hDirAC->num_protos_dir ); } #ifdef HODIRAC - set_zero( h_dirac_output_synthesis_state->gains_dir_prev, hDirAC->num_freq_bands * hDirAC->num_outputs_dir * DIRAC_HO_NUMSECTORS ); + set_zero( h_dirac_output_synthesis_state->gains_dir_prev, size ); #else set_zero( h_dirac_output_synthesis_state->gains_dir_prev, hDirAC->num_freq_bands * hDirAC->num_outputs_dir ); #endif -- GitLab From 0588ae3f2ef6a9acf3ca506808258e8dade3a715 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Fri, 28 Apr 2023 16:52:06 +0200 Subject: [PATCH 32/66] in ivas_mcmasa_param_est_enc, reduce the size of the FOA input buffers to the number of FOA channels --- lib_enc/ivas_mcmasa_enc.c | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/lib_enc/ivas_mcmasa_enc.c b/lib_enc/ivas_mcmasa_enc.c index 588dcc7bea..d3dd053c57 100644 --- a/lib_enc/ivas_mcmasa_enc.c +++ b/lib_enc/ivas_mcmasa_enc.c @@ -155,7 +155,7 @@ ivas_error ivas_mcmasa_enc_open( } } - maxBin = (int16_t) ( input_Fs * INV_CLDFB_BANDWIDTH * CLDFB_TO_MDFT_FAC + 0.5f ); + maxBin = ( int16_t )( input_Fs * INV_CLDFB_BANDWIDTH * CLDFB_TO_MDFT_FAC + 0.5f ); for ( i = 1; i < hMcMasa->nbands + 1; i++ ) { @@ -173,7 +173,7 @@ ivas_error ivas_mcmasa_enc_open( hMcMasa->num_samples_delay_comp = 0; /* disable delay compensation by setting to 0 */ #endif tmp_f = (float) hMcMasa->num_samples_delay_comp / (float) ( NS2SA( input_Fs, DIRAC_SLOT_ENC_NS ) ); - hMcMasa->num_slots_delay_comp = (int16_t) ( tmp_f ); + hMcMasa->num_slots_delay_comp = ( int16_t )( tmp_f ); if ( tmp_f > (float) hMcMasa->num_slots_delay_comp ) { @@ -249,7 +249,7 @@ ivas_error ivas_mcmasa_enc_open( /* Ring buffer for the filterbank of the LFE analysis. * The filterbank is using moving average lowpass filter with the crossover of 120 Hz. */ - bufferSize = (int16_t) ( ( input_Fs / FRAMES_PER_SEC ) / MAX_PARAM_SPATIAL_SUBFRAMES ); + bufferSize = ( int16_t )( ( input_Fs / FRAMES_PER_SEC ) / MAX_PARAM_SPATIAL_SUBFRAMES ); for ( i = 0; i < 2; i++ ) { if ( ( hMcMasa->lfeAnaRingBuffer[i] = (float *) malloc( bufferSize * sizeof( float ) ) ) == NULL ) @@ -283,7 +283,7 @@ ivas_error ivas_mcmasa_enc_open( } } - hMcMasa->no_col_avg_diff = (int8_t) ( DIRAC_NO_COL_AVG_DIFF_NS / dirac_slot_ns ); + hMcMasa->no_col_avg_diff = ( int8_t )( DIRAC_NO_COL_AVG_DIFF_NS / dirac_slot_ns ); for ( i = 0; i < DIRAC_NUM_DIMS; i++ ) { if ( ( hMcMasa->buffer_intensity_real[i] = (float **) malloc( hMcMasa->no_col_avg_diff * sizeof( float * ) ) ) == NULL ) @@ -422,7 +422,7 @@ ivas_error ivas_mcmasa_enc_open( hMcMasa->prevMultiChEne = 0.0f; hMcMasa->prevDownmixEne = 0.0f; hMcMasa->prevEQ = 1.0f; - input_frame = (int16_t) ( input_Fs / FRAMES_PER_SEC ); + input_frame = ( int16_t )( input_Fs / FRAMES_PER_SEC ); for ( i = 0; i < input_frame; i++ ) { hMcMasa->interpolator[i] = ( (float) i ) / ( (float) input_frame ); @@ -755,10 +755,17 @@ void ivas_mcmasa_param_est_enc( float Chnl_ImagBuffer[MCMASA_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX]; float *p_Chnl_RealBuffer[MCMASA_MAX_ANA_CHANS]; float *p_Chnl_ImagBuffer[MCMASA_MAX_ANA_CHANS]; - float Foa_RealBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX]; +#ifdef HODIRAC + float Foa_RealBuffer[FOA_CHANNELS][DIRAC_NO_FB_BANDS_MAX]; + float Foa_ImagBuffer[FOA_CHANNELS][DIRAC_NO_FB_BANDS_MAX]; + float FoaEven_RealBuffer[FOA_CHANNELS][DIRAC_NO_FB_BANDS_MAX]; + float FoaEven_ImagBuffer[FOA_CHANNELS][DIRAC_NO_FB_BANDS_MAX]; +#else + float Foa_RealBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX]; float Foa_ImagBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX]; float FoaEven_RealBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX]; float FoaEven_ImagBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX]; +#endif float intensity_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS]; float intensity_even_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS]; float direction_vector[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS]; @@ -847,7 +854,7 @@ void ivas_mcmasa_param_est_enc( hMcMasa->hFbMixer->fb_cfg->num_in_chans #endif ); - ivas_fb_mixer_update_prior_input( hMcMasa->hFbMixer, pcm_in, l_ts + ivas_fb_mixer_update_prior_input( hMcMasa->hFbMixer, pcm_in, l_ts #ifdef HODIRAC , hMcMasa->hFbMixer->fb_cfg->num_in_chans @@ -1727,13 +1734,13 @@ static void computeLfeEnergy( for ( ts = mrange[0]; ts < mrange[1]; ts++ ) { - ivas_fb_mixer_get_windowed_fr( hMcMasa->hFbMixerLfe, pcm_in, p_Chnl_RealBuffer, p_Chnl_ImagBuffer, l_ts, l_ts + ivas_fb_mixer_get_windowed_fr( hMcMasa->hFbMixerLfe, pcm_in, p_Chnl_RealBuffer, p_Chnl_ImagBuffer, l_ts, l_ts #ifdef HODIRAC , hMcMasa->hFbMixerLfe->fb_cfg->num_in_chans #endif ); - ivas_fb_mixer_update_prior_input( hMcMasa->hFbMixerLfe, pcm_in, l_ts + ivas_fb_mixer_update_prior_input( hMcMasa->hFbMixerLfe, pcm_in, l_ts #ifdef HODIRAC , hMcMasa->hFbMixerLfe->fb_cfg->num_in_chans -- GitLab From d73a8c0177fdff1ca250e1b9b9dcf6f4605707ac Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Wed, 3 May 2023 09:44:10 +0200 Subject: [PATCH 33/66] reduce first dimension of chnlToFoaMtx and chnlToFoaEvenMtx to FOA_CHANNELS in struct ivas_mcmasa_enc_data_structure --- lib_enc/ivas_stat_enc.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index 10a68357a2..b6d939debd 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -810,8 +810,13 @@ typedef struct ivas_mcmasa_enc_data_structure float **buffer_intensity_real_vert; float *buffer_energy; +#ifdef HODIRAC + float chnlToFoaMtx[FOA_CHANNELS][MCMASA_MAX_ANA_CHANS]; + float chnlToFoaEvenMtx[FOA_CHANNELS][MCMASA_MAX_ANA_CHANS]; +#else float chnlToFoaMtx[DIRAC_MAX_ANA_CHANS][MCMASA_MAX_ANA_CHANS]; float chnlToFoaEvenMtx[DIRAC_MAX_ANA_CHANS][MCMASA_MAX_ANA_CHANS]; +#endif float ls_azimuth[MCMASA_MAX_ANA_CHANS]; int16_t leftNearest[MCMASA_MAX_ANA_CHANS]; int16_t rightNearest[MCMASA_MAX_ANA_CHANS]; @@ -906,7 +911,7 @@ typedef struct cpe_enc_data_structure float *input_mem[CPE_CHANNELS]; /* input channels buffers memory; needed to be up-to-date for TD->DFT stereo switching */ #ifdef DEBUGGING - int16_t stereo_mode_cmdl; /* stereo mode forced from the commaand-line */ + int16_t stereo_mode_cmdl; /* stereo mode forced from the commaand-line */ #endif } CPE_ENC_DATA, *CPE_ENC_HANDLE; -- GitLab From 48c332c97bc61c3242fdd5778f8013422f228eb3 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Wed, 3 May 2023 11:01:13 +0200 Subject: [PATCH 34/66] fix condition for hodirac flag in ivas_dirac_dec_config --- lib_dec/ivas_dirac_dec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index 64ae843081..07208c5539 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -890,7 +890,7 @@ ivas_error ivas_dirac_dec_config( ivas_dirac_dec_output_synthesis_init( hDirAC, nchan_out_woLFE #ifdef HODIRAC , - st_ivas->sba_analysis_order + st_ivas->sba_analysis_order > 1 #endif ); -- GitLab From cc4f2b6135ef9b1f02da3b340a87e9395accf0e2 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Wed, 3 May 2023 11:24:20 +0200 Subject: [PATCH 35/66] fix compilation problem with memory counting macros in lib_com/ivas_fb_mixer.c --- lib_com/ivas_fb_mixer.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/lib_com/ivas_fb_mixer.c b/lib_com/ivas_fb_mixer.c index 6a5c931141..84ffe91a0b 100644 --- a/lib_com/ivas_fb_mixer.c +++ b/lib_com/ivas_fb_mixer.c @@ -289,14 +289,11 @@ ivas_error ivas_FB_mixer_open( if ( ( fb_cfg->active_w_mixing != -1 ) && ( fb_cfg->num_out_chans > 0 ) ) { float *pTemp_mem; - - if ( ( pTemp_mem = (float *) malloc( sizeof( float ) * fb_cfg->num_out_chans * #ifdef HODIRAC - max( fb_cfg->num_in_chans, fb_cfg->nchan_fb_in ) * + 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 - fb_cfg->num_in_chans * + if ( ( pTemp_mem = (float *) malloc( sizeof( float ) * fb_cfg->num_out_chans * fb_cfg->num_in_chans * IVAS_MAX_NUM_BANDS ) ) == NULL ) #endif - IVAS_MAX_NUM_BANDS ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for FB mixer" ); } -- GitLab From c97dc155878b3f4eb72a571acc7d62dc43a03f57 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Wed, 3 May 2023 11:49:07 +0200 Subject: [PATCH 36/66] clean up disabled switches --- lib_com/ivas_spar_com.c | 121 ++-------------------------------------- lib_com/options.h | 2 - 2 files changed, 4 insertions(+), 119 deletions(-) diff --git a/lib_com/ivas_spar_com.c b/lib_com/ivas_spar_com.c index 5482876545..3cae4e92e2 100644 --- a/lib_com/ivas_spar_com.c +++ b/lib_com/ivas_spar_com.c @@ -1640,11 +1640,6 @@ void ivas_get_spar_md_from_dirac( float azi_dirac[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES], float ele_dirac[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES], float diffuseness[IVAS_MAX_NUM_BANDS], -#ifdef HODIRAC_PRED - float azi_dirac2[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES], - float ele_dirac2[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES], - float ratio[IVAS_MAX_NUM_BANDS], -#endif const int16_t n_ts, float ***mixer_mat, ivas_spar_md_t *hSpar_md, @@ -1654,20 +1649,12 @@ void ivas_get_spar_md_from_dirac( const int16_t order, const int16_t dtx_vad, float Wscale_d[IVAS_MAX_NUM_BANDS] -#ifdef HODIRAC_PRED - , - int16_t hodirac -#endif ) { int16_t num_ch, band, i, j; int16_t block, ch; float response_avg[MAX_OUTPUT_CHANNELS]; float response[MAX_PARAM_SPATIAL_SUBFRAMES][MAX_OUTPUT_CHANNELS]; -#ifdef HODIRAC_PRED - float response_avg2[MAX_OUTPUT_CHANNELS]; - float response2[MAX_PARAM_SPATIAL_SUBFRAMES][MAX_OUTPUT_CHANNELS]; -#endif float cov_real_dirac[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS]; float *pCov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; float dm_fv_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS]; @@ -1676,10 +1663,7 @@ void ivas_get_spar_md_from_dirac( float **ppMixer_mat[IVAS_MAX_FB_MIXER_OUT_CH]; float *pMixer_mat[IVAS_MAX_FB_MIXER_OUT_CH][IVAS_MAX_SPAR_FB_MIXER_IN_CH]; float en_ratio_fac, diff_norm_order1, diff_norm_order2, diff_norm_order3; -#ifdef HODIRAC_PRED - float w1 = 0; - float w2 = 0; -#endif + int16_t ndm, foa_ch, hoa2_ch; float P_dir_fact[IVAS_SPAR_MAX_CH - 1]; const int16_t *remix_order; @@ -1692,16 +1676,14 @@ void ivas_get_spar_md_from_dirac( IVAS_256k /*dummy value as order is always 1 in this function*/ #endif ); -#ifdef HODIRAC_PRED - hoa2_ch = 6; -#else + hoa2_ch = ivas_sba_get_nchan_metadata( SBA_HOA2_ORDER #ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT , IVAS_256k /*dummy value as order is always 1 in this function*/ #endif ); -#endif + foa_ch = FOA_CHANNELS; diff_norm_order1 = 3.0f; diff_norm_order2 = 5.0f; @@ -1771,34 +1753,16 @@ void ivas_get_spar_md_from_dirac( /*SPAR from DirAC*/ set_f( response_avg, 0.0f, MAX_OUTPUT_CHANNELS ); -#ifdef HODIRAC_PRED - if ( hodirac ) - { - set_f( response_avg2, 0.0f, MAX_OUTPUT_CHANNELS ); - } -#endif if ( n_ts > 1 ) { ivas_dirac_dec_get_response( (int16_t) azi_dirac[band][i_ts], (int16_t) ele_dirac[band][i_ts], response_avg, order ); -#ifdef HODIRAC_PRED - if ( hodirac ) - { - ivas_dirac_dec_get_response( (int16_t) azi_dirac2[band][i_ts], (int16_t) ele_dirac2[band][i_ts], response_avg2, order ); - } -#endif } else { for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ ) { ivas_dirac_dec_get_response( (int16_t) azi_dirac[band][block], (int16_t) ele_dirac[band][block], &( response[block][0] ), order ); -#ifdef HODIRAC_PRED - if ( hodirac ) - { - ivas_dirac_dec_get_response( (int16_t) azi_dirac2[band][block], (int16_t) ele_dirac2[band][block], &( response2[block][0] ), order ); - } -#endif } /* average responses in all subframes*/ @@ -1853,56 +1817,6 @@ void ivas_get_spar_md_from_dirac( { response_avg[ch] /= norm; } - -#ifdef HODIRAC_PRED - if ( hodirac ) - { - - for ( ch = 0; ch < num_ch_order; ch++ ) - { - for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ ) - { - response_avg2[ch] += response2[block][ch]; - } - response_avg2[ch] /= MAX_PARAM_SPATIAL_SUBFRAMES; - } - - norm = 0.0f; - for ( ch = 1; ch < foa_ch; ch++ ) - { - norm += response_avg2[ch] * response_avg2[ch]; - } - norm = max( EPSILON, sqrtf( norm ) ); - for ( ch = 1; ch < foa_ch; ch++ ) - { - response_avg2[ch] /= norm; - } - - /*normalize 2nd order*/ - norm = 0.0f; - for ( ch = foa_ch; ch < min( hoa2_ch_order, num_ch_order ); ch++ ) - { - norm += response_avg2[ch] * response_avg2[ch]; - } - norm = max( EPSILON, sqrtf( norm ) ); - for ( ch = foa_ch; ch < min( hoa2_ch_order, num_ch_order ); ch++ ) - { - response_avg2[ch] /= norm; - } - - /*normalize 3rd order*/ - norm = 0.0f; - for ( ch = hoa2_ch_order; ch < num_ch_order; ch++ ) - { - norm += response_avg2[ch] * response_avg2[ch]; - } - norm = max( EPSILON, sqrtf( norm ) ); - for ( ch = hoa2_ch_order; ch < num_ch_order; ch++ ) - { - response_avg2[ch] /= norm; - } - } -#endif } } @@ -1910,36 +1824,9 @@ void ivas_get_spar_md_from_dirac( { response_avg[i] = response_avg[HOA_keep_ind[i]]; } -#ifdef HODIRAC_PRED - if ( hodirac ) - { - for ( i = FOA_CHANNELS + 1; i < num_ch; i++ ) - { - response_avg2[i] = response_avg2[HOA_keep_ind[i]]; - } - } -#endif + en_ratio_fac = ( 1.0f - diffuseness[band] ); -#ifdef HODIRAC_PRED - if ( hodirac ) - { - w1 = ratio[band] * ratio[band]; - w2 = ( 1.0f - ratio[band] ) * ( 1.0f - ratio[band] ); - for ( i = 0; i < num_ch; i++ ) - { - for ( j = 0; j < num_ch; j++ ) - { - cov_real_dirac[i][j][band] = en_ratio_fac * ( w1 * response_avg[i] * response_avg[j] + w2 * response_avg2[i] * response_avg2[j] ); - if ( i == j ) - { - cov_real_dirac[i][j][band] += diffuseness[band]; - } - } - } - } - else -#endif { for ( i = 0; i < num_ch; i++ ) { diff --git a/lib_com/options.h b/lib_com/options.h index 6ec9d596dc..25259b4ecf 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -166,9 +166,7 @@ #define HODIRAC /* FhG: Sector-based HO-DirAC method for SBA at high bitrates */ #define HODIRAC_CRASH_FIX -/*#define HODIRAC_PRED*/ #define SPAR_HOA2_PLANAR_HOA3_DECOR_OPT -//#define DIRAC_DRCT_GAIN_DISABLE #define HODIRAC_FIX_BR_SWITCHING_CRASH -- GitLab From b997e231dee069510f1231b47282ff0932e57b3b Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Wed, 3 May 2023 12:04:08 +0200 Subject: [PATCH 37/66] clean up switches --- lib_com/options.h | 3 --- lib_enc/ivas_qmetadata_enc.c | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 25259b4ecf..dbc3260b00 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -165,11 +165,8 @@ #define FIX_417_TD_DECORR_BRATE_SW /* VA: Issue 417: fix incorrect use of TD decorrelator in bitrate switching */ #define HODIRAC /* FhG: Sector-based HO-DirAC method for SBA at high bitrates */ -#define HODIRAC_CRASH_FIX #define SPAR_HOA2_PLANAR_HOA3_DECOR_OPT -#define HODIRAC_FIX_BR_SWITCHING_CRASH - /*#define HODIRAC_DEBUG*/ #ifdef HODIRAC_DEBUG diff --git a/lib_enc/ivas_qmetadata_enc.c b/lib_enc/ivas_qmetadata_enc.c index 6daa4be4a7..3e361d3ba8 100644 --- a/lib_enc/ivas_qmetadata_enc.c +++ b/lib_enc/ivas_qmetadata_enc.c @@ -4940,7 +4940,7 @@ static void transform_azimuth_dir2( { hQMetaData->q_direction[1].band_data[i].azimuth[b] += 360; } -#ifdef HODIRAC_CRASH_FIX +#ifdef HODIRAC if ( hQMetaData->q_direction[1].band_data[i].azimuth[b] >= 180 ) { hQMetaData->q_direction[1].band_data[i].azimuth[b] -= 360; -- GitLab From 1a756597155ea929cbb536b2bc14d7944a33fef0 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Wed, 3 May 2023 12:09:02 +0200 Subject: [PATCH 38/66] rename the SPAR-tuning switch and enable it together with HODIRAC --- lib_com/ivas_cnst.h | 2 +- lib_com/ivas_fb_mixer.c | 4 +- lib_com/ivas_prot.h | 25 ++--- lib_com/ivas_rom_com.c | 6 +- lib_com/ivas_sba_config.c | 6 +- lib_com/ivas_spar_com.c | 4 +- lib_com/options.h | 5 +- lib_dec/ivas_dec.c | 2 +- lib_dec/ivas_dirac_dec.c | 16 +-- lib_dec/ivas_dirac_output_synthesis_dec.c | 5 +- lib_dec/ivas_output_config.c | 2 +- lib_dec/ivas_rom_dec.c | 2 +- lib_dec/ivas_rom_dec.h | 2 +- lib_dec/ivas_sba_dec.c | 2 +- lib_dec/ivas_sba_rendering_internal.c | 4 +- lib_dec/ivas_spar_decoder.c | 38 +++---- lib_dec/ivas_spar_md_dec.c | 120 ++++++++-------------- lib_dec/ivas_stat_dec.h | 4 +- lib_enc/ivas_enc_cov_handler.c | 10 +- lib_enc/ivas_sba_enc.c | 2 +- lib_enc/ivas_spar_encoder.c | 45 +------- lib_enc/ivas_spar_md_enc.c | 22 ++-- lib_enc/ivas_stat_enc.h | 2 +- 23 files changed, 125 insertions(+), 205 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 280284287f..18bc0229ff 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -983,7 +983,7 @@ typedef enum #define SPAR_CONFIG_BW FB -#ifndef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#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*/ diff --git a/lib_com/ivas_fb_mixer.c b/lib_com/ivas_fb_mixer.c index 84ffe91a0b..326c26ab99 100644 --- a/lib_com/ivas_fb_mixer.c +++ b/lib_com/ivas_fb_mixer.c @@ -527,7 +527,7 @@ 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_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING , const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] #endif @@ -550,7 +550,7 @@ void ivas_fb_mixer_pcm_ingest( { mvr2r( &hFbMixer->ppFilterbank_prior_input[i][fb_cfg->prior_input_length - frame_len], ppOut_pcm[i], frame_len ); #ifdef HODIRAC -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#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 ); diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 6ba2d90db7..48b5de73c8 100755 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -3256,13 +3256,13 @@ int16_t ivas_sba_get_nchan( /*! r: number of ambisonics metadata channels */ int16_t ivas_sba_get_nchan_metadata( const int16_t sba_order /* i : Ambisonic (SBA) order */ -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING , const int32_t ivas_total_brate #endif ); -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING void ivas_sba_get_spar_hoa_ch_ind( const int16_t num_md_chs, /* i : number of MD channels */ const int32_t ivas_total_brate, /* i : IVAS total bitrate */ @@ -4206,11 +4206,6 @@ void ivas_get_spar_md_from_dirac( float azi_dirac[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES], float ele_dirac[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES], float diffuseness[IVAS_MAX_NUM_BANDS], -#ifdef HODIRAC_PRED - float azi_dirac2[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES], - float ele_dirac2[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES], - float ratio[IVAS_MAX_NUM_BANDS], -#endif const int16_t n_ts, float ***mixer_mat, ivas_spar_md_t *hSpar_md, @@ -4220,13 +4215,9 @@ void ivas_get_spar_md_from_dirac( const int16_t order, const int16_t dtx_vad, float Wscale_d[IVAS_MAX_NUM_BANDS] -#ifdef HODIRAC_PRED - , - int16_t hodirac -#endif ); -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING int16_t ivas_get_spar_dec_md_num_subframes( const int16_t sba_order, /* i : Ambisonic (SBA) order */ const int32_t ivas_total_brate ); @@ -4282,7 +4273,7 @@ void ivas_spar_update_md_hist( void ivas_spar_smooth_md_dtx( ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ const int16_t num_bands_out /* i : number of output bands */ - #ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + #ifdef SPAR_TUNING , const int16_t num_md_sub_frames /* i : number of metadata subframes */ #endif @@ -4291,7 +4282,7 @@ void ivas_spar_smooth_md_dtx( void ivas_spar_setup_md_smoothing( ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ const int16_t num_bands_out /* i : number of output bands */ -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING , const int16_t num_md_sub_frames /* i : number of metadata subframes */ #endif @@ -4302,7 +4293,7 @@ void ivas_spar_dec_gen_umx_mat( const int16_t nchan_transport, /* i : number of transport channels */ const int16_t num_bands_out, /* i : number of output bands */ const int16_t bfi /* i : bad frame indicator */ -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING , const int16_t num_md_sub_frames #endif @@ -4333,7 +4324,7 @@ void ivas_enc_cov_handler_process( const int16_t nchan_inp, const int16_t dtx_vad, const int16_t transient_det[2] -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING , const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] #endif @@ -5164,7 +5155,7 @@ 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_length /* i : frame length */ -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING , const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] #endif diff --git a/lib_com/ivas_rom_com.c b/lib_com/ivas_rom_com.c index 2c5682dc06..c851ff71f0 100644 --- a/lib_com/ivas_rom_com.c +++ b/lib_com/ivas_rom_com.c @@ -952,7 +952,7 @@ const ivas_spar_br_table_t ivas_spar_br_table_consts[IVAS_SPAR_BR_TABLE_LEN] = { 512000, 0, SBA_FOA_ORDER, FB, 24000, 4, WYXZ, 0, 0,{ { 128000, 128000, 128000 },{ 128000, 128000, 128000 },{ 128000, 128000, 128000 }, {118450, 118450, 128000 } }, // not yet optimized { { 31, 1, 1, 1 },{ 1, 1, 1, 1 },{ 1, 1, 1, 1 } }, 1, 2, 0 }, -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING { 512000, 0, SBA_HOA2_ORDER, FB, 24000, 4, WYXZ, 0, 0,{ { 124000, 124000, 128000 },{ 124000, 124000, 128000 },{ 125200, 118450, 128000 },{ 76300, 73000, 128000 } }, // not yet optimized { { 31, 11, 11, 1 },{ 1, 1, 1, 1 },{ 1, 1, 1, 1 } }, 1, 2, 0 }, @@ -1490,14 +1490,14 @@ const int16_t remix_order_set[1][IVAS_SPAR_MAX_CH] = { /* WYZX --> WYXZ... */ { 0, 1, 3, 2, 4, 5, 6, 7} }; #endif -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING const int16_t keep_planar[IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS] = { 1, 1, 1, 1, 1, 1 }; #else const int16_t keep_planar[IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS] = { 1, 1, 1, 1 }; #endif #ifdef HODIRAC const int16_t HOA_keep_ind[IVAS_SPAR_MAX_FB_IN_CHAN] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 15}; -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING const int16_t HOA_keep_ind_spar[IVAS_SPAR_MAX_CH] = {0, 1, 2, 3, 4, 8, 9, 10, 10, 10, 10}; const int16_t HOA_keep_ind_spar512[IVAS_SPAR_MAX_CH] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; #else diff --git a/lib_com/ivas_sba_config.c b/lib_com/ivas_sba_config.c index 0b3a15a774..a5418f5df0 100644 --- a/lib_com/ivas_sba_config.c +++ b/lib_com/ivas_sba_config.c @@ -235,7 +235,7 @@ int16_t ivas_sba_get_nchan( /*! r: number of ambisonics metadata channels */ int16_t ivas_sba_get_nchan_metadata( const int16_t sba_order /* i : Ambisonic (SBA) order */ -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING , const int32_t ivas_total_brate #endif @@ -249,7 +249,7 @@ int16_t ivas_sba_get_nchan_metadata( } else { -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING if ( ivas_total_brate >= IVAS_512k ) { nb_channels = ( SBA_HOA2_ORDER + 1 ) * ( SBA_HOA2_ORDER + 1 ); @@ -274,7 +274,7 @@ int16_t ivas_sba_get_nchan_metadata( *-------------------------------------------------------------------*/ /*! r: flag indicating to code SPAR HOA MD for all bands */ -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING void ivas_sba_get_spar_hoa_ch_ind( const int16_t num_md_chs, /* i : number of MD channels */ const int32_t ivas_total_brate, /* i : IVAS total bitrate */ diff --git a/lib_com/ivas_spar_com.c b/lib_com/ivas_spar_com.c index 3cae4e92e2..3c089f22b7 100644 --- a/lib_com/ivas_spar_com.c +++ b/lib_com/ivas_spar_com.c @@ -1671,14 +1671,14 @@ void ivas_get_spar_md_from_dirac( remix_order = remix_order_set[hSpar_md_cfg->remix_unmix_order]; num_ch = ivas_sba_get_nchan_metadata( order -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING , IVAS_256k /*dummy value as order is always 1 in this function*/ #endif ); hoa2_ch = ivas_sba_get_nchan_metadata( SBA_HOA2_ORDER -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING , IVAS_256k /*dummy value as order is always 1 in this function*/ #endif diff --git a/lib_com/options.h b/lib_com/options.h index dbc3260b00..8503472055 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -165,7 +165,10 @@ #define FIX_417_TD_DECORR_BRATE_SW /* VA: Issue 417: fix incorrect use of TD decorrelator in bitrate switching */ #define HODIRAC /* FhG: Sector-based HO-DirAC method for SBA at high bitrates */ -#define SPAR_HOA2_PLANAR_HOA3_DECOR_OPT + +#ifdef HODIRAC +#define SPAR_TUNING /* Dlb: tune SPAR for better quality */ +#endif /*#define HODIRAC_DEBUG*/ diff --git a/lib_dec/ivas_dec.c b/lib_dec/ivas_dec.c index badd20d04e..d95fdfc833 100644 --- a/lib_dec/ivas_dec.c +++ b/lib_dec/ivas_dec.c @@ -345,7 +345,7 @@ ivas_error ivas_dec( } ivas_spar_dec_gen_umx_mat( st_ivas->hSpar->hMdDec, st_ivas->nchan_transport, IVAS_MAX_NUM_BANDS, st_ivas->bfi -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING , ivas_get_spar_dec_md_num_subframes( st_ivas->sba_order, st_ivas->hDecoderConfig->ivas_total_brate ) #endif diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index 07208c5539..17b99229fa 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -71,7 +71,7 @@ static void protoSignalComputation1( float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRA static void protoSignalComputation2( float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], float *proto_frame_f, float *proto_direct_buffer_f, float *reference_power, float *proto_power_smooth, const int16_t isloudspeaker, const int16_t slot_index, const int16_t num_freq_bands, MASA_STEREO_TYPE_DETECT *stereo_type_detect ); static void protoSignalComputation4( float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], float *proto_frame_f, float *proto_direct_buffer_f, float *reference_power, float *proto_power_smooth, const int16_t slot_index, const int16_t num_outputs_diff, const int16_t num_freq_bands, const float *mtx_hoa_decoder, const int16_t nchan_transport -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING , const int16_t *sba_map_tc_ind #endif @@ -183,7 +183,7 @@ ivas_error ivas_dirac_dec_config( if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR && !( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) { st_ivas->nchan_transport = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING , st_ivas->hDecoderConfig->ivas_total_brate #endif @@ -471,7 +471,7 @@ ivas_error ivas_dirac_dec_config( } set_s( hDirAC->proto_index_diff, 0, hDirAC->num_outputs_diff ); -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING hDirAC->sba_map_tc = sba_map_tc; if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR ) { @@ -587,7 +587,7 @@ ivas_error ivas_dirac_dec_config( for ( k = 0; k < min( hDirAC->num_outputs_dir, hDirAC->num_protos_dir ); k++ ) { -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING if ( hDirAC->sba_map_tc[k] < hDirAC->num_outputs_dir ) { hDirAC->proto_index_dir[hDirAC->sba_map_tc[k]] = k; @@ -2523,7 +2523,7 @@ void ivas_dirac_dec( /* CLDFB Analysis*/ for ( ch = 0; ch < nchan_transport; ch++ ) { -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING cldfbAnalysis_ts( &( output_f[hDirAC->sba_map_tc[ch]][hDirAC->num_freq_bands * index_slot] ), Cldfb_RealBuffer[ch][0], Cldfb_ImagBuffer[ch][0], @@ -2616,7 +2616,7 @@ void ivas_dirac_dec( hDirAC->num_freq_bands, hDirAC->hoa_decoder, nchan_transport -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING , hDirAC->sba_map_tc #endif @@ -3741,7 +3741,7 @@ static void protoSignalComputation4( const int16_t num_freq_bands, const float *mtx_hoa_decoder, const int16_t nchan_transport -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING , const int16_t *sba_map_tc_ind #endif @@ -3771,7 +3771,7 @@ static void protoSignalComputation4( proto_frame_f[2 * l * num_freq_bands + 2 * k + 1] = 0.f; for ( n = 0; n < nchan_transport; n++ ) { -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING proto_frame_f[2 * l * num_freq_bands + 2 * k] += RealBuffer[n][0][k] * mtx_hoa_decoder[l * 16 + sba_map_tc_ind[n]]; proto_frame_f[2 * l * num_freq_bands + 2 * k + 1] += ImagBuffer[n][0][k] * mtx_hoa_decoder[l * 16 + sba_map_tc_ind[n]]; #else diff --git a/lib_dec/ivas_dirac_output_synthesis_dec.c b/lib_dec/ivas_dirac_output_synthesis_dec.c index 4174063410..2261039826 100755 --- a/lib_dec/ivas_dirac_output_synthesis_dec.c +++ b/lib_dec/ivas_dirac_output_synthesis_dec.c @@ -967,9 +967,6 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( g2 += g1 * ( *( p_cy_cross_dir_smooth++ ) ); g2 = max( g2, 0.99f ); g2 = min( g2, 2.0f ); -#ifdef DIRAC_DRCT_GAIN_DISABLE - g2 = 1.0f; -#endif *( p_gains_dir++ ) = g2; } } @@ -1167,7 +1164,7 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( for ( l = 0; l < num_freq_bands_diff; l++ ) { g = g1 * ( *( p_gains_diff++ ) ) + g2 * ( *( p_gains_diff_prev++ ) ); -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING output_real[l * num_channels_dir + hDirAC->sba_map_tc[ch_idx]] += g * ( *( p_proto++ ) ); /* maps ch_idx 5 to 8 */ output_imag[l * num_channels_dir + hDirAC->sba_map_tc[ch_idx]] += g * ( *( p_proto++ ) ); #else diff --git a/lib_dec/ivas_output_config.c b/lib_dec/ivas_output_config.c index ff283e0b20..42e7c85068 100644 --- a/lib_dec/ivas_output_config.c +++ b/lib_dec/ivas_output_config.c @@ -153,7 +153,7 @@ void ivas_renderer_select( { nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING , st_ivas->hDecoderConfig->ivas_total_brate #endif diff --git a/lib_dec/ivas_rom_dec.c b/lib_dec/ivas_rom_dec.c index 7d69730147..9e615ba594 100644 --- a/lib_dec/ivas_rom_dec.c +++ b/lib_dec/ivas_rom_dec.c @@ -520,7 +520,7 @@ const float ap_split_frequencies[DIRAC_DECORR_NUM_SPLIT_BANDS + 1] = 0.0f, 0.125f, 0.375f, 1.0f }; -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING const int16_t sba_map_tc[11] = { 0, 1, 2, 3, 4, 8, 9, 15, 5, 6, 7 diff --git a/lib_dec/ivas_rom_dec.h b/lib_dec/ivas_rom_dec.h index 062efc0e54..d729133df7 100644 --- a/lib_dec/ivas_rom_dec.h +++ b/lib_dec/ivas_rom_dec.h @@ -111,7 +111,7 @@ extern const float ap_lattice_coeffs_3[DIRAC_DECORR_FILTER_LEN_3 * DIRAC_MAX_NUM extern const float *const ap_lattice_coeffs[DIRAC_DECORR_NUM_SPLIT_BANDS]; extern const float ap_split_frequencies[DIRAC_DECORR_NUM_SPLIT_BANDS + 1]; -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING extern const int16_t sba_map_tc[11]; extern const int16_t sba_map_tc_512[11]; #else diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c index 3e394603df..a2de662eb8 100755 --- a/lib_dec/ivas_sba_dec.c +++ b/lib_dec/ivas_sba_dec.c @@ -172,7 +172,7 @@ ivas_error ivas_sba_dec_reconfigure( } if ( nchan_transport_old != ivas_get_sba_num_TCs( ivas_total_brate, sba_order_internal ) -#ifdef HODIRAC_FIX_BR_SWITCHING_CRASH +#ifdef HODIRAC || ( last_ivas_total_brate >= IVAS_512k && ivas_total_brate < IVAS_512k ) || ( last_ivas_total_brate < IVAS_512k && ivas_total_brate >= IVAS_512k ) #endif diff --git a/lib_dec/ivas_sba_rendering_internal.c b/lib_dec/ivas_sba_rendering_internal.c index 152e0b3b76..6947efa868 100644 --- a/lib_dec/ivas_sba_rendering_internal.c +++ b/lib_dec/ivas_sba_rendering_internal.c @@ -354,7 +354,7 @@ void ivas_sba_upmixer_renderer( push_wmops( "ivas_sba_upmixer_renderer" ); nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING , st_ivas->hDecoderConfig->ivas_total_brate #endif @@ -587,7 +587,7 @@ void ivas_sba_mix_matrix_determiner( /* Mixing matrix determiner */ num_bands_out = hSpar->hFbMixer->pFb->filterbank_num_bands; ivas_spar_dec_gen_umx_mat( hSpar->hMdDec, nchan_transport, num_bands_out, bfi -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING , MAX_PARAM_SPATIAL_SUBFRAMES #endif diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c index 1109746715..11ff9661a8 100644 --- a/lib_dec/ivas_spar_decoder.c +++ b/lib_dec/ivas_spar_decoder.c @@ -71,14 +71,14 @@ ivas_error ivas_spar_dec_open( IVAS_FB_CFG *fb_cfg; int16_t i, j, b, active_w_mixing; int32_t output_Fs; -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING int16_t num_decor_chs; #endif error = IVAS_ERR_OK; sba_order_internal = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); num_channels_internal = ivas_sba_get_nchan_metadata( sba_order_internal -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING , st_ivas->hDecoderConfig->ivas_total_brate #endif @@ -96,7 +96,7 @@ ivas_error ivas_spar_dec_open( } output_Fs = st_ivas->hDecoderConfig->output_Fs; -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING if ( num_channels_internal > ( SBA_HOA2_ORDER + 1 ) * ( SBA_HOA2_ORDER + 1 ) ) { num_decor_chs = IVAS_HBR_MAX_DECOR_CHS; @@ -107,7 +107,7 @@ ivas_error ivas_spar_dec_open( } #endif -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING /* TD decorr. */ if ( ( error = ivas_td_decorr_dec_open( &hSpar->hTdDecorr, output_Fs, num_decor_chs + 1, 1 ) ) != IVAS_ERR_OK ) { @@ -667,7 +667,7 @@ static void ivas_spar_dec_MD( { int16_t num_channels, table_idx, num_bands_out, bfi, sba_order; int32_t ivas_total_brate; -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING int16_t num_md_sub_frames; #endif DECODER_CONFIG_HANDLE hDecoderConfig = st_ivas->hDecoderConfig; @@ -683,13 +683,13 @@ static void ivas_spar_dec_MD( bfi = st_ivas->bfi; ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; num_channels = ivas_sba_get_nchan_metadata( sba_order -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING , ivas_total_brate #endif ); -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING num_md_sub_frames = ivas_get_spar_dec_md_num_subframes( sba_order, st_ivas->hDecoderConfig->ivas_total_brate ); #endif @@ -753,7 +753,7 @@ static void ivas_spar_dec_MD( { ivas_spar_setup_md_smoothing( hSpar->hMdDec, num_bands_out -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING , num_md_sub_frames #endif @@ -769,7 +769,7 @@ static void ivas_spar_dec_MD( if ( !bfi ) { ivas_spar_smooth_md_dtx( hSpar->hMdDec, num_bands_out -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING , num_md_sub_frames #endif @@ -914,7 +914,7 @@ static void ivas_spar_get_skip_mat( const int16_t num_ch_in, const int16_t num_spar_bands, int16_t skip_mat[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH] -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING , const int16_t num_md_sub_frames #endif @@ -929,7 +929,7 @@ static void ivas_spar_get_skip_mat( { skip_mat[out_ch][in_ch] = 1; skip_flag = 1; -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING for ( i_ts = 0; i_ts < MAX_PARAM_SPATIAL_SUBFRAMES; i_ts++ ) { for ( spar_band = 0; spar_band < num_spar_bands; spar_band++ ) @@ -1020,7 +1020,7 @@ void ivas_spar_dec_upmixer( int16_t b_skip_mat[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; DECODER_CONFIG_HANDLE hDecoderConfig; SPAR_DEC_HANDLE hSpar; -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING int16_t num_md_sub_frames, md_sf_idx; #endif @@ -1035,7 +1035,7 @@ void ivas_spar_dec_upmixer( numch_in = hSpar->hFbMixer->fb_cfg->num_in_chans; numch_out = hSpar->hFbMixer->fb_cfg->num_out_chans; -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING num_md_sub_frames = ivas_get_spar_dec_md_num_subframes( st_ivas->sba_order, hDecoderConfig->ivas_total_brate ); #endif @@ -1130,7 +1130,7 @@ void ivas_spar_dec_upmixer( { ivas_td_decorr_process( hSpar->hTdDecorr, output, pPcm_tmp, output_frame ); -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING if ( hSpar->hTdDecorr->num_apd_outputs >= ( nchan_internal - nchan_transport ) ) { for ( i = 0; i < nchan_internal - nchan_transport; i++ ) @@ -1194,7 +1194,7 @@ void ivas_spar_dec_upmixer( *---------------------------------------------------------------------*/ ivas_spar_dec_gen_umx_mat( hSpar->hMdDec, nchan_transport, num_bands_out, st_ivas->bfi -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING , num_md_sub_frames #endif @@ -1210,7 +1210,7 @@ void ivas_spar_dec_upmixer( /* apply parameters */ /* determine if we can skip certain data */ ivas_spar_get_skip_mat( hSpar, numch_out, numch_in, num_spar_bands, b_skip_mat -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING , num_md_sub_frames #endif @@ -1253,7 +1253,7 @@ void ivas_spar_dec_upmixer( for ( in_ch = 0; in_ch < numch_in; in_ch++ ) { -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING if ( b_skip_mat[out_ch][in_ch] == 0 ) #endif { @@ -1354,7 +1354,7 @@ void ivas_spar_dec_upmixer( /* Dump audio signal after cldfbSynthesis */ ivas_spar_dump_signal_wav( output_frame, NULL, output, hSpar->numOutChannels, spar_foa_dec_wav[3], "cldfbSynthesis()" ); #endif -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING md_sf_idx = ( num_md_sub_frames == MAX_PARAM_SPATIAL_SUBFRAMES ) ? i_sf : 0; #endif @@ -1374,7 +1374,7 @@ void ivas_spar_dec_upmixer( { for ( b = 0; b < num_spar_bands; b++ ) { -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING hSpar->hMdDec->mixer_mat_prev[4][out_ch][in_ch][b] = hSpar->hMdDec->mixer_mat[out_ch][in_ch][b + md_sf_idx * IVAS_MAX_NUM_BANDS]; #else hSpar->hMdDec->mixer_mat_prev[4][out_ch][in_ch][b] = hSpar->hMdDec->mixer_mat[out_ch][in_ch][b + i_sf * IVAS_MAX_NUM_BANDS]; diff --git a/lib_dec/ivas_spar_md_dec.c b/lib_dec/ivas_spar_md_dec.c index fbb8b9b5dd..51d9dc7a5d 100644 --- a/lib_dec/ivas_spar_md_dec.c +++ b/lib_dec/ivas_spar_md_dec.c @@ -64,7 +64,7 @@ static const int16_t ivas_spar_dec_plc_spatial_target[IVAS_SPAR_MAX_CH] = { 1, 0 *------------------------------------------------------------------------------------------*/ static void ivas_get_spar_matrices( ivas_spar_md_dec_state_t *hMdDec, const int16_t num_bands_out, const int16_t n_ts, const int16_t bw, const int16_t dtx_vad, const int16_t nB, -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING const int16_t numch_out #else const int16_t sba_order @@ -82,19 +82,19 @@ static void ivas_get_band_idx_from_differential( ivas_spar_md_t *pSpar_md, const static void ivas_mat_col_rearrange( float in_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], const int16_t order[IVAS_SPAR_MAX_CH], const int16_t i_ts, float ***mixer_mat, const int16_t bands, const int16_t num_ch ); static void ivas_spar_dec_compute_ramp_down_post_matrix( ivas_spar_md_dec_state_t *hMdDec, const int16_t num_bands, const int16_t bfi -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING , const int16_t num_md_sub_frames #endif ); static void ivas_spar_md_fill_invalid_bands( ivas_spar_dec_matrices_t *pSpar_coeffs, ivas_spar_dec_matrices_t *pSpar_coeffs_prev, const int16_t *valid_bands, int16_t *base_band_age, const int16_t num_bands, -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING const int16_t numch_out #else const int16_t sba_order #endif -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING , const int16_t num_md_sub_frames #endif @@ -118,14 +118,14 @@ static void ivas_spar_dec_parse_md_bs( ivas_spar_md_dec_state_t *hMdDec, Decoder static ivas_error ivas_spar_md_dec_matrix_open( ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ const int16_t num_channels /* i : number of internal channels */ -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING , const int16_t num_md_sub_frames #endif ) { int16_t i, j; -#ifndef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifndef SPAR_TUNING int16_t num_md_sub_frames; num_md_sub_frames = MAX_PARAM_SPATIAL_SUBFRAMES; #endif @@ -270,7 +270,7 @@ static ivas_error ivas_spar_md_dec_matrix_open( return IVAS_ERR_OK; } -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING int16_t ivas_get_spar_dec_md_num_subframes( const int16_t sba_order, /* i : Ambisonic (SBA) order */ const int32_t ivas_total_brate ) @@ -304,7 +304,7 @@ ivas_error ivas_spar_md_dec_open( { ivas_spar_md_dec_state_t *hMdDec; ivas_error error; -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING int16_t num_md_sub_frames; #endif @@ -315,11 +315,11 @@ ivas_error ivas_spar_md_dec_open( return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD decoder" ); } -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING num_md_sub_frames = ivas_get_spar_dec_md_num_subframes( sba_order, hDecoderConfig->ivas_total_brate ); #endif if ( ( error = ivas_spar_md_dec_matrix_open( hMdDec, num_channels -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING , num_md_sub_frames #endif @@ -499,13 +499,13 @@ ivas_error ivas_spar_md_dec_init( int16_t i, j, k; int16_t nchan_transport; float pFC[IVAS_MAX_NUM_BANDS], PR_minmax[2]; -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING ivas_sba_get_spar_hoa_md_flag( sba_order, hDecoderConfig->ivas_total_brate, &hMdDec->spar_hoa_md_flag, &hMdDec->spar_hoa_dirac2spar_md_flag ); #else hMdDec->spar_hoa_md_flag = ivas_sba_get_spar_hoa_md_flag( sba_order, hDecoderConfig->ivas_total_brate ); #endif -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING ivas_sba_get_spar_hoa_ch_ind( num_channels, hDecoderConfig->ivas_total_brate, hMdDec->HOA_md_ind ); #endif @@ -624,7 +624,7 @@ static ivas_error ivas_spar_set_dec_config( } nchan = ivas_sba_get_nchan_metadata( ivas_spar_br_table_consts[hMdDec->table_idx].sba_order -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING , ivas_spar_br_table_consts[hMdDec->table_idx].ivas_total_brate #endif @@ -688,16 +688,16 @@ void ivas_spar_md_dec_process( { int16_t j, k, b, bw, dtx_vad, nB, i_ts; ivas_spar_md_dec_state_t *hMdDec; -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING int16_t num_md_chs; #endif int16_t num_md_sub_frames; hMdDec = st_ivas->hSpar->hMdDec; -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING num_md_chs = ivas_sba_get_nchan_metadata( sba_order, st_ivas->hDecoderConfig->ivas_total_brate ); #endif -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING num_md_sub_frames = ivas_get_spar_dec_md_num_subframes( sba_order, st_ivas->hDecoderConfig->ivas_total_brate ); #else num_md_sub_frames = MAX_PARAM_SPATIAL_SUBFRAMES; @@ -712,7 +712,7 @@ void ivas_spar_md_dec_process( int16_t num_bands = nB; int16_t num_subframes = 1, num_block_groups = 1, num_elements = 1, byte_size = sizeof( float ); int16_t num_ch = ivas_sba_get_nchan_metadata( sba_order -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING , st_ivas->hDecoderConfig->ivas_total_brate #endif @@ -760,7 +760,7 @@ void ivas_spar_md_dec_process( #endif /* SPAR to DirAC conversion */ -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING if ( hMdDec->spar_hoa_dirac2spar_md_flag == 1 ) #else if ( hMdDec->spar_hoa_md_flag == 0 ) @@ -801,7 +801,7 @@ void ivas_spar_md_dec_process( } ivas_get_spar_matrices( hMdDec, num_bands_out, num_md_sub_frames, bw, dtx_vad, nB, -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING num_md_chs #else sba_order @@ -826,12 +826,12 @@ void ivas_spar_md_dec_process( } ivas_spar_md_fill_invalid_bands( &hMdDec->spar_coeffs, &hMdDec->spar_coeffs_prev, &hMdDec->valid_bands[0], &hMdDec->base_band_age[0], num_bands_out, -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING num_md_chs #else sba_order #endif -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING , num_md_sub_frames #endif @@ -855,7 +855,7 @@ void ivas_spar_md_dec_process( void ivas_spar_smooth_md_dtx( ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ const int16_t num_bands_out /* i : number of output bands */ -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING , const int16_t num_md_sub_frames /* i : number of metadata subframes */ #endif @@ -894,7 +894,7 @@ void ivas_spar_smooth_md_dtx( } /* expand MD to all time slots */ -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING for ( int16_t i_ts = 1; i_ts < num_md_sub_frames; i_ts++ ) #else for ( int16_t i_ts = 1; i_ts < MAX_PARAM_SPATIAL_SUBFRAMES; i_ts++ ) @@ -938,7 +938,7 @@ void ivas_spar_smooth_md_dtx( void ivas_spar_setup_md_smoothing( ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ const int16_t num_bands_out /* i : number of output bands */ -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING , const int16_t num_md_sub_frames /* i : number of metadata subframes */ #endif @@ -994,7 +994,7 @@ void ivas_spar_setup_md_smoothing( } ivas_spar_smooth_md_dtx( hMdDec, num_bands_out -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING , num_md_sub_frames #endif @@ -1078,14 +1078,14 @@ static void ivas_get_spar_matrices( const int16_t bw, const int16_t dtx_vad, const int16_t nB, -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING const int16_t numch_out #else const int16_t sba_order #endif ) { -#ifndef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifndef SPAR_TUNING int16_t numch_out, num_bands, dmx_ch, split_band; #else int16_t num_bands, dmx_ch, split_band; @@ -1093,7 +1093,7 @@ static void ivas_get_spar_matrices( int16_t i, j, k, m, b, i_ts, active_w; const int16_t *order; float active_w_dm_fac, re; -#ifndef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifndef SPAR_TUNING numch_out = ivas_sba_get_nchan_metadata( sba_order ); #endif @@ -1478,7 +1478,7 @@ void ivas_spar_dec_gen_umx_mat( const int16_t nchan_transport, /* i : number of transport channels */ const int16_t num_bands_out, /* i : number of output bands */ const int16_t bfi /* i : bad frame indicator */ -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING , const int16_t num_md_sub_frames #endif @@ -1488,7 +1488,7 @@ void ivas_spar_dec_gen_umx_mat( num_out_ch = hMdDec->spar_md_cfg.num_umx_chs; -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING for ( i_ts = 0; i_ts < num_md_sub_frames; i_ts++ ) #else for ( i_ts = 0; i_ts < MAX_PARAM_SPATIAL_SUBFRAMES; i_ts++ ) @@ -1554,7 +1554,7 @@ void ivas_spar_dec_gen_umx_mat( } ivas_spar_dec_compute_ramp_down_post_matrix( hMdDec, num_bands_out, bfi -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING , num_md_sub_frames #endif @@ -1903,7 +1903,7 @@ static void ivas_decode_arith_bs( ndec = hMdDec->spar_md_cfg.num_decorr_per_band[bands_bw * i]; pred_cell_dims[i].dim1 = ndm + ndec - 1; -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING if ( hMdDec->spar_hoa_md_flag && hMdDec->spar_hoa_dirac2spar_md_flag ) #else if ( hMdDec->spar_hoa_md_flag ) @@ -1935,7 +1935,7 @@ static void ivas_decode_arith_bs( if ( any_diff == 1 ) { -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING if ( hMdDec->spar_hoa_md_flag && hMdDec->spar_hoa_dirac2spar_md_flag ) #else if ( hMdDec->spar_hoa_md_flag ) @@ -1961,7 +1961,7 @@ static void ivas_decode_arith_bs( ivas_fill_band_coeffs_idx( hMdDec->spar_md.band_coeffs_idx, nB, symbol_arr_re, pred_cell_dims, PRED_COEFF, planarCP ); -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING if ( hMdDec->spar_hoa_md_flag && hMdDec->spar_hoa_dirac2spar_md_flag ) #else if ( hMdDec->spar_hoa_md_flag ) @@ -2231,7 +2231,7 @@ static void ivas_decode_huffman_bs( drct_dim = ndec * ( ndm - 1 ); decd_dim = ndec; pred_offset = 0; -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING if ( hMdDec->spar_hoa_md_flag && hMdDec->spar_hoa_dirac2spar_md_flag ) #else if ( hMdDec->spar_hoa_md_flag ) @@ -2248,7 +2248,7 @@ static void ivas_decode_huffman_bs( ivas_huffman_decode( &hMdDec->huff_coeffs.pred_huff_re[qsi], st0, &hMdDec->spar_md.band_coeffs_idx[i].pred_index_re[j] ); } -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING if ( hMdDec->spar_hoa_md_flag && hMdDec->spar_hoa_dirac2spar_md_flag ) #else if ( hMdDec->spar_hoa_md_flag ) @@ -2305,12 +2305,12 @@ static void ivas_spar_md_fill_invalid_bands( const int16_t *valid_bands, int16_t *base_band_age, const int16_t num_bands, -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING const int16_t num_channels #else const int16_t sba_order #endif -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING , const int16_t num_md_sub_frames #endif @@ -2320,7 +2320,7 @@ static void ivas_spar_md_fill_invalid_bands( int16_t valid_band_idx[IVAS_MAX_NUM_BANDS], idx = -1; int16_t last_valid_band_idx[IVAS_MAX_NUM_BANDS]; float w = 0; -#ifndef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifndef SPAR_TUNING int16_t num_channels; num_channels = ivas_sba_get_nchan_metadata( sba_order ); #endif @@ -2410,7 +2410,7 @@ static void ivas_spar_md_fill_invalid_bands( { for ( j = 0; j < num_channels; j++ ) { -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING for ( i_ts = 1; i_ts < num_md_sub_frames; i_ts++ ) #else for ( i_ts = 1; i_ts < MAX_PARAM_SPATIAL_SUBFRAMES; i_ts++ ) @@ -2439,7 +2439,7 @@ static void ivas_spar_dec_compute_ramp_down_post_matrix( ivas_spar_md_dec_state_t *hMdDec, const int16_t num_bands_out, const int16_t bfi -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING , const int16_t num_md_sub_frames #endif @@ -2482,7 +2482,7 @@ static void ivas_spar_dec_compute_ramp_down_post_matrix( } /* apply the post matrix */ -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING for ( int16_t i_ts = 0; i_ts < num_md_sub_frames; i_ts++ ) #else for ( int16_t i_ts = 0; i_ts < MAX_PARAM_SPATIAL_SUBFRAMES; i_ts++ ) @@ -2733,11 +2733,6 @@ void ivas_spar_to_dirac( int16_t sba_order_internal; float azi_dirac[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES]; float ele_dirac[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES]; -#ifdef HODIRAC_PRED - float azi_dirac2[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES]; - float ele_dirac2[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES]; - float ratio[IVAS_MAX_NUM_BANDS]; -#endif int16_t azi[IVAS_MAX_NUM_BANDS]; int16_t ele[IVAS_MAX_NUM_BANDS]; float dvx[IVAS_MAX_NUM_BANDS], dvy[IVAS_MAX_NUM_BANDS], dvz[IVAS_MAX_NUM_BANDS]; @@ -2935,22 +2930,9 @@ void ivas_spar_to_dirac( } azi_dirac[band][block] = st_ivas->hQMetaData->q_direction->band_data[dirac_band_idx].azimuth[block]; ele_dirac[band][block] = st_ivas->hQMetaData->q_direction->band_data[dirac_band_idx].elevation[block]; -#ifdef HODIRAC_PRED - if ( st_ivas->sba_analysis_order > 1 ) - { - azi_dirac2[band][block] = st_ivas->hQMetaData->q_direction[1].band_data[dirac_band_idx].azimuth[block]; - ele_dirac2[band][block] = st_ivas->hQMetaData->q_direction[1].band_data[dirac_band_idx].elevation[block]; - } -#endif } diffuseness[band] = 1.0f - st_ivas->hQMetaData->q_direction->band_data[dirac_band_idx].energy_ratio[0]; -#ifdef HODIRAC_PRED - if ( st_ivas->sba_analysis_order > 1 ) - { - ratio[band] = st_ivas->hQMetaData->q_direction[1].band_data[dirac_band_idx].energy_ratio[0]; - } -#endif } /* DirAC MD averaged over 4 subframes and converted to SPAR format similar to encoder processing */ @@ -2960,11 +2942,6 @@ void ivas_spar_to_dirac( azi_dirac, ele_dirac, diffuseness, -#ifdef HODIRAC_PRED - azi_dirac2, - ele_dirac2, - ratio, -#endif 1, NULL, &hMdDec->spar_md, @@ -2974,10 +2951,6 @@ void ivas_spar_to_dirac( ( hMdDec->spar_hoa_md_flag ) ? 1 : sba_order_internal, dtx_vad, NULL -#ifdef HODIRAC_PRED - , - st_ivas->sba_analysis_order > 1 -#endif ); /* temporarily copy frame-wise prediction coefficients in DirAC bands*/ @@ -2994,11 +2967,6 @@ void ivas_spar_to_dirac( azi_dirac, ele_dirac, diffuseness, -#ifdef HODIRAC_PRED - azi_dirac2, - ele_dirac2, - ratio, -#endif MAX_PARAM_SPATIAL_SUBFRAMES, NULL, &hMdDec->spar_md, @@ -3008,10 +2976,6 @@ void ivas_spar_to_dirac( ( hMdDec->spar_hoa_md_flag ) ? 1 : sba_order_internal, dtx_vad, NULL -#ifdef HODIRAC_PRED - , - st_ivas->sba_analysis_order > 1 -#endif ); /* expand DirAC TC 20ms MD for residual channels to all subframes*/ diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index 3337d13e5e..30ee0ea0ec 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -710,7 +710,7 @@ typedef struct ivas_dirac_dec_data_structure PARAM_ISM_RENDERING_HANDLE hParamIsmRendering; IVAS_FB_MIXER_HANDLE hFbMdft; int16_t dirac_to_spar_md_bands[DIRAC_MAX_NBANDS]; -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING const int16_t *sba_map_tc; #endif @@ -809,7 +809,7 @@ typedef struct ivas_spar_md_dec_state_t int16_t table_idx; int16_t dtx_vad; int16_t spar_hoa_md_flag; -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING int16_t spar_hoa_dirac2spar_md_flag; int16_t HOA_md_ind[IVAS_SPAR_MAX_CH]; #endif diff --git a/lib_enc/ivas_enc_cov_handler.c b/lib_enc/ivas_enc_cov_handler.c index dceaf38d5f..b53f345f4e 100644 --- a/lib_enc/ivas_enc_cov_handler.c +++ b/lib_enc/ivas_enc_cov_handler.c @@ -57,7 +57,7 @@ *------------------------------------------------------------------------------------------*/ static void ivas_band_cov( float **ppIn_FR_real, float **ppIn_FR_imag, const int16_t num_chans, const int16_t num_bins, int16_t stride, float **pFb_bin_to_band, const int16_t *pFb_start_bin_per_band, const int16_t *pFb_active_bins_per_band, const int16_t start_band, const int16_t end_band, float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH] -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING , const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] #endif @@ -161,7 +161,7 @@ void ivas_enc_cov_handler_process( const int16_t num_ch, const int16_t dtx_vad, const int16_t transient_det[2] -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING , const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] #endif @@ -179,7 +179,7 @@ void ivas_enc_cov_handler_process( pFb->fb_bin_to_band.p_short_stride_num_bins_per_band, start_band, end_band, cov_real -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING , HOA_md_ind #endif @@ -276,7 +276,7 @@ static void ivas_band_cov( const int16_t start_band, const int16_t end_band, float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH] -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING , const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] #endif @@ -292,7 +292,7 @@ static void ivas_band_cov( { #ifdef HODIRAC -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING int16_t i1 = HOA_md_ind[i]; int16_t j1 = HOA_md_ind[j]; #else diff --git a/lib_enc/ivas_sba_enc.c b/lib_enc/ivas_sba_enc.c index 6bec0860e8..93925bdf0c 100644 --- a/lib_enc/ivas_sba_enc.c +++ b/lib_enc/ivas_sba_enc.c @@ -244,7 +244,7 @@ ivas_error ivas_sba_enc_reconfigure( } if ( ( sba_mode_old != st_ivas->sba_mode ) || ( nchan_transport_old != st_ivas->nchan_transport ) -#ifdef HODIRAC_FIX_BR_SWITCHING_CRASH +#ifdef HODIRAC || ( ivas_total_brate < IVAS_512k && hEncoderConfig->last_ivas_total_brate >= IVAS_512k ) || ( ivas_total_brate >= IVAS_512k && hEncoderConfig->last_ivas_total_brate < IVAS_512k ) #endif diff --git a/lib_enc/ivas_spar_encoder.c b/lib_enc/ivas_spar_encoder.c index 236b9208e0..c8af2e4562 100644 --- a/lib_enc/ivas_spar_encoder.c +++ b/lib_enc/ivas_spar_encoder.c @@ -89,7 +89,7 @@ ivas_error ivas_spar_enc_open( input_Fs = hEncoderConfig->input_Fs; sba_order_internal = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); nchan_inp = ivas_sba_get_nchan_metadata( sba_order_internal -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING , hEncoderConfig->ivas_total_brate #endif @@ -467,7 +467,7 @@ static ivas_error ivas_spar_enc_process( input_frame = (int16_t) ( input_Fs / FRAMES_PER_SEC ); sba_order = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); nchan_inp = ivas_sba_get_nchan_metadata( sba_order -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING , hEncoderConfig->ivas_total_brate #endif @@ -517,7 +517,7 @@ static ivas_error ivas_spar_enc_process( /* run Filter Bank overlapping MDFT analysis first, then we can use the temporary buffer for Parameter MDFT analysis*/ ivas_fb_mixer_pcm_ingest( hSpar->hFbMixer, data_f, p_pcm_tmp, input_frame -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING , hSpar->hMdEnc->HOA_md_ind #endif @@ -722,7 +722,7 @@ static ivas_error ivas_spar_enc_process( nchan_inp, dtx_vad, transient_det -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING , hSpar->hMdEnc->HOA_md_ind #endif @@ -737,17 +737,12 @@ static ivas_error ivas_spar_enc_process( { ivas_spar_md_enc_process( hSpar->hMdEnc, hEncoderConfig, cov_real, cov_dtx_real, hMetaData, dtx_vad, nchan_inp, sba_order ); } -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING if ( hSpar->hMdEnc->spar_hoa_dirac2spar_md_flag ) #endif { float azi_dirac[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES]; float ele_dirac[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES]; -#ifdef HODIRAC_PRED - float azi_dirac2[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES]; - float ele_dirac2[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES]; - float ratio[IVAS_MAX_NUM_BANDS]; -#endif float diffuseness[IVAS_MAX_NUM_BANDS]; float Wscale_d[IVAS_MAX_NUM_BANDS]; int16_t d_start_band, d_end_band; @@ -763,29 +758,8 @@ static ivas_error ivas_spar_enc_process( { azi_dirac[b][i_ts] = hQMetaData->q_direction[0].band_data[dirac_band_idx].azimuth[i_ts]; ele_dirac[b][i_ts] = hQMetaData->q_direction[0].band_data[dirac_band_idx].elevation[i_ts]; -#ifdef HODIRAC_PRED - if ( st_ivas->sba_analysis_order > 1 ) - { - azi_dirac2[b][i_ts] = hQMetaData->q_direction[1].band_data[dirac_band_idx].azimuth[i_ts] + hQMetaData->q_direction[0].band_data[dirac_band_idx].azimuth[i_ts] - 180.f; - if ( azi_dirac2[b][i_ts] < -180.f ) - { - azi_dirac2[b][i_ts] += 360.f; - } - if ( azi_dirac2[b][i_ts] >= 180.f ) - { - azi_dirac2[b][i_ts] -= 360.f; - } - ele_dirac2[b][i_ts] = hQMetaData->q_direction[1].band_data[dirac_band_idx].elevation[i_ts]; - } -#endif } diffuseness[b] = 1.0f - hQMetaData->q_direction->band_data[dirac_band_idx].energy_ratio[0]; -#ifdef HODIRAC_PRED - if ( st_ivas->sba_analysis_order > 1 ) - { - ratio[b] = hQMetaData->q_direction[1].band_data[dirac_band_idx].energy_ratio[0]; - } -#endif } if ( d_start_band >= 6 && dtx_vad == 1 ) @@ -809,11 +783,6 @@ static ivas_error ivas_spar_enc_process( azi_dirac, ele_dirac, diffuseness, -#ifdef HODIRAC_PRED - azi_dirac2, - ele_dirac2, - ratio, -#endif 1, hSpar->hMdEnc->mixer_mat, &hSpar->hMdEnc->spar_md, @@ -821,10 +790,6 @@ static ivas_error ivas_spar_enc_process( d_start_band, d_end_band, ( hSpar->hMdEnc->spar_hoa_md_flag ) ? 1 : sba_order, dtx_vad, Wscale_d -#ifdef HODIRAC_PRED - , - st_ivas->sba_analysis_order > 1 -#endif ); } diff --git a/lib_enc/ivas_spar_md_enc.c b/lib_enc/ivas_spar_md_enc.c index e2b8310fe2..cd2a265ed1 100644 --- a/lib_enc/ivas_spar_md_enc.c +++ b/lib_enc/ivas_spar_md_enc.c @@ -120,7 +120,7 @@ ivas_error ivas_spar_md_enc_open( } num_channels = ivas_sba_get_nchan_metadata( sba_order -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING , hEncoderConfig->ivas_total_brate #endif @@ -319,18 +319,18 @@ ivas_error ivas_spar_md_enc_init( float PR_minmax[2]; int16_t num_channels, i, j, k; -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING ivas_sba_get_spar_hoa_md_flag( sba_order, hEncoderConfig->ivas_total_brate, &hMdEnc->spar_hoa_md_flag, &hMdEnc->spar_hoa_dirac2spar_md_flag ); #else hMdEnc->spar_hoa_md_flag = ivas_sba_get_spar_hoa_md_flag( sba_order, hEncoderConfig->ivas_total_brate ); #endif num_channels = ivas_sba_get_nchan_metadata( sba_order -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING , hEncoderConfig->ivas_total_brate #endif ); -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING ivas_sba_get_spar_hoa_ch_ind( num_channels, hEncoderConfig->ivas_total_brate, hMdEnc->HOA_md_ind ); #endif table_idx = ivas_get_spar_table_idx( hEncoderConfig->ivas_total_brate, sba_order, SPAR_CONFIG_BW, NULL, NULL ); @@ -579,7 +579,7 @@ ivas_error ivas_spar_md_enc_process( num_quant_strats = hMdEnc->spar_md_cfg.num_quant_strats; num_ch = ivas_sba_get_nchan_metadata( sba_order -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING , hEncoderConfig->ivas_total_brate #endif @@ -647,7 +647,7 @@ ivas_error ivas_spar_md_enc_process( nB = num_bands; bands_bw = 1; } -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING if ( hMdEnc->spar_hoa_md_flag && hMdEnc->spar_hoa_dirac2spar_md_flag ) #else if ( hMdEnc->spar_hoa_md_flag ) @@ -790,7 +790,7 @@ ivas_error ivas_spar_md_enc_process( } } -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING if ( hMdEnc->spar_hoa_md_flag && hMdEnc->spar_hoa_dirac2spar_md_flag ) #else if ( hMdEnc->spar_hoa_md_flag ) @@ -1292,7 +1292,7 @@ static void ivas_get_huffman_coded_bs( pred_coeff_dim = ndm + ndec - 1; pred_offset = 0; -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING if ( hMdEnc->spar_hoa_md_flag && hMdEnc->spar_hoa_dirac2spar_md_flag ) #else if ( hMdEnc->spar_hoa_md_flag ) @@ -1386,7 +1386,7 @@ static void ivas_get_arith_coded_bs( ndm = hMdEnc->spar_md_cfg.num_dmx_chans_per_band[bands_bw * i]; ndec = hMdEnc->spar_md_cfg.num_decorr_per_band[bands_bw * i]; pred_cell_dims[i].dim1 = ndm + ndec - 1; -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING if ( hMdEnc->spar_hoa_md_flag && hMdEnc->spar_hoa_dirac2spar_md_flag ) #else if ( hMdEnc->spar_hoa_md_flag ) @@ -1416,7 +1416,7 @@ static void ivas_get_arith_coded_bs( break; } } -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING if ( hMdEnc->spar_hoa_md_flag && hMdEnc->spar_hoa_dirac2spar_md_flag ) #else if ( hMdEnc->spar_hoa_md_flag ) @@ -1451,7 +1451,7 @@ static void ivas_get_arith_coded_bs( ivas_arith_encode_cmplx_cell_array( &hMdEnc->arith_coeffs.pred_arith_re[qsi], &hMdEnc->arith_coeffs.pred_arith_re_diff[qsi], pDo_diff, nB, symbol_arr_re, symbol_arr_old_re, pred_cell_dims, hMetaData, any_diff ); -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING if ( hMdEnc->spar_hoa_md_flag && hMdEnc->spar_hoa_dirac2spar_md_flag ) #else if ( hMdEnc->spar_hoa_md_flag ) diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index b6d939debd..8715dabb1d 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -656,7 +656,7 @@ typedef struct ivas_spar_md_enc_state_t ivas_huff_coeffs_t huff_coeffs; int16_t table_idx; int16_t spar_hoa_md_flag; -#ifdef SPAR_HOA2_PLANAR_HOA3_DECOR_OPT +#ifdef SPAR_TUNING int16_t spar_hoa_dirac2spar_md_flag; int16_t HOA_md_ind[IVAS_SPAR_MAX_CH]; #endif -- GitLab From 7452fa00fd674938593d1d78a557f943ecdef4d0 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Thu, 4 May 2023 10:13:37 +0200 Subject: [PATCH 39/66] fix crash with bitrate switching to HO-DirAC modes --- lib_dec/ivas_dirac_dec.c | 17 +++++++++++------ lib_dec/ivas_sba_dec.c | 15 ++++++++++----- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index 17b99229fa..faa9541e6d 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -315,11 +315,16 @@ ivas_error ivas_dirac_dec_config( #endif /* band config needed only for SPAR with FOA output */ - if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_FOA && st_ivas->sba_mode == SBA_MODE_SPAR ) + if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_FOA && st_ivas->sba_mode == SBA_MODE_SPAR +#ifdef HODIRAC + && ivas_total_brate < IVAS_256k +#endif + ) { return IVAS_ERR_OK; } + if ( nchan_transport_orig > 2 && hDirAC->hOutSetup.is_loudspeaker_setup && st_ivas->renderer_type == RENDERER_DIRAC ) { hDirAC->synthesisConf = DIRAC_SYNTHESIS_PSD_LS; @@ -788,12 +793,12 @@ ivas_error ivas_dirac_dec_config( { ivas_dirac_dec_output_synthesis_close( hDirAC ); - if ( ( ivas_dirac_dec_output_synthesis_open( hDirAC, st_ivas->renderer_type, nchan_transport, output_Fs + if ( ( ivas_dirac_dec_output_synthesis_open( hDirAC, st_ivas->renderer_type, nchan_transport, output_Fs #ifdef HODIRAC , st_ivas->sba_analysis_order > 1 #endif - ) ) != IVAS_ERR_OK ) + ) ) != IVAS_ERR_OK ) { return error; } @@ -889,10 +894,10 @@ ivas_error ivas_dirac_dec_config( /* output synthesis */ ivas_dirac_dec_output_synthesis_init( hDirAC, nchan_out_woLFE #ifdef HODIRAC - , - st_ivas->sba_analysis_order > 1 + , + st_ivas->sba_analysis_order > 1 #endif - ); + ); /* Allocate stack memory */ if ( flag_config != DIRAC_OPEN ) diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c index 2d62af4bd8..3ede7f8aa9 100755 --- a/lib_dec/ivas_sba_dec.c +++ b/lib_dec/ivas_sba_dec.c @@ -187,12 +187,11 @@ ivas_error ivas_sba_dec_reconfigure( hSpar->hPCA = NULL; } - if ( nchan_transport_old != ivas_get_sba_num_TCs( ivas_total_brate, sba_order_internal ) + if ( nchan_transport_old != ivas_get_sba_num_TCs( ivas_total_brate, sba_order_internal ) #ifdef HODIRAC - || ( last_ivas_total_brate >= IVAS_512k && ivas_total_brate < IVAS_512k ) - || ( last_ivas_total_brate < IVAS_512k && ivas_total_brate >= IVAS_512k ) + || ( last_ivas_total_brate >= IVAS_512k && ivas_total_brate < IVAS_512k ) || ( last_ivas_total_brate < IVAS_512k && ivas_total_brate >= IVAS_512k ) #endif - ) + ) { ivas_spar_dec_close( &( st_ivas->hSpar ), hDecoderConfig->output_Fs, 1 ); @@ -284,7 +283,13 @@ ivas_error ivas_sba_dec_reconfigure( #ifndef LBR_SBA_BR_SWITCHING if ( ( ( st_ivas->renderer_type != RENDERER_DISABLE ) && ( st_ivas->renderer_type != RENDERER_SBA_LINEAR_DEC ) ) || ( sba_mode_old != st_ivas->sba_mode ) || ( ( st_ivas->sba_mode == SBA_MODE_SPAR ) && ( ( hDecoderConfig->output_config != AUDIO_CONFIG_FOA ) && ( st_ivas->hDecoderConfig->output_config != AUDIO_CONFIG_STEREO ) && ( st_ivas->hDecoderConfig->output_config != AUDIO_CONFIG_MONO ) ) ) ) #else - if ( ( ( st_ivas->renderer_type != RENDERER_DISABLE ) && ( st_ivas->renderer_type != RENDERER_SBA_LINEAR_DEC ) ) || ( ( hDecoderConfig->output_config != AUDIO_CONFIG_FOA ) && ( st_ivas->hDecoderConfig->output_config != AUDIO_CONFIG_STEREO ) && ( st_ivas->hDecoderConfig->output_config != AUDIO_CONFIG_MONO ) ) ) + if ( ( ( st_ivas->renderer_type != RENDERER_DISABLE ) && ( st_ivas->renderer_type != RENDERER_SBA_LINEAR_DEC ) ) + || ( ( hDecoderConfig->output_config != AUDIO_CONFIG_FOA ) && ( st_ivas->hDecoderConfig->output_config != AUDIO_CONFIG_STEREO ) && ( st_ivas->hDecoderConfig->output_config != AUDIO_CONFIG_MONO ) ) +#ifdef HODIRAC + || ( last_ivas_total_brate >= IVAS_256k && ivas_total_brate < IVAS_256k ) + || ( last_ivas_total_brate < IVAS_256k && ivas_total_brate >= IVAS_256k ) +#endif + ) #endif { DIRAC_CONFIG_FLAG flag_config; -- GitLab From 4db405911d4995cfcd609a90cf1c0428a77740fa Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Fri, 5 May 2023 14:37:05 +0200 Subject: [PATCH 40/66] fix number of blocks in SID DirAC metadata --- lib_enc/ivas_spar_encoder.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lib_enc/ivas_spar_encoder.c b/lib_enc/ivas_spar_encoder.c index 5417beb4bb..7e39f78eb8 100644 --- a/lib_enc/ivas_spar_encoder.c +++ b/lib_enc/ivas_spar_encoder.c @@ -472,7 +472,7 @@ static ivas_error ivas_spar_enc_process( ivas_total_brate = hEncoderConfig->ivas_total_brate; num_del_samples = hSpar->hFbMixer->fb_cfg->fb_latency; - input_frame = (int16_t) ( input_Fs / FRAMES_PER_SEC ); + input_frame = ( int16_t )( input_Fs / FRAMES_PER_SEC ); sba_order = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); nchan_inp = ivas_sba_get_nchan_metadata( sba_order #ifdef SPAR_TUNING @@ -634,14 +634,19 @@ static ivas_error ivas_spar_enc_process( , st_ivas->sba_analysis_order > 1 #endif - ); + ); } else { hQMetaData->q_direction[0].cfg.nbands = DIRAC_DTX_BANDS; /* compute directions */ + +#ifdef HODIRAC + for ( i = 0; i < hQMetaData->q_direction[0].cfg.nblocks; i++ ) +#else for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) +#endif { set_zero( dir, 3 ); set_zero( avg_dir, 3 ); -- GitLab From a587108b152dcde5750f80c35af0cbb6a4e317c0 Mon Sep 17 00:00:00 2001 From: rtyag Date: Mon, 8 May 2023 18:02:59 +1000 Subject: [PATCH 41/66] comments from DLB --- lib_enc/ivas_enc.c | 5 +++-- lib_enc/ivas_init_enc.c | 1 + lib_enc/ivas_sba_enc.c | 8 ++++---- lib_enc/ivas_spar_encoder.c | 4 ++-- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/lib_enc/ivas_enc.c b/lib_enc/ivas_enc.c index b5d4a1905a..1572789f6d 100644 --- a/lib_enc/ivas_enc.c +++ b/lib_enc/ivas_enc.c @@ -128,13 +128,14 @@ ivas_error ivas_enc( n = getNumChanAnalysis( st_ivas ); + /*tyagiri: TODO: looks like HP20 is disabled for high bitrates in SBA. Also, getNumChanAnalysis() is returning (order+1)*(order+1) channels always. is this expected ?*/ #ifndef DEBUG_SPAR_BYPASS_EVS_CODEC /* bypass EVS coding in float precision, emulating EVS encoder/decoder delay */ for ( i = 0; i < n; i++ ) { - if ( ( ivas_format == SBA_FORMAT ) && ( st_ivas->sba_mode == SBA_MODE_SPAR ) + if ( ( ivas_format == SBA_FORMAT ) && ( st_ivas->sba_mode == SBA_MODE_SPAR ) #ifdef HODIRAC - & !( st_ivas->sba_analysis_order > 1 ) + & !( st_ivas->sba_analysis_order > 1 ) #endif ) { diff --git a/lib_enc/ivas_init_enc.c b/lib_enc/ivas_init_enc.c index 50696bdb48..9018ee7669 100644 --- a/lib_enc/ivas_init_enc.c +++ b/lib_enc/ivas_init_enc.c @@ -185,6 +185,7 @@ int16_t getNumChanAnalysis( if ( st_ivas->hEncoderConfig->ivas_format == SBA_FORMAT ) { #ifdef HODIRAC + /*tyagiri:TODO: best keep it unchanged*/ n = ( st_ivas->sba_analysis_order + 1 ) * ( st_ivas->sba_analysis_order + 1 ); #else n = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order ); diff --git a/lib_enc/ivas_sba_enc.c b/lib_enc/ivas_sba_enc.c index 6307363373..6db83e41e1 100644 --- a/lib_enc/ivas_sba_enc.c +++ b/lib_enc/ivas_sba_enc.c @@ -154,6 +154,7 @@ ivas_error ivas_sba_enc_reconfigure( n = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order ); #endif + /*tyagiri:TODO : this should be done based on output of getNumChanAnalysis()*/ if ( n > n_old ) { /* save old mem_hp_20 pointer */ @@ -256,10 +257,9 @@ ivas_error ivas_sba_enc_reconfigure( #else if ( nchan_transport_old != st_ivas->nchan_transport #ifdef HODIRAC - || ( ivas_total_brate < IVAS_512k && hEncoderConfig->last_ivas_total_brate >= IVAS_512k ) - || ( ivas_total_brate >= IVAS_512k && hEncoderConfig->last_ivas_total_brate < IVAS_512k ) -#endif - ) + || ( ivas_total_brate < IVAS_512k && hEncoderConfig->last_ivas_total_brate >= IVAS_512k ) || ( ivas_total_brate >= IVAS_512k && hEncoderConfig->last_ivas_total_brate < IVAS_512k ) +#endif + ) #endif { #ifdef HODIRAC diff --git a/lib_enc/ivas_spar_encoder.c b/lib_enc/ivas_spar_encoder.c index 7e39f78eb8..b2538be34b 100644 --- a/lib_enc/ivas_spar_encoder.c +++ b/lib_enc/ivas_spar_encoder.c @@ -472,7 +472,7 @@ static ivas_error ivas_spar_enc_process( ivas_total_brate = hEncoderConfig->ivas_total_brate; num_del_samples = hSpar->hFbMixer->fb_cfg->fb_latency; - input_frame = ( int16_t )( input_Fs / FRAMES_PER_SEC ); + input_frame = (int16_t) ( input_Fs / FRAMES_PER_SEC ); sba_order = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); nchan_inp = ivas_sba_get_nchan_metadata( sba_order #ifdef SPAR_TUNING @@ -600,7 +600,7 @@ static ivas_error ivas_spar_enc_process( /*-----------------------------------------------------------------------------------------* * DirAC encoding *-----------------------------------------------------------------------------------------*/ - + /*tyagiri: TODO: HODIRAC should be disabled for 256 kbps and outputs should be BE w.r.t baseline*/ ivas_dirac_param_est_enc( st_ivas->hDirAC, hQMetaData->q_direction, hQMetaData->useLowerRes, data_f, ppIn_FR_real, ppIn_FR_imag, input_frame, st_ivas->sba_mode #ifdef HODIRAC , -- GitLab From 640c651e8f7994a06fd44bd350135c2054dbe1ad Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Mon, 8 May 2023 12:37:23 +0200 Subject: [PATCH 42/66] temporarily fix encoder crash with DTX and BR switching --- lib_com/options.h | 1 + lib_enc/ivas_spar_encoder.c | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 8296dfeb10..b449d41b63 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -172,6 +172,7 @@ #ifdef HODIRAC #define SPAR_TUNING /* Dlb: tune SPAR for better quality */ +#define HODIRAC_FIX_BR_SWITCHING_DTX #endif /*#define HODIRAC_DEBUG*/ diff --git a/lib_enc/ivas_spar_encoder.c b/lib_enc/ivas_spar_encoder.c index 7e39f78eb8..1bf479497e 100644 --- a/lib_enc/ivas_spar_encoder.c +++ b/lib_enc/ivas_spar_encoder.c @@ -638,6 +638,17 @@ static ivas_error ivas_spar_enc_process( } else { + +#ifdef HODIRAC_FIX_BR_SWITCHING_DTX + ivas_qmetadata_enc_encode( hMetaData, hQMetaData +#ifdef HODIRAC + , + st_ivas->sba_analysis_order > 1 +#endif + ); +#endif + + hQMetaData->q_direction[0].cfg.nbands = DIRAC_DTX_BANDS; /* compute directions */ -- GitLab From 0dc555316cc3b39d9a37e9dfa7a5c2752ff20dc1 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Mon, 8 May 2023 12:57:11 +0200 Subject: [PATCH 43/66] fix decoder crash with DTX and BR switching --- lib_com/ivas_qmetadata_com.c | 12 +++++++++++- lib_enc/ivas_spar_encoder.c | 10 ---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/lib_com/ivas_qmetadata_com.c b/lib_com/ivas_qmetadata_com.c index efcdbb0931..f8463eb3af 100644 --- a/lib_com/ivas_qmetadata_com.c +++ b/lib_com/ivas_qmetadata_com.c @@ -99,6 +99,9 @@ ivas_error ivas_qmetadata_allocate_memory( ) { int16_t j, dir; +#ifdef HODIRAC_FIX_BR_SWITCHING_DTX + int16_t i; +#endif uint8_t do_realloc; #ifdef DEBUGGING @@ -149,6 +152,13 @@ ivas_error ivas_qmetadata_allocate_memory( { set_zero( hQMetaData->q_direction[dir].band_data[j].elevation, MAX_PARAM_SPATIAL_SUBFRAMES ); set_zero( hQMetaData->q_direction[dir].band_data[j].azimuth, MAX_PARAM_SPATIAL_SUBFRAMES ); +#ifdef HODIRAC_FIX_BR_SWITCHING_DTX + 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 } } @@ -529,7 +539,7 @@ void masa_compensate_two_dir_energy_ratio_index( #ifdef HODIRAC float ratioSum; #endif - + ratioSum = ratio1 + ratio2; if ( ratio1 >= ratio2 ) { diff --git a/lib_enc/ivas_spar_encoder.c b/lib_enc/ivas_spar_encoder.c index 84e206ba7b..4eaefbefda 100644 --- a/lib_enc/ivas_spar_encoder.c +++ b/lib_enc/ivas_spar_encoder.c @@ -639,16 +639,6 @@ static ivas_error ivas_spar_enc_process( else { -#ifdef HODIRAC_FIX_BR_SWITCHING_DTX - ivas_qmetadata_enc_encode( hMetaData, hQMetaData -#ifdef HODIRAC - , - st_ivas->sba_analysis_order > 1 -#endif - ); -#endif - - hQMetaData->q_direction[0].cfg.nbands = DIRAC_DTX_BANDS; /* compute directions */ -- GitLab From 6ab2c5214848364acc93cd203968847491b2f1da Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Mon, 8 May 2023 14:32:18 +0200 Subject: [PATCH 44/66] fix merge error in ivas_spar_to_dirac --- lib_dec/ivas_spar_md_dec.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/lib_dec/ivas_spar_md_dec.c b/lib_dec/ivas_spar_md_dec.c index 54c83fc2f4..ae437b17d5 100644 --- a/lib_dec/ivas_spar_md_dec.c +++ b/lib_dec/ivas_spar_md_dec.c @@ -3164,10 +3164,6 @@ void ivas_spar_to_dirac( end_band = min( num_bands_out, SPAR_DIRAC_SPLIT_START_BAND ); #endif - hDirAC = st_ivas->hDirAC; - dirac_to_spar_md_bands = st_ivas->hSpar->dirac_to_spar_md_bands; - enc_param_start_band = st_ivas->hSpar->enc_param_start_band; - if ( hDirAC != NULL #ifdef HODIRAC && st_ivas->sba_analysis_order <= 1 -- GitLab From 41f4c70505082cf622aa31077d9dd3122125915d Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Tue, 9 May 2023 08:50:18 +0200 Subject: [PATCH 45/66] fix call to ivas_qmetadata_to_dirac in ivas_masa_decode --- lib_dec/ivas_masa_dec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/ivas_masa_dec.c b/lib_dec/ivas_masa_dec.c index 2aeec5e165..29f56c281f 100644 --- a/lib_dec/ivas_masa_dec.c +++ b/lib_dec/ivas_masa_dec.c @@ -301,7 +301,7 @@ ivas_error ivas_masa_decode( SBA_MODE_NONE #ifdef HODIRAC , - st_ivas->sba_analysis_order + 0 #endif , 0 ); -- GitLab From 5b234cb8185d157f5bcdeace3625680fbf596e4f Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Tue, 9 May 2023 09:29:01 +0200 Subject: [PATCH 46/66] fix formatting --- lib_dec/ivas_dec.c | 4 +-- lib_dec/ivas_dirac_dec.c | 36 +++++++++++------------ lib_dec/ivas_dirac_output_synthesis_dec.c | 4 +-- lib_dec/ivas_masa_dec.c | 4 +-- lib_dec/ivas_qmetadata_dec.c | 12 ++++---- lib_dec/ivas_sba_dec.c | 9 +++--- lib_dec/ivas_spar_md_dec.c | 20 ++++++------- lib_enc/ivas_ism_param_enc.c | 2 +- lib_enc/ivas_masa_enc.c | 6 ++-- lib_enc/ivas_mc_param_enc.c | 4 +-- lib_enc/ivas_mcmasa_enc.c | 12 ++++---- lib_enc/ivas_qmetadata_enc.c | 24 +++++++-------- lib_enc/ivas_sba_enc.c | 4 +-- lib_enc/ivas_spar_encoder.c | 1 - lib_enc/ivas_spar_md_enc.c | 6 ++-- 15 files changed, 72 insertions(+), 76 deletions(-) diff --git a/lib_dec/ivas_dec.c b/lib_dec/ivas_dec.c index 143fe0ad66..bb66abf725 100644 --- a/lib_dec/ivas_dec.c +++ b/lib_dec/ivas_dec.c @@ -354,12 +354,12 @@ ivas_error ivas_dec( ivas_pca_dec( st_ivas->hSpar->hPCA, output_frame, st_ivas->hSpar->hMdDec->spar_md_cfg.nchan_transport, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->hDecoderConfig->last_ivas_total_brate, st_ivas->bfi, output ); } - ivas_spar_dec_gen_umx_mat( st_ivas->hSpar->hMdDec, st_ivas->nchan_transport, IVAS_MAX_NUM_BANDS, st_ivas->bfi + ivas_spar_dec_gen_umx_mat( st_ivas->hSpar->hMdDec, st_ivas->nchan_transport, IVAS_MAX_NUM_BANDS, st_ivas->bfi #ifdef SPAR_TUNING , ivas_get_spar_dec_md_num_subframes( st_ivas->sba_order, st_ivas->hDecoderConfig->ivas_total_brate ) #endif - ); + ); } ivas_sba_dirac_stereo_dec( st_ivas, output, output_frame, st_ivas->ivas_format == MC_FORMAT ); diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index 727237ab8c..35a991c04e 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -264,8 +264,8 @@ ivas_error ivas_dirac_dec_config( if ( flag_config == DIRAC_OPEN ) { - hDirAC->slot_size = ( int16_t )( ( output_Fs / FRAMES_PER_SEC ) / CLDFB_NO_COL_MAX ); - hDirAC->subframe_nbslots = ( int16_t )( CLDFB_NO_COL_MAX * 5.f / 20.f + 0.5f ); + hDirAC->slot_size = (int16_t) ( ( output_Fs / FRAMES_PER_SEC ) / CLDFB_NO_COL_MAX ); + hDirAC->subframe_nbslots = (int16_t) ( CLDFB_NO_COL_MAX * 5.f / 20.f + 0.5f ); hDirAC->nb_subframes = CLDFB_NO_COL_MAX / hDirAC->subframe_nbslots; assert( hDirAC->nb_subframes <= MAX_PARAM_SPATIAL_SUBFRAMES ); } @@ -315,11 +315,11 @@ ivas_error ivas_dirac_dec_config( #endif /* band config needed only for SPAR with FOA output */ - if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_FOA && st_ivas->sba_mode == SBA_MODE_SPAR + if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_FOA && st_ivas->sba_mode == SBA_MODE_SPAR #ifdef HODIRAC - && ivas_total_brate < IVAS_256k + && ivas_total_brate < IVAS_256k #endif - ) + ) { return IVAS_ERR_OK; } @@ -360,7 +360,7 @@ ivas_error ivas_dirac_dec_config( if ( flag_config == DIRAC_OPEN ) { - hDirAC->num_freq_bands = ( int16_t )( output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ); + hDirAC->num_freq_bands = (int16_t) ( output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ); if ( ( hDirAC->frequency_axis = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); @@ -1812,7 +1812,7 @@ void ivas_dirac_dec_read_BS( if ( !st->bfi && ivas_total_brate > IVAS_SID_5k2 ) { next_bit_pos_orig = st->next_bit_pos; - st->next_bit_pos = ( int16_t )( ivas_total_brate / FRAMES_PER_SEC - 1 ); + st->next_bit_pos = (int16_t) ( ivas_total_brate / FRAMES_PER_SEC - 1 ); /* 1 bit flag for signaling metadata to read */ b = st->bit_stream[( st->next_bit_pos )--]; @@ -1916,7 +1916,7 @@ void ivas_dirac_dec_read_BS( next_bit_pos_orig = st->next_bit_pos; /* subtract mode signaling bits, since bitstream was moved after mode reading */ - st->next_bit_pos = ( int16_t )( ivas_total_brate / FRAMES_PER_SEC - 1 - SID_FORMAT_NBITS ); + st->next_bit_pos = (int16_t) ( ivas_total_brate / FRAMES_PER_SEC - 1 - SID_FORMAT_NBITS ); /* 1 bit flag for SPAR/DirAC, already read in read format function */ b = st->bit_stream[( st->next_bit_pos )--]; ( *nb_bits )++; @@ -2298,14 +2298,14 @@ void ivas_qmetadata_to_dirac( #ifdef HODIRAC if ( sba_analysis_order > 1 ) { - azi = ( int16_t )( azimuth + 0.5f ); - ele = ( int16_t )( elevation + 0.5f ); + azi = (int16_t) ( azimuth + 0.5f ); + ele = (int16_t) ( elevation + 0.5f ); } else #endif { - azi = ( int16_t )( azimuth + rand_triangular_signed( seed_ptr ) * dirac_dithering_azi_scale[diff_idx] + 0.5f ); - ele = ( int16_t )( elevation + rand_triangular_signed( seed_ptr ) * dirac_dithering_ele_scale[diff_idx] + 0.5f ); + azi = (int16_t) ( azimuth + rand_triangular_signed( seed_ptr ) * dirac_dithering_azi_scale[diff_idx] + 0.5f ); + ele = (int16_t) ( elevation + rand_triangular_signed( seed_ptr ) * dirac_dithering_ele_scale[diff_idx] + 0.5f ); /* limit the elevation to [-90, 90] */ ele = min( 90, ele ); ele = max( -90, ele ); @@ -2526,10 +2526,10 @@ void ivas_dirac_dec( { for ( i = 0; i < output_frame; i++ ) { - tmp[nchan_transport * i + n] = ( int16_t )( output_f[n][i] + 0.5f ); + tmp[nchan_transport * i + n] = (int16_t) ( output_f[n][i] + 0.5f ); } } - sprintf( file_name, "./res/ivas_dirac_dec_DMX%d.%d.pcm", nchan_transport, ( int16_t )( output_frame * 0.05 ) ); + sprintf( file_name, "./res/ivas_dirac_dec_DMX%d.%d.pcm", nchan_transport, (int16_t) ( output_frame * 0.05 ) ); dbgwrite( tmp, sizeof( int16_t ), nchan_transport * output_frame, 1, file_name ); } #endif @@ -4072,8 +4072,8 @@ static void computeDirectionAngles( z = *( intensity_real_z++ ) * intensityNorm; } radius = sqrtf( x * x + y * y ); - azimuth[k] = ( int16_t )( max( -180.0f, min( 180.0f, atan2f( y, x ) / EVS_PI * 180.0f ) ) + 0.5f ); - elevation[k] = ( int16_t )( max( -90.0f, min( 180.0f, atan2f( z, radius ) / EVS_PI * 180.0f ) ) + 0.5f ); + azimuth[k] = (int16_t) ( max( -180.0f, min( 180.0f, atan2f( y, x ) / EVS_PI * 180.0f ) ) + 0.5f ); + elevation[k] = (int16_t) ( max( -90.0f, min( 180.0f, atan2f( z, radius ) / EVS_PI * 180.0f ) ) + 0.5f ); } return; @@ -4358,8 +4358,8 @@ static void rotateAziEle_DirAC( dv_r_2 = p_Rmat[6] * dv_0 + p_Rmat[7] * dv_1 + p_Rmat[8] * dv_2; /*Conversion spherical to cartesian coordinates*/ - azi[b] = ( int16_t )( atan2f( dv_r_1, dv_r_0 ) * _180_OVER_PI ); - ele[b] = ( int16_t )( atan2f( dv_r_2, sqrtf( dv_r_0 * dv_r_0 + dv_r_1 * dv_r_1 ) ) * _180_OVER_PI ); + azi[b] = (int16_t) ( atan2f( dv_r_1, dv_r_0 ) * _180_OVER_PI ); + ele[b] = (int16_t) ( atan2f( dv_r_2, sqrtf( dv_r_0 * dv_r_0 + dv_r_1 * dv_r_1 ) ) * _180_OVER_PI ); } pop_wmops(); diff --git a/lib_dec/ivas_dirac_output_synthesis_dec.c b/lib_dec/ivas_dirac_output_synthesis_dec.c index 2261039826..fe013878a4 100755 --- a/lib_dec/ivas_dirac_output_synthesis_dec.c +++ b/lib_dec/ivas_dirac_output_synthesis_dec.c @@ -1713,8 +1713,8 @@ static void ivas_dirac_dec_get_response_split_order( dv_r_1 = p_Rmat[3] * dv_0 + p_Rmat[4] * dv_1 + p_Rmat[5] * dv_2; dv_r_2 = p_Rmat[6] * dv_0 + p_Rmat[7] * dv_1 + p_Rmat[8] * dv_2; - index_azimuth = ( ( int16_t )( atan2f( dv_r_1, dv_r_0 ) * _180_OVER_PI ) + 180 ) % 360; - index_elevation = ( int16_t )( atan2f( dv_r_2, sqrtf( dv_r_0 * dv_r_0 + dv_r_1 * dv_r_1 ) ) * _180_OVER_PI ) + 90; + index_azimuth = ( (int16_t) ( atan2f( dv_r_1, dv_r_0 ) * _180_OVER_PI ) + 180 ) % 360; + index_elevation = (int16_t) ( atan2f( dv_r_2, sqrtf( dv_r_0 * dv_r_0 + dv_r_1 * dv_r_1 ) ) * _180_OVER_PI ) + 90; e = index_elevation > 90 ? -1 : 1; el = index_elevation > 90 ? 180 - index_elevation : index_elevation; diff --git a/lib_dec/ivas_masa_dec.c b/lib_dec/ivas_masa_dec.c index 29f56c281f..2dde4a2bdc 100644 --- a/lib_dec/ivas_masa_dec.c +++ b/lib_dec/ivas_masa_dec.c @@ -207,12 +207,12 @@ ivas_error ivas_masa_decode( else { #endif - *nb_bits_read += ivas_qmetadata_dec_decode( hQMetaData, st->bit_stream, &st->next_bit_pos + *nb_bits_read += ivas_qmetadata_dec_decode( hQMetaData, st->bit_stream, &st->next_bit_pos #ifdef HODIRAC , 0 #endif - ); + ); #ifdef HR_METADATA } #endif diff --git a/lib_dec/ivas_qmetadata_dec.c b/lib_dec/ivas_qmetadata_dec.c index 36102aaee3..3774c06799 100644 --- a/lib_dec/ivas_qmetadata_dec.c +++ b/lib_dec/ivas_qmetadata_dec.c @@ -718,8 +718,8 @@ int16_t ivas_qmetadata_dec_decode( { for ( m = 0; m < q_direction->cfg.nblocks; m++ ) { - fprintf( pF_azi, " %+5.2f ", ( int16_t )( 100.f * q_direction->band_data[b].azimuth[m] ) / 100.f ); - fprintf( pF_ele, " %+5.2f ", ( int16_t )( 100.f * q_direction->band_data[b].elevation[m] ) / 100.f ); + fprintf( pF_azi, " %+5.2f ", (int16_t) ( 100.f * q_direction->band_data[b].azimuth[m] ) / 100.f ); + fprintf( pF_ele, " %+5.2f ", (int16_t) ( 100.f * q_direction->band_data[b].elevation[m] ) / 100.f ); fprintf( pF_ratio, " %1.3f ", q_direction->band_data[b].energy_ratio[m] ); if ( q_direction->coherence_band_data != NULL ) { @@ -1194,7 +1194,7 @@ int16_t ivas_qmetadata_dec_sid_decode( if ( sba_mode == SBA_MODE_SPAR ) { /* TODO: still use old sid frame size to keep bitexactness */ - metadata_sid_bits = ( int16_t )( 5000 /*IVAS_SID_5k2*/ - SID_2k40 ) / FRAMES_PER_SEC - ( SPAR_DTX_BANDS * 18 ) - 1; /* -1 for inactive mode header bit*/ + metadata_sid_bits = (int16_t) ( 5000 /*IVAS_SID_5k2*/ - SID_2k40 ) / FRAMES_PER_SEC - ( SPAR_DTX_BANDS * 18 ) - 1; /* -1 for inactive mode header bit*/ } else { @@ -1355,8 +1355,8 @@ int16_t ivas_qmetadata_dec_sid_decode( { for ( m = 0; m < nblocks; m++ ) { - fprintf( pF_azi, " %+5.2f ", ( int16_t )( 100.f * q_direction->band_data[b].azimuth[m] ) / 100.f ); - fprintf( pF_ele, " %+5.2f ", ( int16_t )( 100.f * q_direction->band_data[b].elevation[m] ) / 100.f ); + fprintf( pF_azi, " %+5.2f ", (int16_t) ( 100.f * q_direction->band_data[b].azimuth[m] ) / 100.f ); + fprintf( pF_ele, " %+5.2f ", (int16_t) ( 100.f * q_direction->band_data[b].elevation[m] ) / 100.f ); fprintf( pF_ratio, " %1.3f ", q_direction->band_data[b].energy_ratio[m] ); } } @@ -4284,7 +4284,7 @@ static void decode_combined_index( for ( i = len - 1; i > 0; i-- ) { - index[i] = ( uint16_t )( comb_index / base[i] ); + index[i] = (uint16_t) ( comb_index / base[i] ); comb_index -= index[i] * base[i]; } diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c index 31dc57040c..1d39337ee2 100755 --- a/lib_dec/ivas_sba_dec.c +++ b/lib_dec/ivas_sba_dec.c @@ -123,10 +123,9 @@ ivas_error ivas_sba_dec_reconfigure( hDecoderConfig = st_ivas->hDecoderConfig; ivas_total_brate = hDecoderConfig->ivas_total_brate; #ifdef HODIRAC - last_ivas_total_brate = st_ivas->last_active_ivas_total_brate; + last_ivas_total_brate = st_ivas->last_active_ivas_total_brate; #endif - /*-----------------------------------------------------------------* * Set SBA high-level parameters @@ -160,10 +159,10 @@ ivas_error ivas_sba_dec_reconfigure( if ( nchan_transport_old != ivas_get_sba_num_TCs( ivas_total_brate, sba_order_internal ) #ifdef HODIRAC - || ( last_ivas_total_brate >= IVAS_512k && ivas_total_brate < IVAS_512k ) || ( last_ivas_total_brate < IVAS_512k && ivas_total_brate >= IVAS_512k ) + || ( last_ivas_total_brate >= IVAS_512k && ivas_total_brate < IVAS_512k ) || ( last_ivas_total_brate < IVAS_512k && ivas_total_brate >= IVAS_512k ) #endif - ) - { + ) + { ivas_spar_dec_close( &( st_ivas->hSpar ), hDecoderConfig->output_Fs, 1 ); if ( ( error = ivas_spar_dec_open( st_ivas, 1 ) ) != IVAS_ERR_OK ) diff --git a/lib_dec/ivas_spar_md_dec.c b/lib_dec/ivas_spar_md_dec.c index 134d6d0caf..c731b659d8 100644 --- a/lib_dec/ivas_spar_md_dec.c +++ b/lib_dec/ivas_spar_md_dec.c @@ -69,8 +69,7 @@ static void ivas_get_spar_matrices( ivas_spar_md_dec_state_t *hMdDec, const int1 #else const int16_t sba_order, #endif - const int16_t active_w_vlbr -); + const int16_t active_w_vlbr ); static void ivas_decode_arith_bs( ivas_spar_md_dec_state_t *hMdDec, Decoder_State *st, const uint16_t qsi, const int16_t nB, const int16_t bands_bw, int16_t *pDo_diff, const int16_t freq_diff, const int16_t planarCP, const int16_t strat, const int32_t ivas_total_brate ); @@ -880,7 +879,7 @@ void ivas_spar_md_dec_process( if ( hMdDec->spar_hoa_md_flag == 0 ) #endif { - ivas_spar_to_dirac( st_ivas, hMdDec, dtx_vad, num_bands_out,bw); + ivas_spar_to_dirac( st_ivas, hMdDec, dtx_vad, num_bands_out, bw ); } /* set correct number of bands*/ @@ -1046,7 +1045,7 @@ void ivas_spar_md_dec_process( active_w_vlbr ); - + #ifdef DEBUG_SPAR_DIRAC_WRITE_OUT_PRED_PARS { static FILE *fid = 0; @@ -1325,8 +1324,7 @@ static void ivas_get_spar_matrices( #else const int16_t sba_order, #endif - const int16_t active_w_vlbr -) + const int16_t active_w_vlbr ) { #ifndef SPAR_TUNING int16_t numch_out, num_bands, dmx_ch, split_band; @@ -2162,7 +2160,7 @@ static void ivas_decode_arith_bs( ndm = hMdDec->spar_md_cfg.num_dmx_chans_per_band[bands_bw * i]; ndec = hMdDec->spar_md_cfg.num_decorr_per_band[bands_bw * i]; - if ( ( ivas_total_brate < IVAS_24k4 ) && ( strat > 3 ) && ( ( ( i % 2 == 1 ) && ( strat % 2 == 0 ) ) || ( ( i % 2 == 0 ) && ( strat % 2 == 1 ) ) ) ) + if ( ( ivas_total_brate < IVAS_24k4 ) && ( strat > 3 ) && ( ( ( i % 2 == 1 ) && ( strat % 2 == 0 ) ) || ( ( i % 2 == 0 ) && ( strat % 2 == 1 ) ) ) ) { pred_cell_dims[i].dim1 = 0; pred_cell_dims[i].dim2 = 0; @@ -3073,8 +3071,8 @@ void ivas_spar_to_dirac( } radius = sqrtf( dvx[band] * dvx[band] + dvy[band] * dvy[band] ); - azi[band] = ( int16_t )( max( -180.0f, min( 180.0f, atan2f( dvy[band], dvx[band] ) / EVS_PI * 180.0f ) ) + 0.5f ); - ele[band] = ( int16_t )( max( -90.0f, min( 180.0f, atan2f( dvz[band], radius ) / EVS_PI * 180.0f ) ) + 0.5f ); + azi[band] = (int16_t) ( max( -180.0f, min( 180.0f, atan2f( dvy[band], dvx[band] ) / EVS_PI * 180.0f ) ) + 0.5f ); + ele[band] = (int16_t) ( max( -90.0f, min( 180.0f, atan2f( dvz[band], radius ) / EVS_PI * 180.0f ) ) + 0.5f ); if ( st_ivas->nchan_transport == 1 ) { @@ -3147,8 +3145,8 @@ void ivas_spar_to_dirac( { #ifdef ENABLE_DITHER - azi_dith = ( int16_t )( azi[band] + rand_triangular_signed( seed_ptr ) * dirac_dithering_azi_scale[diff_idx] + 0.5f ); - ele_dith = ( int16_t )( ele[band] + rand_triangular_signed( seed_ptr ) * dirac_dithering_ele_scale[diff_idx] + 0.5f ); + azi_dith = (int16_t) ( azi[band] + rand_triangular_signed( seed_ptr ) * dirac_dithering_azi_scale[diff_idx] + 0.5f ); + ele_dith = (int16_t) ( ele[band] + rand_triangular_signed( seed_ptr ) * dirac_dithering_ele_scale[diff_idx] + 0.5f ); /* limit the elevation to [-90, 90] */ ele_dith = min( 90, ele_dith ); ele_dith = max( -90, ele_dith ); diff --git a/lib_enc/ivas_ism_param_enc.c b/lib_enc/ivas_ism_param_enc.c index e8b43d68d0..609356a59a 100644 --- a/lib_enc/ivas_ism_param_enc.c +++ b/lib_enc/ivas_ism_param_enc.c @@ -395,7 +395,7 @@ void ivas_param_ism_enc( #endif ); - ivas_fb_mixer_update_prior_input( hDirAC->hFbMixer, pcm_in, l_ts + ivas_fb_mixer_update_prior_input( hDirAC->hFbMixer, pcm_in, l_ts #ifdef HODIRAC , hDirAC->hFbMixer->fb_cfg->num_in_chans diff --git a/lib_enc/ivas_masa_enc.c b/lib_enc/ivas_masa_enc.c index c766236fb6..8938a415ff 100644 --- a/lib_enc/ivas_masa_enc.c +++ b/lib_enc/ivas_masa_enc.c @@ -342,10 +342,10 @@ ivas_error ivas_masa_encode( #endif ivas_qmetadata_enc_encode( hMetaData, hQMetaData #ifdef HODIRAC - , - 0 + , + 0 #endif - ); + ); #ifdef HR_METADATA } #endif diff --git a/lib_enc/ivas_mc_param_enc.c b/lib_enc/ivas_mc_param_enc.c index d713c060f1..f32a5b60d3 100644 --- a/lib_enc/ivas_mc_param_enc.c +++ b/lib_enc/ivas_mc_param_enc.c @@ -1561,7 +1561,7 @@ static void ivas_param_mc_write_bs( i = hParamMC->hMetadataPMC.coded_bwidth; for ( pos = 0; pos < 2; pos++ ) { - bit_buffer[( *bit_pos )++] = ( uint16_t )( ( i >> pos ) & 1 ); + bit_buffer[( *bit_pos )++] = (uint16_t) ( ( i >> pos ) & 1 ); } /* write param frame indicator */ @@ -1576,7 +1576,7 @@ static void ivas_param_mc_write_bs( band_step = PARAM_MC_TRANSIENT_BAND_STEP; for ( pos = 2; pos >= 0; --pos ) { - bit_buffer[( *bit_pos )++] = ( uint16_t )( ( hParamMC->hMetadataPMC.attackIndex >> pos ) & 1 ); + bit_buffer[( *bit_pos )++] = (uint16_t) ( ( hParamMC->hMetadataPMC.attackIndex >> pos ) & 1 ); } nbands = hParamMC->hMetadataPMC.nbands_coded / band_step + ( ( hParamMC->hMetadataPMC.nbands_coded % band_step ) ? 1 : 0 ); } diff --git a/lib_enc/ivas_mcmasa_enc.c b/lib_enc/ivas_mcmasa_enc.c index d3dd053c57..ba378ab1d6 100644 --- a/lib_enc/ivas_mcmasa_enc.c +++ b/lib_enc/ivas_mcmasa_enc.c @@ -155,7 +155,7 @@ ivas_error ivas_mcmasa_enc_open( } } - maxBin = ( int16_t )( input_Fs * INV_CLDFB_BANDWIDTH * CLDFB_TO_MDFT_FAC + 0.5f ); + maxBin = (int16_t) ( input_Fs * INV_CLDFB_BANDWIDTH * CLDFB_TO_MDFT_FAC + 0.5f ); for ( i = 1; i < hMcMasa->nbands + 1; i++ ) { @@ -173,7 +173,7 @@ ivas_error ivas_mcmasa_enc_open( hMcMasa->num_samples_delay_comp = 0; /* disable delay compensation by setting to 0 */ #endif tmp_f = (float) hMcMasa->num_samples_delay_comp / (float) ( NS2SA( input_Fs, DIRAC_SLOT_ENC_NS ) ); - hMcMasa->num_slots_delay_comp = ( int16_t )( tmp_f ); + hMcMasa->num_slots_delay_comp = (int16_t) ( tmp_f ); if ( tmp_f > (float) hMcMasa->num_slots_delay_comp ) { @@ -249,7 +249,7 @@ ivas_error ivas_mcmasa_enc_open( /* Ring buffer for the filterbank of the LFE analysis. * The filterbank is using moving average lowpass filter with the crossover of 120 Hz. */ - bufferSize = ( int16_t )( ( input_Fs / FRAMES_PER_SEC ) / MAX_PARAM_SPATIAL_SUBFRAMES ); + bufferSize = (int16_t) ( ( input_Fs / FRAMES_PER_SEC ) / MAX_PARAM_SPATIAL_SUBFRAMES ); for ( i = 0; i < 2; i++ ) { if ( ( hMcMasa->lfeAnaRingBuffer[i] = (float *) malloc( bufferSize * sizeof( float ) ) ) == NULL ) @@ -283,7 +283,7 @@ ivas_error ivas_mcmasa_enc_open( } } - hMcMasa->no_col_avg_diff = ( int8_t )( DIRAC_NO_COL_AVG_DIFF_NS / dirac_slot_ns ); + hMcMasa->no_col_avg_diff = (int8_t) ( DIRAC_NO_COL_AVG_DIFF_NS / dirac_slot_ns ); for ( i = 0; i < DIRAC_NUM_DIMS; i++ ) { if ( ( hMcMasa->buffer_intensity_real[i] = (float **) malloc( hMcMasa->no_col_avg_diff * sizeof( float * ) ) ) == NULL ) @@ -422,7 +422,7 @@ ivas_error ivas_mcmasa_enc_open( hMcMasa->prevMultiChEne = 0.0f; hMcMasa->prevDownmixEne = 0.0f; hMcMasa->prevEQ = 1.0f; - input_frame = ( int16_t )( input_Fs / FRAMES_PER_SEC ); + input_frame = (int16_t) ( input_Fs / FRAMES_PER_SEC ); for ( i = 0; i < input_frame; i++ ) { hMcMasa->interpolator[i] = ( (float) i ) / ( (float) input_frame ); @@ -761,7 +761,7 @@ void ivas_mcmasa_param_est_enc( float FoaEven_RealBuffer[FOA_CHANNELS][DIRAC_NO_FB_BANDS_MAX]; float FoaEven_ImagBuffer[FOA_CHANNELS][DIRAC_NO_FB_BANDS_MAX]; #else - float Foa_RealBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX]; + float Foa_RealBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX]; float Foa_ImagBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX]; float FoaEven_RealBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX]; float FoaEven_ImagBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX]; diff --git a/lib_enc/ivas_qmetadata_enc.c b/lib_enc/ivas_qmetadata_enc.c index 68d56dd0d7..273703b317 100644 --- a/lib_enc/ivas_qmetadata_enc.c +++ b/lib_enc/ivas_qmetadata_enc.c @@ -690,8 +690,8 @@ ivas_error ivas_qmetadata_enc_encode( { for ( j = 0; j < nblocks; j++ ) { - fprintf( pF_azi, " %+5.2f ", ( int16_t )( 100.f * q_direction->band_data[i].azimuth[j] ) / 100.f ); - fprintf( pF_ele, " %+5.2f ", ( int16_t )( 100.f * q_direction->band_data[i].elevation[j] ) / 100.f ); + fprintf( pF_azi, " %+5.2f ", (int16_t) ( 100.f * q_direction->band_data[i].azimuth[j] ) / 100.f ); + fprintf( pF_ele, " %+5.2f ", (int16_t) ( 100.f * q_direction->band_data[i].elevation[j] ) / 100.f ); fprintf( pF_ratio, " %1.3f ", q_direction->band_data[i].energy_ratio[j] ); if ( q_direction->coherence_band_data != NULL ) { @@ -725,7 +725,7 @@ ivas_error ivas_qmetadata_enc_encode( } } - j = ( int16_t )( hMetaData->nb_bits_tot ); + j = (int16_t) ( hMetaData->nb_bits_tot ); dbgwrite( &j, sizeof( int16_t ), 1, 1, "./res/IVAS_QMETADATA_bits.bin" ); } #endif @@ -1012,7 +1012,7 @@ void ivas_qmetadata_enc_sid_encode( if ( sba_mode == SBA_MODE_SPAR ) { /* TODO: still use old sid frame size to keep bitexactness */ - metadata_sid_bits = ( int16_t )( 5000 /*IVAS_SID_5k2*/ - SID_2k40 ) / FRAMES_PER_SEC - ( SPAR_DTX_BANDS * SPAR_SID_BITS_TAR_PER_BAND ) - 1; /* -1 for inactive mode header bit*/ + metadata_sid_bits = (int16_t) ( 5000 /*IVAS_SID_5k2*/ - SID_2k40 ) / FRAMES_PER_SEC - ( SPAR_DTX_BANDS * SPAR_SID_BITS_TAR_PER_BAND ) - 1; /* -1 for inactive mode header bit*/ } else { @@ -1193,8 +1193,8 @@ void ivas_qmetadata_enc_sid_encode( /*direction_distance( elevation_orig, azimuth_orig, q_direction->elevation, q_direction->azimuth, nbands, nblocks, mat_dist );*/ for ( b = start_band; b < nbands; b++ ) { - fprintf( pF_azi, " %+5.2f ", ( int16_t )( 100.f * avg_azimuth[b] ) / 100.f ); - fprintf( pF_ele, " %+5.2f ", ( int16_t )( 100.f * avg_elevation[b] ) / 100.f ); + fprintf( pF_azi, " %+5.2f ", (int16_t) ( 100.f * avg_azimuth[b] ) / 100.f ); + fprintf( pF_ele, " %+5.2f ", (int16_t) ( 100.f * avg_elevation[b] ) / 100.f ); fprintf( pF_ratio, " %1.3f ", q_direction->band_data[b].energy_ratio[0] ); } fprintf( pF_azi, "\n" ); @@ -1254,7 +1254,7 @@ void reset_metadata_spatial( { assert( hMetaData->ind_list[0].nb_bits == 1 ); hMetaData->ind_list[0].value = 1; - metadata_sid_bits = ( int16_t )( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; + metadata_sid_bits = (int16_t) ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; while ( hMetaData->nb_bits_tot < metadata_sid_bits ) { push_next_indice( hMetaData, 0, 1 ); /*fill bit*/ @@ -1444,10 +1444,10 @@ static void ivas_qmetadata_quantize_diffuseness_nrg_ratios_hr( * accuracy when it is perceptual meaningful. */ masa_compensate_two_dir_energy_ratio_index( index_dirRatio1Inv, index_dirRatio2Inv, &index_dirRatio1Inv_mod, &index_dirRatio2Inv_mod #ifdef HODIRAC - , - 0 + , + 0 #endif - ); + ); for ( k = 0; k < hQMetaData->q_direction[0].cfg.nblocks; k++ ) { @@ -1897,7 +1897,7 @@ static void ivas_diffuseness_huff_ec_prepare( { av += q_direction->band_data[b].energy_ratio_index[0]; } - av = ( int16_t )( 0.5f + av / (float) nbands ); + av = (int16_t) ( 0.5f + av / (float) nbands ); *best_av = av; *diffuseness_bits_huff = MAX16B; @@ -2411,7 +2411,7 @@ static int16_t mean_removed_GR_new( int16_t sh_idx[MASA_MAXIMUM_CODING_SUBBANDS]; int16_t max_ns[MASA_MAXIMUM_CODING_SUBBANDS]; - av = ( int16_t )( 0.5f + sum_s( (const int16_t *) idx, len ) / (float) len ); + av = (int16_t) ( 0.5f + sum_s( (const int16_t *) idx, len ) / (float) len ); *p_av = av; for ( i = 0; i < len; i++ ) { diff --git a/lib_enc/ivas_sba_enc.c b/lib_enc/ivas_sba_enc.c index 4ca9c7ce90..35d22fe461 100644 --- a/lib_enc/ivas_sba_enc.c +++ b/lib_enc/ivas_sba_enc.c @@ -221,11 +221,11 @@ ivas_error ivas_sba_enc_reconfigure( { hEncoderConfig->element_mode_init = IVAS_CPE_MDCT; } - if ( nchan_transport_old != st_ivas->nchan_transport + if ( nchan_transport_old != st_ivas->nchan_transport #ifdef HODIRAC || ( ivas_total_brate < IVAS_512k && hEncoderConfig->last_ivas_total_brate >= IVAS_512k ) || ( ivas_total_brate >= IVAS_512k && hEncoderConfig->last_ivas_total_brate < IVAS_512k ) #endif - ) + ) { /* FB mixer handle */ if ( hDirAC->hFbMixer != NULL ) diff --git a/lib_enc/ivas_spar_encoder.c b/lib_enc/ivas_spar_encoder.c index e04078f9e8..06089bf583 100644 --- a/lib_enc/ivas_spar_encoder.c +++ b/lib_enc/ivas_spar_encoder.c @@ -612,7 +612,6 @@ static ivas_error ivas_spar_enc_process( st_ivas->sba_analysis_order > 1 #endif ); - } else { diff --git a/lib_enc/ivas_spar_md_enc.c b/lib_enc/ivas_spar_md_enc.c index 7083959170..d27f149b6d 100644 --- a/lib_enc/ivas_spar_md_enc.c +++ b/lib_enc/ivas_spar_md_enc.c @@ -1543,9 +1543,9 @@ static void ivas_get_arith_coded_bs( pred_cell_dims[i].dim1 = ndm + ndec - 1; if ( hMdEnc->spar_hoa_md_flag #ifdef SPAR_TUNING - && hMdEnc->spar_hoa_dirac2spar_md_flag -#endif - ) + && hMdEnc->spar_hoa_dirac2spar_md_flag +#endif + ) { if ( i >= SPAR_DIRAC_SPLIT_START_BAND ) { -- GitLab From f60477a44402587f583cef863f11257b4c4172ba Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Tue, 9 May 2023 09:45:24 +0200 Subject: [PATCH 47/66] fix formatting in one more file --- lib_enc/ivas_stat_enc.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index 4c7d7b75ac..5eced57880 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -911,7 +911,7 @@ typedef struct cpe_enc_data_structure float *input_mem[CPE_CHANNELS]; /* input channels buffers memory; needed to be up-to-date for TD->DFT stereo switching */ #ifdef DEBUGGING - int16_t stereo_mode_cmdl; /* stereo mode forced from the commaand-line */ + int16_t stereo_mode_cmdl; /* stereo mode forced from the commaand-line */ #endif } CPE_ENC_DATA, *CPE_ENC_HANDLE; -- GitLab From 6a73f3270123c0adf59a6eaf316f08fa7a4dc1b8 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Tue, 9 May 2023 10:18:52 +0200 Subject: [PATCH 48/66] fix compiler warning --- lib_com/ivas_prot.h | 7 ++++--- lib_dec/ivas_dirac_dec.c | 10 ++++++---- lib_dec/ivas_dirac_output_synthesis_dec.c | 3 ++- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 7f1681e8d0..853b4b5c9b 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -3598,10 +3598,11 @@ void ivas_dirac_dec_output_synthesis_process_slot( const float *p_Rmat, /* i : rotation matrix */ const VBAP_HANDLE hVBAPdata, /* i : VBAP structure */ const IVAS_OUTPUT_SETUP hOutSetup, /* i : output setup structure */ - const int16_t nchan_transport, /* i : number of transport channels */ - const int16_t index_slot + const int16_t nchan_transport, /* i : number of transport channels */ +#ifndef HODIRAC + const int16_t index_slot +#endif #ifdef HODIRAC - , const int16_t hodirac #endif ); diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index 35a991c04e..6d28abf5ab 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -2965,10 +2965,11 @@ void ivas_dirac_dec( st_ivas->hVBAPdata, hDirAC->hOutSetup, nchan_transport, +#ifndef HODIRAC index_slot +#endif #ifdef HODIRAC - , - st_ivas->sba_analysis_order > 1 + st_ivas->sba_analysis_order > 1 #endif ); @@ -2982,10 +2983,11 @@ void ivas_dirac_dec( st_ivas->hVBAPdata, hDirAC->hOutSetup, nchan_transport, +#ifndef HODIRAC index_slot +#endif #ifdef HODIRAC - , - st_ivas->sba_analysis_order > 1 + st_ivas->sba_analysis_order > 1 #endif ); } diff --git a/lib_dec/ivas_dirac_output_synthesis_dec.c b/lib_dec/ivas_dirac_output_synthesis_dec.c index fe013878a4..fc76524abb 100755 --- a/lib_dec/ivas_dirac_output_synthesis_dec.c +++ b/lib_dec/ivas_dirac_output_synthesis_dec.c @@ -570,9 +570,10 @@ void ivas_dirac_dec_output_synthesis_process_slot( const VBAP_HANDLE hVBAPdata, /* i : VBAP structure */ const IVAS_OUTPUT_SETUP hOutSetup, /* i : output setup structure */ const int16_t nchan_transport, /* i : number of transport channels*/ +#ifndef HODIRAC const int16_t index_slot +#endif #ifdef HODIRAC - , const int16_t hodirac #endif ) -- GitLab From 0b4f02a31fc68ce3c1501811cb5ceaa2763ddcbc Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Tue, 9 May 2023 11:10:18 +0200 Subject: [PATCH 49/66] restirc HO-DirAC to > 256 kbps --- lib_dec/ivas_dec.c | 4 ++-- lib_dec/ivas_dirac_dec.c | 38 +++++++++++++++++++------------------ lib_dec/ivas_init_dec.c | 4 ++-- lib_dec/ivas_sba_dec.c | 2 +- lib_enc/ivas_enc.c | 2 +- lib_enc/ivas_spar_encoder.c | 6 +++--- 6 files changed, 29 insertions(+), 27 deletions(-) diff --git a/lib_dec/ivas_dec.c b/lib_dec/ivas_dec.c index bb66abf725..9b1ccb7d9e 100644 --- a/lib_dec/ivas_dec.c +++ b/lib_dec/ivas_dec.c @@ -261,7 +261,7 @@ ivas_error ivas_dec( { ivas_dirac_dec_read_BS( ivas_total_brate, st, st_ivas->hDirAC, st_ivas->hQMetaData, &nb_bits_metadata[0], st_ivas->sba_mode, #ifdef HODIRAC - st_ivas->sba_analysis_order, + st_ivas->sba_analysis_order > 1 && ivas_total_brate > IVAS_256k, #endif 0 ); } @@ -286,7 +286,7 @@ ivas_error ivas_dec( &nb_bits_metadata[0], st_ivas->sba_mode, #ifdef HODIRAC - st_ivas->sba_analysis_order, + st_ivas->sba_analysis_order > 1 && ivas_total_brate > IVAS_256k, #endif st_ivas->hSpar->dirac_to_spar_md_bands ); } diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index 6d28abf5ab..de8ceeda1b 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -781,7 +781,7 @@ ivas_error ivas_dirac_dec_config( if ( ( ivas_dirac_dec_output_synthesis_open( hDirAC, st_ivas->renderer_type, nchan_transport, output_Fs #ifdef HODIRAC , - st_ivas->sba_analysis_order > 1 + st_ivas->sba_analysis_order > 1 && ivas_total_brate > IVAS_240_PT_LEN #endif ) ) != IVAS_ERR_OK ) { @@ -796,7 +796,7 @@ ivas_error ivas_dirac_dec_config( if ( ( ivas_dirac_dec_output_synthesis_open( hDirAC, st_ivas->renderer_type, nchan_transport, output_Fs #ifdef HODIRAC , - st_ivas->sba_analysis_order > 1 + st_ivas->sba_analysis_order > 1 && ivas_total_brate > IVAS_240_PT_LEN #endif ) ) != IVAS_ERR_OK ) { @@ -895,7 +895,7 @@ ivas_error ivas_dirac_dec_config( ivas_dirac_dec_output_synthesis_init( hDirAC, nchan_out_woLFE #ifdef HODIRAC , - st_ivas->sba_analysis_order > 1 + st_ivas->sba_analysis_order > 1 && ivas_total_brate > IVAS_256k #endif ); @@ -907,7 +907,7 @@ ivas_error ivas_dirac_dec_config( if ( ( error = ivas_dirac_alloc_mem( hDirAC, st_ivas->renderer_type, &( hDirAC->stack_mem ) #ifdef HODIRAC , - st_ivas->sba_analysis_order > 1 + st_ivas->sba_analysis_order > 1 && ivas_total_brate > IVAS_256k #endif ) ) != IVAS_ERR_OK ) { @@ -1800,7 +1800,7 @@ void ivas_dirac_dec_read_BS( int16_t *nb_bits, /* o : number of bits read */ const SBA_MODE sba_mode, /* i : SBA mode */ #ifdef HODIRAC - const int16_t sba_analysis_order, /* i sba order*/ + const int16_t hodirac, /* i : HO-Dirac flag */ #endif int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ ) @@ -1900,7 +1900,7 @@ void ivas_dirac_dec_read_BS( *nb_bits += ivas_qmetadata_dec_decode( hQMetaData, st->bit_stream, &( st->next_bit_pos ) #ifdef HODIRAC , - ( sba_analysis_order > 1 ) + hodirac #endif ); } @@ -1972,7 +1972,7 @@ void ivas_dirac_dec_read_BS( ivas_qmetadata_to_dirac( hQMetaData, hDirAC, NULL, ivas_total_brate, sba_mode #ifdef HODIRAC , - sba_analysis_order + hodirac #endif , dirac_to_spar_md_bands ); @@ -1995,7 +1995,7 @@ void ivas_qmetadata_to_dirac( const int32_t ivas_total_brate, /* i : IVAS total bitrate */ const SBA_MODE sba_mode, /* i : SBA mode */ #ifdef HODIRAC - const int16_t sba_analysis_order, /* i sba order*/ + const int16_t hodirac, /* i : HO-DirAC flag*/ #endif int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ ) @@ -2209,7 +2209,7 @@ void ivas_qmetadata_to_dirac( /* Bands with spatial data transmitted */ #ifdef HODIRAC - if ( sba_analysis_order > 1 ) + if ( hodirac ) { no_secs = DIRAC_HO_NUMSECTORS; } @@ -2260,7 +2260,7 @@ void ivas_qmetadata_to_dirac( #ifdef HODIRAC - if ( hMasa == NULL && sba_analysis_order > 1 ) + if ( hMasa == NULL && hodirac ) { azimuth = q_direction[idx_sec].band_data[qBand_idx].azimuth[block_qmetadata]; elevation = q_direction[idx_sec].band_data[qBand_idx].elevation[block_qmetadata]; @@ -2296,7 +2296,7 @@ void ivas_qmetadata_to_dirac( tmp_write_idx_band = tmp_write_idx_param_band; #ifdef HODIRAC - if ( sba_analysis_order > 1 ) + if ( hodirac ) { azi = (int16_t) ( azimuth + 0.5f ); ele = (int16_t) ( elevation + 0.5f ); @@ -2338,7 +2338,7 @@ void ivas_qmetadata_to_dirac( hDirAC->diffuseness_vector[tmp_write_idx_band][b] = diffuseness; #ifdef HODIRAC - if ( sba_analysis_order > 1 ) + if ( hodirac ) { if ( idx_sec == 0 ) { @@ -2414,7 +2414,7 @@ void ivas_qmetadata_to_dirac( } #ifdef HODIRAC_WRITE_PARAMS - if ( hMasa == NULL && sba_analysis_order > 1 ) + if ( hMasa == NULL && sba_analysis_order > 1 && ivas_total_brate > IVAS_256k ) { static FILE *f_params = 0; int16_t tmp_write_idx_band = 0; @@ -2639,7 +2639,7 @@ void ivas_dirac_dec( p_Rmat #ifdef HODIRAC , - st_ivas->sba_analysis_order > 1 + st_ivas->sba_analysis_order > 1 && st_ivas->hDecoderConfig->ivas_total_brate > IVAS_256k #endif ); } @@ -2653,7 +2653,7 @@ void ivas_dirac_dec( 0 #ifdef HODIRAC , - st_ivas->sba_analysis_order > 1 + st_ivas->sba_analysis_order > 1 && st_ivas->hDecoderConfig->ivas_total_brate > IVAS_256k #endif ); } @@ -2969,7 +2969,8 @@ void ivas_dirac_dec( index_slot #endif #ifdef HODIRAC - st_ivas->sba_analysis_order > 1 + st_ivas->sba_analysis_order > 1 && + st_ivas->hDecoderConfig->ivas_total_brate > IVAS_256k #endif ); @@ -2987,7 +2988,8 @@ void ivas_dirac_dec( index_slot #endif #ifdef HODIRAC - st_ivas->sba_analysis_order > 1 + st_ivas->sba_analysis_order > 1 && + st_ivas->hDecoderConfig->ivas_total_brate > IVAS_256k #endif ); } @@ -3017,7 +3019,7 @@ void ivas_dirac_dec( p_onset_filter #ifdef HODIRAC , - st_ivas->sba_analysis_order > 1 + st_ivas->sba_analysis_order > 1 && st_ivas->hDecoderConfig->ivas_total_brate > IVAS_256k #endif ); } diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index 4bf92d775c..32d669175e 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -911,7 +911,7 @@ ivas_error ivas_init_decoder( st_ivas->sba_analysis_order, st_ivas->sba_mode, #ifdef HODIRAC - st_ivas->sba_analysis_order > 1 ? IVAS_MAX_NUM_BANDS : ( IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ) + st_ivas->sba_analysis_order > 1 && st_ivas->hDecoderConfig->ivas_total_brate > IVAS_256k ? IVAS_MAX_NUM_BANDS : ( IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ) #else IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND #endif @@ -939,7 +939,7 @@ ivas_error ivas_init_decoder( st_ivas->hSpar->enc_param_start_band = min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND ); #ifdef HODIRAC - if ( st_ivas->sba_analysis_order > 1 ) + if ( st_ivas->sba_analysis_order > 1 && st_ivas->hDecoderConfig->ivas_total_brate > IVAS_256k ) { st_ivas->hSpar->enc_param_start_band = 0; diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c index 1d39337ee2..3b5122031a 100755 --- a/lib_dec/ivas_sba_dec.c +++ b/lib_dec/ivas_sba_dec.c @@ -276,7 +276,7 @@ ivas_error ivas_sba_dec_reconfigure( st_ivas->sba_analysis_order, st_ivas->sba_mode, #ifdef HODIRAC - st_ivas->sba_analysis_order > 1 ? IVAS_MAX_NUM_BANDS : ( IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ) + st_ivas->sba_analysis_order > 1 && st_ivas->hDecoderConfig->ivas_total_brate > IVAS_256k ? IVAS_MAX_NUM_BANDS : ( IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ) #else IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND #endif diff --git a/lib_enc/ivas_enc.c b/lib_enc/ivas_enc.c index 1572789f6d..fd6f012e1e 100644 --- a/lib_enc/ivas_enc.c +++ b/lib_enc/ivas_enc.c @@ -135,7 +135,7 @@ ivas_error ivas_enc( { if ( ( ivas_format == SBA_FORMAT ) && ( st_ivas->sba_mode == SBA_MODE_SPAR ) #ifdef HODIRAC - & !( st_ivas->sba_analysis_order > 1 ) + & !( st_ivas->sba_analysis_order > 1 && ivas_total_brate > IVAS_256k ) #endif ) { diff --git a/lib_enc/ivas_spar_encoder.c b/lib_enc/ivas_spar_encoder.c index 06089bf583..ba76bec4f8 100644 --- a/lib_enc/ivas_spar_encoder.c +++ b/lib_enc/ivas_spar_encoder.c @@ -592,8 +592,8 @@ static ivas_error ivas_spar_enc_process( ivas_dirac_param_est_enc( st_ivas->hDirAC, hQMetaData->q_direction, hQMetaData->useLowerRes, data_f, ppIn_FR_real, ppIn_FR_imag, input_frame, st_ivas->sba_mode #ifdef HODIRAC , - st_ivas->sba_analysis_order > 1, - st_ivas->sba_analysis_order > 1 ? HOA2_CHANNELS : FOA_CHANNELS + st_ivas->sba_analysis_order > 1 && ivas_total_brate > IVAS_256k, + st_ivas->sba_analysis_order > 1 && ivas_total_brate > IVAS_256k ? HOA2_CHANNELS : FOA_CHANNELS #endif ); @@ -609,7 +609,7 @@ static ivas_error ivas_spar_enc_process( ivas_qmetadata_enc_encode( hMetaData, hQMetaData #ifdef HODIRAC , - st_ivas->sba_analysis_order > 1 + st_ivas->sba_analysis_order > 1 && ivas_total_brate > IVAS_256k #endif ); } -- GitLab From 9387717a47ec821f42e61eeb6f47249e0fe6ae08 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Tue, 9 May 2023 12:09:45 +0200 Subject: [PATCH 50/66] fix crashes in 256 kbps modes --- lib_com/ivas_dirac_com.c | 12 ++++++------ lib_dec/ivas_dirac_dec.c | 3 +-- lib_dec/ivas_spar_md_dec.c | 2 +- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/lib_com/ivas_dirac_com.c b/lib_com/ivas_dirac_com.c index 42853878b8..9851146760 100644 --- a/lib_com/ivas_dirac_com.c +++ b/lib_com/ivas_dirac_com.c @@ -133,7 +133,7 @@ ivas_error ivas_dirac_config( spar_dirac_split_band = min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND ); #ifdef HODIRAC - if ( sba_order > 1 ) + if ( sba_order > 1 && ivas_total_brate > IVAS_256k ) { spar_dirac_split_band = 0; } @@ -174,7 +174,7 @@ ivas_error ivas_dirac_config( hConfig->enc_param_start_band = spar_dirac_split_band; } #ifdef HODIRAC - if ( sba_order > 1 ) + if ( sba_order > 1 && ivas_total_brate > IVAS_240_PT_LEN ) { hConfig->dec_param_estim = FALSE; hConfig->enc_param_start_band = 0; @@ -376,7 +376,7 @@ ivas_error ivas_dirac_sba_config( { hQMetaData->useLowerBandRes = 0; #ifdef HODIRAC - if ( !( sba_order > 1 ) ) + if ( !( sba_order > 1 && sba_total_brate > IVAS_256k) ) #endif { nbands_coded = nbands - 1; /* always combine the last two bands */ @@ -386,7 +386,7 @@ ivas_error ivas_dirac_sba_config( { int16_t no_dirs = 1; #ifdef HODIRAC - if ( sba_order > 1 ) + if ( sba_order > 1 && sba_total_brate > IVAS_256k ) { no_dirs = 2; } @@ -491,7 +491,7 @@ ivas_error ivas_dirac_sba_config( { int16_t no_dirs = 1; #ifdef HODIRAC - if ( sba_order > 1 ) + if ( sba_order > 1 && sba_total_brate > IVAS_256k ) { no_dirs = 2; } @@ -529,7 +529,7 @@ ivas_error ivas_dirac_sba_config( { hQMetaData->q_direction[i].cfg.search_effort = 1; #ifdef HODIRAC - if ( sba_order > 1 ) + if ( sba_order > 1 && sba_total_brate > IVAS_256k ) { hQMetaData->q_direction[i].cfg.start_band = 0; } diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index de8ceeda1b..fbaa900ef1 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -2988,8 +2988,7 @@ void ivas_dirac_dec( index_slot #endif #ifdef HODIRAC - st_ivas->sba_analysis_order > 1 && - st_ivas->hDecoderConfig->ivas_total_brate > IVAS_256k + st_ivas->sba_analysis_order > 1 && st_ivas->hDecoderConfig->ivas_total_brate > IVAS_256k #endif ); } diff --git a/lib_dec/ivas_spar_md_dec.c b/lib_dec/ivas_spar_md_dec.c index c731b659d8..43e4a28b03 100644 --- a/lib_dec/ivas_spar_md_dec.c +++ b/lib_dec/ivas_spar_md_dec.c @@ -3037,7 +3037,7 @@ void ivas_spar_to_dirac( if ( hDirAC != NULL #ifdef HODIRAC - && st_ivas->sba_analysis_order <= 1 + && ( st_ivas->sba_analysis_order <= 1 || st_ivas->hDecoderConfig->ivas_total_brate < IVAS_256k ) #endif ) { -- GitLab From 229a6510ff889b36d265aa737301751a6fa025da Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Tue, 9 May 2023 12:53:30 +0200 Subject: [PATCH 51/66] fix condition for HO-DirAC in ivas_dirac_config --- lib_com/ivas_dirac_com.c | 2 +- lib_com/ivas_sba_config.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_com/ivas_dirac_com.c b/lib_com/ivas_dirac_com.c index 9851146760..4e37bb9469 100644 --- a/lib_com/ivas_dirac_com.c +++ b/lib_com/ivas_dirac_com.c @@ -174,7 +174,7 @@ ivas_error ivas_dirac_config( hConfig->enc_param_start_band = spar_dirac_split_band; } #ifdef HODIRAC - if ( sba_order > 1 && ivas_total_brate > IVAS_240_PT_LEN ) + if ( sba_order > 1 && ivas_total_brate > IVAS_256k ) { hConfig->dec_param_estim = FALSE; hConfig->enc_param_start_band = 0; diff --git a/lib_com/ivas_sba_config.c b/lib_com/ivas_sba_config.c index f5e0c53e3a..ee111f6e5e 100644 --- a/lib_com/ivas_sba_config.c +++ b/lib_com/ivas_sba_config.c @@ -292,7 +292,7 @@ void ivas_sba_get_spar_hoa_md_flag( int16_t *spar_hoa_md_flag, int16_t *spar_hoa_dirac2spar_md_flag ) { - if ( sba_order > 1 && ivas_total_brate >= IVAS_256k ) + if ( sba_order > 1 && ivas_total_brate > IVAS_256k ) { *spar_hoa_md_flag = 1; } -- GitLab From 464c9a24c68a31ee848973a1e120d8863ed73e1a Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Tue, 9 May 2023 13:17:51 +0200 Subject: [PATCH 52/66] fix asan error in ivas_enc --- lib_enc/ivas_enc.c | 2 +- lib_enc/ivas_init_enc.c | 16 ++++++++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/lib_enc/ivas_enc.c b/lib_enc/ivas_enc.c index fd6f012e1e..88fdf2139c 100644 --- a/lib_enc/ivas_enc.c +++ b/lib_enc/ivas_enc.c @@ -135,7 +135,7 @@ ivas_error ivas_enc( { if ( ( ivas_format == SBA_FORMAT ) && ( st_ivas->sba_mode == SBA_MODE_SPAR ) #ifdef HODIRAC - & !( st_ivas->sba_analysis_order > 1 && ivas_total_brate > IVAS_256k ) + && !( st_ivas->sba_analysis_order > 1 && ivas_total_brate > IVAS_256k ) #endif ) { diff --git a/lib_enc/ivas_init_enc.c b/lib_enc/ivas_init_enc.c index 1da4cac536..c0113629e7 100644 --- a/lib_enc/ivas_init_enc.c +++ b/lib_enc/ivas_init_enc.c @@ -185,11 +185,19 @@ int16_t getNumChanAnalysis( if ( st_ivas->hEncoderConfig->ivas_format == SBA_FORMAT ) { #ifdef HODIRAC - /*tyagiri:TODO: best keep it unchanged*/ - n = ( st_ivas->sba_analysis_order + 1 ) * ( st_ivas->sba_analysis_order + 1 ); -#else - n = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order ); + /* tyagiri:TODO: best keep it unchanged */ + /* wkr: i made it conditional on the bitrate, + but in general it must take a different value than ivas_sba_get_nchan_metadata + because DirAC needs a different number than SPAR */ + if ( st_ivas->hEncoderConfig->ivas_total_brate > IVAS_256k ) + { + n = ( st_ivas->sba_analysis_order + 1 ) * ( st_ivas->sba_analysis_order + 1 ); + } + else #endif + { + n = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, st_ivas->hEncoderConfig->ivas_total_brate ); + } } else if ( st_ivas->hEncoderConfig->ivas_format == MC_FORMAT && ( st_ivas->mc_mode == MC_MODE_PARAMMC || st_ivas->mc_mode == MC_MODE_MCMASA ) ) { -- GitLab From 7bc51793dcaf1f970719901ebfe35f923c2712b1 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Tue, 9 May 2023 18:15:43 +0200 Subject: [PATCH 53/66] fix typo in HO-DirAC condition in ivas_dirac_dec_config --- lib_dec/ivas_dirac_dec.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index fbaa900ef1..86db978b0f 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -781,7 +781,7 @@ ivas_error ivas_dirac_dec_config( if ( ( ivas_dirac_dec_output_synthesis_open( hDirAC, st_ivas->renderer_type, nchan_transport, output_Fs #ifdef HODIRAC , - st_ivas->sba_analysis_order > 1 && ivas_total_brate > IVAS_240_PT_LEN + st_ivas->sba_analysis_order > 1 && ivas_total_brate > IVAS_256k #endif ) ) != IVAS_ERR_OK ) { @@ -796,7 +796,7 @@ ivas_error ivas_dirac_dec_config( if ( ( ivas_dirac_dec_output_synthesis_open( hDirAC, st_ivas->renderer_type, nchan_transport, output_Fs #ifdef HODIRAC , - st_ivas->sba_analysis_order > 1 && ivas_total_brate > IVAS_240_PT_LEN + st_ivas->sba_analysis_order > 1 && ivas_total_brate > IVAS_256k #endif ) ) != IVAS_ERR_OK ) { -- GitLab From 685d0d5a22d93479a3ae4fe6d36087bd1c46e9aa Mon Sep 17 00:00:00 2001 From: rtyag Date: Wed, 10 May 2023 12:05:08 +1000 Subject: [PATCH 54/66] fixes for 256 kbps SBA --- lib_com/ivas_sba_config.c | 2 +- lib_enc/ivas_enc.c | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/lib_com/ivas_sba_config.c b/lib_com/ivas_sba_config.c index ee111f6e5e..f5e0c53e3a 100644 --- a/lib_com/ivas_sba_config.c +++ b/lib_com/ivas_sba_config.c @@ -292,7 +292,7 @@ void ivas_sba_get_spar_hoa_md_flag( int16_t *spar_hoa_md_flag, int16_t *spar_hoa_dirac2spar_md_flag ) { - if ( sba_order > 1 && ivas_total_brate > IVAS_256k ) + if ( sba_order > 1 && ivas_total_brate >= IVAS_256k ) { *spar_hoa_md_flag = 1; } diff --git a/lib_enc/ivas_enc.c b/lib_enc/ivas_enc.c index 88fdf2139c..b2e5fc5d8c 100644 --- a/lib_enc/ivas_enc.c +++ b/lib_enc/ivas_enc.c @@ -139,7 +139,11 @@ ivas_error ivas_enc( #endif ) { +#ifdef SPAR_TUNING + hp20( data_f[HOA_keep_ind[st_ivas->hSpar->hMdEnc->HOA_md_ind[i]]], input_frame, st_ivas->mem_hp20_in[i], input_Fs ); +#else hp20( data_f[HOA_keep_ind[i]], input_frame, st_ivas->mem_hp20_in[i], input_Fs ); +#endif } else if ( !( ivas_format == MC_FORMAT && i == LFE_CHANNEL ) ) /*TODO: is the HPF needed for LFE channel? */ { -- GitLab From db83650b5760757e7d05ba819801786b75827fd9 Mon Sep 17 00:00:00 2001 From: rtyag Date: Wed, 10 May 2023 12:44:45 +1000 Subject: [PATCH 55/66] HP20 fix for bitrate switching between different SBA analysis orders --- lib_enc/ivas_enc.c | 2 +- lib_enc/ivas_init_enc.c | 15 +++------------ 2 files changed, 4 insertions(+), 13 deletions(-) diff --git a/lib_enc/ivas_enc.c b/lib_enc/ivas_enc.c index b2e5fc5d8c..12cfa37fed 100644 --- a/lib_enc/ivas_enc.c +++ b/lib_enc/ivas_enc.c @@ -135,7 +135,7 @@ ivas_error ivas_enc( { if ( ( ivas_format == SBA_FORMAT ) && ( st_ivas->sba_mode == SBA_MODE_SPAR ) #ifdef HODIRAC - && !( st_ivas->sba_analysis_order > 1 && ivas_total_brate > IVAS_256k ) + && !( st_ivas->sba_analysis_order > 1 ) #endif ) { diff --git a/lib_enc/ivas_init_enc.c b/lib_enc/ivas_init_enc.c index 90a07b4fee..af1a69d1d0 100644 --- a/lib_enc/ivas_init_enc.c +++ b/lib_enc/ivas_init_enc.c @@ -196,19 +196,10 @@ int16_t getNumChanAnalysis( if ( st_ivas->hEncoderConfig->ivas_format == SBA_FORMAT ) { #ifdef HODIRAC - /* tyagiri:TODO: best keep it unchanged */ - /* wkr: i made it conditional on the bitrate, - but in general it must take a different value than ivas_sba_get_nchan_metadata - because DirAC needs a different number than SPAR */ - if ( st_ivas->hEncoderConfig->ivas_total_brate > IVAS_256k ) - { - n = ( st_ivas->sba_analysis_order + 1 ) * ( st_ivas->sba_analysis_order + 1 ); - } - else + n = ( st_ivas->sba_analysis_order + 1 ) * ( st_ivas->sba_analysis_order + 1 ); +#else + n = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, st_ivas->hEncoderConfig->ivas_total_brate ); #endif - { - n = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, st_ivas->hEncoderConfig->ivas_total_brate ); - } } else if ( st_ivas->hEncoderConfig->ivas_format == MC_FORMAT && ( st_ivas->mc_mode == MC_MODE_PARAMMC || st_ivas->mc_mode == MC_MODE_MCMASA ) ) { -- GitLab From 25303da468be11e30087b28a41fa199335d3f15e Mon Sep 17 00:00:00 2001 From: rtyag Date: Wed, 10 May 2023 13:43:38 +1000 Subject: [PATCH 56/66] 24.4 to 256 kbps bitrate switching failure fix --- lib_com/ivas_dirac_com.c | 4 ++-- lib_dec/ivas_dirac_dec.c | 12 +++++++----- lib_dec/ivas_sba_dec.c | 2 +- lib_enc/ivas_enc.c | 1 - 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/lib_com/ivas_dirac_com.c b/lib_com/ivas_dirac_com.c index 4e37bb9469..a61a92d4a5 100644 --- a/lib_com/ivas_dirac_com.c +++ b/lib_com/ivas_dirac_com.c @@ -174,7 +174,7 @@ 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 ) + if ( sba_order > 1 && ivas_total_brate > IVAS_256k ) { hConfig->dec_param_estim = FALSE; hConfig->enc_param_start_band = 0; @@ -376,7 +376,7 @@ ivas_error ivas_dirac_sba_config( { hQMetaData->useLowerBandRes = 0; #ifdef HODIRAC - if ( !( sba_order > 1 && sba_total_brate > IVAS_256k) ) + if ( !( sba_order > 1 && sba_total_brate > IVAS_256k ) ) #endif { nbands_coded = nbands - 1; /* always combine the last two bands */ diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index 86db978b0f..8099640ea4 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -271,9 +271,9 @@ ivas_error ivas_dirac_dec_config( } #ifdef HODIRAC - if ( st_ivas->ivas_format == SBA_FORMAT && flag_config == DIRAC_RECONFIGURE && ( ( ivas_total_brate >= IVAS_256k && st_ivas->hDecoderConfig->last_ivas_total_brate < IVAS_256k ) || ( ivas_total_brate < IVAS_256k && st_ivas->hDecoderConfig->last_ivas_total_brate >= IVAS_256k ) ) ) + if ( st_ivas->ivas_format == SBA_FORMAT && flag_config == DIRAC_RECONFIGURE && ( ( ivas_total_brate > IVAS_256k && st_ivas->hDecoderConfig->last_ivas_total_brate <= IVAS_256k ) || ( ivas_total_brate <= IVAS_256k && st_ivas->hDecoderConfig->last_ivas_total_brate > IVAS_256k ) ) ) { - if ( st_ivas->hDecoderConfig->ivas_total_brate >= IVAS_256k && hDirAC->azimuth2 == NULL ) + if ( st_ivas->hDecoderConfig->ivas_total_brate > IVAS_256k && hDirAC->azimuth2 == NULL ) { hDirAC->azimuth2 = (int16_t **) malloc( hDirAC->dirac_md_buffer_length * sizeof( int16_t * ) ); hDirAC->elevation2 = (int16_t **) malloc( hDirAC->dirac_md_buffer_length * sizeof( int16_t * ) ); @@ -291,7 +291,7 @@ ivas_error ivas_dirac_dec_config( set_f( hDirAC->spreadCoherence2[i], 0.0f, hDirAC->num_freq_bands ); } } - else if ( st_ivas->hDecoderConfig->ivas_total_brate < IVAS_256k && hDirAC->azimuth2 != NULL ) + else if ( st_ivas->hDecoderConfig->ivas_total_brate <= IVAS_256k && hDirAC->azimuth2 != NULL ) { for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) { @@ -317,6 +317,7 @@ ivas_error ivas_dirac_dec_config( /* band config needed only for SPAR with FOA output */ if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_FOA && st_ivas->sba_mode == SBA_MODE_SPAR #ifdef HODIRAC + /*DLB : why is this needed ?*/ && ivas_total_brate < IVAS_256k #endif ) @@ -1028,7 +1029,7 @@ ivas_error ivas_dirac_dec_config( if ( st_ivas->ivas_format == MASA_FORMAT #ifdef HODIRAC - || ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->hDecoderConfig->ivas_total_brate >= IVAS_256k ) + || ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->hDecoderConfig->ivas_total_brate > IVAS_256k ) #endif ) { @@ -2988,7 +2989,8 @@ void ivas_dirac_dec( index_slot #endif #ifdef HODIRAC - st_ivas->sba_analysis_order > 1 && st_ivas->hDecoderConfig->ivas_total_brate > IVAS_256k + st_ivas->sba_analysis_order > 1 && + st_ivas->hDecoderConfig->ivas_total_brate > IVAS_256k #endif ); } diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c index 3b5122031a..859d17defb 100755 --- a/lib_dec/ivas_sba_dec.c +++ b/lib_dec/ivas_sba_dec.c @@ -249,7 +249,7 @@ ivas_error ivas_sba_dec_reconfigure( if ( ( ( st_ivas->renderer_type != RENDERER_DISABLE ) && ( st_ivas->renderer_type != RENDERER_SBA_LINEAR_DEC ) ) || ( ( hDecoderConfig->output_config != AUDIO_CONFIG_FOA ) && ( st_ivas->hDecoderConfig->output_config != AUDIO_CONFIG_STEREO ) && ( st_ivas->hDecoderConfig->output_config != AUDIO_CONFIG_MONO ) ) #ifdef HODIRAC - || ( last_ivas_total_brate >= IVAS_256k && ivas_total_brate < IVAS_256k ) || ( last_ivas_total_brate < IVAS_256k && ivas_total_brate >= IVAS_256k ) + || ( last_ivas_total_brate > IVAS_256k && ivas_total_brate <= IVAS_256k ) || ( last_ivas_total_brate <= IVAS_256k && ivas_total_brate > IVAS_256k ) #endif ) { diff --git a/lib_enc/ivas_enc.c b/lib_enc/ivas_enc.c index 12cfa37fed..fa293221d4 100644 --- a/lib_enc/ivas_enc.c +++ b/lib_enc/ivas_enc.c @@ -128,7 +128,6 @@ ivas_error ivas_enc( n = getNumChanAnalysis( st_ivas ); - /*tyagiri: TODO: looks like HP20 is disabled for high bitrates in SBA. Also, getNumChanAnalysis() is returning (order+1)*(order+1) channels always. is this expected ?*/ #ifndef DEBUG_SPAR_BYPASS_EVS_CODEC /* bypass EVS coding in float precision, emulating EVS encoder/decoder delay */ for ( i = 0; i < n; i++ ) -- GitLab From f381c0b0d1ed713b4bfd06fa386f4fc43c588c21 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Wed, 10 May 2023 10:56:22 +0200 Subject: [PATCH 57/66] fix compilation with HODIRAC disabled --- lib_enc/ivas_init_enc.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib_enc/ivas_init_enc.c b/lib_enc/ivas_init_enc.c index af1a69d1d0..83a733fe48 100644 --- a/lib_enc/ivas_init_enc.c +++ b/lib_enc/ivas_init_enc.c @@ -198,7 +198,11 @@ int16_t getNumChanAnalysis( #ifdef HODIRAC n = ( st_ivas->sba_analysis_order + 1 ) * ( st_ivas->sba_analysis_order + 1 ); #else +#ifdef SPAR_TUNING n = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, st_ivas->hEncoderConfig->ivas_total_brate ); +#else + n = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order ); +#endif #endif } else if ( st_ivas->hEncoderConfig->ivas_format == MC_FORMAT && ( st_ivas->mc_mode == MC_MODE_PARAMMC || st_ivas->mc_mode == MC_MODE_MCMASA ) ) -- GitLab From c1998fc7431f413b71713a939854bb384a920535 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Wed, 10 May 2023 11:00:51 +0200 Subject: [PATCH 58/66] fix compilation with SPAR_TUNING disabled --- lib_dec/ivas_spar_md_dec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/ivas_spar_md_dec.c b/lib_dec/ivas_spar_md_dec.c index 43e4a28b03..f567ad6915 100644 --- a/lib_dec/ivas_spar_md_dec.c +++ b/lib_dec/ivas_spar_md_dec.c @@ -2175,7 +2175,7 @@ static void ivas_decode_arith_bs( { pred_cell_dims[i].dim1 = ndm + ndec - 1; if ( hMdDec->spar_hoa_md_flag -#ifdef HODIRAC +#ifdef SPAR_TUNING && hMdDec->spar_hoa_dirac2spar_md_flag #endif ) -- GitLab From 073c7ddb2002e2368bac3d8049305883ccac5b94 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Wed, 10 May 2023 11:50:36 +0200 Subject: [PATCH 59/66] wrap changes into ifdef more cleanly --- lib_dec/ivas_spar_decoder.c | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c index eb63e323b0..80f6fac2fc 100644 --- a/lib_dec/ivas_spar_decoder.c +++ b/lib_dec/ivas_spar_decoder.c @@ -1358,7 +1358,6 @@ void ivas_spar_dec_upmixer( { #ifdef SPAR_TUNING if ( b_skip_mat[out_ch][in_ch] == 0 ) -#endif { if ( cldfb_band < CLDFB_PAR_WEIGHT_START_BAND ) /* tuning parameter, depends on how much SPAR Filters overlap for the CLDFB bands */ { @@ -1379,6 +1378,30 @@ void ivas_spar_dec_upmixer( out_im[out_ch] += cldfb_in_ts_im[in_ch][ts][cldfb_band] * cldfb_par; } } +#else + + if ( b_skip_mat[out_ch][in_ch] ) + { + continue; + } + else if ( cldfb_band < CLDFB_PAR_WEIGHT_START_BAND ) /* tuning parameter, depends on how much SPAR Filters overlap for the CLDFB bands */ + { + spar_band = bin2band->p_cldfb_map_to_spar_band[cldfb_band]; + cldfb_par = mixer_mat[out_ch][in_ch][spar_band]; + } + else + { + cldfb_par = 0.0f; + for ( spar_band = bin2band->p_spar_start_bands[cldfb_band]; spar_band < num_spar_bands; spar_band++ ) + { + /* accumulate contributions from all SPAR bands */ + cldfb_par += mixer_mat[out_ch][in_ch][spar_band] * bin2band->pp_cldfb_weights_per_spar_band[cldfb_band][spar_band]; + } + } + + out_re[out_ch] += cldfb_in_ts_re[in_ch][ts][cldfb_band] * cldfb_par; + out_im[out_ch] += cldfb_in_ts_im[in_ch][ts][cldfb_band] * cldfb_par; +#endif } /*update CLDFB data with the parameter-modified data*/ -- GitLab From a2c3babc540f0a0c8fb8d8e88f855e8a5d73efa7 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Wed, 10 May 2023 11:57:58 +0200 Subject: [PATCH 60/66] fix duplicate assignment from merge conflict in ivas_spar_to_dirac --- lib_dec/ivas_spar_md_dec.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib_dec/ivas_spar_md_dec.c b/lib_dec/ivas_spar_md_dec.c index f567ad6915..f84e9b8f93 100644 --- a/lib_dec/ivas_spar_md_dec.c +++ b/lib_dec/ivas_spar_md_dec.c @@ -3026,14 +3026,12 @@ void ivas_spar_to_dirac( sba_order_internal = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); start_band = 0; - end_band = min( num_bands_out, SPAR_DIRAC_SPLIT_START_BAND ) / bw; hDirAC = st_ivas->hDirAC; dirac_to_spar_md_bands = st_ivas->hSpar->dirac_to_spar_md_bands; enc_param_start_band = st_ivas->hSpar->enc_param_start_band / bw; active_w_vlbr = ( st_ivas->hDecoderConfig->ivas_total_brate < IVAS_24k4 ) ? 1 : 0; - end_band = min( num_bands_out, SPAR_DIRAC_SPLIT_START_BAND ) / bw; if ( hDirAC != NULL #ifdef HODIRAC -- GitLab From 4652d9a98e12f642ca7fc25282784c77aa32836c Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Wed, 10 May 2023 12:03:41 +0200 Subject: [PATCH 61/66] fix HO-DirAC condition in ivas_spar_to_dirac --- lib_dec/ivas_spar_md_dec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/ivas_spar_md_dec.c b/lib_dec/ivas_spar_md_dec.c index f84e9b8f93..a4e24dea06 100644 --- a/lib_dec/ivas_spar_md_dec.c +++ b/lib_dec/ivas_spar_md_dec.c @@ -3035,7 +3035,7 @@ void ivas_spar_to_dirac( if ( hDirAC != NULL #ifdef HODIRAC - && ( st_ivas->sba_analysis_order <= 1 || st_ivas->hDecoderConfig->ivas_total_brate < IVAS_256k ) + && ( st_ivas->sba_analysis_order <= 1 || st_ivas->hDecoderConfig->ivas_total_brate <= IVAS_256k ) #endif ) { -- GitLab From 035afb9491cb05348bbec43a8ed45e1866d748c7 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Wed, 10 May 2023 12:11:07 +0200 Subject: [PATCH 62/66] fix compile error with HODIRAC disabled --- lib_dec/ivas_spar_decoder.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c index 80f6fac2fc..fce4e91dc4 100644 --- a/lib_dec/ivas_spar_decoder.c +++ b/lib_dec/ivas_spar_decoder.c @@ -285,7 +285,7 @@ ivas_error ivas_spar_dec( bit_stream_orig = st0->bit_stream; next_bit_pos_orig = st0->next_bit_pos; - last_bit_pos = (int16_t) ( ( hDecoderConfig->ivas_total_brate / FRAMES_PER_SEC ) - 1 ); + last_bit_pos = ( int16_t )( ( hDecoderConfig->ivas_total_brate / FRAMES_PER_SEC ) - 1 ); if ( !st0->bfi && hDecoderConfig->ivas_total_brate == IVAS_SID_5k2 ) { last_bit_pos -= SID_FORMAT_NBITS; @@ -313,7 +313,7 @@ ivas_error ivas_spar_dec( { int16_t zero_pad_bits; *nb_bits_read += SID_FORMAT_NBITS; - zero_pad_bits = (int16_t) ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - *nb_bits_read; + zero_pad_bits = ( int16_t )( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - *nb_bits_read; assert( zero_pad_bits <= 1 ); *nb_bits_read += zero_pad_bits; } @@ -494,7 +494,7 @@ void ivas_spar_get_cldfb_gains( weights = hSpar->hFbMixer->cldfb_cross_fade; cf_cldfb_start = (int16_t) ceil( ( cf_start - decfb_delay / 2 ) / (float) stride - 0.5f ); - cf_cldfb_end = (int16_t) ( ( cf_start - decfb_delay / 2 + cf_len ) / (float) stride - 0.5f ); + cf_cldfb_end = ( int16_t )( ( cf_start - decfb_delay / 2 + cf_len ) / (float) stride - 0.5f ); num_cf_slots = cf_cldfb_end - cf_cldfb_start + 1; num_samples = num_cf_slots * stride + pt_len - stride; @@ -812,7 +812,7 @@ static float ivas_spar_get_cldfb_slot_gain( encfb_delay = IVAS_FB_ENC_DELAY_NS; decfb_delay = IVAS_FB_DEC_DELAY_NS; xfade_start_ns = hSpar->hFbMixer->cross_fade_start_offset / output_Fs * 1000000000.f - encfb_delay + decfb_delay * 0.5f; - xfade_delay_subframes = (int16_t) ( xfade_start_ns / ( FRAME_SIZE_NS / MAX_PARAM_SPATIAL_SUBFRAMES ) ); + xfade_delay_subframes = ( int16_t )( xfade_start_ns / ( FRAME_SIZE_NS / MAX_PARAM_SPATIAL_SUBFRAMES ) ); i_hist = 4 - xfade_delay_subframes; split_band = SPAR_DIRAC_SPLIT_START_BAND; @@ -1130,8 +1130,7 @@ void ivas_spar_dec_upmixer( for ( i = 0; i < nchan_transport; i++ ) { tmp = roundf( output[i][j] * PCM16_TO_FLT_FAC ); - pcm = ( tmp > MAX16B_FLT ) ? MAX16B : ( tmp < MIN16B_FLT ) ? MIN16B - : (short) tmp; + pcm = ( tmp > MAX16B_FLT ) ? MAX16B : ( tmp < MIN16B_FLT ) ? MIN16B : (short) tmp; dbgwrite( &pcm, sizeof( int16_t ), 1, 1, "dmx_dec.raw" ); } } @@ -1380,7 +1379,7 @@ void ivas_spar_dec_upmixer( } #else - if ( b_skip_mat[out_ch][in_ch] ) + if ( b_skip_mat[out_ch][in_ch] ) { continue; } @@ -1401,6 +1400,7 @@ void ivas_spar_dec_upmixer( out_re[out_ch] += cldfb_in_ts_re[in_ch][ts][cldfb_band] * cldfb_par; out_im[out_ch] += cldfb_in_ts_im[in_ch][ts][cldfb_band] * cldfb_par; + } #endif } -- GitLab From 0a9de2d3ca99e0d98fc8a12ad295a5e133f74996 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Wed, 10 May 2023 13:02:18 +0200 Subject: [PATCH 63/66] wrap changes into preprocessor macros more cleanly --- lib_dec/ivas_dirac_dec.c | 2 ++ lib_dec/ivas_sba_dec.c | 11 ++++++----- lib_dec/ivas_spar_decoder.c | 12 ++++++------ lib_dec/ivas_spar_md_dec.c | 35 +++++++++++++++++++++++++++++------ lib_dec/ivas_stat_dec.h | 1 + 5 files changed, 44 insertions(+), 17 deletions(-) diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index 8099640ea4..ea127443e4 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -2757,7 +2757,9 @@ void ivas_dirac_dec( { switch ( nchan_transport ) { +#ifdef HODIRAC case 11: +#endif case 8: case 6: case 4: diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c index 859d17defb..6e98c5e607 100755 --- a/lib_dec/ivas_sba_dec.c +++ b/lib_dec/ivas_sba_dec.c @@ -108,7 +108,6 @@ ivas_error ivas_sba_dec_reconfigure( AUDIO_CONFIG intern_config_old; int16_t numCldfbAnalyses_old, numCldfbSyntheses_old; int16_t sba_dirac_stereo_flag_old; - int32_t ivas_total_brate; #ifdef HODIRAC int32_t last_ivas_total_brate; @@ -117,7 +116,6 @@ ivas_error ivas_sba_dec_reconfigure( RENDERER_TYPE old_renderer_type; DECODER_CONFIG_HANDLE hDecoderConfig; ivas_error error; - error = IVAS_ERR_OK; hDecoderConfig = st_ivas->hDecoderConfig; @@ -159,10 +157,12 @@ ivas_error ivas_sba_dec_reconfigure( if ( nchan_transport_old != ivas_get_sba_num_TCs( ivas_total_brate, sba_order_internal ) #ifdef HODIRAC - || ( last_ivas_total_brate >= IVAS_512k && ivas_total_brate < IVAS_512k ) || ( last_ivas_total_brate < IVAS_512k && ivas_total_brate >= IVAS_512k ) + || ( last_ivas_total_brate >= IVAS_512k && ivas_total_brate < IVAS_512k ) + || ( last_ivas_total_brate < IVAS_512k && ivas_total_brate >= IVAS_512k ) #endif ) { + ivas_spar_dec_close( &( st_ivas->hSpar ), hDecoderConfig->output_Fs, 1 ); if ( ( error = ivas_spar_dec_open( st_ivas, 1 ) ) != IVAS_ERR_OK ) @@ -249,7 +249,8 @@ ivas_error ivas_sba_dec_reconfigure( if ( ( ( st_ivas->renderer_type != RENDERER_DISABLE ) && ( st_ivas->renderer_type != RENDERER_SBA_LINEAR_DEC ) ) || ( ( hDecoderConfig->output_config != AUDIO_CONFIG_FOA ) && ( st_ivas->hDecoderConfig->output_config != AUDIO_CONFIG_STEREO ) && ( st_ivas->hDecoderConfig->output_config != AUDIO_CONFIG_MONO ) ) #ifdef HODIRAC - || ( last_ivas_total_brate > IVAS_256k && ivas_total_brate <= IVAS_256k ) || ( last_ivas_total_brate <= IVAS_256k && ivas_total_brate > IVAS_256k ) + || ( last_ivas_total_brate > IVAS_256k && ivas_total_brate <= IVAS_256k ) + || ( last_ivas_total_brate <= IVAS_256k && ivas_total_brate > IVAS_256k ) #endif ) { @@ -276,7 +277,7 @@ ivas_error ivas_sba_dec_reconfigure( st_ivas->sba_analysis_order, st_ivas->sba_mode, #ifdef HODIRAC - st_ivas->sba_analysis_order > 1 && st_ivas->hDecoderConfig->ivas_total_brate > IVAS_256k ? IVAS_MAX_NUM_BANDS : ( IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ) + ( st_ivas->sba_analysis_order > 1 && st_ivas->hDecoderConfig->ivas_total_brate > IVAS_256k ) ? IVAS_MAX_NUM_BANDS : ( IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ) #else IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND #endif diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c index fce4e91dc4..6f917a6f41 100644 --- a/lib_dec/ivas_spar_decoder.c +++ b/lib_dec/ivas_spar_decoder.c @@ -285,7 +285,7 @@ ivas_error ivas_spar_dec( bit_stream_orig = st0->bit_stream; next_bit_pos_orig = st0->next_bit_pos; - last_bit_pos = ( int16_t )( ( hDecoderConfig->ivas_total_brate / FRAMES_PER_SEC ) - 1 ); + last_bit_pos = (int16_t) ( ( hDecoderConfig->ivas_total_brate / FRAMES_PER_SEC ) - 1 ); if ( !st0->bfi && hDecoderConfig->ivas_total_brate == IVAS_SID_5k2 ) { last_bit_pos -= SID_FORMAT_NBITS; @@ -313,7 +313,7 @@ ivas_error ivas_spar_dec( { int16_t zero_pad_bits; *nb_bits_read += SID_FORMAT_NBITS; - zero_pad_bits = ( int16_t )( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - *nb_bits_read; + zero_pad_bits = (int16_t) ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - *nb_bits_read; assert( zero_pad_bits <= 1 ); *nb_bits_read += zero_pad_bits; } @@ -494,7 +494,7 @@ void ivas_spar_get_cldfb_gains( weights = hSpar->hFbMixer->cldfb_cross_fade; cf_cldfb_start = (int16_t) ceil( ( cf_start - decfb_delay / 2 ) / (float) stride - 0.5f ); - cf_cldfb_end = ( int16_t )( ( cf_start - decfb_delay / 2 + cf_len ) / (float) stride - 0.5f ); + cf_cldfb_end = (int16_t) ( ( cf_start - decfb_delay / 2 + cf_len ) / (float) stride - 0.5f ); num_cf_slots = cf_cldfb_end - cf_cldfb_start + 1; num_samples = num_cf_slots * stride + pt_len - stride; @@ -812,7 +812,7 @@ static float ivas_spar_get_cldfb_slot_gain( encfb_delay = IVAS_FB_ENC_DELAY_NS; decfb_delay = IVAS_FB_DEC_DELAY_NS; xfade_start_ns = hSpar->hFbMixer->cross_fade_start_offset / output_Fs * 1000000000.f - encfb_delay + decfb_delay * 0.5f; - xfade_delay_subframes = ( int16_t )( xfade_start_ns / ( FRAME_SIZE_NS / MAX_PARAM_SPATIAL_SUBFRAMES ) ); + xfade_delay_subframes = (int16_t) ( xfade_start_ns / ( FRAME_SIZE_NS / MAX_PARAM_SPATIAL_SUBFRAMES ) ); i_hist = 4 - xfade_delay_subframes; split_band = SPAR_DIRAC_SPLIT_START_BAND; @@ -877,7 +877,6 @@ void ivas_spar_get_parameters( { if ( hSpar->i_subframe > 3 ) { - par_mat[out_ch][in_ch][spar_band] = ( 1.0f - weight ) * hSpar->hMdDec->mixer_mat_prev[ts0][out_ch][in_ch][spar_band] + weight * hSpar->hMdDec->mixer_mat_prev[ts1][out_ch][in_ch][spar_band]; } @@ -1130,7 +1129,8 @@ void ivas_spar_dec_upmixer( for ( i = 0; i < nchan_transport; i++ ) { tmp = roundf( output[i][j] * PCM16_TO_FLT_FAC ); - pcm = ( tmp > MAX16B_FLT ) ? MAX16B : ( tmp < MIN16B_FLT ) ? MIN16B : (short) tmp; + pcm = ( tmp > MAX16B_FLT ) ? MAX16B : ( tmp < MIN16B_FLT ) ? MIN16B + : (short) tmp; dbgwrite( &pcm, sizeof( int16_t ), 1, 1, "dmx_dec.raw" ); } } diff --git a/lib_dec/ivas_spar_md_dec.c b/lib_dec/ivas_spar_md_dec.c index a4e24dea06..fa4c9d4a1a 100644 --- a/lib_dec/ivas_spar_md_dec.c +++ b/lib_dec/ivas_spar_md_dec.c @@ -130,7 +130,11 @@ static ivas_error ivas_spar_md_dec_matrix_open( num_md_sub_frames = MAX_PARAM_SPATIAL_SUBFRAMES; #endif +#ifdef SPAR_TUNING if ( ( hMdDec->spar_md.band_coeffs = (ivas_band_coeffs_t *) malloc( IVAS_MAX_NUM_BANDS * num_md_sub_frames * sizeof( ivas_band_coeffs_t ) ) ) == NULL ) +#else + if ( ( hMdDec->spar_md.band_coeffs = (ivas_band_coeffs_t *) malloc( IVAS_MAX_NUM_BANDS * MAX_PARAM_SPATIAL_SUBFRAMES * sizeof( ivas_band_coeffs_t ) ) ) == NULL ) +#endif { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for band_coeffs in SPAR MD" ); } @@ -146,8 +150,12 @@ static ivas_error ivas_spar_md_dec_matrix_open( } for ( j = 0; j < num_channels; j++ ) { +#ifdef SPAR_TUNING if ( ( hMdDec->mixer_mat[i][j] = (float *) malloc( num_md_sub_frames * IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL ) - { +#else + if ( ( hMdDec->mixer_mat[i][j] = (float *) malloc( MAX_PARAM_SPATIAL_SUBFRAMES * IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL ) +#endif + { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); } } @@ -165,7 +173,11 @@ static ivas_error ivas_spar_md_dec_matrix_open( } for ( j = 0; j < num_channels; j++ ) { +#ifdef SPAR_TUNING if ( ( hMdDec->spar_coeffs.C_re[i][j] = (float *) malloc( num_md_sub_frames * IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL ) +#else + if ( ( hMdDec->spar_coeffs.C_re[i][j] = (float *) malloc( MAX_PARAM_SPATIAL_SUBFRAMES * IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL ) +#endif { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); } @@ -184,7 +196,11 @@ static ivas_error ivas_spar_md_dec_matrix_open( } for ( j = 0; j < num_channels; j++ ) { +#ifdef SPAR_TUNING if ( ( hMdDec->spar_coeffs.P_re[i][j] = (float *) malloc( num_md_sub_frames * IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL ) +#else + if ( ( hMdDec->spar_coeffs.P_re[i][j] = (float *) malloc( MAX_PARAM_SPATIAL_SUBFRAMES * IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL ) +#endif { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); } @@ -276,7 +292,6 @@ int16_t ivas_get_spar_dec_md_num_subframes( const int32_t ivas_total_brate ) { int16_t num_subframes; - num_subframes = MAX_PARAM_SPATIAL_SUBFRAMES; if ( sba_order > SBA_FOA_ORDER ) { @@ -288,6 +303,7 @@ int16_t ivas_get_spar_dec_md_num_subframes( return ( num_subframes ); } #endif + /*------------------------------------------------------------------------- * ivas_spar_md_dec_open() * @@ -499,6 +515,7 @@ ivas_error ivas_spar_md_dec_init( int16_t i, j, k; int16_t nchan_transport; float pFC[IVAS_MAX_NUM_BANDS], PR_minmax[2]; + #ifdef SPAR_TUNING ivas_sba_get_spar_hoa_md_flag( sba_order, hDecoderConfig->ivas_total_brate, &hMdDec->spar_hoa_md_flag, &hMdDec->spar_hoa_dirac2spar_md_flag ); #else @@ -875,8 +892,6 @@ void ivas_spar_md_dec_process( /* SPAR to DirAC conversion */ #ifdef SPAR_TUNING if ( hMdDec->spar_hoa_dirac2spar_md_flag == 1 ) -#else - if ( hMdDec->spar_hoa_md_flag == 0 ) #endif { ivas_spar_to_dirac( st_ivas, hMdDec, dtx_vad, num_bands_out, bw ); @@ -1012,7 +1027,11 @@ void ivas_spar_md_dec_process( }*/ #endif /* expand DirAC MD to all time slots */ +#ifdef SPAR_TUNING for ( i_ts = 1; i_ts < num_md_sub_frames; i_ts++ ) +#else + for ( i_ts = 1; i_ts < MAX_PARAM_SPATIAL_SUBFRAMES; i_ts++ ) +#endif { for ( b = 0; b < hMdDec->spar_md.num_bands; b++ ) { @@ -1036,7 +1055,11 @@ void ivas_spar_md_dec_process( } } +#ifdef SPAR_TUNING ivas_get_spar_matrices( hMdDec, num_bands_out, num_md_sub_frames, bw, dtx_vad, nB, +#else + ivas_get_spar_matrices( hMdDec, num_bands_out, MAX_PARAM_SPATIAL_SUBFRAMES, bw, dtx_vad, nB, +#endif #ifdef SPAR_TUNING num_md_chs, #else @@ -1334,6 +1357,7 @@ static void ivas_get_spar_matrices( int16_t i, j, k, m, b, i_ts, active_w; const int16_t *order; float active_w_dm_fac, re; + #ifndef SPAR_TUNING numch_out = ivas_sba_get_nchan_metadata( sba_order ); #endif @@ -2159,7 +2183,6 @@ static void ivas_decode_arith_bs( { ndm = hMdDec->spar_md_cfg.num_dmx_chans_per_band[bands_bw * i]; ndec = hMdDec->spar_md_cfg.num_decorr_per_band[bands_bw * i]; - if ( ( ivas_total_brate < IVAS_24k4 ) && ( strat > 3 ) && ( ( ( i % 2 == 1 ) && ( strat % 2 == 0 ) ) || ( ( i % 2 == 0 ) && ( strat % 2 == 1 ) ) ) ) { pred_cell_dims[i].dim1 = 0; @@ -2594,6 +2617,7 @@ static void ivas_spar_md_fill_invalid_bands( float w = 0; #ifndef SPAR_TUNING int16_t num_channels; + num_channels = ivas_sba_get_nchan_metadata( sba_order ); #endif set_s( valid_band_idx, 0, IVAS_MAX_NUM_BANDS ); @@ -3259,7 +3283,6 @@ void ivas_spar_to_dirac( } } } - /* expand DirAC TC 20ms MD for residual channels to all subframes*/ for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ ) { diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index fbea4a0968..4174b2772b 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -869,6 +869,7 @@ typedef struct ivas_spar_dec_lib_t int16_t numOutChannels; int16_t pca_ingest_channels; #endif + } SPAR_DEC_DATA, *SPAR_DEC_HANDLE; -- GitLab From 90b3ee43659eca11b5f8e0a2cc29bcbd7d29bf04 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Wed, 10 May 2023 13:53:08 +0200 Subject: [PATCH 64/66] restrict DTX fix to HO-DirAC --- lib_com/ivas_dirac_com.c | 29 +++++++++++++++++++++++------ lib_com/ivas_qmetadata_com.c | 10 ---------- 2 files changed, 23 insertions(+), 16 deletions(-) diff --git a/lib_com/ivas_dirac_com.c b/lib_com/ivas_dirac_com.c index a61a92d4a5..436234a6d7 100644 --- a/lib_com/ivas_dirac_com.c +++ b/lib_com/ivas_dirac_com.c @@ -197,12 +197,12 @@ ivas_error ivas_dirac_config( { ivas_dirac_config_bands( band_grouping, IVAS_MAX_NUM_BANDS, - (int16_t) ( Fs * INV_CLDFB_BANDWIDTH + 0.5f ), + ( int16_t )( Fs * INV_CLDFB_BANDWIDTH + 0.5f ), dirac_to_spar_md_bands, hQMetaData->useLowerBandRes, hConfig->enc_param_start_band, hFbMdft ); } else { - ivas_dirac_config_bands( band_grouping, hConfig->nbands, (int16_t) ( Fs * INV_CLDFB_BANDWIDTH + 0.5f ), + ivas_dirac_config_bands( band_grouping, hConfig->nbands, ( int16_t )( Fs * INV_CLDFB_BANDWIDTH + 0.5f ), NULL, 0, 0, hFbMdft ); } @@ -367,7 +367,7 @@ ivas_error ivas_dirac_sba_config( } nbands_coded = nbands; - if ( sba_total_brate <= (int32_t) ( (float) IVAS_192k / (float) SPAR_DIRAC_SPLIT_START_BAND ) ) + if ( sba_total_brate <= ( int32_t )( (float) IVAS_192k / (float) SPAR_DIRAC_SPLIT_START_BAND ) ) { hQMetaData->useLowerBandRes = 1; nbands_coded = nbands / 2 + nbands % 2; @@ -396,6 +396,23 @@ ivas_error ivas_dirac_sba_config( { return error; } +#ifdef HODIRAC_FIX_BR_SWITCHING_DTX + if ( sba_order > 1 && sba_total_brate > IVAS_256k ) + { + int16_t dir, i, 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 ) @@ -445,7 +462,7 @@ ivas_error ivas_dirac_sba_config( } else { - hQMetaData->bits_frame_nominal = (int16_t) ( sba_total_brate / FRAMES_PER_SEC ); + hQMetaData->bits_frame_nominal = ( int16_t )( sba_total_brate / FRAMES_PER_SEC ); hQMetaData->metadata_max_bits = MAX16B; /* no limit */ } @@ -522,7 +539,7 @@ ivas_error ivas_dirac_sba_config( *nCPE = ( ( *nchan_transport + 1 ) / 2 ); *nSCE = 0; - hQMetaData->bits_frame_nominal = (int16_t) ( sba_total_brate / FRAMES_PER_SEC ); + hQMetaData->bits_frame_nominal = ( int16_t )( sba_total_brate / FRAMES_PER_SEC ); hQMetaData->metadata_max_bits = MAX16B; /* no limit */ for ( i = 0; i < hQMetaData->no_directions; i++ ) @@ -569,7 +586,7 @@ ivas_error ivas_dirac_sba_config( } else { - hQMetaData->bits_frame_nominal = (int16_t) ( sba_total_brate / FRAMES_PER_SEC ); + hQMetaData->bits_frame_nominal = ( int16_t )( sba_total_brate / FRAMES_PER_SEC ); hQMetaData->metadata_max_bits = 250; } diff --git a/lib_com/ivas_qmetadata_com.c b/lib_com/ivas_qmetadata_com.c index f8463eb3af..4bd135ec98 100644 --- a/lib_com/ivas_qmetadata_com.c +++ b/lib_com/ivas_qmetadata_com.c @@ -99,9 +99,6 @@ ivas_error ivas_qmetadata_allocate_memory( ) { int16_t j, dir; -#ifdef HODIRAC_FIX_BR_SWITCHING_DTX - int16_t i; -#endif uint8_t do_realloc; #ifdef DEBUGGING @@ -152,13 +149,6 @@ ivas_error ivas_qmetadata_allocate_memory( { set_zero( hQMetaData->q_direction[dir].band_data[j].elevation, MAX_PARAM_SPATIAL_SUBFRAMES ); set_zero( hQMetaData->q_direction[dir].band_data[j].azimuth, MAX_PARAM_SPATIAL_SUBFRAMES ); -#ifdef HODIRAC_FIX_BR_SWITCHING_DTX - 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 } } -- GitLab From c37cfb71fb8993490db436da0c7beee00ae2baea Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Thu, 11 May 2023 08:02:00 +0200 Subject: [PATCH 65/66] fix compile warning --- lib_com/ivas_dirac_com.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/ivas_dirac_com.c b/lib_com/ivas_dirac_com.c index 436234a6d7..204d6157a2 100644 --- a/lib_com/ivas_dirac_com.c +++ b/lib_com/ivas_dirac_com.c @@ -399,7 +399,7 @@ ivas_error ivas_dirac_sba_config( #ifdef HODIRAC_FIX_BR_SWITCHING_DTX if ( sba_order > 1 && sba_total_brate > IVAS_256k ) { - int16_t dir, i, j; + int16_t dir, j; for ( dir = 0; dir < hQMetaData->no_directions; dir++ ) { for ( j = 0; j < nbands_coded; j++ ) -- GitLab From 1c6a370fd419cee225ce3923446bfff08787351d Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Thu, 11 May 2023 08:20:03 +0200 Subject: [PATCH 66/66] fix code formatting --- lib_com/ivas_dirac_com.c | 12 ++++++------ lib_dec/ivas_sba_dec.c | 6 ++---- lib_dec/ivas_spar_md_dec.c | 2 +- 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/lib_com/ivas_dirac_com.c b/lib_com/ivas_dirac_com.c index 204d6157a2..d17732b66c 100644 --- a/lib_com/ivas_dirac_com.c +++ b/lib_com/ivas_dirac_com.c @@ -197,12 +197,12 @@ ivas_error ivas_dirac_config( { ivas_dirac_config_bands( band_grouping, IVAS_MAX_NUM_BANDS, - ( int16_t )( Fs * INV_CLDFB_BANDWIDTH + 0.5f ), + (int16_t) ( Fs * INV_CLDFB_BANDWIDTH + 0.5f ), dirac_to_spar_md_bands, hQMetaData->useLowerBandRes, hConfig->enc_param_start_band, hFbMdft ); } else { - ivas_dirac_config_bands( band_grouping, hConfig->nbands, ( int16_t )( Fs * INV_CLDFB_BANDWIDTH + 0.5f ), + ivas_dirac_config_bands( band_grouping, hConfig->nbands, (int16_t) ( Fs * INV_CLDFB_BANDWIDTH + 0.5f ), NULL, 0, 0, hFbMdft ); } @@ -367,7 +367,7 @@ ivas_error ivas_dirac_sba_config( } nbands_coded = nbands; - if ( sba_total_brate <= ( int32_t )( (float) IVAS_192k / (float) SPAR_DIRAC_SPLIT_START_BAND ) ) + if ( sba_total_brate <= (int32_t) ( (float) IVAS_192k / (float) SPAR_DIRAC_SPLIT_START_BAND ) ) { hQMetaData->useLowerBandRes = 1; nbands_coded = nbands / 2 + nbands % 2; @@ -462,7 +462,7 @@ ivas_error ivas_dirac_sba_config( } else { - hQMetaData->bits_frame_nominal = ( int16_t )( sba_total_brate / FRAMES_PER_SEC ); + hQMetaData->bits_frame_nominal = (int16_t) ( sba_total_brate / FRAMES_PER_SEC ); hQMetaData->metadata_max_bits = MAX16B; /* no limit */ } @@ -539,7 +539,7 @@ ivas_error ivas_dirac_sba_config( *nCPE = ( ( *nchan_transport + 1 ) / 2 ); *nSCE = 0; - hQMetaData->bits_frame_nominal = ( int16_t )( sba_total_brate / FRAMES_PER_SEC ); + hQMetaData->bits_frame_nominal = (int16_t) ( sba_total_brate / FRAMES_PER_SEC ); hQMetaData->metadata_max_bits = MAX16B; /* no limit */ for ( i = 0; i < hQMetaData->no_directions; i++ ) @@ -586,7 +586,7 @@ ivas_error ivas_dirac_sba_config( } else { - hQMetaData->bits_frame_nominal = ( int16_t )( sba_total_brate / FRAMES_PER_SEC ); + hQMetaData->bits_frame_nominal = (int16_t) ( sba_total_brate / FRAMES_PER_SEC ); hQMetaData->metadata_max_bits = 250; } diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c index 6e98c5e607..0b5cce1ca5 100755 --- a/lib_dec/ivas_sba_dec.c +++ b/lib_dec/ivas_sba_dec.c @@ -157,8 +157,7 @@ ivas_error ivas_sba_dec_reconfigure( if ( nchan_transport_old != ivas_get_sba_num_TCs( ivas_total_brate, sba_order_internal ) #ifdef HODIRAC - || ( last_ivas_total_brate >= IVAS_512k && ivas_total_brate < IVAS_512k ) - || ( last_ivas_total_brate < IVAS_512k && ivas_total_brate >= IVAS_512k ) + || ( last_ivas_total_brate >= IVAS_512k && ivas_total_brate < IVAS_512k ) || ( last_ivas_total_brate < IVAS_512k && ivas_total_brate >= IVAS_512k ) #endif ) { @@ -249,8 +248,7 @@ ivas_error ivas_sba_dec_reconfigure( if ( ( ( st_ivas->renderer_type != RENDERER_DISABLE ) && ( st_ivas->renderer_type != RENDERER_SBA_LINEAR_DEC ) ) || ( ( hDecoderConfig->output_config != AUDIO_CONFIG_FOA ) && ( st_ivas->hDecoderConfig->output_config != AUDIO_CONFIG_STEREO ) && ( st_ivas->hDecoderConfig->output_config != AUDIO_CONFIG_MONO ) ) #ifdef HODIRAC - || ( last_ivas_total_brate > IVAS_256k && ivas_total_brate <= IVAS_256k ) - || ( last_ivas_total_brate <= IVAS_256k && ivas_total_brate > IVAS_256k ) + || ( last_ivas_total_brate > IVAS_256k && ivas_total_brate <= IVAS_256k ) || ( last_ivas_total_brate <= IVAS_256k && ivas_total_brate > IVAS_256k ) #endif ) { diff --git a/lib_dec/ivas_spar_md_dec.c b/lib_dec/ivas_spar_md_dec.c index fa4c9d4a1a..9475c2f026 100644 --- a/lib_dec/ivas_spar_md_dec.c +++ b/lib_dec/ivas_spar_md_dec.c @@ -155,7 +155,7 @@ static ivas_error ivas_spar_md_dec_matrix_open( #else if ( ( hMdDec->mixer_mat[i][j] = (float *) malloc( MAX_PARAM_SPATIAL_SUBFRAMES * IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL ) #endif - { + { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); } } -- GitLab