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 +27 −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 @@ -905,7 +909,11 @@ typedef enum * DirAC Constants *----------------------------------------------------------------------------------*/ #ifdef HODIRAC #define DIRAC_MAX_ANA_CHANS 11 /* Maximum number of channels for DirAC analysis */ #else #define DIRAC_MAX_ANA_CHANS FOA_CHANNELS /* Maximum number of channels for DirAC analysis */ #endif #define DIRAC_NUM_DIMS 3 /* number of directions to estimate (X,Y,Z) */ #define DIRAC_MAX_NBANDS 12 /* Maximum number of frequency bands for the DirAC Side Parameter decoding */ Loading @@ -919,6 +927,11 @@ typedef enum #define DIRAC_NO_FB_BANDS_MAX MDFT_FB_BANDS_240 #define DELAY_DIRAC_ENC_CMP_NS_PARAM_ISM ( IVAS_ENC_DELAY_NS + IVAS_DEC_DELAY_NS ) /* == 12 ms */ #ifdef HODIRAC #define DIRAC_HO_NUMSECTORS 2 #define NUM_ANA_SECTORS 2 #endif /* DirAC renderer setup */ typedef enum Loading Loading @@ -977,7 +990,17 @@ typedef enum #define SPAR_CONFIG_BW FB #ifndef SPAR_TUNING #define IVAS_SPAR_MAX_CH (FOA_CHANNELS + 2 * ( IVAS_MAX_SBA_ORDER - 1 )) /* FOA + planar HOA */ #else #define IVAS_SPAR_MAX_CH ((( IVAS_MAX_SBA_ORDER ) * ( IVAS_MAX_SBA_ORDER )) + 2) /* HOA2 + pHOA3*/ #define IVAS_HBR_MAX_DECOR_CHS (2) #endif #ifdef HODIRAC #define IVAS_SPAR_MAX_FB_IN_CHAN 11 #endif #define IVAS_SPAR_P_LOWERTRI ((IVAS_SPAR_MAX_CH - 1) * (IVAS_SPAR_MAX_CH - 2)) >> 1 #define IVAS_SPAR_MAX_C_COEFF (IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS) * ( IVAS_SPAR_MAX_DMX_CHS - 1) Loading Loading @@ -1190,7 +1213,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_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 @@ -418,13 +439,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 } #ifdef ARITH_HUFF_CODER_CHANGES ivas_get_dirac_sba_max_md_bits( sba_total_brate, Loading Loading @@ -524,11 +577,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 @@ -556,8 +617,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 @@ -859,6 +929,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 lib_com/ivas_fb_mixer.c +65 −3 Original line number Diff line number Diff line Loading @@ -106,6 +106,10 @@ ivas_error ivas_fb_set_cfg( const int16_t num_out_chans, /* i : number of FB output channels*/ const int16_t active_w_mixing, /* i : active_w_mixing flag */ const int32_t sampling_rate /* i : sampling rate */ #ifdef HODIRAC , const int16_t nchan_fb_in /* i: number of dirac analysis channels */ #endif ) { IVAS_FB_CFG *pFb_cfg; Loading @@ -117,6 +121,9 @@ ivas_error ivas_fb_set_cfg( pFb_cfg->num_in_chans = num_in_chans; pFb_cfg->num_out_chans = num_out_chans; #ifdef HODIRAC pFb_cfg->nchan_fb_in = nchan_fb_in; #endif pFb_cfg->pcm_offset = 0; /* note: in SPAR decoder, this parameter is overwritten later */ pFb_cfg->active_w_mixing = active_w_mixing; Loading Loading @@ -219,7 +226,11 @@ ivas_error ivas_FB_mixer_open( } else if ( fb_cfg->active_w_mixing ) { #ifdef HODIRAC num_chs_alloc = max( fb_cfg->num_in_chans, fb_cfg->nchan_fb_in ); #else num_chs_alloc = fb_cfg->num_in_chans; #endif } else { Loading Loading @@ -259,7 +270,11 @@ ivas_error ivas_FB_mixer_open( } else { #ifdef HODIRAC num_chs_alloc = max( fb_cfg->num_in_chans, fb_cfg->nchan_fb_in ); #else num_chs_alloc = fb_cfg->num_in_chans; #endif } for ( i = 0; i < num_chs_alloc; i++ ) Loading @@ -274,8 +289,11 @@ ivas_error ivas_FB_mixer_open( if ( ( fb_cfg->active_w_mixing != -1 ) && ( fb_cfg->num_out_chans > 0 ) ) { float *pTemp_mem; #ifdef HODIRAC if ( ( pTemp_mem = (float *) malloc( sizeof( float ) * fb_cfg->num_out_chans * max( fb_cfg->num_in_chans, fb_cfg->nchan_fb_in ) * IVAS_MAX_NUM_BANDS ) ) == NULL ) #else if ( ( pTemp_mem = (float *) malloc( sizeof( float ) * fb_cfg->num_out_chans * fb_cfg->num_in_chans * IVAS_MAX_NUM_BANDS ) ) == NULL ) #endif { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for FB mixer" ); } Loading Loading @@ -386,7 +404,11 @@ void ivas_FB_mixer_close( } else if ( fb_cfg->active_w_mixing ) { #ifdef HODIRAC num_chs_alloc = max( fb_cfg->num_in_chans, fb_cfg->nchan_fb_in ); #else num_chs_alloc = fb_cfg->num_in_chans; #endif } else { Loading Loading @@ -419,8 +441,14 @@ void ivas_FB_mixer_close( } else { #ifdef HODIRAC num_chs_alloc = max( fb_cfg->num_in_chans, fb_cfg->nchan_fb_in ); #else num_chs_alloc = fb_cfg->num_in_chans; #endif } for ( i = 0; i < num_chs_alloc; i++ ) { free( hFbMixer->ppFilterbank_prior_input[i] ); Loading Loading @@ -498,6 +526,10 @@ void ivas_fb_mixer_pcm_ingest( float pcm_in[][L_FRAME48k], /* i : input audio channels */ float **ppOut_pcm, /* o : output audio channels */ const int16_t frame_len /* i : frame length */ #ifdef SPAR_TUNING , const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] #endif ) { int16_t i; Loading @@ -520,7 +552,15 @@ void ivas_fb_mixer_pcm_ingest( for ( i = 0; i < fb_cfg->num_in_chans; i++ ) { mvr2r( &hFbMixer->ppFilterbank_prior_input[i][fb_cfg->prior_input_length - frame_len], ppOut_pcm[i], frame_len ); #ifdef HODIRAC #ifdef SPAR_TUNING mvr2r( pcm_in[HOA_md_ind[i]], &ppOut_pcm[i][frame_len], frame_len ); #else mvr2r( pcm_in[HOA_keep_ind_spar[i]], &ppOut_pcm[i][frame_len], frame_len ); #endif #else mvr2r( pcm_in[i], &ppOut_pcm[i][frame_len], frame_len ); #endif } for ( i = 0; i < num_chs_ingest; i++ ) Loading @@ -542,11 +582,21 @@ void ivas_fb_mixer_update_prior_input( IVAS_FB_MIXER_HANDLE hFbMixer, /* i/o: FB mixer handle */ float *pcm_in[], /* i : input audio channels */ const int16_t length /* i : length of time slot */ #ifdef HODIRAC , const int16_t nchan_fb_in #endif ) { int16_t i; for ( i = 0; i < hFbMixer->fb_cfg->num_in_chans; i++ ) for ( i = 0; i < #ifdef HODIRAC nchan_fb_in; #else hFbMixer->fb_cfg->num_in_chans; #endif i++ ) { mvr2r( &hFbMixer->ppFilterbank_prior_input[i][length], hFbMixer->ppFilterbank_prior_input[i], hFbMixer->fb_cfg->prior_input_length - length ); mvr2r( pcm_in[i], &hFbMixer->ppFilterbank_prior_input[i][hFbMixer->fb_cfg->prior_input_length - length], length ); Loading @@ -569,6 +619,10 @@ void ivas_fb_mixer_get_windowed_fr( float *frame_f_imag[], /* o : imag freq domain values */ const int16_t length, /* i : number of new samples in time slot */ const int16_t mdft_len /* i : MDFT frame length */ #ifdef HODIRAC , int16_t nchan_fb_in #endif ) { int16_t ch_idx, j, offset, rev_offset; Loading @@ -583,7 +637,14 @@ void ivas_fb_mixer_get_windowed_fr( rev_offset = (int16_t) ( 2 * mdft_len - hFbMixer->ana_window_offset ); set_zero( fr_in_block, offset ); for ( ch_idx = 0; ch_idx < hFbMixer->fb_cfg->num_in_chans; ch_idx++ ) for ( ch_idx = 0; ch_idx < #ifdef HODIRAC nchan_fb_in #else hFbMixer->fb_cfg->num_in_chans #endif ; ch_idx++ ) { mvr2r( &hFbMixer->ppFilterbank_prior_input[ch_idx][offset + hFbMixer->fb_cfg->windowed_fr_offset], &fr_in_block[offset], n_old_samples - offset ); mvr2r( pcm_in[ch_idx], &fr_in_block[n_old_samples], n_new_samples ); Loading Loading @@ -708,6 +769,7 @@ void ivas_fb_mixer_process( { int16_t start_offset = pFb->fb_consts.pFilterbank_bins_start_offset[i]; int16_t num_bins = pFb->fb_consts.pFilterbank_bins_per_band[i]; float mixer_const = hFbMixer->prior_mixer[ch][j][i]; pFilterbank_bin_to_band_re = pFb->fb_consts.ppFilterbank_FRs[0][i]; Loading lib_com/ivas_prot.h +130 −3 File changed.Preview size limit exceeded, changes collapsed. Show changes 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 +27 −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 @@ -905,7 +909,11 @@ typedef enum * DirAC Constants *----------------------------------------------------------------------------------*/ #ifdef HODIRAC #define DIRAC_MAX_ANA_CHANS 11 /* Maximum number of channels for DirAC analysis */ #else #define DIRAC_MAX_ANA_CHANS FOA_CHANNELS /* Maximum number of channels for DirAC analysis */ #endif #define DIRAC_NUM_DIMS 3 /* number of directions to estimate (X,Y,Z) */ #define DIRAC_MAX_NBANDS 12 /* Maximum number of frequency bands for the DirAC Side Parameter decoding */ Loading @@ -919,6 +927,11 @@ typedef enum #define DIRAC_NO_FB_BANDS_MAX MDFT_FB_BANDS_240 #define DELAY_DIRAC_ENC_CMP_NS_PARAM_ISM ( IVAS_ENC_DELAY_NS + IVAS_DEC_DELAY_NS ) /* == 12 ms */ #ifdef HODIRAC #define DIRAC_HO_NUMSECTORS 2 #define NUM_ANA_SECTORS 2 #endif /* DirAC renderer setup */ typedef enum Loading Loading @@ -977,7 +990,17 @@ typedef enum #define SPAR_CONFIG_BW FB #ifndef SPAR_TUNING #define IVAS_SPAR_MAX_CH (FOA_CHANNELS + 2 * ( IVAS_MAX_SBA_ORDER - 1 )) /* FOA + planar HOA */ #else #define IVAS_SPAR_MAX_CH ((( IVAS_MAX_SBA_ORDER ) * ( IVAS_MAX_SBA_ORDER )) + 2) /* HOA2 + pHOA3*/ #define IVAS_HBR_MAX_DECOR_CHS (2) #endif #ifdef HODIRAC #define IVAS_SPAR_MAX_FB_IN_CHAN 11 #endif #define IVAS_SPAR_P_LOWERTRI ((IVAS_SPAR_MAX_CH - 1) * (IVAS_SPAR_MAX_CH - 2)) >> 1 #define IVAS_SPAR_MAX_C_COEFF (IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS) * ( IVAS_SPAR_MAX_DMX_CHS - 1) Loading Loading @@ -1190,7 +1213,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_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 @@ -418,13 +439,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 } #ifdef ARITH_HUFF_CODER_CHANGES ivas_get_dirac_sba_max_md_bits( sba_total_brate, Loading Loading @@ -524,11 +577,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 @@ -556,8 +617,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 @@ -859,6 +929,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
lib_com/ivas_fb_mixer.c +65 −3 Original line number Diff line number Diff line Loading @@ -106,6 +106,10 @@ ivas_error ivas_fb_set_cfg( const int16_t num_out_chans, /* i : number of FB output channels*/ const int16_t active_w_mixing, /* i : active_w_mixing flag */ const int32_t sampling_rate /* i : sampling rate */ #ifdef HODIRAC , const int16_t nchan_fb_in /* i: number of dirac analysis channels */ #endif ) { IVAS_FB_CFG *pFb_cfg; Loading @@ -117,6 +121,9 @@ ivas_error ivas_fb_set_cfg( pFb_cfg->num_in_chans = num_in_chans; pFb_cfg->num_out_chans = num_out_chans; #ifdef HODIRAC pFb_cfg->nchan_fb_in = nchan_fb_in; #endif pFb_cfg->pcm_offset = 0; /* note: in SPAR decoder, this parameter is overwritten later */ pFb_cfg->active_w_mixing = active_w_mixing; Loading Loading @@ -219,7 +226,11 @@ ivas_error ivas_FB_mixer_open( } else if ( fb_cfg->active_w_mixing ) { #ifdef HODIRAC num_chs_alloc = max( fb_cfg->num_in_chans, fb_cfg->nchan_fb_in ); #else num_chs_alloc = fb_cfg->num_in_chans; #endif } else { Loading Loading @@ -259,7 +270,11 @@ ivas_error ivas_FB_mixer_open( } else { #ifdef HODIRAC num_chs_alloc = max( fb_cfg->num_in_chans, fb_cfg->nchan_fb_in ); #else num_chs_alloc = fb_cfg->num_in_chans; #endif } for ( i = 0; i < num_chs_alloc; i++ ) Loading @@ -274,8 +289,11 @@ ivas_error ivas_FB_mixer_open( if ( ( fb_cfg->active_w_mixing != -1 ) && ( fb_cfg->num_out_chans > 0 ) ) { float *pTemp_mem; #ifdef HODIRAC if ( ( pTemp_mem = (float *) malloc( sizeof( float ) * fb_cfg->num_out_chans * max( fb_cfg->num_in_chans, fb_cfg->nchan_fb_in ) * IVAS_MAX_NUM_BANDS ) ) == NULL ) #else if ( ( pTemp_mem = (float *) malloc( sizeof( float ) * fb_cfg->num_out_chans * fb_cfg->num_in_chans * IVAS_MAX_NUM_BANDS ) ) == NULL ) #endif { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for FB mixer" ); } Loading Loading @@ -386,7 +404,11 @@ void ivas_FB_mixer_close( } else if ( fb_cfg->active_w_mixing ) { #ifdef HODIRAC num_chs_alloc = max( fb_cfg->num_in_chans, fb_cfg->nchan_fb_in ); #else num_chs_alloc = fb_cfg->num_in_chans; #endif } else { Loading Loading @@ -419,8 +441,14 @@ void ivas_FB_mixer_close( } else { #ifdef HODIRAC num_chs_alloc = max( fb_cfg->num_in_chans, fb_cfg->nchan_fb_in ); #else num_chs_alloc = fb_cfg->num_in_chans; #endif } for ( i = 0; i < num_chs_alloc; i++ ) { free( hFbMixer->ppFilterbank_prior_input[i] ); Loading Loading @@ -498,6 +526,10 @@ void ivas_fb_mixer_pcm_ingest( float pcm_in[][L_FRAME48k], /* i : input audio channels */ float **ppOut_pcm, /* o : output audio channels */ const int16_t frame_len /* i : frame length */ #ifdef SPAR_TUNING , const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] #endif ) { int16_t i; Loading @@ -520,7 +552,15 @@ void ivas_fb_mixer_pcm_ingest( for ( i = 0; i < fb_cfg->num_in_chans; i++ ) { mvr2r( &hFbMixer->ppFilterbank_prior_input[i][fb_cfg->prior_input_length - frame_len], ppOut_pcm[i], frame_len ); #ifdef HODIRAC #ifdef SPAR_TUNING mvr2r( pcm_in[HOA_md_ind[i]], &ppOut_pcm[i][frame_len], frame_len ); #else mvr2r( pcm_in[HOA_keep_ind_spar[i]], &ppOut_pcm[i][frame_len], frame_len ); #endif #else mvr2r( pcm_in[i], &ppOut_pcm[i][frame_len], frame_len ); #endif } for ( i = 0; i < num_chs_ingest; i++ ) Loading @@ -542,11 +582,21 @@ void ivas_fb_mixer_update_prior_input( IVAS_FB_MIXER_HANDLE hFbMixer, /* i/o: FB mixer handle */ float *pcm_in[], /* i : input audio channels */ const int16_t length /* i : length of time slot */ #ifdef HODIRAC , const int16_t nchan_fb_in #endif ) { int16_t i; for ( i = 0; i < hFbMixer->fb_cfg->num_in_chans; i++ ) for ( i = 0; i < #ifdef HODIRAC nchan_fb_in; #else hFbMixer->fb_cfg->num_in_chans; #endif i++ ) { mvr2r( &hFbMixer->ppFilterbank_prior_input[i][length], hFbMixer->ppFilterbank_prior_input[i], hFbMixer->fb_cfg->prior_input_length - length ); mvr2r( pcm_in[i], &hFbMixer->ppFilterbank_prior_input[i][hFbMixer->fb_cfg->prior_input_length - length], length ); Loading @@ -569,6 +619,10 @@ void ivas_fb_mixer_get_windowed_fr( float *frame_f_imag[], /* o : imag freq domain values */ const int16_t length, /* i : number of new samples in time slot */ const int16_t mdft_len /* i : MDFT frame length */ #ifdef HODIRAC , int16_t nchan_fb_in #endif ) { int16_t ch_idx, j, offset, rev_offset; Loading @@ -583,7 +637,14 @@ void ivas_fb_mixer_get_windowed_fr( rev_offset = (int16_t) ( 2 * mdft_len - hFbMixer->ana_window_offset ); set_zero( fr_in_block, offset ); for ( ch_idx = 0; ch_idx < hFbMixer->fb_cfg->num_in_chans; ch_idx++ ) for ( ch_idx = 0; ch_idx < #ifdef HODIRAC nchan_fb_in #else hFbMixer->fb_cfg->num_in_chans #endif ; ch_idx++ ) { mvr2r( &hFbMixer->ppFilterbank_prior_input[ch_idx][offset + hFbMixer->fb_cfg->windowed_fr_offset], &fr_in_block[offset], n_old_samples - offset ); mvr2r( pcm_in[ch_idx], &fr_in_block[n_old_samples], n_new_samples ); Loading Loading @@ -708,6 +769,7 @@ void ivas_fb_mixer_process( { int16_t start_offset = pFb->fb_consts.pFilterbank_bins_start_offset[i]; int16_t num_bins = pFb->fb_consts.pFilterbank_bins_per_band[i]; float mixer_const = hFbMixer->prior_mixer[ch][j][i]; pFilterbank_bin_to_band_re = pFb->fb_consts.ppFilterbank_FRs[0][i]; Loading
lib_com/ivas_prot.h +130 −3 File changed.Preview size limit exceeded, changes collapsed. Show changes