Loading apps/renderer.c +3 −3 Original line number Diff line number Diff line Loading @@ -1787,7 +1787,7 @@ IsmPositionProvider *IsmPositionProvider_open( IsmPositionProvider *ipp; uint16_t i; ipp = (IsmPositionProvider *) malloc_( sizeof( IsmPositionProvider ) ); ipp = (IsmPositionProvider *) malloc( sizeof( IsmPositionProvider ) ); ipp->frameCounter = 0; ipp->numObjects = 0; Loading Loading @@ -2182,8 +2182,8 @@ static void parseIsm( if ( parseUint32( line, &numberOfObjectPositionsToRead ) == 0 ) { positionProvider->numPositions[idx] = numberOfObjectPositionsToRead; positionProvider->positions[idx] = malloc_( numberOfObjectPositionsToRead * sizeof( IVAS_REND_AudioObjectPosition ) ); positionProvider->positionDurations[idx] = malloc_( numberOfObjectPositionsToRead * sizeof( uint16_t ) ); positionProvider->positions[idx] = malloc( numberOfObjectPositionsToRead * sizeof( IVAS_REND_AudioObjectPosition ) ); positionProvider->positionDurations[idx] = malloc( numberOfObjectPositionsToRead * sizeof( uint16_t ) ); for ( i = 0; i < numberOfObjectPositionsToRead; ++i ) { Loading ci/smoke_test.sh +1 −1 Original line number Diff line number Diff line Loading @@ -63,7 +63,7 @@ if [ $BUILD -eq 1 ];then make clean # Replace free -> free_, malloc -> malloc_, calloc -> calloc_ ./scripts/prepare_mem_dryrun.py python3 ./scripts/prepare_mem_dryrun.py # Enable WMOPS and disable DEBUGGING sed -i.bak -e "s/\/\*\s*\(#define\s*WMOPS\)\s*\*\//\1/g" lib_com/options.h Loading lib_com/ivas_cnst.h 100644 → 100755 +31 −0 Original line number Diff line number Diff line Loading @@ -174,6 +174,10 @@ typedef enum #define BINAURAL_CHANNELS 2 /* number of channels for binaural output configuration */ #define CPE_CHANNELS 2 /* number of CPE (stereo) channels */ #define FOA_CHANNELS 4 /* number of FOA channels */ #ifdef HODIRAC #define HOA2_CHANNELS 9 #endif #define MAX_NUM_OBJECTS 4 /* max. number of audio objects */ #define MAX_SCE MAX_NUM_OBJECTS /* max. number of SCEs */ Loading Loading @@ -837,6 +841,10 @@ enum fea_names #define SNS_MSVQ_NSTAGES_TCX10 3 #define SNS_MSVQ_NSTAGES_SIDE 2 #endif #ifdef FIX_445_SNS_BUGFIXES #define SNS_CDBKS_BITS_4_FRAC 12 #define SNS_MEANS_BITS_4_FRAC 14 #endif #define MDCT_ST_PLC_FADEOUT_MIN_NOISE_NRG 0.001f #define MDCT_ST_PLC_FADEOUT_MAX_CONC_FRAME 2 * FRAMES_PER_SEC Loading Loading @@ -901,7 +909,11 @@ typedef enum * DirAC Constants *----------------------------------------------------------------------------------*/ #ifdef HODIRAC #define DIRAC_MAX_ANA_CHANS 11 /* Maximum number of channels for DirAC analysis */ #else #define DIRAC_MAX_ANA_CHANS FOA_CHANNELS /* Maximum number of channels for DirAC analysis */ #endif #define DIRAC_NUM_DIMS 3 /* number of directions to estimate (X,Y,Z) */ #define DIRAC_MAX_NBANDS 12 /* Maximum number of frequency bands for the DirAC Side Parameter decoding */ Loading @@ -915,6 +927,11 @@ typedef enum #define DIRAC_NO_FB_BANDS_MAX MDFT_FB_BANDS_240 #define DELAY_DIRAC_ENC_CMP_NS_PARAM_ISM ( IVAS_ENC_DELAY_NS + IVAS_DEC_DELAY_NS ) /* == 12 ms */ #ifdef HODIRAC #define DIRAC_HO_NUMSECTORS 2 #define NUM_ANA_SECTORS 2 #endif /* DirAC renderer setup */ typedef enum Loading Loading @@ -973,7 +990,17 @@ typedef enum #define SPAR_CONFIG_BW FB #ifndef SPAR_TUNING #define IVAS_SPAR_MAX_CH (FOA_CHANNELS + 2 * ( IVAS_MAX_SBA_ORDER - 1 )) /* FOA + planar HOA */ #else #define IVAS_SPAR_MAX_CH ((( IVAS_MAX_SBA_ORDER ) * ( IVAS_MAX_SBA_ORDER )) + 2) /* HOA2 + pHOA3*/ #define IVAS_HBR_MAX_DECOR_CHS (2) #endif #ifdef HODIRAC #define IVAS_SPAR_MAX_FB_IN_CHAN 11 #endif #define IVAS_SPAR_P_LOWERTRI ((IVAS_SPAR_MAX_CH - 1) * (IVAS_SPAR_MAX_CH - 2)) >> 1 #define IVAS_SPAR_MAX_C_COEFF (IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS) * ( IVAS_SPAR_MAX_DMX_CHS - 1) Loading Loading @@ -1182,7 +1209,11 @@ enum #define MASA_ANGLE_TOLERANCE 0.5f #define MASA_LIMIT_NO_BANDS_SUR_COH 8 #define MINIMUM_BIT_BUDGET_NORMAL_META 100 #ifdef HODIRAC #define DIFF_DFRATIO_2BIT_LIMIT_IDX_HODIRAC 4 #endif #define DIFF_DFRATIO_2BIT_LIMIT_IDX 3 #define DIFF_DFRATIO_1BIT_LIMIT_IDX 6 #define DIFF_EC_HUFF_BAND_LIMIT 8 #define DIFF_EC_HUFF_GR0_LIMIT 8 Loading lib_com/ivas_cov_smooth.c +15 −2 Original line number Diff line number Diff line Loading @@ -50,8 +50,11 @@ static void ivas_set_up_cov_smoothing( ivas_cov_smooth_state_t *hCovState, ivas_filterbank_t *pFb, const float max_update_rate, const int16_t min_pool_size, const int16_t min_pool_size #ifndef FIX_331_ALL_BRS , const int16_t nchan_inp /* i : number of input channels */ #endif , const int32_t ivas_total_brate ) { Loading Loading @@ -90,7 +93,9 @@ static void ivas_set_up_cov_smoothing( } } } else if ( nchan_inp <= FOA_CHANNELS ) else #ifndef FIX_331_ALL_BRS if ( nchan_inp <= FOA_CHANNELS ) { for ( j = 0; j < pFb->filterbank_num_bands; j++ ) { Loading @@ -112,6 +117,7 @@ static void ivas_set_up_cov_smoothing( } else { #endif for ( j = 0; j < pFb->filterbank_num_bands; j++ ) { float update_factor; Loading @@ -131,7 +137,9 @@ static void ivas_set_up_cov_smoothing( hCovState->pSmoothing_factor[j] = max_update_rate; } } #ifndef FIX_331_ALL_BRS } #endif hCovState->prior_bank_idx = -1; return; Loading Loading @@ -178,7 +186,12 @@ ivas_error ivas_spar_covar_smooth_enc_open( } } #ifndef FIX_331_ALL_BRS ivas_set_up_cov_smoothing( hCovState, pFb, cov_smooth_cfg->max_update_rate, cov_smooth_cfg->min_pool_size, nchan_inp, ivas_total_brate ); #else ivas_set_up_cov_smoothing( hCovState, pFb, cov_smooth_cfg->max_update_rate, cov_smooth_cfg->min_pool_size, ivas_total_brate ); #endif *hCovState_out = hCovState; Loading lib_com/ivas_dirac_com.c +292 −8 Original line number Diff line number Diff line Loading @@ -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 ) Loading Loading @@ -128,7 +130,14 @@ ivas_error ivas_dirac_config( if ( sba_mode == SBA_MODE_SPAR ) { hConfig->nbands = IVAS_MAX_NUM_BANDS; spar_dirac_split_band = min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND ); #ifdef HODIRAC if ( sba_order > 1 && ivas_total_brate > IVAS_256k ) { spar_dirac_split_band = 0; } #endif } else { Loading Loading @@ -164,6 +173,16 @@ ivas_error ivas_dirac_config( { hConfig->enc_param_start_band = spar_dirac_split_band; } #ifdef HODIRAC if ( sba_order > 1 && ivas_total_brate > IVAS_256k ) { hConfig->dec_param_estim = FALSE; hConfig->enc_param_start_band = 0; set_c( (int8_t *) hQMetaData->twoDirBands, (int8_t) 1, hQMetaData->q_direction[0].cfg.nbands ); hQMetaData->numTwoDirBands = (uint8_t) hQMetaData->q_direction[0].cfg.nbands; } #endif } else { Loading @@ -176,7 +195,9 @@ ivas_error ivas_dirac_config( if ( sba_mode == SBA_MODE_SPAR ) { ivas_dirac_config_bands( band_grouping, IVAS_MAX_NUM_BANDS, (int16_t) ( Fs * INV_CLDFB_BANDWIDTH + 0.5f ), ivas_dirac_config_bands( band_grouping, IVAS_MAX_NUM_BANDS, (int16_t) ( Fs * INV_CLDFB_BANDWIDTH + 0.5f ), dirac_to_spar_md_bands, hQMetaData->useLowerBandRes, hConfig->enc_param_start_band, hFbMdft ); } else Loading Loading @@ -354,13 +375,45 @@ ivas_error ivas_dirac_sba_config( else { hQMetaData->useLowerBandRes = 0; #ifdef HODIRAC if ( !( sba_order > 1 && sba_total_brate > IVAS_256k ) ) #endif { nbands_coded = nbands - 1; /* always combine the last two bands */ } } if ( ( error = ivas_qmetadata_allocate_memory( hQMetaData, nbands_coded, 1, 0 ) ) != IVAS_ERR_OK ) { int16_t no_dirs = 1; #ifdef HODIRAC if ( sba_order > 1 && sba_total_brate > IVAS_256k ) { no_dirs = 2; } #endif if ( ( error = ivas_qmetadata_allocate_memory( hQMetaData, nbands_coded, no_dirs, 0 ) ) != IVAS_ERR_OK ) { return error; } #ifdef HODIRAC_FIX_BR_SWITCHING_DTX if ( sba_order > 1 && sba_total_brate > IVAS_256k ) { int16_t dir, j; for ( dir = 0; dir < hQMetaData->no_directions; dir++ ) { for ( j = 0; j < nbands_coded; j++ ) { for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) { hQMetaData->q_direction[dir].band_data[j].energy_ratio_index[i] = 0; hQMetaData->q_direction[dir].band_data[j].energy_ratio_index_mod[i] = 0; } } } } #endif } if ( sba_total_brate <= IVAS_13k2 ) { Loading Loading @@ -452,11 +505,19 @@ ivas_error ivas_dirac_sba_config( } if ( sba_total_brate >= IVAS_96k ) { if ( ( error = ivas_qmetadata_allocate_memory( hQMetaData, 6, 1, 0 ) ) != IVAS_ERR_OK ) { int16_t no_dirs = 1; #ifdef HODIRAC if ( sba_order > 1 && sba_total_brate > IVAS_256k ) { no_dirs = 2; } #endif if ( ( error = ivas_qmetadata_allocate_memory( hQMetaData, 6, no_dirs, 0 ) ) != IVAS_ERR_OK ) { return error; } } nbands_wb = 4; } else Loading Loading @@ -484,8 +545,17 @@ ivas_error ivas_dirac_sba_config( for ( i = 0; i < hQMetaData->no_directions; i++ ) { hQMetaData->q_direction[i].cfg.search_effort = 1; #ifdef HODIRAC if ( sba_order > 1 && sba_total_brate > IVAS_256k ) { hQMetaData->q_direction[i].cfg.start_band = 0; } else #endif { hQMetaData->q_direction[i].cfg.start_band = nbands_wb; } } *element_mode = IVAS_CPE_MDCT; } Loading Loading @@ -787,6 +857,220 @@ void deindex_spherical_component( return; } #ifdef HODIRAC void calculate_hodirac_sector_parameters( float RealBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* i: signal vector (L+1)^2 x N_bins, real part */ float ImagBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* i: signal vector, imaginary part*/ const int16_t N_bins, /* i: number of bins */ const float beta, /* i: forgetting factor for average filtering */ const int16_t *band_grouping, /* i: indices of band groups */ const int16_t N_bands, /* i: number of bands (groups) */ const int16_t enc_param_start_band, /* i: first band to process */ float *azi, /* o: array of sector azimuth angles, flat */ float *ele, /* o: array of sector elevation angles, flat */ float *diff, /* o: array of sector diffuseness values, flat*/ float *ene /* o: array of sector energy values, flat*/ ) { int16_t i_sec, i_bin, i_band; float p_real, p_imag, normI, energy, tmp_diff; float sec_I_vec_x[NUM_ANA_SECTORS]; float sec_I_vec_y[NUM_ANA_SECTORS]; float sec_I_vec_z[NUM_ANA_SECTORS]; static int16_t firstrun_sector_params = 1; static float sec_I_vec_smth_x[NUM_ANA_SECTORS][IVAS_MAX_NUM_BANDS]; static float sec_I_vec_smth_y[NUM_ANA_SECTORS][IVAS_MAX_NUM_BANDS]; static float sec_I_vec_smth_z[NUM_ANA_SECTORS][IVAS_MAX_NUM_BANDS]; static float energy_smth[NUM_ANA_SECTORS][IVAS_MAX_NUM_BANDS]; static float azi_prev[NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS]; static float ele_prev[NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS]; #ifdef DEBUGGING assert( N_bins <= DIRAC_NO_FB_BANDS_MAX ); #endif for ( i_sec = 0; i_sec < NUM_ANA_SECTORS; i_sec++ ) { float *p_sec_I_vec_x = &sec_I_vec_x[i_sec]; float *p_sec_I_vec_y = &sec_I_vec_y[i_sec]; float *p_sec_I_vec_z = &sec_I_vec_z[i_sec]; const float *p_c_weights = c_weights; float *p_ImagBuffer_0 = ImagBuffer[0]; float *p_ImagBuffer_1 = ImagBuffer[1]; float *p_ImagBuffer_2 = ImagBuffer[2]; float *p_ImagBuffer_3 = ImagBuffer[3]; float *p_ImagBuffer_4 = ImagBuffer[4]; float *p_ImagBuffer_5 = ImagBuffer[5]; float *p_ImagBuffer_6 = ImagBuffer[6]; float *p_ImagBuffer_8 = ImagBuffer[8]; float *p_RealBuffer_0 = RealBuffer[0]; float *p_RealBuffer_1 = RealBuffer[1]; float *p_RealBuffer_2 = RealBuffer[2]; float *p_RealBuffer_3 = RealBuffer[3]; float *p_RealBuffer_4 = RealBuffer[4]; float *p_RealBuffer_5 = RealBuffer[5]; float *p_RealBuffer_6 = RealBuffer[6]; float *p_RealBuffer_8 = RealBuffer[8]; for ( i_band = enc_param_start_band; i_band < N_bands; i_band++ ) { float *p_azi = &azi[i_sec * N_bands + i_band]; float *p_ele = &ele[i_sec * N_bands + i_band]; float *p_ene = &ene[i_sec * N_bands + i_band]; float *p_diff = &diff[i_sec * N_bands + i_band]; float *p_azi_prev = &azi_prev[i_sec * N_bands + i_band]; float *p_ele_prev = &ele_prev[i_sec * N_bands + i_band]; float *p_energy_smth = &energy_smth[i_sec][i_band]; float *p_sec_I_vec_smth_x = &sec_I_vec_smth_x[i_sec][i_band]; float *p_sec_I_vec_smth_y = &sec_I_vec_smth_y[i_sec][i_band]; float *p_sec_I_vec_smth_z = &sec_I_vec_smth_z[i_sec][i_band]; *p_sec_I_vec_x = 0.f; *p_sec_I_vec_y = 0.f; *p_sec_I_vec_z = 0.f; energy = 0.f; if ( i_sec == 0 ) { for ( i_bin = band_grouping[i_band]; i_bin < band_grouping[i_band + 1]; i_bin++ ) { float w = *( p_c_weights++ ); float sec_w_imag, sec_x_imag, sec_y_imag, sec_z_imag; float sec_w_real, sec_x_real, sec_y_real, sec_z_real; sec_w_imag = 1.772454f * *( p_ImagBuffer_0 ) + 1.772454f * *( p_ImagBuffer_1 ); sec_x_imag = 1.772454f * *( p_ImagBuffer_3++ ) + 1.023326f * *( p_ImagBuffer_4++ ); sec_y_imag = 0.590818f * *( p_ImagBuffer_0++ ) + 1.772454f * *( p_ImagBuffer_1++ ) - 0.590817f * *( p_ImagBuffer_6++ ) - 1.023326f * *( p_ImagBuffer_8++ ); sec_z_imag = 1.772454f * *( p_ImagBuffer_2++ ) + 1.023326f * *( p_ImagBuffer_5++ ); sec_w_real = 1.772454f * *( p_RealBuffer_0 ) + 1.772454f * *( p_RealBuffer_1 ); sec_x_real = 1.772454f * *( p_RealBuffer_3++ ) + 1.023326f * *( p_RealBuffer_4++ ); sec_y_real = 0.590818f * *( p_RealBuffer_0++ ) + 1.772454f * *( p_RealBuffer_1++ ) - 0.590817f * *( p_RealBuffer_6++ ) - 1.023326f * *( p_RealBuffer_8++ ); sec_z_real = 1.772454f * *( p_RealBuffer_2++ ) + 1.023326f * *( p_RealBuffer_5++ ); p_real = sec_w_real * w; p_imag = sec_w_imag * w; *p_sec_I_vec_x += p_real * sec_x_real + p_imag * sec_x_imag; *p_sec_I_vec_y += p_real * sec_y_real + p_imag * sec_y_imag; *p_sec_I_vec_z += p_real * sec_z_real + p_imag * sec_z_imag; energy += 0.5f * ( p_real * p_real + p_imag * p_imag + sec_x_real * sec_x_real + sec_x_imag * sec_x_imag + sec_y_real * sec_y_real + sec_y_imag * sec_y_imag + sec_z_real * sec_z_real + sec_z_imag * sec_z_imag ); } } else { for ( i_bin = band_grouping[i_band]; i_bin < band_grouping[i_band + 1]; i_bin++ ) { float w = *( p_c_weights++ ); float sec_w_imag, sec_x_imag, sec_y_imag, sec_z_imag; float sec_w_real, sec_x_real, sec_y_real, sec_z_real; sec_w_imag = 1.772454f * *(p_ImagBuffer_0) -1.772454f * *( p_ImagBuffer_1 ); sec_x_imag = 1.772454f * *( p_ImagBuffer_3++ ) - 1.023326f * *( p_ImagBuffer_4++ ); sec_y_imag = -0.590818f * *( p_ImagBuffer_0++ ) + 1.772454f * *( p_ImagBuffer_1++ ) + 0.590817f * *( p_ImagBuffer_6++ ) + 1.023326f * *( p_ImagBuffer_8++ ); sec_z_imag = 1.772454f * *( p_ImagBuffer_2++ ) - 1.023326f * *( p_ImagBuffer_5++ ); sec_w_real = 1.772454f * *(p_RealBuffer_0) -1.772454f * *( p_RealBuffer_1 ); sec_x_real = 1.772454f * *( p_RealBuffer_3++ ) - 1.023326f * *( p_RealBuffer_4++ ); sec_y_real = -0.590818f * *( p_RealBuffer_0++ ) + 1.772454f * *( p_RealBuffer_1++ ) + 0.590817f * *( p_RealBuffer_6++ ) + 1.023326f * *( p_RealBuffer_8++ ); sec_z_real = 1.772454f * *( p_RealBuffer_2++ ) - 1.023326f * *( p_RealBuffer_5++ ); p_real = sec_w_real * w; p_imag = sec_w_imag * w; *p_sec_I_vec_x += p_real * sec_x_real + p_imag * sec_x_imag; *p_sec_I_vec_y += p_real * sec_y_real + p_imag * sec_y_imag; *p_sec_I_vec_z += p_real * sec_z_real + p_imag * sec_z_imag; energy += 0.5f * ( p_real * p_real + p_imag * p_imag + sec_x_real * sec_x_real + sec_x_imag * sec_x_imag + sec_y_real * sec_y_real + sec_y_imag * sec_y_imag + sec_z_real * sec_z_real + sec_z_imag * sec_z_imag ); } } if ( firstrun_sector_params ) { *p_sec_I_vec_smth_x = *p_sec_I_vec_x; *p_sec_I_vec_smth_y = *p_sec_I_vec_y; *p_sec_I_vec_smth_z = *p_sec_I_vec_z; *p_energy_smth = energy; } else { float w = ( 1.0f - beta ); *p_sec_I_vec_smth_x = w * *p_sec_I_vec_x + beta * *p_sec_I_vec_smth_x; *p_sec_I_vec_smth_y = w * *p_sec_I_vec_y + beta * *p_sec_I_vec_smth_y; *p_sec_I_vec_smth_z = w * *p_sec_I_vec_z + beta * *p_sec_I_vec_smth_z; *p_energy_smth = w * energy + beta * *p_energy_smth; } if ( energy < EPSILON ) { *p_azi = 0.f; *p_ele = 0.f; *p_ene = 0.f; *p_diff = 1.f; } else { normI = sqrtf( *p_sec_I_vec_smth_x * *p_sec_I_vec_smth_x + *p_sec_I_vec_smth_y * *p_sec_I_vec_smth_y + *p_sec_I_vec_smth_z * *p_sec_I_vec_smth_z ); *p_azi = atan2f( *p_sec_I_vec_smth_y, *p_sec_I_vec_smth_x ) * _180_OVER_PI; *p_ele = asinf( *p_sec_I_vec_smth_z / ( normI + EPSILON ) ) * _180_OVER_PI; *p_ene = *p_energy_smth; *p_diff = 1.f - normI / ( *p_energy_smth + EPSILON ); } tmp_diff = *p_diff; if ( tmp_diff < 0.0f ) { *p_diff = 0.f; } if ( tmp_diff > 0.5f ) { if ( firstrun_sector_params ) { *p_azi = 0.f; *p_ele = 0.f; } else { *p_azi = 2.f * ( 1.f - tmp_diff ) * *p_azi + ( 2.f * tmp_diff - 1.f ) * *p_azi_prev; *p_ele = 2.f * ( 1.f - tmp_diff ) * *p_ele + ( 2.f * tmp_diff - 1.f ) * *p_ele_prev; } } else { *p_azi_prev = *p_azi; *p_ele_prev = *p_ele; } #ifdef HODIRAC_CHECK_VALUE_RANGE assert( *p_azi >= -180.f && *p_azi <= 180.f ); assert( *p_ele >= -90.f && *p_ele <= 90.f ); #endif } // i_band } // i_sec firstrun_sector_params = 0; } #endif /*-----------------------------------------------------------------------* * Local functions Loading Loading
apps/renderer.c +3 −3 Original line number Diff line number Diff line Loading @@ -1787,7 +1787,7 @@ IsmPositionProvider *IsmPositionProvider_open( IsmPositionProvider *ipp; uint16_t i; ipp = (IsmPositionProvider *) malloc_( sizeof( IsmPositionProvider ) ); ipp = (IsmPositionProvider *) malloc( sizeof( IsmPositionProvider ) ); ipp->frameCounter = 0; ipp->numObjects = 0; Loading Loading @@ -2182,8 +2182,8 @@ static void parseIsm( if ( parseUint32( line, &numberOfObjectPositionsToRead ) == 0 ) { positionProvider->numPositions[idx] = numberOfObjectPositionsToRead; positionProvider->positions[idx] = malloc_( numberOfObjectPositionsToRead * sizeof( IVAS_REND_AudioObjectPosition ) ); positionProvider->positionDurations[idx] = malloc_( numberOfObjectPositionsToRead * sizeof( uint16_t ) ); positionProvider->positions[idx] = malloc( numberOfObjectPositionsToRead * sizeof( IVAS_REND_AudioObjectPosition ) ); positionProvider->positionDurations[idx] = malloc( numberOfObjectPositionsToRead * sizeof( uint16_t ) ); for ( i = 0; i < numberOfObjectPositionsToRead; ++i ) { Loading
ci/smoke_test.sh +1 −1 Original line number Diff line number Diff line Loading @@ -63,7 +63,7 @@ if [ $BUILD -eq 1 ];then make clean # Replace free -> free_, malloc -> malloc_, calloc -> calloc_ ./scripts/prepare_mem_dryrun.py python3 ./scripts/prepare_mem_dryrun.py # Enable WMOPS and disable DEBUGGING sed -i.bak -e "s/\/\*\s*\(#define\s*WMOPS\)\s*\*\//\1/g" lib_com/options.h Loading
lib_com/ivas_cnst.h 100644 → 100755 +31 −0 Original line number Diff line number Diff line Loading @@ -174,6 +174,10 @@ typedef enum #define BINAURAL_CHANNELS 2 /* number of channels for binaural output configuration */ #define CPE_CHANNELS 2 /* number of CPE (stereo) channels */ #define FOA_CHANNELS 4 /* number of FOA channels */ #ifdef HODIRAC #define HOA2_CHANNELS 9 #endif #define MAX_NUM_OBJECTS 4 /* max. number of audio objects */ #define MAX_SCE MAX_NUM_OBJECTS /* max. number of SCEs */ Loading Loading @@ -837,6 +841,10 @@ enum fea_names #define SNS_MSVQ_NSTAGES_TCX10 3 #define SNS_MSVQ_NSTAGES_SIDE 2 #endif #ifdef FIX_445_SNS_BUGFIXES #define SNS_CDBKS_BITS_4_FRAC 12 #define SNS_MEANS_BITS_4_FRAC 14 #endif #define MDCT_ST_PLC_FADEOUT_MIN_NOISE_NRG 0.001f #define MDCT_ST_PLC_FADEOUT_MAX_CONC_FRAME 2 * FRAMES_PER_SEC Loading Loading @@ -901,7 +909,11 @@ typedef enum * DirAC Constants *----------------------------------------------------------------------------------*/ #ifdef HODIRAC #define DIRAC_MAX_ANA_CHANS 11 /* Maximum number of channels for DirAC analysis */ #else #define DIRAC_MAX_ANA_CHANS FOA_CHANNELS /* Maximum number of channels for DirAC analysis */ #endif #define DIRAC_NUM_DIMS 3 /* number of directions to estimate (X,Y,Z) */ #define DIRAC_MAX_NBANDS 12 /* Maximum number of frequency bands for the DirAC Side Parameter decoding */ Loading @@ -915,6 +927,11 @@ typedef enum #define DIRAC_NO_FB_BANDS_MAX MDFT_FB_BANDS_240 #define DELAY_DIRAC_ENC_CMP_NS_PARAM_ISM ( IVAS_ENC_DELAY_NS + IVAS_DEC_DELAY_NS ) /* == 12 ms */ #ifdef HODIRAC #define DIRAC_HO_NUMSECTORS 2 #define NUM_ANA_SECTORS 2 #endif /* DirAC renderer setup */ typedef enum Loading Loading @@ -973,7 +990,17 @@ typedef enum #define SPAR_CONFIG_BW FB #ifndef SPAR_TUNING #define IVAS_SPAR_MAX_CH (FOA_CHANNELS + 2 * ( IVAS_MAX_SBA_ORDER - 1 )) /* FOA + planar HOA */ #else #define IVAS_SPAR_MAX_CH ((( IVAS_MAX_SBA_ORDER ) * ( IVAS_MAX_SBA_ORDER )) + 2) /* HOA2 + pHOA3*/ #define IVAS_HBR_MAX_DECOR_CHS (2) #endif #ifdef HODIRAC #define IVAS_SPAR_MAX_FB_IN_CHAN 11 #endif #define IVAS_SPAR_P_LOWERTRI ((IVAS_SPAR_MAX_CH - 1) * (IVAS_SPAR_MAX_CH - 2)) >> 1 #define IVAS_SPAR_MAX_C_COEFF (IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS) * ( IVAS_SPAR_MAX_DMX_CHS - 1) Loading Loading @@ -1182,7 +1209,11 @@ enum #define MASA_ANGLE_TOLERANCE 0.5f #define MASA_LIMIT_NO_BANDS_SUR_COH 8 #define MINIMUM_BIT_BUDGET_NORMAL_META 100 #ifdef HODIRAC #define DIFF_DFRATIO_2BIT_LIMIT_IDX_HODIRAC 4 #endif #define DIFF_DFRATIO_2BIT_LIMIT_IDX 3 #define DIFF_DFRATIO_1BIT_LIMIT_IDX 6 #define DIFF_EC_HUFF_BAND_LIMIT 8 #define DIFF_EC_HUFF_GR0_LIMIT 8 Loading
lib_com/ivas_cov_smooth.c +15 −2 Original line number Diff line number Diff line Loading @@ -50,8 +50,11 @@ static void ivas_set_up_cov_smoothing( ivas_cov_smooth_state_t *hCovState, ivas_filterbank_t *pFb, const float max_update_rate, const int16_t min_pool_size, const int16_t min_pool_size #ifndef FIX_331_ALL_BRS , const int16_t nchan_inp /* i : number of input channels */ #endif , const int32_t ivas_total_brate ) { Loading Loading @@ -90,7 +93,9 @@ static void ivas_set_up_cov_smoothing( } } } else if ( nchan_inp <= FOA_CHANNELS ) else #ifndef FIX_331_ALL_BRS if ( nchan_inp <= FOA_CHANNELS ) { for ( j = 0; j < pFb->filterbank_num_bands; j++ ) { Loading @@ -112,6 +117,7 @@ static void ivas_set_up_cov_smoothing( } else { #endif for ( j = 0; j < pFb->filterbank_num_bands; j++ ) { float update_factor; Loading @@ -131,7 +137,9 @@ static void ivas_set_up_cov_smoothing( hCovState->pSmoothing_factor[j] = max_update_rate; } } #ifndef FIX_331_ALL_BRS } #endif hCovState->prior_bank_idx = -1; return; Loading Loading @@ -178,7 +186,12 @@ ivas_error ivas_spar_covar_smooth_enc_open( } } #ifndef FIX_331_ALL_BRS ivas_set_up_cov_smoothing( hCovState, pFb, cov_smooth_cfg->max_update_rate, cov_smooth_cfg->min_pool_size, nchan_inp, ivas_total_brate ); #else ivas_set_up_cov_smoothing( hCovState, pFb, cov_smooth_cfg->max_update_rate, cov_smooth_cfg->min_pool_size, ivas_total_brate ); #endif *hCovState_out = hCovState; Loading
lib_com/ivas_dirac_com.c +292 −8 Original line number Diff line number Diff line Loading @@ -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 ) Loading Loading @@ -128,7 +130,14 @@ ivas_error ivas_dirac_config( if ( sba_mode == SBA_MODE_SPAR ) { hConfig->nbands = IVAS_MAX_NUM_BANDS; spar_dirac_split_band = min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND ); #ifdef HODIRAC if ( sba_order > 1 && ivas_total_brate > IVAS_256k ) { spar_dirac_split_band = 0; } #endif } else { Loading Loading @@ -164,6 +173,16 @@ ivas_error ivas_dirac_config( { hConfig->enc_param_start_band = spar_dirac_split_band; } #ifdef HODIRAC if ( sba_order > 1 && ivas_total_brate > IVAS_256k ) { hConfig->dec_param_estim = FALSE; hConfig->enc_param_start_band = 0; set_c( (int8_t *) hQMetaData->twoDirBands, (int8_t) 1, hQMetaData->q_direction[0].cfg.nbands ); hQMetaData->numTwoDirBands = (uint8_t) hQMetaData->q_direction[0].cfg.nbands; } #endif } else { Loading @@ -176,7 +195,9 @@ ivas_error ivas_dirac_config( if ( sba_mode == SBA_MODE_SPAR ) { ivas_dirac_config_bands( band_grouping, IVAS_MAX_NUM_BANDS, (int16_t) ( Fs * INV_CLDFB_BANDWIDTH + 0.5f ), ivas_dirac_config_bands( band_grouping, IVAS_MAX_NUM_BANDS, (int16_t) ( Fs * INV_CLDFB_BANDWIDTH + 0.5f ), dirac_to_spar_md_bands, hQMetaData->useLowerBandRes, hConfig->enc_param_start_band, hFbMdft ); } else Loading Loading @@ -354,13 +375,45 @@ ivas_error ivas_dirac_sba_config( else { hQMetaData->useLowerBandRes = 0; #ifdef HODIRAC if ( !( sba_order > 1 && sba_total_brate > IVAS_256k ) ) #endif { nbands_coded = nbands - 1; /* always combine the last two bands */ } } if ( ( error = ivas_qmetadata_allocate_memory( hQMetaData, nbands_coded, 1, 0 ) ) != IVAS_ERR_OK ) { int16_t no_dirs = 1; #ifdef HODIRAC if ( sba_order > 1 && sba_total_brate > IVAS_256k ) { no_dirs = 2; } #endif if ( ( error = ivas_qmetadata_allocate_memory( hQMetaData, nbands_coded, no_dirs, 0 ) ) != IVAS_ERR_OK ) { return error; } #ifdef HODIRAC_FIX_BR_SWITCHING_DTX if ( sba_order > 1 && sba_total_brate > IVAS_256k ) { int16_t dir, j; for ( dir = 0; dir < hQMetaData->no_directions; dir++ ) { for ( j = 0; j < nbands_coded; j++ ) { for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) { hQMetaData->q_direction[dir].band_data[j].energy_ratio_index[i] = 0; hQMetaData->q_direction[dir].band_data[j].energy_ratio_index_mod[i] = 0; } } } } #endif } if ( sba_total_brate <= IVAS_13k2 ) { Loading Loading @@ -452,11 +505,19 @@ ivas_error ivas_dirac_sba_config( } if ( sba_total_brate >= IVAS_96k ) { if ( ( error = ivas_qmetadata_allocate_memory( hQMetaData, 6, 1, 0 ) ) != IVAS_ERR_OK ) { int16_t no_dirs = 1; #ifdef HODIRAC if ( sba_order > 1 && sba_total_brate > IVAS_256k ) { no_dirs = 2; } #endif if ( ( error = ivas_qmetadata_allocate_memory( hQMetaData, 6, no_dirs, 0 ) ) != IVAS_ERR_OK ) { return error; } } nbands_wb = 4; } else Loading Loading @@ -484,8 +545,17 @@ ivas_error ivas_dirac_sba_config( for ( i = 0; i < hQMetaData->no_directions; i++ ) { hQMetaData->q_direction[i].cfg.search_effort = 1; #ifdef HODIRAC if ( sba_order > 1 && sba_total_brate > IVAS_256k ) { hQMetaData->q_direction[i].cfg.start_band = 0; } else #endif { hQMetaData->q_direction[i].cfg.start_band = nbands_wb; } } *element_mode = IVAS_CPE_MDCT; } Loading Loading @@ -787,6 +857,220 @@ void deindex_spherical_component( return; } #ifdef HODIRAC void calculate_hodirac_sector_parameters( float RealBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* i: signal vector (L+1)^2 x N_bins, real part */ float ImagBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* i: signal vector, imaginary part*/ const int16_t N_bins, /* i: number of bins */ const float beta, /* i: forgetting factor for average filtering */ const int16_t *band_grouping, /* i: indices of band groups */ const int16_t N_bands, /* i: number of bands (groups) */ const int16_t enc_param_start_band, /* i: first band to process */ float *azi, /* o: array of sector azimuth angles, flat */ float *ele, /* o: array of sector elevation angles, flat */ float *diff, /* o: array of sector diffuseness values, flat*/ float *ene /* o: array of sector energy values, flat*/ ) { int16_t i_sec, i_bin, i_band; float p_real, p_imag, normI, energy, tmp_diff; float sec_I_vec_x[NUM_ANA_SECTORS]; float sec_I_vec_y[NUM_ANA_SECTORS]; float sec_I_vec_z[NUM_ANA_SECTORS]; static int16_t firstrun_sector_params = 1; static float sec_I_vec_smth_x[NUM_ANA_SECTORS][IVAS_MAX_NUM_BANDS]; static float sec_I_vec_smth_y[NUM_ANA_SECTORS][IVAS_MAX_NUM_BANDS]; static float sec_I_vec_smth_z[NUM_ANA_SECTORS][IVAS_MAX_NUM_BANDS]; static float energy_smth[NUM_ANA_SECTORS][IVAS_MAX_NUM_BANDS]; static float azi_prev[NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS]; static float ele_prev[NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS]; #ifdef DEBUGGING assert( N_bins <= DIRAC_NO_FB_BANDS_MAX ); #endif for ( i_sec = 0; i_sec < NUM_ANA_SECTORS; i_sec++ ) { float *p_sec_I_vec_x = &sec_I_vec_x[i_sec]; float *p_sec_I_vec_y = &sec_I_vec_y[i_sec]; float *p_sec_I_vec_z = &sec_I_vec_z[i_sec]; const float *p_c_weights = c_weights; float *p_ImagBuffer_0 = ImagBuffer[0]; float *p_ImagBuffer_1 = ImagBuffer[1]; float *p_ImagBuffer_2 = ImagBuffer[2]; float *p_ImagBuffer_3 = ImagBuffer[3]; float *p_ImagBuffer_4 = ImagBuffer[4]; float *p_ImagBuffer_5 = ImagBuffer[5]; float *p_ImagBuffer_6 = ImagBuffer[6]; float *p_ImagBuffer_8 = ImagBuffer[8]; float *p_RealBuffer_0 = RealBuffer[0]; float *p_RealBuffer_1 = RealBuffer[1]; float *p_RealBuffer_2 = RealBuffer[2]; float *p_RealBuffer_3 = RealBuffer[3]; float *p_RealBuffer_4 = RealBuffer[4]; float *p_RealBuffer_5 = RealBuffer[5]; float *p_RealBuffer_6 = RealBuffer[6]; float *p_RealBuffer_8 = RealBuffer[8]; for ( i_band = enc_param_start_band; i_band < N_bands; i_band++ ) { float *p_azi = &azi[i_sec * N_bands + i_band]; float *p_ele = &ele[i_sec * N_bands + i_band]; float *p_ene = &ene[i_sec * N_bands + i_band]; float *p_diff = &diff[i_sec * N_bands + i_band]; float *p_azi_prev = &azi_prev[i_sec * N_bands + i_band]; float *p_ele_prev = &ele_prev[i_sec * N_bands + i_band]; float *p_energy_smth = &energy_smth[i_sec][i_band]; float *p_sec_I_vec_smth_x = &sec_I_vec_smth_x[i_sec][i_band]; float *p_sec_I_vec_smth_y = &sec_I_vec_smth_y[i_sec][i_band]; float *p_sec_I_vec_smth_z = &sec_I_vec_smth_z[i_sec][i_band]; *p_sec_I_vec_x = 0.f; *p_sec_I_vec_y = 0.f; *p_sec_I_vec_z = 0.f; energy = 0.f; if ( i_sec == 0 ) { for ( i_bin = band_grouping[i_band]; i_bin < band_grouping[i_band + 1]; i_bin++ ) { float w = *( p_c_weights++ ); float sec_w_imag, sec_x_imag, sec_y_imag, sec_z_imag; float sec_w_real, sec_x_real, sec_y_real, sec_z_real; sec_w_imag = 1.772454f * *( p_ImagBuffer_0 ) + 1.772454f * *( p_ImagBuffer_1 ); sec_x_imag = 1.772454f * *( p_ImagBuffer_3++ ) + 1.023326f * *( p_ImagBuffer_4++ ); sec_y_imag = 0.590818f * *( p_ImagBuffer_0++ ) + 1.772454f * *( p_ImagBuffer_1++ ) - 0.590817f * *( p_ImagBuffer_6++ ) - 1.023326f * *( p_ImagBuffer_8++ ); sec_z_imag = 1.772454f * *( p_ImagBuffer_2++ ) + 1.023326f * *( p_ImagBuffer_5++ ); sec_w_real = 1.772454f * *( p_RealBuffer_0 ) + 1.772454f * *( p_RealBuffer_1 ); sec_x_real = 1.772454f * *( p_RealBuffer_3++ ) + 1.023326f * *( p_RealBuffer_4++ ); sec_y_real = 0.590818f * *( p_RealBuffer_0++ ) + 1.772454f * *( p_RealBuffer_1++ ) - 0.590817f * *( p_RealBuffer_6++ ) - 1.023326f * *( p_RealBuffer_8++ ); sec_z_real = 1.772454f * *( p_RealBuffer_2++ ) + 1.023326f * *( p_RealBuffer_5++ ); p_real = sec_w_real * w; p_imag = sec_w_imag * w; *p_sec_I_vec_x += p_real * sec_x_real + p_imag * sec_x_imag; *p_sec_I_vec_y += p_real * sec_y_real + p_imag * sec_y_imag; *p_sec_I_vec_z += p_real * sec_z_real + p_imag * sec_z_imag; energy += 0.5f * ( p_real * p_real + p_imag * p_imag + sec_x_real * sec_x_real + sec_x_imag * sec_x_imag + sec_y_real * sec_y_real + sec_y_imag * sec_y_imag + sec_z_real * sec_z_real + sec_z_imag * sec_z_imag ); } } else { for ( i_bin = band_grouping[i_band]; i_bin < band_grouping[i_band + 1]; i_bin++ ) { float w = *( p_c_weights++ ); float sec_w_imag, sec_x_imag, sec_y_imag, sec_z_imag; float sec_w_real, sec_x_real, sec_y_real, sec_z_real; sec_w_imag = 1.772454f * *(p_ImagBuffer_0) -1.772454f * *( p_ImagBuffer_1 ); sec_x_imag = 1.772454f * *( p_ImagBuffer_3++ ) - 1.023326f * *( p_ImagBuffer_4++ ); sec_y_imag = -0.590818f * *( p_ImagBuffer_0++ ) + 1.772454f * *( p_ImagBuffer_1++ ) + 0.590817f * *( p_ImagBuffer_6++ ) + 1.023326f * *( p_ImagBuffer_8++ ); sec_z_imag = 1.772454f * *( p_ImagBuffer_2++ ) - 1.023326f * *( p_ImagBuffer_5++ ); sec_w_real = 1.772454f * *(p_RealBuffer_0) -1.772454f * *( p_RealBuffer_1 ); sec_x_real = 1.772454f * *( p_RealBuffer_3++ ) - 1.023326f * *( p_RealBuffer_4++ ); sec_y_real = -0.590818f * *( p_RealBuffer_0++ ) + 1.772454f * *( p_RealBuffer_1++ ) + 0.590817f * *( p_RealBuffer_6++ ) + 1.023326f * *( p_RealBuffer_8++ ); sec_z_real = 1.772454f * *( p_RealBuffer_2++ ) - 1.023326f * *( p_RealBuffer_5++ ); p_real = sec_w_real * w; p_imag = sec_w_imag * w; *p_sec_I_vec_x += p_real * sec_x_real + p_imag * sec_x_imag; *p_sec_I_vec_y += p_real * sec_y_real + p_imag * sec_y_imag; *p_sec_I_vec_z += p_real * sec_z_real + p_imag * sec_z_imag; energy += 0.5f * ( p_real * p_real + p_imag * p_imag + sec_x_real * sec_x_real + sec_x_imag * sec_x_imag + sec_y_real * sec_y_real + sec_y_imag * sec_y_imag + sec_z_real * sec_z_real + sec_z_imag * sec_z_imag ); } } if ( firstrun_sector_params ) { *p_sec_I_vec_smth_x = *p_sec_I_vec_x; *p_sec_I_vec_smth_y = *p_sec_I_vec_y; *p_sec_I_vec_smth_z = *p_sec_I_vec_z; *p_energy_smth = energy; } else { float w = ( 1.0f - beta ); *p_sec_I_vec_smth_x = w * *p_sec_I_vec_x + beta * *p_sec_I_vec_smth_x; *p_sec_I_vec_smth_y = w * *p_sec_I_vec_y + beta * *p_sec_I_vec_smth_y; *p_sec_I_vec_smth_z = w * *p_sec_I_vec_z + beta * *p_sec_I_vec_smth_z; *p_energy_smth = w * energy + beta * *p_energy_smth; } if ( energy < EPSILON ) { *p_azi = 0.f; *p_ele = 0.f; *p_ene = 0.f; *p_diff = 1.f; } else { normI = sqrtf( *p_sec_I_vec_smth_x * *p_sec_I_vec_smth_x + *p_sec_I_vec_smth_y * *p_sec_I_vec_smth_y + *p_sec_I_vec_smth_z * *p_sec_I_vec_smth_z ); *p_azi = atan2f( *p_sec_I_vec_smth_y, *p_sec_I_vec_smth_x ) * _180_OVER_PI; *p_ele = asinf( *p_sec_I_vec_smth_z / ( normI + EPSILON ) ) * _180_OVER_PI; *p_ene = *p_energy_smth; *p_diff = 1.f - normI / ( *p_energy_smth + EPSILON ); } tmp_diff = *p_diff; if ( tmp_diff < 0.0f ) { *p_diff = 0.f; } if ( tmp_diff > 0.5f ) { if ( firstrun_sector_params ) { *p_azi = 0.f; *p_ele = 0.f; } else { *p_azi = 2.f * ( 1.f - tmp_diff ) * *p_azi + ( 2.f * tmp_diff - 1.f ) * *p_azi_prev; *p_ele = 2.f * ( 1.f - tmp_diff ) * *p_ele + ( 2.f * tmp_diff - 1.f ) * *p_ele_prev; } } else { *p_azi_prev = *p_azi; *p_ele_prev = *p_ele; } #ifdef HODIRAC_CHECK_VALUE_RANGE assert( *p_azi >= -180.f && *p_azi <= 180.f ); assert( *p_ele >= -90.f && *p_ele <= 90.f ); #endif } // i_band } // i_sec firstrun_sector_params = 0; } #endif /*-----------------------------------------------------------------------* * Local functions Loading