Loading lib_com/ivas_cnst.h 100644 → 100755 +13 −0 Original line number Diff line number Diff line Loading @@ -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 */ Loading @@ -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 Loading Loading @@ -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 Loading lib_com/ivas_dirac_com.c +249 −9 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 @@ -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 { Loading Loading @@ -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 { Loading @@ -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 Loading Loading @@ -351,13 +380,28 @@ ivas_error ivas_dirac_sba_config( else { hQMetaData->useLowerBandRes = 0; #ifdef HODIRAC if ( !( sba_order > 1 ) ) #endif { nbands_coded = nbands - 1; /* always combine the last two bands */ } } { int16_t no_dirs = 1; #ifdef HODIRAC if ( sba_order > 1 ) { no_dirs = 2; } #endif if ( ( error = ivas_qmetadata_allocate_memory( hQMetaData, nbands_coded, 1, 0 ) ) != IVAS_ERR_OK ) if ( ( error = ivas_qmetadata_allocate_memory( hQMetaData, nbands_coded, no_dirs, 0 ) ) != IVAS_ERR_OK ) { return error; } } if ( sba_total_brate <= IVAS_13k2 ) { Loading Loading @@ -410,7 +454,12 @@ 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->qmetadata_max_bit_req = QMETADATA_MAXBIT_REQ_SBA >> 1; return error; Loading Loading @@ -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 ) { 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 Loading Loading @@ -481,8 +538,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 ) { 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 @@ -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 Loading lib_com/ivas_fb_mixer.c +77 −4 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_dirac_ana /* 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_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; Loading Loading @@ -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++ ) Loading Loading @@ -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++ ) Loading @@ -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" ); } Loading Loading @@ -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 ) Loading @@ -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] ); Loading Loading @@ -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++ ) Loading @@ -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 ); Loading @@ -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; Loading @@ -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; Loading Loading @@ -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]; Loading lib_com/ivas_prot.h +64 −1 File changed.Preview size limit exceeded, changes collapsed. Show changes lib_com/ivas_qmetadata_com.c +27 −10 Original line number Diff line number Diff line Loading @@ -508,13 +508,28 @@ 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]; #ifdef HODIRAC if ( !hodirac ) #endif { #ifdef HODIRAC float ratioSum; #endif ratioSum = ratio1 + ratio2; if ( ratio1 >= ratio2 ) { Loading @@ -526,6 +541,8 @@ void masa_compensate_two_dir_energy_ratio_index( 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 ); Loading Loading
lib_com/ivas_cnst.h 100644 → 100755 +13 −0 Original line number Diff line number Diff line Loading @@ -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 */ Loading @@ -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 Loading Loading @@ -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 Loading
lib_com/ivas_dirac_com.c +249 −9 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 @@ -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 { Loading Loading @@ -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 { Loading @@ -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 Loading Loading @@ -351,13 +380,28 @@ ivas_error ivas_dirac_sba_config( else { hQMetaData->useLowerBandRes = 0; #ifdef HODIRAC if ( !( sba_order > 1 ) ) #endif { nbands_coded = nbands - 1; /* always combine the last two bands */ } } { int16_t no_dirs = 1; #ifdef HODIRAC if ( sba_order > 1 ) { no_dirs = 2; } #endif if ( ( error = ivas_qmetadata_allocate_memory( hQMetaData, nbands_coded, 1, 0 ) ) != IVAS_ERR_OK ) if ( ( error = ivas_qmetadata_allocate_memory( hQMetaData, nbands_coded, no_dirs, 0 ) ) != IVAS_ERR_OK ) { return error; } } if ( sba_total_brate <= IVAS_13k2 ) { Loading Loading @@ -410,7 +454,12 @@ 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->qmetadata_max_bit_req = QMETADATA_MAXBIT_REQ_SBA >> 1; return error; Loading Loading @@ -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 ) { 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 Loading Loading @@ -481,8 +538,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 ) { 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 @@ -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 Loading
lib_com/ivas_fb_mixer.c +77 −4 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_dirac_ana /* 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_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; Loading Loading @@ -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++ ) Loading Loading @@ -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++ ) Loading @@ -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" ); } Loading Loading @@ -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 ) Loading @@ -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] ); Loading Loading @@ -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++ ) Loading @@ -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 ); Loading @@ -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; Loading @@ -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; Loading Loading @@ -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]; Loading
lib_com/ivas_qmetadata_com.c +27 −10 Original line number Diff line number Diff line Loading @@ -508,13 +508,28 @@ 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]; #ifdef HODIRAC if ( !hodirac ) #endif { #ifdef HODIRAC float ratioSum; #endif ratioSum = ratio1 + ratio2; if ( ratio1 >= ratio2 ) { Loading @@ -526,6 +541,8 @@ void masa_compensate_two_dir_energy_ratio_index( 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 ); Loading