diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index f7f69ae3eac4f4c1b8d8c12ffd8db995d91e771b..c299bcaba74e2d2e2d50293242220bfe2abbf7a2 100644 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -936,6 +936,9 @@ typedef enum /* Common SPAR metadata constants */ #define IVAS_ACTIVEW_DM_F_SCALE 0.5f #define IVAS_ACTIVEW_DM_F_SCALE_DTX 0.25f +#ifdef LBR_SBA +#define IVAS_ACTIVEW_DM_F_SCALE_VLBR 0.25f +#endif #define IVAS_SPAR_FOA_DFLT_FREQ_PER_CHAN 24000 #define MAX_QUANT_STRATS 3 @@ -968,7 +971,11 @@ typedef enum DECX_COEFF } ivas_coeffs_type_t; +#ifdef LBR_SBA +#define IVAS_SPAR_BR_TABLE_LEN 20 +#else #define IVAS_SPAR_BR_TABLE_LEN 18 +#endif /* TD decorr */ enum diff --git a/lib_com/ivas_cov_smooth.c b/lib_com/ivas_cov_smooth.c index a01b35d26bdb65e9bc2506f7df541b7720fc2c45..d85ea259ac708816ff51284663ea5360bb4723ec 100644 --- a/lib_com/ivas_cov_smooth.c +++ b/lib_com/ivas_cov_smooth.c @@ -50,7 +50,12 @@ static void ivas_set_up_cov_smoothing( ivas_cov_smooth_state_t *pState, ivas_filterbank_t *pFb, const float max_update_rate, - const int16_t min_pool_size ) + const int16_t min_pool_size +#ifdef LBR_SBA_EXTRA_COV_SMOOTH + , + const int32_t ivas_total_brate +#endif +) { int16_t j, k; @@ -71,6 +76,44 @@ static void ivas_set_up_cov_smoothing( } } +#ifdef LBR_SBA_DM_COV_FIX + for ( j = 0; j < pFb->filterbank_num_bands; j++ ) + { + float update_factor; + update_factor = 0.0f; + float *p_bin_to_band; + p_bin_to_band = pFb->fb_bin_to_band.pp_short_stride_bin_to_band[j]; + int16_t active_bins; + active_bins = pFb->fb_bin_to_band.p_short_stride_num_bins_per_band[j]; + + for ( k = 0; k < active_bins; k++ ) + { + update_factor += p_bin_to_band[k]; + } + + pState->pSmoothing_factor[j] = update_factor / min_pool_size; +#ifdef LBR_SBA_EXTRA_COV_SMOOTH + float smooth_fact; + if (ivas_total_brate < IVAS_24k4) + { + smooth_fact = 0.5f; + } + else + { + smooth_fact = 0.75; + } + pState->pSmoothing_factor[j] *= ( j + 1 ) * smooth_fact; +#else + pState->pSmoothing_factor[j] *= ( j + 1 ) * 0.75f; +#endif + + if ( pState->pSmoothing_factor[j] > max_update_rate ) + { + pState->pSmoothing_factor[j] = max_update_rate; + } + } +#endif + pState->prior_bank_idx = -1; return; } @@ -87,6 +130,10 @@ ivas_error ivas_spar_covar_smooth_enc_open( const ivas_cov_smooth_cfg_t *cov_smooth_cfg, /* i : SPAR config. handle */ ivas_filterbank_t *pFb, /* i/o: FB handle */ const int16_t nchan_inp /* i : number of input channels */ +#ifdef LBR_SBA_EXTRA_COV_SMOOTH + , + const int32_t ivas_total_brate /* i : IVAS total bitrate */ +#endif ) { ivas_cov_smooth_state_t *hCovState; @@ -113,9 +160,11 @@ ivas_error ivas_spar_covar_smooth_enc_open( set_zero( hCovState->pPrior_cov_real[i][j], cov_smooth_cfg->max_bands ); } } - +#ifdef LBR_SBA_EXTRA_COV_SMOOTH + ivas_set_up_cov_smoothing( hCovState, pFb, cov_smooth_cfg->max_update_rate, cov_smooth_cfg->min_pool_size, ivas_total_brate ); +#else ivas_set_up_cov_smoothing( hCovState, pFb, cov_smooth_cfg->max_update_rate, cov_smooth_cfg->min_pool_size ); - +#endif *hCovState_out = hCovState; return IVAS_ERR_OK; @@ -180,14 +229,48 @@ static void ivas_compute_smooth_cov( int16_t prev_idx = hCovState->prior_bank_idx; int16_t num_ch = pIn_buf->num_ch; float factor = 0; +#ifdef LBR_SBA_DM_COV_FIX + int16_t sm_b = 2; + int16_t non_sm_b_idx; +#endif assert( end_band <= pFb->filterbank_num_bands ); if ( prev_idx == -1 || pIn_buf->reset_cov == 1 ) { +#ifdef LBR_SBA_DM_COV_FIX + non_sm_b_idx = start_band; + if ( prev_idx != -1 ) + { + non_sm_b_idx = min( sm_b, end_band ); + for ( i = 0; i < num_ch; i++ ) + { + for ( j = 0; j < num_ch; j++ ) + { + if ( i == j ) + { + factor = fac; + } + else + { + factor = 0.0f; + } + + for ( k = start_band; k < non_sm_b_idx; k++ ) + { + pCov_buf[i][j][k] = pPrior_cov_buf[i][j][k] + ( hCovState->pSmoothing_factor[k] * ( pCov_buf[i][j][k] - pPrior_cov_buf[i][j][k] + factor ) ); + } + } + } + } +#endif for ( i = 0; i < num_ch; i++ ) { +#ifdef LBR_SBA_DM_COV_FIX + for ( k = non_sm_b_idx; k < end_band; k++ ) +#else for ( k = start_band; k < end_band; k++ ) +#endif { pCov_buf[i][i][k] += ( hCovState->pSmoothing_factor[k] * fac ); } diff --git a/lib_com/ivas_dirac_com.c b/lib_com/ivas_dirac_com.c index a7e3680ba9b088b912f68df86fdfc9d07972e249..9644a45c6c0361239e6831fa0c1a146b7d36d12d 100644 --- a/lib_com/ivas_dirac_com.c +++ b/lib_com/ivas_dirac_com.c @@ -264,10 +264,18 @@ void ivas_dirac_config_bands( { band_grouping[reduced_band] = max_band; } +#ifdef LBR_SBA + for ( band = enc_param_start_band + ( DIRAC_MAX_NBANDS - enc_param_start_band ) / 2 - 1, reduced_band = DIRAC_MAX_NBANDS - 1; band >= enc_param_start_band; band--, reduced_band -= step ) + { + dirac_to_spar_md_bands[reduced_band] = dirac_to_spar_md_bands[band]; + dirac_to_spar_md_bands[reduced_band - 1] = dirac_to_spar_md_bands[band]; + } +#else for ( band = enc_param_start_band + 1; band < DIRAC_MAX_NBANDS; band++ ) { dirac_to_spar_md_bands[band] = dirac_to_spar_md_bands[band - 1]; } +#endif } else { diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index b297a7e7278551c69639f5ccf89ee3fff36430e8..2c4b0e5ec0763e91b563c0efae666058b4545063 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -3892,6 +3892,10 @@ ivas_error ivas_spar_foa_md_enc_process( ivas_spar_foa_md_enc_in_buf_t *pIn_buf, BSTR_ENC_HANDLE hMetaData, /* i/o: MetaData handle */ const int16_t dtx_silence_mode +#ifdef LBR_SBA + , + const float *prior_mixer[IVAS_MAX_FB_MIXER_OUT_CH][IVAS_MAX_SPAR_FB_MIXER_IN_CH] /* i : prior mixer_matrix */ +#endif ); void ivas_compute_spar_params( @@ -3905,6 +3909,9 @@ void ivas_compute_spar_params( const int16_t num_ch, const int16_t bands_bw, const int16_t active_w, +#ifdef LBR_SBA + const int16_t active_w_vlbr, +#endif ivas_spar_foa_md_com_cfg *hSparCfg, ivas_spar_md_t *hSparMd, float *pWscale, @@ -3948,6 +3955,11 @@ void ivas_get_spar_md_from_dirac( const int16_t order, const int16_t dtx_vad, float Wscale_d[IVAS_MAX_NUM_BANDS] +#ifdef LBR_SBA + , + const uint8_t useLowerRes, + const int16_t active_w_vlbr +#endif ); ivas_error ivas_spar_foa_md_dec_open( @@ -3993,6 +4005,9 @@ void ivas_spar_to_dirac( ivas_spar_foa_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ const int16_t dtx_vad, /* i : DTX frame flag */ const int16_t num_bands_out /* i : number of output bands */ +#ifdef LBR_SBA + , const int16_t bw /* i : band joining factor */ +#endif ); void ivas_spar_foa_update_md_hist( @@ -4022,6 +4037,10 @@ ivas_error ivas_spar_covar_enc_open( ivas_filterbank_t *pFb, /* i/o: FB handle */ const int32_t input_Fs, /* i : input sampling rate */ const int16_t nchan_inp /* i : number of input channels */ +#ifdef LBR_SBA_EXTRA_COV_SMOOTH + , + const int32_t ivas_total_brate /* i : IVAS total bitrate */ +#endif ); void ivas_spar_covar_enc_close( @@ -4043,6 +4062,10 @@ ivas_error ivas_spar_covar_smooth_enc_open( const ivas_cov_smooth_cfg_t *cov_smooth_cfg, /* i : SPAR config. handle */ ivas_filterbank_t *pFb, /* i/o: FB handle */ const int16_t nchan_inp /* i : number of input channels */ +#ifdef LBR_SBA_EXTRA_COV_SMOOTH + , + const int32_t ivas_total_brate /* i : IVAS total bitrate */ +#endif ); void ivas_spar_covar_smooth_enc_close( diff --git a/lib_com/ivas_rom_com.c b/lib_com/ivas_rom_com.c index dd078e2dd776d1eb42c7c681f8d5786d08a7a693..f45c56dd5f2d742c841bb51e1ae82986bd4ab2c1 100644 --- a/lib_com/ivas_rom_com.c +++ b/lib_com/ivas_rom_com.c @@ -903,6 +903,24 @@ const ivas_spar_br_table_t ivas_spar_br_table_consts[IVAS_SPAR_BR_TABLE_LEN] = { /* When AGC is ON additional (AGC_BITS_PER_CH+1) bits may be taken from each EVS channel so minimum EVS bitrate per channel can be min EVS bitrates as per the table - AGC_BITS_PER_CH */ +#ifdef LBR_SBA + /* preferred tuning (3.2/4.9kbps) with/out TDD */ + { 13200, 0, 1, FB, 24000, 1, WYXZ, 1, 0, +#ifdef LBR_SBA_PLANAR + { { 11000, 9600, 13150 } }, +#else + { { 10000, 8300, 13150 } }, +#endif + { { 15, 1, 5, 1 },{ 15, 1, 3, 1 },{ 7, 1, 3, 1 } }, 0, 0, 0 }, + + { 16400, 0, 1, FB, 24000, 1, WYXZ, 1, 0, +#ifdef LBR_SBA_PLANAR + { { 14200, 12800, 16350 } }, +#else + { { 13200, 11500, 16350 } }, +#endif + { { 15, 1, 5, 1 },{ 15, 1, 3, 1 },{ 7, 1, 3, 1 } }, 0, 0, 0 }, +#endif { 24400, 0, 1, FB, 24000, 1, WYXZ, 1, 0,{ { 16400, 15200, 24350 } }, { { 15, 1, 5, 1 },{ 15, 1, 3, 1 },{ 7, 1, 3, 1 } }, 0, 0, 0 }, @@ -959,6 +977,396 @@ const ivas_spar_br_table_t ivas_spar_br_table_consts[IVAS_SPAR_BR_TABLE_LEN] = }; const ivas_arith_consts_t ivas_arith_consts[IVAS_SPAR_BR_TABLE_LEN][MAX_QUANT_STRATS] = { +#ifdef LBR_SBA + /* tbl_idx 0 -- 13.2kbps FOA */ + { + /* Quant strat = 0 */ + { + { + /* pred_R real */ + { + { 0,9,23,56,133,318,757,1800,10192,1800,757,318,133,56,23,9, }, + { 0,156,240,371,573,883,1363,2102,5008,2102,1363,883,573,371,240,156, }, + { 0,241,372,575,886,1367,2109,5027,2109,1367,886,575,372,241,156,101, }, + { 0,101,156,241,372,575,886,1367,2109,5027,2109,1367,886,575,372,241, }, + }, + /* pred_R real differential */ + { + { 0,1,3,12,39,125,397,1260,12710,1260,397,125,39,12,3,1, }, + { 0,66,119,212,378,674,1201,2140,6804,2140,1201,674,378,212,119,66, }, + { 0,119,212,379,675,1203,2144,6816,2144,1203,675,379,212,119,67,37, }, + { 0,37,67,119,212,379,675,1203,2144,6816,2144,1203,675,379,212,119, }, + }, + /* pred_R real : values for general and differential */ + { -7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7 }, + { -7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7 }, + /* pred_R real : num dyn models for general and differential */ + 4, 4 + }, + { + /* drct_R real */ + { + { 0,16384, }, + { 0,16384, }, + { 0,16384, }, + { 0,16384, }, + }, + /* drct_R real differential */ + { + { 0,16384, }, + { 0,16384, }, + { 0,16384, }, + { 0,16384, }, + }, + /* drct_R real : values for general and differential */ + { 0 },{ 0 }, + /* drct_R real : num dyn models for general and differential */ + 4, 4 + }, + { + /* decd_R real */ + { + { 0,11157,2788,1394,697,348, }, + { 0,7186,3592,2540,1796,1270, }, + { 0,2512,3166,5028,3166,2512, }, + { 0,3048,3267,3754,3267,3048, }, + }, + /* decd_R real differential */ + { + { 0,406,1289,12994,1289,406, }, + { 0,1460,2601,8262,2601,1460, }, + { 0,2707,8599,2707,1519,852, }, + { 0,852,1519,2707,8599,2707, }, + }, + /* decd_R real : values for general and differential */ + { 0,1,2,3,4 },{ -2,-1,0,1,2 }, + /* decd_R real : num dyn models for general and differential */ + 4, 4 + }, + }, + /* Quant strat = 1 */ + { + { + /* pred_R real */ + { + { 0,9,23,56,133,318,757,1800,10192,1800,757,318,133,56,23,9, }, + { 0,156,240,371,573,883,1363,2102,5008,2102,1363,883,573,371,240,156, }, + { 0,241,372,575,886,1367,2109,5027,2109,1367,886,575,372,241,156,101, }, + { 0,101,156,241,372,575,886,1367,2109,5027,2109,1367,886,575,372,241, }, + }, + /* pred_R real differential */ + { + { 0,1,3,12,39,125,397,1260,12710,1260,397,125,39,12,3,1, }, + { 0,66,119,212,378,674,1201,2140,6804,2140,1201,674,378,212,119,66, }, + { 0,119,212,379,675,1203,2144,6816,2144,1203,675,379,212,119,67,37, }, + { 0,37,67,119,212,379,675,1203,2144,6816,2144,1203,675,379,212,119, }, + }, + /* pred_R real : values for general and differential */ + { -7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7 }, + { -7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7 }, + /* pred_R real : num dyn models for general and differential */ + 4, 4 + }, + { + /* drct_R real */ + { + { 0,16384, }, + { 0,16384, }, + { 0,16384, }, + { 0,16384, }, + }, + /* drct_R real differential */ + { + { 0,16384, }, + { 0,16384, }, + { 0,16384, }, + { 0,16384, }, + }, + /* drct_R real : values for general and differential */ + { 0 },{ 0 }, + /* drct_R real : num dyn models for general and differential */ + 4, 4 + }, + { + /* decd_R real */ + { + { 0,11917,2978,1489, }, + { 0,8840,4419,3125, }, + { 0,4567,7250,4567, }, + { 0,5203,5978,5203, }, + }, + /* decd_R real differential */ + { + { 0,1356,13672,1356, }, + { 0,3166,10052,3166, }, + { 0,10984,3459,1941, }, + { 0,1941,3459,10984, }, + }, + /* decd_R real : values for general and differential */ + { 0,1,2 },{ -1,0,1 }, + /* decd_R real : num dyn models for general and differential */ + 4, 4 + }, + }, + /* Quant strat = 2 */ + { + { + /* pred_R real */ + { + { 0,327,778,1851,10472,1851,778,327, }, + { 0,1057,1630,2514,5982,2514,1630,1057, }, + { 0,1668,2572,6122,2572,1668,1081,701, }, + { 0,701,1081,1668,2572,6122,2572,1668, }, + }, + /* pred_R real differential */ + { + { 0,125,399,1269,12798,1269,399,125, }, + { 0,744,1327,2365,7512,2365,1327,744, }, + { 0,1354,2413,7664,2413,1354,760,426, }, + { 0,426,760,1354,2413,7664,2413,1354, }, + }, + /* pred_R real : values for general and differential */ + { -3,-2,-1,0,1,2,3 },{ -3,-2,-1,0,1,2,3 }, + /* pred_R real : num dyn models for general and differential */ + 4, 4 + }, + { + /* drct_R real */ + { + { 0,16384, }, + { 0,16384, }, + { 0,16384, }, + { 0,16384, }, + }, + /* drct_R real differential */ + { + { 0,16384, }, + { 0,16384, }, + { 0,16384, }, + { 0,16384, }, + }, + /* drct_R real : values for general and differential */ + { 0 },{ 0 }, + /* drct_R real : num dyn models for general and differential */ + 4, 4 + }, + { + /* decd_R real */ + { + { 0,11917,2978,1489, }, + { 0,8840,4419,3125, }, + { 0,4567,7250,4567, }, + { 0,5203,5978,5203, }, + }, + /* decd_R real differential */ + { + { 0,1356,13672,1356, }, + { 0,3166,10052,3166, }, + { 0,10984,3459,1941, }, + { 0,1941,3459,10984, }, + }, + /* decd_R real : values for general and differential */ + { 0,1,2 },{ -1,0,1 }, + /* decd_R real : num dyn models for general and differential */ + 4, 4 + }, + }, + }, + /* tbl_idx 0 -- 16.4kbps FOA */ + { + /* Quant strat = 0 */ + { + { + /* pred_R real */ + { + { 0,9,23,56,133,318,757,1800,10192,1800,757,318,133,56,23,9, }, + { 0,156,240,371,573,883,1363,2102,5008,2102,1363,883,573,371,240,156, }, + { 0,241,372,575,886,1367,2109,5027,2109,1367,886,575,372,241,156,101, }, + { 0,101,156,241,372,575,886,1367,2109,5027,2109,1367,886,575,372,241, }, + }, + /* pred_R real differential */ + { + { 0,1,3,12,39,125,397,1260,12710,1260,397,125,39,12,3,1, }, + { 0,66,119,212,378,674,1201,2140,6804,2140,1201,674,378,212,119,66, }, + { 0,119,212,379,675,1203,2144,6816,2144,1203,675,379,212,119,67,37, }, + { 0,37,67,119,212,379,675,1203,2144,6816,2144,1203,675,379,212,119, }, + }, + /* pred_R real : values for general and differential */ + { -7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7 }, + { -7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7 }, + /* pred_R real : num dyn models for general and differential */ + 4, 4 + }, + { + /* drct_R real */ + { + { 0,16384, }, + { 0,16384, }, + { 0,16384, }, + { 0,16384, }, + }, + /* drct_R real differential */ + { + { 0,16384, }, + { 0,16384, }, + { 0,16384, }, + { 0,16384, }, + }, + /* drct_R real : values for general and differential */ + { 0 },{ 0 }, + /* drct_R real : num dyn models for general and differential */ + 4, 4 + }, + { + /* decd_R real */ + { + { 0,11157,2788,1394,697,348, }, + { 0,7186,3592,2540,1796,1270, }, + { 0,2512,3166,5028,3166,2512, }, + { 0,3048,3267,3754,3267,3048, }, + }, + /* decd_R real differential */ + { + { 0,406,1289,12994,1289,406, }, + { 0,1460,2601,8262,2601,1460, }, + { 0,2707,8599,2707,1519,852, }, + { 0,852,1519,2707,8599,2707, }, + }, + /* decd_R real : values for general and differential */ + { 0,1,2,3,4 },{ -2,-1,0,1,2 }, + /* decd_R real : num dyn models for general and differential */ + 4, 4 + }, + }, + /* Quant strat = 1 */ + { + { + /* pred_R real */ + { + { 0,9,23,56,133,318,757,1800,10192,1800,757,318,133,56,23,9, }, + { 0,156,240,371,573,883,1363,2102,5008,2102,1363,883,573,371,240,156, }, + { 0,241,372,575,886,1367,2109,5027,2109,1367,886,575,372,241,156,101, }, + { 0,101,156,241,372,575,886,1367,2109,5027,2109,1367,886,575,372,241, }, + }, + /* pred_R real differential */ + { + { 0,1,3,12,39,125,397,1260,12710,1260,397,125,39,12,3,1, }, + { 0,66,119,212,378,674,1201,2140,6804,2140,1201,674,378,212,119,66, }, + { 0,119,212,379,675,1203,2144,6816,2144,1203,675,379,212,119,67,37, }, + { 0,37,67,119,212,379,675,1203,2144,6816,2144,1203,675,379,212,119, }, + }, + /* pred_R real : values for general and differential */ + { -7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7 }, + { -7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7 }, + /* pred_R real : num dyn models for general and differential */ + 4, 4 + }, + { + /* drct_R real */ + { + { 0,16384, }, + { 0,16384, }, + { 0,16384, }, + { 0,16384, }, + }, + /* drct_R real differential */ + { + { 0,16384, }, + { 0,16384, }, + { 0,16384, }, + { 0,16384, }, + }, + /* drct_R real : values for general and differential */ + { 0 },{ 0 }, + /* drct_R real : num dyn models for general and differential */ + 4, 4 + }, + { + /* decd_R real */ + { + { 0,11917,2978,1489, }, + { 0,8840,4419,3125, }, + { 0,4567,7250,4567, }, + { 0,5203,5978,5203, }, + }, + /* decd_R real differential */ + { + { 0,1356,13672,1356, }, + { 0,3166,10052,3166, }, + { 0,10984,3459,1941, }, + { 0,1941,3459,10984, }, + }, + /* decd_R real : values for general and differential */ + { 0,1,2 },{ -1,0,1 }, + /* decd_R real : num dyn models for general and differential */ + 4, 4 + }, + }, + /* Quant strat = 2 */ + { + { + /* pred_R real */ + { + { 0,327,778,1851,10472,1851,778,327, }, + { 0,1057,1630,2514,5982,2514,1630,1057, }, + { 0,1668,2572,6122,2572,1668,1081,701, }, + { 0,701,1081,1668,2572,6122,2572,1668, }, + }, + /* pred_R real differential */ + { + { 0,125,399,1269,12798,1269,399,125, }, + { 0,744,1327,2365,7512,2365,1327,744, }, + { 0,1354,2413,7664,2413,1354,760,426, }, + { 0,426,760,1354,2413,7664,2413,1354, }, + }, + /* pred_R real : values for general and differential */ + { -3,-2,-1,0,1,2,3 },{ -3,-2,-1,0,1,2,3 }, + /* pred_R real : num dyn models for general and differential */ + 4, 4 + }, + { + /* drct_R real */ + { + { 0,16384, }, + { 0,16384, }, + { 0,16384, }, + { 0,16384, }, + }, + /* drct_R real differential */ + { + { 0,16384, }, + { 0,16384, }, + { 0,16384, }, + { 0,16384, }, + }, + /* drct_R real : values for general and differential */ + { 0 },{ 0 }, + /* drct_R real : num dyn models for general and differential */ + 4, 4 + }, + { + /* decd_R real */ + { + { 0,11917,2978,1489, }, + { 0,8840,4419,3125, }, + { 0,4567,7250,4567, }, + { 0,5203,5978,5203, }, + }, + /* decd_R real differential */ + { + { 0,1356,13672,1356, }, + { 0,3166,10052,3166, }, + { 0,10984,3459,1941, }, + { 0,1941,3459,10984, }, + }, + /* decd_R real : values for general and differential */ + { 0,1,2 },{ -1,0,1 }, + /* decd_R real : num dyn models for general and differential */ + 4, 4 + }, + }, + }, +#endif /* tbl_idx 0 -- 24.4kbps FOA */ { /* Quant strat = 0 */ @@ -4454,6 +4862,116 @@ const ivas_arith_consts_t ivas_arith_consts[IVAS_SPAR_BR_TABLE_LEN][MAX_QUANT_ST const ivas_huff_consts_t ivas_huff_const[IVAS_SPAR_BR_TABLE_LEN][MAX_QUANT_STRATS] = { +#ifdef LBR_SBA + /* tbl_idx 0 -- 13.2kbps FOA */ + { + /* Quant strat 0 */ + { + { + /* pred_R codebook */ + { { -7,4,2 },{ -6,4,3 },{ -5,4,4 },{ -4,4,5 },{ -3,4,6 },{ -2,4,7 },{ -1,4,8 },{ 0,3,0 },{ 1,4,9 },{ 2,4,10 },{ 3,4,11 },{ 4,4,12 },{ 5,4,13 },{ 6,4,14 },{ 7,4,15 }, }, + /* pred_R differential codebook */ + { { -7,4,2 },{ -6,4,3 },{ -5,4,4 },{ -4,4,5 },{ -3,4,6 },{ -2,4,7 },{ -1,4,8 },{ 0,3,0 },{ 1,4,9 },{ 2,4,10 },{ 3,4,11 },{ 4,4,12 },{ 5,4,13 },{ 6,4,14 },{ 7,4,15 }, }, + }, + /* drct_R */ + {{{ 0 }}, {{ 0 }}}, + { + /* decd_R codebook */ + { { 0,3,6 },{ 1,2,0 },{ 2,2,1 },{ 3,2,2 },{ 4,3,7 }, }, + /* decd_R differential codebook */ + { { -2,3,6 },{ -1,2,0 },{ 0,2,1 },{ 1,2,2 },{ 2,3,7 }, }, + }, + }, + /* Quant strat 1 */ + { + { + /* pred_R codebook */ + { { -7,4,2 },{ -6,4,3 },{ -5,4,4 },{ -4,4,5 },{ -3,4,6 },{ -2,4,7 },{ -1,4,8 },{ 0,3,0 },{ 1,4,9 },{ 2,4,10 },{ 3,4,11 },{ 4,4,12 },{ 5,4,13 },{ 6,4,14 },{ 7,4,15 }, }, + /* pred_R differential codebook */ + { { -7,4,2 },{ -6,4,3 },{ -5,4,4 },{ -4,4,5 },{ -3,4,6 },{ -2,4,7 },{ -1,4,8 },{ 0,3,0 },{ 1,4,9 },{ 2,4,10 },{ 3,4,11 },{ 4,4,12 },{ 5,4,13 },{ 6,4,14 },{ 7,4,15 }, }, + }, + /* drct_R */ + {{{ 0 }}, {{ 0 }}}, + { + /* decd_R codebook */ + { { 0,2,2 },{ 1,1,0 },{ 2,2,3 }, }, + /* decd_R differential codebook */ + { { -1,2,2 },{ 0,1,0 },{ 1,2,3 }, }, + }, + }, + /* Quant strat 2 */ + { + { + /* pred_R codebook */ + { { -3,3,2 },{ -2,3,3 },{ -1,3,4 },{ 0,2,0 },{ 1,3,5 },{ 2,3,6 },{ 3,3,7 }, }, + /* pred_R differential codebook */ + { { -3,3,2 },{ -2,3,3 },{ -1,3,4 },{ 0,2,0 },{ 1,3,5 },{ 2,3,6 },{ 3,3,7 }, }, + }, + /* drct_R */ + {{{ 0 }}, {{ 0 }}}, + { + /* decd_R codebook */ + { { 0,2,2 },{ 1,1,0 },{ 2,2,3 }, }, + /* decd_R differential codebook */ + { { -1,2,2 },{ 0,1,0 },{ 1,2,3 }, }, + }, + }, + }, + /* tbl_idx 0 -- 16.4kbps FOA */ + { + /* Quant strat 0 */ + { + { + /* pred_R codebook */ + { { -7,4,2 },{ -6,4,3 },{ -5,4,4 },{ -4,4,5 },{ -3,4,6 },{ -2,4,7 },{ -1,4,8 },{ 0,3,0 },{ 1,4,9 },{ 2,4,10 },{ 3,4,11 },{ 4,4,12 },{ 5,4,13 },{ 6,4,14 },{ 7,4,15 }, }, + /* pred_R differential codebook */ + { { -7,4,2 },{ -6,4,3 },{ -5,4,4 },{ -4,4,5 },{ -3,4,6 },{ -2,4,7 },{ -1,4,8 },{ 0,3,0 },{ 1,4,9 },{ 2,4,10 },{ 3,4,11 },{ 4,4,12 },{ 5,4,13 },{ 6,4,14 },{ 7,4,15 }, }, + }, + /* drct_R */ + {{{ 0 }}, {{ 0 }}}, + { + /* decd_R codebook */ + { { 0,3,6 },{ 1,2,0 },{ 2,2,1 },{ 3,2,2 },{ 4,3,7 }, }, + /* decd_R differential codebook */ + { { -2,3,6 },{ -1,2,0 },{ 0,2,1 },{ 1,2,2 },{ 2,3,7 }, }, + }, + }, + /* Quant strat 1 */ + { + { + /* pred_R codebook */ + { { -7,4,2 },{ -6,4,3 },{ -5,4,4 },{ -4,4,5 },{ -3,4,6 },{ -2,4,7 },{ -1,4,8 },{ 0,3,0 },{ 1,4,9 },{ 2,4,10 },{ 3,4,11 },{ 4,4,12 },{ 5,4,13 },{ 6,4,14 },{ 7,4,15 }, }, + /* pred_R differential codebook */ + { { -7,4,2 },{ -6,4,3 },{ -5,4,4 },{ -4,4,5 },{ -3,4,6 },{ -2,4,7 },{ -1,4,8 },{ 0,3,0 },{ 1,4,9 },{ 2,4,10 },{ 3,4,11 },{ 4,4,12 },{ 5,4,13 },{ 6,4,14 },{ 7,4,15 }, }, + }, + /* drct_R */ + {{{ 0 }}, {{ 0 }}}, + { + /* decd_R codebook */ + { { 0,2,2 },{ 1,1,0 },{ 2,2,3 }, }, + /* decd_R differential codebook */ + { { -1,2,2 },{ 0,1,0 },{ 1,2,3 }, }, + }, + }, + /* Quant strat 2 */ + { + { + /* pred_R codebook */ + { { -3,3,2 },{ -2,3,3 },{ -1,3,4 },{ 0,2,0 },{ 1,3,5 },{ 2,3,6 },{ 3,3,7 }, }, + /* pred_R differential codebook */ + { { -3,3,2 },{ -2,3,3 },{ -1,3,4 },{ 0,2,0 },{ 1,3,5 },{ 2,3,6 },{ 3,3,7 }, }, + }, + /* drct_R */ + {{{ 0 }}, {{ 0 }}}, + { + /* decd_R codebook */ + { { 0,2,2 },{ 1,1,0 },{ 2,2,3 }, }, + /* decd_R differential codebook */ + { { -1,2,2 },{ 0,1,0 },{ 1,2,3 }, }, + }, + }, + }, +#endif /* tbl_idx 0 -- 24.4kbps FOA */ { /* Quant strat 0 */ diff --git a/lib_com/ivas_sba_config.c b/lib_com/ivas_sba_config.c index c284c5778aec3d71c3989dd3569889296a0e67a7..3755e68bc1fc5da23e2f970078007b2528300da5 100644 --- a/lib_com/ivas_sba_config.c +++ b/lib_com/ivas_sba_config.c @@ -59,7 +59,7 @@ int16_t ivas_sba_mode_select( ) { SBA_MODE sba_mode; - +#ifndef LBR_SBA if ( ivas_total_brate == IVAS_13k2 || ivas_total_brate == IVAS_16k4 ) { sba_mode = SBA_MODE_DIRAC; @@ -68,6 +68,12 @@ int16_t ivas_sba_mode_select( { sba_mode = SBA_MODE_SPAR; } +#else + int16_t filler; + filler = ivas_total_brate == 0; + sba_mode = SBA_MODE_SPAR; + +#endif return sba_mode; } diff --git a/lib_com/ivas_spar_com.c b/lib_com/ivas_spar_com.c index ad0873624e89d71a5986761999a788c23b9eb8de..7d064d0104d6205fb600dd88d3c668106748ab5d 100644 --- a/lib_com/ivas_spar_com.c +++ b/lib_com/ivas_spar_com.c @@ -62,6 +62,9 @@ #define IVAS_ACTIVEW_DM_F ( 1.0f ) #define IVAS_ACTIVEW_DM_F_DTX ( 0.25f ) +#ifdef LBR_SBA +#define IVAS_ACTIVEW_DM_F_VLBR ( 0.25f ) +#endif #define IVAS_LIN_ACTIVEW_QUAD_ACTIVEW_THRESH ( 3.0f ) #define IVAS_P_NORM_SCALING ( 1.0f ) @@ -76,11 +79,19 @@ * Static functions declaration *------------------------------------------------------------------------------------------*/ -static void ivas_get_pred_coeffs( float *pppCov_mat_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], float ppPred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], float ppDM_Fv_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], const int16_t in_chans, const int16_t start_band, const int16_t end_band, const int16_t active_w, const int16_t dtx_vad, const int16_t from_dirac ); +static void ivas_get_pred_coeffs( float *pppCov_mat_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], float ppPred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], float ppDM_Fv_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], const int16_t in_chans, const int16_t start_band, const int16_t end_band, const int16_t active_w, +#ifdef LBR_SBA + const int16_t active_w_vlbr, +#endif + const int16_t dtx_vad, const int16_t from_dirac ); static void ivas_reorder_array( float in_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS], const int16_t in_chans, const int16_t order[IVAS_SPAR_MAX_CH], float ***mixer_mat, const int16_t start_band, const int16_t end_band ); -static void ivas_get_Wscaling_factor( float *pppCov_mat_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], float pred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], float ***mixer_mat, const int16_t start_band, const int16_t end_band, const int16_t dtx_vad, const int16_t num_ch, const int16_t *pNum_dmx, const int16_t bands_bw, const int16_t active_w, float *pWscale ); +static void ivas_get_Wscaling_factor( float *pppCov_mat_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], float pred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], float ***mixer_mat, const int16_t start_band, const int16_t end_band, const int16_t dtx_vad, const int16_t num_ch, const int16_t *pNum_dmx, const int16_t bands_bw, const int16_t active_w, +#ifdef LBR_SBA + const int16_t active_w_vlbr, +#endif + float *pWscale ); static void ivas_calc_post_pred_per_band( float *pppCov_mat_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], float ***mixer_mat, const int16_t num_ch, const int16_t num_dmx, const int16_t band_idx, float postpred_cov_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH] ); @@ -342,8 +353,11 @@ void ivas_spar_config( { ivas_total_brate = IVAS_32k; } - +#ifdef LBR_SBA + assert( ivas_total_brate == IVAS_32k || ivas_total_brate == IVAS_24k4 || ivas_total_brate == IVAS_16k4 || ivas_total_brate == IVAS_13k2 ); +#else assert( ivas_total_brate == IVAS_32k || ivas_total_brate == IVAS_24k4 ); +#endif if ( ivas_total_brate == IVAS_32k ) { *core_nominal_brate = ACELP_24k40; @@ -352,6 +366,16 @@ void ivas_spar_config( { *core_nominal_brate = ACELP_16k40; } +#ifdef LBR_SBA + else if ( ivas_total_brate == IVAS_16k4 ) + { + *core_nominal_brate = ACELP_13k20; + } + else if ( ivas_total_brate == IVAS_13k2 ) + { + *core_nominal_brate = ACELP_9k60; + } +#endif } return; @@ -456,6 +480,9 @@ static void ivas_get_pred_coeffs( const int16_t start_band, const int16_t end_band, const int16_t active_w, +#ifdef LBR_SBA + const int16_t active_w_vlbr, +#endif const int16_t dtx_vad, const int16_t from_dirac ) { @@ -546,7 +573,11 @@ static void ivas_get_pred_coeffs( } else { +#ifdef LBR_SBA + dm_f_local = ( active_w_vlbr ) ? IVAS_ACTIVEW_DM_F_VLBR : IVAS_ACTIVEW_DM_F; +#else dm_f_local = IVAS_ACTIVEW_DM_F; +#endif } for ( b = start_band; b < end_band; b++ ) @@ -645,6 +676,9 @@ static void ivas_get_Wscaling_factor( const int16_t *pNum_dmx, const int16_t bands_bw, const int16_t active_w, +#ifdef LBR_SBA + const int16_t active_w_vlbr, +#endif float *pWscale ) { int16_t b, ch; @@ -657,7 +691,11 @@ static void ivas_get_Wscaling_factor( } else { +#ifdef LBR_SBA + dm_f_local = ( active_w_vlbr ) ? IVAS_ACTIVEW_DM_F_SCALE_VLBR : IVAS_ACTIVEW_DM_F_SCALE; +#else dm_f_local = IVAS_ACTIVEW_DM_F_SCALE; +#endif } for ( b = start_band; b < end_band; b++ ) @@ -1533,6 +1571,9 @@ void ivas_compute_spar_params( const int16_t num_ch, const int16_t bands_bw, const int16_t active_w, +#ifdef LBR_SBA + const int16_t active_w_vlbr, +#endif ivas_spar_foa_md_com_cfg *hSparCfg, ivas_spar_md_t *hSparMd, float *pWscale, @@ -1541,8 +1582,11 @@ void ivas_compute_spar_params( float pred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS]; int16_t b, i, ndm; ivas_get_pred_coeffs( pppCov_mat_re, pred_coeffs_re, dm_fv_re, num_ch, - start_band, end_band, active_w, dtx_vad, - from_dirac ); + start_band, end_band, active_w, +#ifdef LBR_SBA + active_w_vlbr, +#endif + dtx_vad, from_dirac ); #ifdef SPAR_HOA_DBG /*fprintf(stderr, "\n\n Prediction Coefficients:\n"); @@ -1573,7 +1617,11 @@ void ivas_compute_spar_params( #endif ivas_get_Wscaling_factor( pppCov_mat_re, pred_coeffs_re, mixer_mat, start_band, end_band, dtx_vad, num_ch, - hSparCfg->num_dmx_chans_per_band, bands_bw, active_w, pWscale ); + hSparCfg->num_dmx_chans_per_band, bands_bw, active_w, +#ifdef LBR_SBA + active_w_vlbr, +#endif + pWscale ); for ( b = start_band; b < end_band; b++ ) { @@ -1642,7 +1690,13 @@ void ivas_get_spar_md_from_dirac( const int16_t end_band, const int16_t order, const int16_t dtx_vad, - float Wscale_d[IVAS_MAX_NUM_BANDS] ) + float Wscale_d[IVAS_MAX_NUM_BANDS] +#ifdef LBR_SBA + , + const uint8_t useLowerRes, + const int16_t active_w_vlbr +#endif +) { int16_t num_ch, band, i, j; int16_t block, ch; @@ -1677,8 +1731,11 @@ void ivas_get_spar_md_from_dirac( } ppMixer_mat[i] = pMixer_mat[i]; } - +#ifdef LBR_SBA + if ( ( start_band >= 6 && hSpar_md_cfg->nchan_transport <= 2 && ( dtx_vad == 1 ) ) || ( useLowerRes && start_band >= 3 && hSpar_md_cfg->nchan_transport <= 2 && ( dtx_vad == 1 ) ) ) +#else if ( start_band >= 6 && hSpar_md_cfg->nchan_transport <= 2 && ( dtx_vad == 1 ) ) +#endif { float P_norm[3]; int16_t idx; @@ -1740,6 +1797,12 @@ void ivas_get_spar_md_from_dirac( { ivas_dirac_dec_get_response( (int16_t) azi_dirac[band][i_ts], (int16_t) ele_dirac[band][i_ts], response_avg, order ); } +#ifdef LBR_SBA + else if (useLowerRes) + { + ivas_dirac_dec_get_response( (int16_t) azi_dirac[band][0], (int16_t) ele_dirac[band][0], response_avg, order ); + } +#endif else { for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ ) @@ -1900,7 +1963,11 @@ void ivas_get_spar_md_from_dirac( #endif ivas_compute_spar_params( pCov_real, dm_fv_re, i_ts, ppMixer_mat, start_band, end_band, dtx_vad, - num_ch, 1, hSpar_md_cfg->active_w, hSpar_md_cfg, hSpar_md, Wscale, 1 ); + num_ch, 1, hSpar_md_cfg->active_w, +#ifdef LBR_SBA + active_w_vlbr, +#endif + hSpar_md_cfg, hSpar_md, Wscale, 1 ); if ( mixer_mat != NULL ) { diff --git a/lib_com/options.h b/lib_com/options.h index 5ee8fff0cd4861b95f345aa381a3192dfca4a698..d5812b3bd9bbdf8311241bfa0e6ed4a329d38235 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -60,7 +60,7 @@ /*#define MEM_COUNT_DETAILS*/ /* RAM counting tool: print per sub-structure details */ -/*#define DEBUG_MODE_INFO*/ /* output most important parameters to the subdirectory "res/" */ +#define DEBUG_MODE_INFO /* output most important parameters to the subdirectory "res/" */ #ifdef DEBUG_MODE_INFO /*#define DEBUG_MODE_ACELP*/ /* output most important ACELP core parameters to the subdirectory "res/" */ /*#define DEBUG_MODE_TCX*/ /* output most important TCX core parameters to the subdirectory "res/" */ @@ -115,6 +115,7 @@ /*#define TDREND_STANDALONE*/ /* Used when renderer is built in standalone form, without IVAS encoding/decoding (see scripts/object_renderer_standalone). This is just here to ensure this is cleaned out by prepare_instrumentation.sh */ /*#define DEBUG_SPAR_FOA*/ /* debug SPAR in-out */ +/*#define DEBUG_LBR_SBA*/ /* debug low bitrate SBA (SPAR+DirAC) */ #ifdef DEBUG_SPAR_FOA /*#define DEBUG_SPAR_MD_TARGET_TUNING*/ /* SPAR MD target bitrate tuning debug code */ /*#define DEBUG_SPAR_BYPASS_EVS_CODEC*/ /* bypass EVS coding in float precision, emulating EVS encoder/decoder delay */ @@ -146,7 +147,14 @@ /*#define FIX_IVAS_185_MDCT_ST_PLC_FADEOUT*/ /* IVAS-185 fix bug in TCX-PLC fadeout for MDCT-Stereo and improve fadeout by fading to background noise instead of white noise */ /*#define FIX_IVAS_180_PLC_SIGNAL_LAST_OVLP_IN_TCX10*/ /* IVAS-180 write last overlap mode in TCX10 frames to allow for correct TCX10/TCX5 subframe decomposition in TCX10 frames after a lost frame */ /*#define FIX_I1_113*/ /* under review : MCT bit distribution optimization for SBA high bitrates*/ - +#define LBR_SBA /* Contribution 47: Master macro for low bitrate SBA (SPAR+DirAC) */ +#ifdef LBR_SBA +#define LBR_SBA_DM_COV_FIX /* Covariance smoothing and resetting fixes proposed at higher bitrates */ +#ifdef LBR_SBA_DM_COV_FIX +#define LBR_SBA_EXTRA_COV_SMOOTH /* Extra covariance smoothing for low bitrate SBA */ +#endif +/*#define LBR_SBA_PLANAR*/ /* Converting low bitrate SBA modes to Planar */ +#endif /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ #endif diff --git a/lib_dec/ivas_dec.c b/lib_dec/ivas_dec.c index c669a281a4b780c11f643f2f3c5622c9c4cd8ffb..f852eeed269e75cc3448c2adcefad9cec335ff9d 100644 --- a/lib_dec/ivas_dec.c +++ b/lib_dec/ivas_dec.c @@ -279,7 +279,17 @@ ivas_error ivas_dec( return error; } } - +#ifdef DEBUG_LBR_SBA + /* SCE Decoder Output */ + for ( int t = 0; t < 960; t++ ) + { + for ( int c = 0; c < st_ivas->nchan_transport; c++ ) + { + float val = output[c][t] / MAX16B_FLT; + dbgwrite( &val , sizeof( float ), 1, 1, "int_dec_core_out.raw" ); + } + } +#endif /* TCs remapping */ nchan_remapped = st_ivas->nchan_transport; if ( st_ivas->sba_dirac_stereo_flag ) diff --git a/lib_dec/ivas_sba_rendering.c b/lib_dec/ivas_sba_rendering.c index 8883e8d78f9f7599b36fd7609932f2034735faa7..3d7b0a84fed04e421eea4377f86f590204d43b61 100644 --- a/lib_dec/ivas_sba_rendering.c +++ b/lib_dec/ivas_sba_rendering.c @@ -276,7 +276,11 @@ void ivas_sba_upmixer_renderer( #ifdef DEBUGGING if ( clip > 1.0f ) { +#ifdef DEBUG_LBR_SBA + fprintf( stdout, "IVAS Crend Clipped: max gain = %f\n", clip ); +#else fprintf( stderr, "IVAS Crend Clipped: max gain = %f\n", clip ); +#endif } #endif diff --git a/lib_dec/ivas_spar_foa_dec.c b/lib_dec/ivas_spar_foa_dec.c index 1adcc883d4b7cce97378fa9e7b17d85d375b74f4..a96595abc08b6a9c1cc827a9c161574ab5695200 100644 --- a/lib_dec/ivas_spar_foa_dec.c +++ b/lib_dec/ivas_spar_foa_dec.c @@ -965,7 +965,26 @@ void ivas_spar_foa_dec_upmixer( ivas_spar_foa_dec_gen_umx_mat( pState->hMdDec, nchan_transport, num_bands_out, st_ivas->bfi ); - +#ifdef DEBUG_LBR_SBA + fprintf( stdout, "\n\mMixer matrix:\n\n" ); + for (int b = 0; b < IVAS_MAX_NUM_BANDS; b++) + { + fprintf( stdout, "band %d:\n", b ); + for (int i = 0; i < 4; i++) + { + for (int j = 0; j < 4; j++) + { + fprintf( stdout, "%f,\t", pState->hMdDec->mixer_mat[i][j][b] ); + } + if (i > 0 && b % 2 == 0) + { + fprintf( stdout, "%f,\t%f\t", pState->hMdDec->spar_md.band_coeffs[b/2].pred_re[i-1], pState->hMdDec->spar_md.band_coeffs[b/2].P_re[i-1] ); + } + fprintf( stdout, "\n" ); + } + fprintf( stdout, "\n" ); + } +#endif /*---------------------------------------------------------------------* * CLDFB Processing and Synthesis *---------------------------------------------------------------------*/ diff --git a/lib_dec/ivas_spar_foa_md_dec.c b/lib_dec/ivas_spar_foa_md_dec.c index 861a0fbb46b5a3350015c9bc9b9d64b896fbf6ae..5fc28916bf8916a62f2fe0bd323c8f5224371c71 100644 --- a/lib_dec/ivas_spar_foa_md_dec.c +++ b/lib_dec/ivas_spar_foa_md_dec.c @@ -64,11 +64,27 @@ static const int16_t ivas_spar_dec_plc_spatial_target[IVAS_SPAR_MAX_CH] = { 1, 0 * Static functions declaration *------------------------------------------------------------------------------------------*/ -static void ivas_get_spar_matrices( ivas_spar_foa_md_dec_state_t *pState, const int16_t num_bands_out, const int16_t n_ts, const int16_t bw, const int16_t dtx_vad, const int16_t nB, const int16_t sba_order ); +static void ivas_get_spar_matrices( ivas_spar_foa_md_dec_state_t *pState, const int16_t num_bands_out, const int16_t n_ts, const int16_t bw, const int16_t dtx_vad, const int16_t nB, const int16_t sba_order +#ifdef LBR_SBA + , + const int16_t active_w_vlbr +#endif +); -static void ivas_decode_arith_bs( ivas_spar_foa_md_dec_state_t *pState, Decoder_State *st, const uint16_t qsi, const int16_t nB, const int16_t bands_bw, int16_t *pDo_diff, const int16_t freq_diff, const int16_t planarCP ); +static void ivas_decode_arith_bs( ivas_spar_foa_md_dec_state_t *pState, Decoder_State *st, const uint16_t qsi, const int16_t nB, const int16_t bands_bw, int16_t *pDo_diff, const int16_t freq_diff, const int16_t planarCP +#ifdef LBR_SBA + , + const int16_t strat, + const int32_t ivas_total_brate +#endif +); -static void ivas_decode_huffman_bs( ivas_spar_foa_md_dec_state_t *pState, Decoder_State *st, const uint16_t qsi, const int16_t nB, const int16_t bands_bw, const int16_t planarCP ); +static void ivas_decode_huffman_bs( ivas_spar_foa_md_dec_state_t *pState, Decoder_State *st, const uint16_t qsi, const int16_t nB, const int16_t bands_bw, const int16_t planarCP +#ifdef LBR_SBA_PLANAR + , + const int32_t ivas_total_brate +#endif +); static void ivas_fill_band_coeffs_idx( ivas_band_coeffs_ind_t *pBands_idx, const int16_t nB, int16_t *pSymbol_re, ivas_cell_dim_t *pCell_dims, ivas_coeffs_type_t coeff_type, const int16_t planarCP ); @@ -606,7 +622,10 @@ void ivas_spar_foa_md_dec_process( { int16_t j, b, bw, dtx_vad, nB, i_ts; ivas_spar_foa_md_dec_state_t *hMdDec = st_ivas->hSpar->hSparFoa->hMdDec; - +#ifdef LBR_SBA + int16_t active_w_vlbr; + active_w_vlbr = ( st_ivas->hDecoderConfig->ivas_total_brate < IVAS_24k4 ) ? 1 : 0; +#endif ivas_spar_foa_dec_parse_md_bs( hMdDec, st0, &nB, &bw, &dtx_vad, st_ivas->hDecoderConfig->ivas_total_brate, ivas_spar_br_table_consts[hMdDec->table_idx].usePlanarCoeff, st_ivas->hQMetaData->sba_inactive_mode ); @@ -614,7 +633,12 @@ void ivas_spar_foa_md_dec_process( /* SPAR to DirAC and DirAC to SPAR conversion */ if ( st_ivas->sba_mode == SBA_MODE_SPAR ) { - ivas_spar_to_dirac( st_ivas, hMdDec, dtx_vad, num_bands_out ); + ivas_spar_to_dirac( st_ivas, hMdDec, dtx_vad, num_bands_out +#ifdef LBR_SBA + , + bw +#endif + ); /* set correct number of bands*/ nB = IVAS_MAX_NUM_BANDS; @@ -623,7 +647,39 @@ void ivas_spar_foa_md_dec_process( nB = nB >> 1; } } +#ifdef DEBUG_LBR_SBA + /* Dumping SPAR Coefficients */ + char f_name[100]; + int16_t nbands = 6; + int16_t num_subframes = 1; + int16_t num_elements = 6; + int16_t num_block_group = 1; + int16_t byte_size = sizeof( float ); + sprintf( f_name, "SBA_MD_values_dec.bin" ); + ( frame == 0 ) ? dbgwrite( &nbands, sizeof( nbands ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &num_elements, sizeof( num_elements ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &num_subframes, sizeof( num_subframes ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &num_block_group, sizeof( num_block_group ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &byte_size, sizeof( byte_size ), 1, 1, f_name ) : false; + + for ( b = 0; b < nbands; b++ ) + { + for ( int16_t sf = 0; sf < num_subframes; sf++ ) + { + for ( int16_t bl = 0; bl < num_block_group; bl++ ) + { + dbgwrite( &hMdDec->spar_md.band_coeffs[b].pred_re[0], byte_size, 1, 1, f_name ); + dbgwrite( &hMdDec->spar_md.band_coeffs[b].pred_re[1], byte_size, 1, 1, f_name ); + dbgwrite( &hMdDec->spar_md.band_coeffs[b].pred_re[2], byte_size, 1, 1, f_name ); + dbgwrite( &hMdDec->spar_md.band_coeffs[b].P_re[0], byte_size, 1, 1, f_name ); + dbgwrite( &hMdDec->spar_md.band_coeffs[b].P_re[1], byte_size, 1, 1, f_name ); + dbgwrite( &hMdDec->spar_md.band_coeffs[b].P_re[2], byte_size, 1, 1, f_name ); + // fprintf(stdout, "%f\t%f\t%f\t%d\t%d\n", dirac_md_kbps, spar_md_kbps, sba_md_kbps, qsi, code_strat ); + } + } + } +#endif /* expand DirAC MD to all time slots */ for ( i_ts = 1; i_ts < MAX_PARAM_SPATIAL_SUBFRAMES; i_ts++ ) { @@ -648,8 +704,43 @@ void ivas_spar_foa_md_dec_process( } } } - - ivas_get_spar_matrices( hMdDec, num_bands_out, MAX_PARAM_SPATIAL_SUBFRAMES, bw, dtx_vad, nB, sba_order ); +#ifdef DEBUG_LBR_SBA + /*for ( int b = 0; b < nB; b++ ) + { + int16_t ndec = hMdDec->spar_md_cfg.num_decorr_per_band[( bw ) * b]; + int16_t ndm = hMdDec->spar_md_cfg.num_dmx_chans_per_band[( bw ) * b]; + fprintf( stdout, "\n\n POST DIRAC Metadata PR (15x1), C(15x15), P(15x15): band %d\n", b ); + for ( int i = 0; i < ndm + ndec - 1; i++ ) + { + fprintf( stdout, "i: %d -- %.2f\t|\t", i, hMdDec->spar_md.band_coeffs[b].pred_re[i] ); + if ( i < ndec ) + { + if ( keep_planar[i] == 1 ) + { + fprintf( stdout, ">>" ); + } + else + { + fprintf( stdout, " " ); + } + for ( j = 0; j < ndm - 1; j++ ) + { + fprintf( stdout, "%.2f\t", hMdDec->spar_md.band_coeffs[b].C_re[i][j] ); + } + fprintf( stdout, "|\t" ); + fprintf( stdout, "%.2f", hMdDec->spar_md.band_coeffs[b].P_re[i] ); + } + fprintf( stdout, "\n" ); + } + fprintf( stdout, "\n" ); + }*/ +#endif + ivas_get_spar_matrices( hMdDec, num_bands_out, MAX_PARAM_SPATIAL_SUBFRAMES, bw, dtx_vad, nB, sba_order +#ifdef LBR_SBA + , + active_w_vlbr +#endif + ); #ifdef DEBUG_SPAR_DIRAC_WRITE_OUT_PRED_PARS { @@ -663,6 +754,12 @@ void ivas_spar_foa_md_dec_process( } #endif +#ifdef LBR_SBA + if ( bw == IVAS_RED_BAND_FACT ) + { + nB = nB << 1; + } +#endif for ( b = nB; b < num_bands_out; b++ ) { hMdDec->valid_bands[b] = 1; @@ -896,7 +993,12 @@ static void ivas_get_spar_matrices( const int16_t bw, const int16_t dtx_vad, const int16_t nB, - const int16_t sba_order ) + const int16_t sba_order +#ifdef LBR_SBA + , + const int16_t active_w_vlbr +#endif +) { int16_t numch_out, num_bands, dmx_ch; int16_t i, j, k, m, b, i_ts, active_w; @@ -939,10 +1041,18 @@ static void ivas_get_spar_matrices( } }*/ #endif - +#ifdef LBR_SBA + if ( bw == IVAS_RED_BAND_FACT ) + { + num_bands = num_bands >> 1; + } +#endif active_w = pState->spar_md_cfg.active_w; +#ifdef LBR_SBA + active_w_dm_fac = ( dtx_vad == 0 ) ? IVAS_ACTIVEW_DM_F_SCALE_DTX : ( ( active_w_vlbr ) ? IVAS_ACTIVEW_DM_F_SCALE_VLBR : IVAS_ACTIVEW_DM_F_SCALE ); +#else active_w_dm_fac = ( dtx_vad == 0 ) ? IVAS_ACTIVEW_DM_F_SCALE_DTX : IVAS_ACTIVEW_DM_F_SCALE; - +#endif for ( i_ts = 0; i_ts < n_ts; i_ts++ ) { for ( i = 0; i < numch_out; i++ ) @@ -954,12 +1064,12 @@ static void ivas_get_spar_matrices( set_zero( &pState->spar_coeffs.P_re[i][j][i_ts * IVAS_MAX_NUM_BANDS], IVAS_MAX_NUM_BANDS ); } } - +#ifndef LBR_SBA if ( bw == IVAS_RED_BAND_FACT ) { num_bands = num_bands >> 1; } - +#endif num_bands = min( num_bands, nB ); for ( b = 0; b < num_bands; b++ ) @@ -1341,20 +1451,22 @@ void ivas_spar_foa_dec_gen_umx_mat( } } } -#ifdef SPAR_HOA_DBG - - /* for ( b = 0; b < 1; b++) +#ifdef DEBUG_LBR_SBA // SPAR_HOA_DBG + /*for ( i_ts = 3; i_ts < MAX_PARAM_SPATIAL_SUBFRAMES; i_ts++ ) { - fprintf( stdout, "\n\nMixer Matrix band %d\n\n", b ); - for ( i = 0; i < num_out_ch; i++ ) + for ( b = 0; b < 12; b++) { - for ( j = 0; j < num_out_ch; j++ ) + fprintf( stdout, "\n\nMixer Matrix band %d\n\n", b ); + for ( i = 0; i < num_out_ch; i++ ) { - fprintf( stdout, "%.2f,\t", pState->mixer_mat[i][j][0][b] ); + for ( j = 0; j < num_out_ch; j++ ) + { + fprintf( stdout, "%.2f,\t", pState->mixer_mat[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] ); + } + fprintf( stdout, "\n" ); } fprintf( stdout, "\n" ); } - fprintf( stdout, "\n" ); }*/ #endif @@ -1387,6 +1499,9 @@ static void ivas_spar_foa_dec_parse_md_bs( int16_t strat, freq_diff, no_ec; int16_t do_diff[IVAS_MAX_NUM_BANDS]; int16_t planarCP = 0; +#ifdef LBR_SBA + int16_t do_repeat[IVAS_MAX_NUM_BANDS]; +#endif *dtx_vad = 1; *bands_bw = 1; @@ -1435,6 +1550,9 @@ static void ivas_spar_foa_dec_parse_md_bs( if ( *dtx_vad == 0 ) { +#ifdef DEBUG_LBR_SBA + fprintf( stdout, "\nDTX Frame\n" ); +#endif *nB = SPAR_DTX_BANDS; *bands_bw = num_bands / *nB; @@ -1509,6 +1627,9 @@ static void ivas_spar_foa_dec_parse_md_bs( for ( i = 0; i < *nB; i++ ) { do_diff[i] = 0; +#ifdef LBR_SBA + do_repeat[i] = 0; +#endif } } else if ( strat < 4 ) @@ -1518,20 +1639,50 @@ static void ivas_spar_foa_dec_parse_md_bs( for ( i = 0; i < *nB; i++ ) { do_diff[i] = 0; +#ifdef LBR_SBA + do_repeat[i] = 0; +#endif } no_ec = 1; } else { - *bands_bw = 1; - *nB = num_bands; +#ifdef LBR_SBA + if ( ivas_total_brate < IVAS_24k4 ) + { + *bands_bw = 2; + *nB = num_bands / *bands_bw; + + for ( i = 0; i < *nB; i++ ) + { + do_diff[i] = 0; + do_repeat[i] = ( ( strat % 2 ) == ( ( i + 1 ) % 2 ) ); + } + } + else +#endif + { + *bands_bw = 1; + *nB = num_bands; +#ifdef LBR_SBA + for ( i = 0; i < *nB; i++ ) + { + do_diff[i] = ( ( ( i + 1 ) & 3 ) != strat - 4 ); + do_repeat[i] = 0; + } + + ivas_map_prior_coeffs_quant( &pState->spar_md_prev, &pState->spar_md_cfg, qsi, *nB ); +#endif + } +#ifndef LBR_SBA for ( i = 0; i < *nB; i++ ) { do_diff[i] = ( ( ( i + 1 ) & 3 ) != strat - 4 ); } ivas_map_prior_coeffs_quant( &pState->spar_md_prev, &pState->spar_md_cfg, qsi, *nB ); +#endif } #ifdef SPAR_HOA_DBG fprintf( stdout, "\n\n no_ec = %d, strat = %d\n", no_ec, strat ); @@ -1540,11 +1691,21 @@ static void ivas_spar_foa_dec_parse_md_bs( if ( no_ec == 0 ) { - ivas_decode_arith_bs( pState, st0, qsi, *nB, *bands_bw, do_diff, freq_diff, planarCP ); + ivas_decode_arith_bs( pState, st0, qsi, *nB, *bands_bw, do_diff, freq_diff, planarCP +#ifdef LBR_SBA + , + strat, ivas_total_brate +#endif + ); } else { - ivas_decode_huffman_bs( pState, st0, qsi, *nB, *bands_bw, planarCP ); + ivas_decode_huffman_bs( pState, st0, qsi, *nB, *bands_bw, planarCP +#ifdef LBR_SBA_PLANAR + , + ivas_total_brate +#endif + ); } for ( i = 0; i < *nB; i++ ) @@ -1630,7 +1791,15 @@ static void ivas_spar_foa_dec_parse_md_bs( pState->spar_md.band_coeffs[i].P_re[j] = coeff_decd[j]; } +#ifdef LBR_SBA + pState->valid_bands[*bands_bw * i] |= ( do_diff[i] == 0 && do_repeat[i] == 0 ) ? 1 : 0; + for ( j = 1; j < *bands_bw; j++ ) + { + pState->valid_bands[*bands_bw * i + j] = pState->valid_bands[*bands_bw * i]; + } +#else pState->valid_bands[i] |= ( do_diff[i] == 0 ) ? 1 : 0; +#endif } } else @@ -1644,14 +1813,14 @@ static void ivas_spar_foa_dec_parse_md_bs( pState->valid_bands[i] = 1; } } -#ifdef SPAR_HOA_DBG +#ifdef DEBUG_LBR_SBA // SPAR_HOA_DBG int16_t b; b = 0; - /* if (0) + // if (0) { for ( b = 0; b < *nB; b++ ) { - int16_t ndec = pState->spar_md_cfg.num_decorr_per_band[(*bands_bw) * b]; + /*int16_t ndec = pState->spar_md_cfg.num_decorr_per_band[(*bands_bw) * b]; int16_t ndm = pState->spar_md_cfg.num_dmx_chans_per_band[(*bands_bw) * b]; fprintf(stdout, "\n\nMETADATA PR: band %d, qsi %d\n\n", b, qsi); for (i = 0; i < ndm + ndec - 1; i++) @@ -1678,12 +1847,12 @@ static void ivas_spar_foa_dec_parse_md_bs( for (i = 0; i < ndec; i++) { fprintf(stdout, "i: %d -- %f\t %d\t %d\n", i, - pState->spar_md.band_coeffs[b].P_re[i][i], + pState->spar_md.band_coeffs[b].P_re[i], pState->spar_md_prev.band_coeffs_idx[b].decd_index_re[i], pState->spar_md.band_coeffs_idx[b].decd_index_re[i]); } - fprintf(stdout, "\n\n"); - int16_t ndec = pState->spar_md_cfg.num_decorr_per_band[( *bands_bw ) * b]; + fprintf(stdout, "\n\n");*/ + /*int16_t ndec = pState->spar_md_cfg.num_decorr_per_band[( *bands_bw ) * b]; int16_t ndm = pState->spar_md_cfg.num_dmx_chans_per_band[( *bands_bw ) * b]; fprintf( stdout, "\n\n Metadata PR (15x1), C(15x15), P(15x15): band %d\n", b ); for ( i = 0; i < ndm + ndec - 1; i++ ) @@ -1704,16 +1873,13 @@ static void ivas_spar_foa_dec_parse_md_bs( fprintf( stdout, "%.2f\t", pState->spar_md.band_coeffs[b].C_re[i][j] ); } fprintf( stdout, "|\t" ); - for ( j = 0; j < ndec; j++ ) - { - fprintf( stdout, "%.2f\t", pState->spar_md.band_coeffs[b].P_re[i][j] ); - } + fprintf( stdout, "%.2f", pState->spar_md.band_coeffs[b].P_re[i] ); } fprintf( stdout, "\n" ); } - fprintf( stdout, "\n" ); + fprintf( stdout, "\n" );*/ } - }*/ + } #endif return; @@ -1734,7 +1900,13 @@ static void ivas_decode_arith_bs( const int16_t bands_bw, int16_t *pDo_diff, const int16_t freq_diff, - const int16_t planarCP ) + const int16_t planarCP +#ifdef LBR_SBA + , + const int16_t strat, + const int32_t ivas_total_brate +#endif +) { int16_t i, ndm, ndec; ivas_cell_dim_t pred_cell_dims[IVAS_MAX_NUM_BANDS]; @@ -1747,17 +1919,40 @@ static void ivas_decode_arith_bs( for ( i = 0; i < nB; i++ ) { - ndm = pState->spar_md_cfg.num_dmx_chans_per_band[bands_bw * i]; - ndec = pState->spar_md_cfg.num_decorr_per_band[bands_bw * i]; +#ifdef LBR_SBA + if ( ( ivas_total_brate < IVAS_24k4 ) && ( strat > 3 ) && ( ( ( i % 2 == 1 ) && ( strat % 2 == 0 ) ) || ( ( i % 2 == 0 ) && ( strat % 2 == 1 ) ) ) ) + { + pred_cell_dims[i].dim1 = 0; + pred_cell_dims[i].dim2 = 0; + drct_cell_dims[i].dim1 = 0; + drct_cell_dims[i].dim2 = 0; + decd_cell_dims[i].dim1 = 0; + decd_cell_dims[i].dim2 = 0; + decx_cell_dims[i].dim1 = 0; + decx_cell_dims[i].dim2 = 0; + } + else +#endif + { + ndm = pState->spar_md_cfg.num_dmx_chans_per_band[bands_bw * i]; + ndec = pState->spar_md_cfg.num_decorr_per_band[bands_bw * i]; - pred_cell_dims[i].dim1 = ndm + ndec - 1; - pred_cell_dims[i].dim2 = 1; - drct_cell_dims[i].dim1 = ndec; - drct_cell_dims[i].dim2 = ndm - 1; - decd_cell_dims[i].dim1 = ndec; - decd_cell_dims[i].dim2 = 1; - decx_cell_dims[i].dim1 = ( ndec * ( ndec - 1 ) ) >> 1; - decx_cell_dims[i].dim2 = 1; + pred_cell_dims[i].dim1 = ndm + ndec - 1; + pred_cell_dims[i].dim2 = 1; + drct_cell_dims[i].dim1 = ndec; + drct_cell_dims[i].dim2 = ndm - 1; + decd_cell_dims[i].dim1 = ndec; + decd_cell_dims[i].dim2 = 1; + decx_cell_dims[i].dim1 = ( ndec * ( ndec - 1 ) ) >> 1; + decx_cell_dims[i].dim2 = 1; +#ifdef LBR_SBA_PLANAR + if ( ivas_total_brate < IVAS_24k4 ) + { + pred_cell_dims[i].dim1 -= 1; + decd_cell_dims[i].dim1 -= 1; + } +#endif + } } for ( i = 0; i < nB; i++ ) @@ -1832,7 +2027,20 @@ static void ivas_decode_arith_bs( ivas_get_band_idx_from_differential( &pState->spar_md, pState->spar_md_cfg.quant_strat->P_r.q_levels, 1, nB, DECD_COEFF ); ivas_get_band_idx_from_differential( &pState->spar_md, pState->spar_md_cfg.quant_strat->P_c.q_levels, 0, nB, DECX_COEFF ); } - +#ifdef LBR_SBA_PLANAR + if ( ivas_total_brate < IVAS_24k4 ) + { + for ( i = 0; i < nB; i++ ) /* restore X PR index, force Z PR, P indices to be zero.*/ + { + if ( ( strat < 3 ) || ( ( strat > 3 ) && ( ( ( i % 2 == 0 ) && ( strat % 2 == 0 ) ) || ( ( i % 2 == 1 ) && ( strat % 2 == 1 ) ) ) ) ) + { + pState->spar_md.band_coeffs_idx[i].pred_index_re[2] = pState->spar_md.band_coeffs_idx[i].pred_index_re[1]; + pState->spar_md.band_coeffs_idx[i].pred_index_re[1] = 0; + } + pState->spar_md.band_coeffs_idx[i].decd_index_re[2] = 0; /* shouldn't be needed */ + } + } +#endif return; } @@ -2010,7 +2218,12 @@ static void ivas_decode_huffman_bs( const uint16_t qsi, const int16_t nB, const int16_t bands_bw, - const int16_t planarCP ) + const int16_t planarCP +#ifdef LBR_SBA_PLANAR + , + const int32_t ivas_total_brate +#endif +) { int16_t i, j; @@ -2028,8 +2241,19 @@ static void ivas_decode_huffman_bs( for ( j = 0; j < pred_dim; j++ ) { - ivas_huffman_decode( &pState->huff_coeffs.pred_huff_re[qsi], st0, - &pState->spar_md.band_coeffs_idx[i].pred_index_re[j] ); +#ifdef LBR_SBA_PLANAR + if ( ( j == 1 ) && ( ivas_total_brate < IVAS_24k4 ) ) + { + pState->spar_md.band_coeffs_idx[i].pred_index_re[j] = 0; + } + else + { +#endif + ivas_huffman_decode( &pState->huff_coeffs.pred_huff_re[qsi], st0, + &pState->spar_md.band_coeffs_idx[i].pred_index_re[j] ); +#ifdef LBR_SBA_PLANAR + } +#endif } for ( j = 0; j < drct_dim; j++ ) @@ -2047,7 +2271,11 @@ static void ivas_decode_huffman_bs( for ( j = 0; j < decd_dim; j++ ) { +#ifdef LBR_SBA_PLANAR + if ( ( planarCP && !keep_planar[j] ) || ( ( j == 2 ) && ( ivas_total_brate < IVAS_24k4 ) ) ) +#else if ( planarCP && !keep_planar[j] ) +#endif { pState->spar_md.band_coeffs_idx[i].decd_index_re[j] = 0; } @@ -2498,6 +2726,10 @@ void ivas_spar_to_dirac( ivas_spar_foa_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ const int16_t dtx_vad, /* i : DTX frame flag */ const int16_t num_bands_out /* i : number of output bands */ +#ifdef LBR_SBA + , + const int16_t bw /* i : band joining factor */ +#endif ) { DIRAC_DEC_HANDLE hDirAC; @@ -2527,12 +2759,21 @@ void ivas_spar_to_dirac( sba_order_internal = min( st_ivas->sba_order, IVAS_MAX_SBA_ORDER ); start_band = 0; +#ifdef LBR_SBA + end_band = min( num_bands_out, SPAR_DIRAC_SPLIT_START_BAND ) / bw; + + hDirAC = st_ivas->hDirAC; + dirac_to_spar_md_bands = st_ivas->hSpar->hSparFoa->dirac_to_spar_md_bands; + enc_param_start_band = st_ivas->hSpar->hSparFoa->enc_param_start_band / bw; + int16_t active_w_vlbr; + active_w_vlbr = ( st_ivas->hDecoderConfig->ivas_total_brate < IVAS_24k4 ) ? 1 : 0; +#else end_band = min( num_bands_out, SPAR_DIRAC_SPLIT_START_BAND ); hDirAC = st_ivas->hDirAC; dirac_to_spar_md_bands = st_ivas->hSpar->hSparFoa->dirac_to_spar_md_bands; enc_param_start_band = st_ivas->hSpar->hSparFoa->enc_param_start_band; - +#endif if ( hDirAC != NULL ) { band_grouping = hDirAC->band_grouping; @@ -2580,7 +2821,11 @@ void ivas_spar_to_dirac( } else { +#ifdef LBR_SBA + f_scale = ( st_ivas->hDecoderConfig->ivas_total_brate < IVAS_24k4 ) ? IVAS_ACTIVEW_DM_F_SCALE_VLBR : IVAS_ACTIVEW_DM_F_SCALE; +#else f_scale = IVAS_ACTIVEW_DM_F_SCALE; +#endif } } else @@ -2688,13 +2933,27 @@ void ivas_spar_to_dirac( } /*read DirAC metadata, convert DirAC to SPAR*/ +#ifdef LBR_SBA + for ( ; band < num_bands_out / bw; band++ ) +#else for ( ; band < num_bands_out; band++ ) +#endif { int16_t dirac_band_idx; dirac_band_idx = dirac_to_spar_md_bands[band] - enc_param_start_band; +#ifdef LBR_SBA + int16_t num_subframes; + num_subframes = MAX_PARAM_SPATIAL_SUBFRAMES; + if ( st_ivas->hQMetaData->useLowerRes ) + { + num_subframes = 1; + } + for ( block = 0; block < num_subframes; block++ ) +#else for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ ) +#endif { if ( st_ivas->hQMetaData->q_direction->band_data[dirac_band_idx].azimuth[block] < 0.f ) { @@ -2711,7 +2970,12 @@ void ivas_spar_to_dirac( if ( hMdDec->spar_md_cfg.nchan_transport > 1 ) { ivas_get_spar_md_from_dirac( azi_dirac, ele_dirac, diffuseness, 1, NULL, &hMdDec->spar_md, &hMdDec->spar_md_cfg, - end_band, num_bands_out, sba_order_internal, dtx_vad, NULL ); + end_band, num_bands_out, sba_order_internal, dtx_vad, NULL +#ifdef LBR_SBA + , + st_ivas->hQMetaData->useLowerRes, active_w_vlbr +#endif + ); /* temporarily copy frame-wise prediction coefficients in DirAC bands*/ for ( pred_idx = 0; pred_idx < FOA_CHANNELS - 1; pred_idx++ ) @@ -2722,10 +2986,68 @@ void ivas_spar_to_dirac( } } } +#ifdef LBR_SBA + int16_t num_subframes; + num_subframes = MAX_PARAM_SPATIAL_SUBFRAMES; + if ( st_ivas->hQMetaData->useLowerRes ) + { + num_subframes = 1; + } + ivas_get_spar_md_from_dirac( azi_dirac, ele_dirac, diffuseness, num_subframes, NULL, &hMdDec->spar_md, &hMdDec->spar_md_cfg, + end_band, num_bands_out / bw, sba_order_internal, dtx_vad, NULL, st_ivas->hQMetaData->useLowerRes, active_w_vlbr ); + if ( st_ivas->hQMetaData->useLowerRes && dtx_vad ) + { + for ( band = SPAR_DIRAC_SPLIT_START_BAND; band < IVAS_MAX_NUM_BANDS; band++ ) + { + for ( block = 1; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ ) + { + for ( int16_t i = 0; i < FOA_CHANNELS - 1; i++ ) /* pred coefficient index (index 0, 1, 2 predicts Y, Z, X respectively) */ + { + hMdDec->spar_md.band_coeffs[band + block * IVAS_MAX_NUM_BANDS].pred_re[i] = hMdDec->spar_md.band_coeffs[band].pred_re[i]; + } + for ( int16_t i = 0; i < FOA_CHANNELS - 1; i++ ) /* pred coefficient index (index 0, 1, 2 predicts Y, Z, X respectively) */ + { + hMdDec->spar_md.band_coeffs[band + block * IVAS_MAX_NUM_BANDS].P_re[i] = hMdDec->spar_md.band_coeffs[band].P_re[i]; + } + } + } + } +#else ivas_get_spar_md_from_dirac( azi_dirac, ele_dirac, diffuseness, MAX_PARAM_SPATIAL_SUBFRAMES, NULL, &hMdDec->spar_md, &hMdDec->spar_md_cfg, end_band, num_bands_out, sba_order_internal, dtx_vad, NULL ); - +#endif +#ifdef DEBUG_LBR_SBA // SPAR_HOA_DBG + /*for ( int b = 0; b < num_bands_out / bw; b++ ) + { + int16_t ndec = hMdDec->spar_md_cfg.num_decorr_per_band[( bw ) * b]; + int16_t ndm = hMdDec->spar_md_cfg.num_dmx_chans_per_band[( bw ) * b]; + fprintf( stdout, "\n\n Metadata PR (15x1), C(15x15), P(15x15): band %d\n", b ); + for ( int i = 0; i < ndm + ndec - 1; i++ ) + { + fprintf( stdout, "i: %d -- %.2f\t|\t", i, hMdDec->spar_md.band_coeffs[b].pred_re[i] ); + if ( i < ndec ) + { + if ( keep_planar[i] == 1 ) + { + fprintf( stdout, ">>" ); + } + else + { + fprintf( stdout, " " ); + } + for ( int j = 0; j < ndm - 1; j++ ) + { + fprintf( stdout, "%.2f\t", hMdDec->spar_md.band_coeffs[b].C_re[i][j] ); + } + fprintf( stdout, "|\t" ); + fprintf( stdout, "%.2f", hMdDec->spar_md.band_coeffs[b].P_re[i] ); + } + fprintf( stdout, "\n" ); + } + fprintf( stdout, "\n" ); + }*/ +#endif /* expand DirAC TC 20ms MD for residual channels to all subframes*/ for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ ) { @@ -2742,7 +3064,11 @@ void ivas_spar_to_dirac( } } +#ifdef LBR_SBA + for ( b = end_band * bw; b < num_bands_out; b++ ) +#else for ( b = end_band; b < num_bands_out; b++ ) +#endif { hMdDec->valid_bands[b] = 1; } diff --git a/lib_enc/ivas_dirac_enc.c b/lib_enc/ivas_dirac_enc.c index 207a7456275417b05c76efa65fa90da5132e07b9..69ed35aa831aad26cb3ff37d181139473d8ea5aa 100644 --- a/lib_enc/ivas_dirac_enc.c +++ b/lib_enc/ivas_dirac_enc.c @@ -44,7 +44,6 @@ #endif #include "wmops.h" - /*------------------------------------------------------------------------- * Local function prototypes *------------------------------------------------------------------------*/ @@ -351,7 +350,29 @@ void ivas_dirac_enc( ivas_qmetadata_enc_encode( hMetaData, hQMetaData ); *nb_bits_metadata = hMetaData->nb_bits_tot; +#ifdef DEBUG_LBR_SBA + char f_name[100]; + int16_t nB = 1; + int16_t num_subframes = 1; + int16_t num_elem_per_subframe = 3; + int16_t num_block_group = 1; + int16_t byte_size = sizeof( float ); + + float dirac_kbps = (float) ( hMetaData->nb_bits_tot * 50 ) / 1000; + float sce_kbps = (float) 13.2 - dirac_kbps; + + sprintf( f_name, "DIRAC_MD_bitrate.bin" ); + ( frame == 0 ) ? dbgwrite( &nB, sizeof( nB ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &num_elem_per_subframe, sizeof( num_elem_per_subframe ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &num_subframes, sizeof( num_subframes ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &num_block_group, sizeof( num_block_group ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &byte_size, sizeof( byte_size ), 1, 1, f_name ) : false; + dbgwrite( &dirac_kbps, byte_size, 1, 1, f_name ); + dbgwrite( &sce_kbps, byte_size, 1, 1, f_name ); + sce_kbps = (float) 16.4 - dirac_kbps; + dbgwrite( &sce_kbps, byte_size, 1, 1, f_name ); +#endif if ( Opt_DTX_ON ) { /* ToDo: If DIRAC_MIN_BITRATE_4_TRANS_CHAN is reached with DTX on (possible only with bitrate switching) diff --git a/lib_enc/ivas_enc.c b/lib_enc/ivas_enc.c index 5003dbec9df18ee2cf731ffb5b6b7470dbf2249c..a1364d75df9893e0f1cbd422f2894280bd5b3c7f 100644 --- a/lib_enc/ivas_enc.c +++ b/lib_enc/ivas_enc.c @@ -253,10 +253,50 @@ ivas_error ivas_enc( /* core-coding of transport channels */ if ( st_ivas->nSCE == 1 ) { +#ifdef DEBUG_LBR_SBA +#ifndef LBR_SBA + for ( int t = 0; t < 960; t++ ) + { + for ( int c = 0; c < 1; c++ ) + { + float val = data_f[c][t] / MAX16B_FLT; + dbgwrite( &val, sizeof( float ), 1, 1, "int_enc_dmx.raw" ); + } + } +#endif +#endif if ( ( error = ivas_sce_enc( st_ivas, 0, data_f[0], input_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) { return error; } +#ifdef DEBUG_LBR_SBA + /* Dumping SPAR Coefficients */ + char f_name[100]; + int16_t nbands = 1; + int16_t num_subframes = 1; + int16_t num_elements = 1; + int16_t num_block_group = 1; + int16_t byte_size = sizeof( int16_t ); + + sprintf( f_name, "SCE_code_element.bin" ); + ( frame == 0 ) ? dbgwrite( &nbands, sizeof( nbands ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &num_elements, sizeof( num_elements ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &num_subframes, sizeof( num_subframes ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &num_block_group, sizeof( num_block_group ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &byte_size, sizeof( byte_size ), 1, 1, f_name ) : false; + + for ( int16_t b = 0; b < nbands; b++ ) + { + for ( int16_t sf = 0; sf < num_subframes; sf++ ) + { + for ( int16_t bl = 0; bl < num_block_group; bl++ ) + { + dbgwrite( &st_ivas->hSCE[0]->hCoreCoder[0]->core, byte_size, 1, 1, f_name ); + // fprintf(stdout, "%f\t%f\t%f\t%d\t%d\n", dirac_md_kbps, spar_md_kbps, sba_md_kbps, qsi, code_strat ); + } + } + } +#endif } else if ( st_ivas->nCPE == 1 ) /* Stereo DMX */ { @@ -345,6 +385,36 @@ ivas_error ivas_enc( { return error; } +#ifndef LBR_SBA +#ifdef DEBUG_LBR_SBA + /* Dumping SPAR Coefficients */ + char f_name[100]; + int16_t nbands = 1; + int16_t num_subframes = 1; + int16_t num_elements = 1; + int16_t num_block_group = 1; + int16_t byte_size = sizeof( int16_t ); + + sprintf( f_name, "SCE_code_element.bin" ); + ( frame == 0 ) ? dbgwrite( &nbands, sizeof( nbands ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &num_elements, sizeof( num_elements ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &num_subframes, sizeof( num_subframes ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &num_block_group, sizeof( num_block_group ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &byte_size, sizeof( byte_size ), 1, 1, f_name ) : false; + + for ( int16_t b = 0; b < nbands; b++ ) + { + for ( int16_t sf = 0; sf < num_subframes; sf++ ) + { + for ( int16_t bl = 0; bl < num_block_group; bl++ ) + { + dbgwrite( &st_ivas->hSCE[0]->hCoreCoder[0]->core, byte_size, 1, 1, f_name ); + // fprintf(stdout, "%f\t%f\t%f\t%d\t%d\n", dirac_md_kbps, spar_md_kbps, sba_md_kbps, qsi, code_strat ); + } + } + } +#endif +#endif } else if ( st_ivas->nCPE == 1 ) /* Stereo DMX */ { diff --git a/lib_enc/ivas_enc_cov_handler.c b/lib_enc/ivas_enc_cov_handler.c index 1db9825ebcf789d92996d6b074354306b39bb4e1..51835de0c36c1a2d2538f1544b39b5fb0e487b99 100644 --- a/lib_enc/ivas_enc_cov_handler.c +++ b/lib_enc/ivas_enc_cov_handler.c @@ -64,6 +64,10 @@ ivas_error ivas_spar_covar_enc_open( ivas_filterbank_t *pFb, /* i/o: FB handle */ const int32_t input_Fs, /* i : input sampling rate */ const int16_t nchan_inp /* i : number of input channels */ +#ifdef LBR_SBA_EXTRA_COV_SMOOTH + , + const int32_t ivas_total_brate /* i : IVAS total bitrate */ +#endif ) { ivas_enc_cov_handler_state_t *hCovState; @@ -80,16 +84,22 @@ ivas_error ivas_spar_covar_enc_open( cov_smooth_cfg.max_bands = IVAS_MAX_NUM_BANDS; cov_smooth_cfg.max_update_rate = MAX_UPDATE_RATE; cov_smooth_cfg.min_pool_size = MIN_POOL_SIZE; - +#ifdef LBR_SBA_EXTRA_COV_SMOOTH + if ( ( error = ivas_spar_covar_smooth_enc_open( &hCovState->pCov_state, &cov_smooth_cfg, pFb, nchan_inp, ivas_total_brate ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_spar_covar_smooth_enc_open( &hCovState->pCov_state, &cov_smooth_cfg, pFb, nchan_inp ) ) != IVAS_ERR_OK ) +#endif { return error; } cov_smooth_cfg.max_update_rate = MAX_UPDATE_RATE_DTX; cov_smooth_cfg.min_pool_size = MIN_POOL_SIZE_DTX; - +#ifdef LBR_SBA_EXTRA_COV_SMOOTH + if ( ( error = ivas_spar_covar_smooth_enc_open( &hCovState->pCov_dtx_state, &cov_smooth_cfg, pFb, nchan_inp, ivas_total_brate ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_spar_covar_smooth_enc_open( &hCovState->pCov_dtx_state, &cov_smooth_cfg, pFb, nchan_inp ) ) != IVAS_ERR_OK ) +#endif { return error; } diff --git a/lib_enc/ivas_spar_foa_enc.c b/lib_enc/ivas_spar_foa_enc.c index 691adc0b1b26e35f370430af81b4912196af2990..0762b4d0ea4e633fede64d9792964e6c92c91898 100644 --- a/lib_enc/ivas_spar_foa_enc.c +++ b/lib_enc/ivas_spar_foa_enc.c @@ -104,7 +104,11 @@ ivas_error ivas_spar_foa_enc_open( } /* Covariance handle */ +#ifdef LBR_SBA_EXTRA_COV_SMOOTH + if ( ( error = ivas_spar_covar_enc_open( &( pState->hCovEnc ), pState->hFbMixer->pFb, input_Fs, nchan_inp, hEncoderConfig->ivas_total_brate ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_spar_covar_enc_open( &( pState->hCovEnc ), pState->hFbMixer->pFb, input_Fs, nchan_inp ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -307,7 +311,10 @@ ivas_error ivas_spar_foa_enc_process( sba_order = min( hEncoderConfig->sba_order, IVAS_MAX_SBA_ORDER ); nchan_inp = ivas_sba_get_nchan_metadata( sba_order ); assert( nchan_inp <= hEncoderConfig->nchan_inp ); - +#ifdef LBR_SBA + int16_t active_w_vlbr; + active_w_vlbr = ( hEncoderConfig->ivas_total_brate < IVAS_24k4 ) ? 1 : 0; +#endif for ( i = FOA_CHANNELS + 1; i < nchan_inp; i++ ) { mvr2r( data_f[HOA_keep_ind[i]], data_f[i], input_frame ); @@ -391,8 +398,36 @@ ivas_error ivas_spar_foa_enc_process( { /* WB 4TC mode bit : disable for now*/ push_next_indice( hMetaData, 0, 1 ); +#ifdef LBR_SBA_PLANAR + /* force planar for LBR SPAR+DirAC, then encode parameters */ + if ( hQMetaData->useLowerRes ) + { + for ( i = hQMetaData->q_direction[0].cfg.start_band; i < hQMetaData->q_direction[0].cfg.nbands; i++ ) + { + /* Make sure elevation is really zero */ + set_zero( hQMetaData->q_direction[0].band_data[i].elevation, hQMetaData->q_direction[0].cfg.nblocks ); + } + } +#endif ivas_qmetadata_enc_encode( hMetaData, hQMetaData ); - } + +#ifdef DEBUG_LBR_SBA + /* char f_name[100]; + int16_t nB = 1; + int16_t num_subframes = 1; + int16_t num_elem_per_subframe = 1; + int16_t num_block_group = 1; + int16_t byte_size = sizeof( int16_t ); + + sprintf( f_name, "DIRAC_MD_bitrate.bin" ); + ( frame == 0 ) ? dbgwrite( &nB, sizeof( nB ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &num_elem_per_subframe, sizeof( num_elem_per_subframe ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &num_subframes, sizeof( num_subframes ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &num_block_group, sizeof( num_block_group ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &byte_size, sizeof( byte_size ), 1, 1, f_name ) : false; + dbgwrite( &hMetaData->nb_bits_tot, sizeof( int16_t ), 1, 1, f_name );*/ +#endif + } else { hQMetaData->q_direction[0].cfg.nbands = DIRAC_DTX_BANDS; @@ -544,7 +579,11 @@ ivas_error ivas_spar_foa_enc_process( md_in_buf.dtx_vad = dtx_vad; - ivas_spar_foa_md_enc_process( pState->hMdEnc, hEncoderConfig, &md_in_buf, hMetaData, dtx_silence_mode ); + ivas_spar_foa_md_enc_process( pState->hMdEnc, hEncoderConfig, &md_in_buf, hMetaData, dtx_silence_mode +#ifdef LBR_SBA + , pState->hFbMixer->prior_mixer +#endif + ); if ( st_ivas->sba_mode == SBA_MODE_SPAR ) { @@ -591,10 +630,77 @@ ivas_error ivas_spar_foa_enc_process( } ivas_get_spar_md_from_dirac( azi_dirac, ele_dirac, diffuseness, 1, pState->hMdEnc->mixer_mat, &pState->hMdEnc->spar_md, &pState->hMdEnc->spar_md_cfg, - d_start_band, d_end_band, sba_order, dtx_vad, Wscale_d ); + d_start_band, d_end_band, sba_order, dtx_vad, Wscale_d +#ifdef LBR_SBA + , hQMetaData->useLowerRes, active_w_vlbr +#endif + ); + } +#ifdef DEBUG_LBR_SBA + /* Dumping SPAR Coefficients */ + char f_name[100]; + int16_t nbands = 6; + int16_t num_subframes = 1; + int16_t num_elements = 6; + int16_t num_block_group = 1; + int16_t byte_size = sizeof( float ); + + sprintf( f_name, "SBA_MD_values.bin" ); + ( frame == 0 ) ? dbgwrite( &nbands, sizeof( nbands ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &num_elements, sizeof( num_elements ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &num_subframes, sizeof( num_subframes ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &num_block_group, sizeof( num_block_group ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &byte_size, sizeof( byte_size ), 1, 1, f_name ) : false; + + for ( b = 0; b < nbands; b++ ) + { + for ( int16_t sf = 0; sf < num_subframes; sf++ ) + { + for ( int16_t bl = 0; bl < num_block_group; bl++ ) + { + dbgwrite( &pState->hMdEnc->spar_md.band_coeffs[b].pred_re[0], byte_size, 1, 1, f_name ); + dbgwrite( &pState->hMdEnc->spar_md.band_coeffs[b].pred_re[1], byte_size, 1, 1, f_name ); + dbgwrite( &pState->hMdEnc->spar_md.band_coeffs[b].pred_re[2], byte_size, 1, 1, f_name ); + dbgwrite( &pState->hMdEnc->spar_md.band_coeffs[b].P_re[0], byte_size, 1, 1, f_name ); + dbgwrite( &pState->hMdEnc->spar_md.band_coeffs[b].P_re[1], byte_size, 1, 1, f_name ); + dbgwrite( &pState->hMdEnc->spar_md.band_coeffs[b].P_re[2], byte_size, 1, 1, f_name ); + // fprintf(stdout, "%f\t%f\t%f\t%d\t%d\n", dirac_md_kbps, spar_md_kbps, sba_md_kbps, qsi, code_strat ); + } + } } - - +#endif +#ifdef DEBUG_LBR_SBA + /* Dumping SPAR Coefficients */ + nbands = 6; + num_subframes = 1; + num_elements = 6; + num_block_group = 1; + byte_size = sizeof( float ); + + sprintf( f_name, "SBA_MD_values_quant.bin" ); + ( frame == 0 ) ? dbgwrite( &nbands, sizeof( nbands ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &num_elements, sizeof( num_elements ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &num_subframes, sizeof( num_subframes ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &num_block_group, sizeof( num_block_group ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &byte_size, sizeof( byte_size ), 1, 1, f_name ) : false; + + for ( b = 0; b < nbands; b++ ) + { + for ( int16_t sf = 0; sf < num_subframes; sf++ ) + { + for ( int16_t bl = 0; bl < num_block_group; bl++ ) + { + dbgwrite( &pState->hMdEnc->spar_md.band_coeffs[b].pred_quant_re[0], byte_size, 1, 1, f_name ); + dbgwrite( &pState->hMdEnc->spar_md.band_coeffs[b].pred_quant_re[1], byte_size, 1, 1, f_name ); + dbgwrite( &pState->hMdEnc->spar_md.band_coeffs[b].pred_quant_re[2], byte_size, 1, 1, f_name ); + dbgwrite( &pState->hMdEnc->spar_md.band_coeffs[b].P_quant_re[0], byte_size, 1, 1, f_name ); + dbgwrite( &pState->hMdEnc->spar_md.band_coeffs[b].P_quant_re[1], byte_size, 1, 1, f_name ); + dbgwrite( &pState->hMdEnc->spar_md.band_coeffs[b].P_quant_re[2], byte_size, 1, 1, f_name ); + // fprintf(stdout, "%f\t%f\t%f\t%d\t%d\n", dirac_md_kbps, spar_md_kbps, sba_md_kbps, qsi, code_strat ); + } + } + } +#endif /*-----------------------------------------------------------------------------------------* * FB mixer *-----------------------------------------------------------------------------------------*/ @@ -664,19 +770,15 @@ ivas_error ivas_spar_foa_enc_process( } -#ifdef SPAR_HOA_DBG - /*FILE *fp = fopen("int_enc_dmx.raw", "ab"); - for (int t = 0; t < 960; t++) +#ifdef DEBUG_LBR_SBA + for ( int t = 0; t < 960; t++ ) { - for (int c = 0; c < pState->hFbMixer->filterbank_num_out_chans; c++) + for ( int c = 0; c < pState->hFbMixer->fb_cfg->num_out_chans; c++ ) { - for ( k = 0; k < 2; k++ ) - { - fb_mixer_in_buf.ppMixer[i][j][k] = pState->hMdEnc->mixer_mat[i][j]; - } + float val = p_pcm_tmp[c][t]; // / MAX16B_FLT; + dbgwrite( &val, sizeof( float ), 1, 1, "int_enc_dmx.raw" ); } } - fclose( fp );*/ #endif /*-----------------------------------------------------------------------------------------* * AGC diff --git a/lib_enc/ivas_spar_foa_md_enc.c b/lib_enc/ivas_spar_foa_md_enc.c index a3416c360f1ca5e0f4eed977e8f47a525263cce9..52b790e16b906d531d724caa0e98c551f2c03e75 100644 --- a/lib_enc/ivas_spar_foa_md_enc.c +++ b/lib_enc/ivas_spar_foa_md_enc.c @@ -52,7 +52,6 @@ extern int32_t dbg_type; int32_t frm = 0; #endif - /*------------------------------------------------------------------------------------------* * PreProcessor *------------------------------------------------------------------------------------------*/ @@ -87,15 +86,32 @@ static void ivas_band_mixer( float *cov_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], static void ivas_get_band_differential_index( ivas_band_coeffs_ind_t *pBand_idx, const int16_t q_levels[2], const int16_t one_sided, const int16_t nB, const int16_t complex_cov, const int16_t dim, const ivas_coeffs_type_t coeff_type ); -static void ivas_get_huffman_coded_bs( ivas_spar_foa_md_enc_state_t *pState, BSTR_ENC_HANDLE hMetaData, const int16_t nB, const int16_t qsi, const int16_t planarCP ); +static void ivas_get_huffman_coded_bs( ivas_spar_foa_md_enc_state_t *pState, BSTR_ENC_HANDLE hMetaData, const int16_t nB, const int16_t qsi, const int16_t planarCP +#ifdef LBR_SBA + , + const int16_t bands_bw +#endif +); -static void ivas_get_arith_coded_bs( ivas_spar_foa_md_enc_state_t *pState, BSTR_ENC_HANDLE hMetaData, const int16_t *pDo_diff, const int16_t bands_bw, const int16_t nB, const int16_t qsi, const int16_t planarCP ); +static void ivas_get_arith_coded_bs( ivas_spar_foa_md_enc_state_t *pState, BSTR_ENC_HANDLE hMetaData, const int16_t *pDo_diff, const int16_t bands_bw, const int16_t nB, const int16_t qsi, const int16_t planarCP +#ifdef LBR_SBA + , + const int16_t strat, + const int32_t ivas_total_brate +#endif +); static ivas_error ivas_spar_foa_set_enc_config( ivas_spar_foa_md_enc_state_t *pState, int16_t *max_freq_per_chan, const int16_t nchan_transport, float *pFC, const int16_t nchan_inp ); static void ivas_select_next_strat( ivas_strats_t prior_strat, ivas_strats_t cs[MAX_QUANT_STRATS], const int16_t dmx_switch, const int16_t dtx_vad ); -static void ivas_store_prior_coeffs( ivas_spar_foa_md_enc_state_t *hMdEnc, const int16_t num_bands, const int16_t bands_bw, const int16_t strat, const int16_t dtx_vad, const int16_t qsi ); +static void ivas_store_prior_coeffs( ivas_spar_foa_md_enc_state_t *hMdEnc, const int16_t num_bands, +#ifndef LBR_SBA + const int16_t bands_bw, +#endif + const int16_t strat, + const int16_t dtx_vad, + const int16_t qsi ); static void ivas_write_parameter_bitstream( ivas_spar_foa_md_enc_state_t *hMdEnc, const int16_t nB, const int16_t bands_bw, BSTR_ENC_HANDLE hMetaData, const int32_t ivas_total_brate, const int16_t dtx_silence_mode, const int16_t strat, const int16_t qsi, const int16_t planarCP ); @@ -565,7 +581,12 @@ ivas_error ivas_spar_foa_md_enc_process( const ENCODER_CONFIG_HANDLE hEncoderConfig, /* i : configuration structure */ ivas_spar_foa_md_enc_in_buf_t *pIn_buf, BSTR_ENC_HANDLE hMetaData, /* i/o: MetaData handle */ - const int16_t dtx_silence_mode ) + const int16_t dtx_silence_mode +#ifdef LBR_SBA + , + const float *prior_mixer[IVAS_MAX_FB_MIXER_OUT_CH][IVAS_MAX_SPAR_FB_MIXER_IN_CH] /* i : prior mixer_matrix */ +#endif +) { float pred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS]; float dm_fv_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS]; @@ -596,7 +617,10 @@ ivas_error ivas_spar_foa_md_enc_process( num_ch = ivas_sba_get_nchan_metadata( sba_order ); active_w = pState->spar_md_cfg.active_w; nchan_transport = pState->spar_md_cfg.nchan_transport; - +#ifdef LBR_SBA + int16_t active_w_vlbr; + active_w_vlbr = ( hEncoderConfig->ivas_total_brate < IVAS_24k4 ) ? 1 : 0; +#endif if ( hEncoderConfig->ivas_total_brate == BRATE_SPAR_Q_STRAT && sba_order == 1 ) { /* make sure that qsi is always 0 (temporary bits are '00') */ @@ -624,6 +648,15 @@ ivas_error ivas_spar_foa_md_enc_process( ivas_band_mixer( pIn_buf->cov_real, num_ch, &num_bands, bands_bw ); } +#ifdef LBR_SBA + else if ( hEncoderConfig->ivas_total_brate < IVAS_24k4 ) + { + bands_bw = 2; + nB = num_bands / bands_bw; + + ivas_band_mixer( pIn_buf->cov_real, num_ch, &num_bands, bands_bw ); + } +#endif else { nB = num_bands; @@ -631,7 +664,11 @@ ivas_error ivas_spar_foa_md_enc_process( } ivas_compute_spar_params( pIn_buf->cov_real, dm_fv_re, 0, pState->mixer_mat, 0, nB, dtx_vad, num_ch, - bands_bw, active_w, &pState->spar_md_cfg, &pState->spar_md, Wscale, 0 ); + bands_bw, active_w, +#ifdef LBR_SBA + active_w_vlbr, +#endif + &pState->spar_md_cfg, &pState->spar_md, Wscale, 0 ); for ( i = 0; i < num_ch; i++ ) { @@ -644,6 +681,9 @@ ivas_error ivas_spar_foa_md_enc_process( } } +#ifdef DEBUG_LBR_SBA + float dirac_md_kbps = (float) ( hMetaData->nb_bits_tot ) * 50 / 1000; +#endif planarCP = 0; code_strat = 0; #ifdef DEBUG_SPAR_MD_TARGET_TUNING @@ -819,11 +859,72 @@ ivas_error ivas_spar_foa_md_enc_process( fprintf(stderr, "\n\n"); */ #endif } - +#ifdef LBR_SBA_PLANAR + if ( active_w_vlbr ) /* SPAR PLANAR */ + { + pState->spar_md.band_coeffs[b].P_re[2] = 0.0f; + } +#endif ivas_quant_p_per_band( &pState->spar_md.band_coeffs[b], &pState->spar_md.band_coeffs_idx[b], &pState->spar_md_cfg.quant_strat[qsi], num_ch ); } - +#ifdef LBR_SBA_PLANAR + if ( active_w_vlbr ) /* SPAR PLANAR */ + { + pState->spar_md.band_coeffs[b].pred_re[1] = 0.0f; + } +#endif ivas_quant_pred_coeffs_per_band( &pState->spar_md.band_coeffs[b], &pState->spar_md.band_coeffs_idx[b], &pState->spar_md_cfg.quant_strat[qsi], num_ch ); +#ifdef LBR_SBA + /* FIX here for PR coeffs ? */ + if ( active_w_vlbr ) + { + for ( i = 0; i < 3; i++ ) + { +#ifdef LBR_SBA_PLANAR + if ( i == 1 ) /* Z prediction coefficients */ + { + continue; + } +#endif + int16_t i2; + i2 = 0; + switch ( i ) /* PRED (Y,Z,X) and DECD (Y,X,Z) coeffs are in different orders */ + { + case 0: + i2 = 0; + break; + case 1: + i2 = 2; + break; + case 2: + i2 = 1; + break; + } + if ( ( pState->spar_md.band_coeffs_idx[b].pred_index_re[i] == 0 ) && ( pState->spar_md.band_coeffs_idx[b].decd_index_re[i2] == 0 ) + && ( pState->spar_md.band_coeffs[b].pred_re[i] != 0.0f ) && ( pIn_buf->cov_real[i + 1][i + 1][b] != 0.0f ) ) + { +#ifdef LBR_SBA_DEBUG + fprintf( stdout, "\nbumped: PRED band %d, channel ind %d\n", b, i ); +#endif + /* bump up the Pred coeff */ + float PR_uq, PR_step; + ivas_quant_strat_t qs; + qs = pState->spar_md_cfg.quant_strat[qsi]; + PR_uq = pState->spar_md.band_coeffs[b].pred_re[i]; + PR_step = ( qs.PR.max - qs.PR.min ) / ( qs.PR.q_levels[0] - 1 ); + + + int16_t PR_sign; + PR_sign = ( PR_uq > 0 ) - ( PR_uq < 0 ); + + pState->spar_md.band_coeffs_idx[b].pred_index_re[i] = PR_sign; + + /* deindex the modified coefficient */ + pState->spar_md.band_coeffs[b].pred_quant_re[i] = PR_sign * PR_step; + } + } + } +#endif } else { @@ -842,7 +943,12 @@ ivas_error ivas_spar_foa_md_enc_process( ppP_re[i] = pState->spar_md.band_coeffs[b].P_re; ppP_re_quant[i] = pState->spar_md.band_coeffs[b].P_quant_re; } - +#ifdef LBR_SBA_PLANAR + if ( active_w_vlbr ) /* SPAR PLANAR */ + { + pState->spar_md.band_coeffs[b].P_re[2] = 0.0f; + } +#endif ivas_quant_p_per_band_dtx( ppP_re, ndec, ndm, ppP_idx, ppP_re_quant, num_ch ); } @@ -858,7 +964,12 @@ ivas_error ivas_spar_foa_md_enc_process( { pState->spar_md.band_coeffs[b].pred_quant_re[i] = 0; } - +#ifdef LBR_SBA_PLANAR + if ( active_w_vlbr ) /* SPAR PLANAR */ + { + pState->spar_md.band_coeffs[b].pred_re[1] = 0.0f; + } +#endif ivas_spar_foa_quant_pred_coeffs_dtx( &pState->spar_md, ppPred_re, ndm, ppPred_idx, num_ch - 1, ppPred_quant ); } } @@ -1032,6 +1143,66 @@ ivas_error ivas_spar_foa_md_enc_process( { assert( qsi == 0 ); } +#ifdef LBR_SBA + /* Reuse mixer matrix values for unsent bands */ + if ( ( hEncoderConfig->ivas_total_brate < IVAS_24k4 ) && ( code_strat > 3 ) ) + { + for ( b = 0; b < num_bands * bands_bw; b += 2 * bands_bw ) + { + if ( ( b == 0 ) && ( code_strat % 2 == 0 ) ) + { + b += 2; + } + for ( i = 0; i < 1; i++ ) + { + for ( j = 0; j < 4; j++ ) + { + hMdEnc->mixer_mat[i][j][b] = prior_mixer[i][j][b]; + hMdEnc->mixer_mat[i][j][b + 1] = prior_mixer[i][j][b + 1]; + } + } + } + } +#endif +#ifdef DEBUG_LBR_SBA + char f_name[100]; + int16_t nbands = 1; + int16_t num_subframes = 1; + int16_t num_elements = 6; + int16_t num_block_group = 1; + int16_t byte_size = sizeof( float ); + + float sba_md_kbps = (float) hMetaData->nb_bits_tot * 50 / 1000; + float spar_md_kbps = sba_md_kbps - dirac_md_kbps; + float corebr_kbps = (float) hEncoderConfig->ivas_total_brate / 1000 - sba_md_kbps; + + sprintf( f_name, "SBA_MD_bitrate.bin" ); + ( frame == 0 ) ? dbgwrite( &nbands, sizeof( nbands ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &num_elements, sizeof( num_elements ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &num_subframes, sizeof( num_subframes ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &num_block_group, sizeof( num_block_group ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &byte_size, sizeof( byte_size ), 1, 1, f_name ) : false; + + for ( b = 0; b < nbands; b++ ) + { + for ( int16_t sf = 0; sf < num_subframes; sf++ ) + { + for ( int16_t bl = 0; bl < num_block_group; bl++ ) + { + float fqsi = (float) qsi; + float fcode = (float) code_strat; + + dbgwrite( &dirac_md_kbps, byte_size, 1, 1, f_name ); + dbgwrite( &spar_md_kbps, byte_size, 1, 1, f_name ); + dbgwrite( &sba_md_kbps, byte_size, 1, 1, f_name ); + dbgwrite( &fqsi, byte_size, 1, 1, f_name ); + dbgwrite( &fcode, byte_size, 1, 1, f_name ); + dbgwrite( &corebr_kbps, byte_size, 1, 1, f_name ); + // fprintf(stdout, "%f\t%f\t%f\t%d\t%d\n", dirac_md_kbps, spar_md_kbps, sba_md_kbps, qsi, code_strat ); + } + } + } +#endif #ifdef SPAR_HOA_DBG /*if ( strat >= 4 ) { @@ -1111,7 +1282,11 @@ ivas_error ivas_spar_foa_md_enc_process( if ( pState->spar_md_cfg.gen_bs == 1 ) { - ivas_store_prior_coeffs( pState, num_bands, bands_bw, code_strat, dtx_vad, qsi ); + ivas_store_prior_coeffs( pState, num_bands, +#ifndef LBR_SBA + bands_bw, +#endif + code_strat, dtx_vad, qsi ); } pState->spar_md.dtx_vad = dtx_vad; @@ -1204,56 +1379,84 @@ static void ivas_write_parameter_bitstream( } no_ec = 0; - - switch ( strat ) +#ifdef LBR_SBA + if ( ivas_total_brate < IVAS_24k4 ) { - case BASE: - push_next_indice( hMetaData, bands_bw - 1, SPAR_NUM_CODING_STRAT_BITS ); - for ( i = 0; i < nB; i++ ) - { - do_diff[i] = 0; - } - break; - case BASE_NOEC: - push_next_indice( hMetaData, bands_bw + 1, SPAR_NUM_CODING_STRAT_BITS ); - for ( i = 0; i < nB; i++ ) - { - do_diff[i] = 0; - } - no_ec = 1; - break; - case FOUR_A: - push_next_indice( hMetaData, 4, SPAR_NUM_CODING_STRAT_BITS ); - for ( i = 0; i < nB; i++ ) - { - do_diff[i] = ( ( ( i + 1 ) & 3 ) != 0 ); - } - ivas_map_prior_coeffs_quant( &hMdEnc->spar_md_prior, &hMdEnc->spar_md_cfg, qsi, nB ); - break; - case FOUR_B: - push_next_indice( hMetaData, 5, SPAR_NUM_CODING_STRAT_BITS ); - for ( i = 0; i < nB; i++ ) - { - do_diff[i] = ( ( ( i + 1 ) & 3 ) != 1 ); - } - ivas_map_prior_coeffs_quant( &hMdEnc->spar_md_prior, &hMdEnc->spar_md_cfg, qsi, nB ); - break; - case FOUR_C: - push_next_indice( hMetaData, 6, SPAR_NUM_CODING_STRAT_BITS ); - for ( i = 0; i < nB; i++ ) - { - do_diff[i] = ( ( ( i + 1 ) & 3 ) != 2 ); - } - ivas_map_prior_coeffs_quant( &hMdEnc->spar_md_prior, &hMdEnc->spar_md_cfg, qsi, nB ); - break; - case FOUR_D: - push_next_indice( hMetaData, 7, SPAR_NUM_CODING_STRAT_BITS ); - for ( i = 0; i < nB; i++ ) - { - do_diff[i] = ( ( ( i + 1 ) & 3 ) != 3 ); - } - ivas_map_prior_coeffs_quant( &hMdEnc->spar_md_prior, &hMdEnc->spar_md_cfg, qsi, nB ); - break; + switch ( strat ) + { + case BASE: + push_next_indice( hMetaData, bands_bw - 1, SPAR_NUM_CODING_STRAT_BITS ); + break; + case BASE_NOEC: + push_next_indice( hMetaData, bands_bw + 1, SPAR_NUM_CODING_STRAT_BITS ); + no_ec = 1; + break; + case FOUR_A: + case FOUR_C: + case FOUR_B: + case FOUR_D: + push_next_indice( hMetaData, strat, SPAR_NUM_CODING_STRAT_BITS ); + break; + } + /* for LBR SBA 40MS MD never do time diff */ + for ( i = 0; i < nB; i++ ) + { + do_diff[i] = 0; + } + } + else +#endif + { + switch ( strat ) + { + case BASE: + push_next_indice( hMetaData, bands_bw - 1, SPAR_NUM_CODING_STRAT_BITS ); + for ( i = 0; i < nB; i++ ) + { + do_diff[i] = 0; + } + break; + case BASE_NOEC: + push_next_indice( hMetaData, bands_bw + 1, SPAR_NUM_CODING_STRAT_BITS ); + for ( i = 0; i < nB; i++ ) + { + do_diff[i] = 0; + } + no_ec = 1; + break; + case FOUR_A: + push_next_indice( hMetaData, 4, SPAR_NUM_CODING_STRAT_BITS ); + for ( i = 0; i < nB; i++ ) + { + do_diff[i] = ( ( ( i + 1 ) & 3 ) != 0 ); + } + ivas_map_prior_coeffs_quant( &hMdEnc->spar_md_prior, &hMdEnc->spar_md_cfg, qsi, nB ); + break; + case FOUR_B: + push_next_indice( hMetaData, 5, SPAR_NUM_CODING_STRAT_BITS ); + for ( i = 0; i < nB; i++ ) + { + do_diff[i] = ( ( ( i + 1 ) & 3 ) != 1 ); + } + ivas_map_prior_coeffs_quant( &hMdEnc->spar_md_prior, &hMdEnc->spar_md_cfg, qsi, nB ); + break; + case FOUR_C: + push_next_indice( hMetaData, 6, SPAR_NUM_CODING_STRAT_BITS ); + for ( i = 0; i < nB; i++ ) + { + do_diff[i] = ( ( ( i + 1 ) & 3 ) != 2 ); + } + ivas_map_prior_coeffs_quant( &hMdEnc->spar_md_prior, &hMdEnc->spar_md_cfg, qsi, nB ); + break; + case FOUR_D: + push_next_indice( hMetaData, 7, SPAR_NUM_CODING_STRAT_BITS ); + for ( i = 0; i < nB; i++ ) + { + do_diff[i] = ( ( ( i + 1 ) & 3 ) != 3 ); + } + ivas_map_prior_coeffs_quant( &hMdEnc->spar_md_prior, &hMdEnc->spar_md_cfg, qsi, nB ); + break; + } } #ifdef SPAR_HOA_DBG @@ -1264,11 +1467,22 @@ static void ivas_write_parameter_bitstream( #endif if ( no_ec == 1 ) { - ivas_get_huffman_coded_bs( hMdEnc, hMetaData, nB, qsi, planarCP ); + ivas_get_huffman_coded_bs( hMdEnc, hMetaData, nB, qsi, planarCP +#ifdef LBR_SBA + , + bands_bw +#endif + ); } else { - ivas_get_arith_coded_bs( hMdEnc, hMetaData, do_diff, bands_bw, nB, qsi, planarCP ); + ivas_get_arith_coded_bs( hMdEnc, hMetaData, do_diff, bands_bw, nB, qsi, planarCP +#ifdef LBR_SBA + , + strat, + ivas_total_brate +#endif + ); } return; @@ -1286,16 +1500,27 @@ static void ivas_get_huffman_coded_bs( BSTR_ENC_HANDLE hMetaData, const int16_t nB, const int16_t qsi, - const int16_t planarCP ) + const int16_t planarCP +#ifdef LBR_SBA + , + const int16_t bands_bw +#endif +) { int16_t i, j; for ( i = 0; i < nB; i++ ) { int16_t code, len; - int16_t ndm = hMdEnc->spar_md_cfg.num_dmx_chans_per_band[i]; - int16_t ndec = hMdEnc->spar_md_cfg.num_decorr_per_band[i]; - +#ifdef LBR_SBA + int16_t ndm, ndec; + ndm = hMdEnc->spar_md_cfg.num_dmx_chans_per_band[i * bands_bw]; + ndec = hMdEnc->spar_md_cfg.num_decorr_per_band[i * bands_bw]; +#else + int16_t ndm, ndec; + ndm = hMdEnc->spar_md_cfg.num_dmx_chans_per_band[i]; + ndec = hMdEnc->spar_md_cfg.num_decorr_per_band[i]; +#endif if ( planarCP ) { for ( j = 0; j < ndm + ndec - 1; j++ ) @@ -1326,6 +1551,12 @@ static void ivas_get_huffman_coded_bs( { for ( j = 0; j < ndm + ndec - 1; j++ ) { +#ifdef LBR_SBA_PLANAR + if ( ( j == 1 ) && ( bands_bw == IVAS_RED_BAND_FACT ) ) + { + continue; + } +#endif ivas_huffman_encode( &hMdEnc->huff_coeffs.pred_huff_re[qsi], hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j], &code, &len ); push_next_indice( hMetaData, code, len ); } @@ -1338,6 +1569,12 @@ static void ivas_get_huffman_coded_bs( for ( j = 0; j < ndec; j++ ) { +#ifdef LBR_SBA_PLANAR + if ( ( j == 2 ) && ( bands_bw == IVAS_RED_BAND_FACT ) ) + { + continue; + } +#endif ivas_huffman_encode( &hMdEnc->huff_coeffs.decd_huff_re[qsi], hMdEnc->spar_md.band_coeffs_idx[i].decd_index_re[j], &code, &len ); push_next_indice( hMetaData, code, len ); } @@ -1361,7 +1598,13 @@ static void ivas_get_arith_coded_bs( const int16_t bands_bw, const int16_t nB, const int16_t qsi, - const int16_t planarCP ) + const int16_t planarCP +#ifdef LBR_SBA + , + const int16_t strat, + const int32_t ivas_total_brate +#endif +) { int16_t i, any_diff; ivas_cell_dim_t pred_cell_dims[IVAS_MAX_NUM_BANDS]; @@ -1376,14 +1619,37 @@ static void ivas_get_arith_coded_bs( int16_t ndm, ndec; ndm = hMdEnc->spar_md_cfg.num_dmx_chans_per_band[bands_bw * i]; ndec = hMdEnc->spar_md_cfg.num_decorr_per_band[bands_bw * i]; - pred_cell_dims[i].dim1 = ndm + ndec - 1; - pred_cell_dims[i].dim2 = 1; - drct_cell_dims[i].dim1 = ndec; - drct_cell_dims[i].dim2 = ndm - 1; - decd_cell_dims[i].dim1 = ndec; - decd_cell_dims[i].dim2 = 1; - decx_cell_dims[i].dim1 = ( ndec * ( ndec - 1 ) ) >> 1; - decx_cell_dims[i].dim2 = 1; +#ifdef LBR_SBA + if ( ( ivas_total_brate < IVAS_24k4 ) && ( strat > 3 ) && ( ( ( i % 2 == 1 ) && ( strat % 2 == 0 ) ) || ( ( i % 2 == 0 ) && ( strat % 2 == 1 ) ) ) ) + { + pred_cell_dims[i].dim1 = 0; + pred_cell_dims[i].dim2 = 0; + drct_cell_dims[i].dim1 = 0; + drct_cell_dims[i].dim2 = 0; + decd_cell_dims[i].dim1 = 0; + decd_cell_dims[i].dim2 = 0; + decx_cell_dims[i].dim1 = 0; + decx_cell_dims[i].dim2 = 0; + } + else +#endif + { + pred_cell_dims[i].dim1 = ndm + ndec - 1; + pred_cell_dims[i].dim2 = 1; + drct_cell_dims[i].dim1 = ndec; + drct_cell_dims[i].dim2 = ndm - 1; + decd_cell_dims[i].dim1 = ndec; + decd_cell_dims[i].dim2 = 1; + decx_cell_dims[i].dim1 = ( ndec * ( ndec - 1 ) ) >> 1; + decx_cell_dims[i].dim2 = 1; +#ifdef LBR_SBA_PLANAR + if ( ivas_total_brate < IVAS_24k4 ) + { + pred_cell_dims[i].dim1 -= 1; + decd_cell_dims[i].dim1 -= 1; + } +#endif + } } any_diff = 0; @@ -1395,7 +1661,15 @@ static void ivas_get_arith_coded_bs( break; } } - +#ifdef LBR_SBA_PLANAR + if ( ivas_total_brate < IVAS_24k4 ) + { + for ( int16_t b = 0; b < nB; b++ ) /* swap X and Z PR coefficients, then code fewer */ + { + hMdEnc->spar_md.band_coeffs_idx[b].pred_index_re[1] = hMdEnc->spar_md.band_coeffs_idx[b].pred_index_re[2]; + } + } +#endif ivas_copy_band_coeffs_idx_to_arr( hMdEnc->spar_md.band_coeffs_idx, nB, symbol_arr_re, pred_cell_dims, PRED_COEFF, planarCP ); if ( any_diff == 1 ) @@ -1522,14 +1796,17 @@ static void ivas_select_next_strat( static void ivas_store_prior_coeffs( ivas_spar_foa_md_enc_state_t *hMdEnc, const int16_t num_bands, +#ifndef LBR_SBA const int16_t bands_bw, +#endif const int16_t strat, const int16_t dtx_vad, const int16_t qsi ) { int16_t i, j, b; - +#ifndef LBR_SBA float one_by_bands_bw = ( 1.0f / bands_bw ); +#endif if ( dtx_vad == 0 ) { @@ -1544,7 +1821,13 @@ static void ivas_store_prior_coeffs( for ( i = 0; i < num_bands; i++ ) { +#ifdef LBR_SBA + b = i; + /* TODO: Bitrate switching will require dependence on bands_bw, and changes to time differential coding/prior index + storage for 6-12 band switching. e.g. b = (int16_t) floor( i * one_by_bands_bw ); */ +#else b = (int16_t) floor( i * one_by_bands_bw ); +#endif for ( j = 0; j < IVAS_SPAR_MAX_CH - 1; j++ ) {