From e8d677c095ca40fd832a60ac9e58fa88d3d90236 Mon Sep 17 00:00:00 2001 From: Eleni Fotopoulou Date: Wed, 10 Aug 2022 14:06:47 +0200 Subject: [PATCH 1/4] create branch for contribution Low bitrate SBA Core Coder Tuning --- lib_com/ivas_prot.h | 8 ++ lib_com/ivas_spar_com.c | 10 +- lib_com/ivas_stereo_mdct_stereo_com.c | 18 +++- lib_com/options.h | 5 +- lib_dec/ivas_cpe_dec.c | 13 ++- lib_dec/ivas_mct_dec_mct.c | 7 +- lib_dec/ivas_reverb.c | 41 ++++--- lib_dec/ivas_reverb_utils.c | 2 +- lib_dec/ivas_stat_dec.h | 3 + lib_dec/ivas_stereo_mdct_core_dec.c | 42 +++++++- lib_dec/ivas_stereo_mdct_stereo_dec.c | 149 ++++++++++++++------------ lib_enc/ivas_cpe_enc.c | 9 ++ lib_enc/ivas_mdct_core_enc.c | 6 +- lib_enc/ivas_sba_enc.c | 3 + lib_enc/ivas_stat_enc.h | 4 + lib_enc/ivas_stereo_mdct_core_enc.c | 39 +++++-- lib_enc/ivas_stereo_switching_enc.c | 4 + 17 files changed, 244 insertions(+), 119 deletions(-) mode change 100644 => 100755 lib_enc/ivas_stereo_mdct_core_enc.c diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 576bf1c684..08de7996dd 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -2157,6 +2157,10 @@ void splitAvailableBits( const int16_t split_ratio, /* i : split ratio */ int16_t *bits_ch0, /* o : bits for channel 0 */ int16_t *bits_ch1 /* o : bits for channel 1 */ +#ifdef LBR_SBA_CORE_CODING_TUNING + , + const int16_t sba_mode /* i : signal core coding for sba */ +#endif ); int16_t write_stereo_to_bitstream @@ -2174,6 +2178,10 @@ void parse_stereo_from_bitstream( const int16_t mct_on, /* i : flag mct block (1) or stereo (0) */ Decoder_State *st0, /* i/o: decoder state structure for Bstr */ int16_t ms_mask[NB_DIV][MAX_SFB] /* o : bandwise MS mask */ +#ifdef LBR_SBA_CORE_CODING_TUNING + , + const int16_t sba_mode /* i: flag core coding for sba */ +#endif ); void FindSplitRatio( diff --git a/lib_com/ivas_spar_com.c b/lib_com/ivas_spar_com.c index 16131fa8fb..89f8cdc2dd 100644 --- a/lib_com/ivas_spar_com.c +++ b/lib_com/ivas_spar_com.c @@ -2147,8 +2147,8 @@ void ivas_spar_set_bitrate_config( for ( i = 0; i < pSpar_md_cfg->nchan_transport; i++ ) { - total_bits += ( int16_t )( ivas_spar_br_table_consts[table_idx].evs_brs[i][0] / FRAMES_PER_SEC ); - max_bits += ( int16_t )( ivas_spar_br_table_consts[table_idx].evs_brs[i][1] / FRAMES_PER_SEC ); + total_bits += (int16_t) ( ivas_spar_br_table_consts[table_idx].evs_brs[i][0] / FRAMES_PER_SEC ); + max_bits += (int16_t) ( ivas_spar_br_table_consts[table_idx].evs_brs[i][1] / FRAMES_PER_SEC ); } #ifndef ORDER_BITS_ADDITION if ( ivas_total_brate >= IVAS_256k ) @@ -2209,7 +2209,7 @@ void ivas_spar_bitrate_dist( sum_core_act_bits = 0; for ( i = 0; i < nchan_transport; i++ ) { - core_bits_act[i] = ( int16_t )( ivas_spar_br_table_consts[table_idx].evs_brs[i][0] / FRAMES_PER_SEC ); + core_bits_act[i] = (int16_t) ( ivas_spar_br_table_consts[table_idx].evs_brs[i][0] / FRAMES_PER_SEC ); sum_core_act_bits += core_bits_act[i]; } @@ -2221,7 +2221,7 @@ void ivas_spar_bitrate_dist( { for ( i = 0; i < nchan_transport; i++ ) { - core_range_bits[i] = ( int16_t )( ( ivas_spar_br_table_consts[table_idx].evs_brs[i][2] - ivas_spar_br_table_consts[table_idx].evs_brs[i][0] ) / FRAMES_PER_SEC ); + core_range_bits[i] = (int16_t) ( ( ivas_spar_br_table_consts[table_idx].evs_brs[i][2] - ivas_spar_br_table_consts[table_idx].evs_brs[i][0] ) / FRAMES_PER_SEC ); core_bits_act[i] += min( residual_bits, core_range_bits[i] ); residual_bits -= core_range_bits[i]; @@ -2235,7 +2235,7 @@ void ivas_spar_bitrate_dist( { for ( i = 0; i < nchan_transport; i++ ) { - core_range_bits[i] = ( int16_t )( ( ivas_spar_br_table_consts[table_idx].evs_brs[i][0] - ivas_spar_br_table_consts[table_idx].evs_brs[i][1] ) / FRAMES_PER_SEC ); + core_range_bits[i] = (int16_t) ( ( ivas_spar_br_table_consts[table_idx].evs_brs[i][0] - ivas_spar_br_table_consts[table_idx].evs_brs[i][1] ) / FRAMES_PER_SEC ); } overflow_bits = -residual_bits; diff --git a/lib_com/ivas_stereo_mdct_stereo_com.c b/lib_com/ivas_stereo_mdct_stereo_com.c index 7852d678be..7a57076416 100644 --- a/lib_com/ivas_stereo_mdct_stereo_com.c +++ b/lib_com/ivas_stereo_mdct_stereo_com.c @@ -48,12 +48,26 @@ void splitAvailableBits( const int16_t split_ratio, /* i : split ratio */ int16_t *bits_ch0, /* o : bits for channel 0 */ int16_t *bits_ch1 /* o : bits for channel 1 */ +#ifdef LBR_SBA_CORE_CODING_TUNING + , + const int16_t sba_mode /* i : signal core coding for sba */ +#endif ) { assert( split_ratio >= 1 && split_ratio < SMDCT_BITRATE_RATIO_RANGE ); - +#ifdef LBR_SBA_CORE_CODING_TUNING + *bits_ch0 = split_ratio * total_bits / SMDCT_BITRATE_RATIO_RANGE; + /* for SBA mode bias the distribution towards the W channel */ + if ( split_ratio < 7 && sba_mode ) + { + *bits_ch0 += (int16_t) ( 0.2 * *bits_ch0 ); + } +#else *bits_ch0 = split_ratio * total_bits / SMDCT_BITRATE_RATIO_RANGE; - *bits_ch1 = total_bits + 0 - *bits_ch0; +#endif + + + *bits_ch1 = total_bits - *bits_ch0; return; } diff --git a/lib_com/options.h b/lib_com/options.h index a51b60d748..d51cb719ab 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -60,14 +60,14 @@ /*#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/" */ /*#define DEBUG_MODE_DFT*/ /* output most important DFT stereo parameters to the subdirectory "res/" */ /*#define DEBUG_MODE_TD*/ /* output most important TD stereo parameters to the subdirectory "res/ */ /*#define DEBUG_MODE_DIRAC*/ /* output most important DIRAC parameters to the subdirectory "res/" */ -/*#define DEBUG_MODE_MDCT*/ /* output most important MDCT parameters to the subdirectory "res/" */ +#define DEBUG_MODE_MDCT /* output most important MDCT parameters to the subdirectory "res/" */ /*#define DEBUG_MODE_PARAM_MC */ /* output Parametric MC paramters to the subdirectory "res/" */ /*#define DEBUG_MODE_PARAM_ISM*/ /* output Parametric ISM paramters to the subdirectory "res/" */ #define DEBUG_MODE_INFO_TWEAK /* enable command line switch to specify subdirectory for debug info output inside "./res/" */ @@ -158,6 +158,7 @@ #define ORDER_BITS_ADDITION /* issue 14: Transmit SBA order and planar bits at all bitrates */ +#define LBR_SBA_CORE_CODING_TUNING /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ #endif diff --git a/lib_dec/ivas_cpe_dec.c b/lib_dec/ivas_cpe_dec.c index 2d2e4dc214..bd009cb413 100644 --- a/lib_dec/ivas_cpe_dec.c +++ b/lib_dec/ivas_cpe_dec.c @@ -362,7 +362,12 @@ ivas_error ivas_cpe_dec( if ( hCPE->element_mode != IVAS_CPE_DFT || ( hCPE->nchan_out == 1 && hCPE->hStereoDft->hConfig->res_cod_mode == STEREO_DFT_RES_COD_OFF ) ) { - if ( st_ivas->renderer_type == RENDERER_MC_PARAMMC && ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_MONO || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_STEREO ) ) +#ifndef LBR_SBA_CORE_CODING_TUNING + if ( ( st_ivas->renderer_type == RENDERER_MC_PARAMMC && ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_MONO || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_STEREO ) ) +#ifdef LBR_SBA_CORE_CODING_TUNING + || ( st_ivas->ivas_format == SBA_FORMAT && hCPE->element_brate == IVAS_48k ) +#endif + ) { if ( ( error = ivas_core_dec( st_ivas, NULL, hCPE, st_ivas->hMCT, n_channels, output, outputHB, NULL, 0 ) ) != IVAS_ERR_OK ) { @@ -376,6 +381,12 @@ ivas_error ivas_cpe_dec( return error; } } +#else + if ( ( error = ivas_core_dec( st_ivas, NULL, hCPE, st_ivas->hMCT, n_channels, output, outputHB, NULL, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } +#endif } if ( st_ivas->hMCT ) diff --git a/lib_dec/ivas_mct_dec_mct.c b/lib_dec/ivas_mct_dec_mct.c index c8d91b9b07..cc7afe9bf8 100644 --- a/lib_dec/ivas_mct_dec_mct.c +++ b/lib_dec/ivas_mct_dec_mct.c @@ -147,7 +147,12 @@ void ivas_mct_dec_mct( p_st[0] = sts[hBlock->ch1]; p_st[1] = sts[hBlock->ch2]; - parse_stereo_from_bitstream( hBlock->hStereoMdct, p_st, 1, sts[0], hBlock->mask ); + parse_stereo_from_bitstream( hBlock->hStereoMdct, p_st, 1, sts[0], hBlock->mask +#ifdef LBR_SBA_CORE_CODING_TUNING + , + 0 +#endif + ); } return; diff --git a/lib_dec/ivas_reverb.c b/lib_dec/ivas_reverb.c index c56b778138..3cdef9214a 100644 --- a/lib_dec/ivas_reverb.c +++ b/lib_dec/ivas_reverb.c @@ -48,7 +48,7 @@ * Local constants *------------------------------------------------------------------------------------------*/ -#define INNER_BLK_SIZE 80 /* size of data blocks used for more efficient delay line and IIR filter processing */ +#define INNER_BLK_SIZE 80 /* size of data blocks used for more efficient delay line and IIR filter processing */ /* should be a divisor of the frame length at any sampling rate and an even number*/ #define FFT_FILTER_WND_FLAT_REGION ( 0.40f ) /* flat section (==1) length of FFT filter window, in proportion to overlap */ #define FFT_FILTER_WND_TRANS_REGION ( 0.15f ) /* transition (1->0) length of FFT filter window, in proportion to overlap */ @@ -288,7 +288,7 @@ static ivas_error set_base_config( * Computes the downmix gain *-----------------------------------------------------------------------------------------*/ -static float calc_dmx_gain(void) +static float calc_dmx_gain( void ) { const float dist = DEFAULT_SRC_DIST; return sqrtf( 4.0f * EVS_PI * dist * dist / 0.001f ); @@ -747,8 +747,8 @@ static void clear_buffers( * Sets frame size and fft-filter related sizes *-----------------------------------------------------------------------------------------*/ -static void set_fft_and_datablock_sizes( - REVERB_HANDLE pState, +static void set_fft_and_datablock_sizes( + REVERB_HANDLE pState, const int16_t subframe_len ) { pState->full_block_size = subframe_len; @@ -784,15 +784,15 @@ static void set_fft_and_datablock_sizes( * Sets reverb acoustic data (room acoustics and HRTF), interpolating it to the filter grid *-----------------------------------------------------------------------------------------*/ -static void set_reverb_acoustic_data( - ivas_reverb_params_t *pParams, +static void set_reverb_acoustic_data( + ivas_reverb_params_t *pParams, #ifdef FIX_I68_MC_REVERB_FOR_514 - const AUDIO_CONFIG input_audio_config, + const AUDIO_CONFIG input_audio_config, #endif - const HRTFS_HANDLE hHrtf, - ivas_roomAcoustics_t *pRoomAcoustics, - const int16_t subframe_len, - const int16_t nr_fc_input, + const HRTFS_HANDLE hHrtf, + ivas_roomAcoustics_t *pRoomAcoustics, + const int16_t subframe_len, + const int16_t nr_fc_input, const int16_t nr_fc_fft_filter ) { int16_t nr_out_ch, hrtf_idx, offset, iter_idx, bin_idx; @@ -834,7 +834,7 @@ static void set_reverb_acoustic_data( #ifdef FIX_I68_MC_REVERB_FOR_514 ivas_reverb_get_hrtf_set_properties( pHrtf_set_l_re, pHrtf_set_l_im, pHrtf_set_r_re, pHrtf_set_r_im, input_audio_config, hHrtf->max_num_ir, subframe_len, nr_fc_fft_filter, pParams->pHrtf_avg_pwr_response_l, pParams->pHrtf_avg_pwr_response_r, pParams->pHrtf_inter_aural_coherence ); -#else /* FIX_I68_MC_REVERB_FOR_514 */ +#else /* FIX_I68_MC_REVERB_FOR_514 */ ivas_reverb_get_hrtf_set_properties( pHrtf_set_l_re, pHrtf_set_l_im, pHrtf_set_r_re, pHrtf_set_r_im, hHrtf->max_num_ir, subframe_len, nr_fc_fft_filter, pParams->pHrtf_avg_pwr_response_l, pParams->pHrtf_avg_pwr_response_r, pParams->pHrtf_inter_aural_coherence ); #endif /* FIX_I68_MC_REVERB_FOR_514 */ @@ -876,8 +876,8 @@ static void set_reverb_acoustic_data( * Sets up feedback delay network system *-----------------------------------------------------------------------------------------*/ -static ivas_error setup_FDN_branches( - REVERB_HANDLE pState, +static ivas_error setup_FDN_branches( + REVERB_HANDLE pState, ivas_reverb_params_t *pParams ) { int16_t nr_coefs, branch_idx, channel_idx; @@ -943,13 +943,13 @@ static ivas_error setup_FDN_branches( *------------------------------------------------------------------------*/ ivas_error ivas_reverb_open( - REVERB_HANDLE *hReverb, /* i/o: Reverberator handle */ + REVERB_HANDLE *hReverb, /* i/o: Reverberator handle */ #ifdef FIX_I68_MC_REVERB_FOR_514 - const AUDIO_CONFIG input_audio_config,/* i : reverb. input audio configuration */ + const AUDIO_CONFIG input_audio_config, /* i : reverb. input audio configuration */ #endif - const HRTFS_HANDLE hHrtf, /* i : HRTF handle */ - RENDER_CONFIG_HANDLE hRenderConfig, /* i : Renderer configuration handle */ - const int32_t output_Fs /* i : output sampling rate */ + const HRTFS_HANDLE hHrtf, /* i : HRTF handle */ + RENDER_CONFIG_HANDLE hRenderConfig, /* i : Renderer configuration handle */ + const int32_t output_Fs /* i : output sampling rate */ ) { ivas_error error; @@ -1024,7 +1024,7 @@ ivas_error ivas_reverb_open( /* set up reverb acoustic data on the basis of HRTF data and renderer config */ #ifdef FIX_I68_MC_REVERB_FOR_514 set_reverb_acoustic_data( ¶ms, input_audio_config, hHrtf, &hRenderConfig->roomAcoustics, subframe_len, nr_fc_input, nr_fc_fft_filter ); -#else /* FIX_I68_MC_REVERB_FOR_514 */ +#else /* FIX_I68_MC_REVERB_FOR_514 */ set_reverb_acoustic_data( ¶ms, hHrtf, &hRenderConfig->roomAcoustics, subframe_len, nr_fc_input, nr_fc_fft_filter ); #endif /* FIX_I68_MC_REVERB_FOR_514 */ @@ -1451,4 +1451,3 @@ ivas_error ivas_reverb_process( return IVAS_ERR_OK; } - diff --git a/lib_dec/ivas_reverb_utils.c b/lib_dec/ivas_reverb_utils.c index eb81313426..cbc62ab542 100644 --- a/lib_dec/ivas_reverb_utils.c +++ b/lib_dec/ivas_reverb_utils.c @@ -113,7 +113,7 @@ void ivas_reverb_prepare_cldfb_params( } ivas_reverb_get_fastconv_hrtf_set_energies( input_audio_config, use_brir, output_Fs, avg_pwr_left, avg_pwr_right ); - + for ( idx = 0; idx < CLDFB_NO_CHANNELS_MAX; idx++ ) { pOutput_ene[idx] *= 0.5f * ( avg_pwr_left[idx] + avg_pwr_right[idx] ) * dmx_gain_2; diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index 18fc4b4741..9826e2ac91 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -324,6 +324,9 @@ typedef struct stereo_mdct_dec_data_structure int16_t noise_seeds_channels[CPE_CHANNELS]; int16_t noise_seed_common; #endif +#ifdef LBR_SBA_CORE_CODING_TUNING + int16_t sba_mode; +#endif } STEREO_MDCT_DEC_DATA, *STEREO_MDCT_DEC_DATA_HANDLE; diff --git a/lib_dec/ivas_stereo_mdct_core_dec.c b/lib_dec/ivas_stereo_mdct_core_dec.c index d87be7f23a..2b05db00b9 100644 --- a/lib_dec/ivas_stereo_mdct_core_dec.c +++ b/lib_dec/ivas_stereo_mdct_core_dec.c @@ -116,12 +116,23 @@ static void stereo_mdct_dec_stereo( sts = hCPE->hCoreCoder; - parse_stereo_from_bitstream( hCPE->hStereoMdct, hCPE->hCoreCoder, 0, hCPE->hCoreCoder[0], ms_mask ); + parse_stereo_from_bitstream( hCPE->hStereoMdct, hCPE->hCoreCoder, 0, hCPE->hCoreCoder[0], ms_mask +#ifdef LBR_SBA_CORE_CODING_TUNING + , + hCPE->hStereoMdct->sba_mode +#endif + + ); /*Split available bits between channels */ availableBits = sts[0]->bits_frame_channel + sts[1]->bits_frame_channel - sts[0]->next_bit_pos - sts[0]->core * ( NF_GAIN_BITS + SMDCT_MINIMUM_ARITH_BITS ) - sts[1]->core * ( NF_GAIN_BITS + SMDCT_MINIMUM_ARITH_BITS ); - splitAvailableBits( availableBits, hCPE->hStereoMdct->split_ratio, &sts[0]->bits_frame_channel, &sts[1]->bits_frame_channel ); + splitAvailableBits( availableBits, hCPE->hStereoMdct->split_ratio, &sts[0]->bits_frame_channel, &sts[1]->bits_frame_channel +#ifdef LBR_SBA_CORE_CODING_TUNING + , + hCPE->hStereoMdct->sba_mode +#endif + ); sts[0]->bits_frame_channel += sts[0]->core * SMDCT_MINIMUM_ARITH_BITS; sts[1]->bits_frame_channel += sts[1]->core * SMDCT_MINIMUM_ARITH_BITS; @@ -217,6 +228,15 @@ void stereo_mdct_core_dec( initMdctStereoDecData( hCPE->hStereoMdct, sts[0]->igf, sts[0]->hIGFDec->igfData.igfInfo.grid, hCPE->element_brate, sts[0]->bwidth ); +#ifdef LBR_SBA_CORE_CODING_TUNING + hCPE->hStereoMdct->sba_mode = ( st_ivas->ivas_format == SBA_FORMAT && hCPE->element_brate <= IVAS_80k ); + /*to prevent unitialized values during condition checks for stereo IGF*/ + if ( hCPE->hStereoMdct->sba_mode ) + { + set_s( hCPE->hStereoMdct->IGFStereoMode, -1, 2 ); + } +#endif + if ( !bfi ) { ivas_mdct_dec_side_bits_frame_channel( hCPE, param_lpc, p_param, hCPE->hCoreCoder[0], NULL, nTnsBitsTCX10, param, 0, 0 ); @@ -287,7 +307,11 @@ void stereo_mdct_core_dec( for ( k = 0; k < nSubframes[0]; k++ ) { - if ( hCPE->hStereoMdct->IGFStereoMode[k] != SMDCT_DUAL_MONO || hCPE->hStereoMdct->mdct_stereo_mode[k] != SMDCT_DUAL_MONO ) + if ( ( hCPE->hStereoMdct->IGFStereoMode[k] != SMDCT_DUAL_MONO || hCPE->hStereoMdct->mdct_stereo_mode[k] != SMDCT_DUAL_MONO ) +#ifdef LBR_SBA_CORE_CODING_TUNING + && !hCPE->hStereoMdct->sba_mode +#endif + ) { assert( ( sts[0]->core == sts[1]->core ) || ( hCPE->hStereoMdct->mdct_stereo_mode[0] == SMDCT_DUAL_MONO ) ); @@ -363,7 +387,11 @@ void stereo_mdct_core_dec( mvs2s( ms_mask[1], hCPE->hStereoMdct->prev_ms_mask[1], MAX_SFB ); } - if ( !bfi || !( sts[0]->core == ACELP_CORE && sts[1]->core == ACELP_CORE ) ) + if ( ( !bfi || !( sts[0]->core == ACELP_CORE && sts[1]->core == ACELP_CORE ) ) +#ifdef LBR_SBA_CORE_CODING_TUNING + && !hCPE->hStereoMdct->sba_mode +#endif + ) { #ifdef DEBUGGING assert( ( sts[0]->core == sts[1]->core ) || ( ( hCPE->hStereoMdct->mdct_stereo_mode[0] == SMDCT_DUAL_MONO ) && ( hCPE->hStereoMdct->mdct_stereo_mode[1] == SMDCT_DUAL_MONO ) ) ); @@ -374,7 +402,11 @@ void stereo_mdct_core_dec( ivas_mdct_core_tns_ns( hCPE, 0, fUseTns, tnsData, x, Aq, 0 ); - if ( st_ivas != NULL && st_ivas->renderer_type == RENDERER_MC_PARAMMC && ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_MONO || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_STEREO ) ) + if ( +#ifndef LBR_SBA_CORE_CODING_TUNING + st_ivas != NULL && +#endif + st_ivas->renderer_type == RENDERER_MC_PARAMMC && ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_MONO || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_STEREO ) ) { ivas_ls_setup_conversion_process_mdct_param_mc( st_ivas, x ); } diff --git a/lib_dec/ivas_stereo_mdct_stereo_dec.c b/lib_dec/ivas_stereo_mdct_stereo_dec.c index 1762927e8d..a6a277ee6c 100644 --- a/lib_dec/ivas_stereo_mdct_stereo_dec.c +++ b/lib_dec/ivas_stereo_mdct_stereo_dec.c @@ -59,6 +59,10 @@ void parse_stereo_from_bitstream( const int16_t mct_on, /* i : flag mct block (1) or stereo (0)*/ Decoder_State *st0, /* i/o: decoder state structure for Bstr*/ int16_t ms_mask[NB_DIV][MAX_SFB] /* o : bandwise MS mask */ +#ifdef LBR_SBA_CORE_CODING_TUNING + , + const int16_t sba_mode /* i: flag core coding for sba */ +#endif ) { int16_t i, k, nSubframes, mdct_stereo_mode; @@ -66,114 +70,117 @@ void parse_stereo_from_bitstream( #ifdef DEBUGGING int16_t nbits_start = st0->next_bit_pos; #endif - - nSubframes = ( sts[0]->core == TCX_10_CORE || ( sts[0]->core != sts[1]->core ) ) ? NB_DIV : 1; - sfbConf = ( sts[0]->core == TCX_20_CORE ) ? &hStereoMdct->stbParamsTCX20 : &hStereoMdct->stbParamsTCX10; - if ( sts[0]->last_core_from_bs == ACELP_CORE ) - { - sfbConf = &hStereoMdct->stbParamsTCX20afterACELP; - } - - if ( hStereoMdct->use_itd ) - { - int16_t I; - - hStereoMdct->itd_mode = get_next_indice( st0, STEREO_DFT_ITD_MODE_NBITS ); - /*(*nb_bits) += STEREO_DFT_ITD_MODE_NBITS;*/ /*ITD mode flag: 1bit*/ - - hStereoMdct->itd = 0.f; - if ( hStereoMdct->itd_mode ) - { - /*(*nb_bits) += */ read_itd( st0, &I ); - stereo_dft_dequantize_itd( &I, &hStereoMdct->itd, st0->output_Fs ); - } - } - - for ( k = 0; k < nSubframes; k++ ) +#ifdef LBR_SBA_CORE_CODING_TUNING + if ( !sba_mode ) +#endif { - mdct_stereo_mode = get_next_indice( st0, 1 ); - if ( mdct_stereo_mode ) + nSubframes = ( sts[0]->core == TCX_10_CORE || ( sts[0]->core != sts[1]->core ) ) ? NB_DIV : 1; + sfbConf = ( sts[0]->core == TCX_20_CORE ) ? &hStereoMdct->stbParamsTCX20 : &hStereoMdct->stbParamsTCX10; + if ( sts[0]->last_core_from_bs == ACELP_CORE ) { - mdct_stereo_mode = 1 + get_next_indice( st0, 1 ); - } - switch ( mdct_stereo_mode ) - { - case 0: - hStereoMdct->mdct_stereo_mode[k] = SMDCT_DUAL_MONO; - break; - case 1: - hStereoMdct->mdct_stereo_mode[k] = SMDCT_MS_FULL; - break; - case 2: - hStereoMdct->mdct_stereo_mode[k] = SMDCT_BW_MS; - break; - default: - assert( !"Not supported stereo mode\n" ); + sfbConf = &hStereoMdct->stbParamsTCX20afterACELP; } - if ( !mct_on ) + if ( hStereoMdct->use_itd ) { - if ( sts[0]->core == sts[1]->core || k == 0 ) - { - hStereoMdct->global_ild[k] = get_next_indice( st0, SMDCT_GLOBAL_ILD_BITS ); - assert( ( hStereoMdct->global_ild[k] > 0 ) && ( hStereoMdct->global_ild[k] < SMDCT_ILD_RANGE ) ); - } - else - { - hStereoMdct->global_ild[1] = hStereoMdct->global_ild[0]; - } - } + int16_t I; - set_s( ms_mask[k], ( hStereoMdct->mdct_stereo_mode[k] == SMDCT_MS_FULL ) ? 1 : 0, sfbConf->nBandsStereoCore ); + hStereoMdct->itd_mode = get_next_indice( st0, STEREO_DFT_ITD_MODE_NBITS ); + /*(*nb_bits) += STEREO_DFT_ITD_MODE_NBITS;*/ /*ITD mode flag: 1bit*/ - if ( hStereoMdct->mdct_stereo_mode[k] == SMDCT_BW_MS ) - { - for ( i = 0; i < sfbConf->nBandsStereoCore; i++ ) + hStereoMdct->itd = 0.f; + if ( hStereoMdct->itd_mode ) { - ms_mask[k][i] = get_next_indice( st0, 1 ); + /*(*nb_bits) += */ read_itd( st0, &I ); + stereo_dft_dequantize_itd( &I, &hStereoMdct->itd, st0->output_Fs ); } } - if ( st0->igf ) + for ( k = 0; k < nSubframes; k++ ) { - mdct_stereo_mode = get_next_indice( st0, 1 ); if ( mdct_stereo_mode ) { mdct_stereo_mode = 1 + get_next_indice( st0, 1 ); } - switch ( mdct_stereo_mode ) { case 0: - hStereoMdct->IGFStereoMode[k] = SMDCT_DUAL_MONO; + hStereoMdct->mdct_stereo_mode[k] = SMDCT_DUAL_MONO; break; case 1: - hStereoMdct->IGFStereoMode[k] = SMDCT_MS_FULL; + hStereoMdct->mdct_stereo_mode[k] = SMDCT_MS_FULL; break; case 2: - hStereoMdct->IGFStereoMode[k] = SMDCT_BW_MS; + hStereoMdct->mdct_stereo_mode[k] = SMDCT_BW_MS; break; default: assert( !"Not supported stereo mode\n" ); } - set_s( &ms_mask[k][sfbConf->nBandsStereoCore], ( hStereoMdct->IGFStereoMode[k] == SMDCT_MS_FULL ) ? 1 : 0, sfbConf->sfbCnt - sfbConf->nBandsStereoCore ); + if ( !mct_on ) + { + if ( sts[0]->core == sts[1]->core || k == 0 ) + { + hStereoMdct->global_ild[k] = get_next_indice( st0, SMDCT_GLOBAL_ILD_BITS ); + assert( ( hStereoMdct->global_ild[k] > 0 ) && ( hStereoMdct->global_ild[k] < SMDCT_ILD_RANGE ) ); + } + else + { + hStereoMdct->global_ild[1] = hStereoMdct->global_ild[0]; + } + } + + set_s( ms_mask[k], ( hStereoMdct->mdct_stereo_mode[k] == SMDCT_MS_FULL ) ? 1 : 0, sfbConf->nBandsStereoCore ); - if ( hStereoMdct->IGFStereoMode[k] == SMDCT_BW_MS ) + if ( hStereoMdct->mdct_stereo_mode[k] == SMDCT_BW_MS ) { - for ( i = sfbConf->nBandsStereoCore; i < sfbConf->sfbCnt; i++ ) + for ( i = 0; i < sfbConf->nBandsStereoCore; i++ ) { ms_mask[k][i] = get_next_indice( st0, 1 ); } } - } - else - { - hStereoMdct->IGFStereoMode[k] = SMDCT_DUAL_MONO; + + if ( st0->igf ) + { + + mdct_stereo_mode = get_next_indice( st0, 1 ); + if ( mdct_stereo_mode ) + { + mdct_stereo_mode = 1 + get_next_indice( st0, 1 ); + } + + switch ( mdct_stereo_mode ) + { + case 0: + hStereoMdct->IGFStereoMode[k] = SMDCT_DUAL_MONO; + break; + case 1: + hStereoMdct->IGFStereoMode[k] = SMDCT_MS_FULL; + break; + case 2: + hStereoMdct->IGFStereoMode[k] = SMDCT_BW_MS; + break; + default: + assert( !"Not supported stereo mode\n" ); + } + + set_s( &ms_mask[k][sfbConf->nBandsStereoCore], ( hStereoMdct->IGFStereoMode[k] == SMDCT_MS_FULL ) ? 1 : 0, sfbConf->sfbCnt - sfbConf->nBandsStereoCore ); + + if ( hStereoMdct->IGFStereoMode[k] == SMDCT_BW_MS ) + { + for ( i = sfbConf->nBandsStereoCore; i < sfbConf->sfbCnt; i++ ) + { + ms_mask[k][i] = get_next_indice( st0, 1 ); + } + } + } + else + { + hStereoMdct->IGFStereoMode[k] = SMDCT_DUAL_MONO; + } } } - if ( !mct_on ) { hStereoMdct->split_ratio = SMDCT_EQUAL_RATIO_RANGE; /* Equal bits to both channels */ diff --git a/lib_enc/ivas_cpe_enc.c b/lib_enc/ivas_cpe_enc.c index 03a911d69f..fbe7770282 100644 --- a/lib_enc/ivas_cpe_enc.c +++ b/lib_enc/ivas_cpe_enc.c @@ -319,6 +319,9 @@ ivas_error ivas_cpe_enc( hCPE->hStereoMdct->mdct_stereo_mode_cmdl = hEncoderConfig->stereo_mode_cmdl; #endif initMdctStereoEncData( hCPE->hStereoMdct, ivas_format, hCPE->element_mode, hCPE->element_brate, max_bwidth, 0, NULL, 0 ); +#ifdef LBR_SBA_CORE_CODING_TUNING + hCPE->hStereoMdct->sba_mode = ( ivas_format == SBA_FORMAT && hCPE->element_brate <= IVAS_80k ); +#endif } } @@ -488,6 +491,9 @@ ivas_error ivas_cpe_enc( if ( sts[0]->bwidth != sts[0]->last_bwidth || ( ( hCPE->last_element_brate != hCPE->element_brate || hCPE->last_element_mode != hCPE->element_mode ) && sts[0]->bwidth != sts[0]->max_bwidth ) ) { initMdctStereoEncData( hCPE->hStereoMdct, ivas_format, hCPE->element_mode, hCPE->element_brate, sts[0]->bwidth, 0, NULL, 0 ); +#ifdef LBR_SBA_CORE_CODING_TUNING + hCPE->hStereoMdct->sba_mode = ( ivas_format == SBA_FORMAT && hCPE->element_brate <= IVAS_80k ); +#endif if ( hCPE->element_brate <= MAX_MDCT_ITD_BRATE && ivas_format == STEREO_FORMAT ) { @@ -947,6 +953,9 @@ ivas_error create_cpe_enc( hCPE->hStereoMdct->mdct_stereo_mode_cmdl = st_ivas->hEncoderConfig->mdct_stereo_mode_cmdl; #endif initMdctStereoEncData( hCPE->hStereoMdct, ivas_format, hCPE->element_mode, hCPE->element_brate, max_bwidth, 0, NULL, 1 ); +#ifdef LBR_SBA_CORE_CODING_TUNING + hCPE->hStereoMdct->sba_mode = ( ivas_format == SBA_FORMAT && hCPE->element_brate <= IVAS_80k ); +#endif if ( hCPE->element_mode == IVAS_CPE_MDCT && element_brate <= MAX_MDCT_ITD_BRATE && ivas_format == STEREO_FORMAT ) { diff --git a/lib_enc/ivas_mdct_core_enc.c b/lib_enc/ivas_mdct_core_enc.c index 6385d20b2d..10b8e886b6 100644 --- a/lib_enc/ivas_mdct_core_enc.c +++ b/lib_enc/ivas_mdct_core_enc.c @@ -713,7 +713,11 @@ void ivas_mdct_core_whitening_enc( sts[0]->hTcxEnc->fUseTns[1] = 0; - if ( sts[0]->element_brate < IVAS_80k && sts[0]->core == sts[1]->core && sts[0]->element_mode == IVAS_CPE_MDCT && !mct_on ) + if ( sts[0]->element_brate < IVAS_80k && sts[0]->core == sts[1]->core && sts[0]->element_mode == IVAS_CPE_MDCT && !mct_on +#ifdef LBR_SBA_CORE_CODING_TUNING + && !hCPE->hStereoMdct->sba_mode +#endif + ) { int16_t nSampCore; int32_t totalRate; diff --git a/lib_enc/ivas_sba_enc.c b/lib_enc/ivas_sba_enc.c index 3e9094c8e3..866db659b6 100644 --- a/lib_enc/ivas_sba_enc.c +++ b/lib_enc/ivas_sba_enc.c @@ -516,6 +516,9 @@ ivas_error ivas_sba_enc_reconfigure( } initMdctStereoEncData( st_ivas->hCPE[st_ivas->nCPE - 1]->hStereoMdct, st_ivas->hEncoderConfig->ivas_format, st_ivas->hCPE[st_ivas->nCPE - 1]->element_mode, st_ivas->hCPE[st_ivas->nCPE - 1]->element_brate, st_ivas->hEncoderConfig->max_bwidth, 0, NULL, 1 ); +#ifdef LBR_SBA_CORE_CODING_TUNING + st_ivas->hCPE[st_ivas->nCPE - 1]->hStereoMdct->sba_mode = ( st_ivas->hEncoderConfig->ivas_format == SBA_FORMAT && st_ivas->hCPE[st_ivas->nCPE - 1]->element_brate <= IVAS_80k ); +#endif } } } diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index 331e1a75e7..e4fd836265 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -311,6 +311,10 @@ typedef struct stereo_mdct_enc_data_structure int16_t sw_uncorr; +#ifdef LBR_SBA_CORE_CODING_TUNING + int16_t sba_mode; +#endif + } STEREO_MDCT_ENC_DATA, *STEREO_MDCT_ENC_DATA_HANDLE; diff --git a/lib_enc/ivas_stereo_mdct_core_enc.c b/lib_enc/ivas_stereo_mdct_core_enc.c old mode 100644 new mode 100755 index 710e671972..74f5ab1893 --- a/lib_enc/ivas_stereo_mdct_core_enc.c +++ b/lib_enc/ivas_stereo_mdct_core_enc.c @@ -253,9 +253,12 @@ void stereo_mdct_core_enc( /*--------------------------------------------------------------* * Stereo Processing *---------------------------------------------------------------*/ - - stereo_coder_tcx( hStereoMdct, sts, ms_mask, mdst_spectrum, inv_spectrum, inv_mdst_spectrum, 0 ); - +#ifdef LBR_SBA_CORE_CODING_TUNING + if ( !hStereoMdct->sba_mode ) +#endif + { + stereo_coder_tcx( hStereoMdct, sts, ms_mask, mdst_spectrum, inv_spectrum, inv_mdst_spectrum, 0 ); + } /*--------------------------------------------------------------* * Power spectrum calculation @@ -346,8 +349,12 @@ void stereo_mdct_core_enc( nSubframes = ( sts[0]->hTcxEnc->tcxMode == TCX_20 || sts[1]->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; for ( n = 0; n < nSubframes; n++ ) { - if ( hStereoMdct->mdct_stereo_mode[n] != hStereoMdct->IGFStereoMode[n] || - hStereoMdct->mdct_stereo_mode[n] == SMDCT_BW_MS ) + if ( ( hStereoMdct->mdct_stereo_mode[n] != hStereoMdct->IGFStereoMode[n] || + hStereoMdct->mdct_stereo_mode[n] == SMDCT_BW_MS ) +#ifdef LBR_SBA_CORE_CODING_TUNING + && !hStereoMdct->sba_mode +#endif + ) { ProcessStereoIGF( hStereoMdct, sts, ms_mask, orig_spectrum, powerSpec, powerSpecMsInv, inv_spectrum, n, hCPE->hCoreCoder[0]->sp_aud_decision0, hCPE->hCoreCoder[0]->element_brate, 0 ); } @@ -395,9 +402,18 @@ void stereo_mdct_core_enc( /* correct side bits per channel*/ sts[0]->side_bits_frame_channel -= SMDCT_NBBITS_SPLIT_RATIO; - - stereo_bits = write_stereo_to_bitstream( hStereoMdct, sts, ms_mask, 0, hBstr ); - +#ifdef LBR_SBA_CORE_CODING_TUNING + if ( !hStereoMdct->sba_mode ) +#endif + { + stereo_bits = write_stereo_to_bitstream( hStereoMdct, sts, ms_mask, 0, hBstr ); + } +#ifdef LBR_SBA_CORE_CODING_TUNING + else + { + stereo_bits = 0; + } +#endif /*--------------------------------------------------------------* * Split available bits between channels *---------------------------------------------------------------*/ @@ -413,7 +429,12 @@ void stereo_mdct_core_enc( nAvailBits -= meta_bits; nAvailBits -= SMDCT_NBBITS_SPLIT_RATIO; - splitAvailableBits( nAvailBits, hStereoMdct->split_ratio, &sts[0]->bits_frame_channel, &sts[1]->bits_frame_channel ); + splitAvailableBits( nAvailBits, hStereoMdct->split_ratio, &sts[0]->bits_frame_channel, &sts[1]->bits_frame_channel +#ifdef LBR_SBA_CORE_CODING_TUNING + , + hStereoMdct->sba_mode +#endif + ); #ifdef DEBUG_MODE_MDCT dbgwrite( &nAvailBits, sizeof( int16_t ), 1, 1, "./res/nAvailBits" ); #endif diff --git a/lib_enc/ivas_stereo_switching_enc.c b/lib_enc/ivas_stereo_switching_enc.c index 3074509870..cdcf749a96 100644 --- a/lib_enc/ivas_stereo_switching_enc.c +++ b/lib_enc/ivas_stereo_switching_enc.c @@ -536,6 +536,10 @@ ivas_error stereo_memory_enc( #endif initMdctStereoEncData( hCPE->hStereoMdct, ivas_format, hCPE->element_mode, hCPE->element_brate, hCPE->hCoreCoder[0]->max_bwidth, 0, NULL, 1 ); +#ifdef LBR_SBA_CORE_CODING_TUNING + hCPE->hStereoMdct->sba_mode = ( ivas_format == SBA_FORMAT && hCPE->element_brate <= IVAS_80k ); +#endif + if ( hCPE->element_mode == IVAS_CPE_MDCT && hCPE->element_brate <= MAX_MDCT_ITD_BRATE && ivas_format == STEREO_FORMAT ) { if ( ( error = initMdctItdHandling( hCPE->hStereoMdct, input_Fs ) ) != IVAS_ERR_OK ) -- GitLab From 667fb269c51c960fd4a2e0f4103c9a649970537f Mon Sep 17 00:00:00 2001 From: Eleni Fotopoulou Date: Wed, 10 Aug 2022 16:24:29 +0200 Subject: [PATCH 2/4] some cleanup under define LBR_SBA_CORE_CODING_TUNING and comment in options.h --- lib_com/ivas_stereo_mdct_stereo_com.c | 7 ++----- lib_com/options.h | 6 +++--- lib_dec/ivas_cpe_dec.c | 6 +----- 3 files changed, 6 insertions(+), 13 deletions(-) diff --git a/lib_com/ivas_stereo_mdct_stereo_com.c b/lib_com/ivas_stereo_mdct_stereo_com.c index 7a57076416..f3dfccc661 100644 --- a/lib_com/ivas_stereo_mdct_stereo_com.c +++ b/lib_com/ivas_stereo_mdct_stereo_com.c @@ -55,18 +55,15 @@ void splitAvailableBits( ) { assert( split_ratio >= 1 && split_ratio < SMDCT_BITRATE_RATIO_RANGE ); -#ifdef LBR_SBA_CORE_CODING_TUNING + *bits_ch0 = split_ratio * total_bits / SMDCT_BITRATE_RATIO_RANGE; +#ifdef LBR_SBA_CORE_CODING_TUNING /* for SBA mode bias the distribution towards the W channel */ if ( split_ratio < 7 && sba_mode ) { *bits_ch0 += (int16_t) ( 0.2 * *bits_ch0 ); } -#else - *bits_ch0 = split_ratio * total_bits / SMDCT_BITRATE_RATIO_RANGE; #endif - - *bits_ch1 = total_bits - *bits_ch0; return; diff --git a/lib_com/options.h b/lib_com/options.h index d51cb719ab..5a9d776402 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -60,14 +60,14 @@ /*#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/" */ /*#define DEBUG_MODE_DFT*/ /* output most important DFT stereo parameters to the subdirectory "res/" */ /*#define DEBUG_MODE_TD*/ /* output most important TD stereo parameters to the subdirectory "res/ */ /*#define DEBUG_MODE_DIRAC*/ /* output most important DIRAC parameters to the subdirectory "res/" */ -#define DEBUG_MODE_MDCT /* output most important MDCT parameters to the subdirectory "res/" */ +/*#define DEBUG_MODE_MDCT*/ /* output most important MDCT parameters to the subdirectory "res/" */ /*#define DEBUG_MODE_PARAM_MC */ /* output Parametric MC paramters to the subdirectory "res/" */ /*#define DEBUG_MODE_PARAM_ISM*/ /* output Parametric ISM paramters to the subdirectory "res/" */ #define DEBUG_MODE_INFO_TWEAK /* enable command line switch to specify subdirectory for debug info output inside "./res/" */ @@ -157,8 +157,8 @@ #define FIX_I25_FBE_FB_BITS /* issue 25: properly skip reading of TBE FB bits when decoder output sampling rate is not 48 kHz */ #define ORDER_BITS_ADDITION /* issue 14: Transmit SBA order and planar bits at all bitrates */ +#define LBR_SBA_CORE_CODING_TUNING /* Contribution "3 Core Coder Tuning for low bitrate SBA with 2 TCs" */ -#define LBR_SBA_CORE_CODING_TUNING /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ #endif diff --git a/lib_dec/ivas_cpe_dec.c b/lib_dec/ivas_cpe_dec.c index bd009cb413..e06f5fd055 100644 --- a/lib_dec/ivas_cpe_dec.c +++ b/lib_dec/ivas_cpe_dec.c @@ -363,11 +363,7 @@ ivas_error ivas_cpe_dec( if ( hCPE->element_mode != IVAS_CPE_DFT || ( hCPE->nchan_out == 1 && hCPE->hStereoDft->hConfig->res_cod_mode == STEREO_DFT_RES_COD_OFF ) ) { #ifndef LBR_SBA_CORE_CODING_TUNING - if ( ( st_ivas->renderer_type == RENDERER_MC_PARAMMC && ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_MONO || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_STEREO ) ) -#ifdef LBR_SBA_CORE_CODING_TUNING - || ( st_ivas->ivas_format == SBA_FORMAT && hCPE->element_brate == IVAS_48k ) -#endif - ) + if ( st_ivas->renderer_type == RENDERER_MC_PARAMMC && ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_MONO || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_STEREO ) ) { if ( ( error = ivas_core_dec( st_ivas, NULL, hCPE, st_ivas->hMCT, n_channels, output, outputHB, NULL, 0 ) ) != IVAS_ERR_OK ) { -- GitLab From d06cd3c94042309860056ff666b2e87af52abc3e Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Fri, 19 Aug 2022 13:02:32 +0200 Subject: [PATCH 3/4] rename sba_mode into isSBAStereoMode, to avoid confusion with other sba_mode variable --- lib_com/ivas_prot.h | 18 ++++++++++-------- lib_com/ivas_sba_config.c | 2 +- lib_com/ivas_stereo_mdct_stereo_com.c | 13 ++++++------- lib_dec/ivas_mct_dec_mct.c | 7 +++---- lib_dec/ivas_stat_dec.h | 2 +- lib_dec/ivas_stereo_mdct_core_dec.c | 23 ++++++++++------------- lib_dec/ivas_stereo_mdct_stereo_dec.c | 9 ++++----- lib_enc/ivas_cpe_enc.c | 6 +++--- lib_enc/ivas_mdct_core_enc.c | 2 +- lib_enc/ivas_sba_enc.c | 2 +- lib_enc/ivas_stat_enc.h | 2 +- lib_enc/ivas_stereo_mdct_core_enc.c | 13 ++++++------- lib_enc/ivas_stereo_switching_enc.c | 2 +- 13 files changed, 48 insertions(+), 53 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 08de7996dd..c15995d0a8 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -2155,12 +2155,11 @@ void stereo_mdct_core_dec( void splitAvailableBits( const int16_t total_bits, /* i : total available bits for TCX coding */ const int16_t split_ratio, /* i : split ratio */ - int16_t *bits_ch0, /* o : bits for channel 0 */ - int16_t *bits_ch1 /* o : bits for channel 1 */ #ifdef LBR_SBA_CORE_CODING_TUNING - , - const int16_t sba_mode /* i : signal core coding for sba */ + const int16_t isSBAStereoMode, /* i : signal core coding for sba */ #endif + int16_t *bits_ch0, /* o : bits for channel 0 */ + int16_t *bits_ch1 /* o : bits for channel 1 */ ); int16_t write_stereo_to_bitstream @@ -2176,12 +2175,11 @@ void parse_stereo_from_bitstream( STEREO_MDCT_DEC_DATA_HANDLE hStereoMdct, /* i/o: MDCT stereo decoder structure */ Decoder_State **sts, /* i/o: decoder state structure */ const int16_t mct_on, /* i : flag mct block (1) or stereo (0) */ - Decoder_State *st0, /* i/o: decoder state structure for Bstr */ - int16_t ms_mask[NB_DIV][MAX_SFB] /* o : bandwise MS mask */ #ifdef LBR_SBA_CORE_CODING_TUNING - , - const int16_t sba_mode /* i: flag core coding for sba */ + const int16_t isSBAStereoMode, /* i: flag core coding for sba */ #endif + Decoder_State *st0, /* i/o: decoder state structure for Bstr */ + int16_t ms_mask[NB_DIV][MAX_SFB] /* o : bandwise MS mask */ ); void FindSplitRatio( @@ -3014,7 +3012,11 @@ void ivas_dirac_param_est_enc( *----------------------------------------------------------------------------------*/ /*! r: SBA format mode */ +#ifdef LBR_SBA_CORE_CODING_TUNING +SBA_MODE ivas_sba_mode_select( +#else int16_t ivas_sba_mode_select( +#endif const int32_t ivas_total_brate /* i : IVAS total bitrate */ ); diff --git a/lib_com/ivas_sba_config.c b/lib_com/ivas_sba_config.c index c284c5778a..28a66df68f 100644 --- a/lib_com/ivas_sba_config.c +++ b/lib_com/ivas_sba_config.c @@ -54,7 +54,7 @@ *-------------------------------------------------------------------*/ /*! r: SBA format mode */ -int16_t ivas_sba_mode_select( +SBA_MODE ivas_sba_mode_select( const int32_t ivas_total_brate /* i : IVAS total bitrate */ ) { diff --git a/lib_com/ivas_stereo_mdct_stereo_com.c b/lib_com/ivas_stereo_mdct_stereo_com.c index f3dfccc661..1b8caa0c7c 100644 --- a/lib_com/ivas_stereo_mdct_stereo_com.c +++ b/lib_com/ivas_stereo_mdct_stereo_com.c @@ -44,14 +44,13 @@ *-------------------------------------------------------------------*/ void splitAvailableBits( - const int16_t total_bits, /* i : total available bits for TCX coding */ - const int16_t split_ratio, /* i : split ratio */ - int16_t *bits_ch0, /* o : bits for channel 0 */ - int16_t *bits_ch1 /* o : bits for channel 1 */ + const int16_t total_bits, /* i : total available bits for TCX coding */ + const int16_t split_ratio, /* i : split ratio */ #ifdef LBR_SBA_CORE_CODING_TUNING - , - const int16_t sba_mode /* i : signal core coding for sba */ + const int16_t isSBAStereoMode, /* i : signal core coding for sba */ #endif + int16_t *bits_ch0, /* o : bits for channel 0 */ + int16_t *bits_ch1 /* o : bits for channel 1 */ ) { assert( split_ratio >= 1 && split_ratio < SMDCT_BITRATE_RATIO_RANGE ); @@ -59,7 +58,7 @@ void splitAvailableBits( *bits_ch0 = split_ratio * total_bits / SMDCT_BITRATE_RATIO_RANGE; #ifdef LBR_SBA_CORE_CODING_TUNING /* for SBA mode bias the distribution towards the W channel */ - if ( split_ratio < 7 && sba_mode ) + if ( split_ratio < 7 && isSBAStereoMode ) { *bits_ch0 += (int16_t) ( 0.2 * *bits_ch0 ); } diff --git a/lib_dec/ivas_mct_dec_mct.c b/lib_dec/ivas_mct_dec_mct.c index cc7afe9bf8..1d1ccb0a3a 100644 --- a/lib_dec/ivas_mct_dec_mct.c +++ b/lib_dec/ivas_mct_dec_mct.c @@ -147,12 +147,11 @@ void ivas_mct_dec_mct( p_st[0] = sts[hBlock->ch1]; p_st[1] = sts[hBlock->ch2]; - parse_stereo_from_bitstream( hBlock->hStereoMdct, p_st, 1, sts[0], hBlock->mask #ifdef LBR_SBA_CORE_CODING_TUNING - , - 0 + parse_stereo_from_bitstream( hBlock->hStereoMdct, p_st, 1, 0, sts[0], hBlock->mask ); +#else + parse_stereo_from_bitstream( hBlock->hStereoMdct, p_st, 1, sts[0], hBlock->mask ); #endif - ); } return; diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index 9826e2ac91..51824e1f41 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -325,7 +325,7 @@ typedef struct stereo_mdct_dec_data_structure int16_t noise_seed_common; #endif #ifdef LBR_SBA_CORE_CODING_TUNING - int16_t sba_mode; + int16_t isSBAStereoMode; #endif } STEREO_MDCT_DEC_DATA, *STEREO_MDCT_DEC_DATA_HANDLE; diff --git a/lib_dec/ivas_stereo_mdct_core_dec.c b/lib_dec/ivas_stereo_mdct_core_dec.c index 2b05db00b9..ae1c8d5268 100644 --- a/lib_dec/ivas_stereo_mdct_core_dec.c +++ b/lib_dec/ivas_stereo_mdct_core_dec.c @@ -116,23 +116,20 @@ static void stereo_mdct_dec_stereo( sts = hCPE->hCoreCoder; - parse_stereo_from_bitstream( hCPE->hStereoMdct, hCPE->hCoreCoder, 0, hCPE->hCoreCoder[0], ms_mask #ifdef LBR_SBA_CORE_CODING_TUNING - , - hCPE->hStereoMdct->sba_mode + parse_stereo_from_bitstream( hCPE->hStereoMdct, hCPE->hCoreCoder, 0, hCPE->hStereoMdct->isSBAStereoMode, hCPE->hCoreCoder[0], ms_mask ); +#else + parse_stereo_from_bitstream( hCPE->hStereoMdct, hCPE->hCoreCoder, 0, hCPE->hCoreCoder[0], ms_mask ); #endif - ); - /*Split available bits between channels */ availableBits = sts[0]->bits_frame_channel + sts[1]->bits_frame_channel - sts[0]->next_bit_pos - sts[0]->core * ( NF_GAIN_BITS + SMDCT_MINIMUM_ARITH_BITS ) - sts[1]->core * ( NF_GAIN_BITS + SMDCT_MINIMUM_ARITH_BITS ); - splitAvailableBits( availableBits, hCPE->hStereoMdct->split_ratio, &sts[0]->bits_frame_channel, &sts[1]->bits_frame_channel #ifdef LBR_SBA_CORE_CODING_TUNING - , - hCPE->hStereoMdct->sba_mode + splitAvailableBits( availableBits, hCPE->hStereoMdct->split_ratio, hCPE->hStereoMdct->isSBAStereoMode, &sts[0]->bits_frame_channel, &sts[1]->bits_frame_channel ); +#else + splitAvailableBits( availableBits, hCPE->hStereoMdct->split_ratio, &sts[0]->bits_frame_channel, &sts[1]->bits_frame_channel ); #endif - ); sts[0]->bits_frame_channel += sts[0]->core * SMDCT_MINIMUM_ARITH_BITS; sts[1]->bits_frame_channel += sts[1]->core * SMDCT_MINIMUM_ARITH_BITS; @@ -229,9 +226,9 @@ void stereo_mdct_core_dec( initMdctStereoDecData( hCPE->hStereoMdct, sts[0]->igf, sts[0]->hIGFDec->igfData.igfInfo.grid, hCPE->element_brate, sts[0]->bwidth ); #ifdef LBR_SBA_CORE_CODING_TUNING - hCPE->hStereoMdct->sba_mode = ( st_ivas->ivas_format == SBA_FORMAT && hCPE->element_brate <= IVAS_80k ); + hCPE->hStereoMdct->isSBAStereoMode = ( st_ivas->ivas_format == SBA_FORMAT && hCPE->element_brate <= IVAS_80k ); /*to prevent unitialized values during condition checks for stereo IGF*/ - if ( hCPE->hStereoMdct->sba_mode ) + if ( hCPE->hStereoMdct->isSBAStereoMode ) { set_s( hCPE->hStereoMdct->IGFStereoMode, -1, 2 ); } @@ -309,7 +306,7 @@ void stereo_mdct_core_dec( { if ( ( hCPE->hStereoMdct->IGFStereoMode[k] != SMDCT_DUAL_MONO || hCPE->hStereoMdct->mdct_stereo_mode[k] != SMDCT_DUAL_MONO ) #ifdef LBR_SBA_CORE_CODING_TUNING - && !hCPE->hStereoMdct->sba_mode + && !hCPE->hStereoMdct->isSBAStereoMode #endif ) { @@ -389,7 +386,7 @@ void stereo_mdct_core_dec( if ( ( !bfi || !( sts[0]->core == ACELP_CORE && sts[1]->core == ACELP_CORE ) ) #ifdef LBR_SBA_CORE_CODING_TUNING - && !hCPE->hStereoMdct->sba_mode + && !hCPE->hStereoMdct->isSBAStereoMode #endif ) { diff --git a/lib_dec/ivas_stereo_mdct_stereo_dec.c b/lib_dec/ivas_stereo_mdct_stereo_dec.c index a6a277ee6c..05c9c12ae2 100644 --- a/lib_dec/ivas_stereo_mdct_stereo_dec.c +++ b/lib_dec/ivas_stereo_mdct_stereo_dec.c @@ -57,12 +57,11 @@ void parse_stereo_from_bitstream( STEREO_MDCT_DEC_DATA_HANDLE hStereoMdct, /* i/o: MDCT stereo decoder structure */ Decoder_State **sts, /* i/o: decoder state structure */ const int16_t mct_on, /* i : flag mct block (1) or stereo (0)*/ - Decoder_State *st0, /* i/o: decoder state structure for Bstr*/ - int16_t ms_mask[NB_DIV][MAX_SFB] /* o : bandwise MS mask */ #ifdef LBR_SBA_CORE_CODING_TUNING - , - const int16_t sba_mode /* i: flag core coding for sba */ + const int16_t isSBAStereoMode, /* i : flag core coding for sba */ #endif + Decoder_State *st0, /* i/o: decoder state structure for Bstr*/ + int16_t ms_mask[NB_DIV][MAX_SFB] /* o : bandwise MS mask */ ) { int16_t i, k, nSubframes, mdct_stereo_mode; @@ -71,7 +70,7 @@ void parse_stereo_from_bitstream( int16_t nbits_start = st0->next_bit_pos; #endif #ifdef LBR_SBA_CORE_CODING_TUNING - if ( !sba_mode ) + if ( !isSBAStereoMode ) #endif { nSubframes = ( sts[0]->core == TCX_10_CORE || ( sts[0]->core != sts[1]->core ) ) ? NB_DIV : 1; diff --git a/lib_enc/ivas_cpe_enc.c b/lib_enc/ivas_cpe_enc.c index fbe7770282..3feaddb3a7 100644 --- a/lib_enc/ivas_cpe_enc.c +++ b/lib_enc/ivas_cpe_enc.c @@ -320,7 +320,7 @@ ivas_error ivas_cpe_enc( #endif initMdctStereoEncData( hCPE->hStereoMdct, ivas_format, hCPE->element_mode, hCPE->element_brate, max_bwidth, 0, NULL, 0 ); #ifdef LBR_SBA_CORE_CODING_TUNING - hCPE->hStereoMdct->sba_mode = ( ivas_format == SBA_FORMAT && hCPE->element_brate <= IVAS_80k ); + hCPE->hStereoMdct->isSBAStereoMode = ( ivas_format == SBA_FORMAT && hCPE->element_brate <= IVAS_80k ); #endif } } @@ -492,7 +492,7 @@ ivas_error ivas_cpe_enc( { initMdctStereoEncData( hCPE->hStereoMdct, ivas_format, hCPE->element_mode, hCPE->element_brate, sts[0]->bwidth, 0, NULL, 0 ); #ifdef LBR_SBA_CORE_CODING_TUNING - hCPE->hStereoMdct->sba_mode = ( ivas_format == SBA_FORMAT && hCPE->element_brate <= IVAS_80k ); + hCPE->hStereoMdct->isSBAStereoMode = ( ivas_format == SBA_FORMAT && hCPE->element_brate <= IVAS_80k ); #endif if ( hCPE->element_brate <= MAX_MDCT_ITD_BRATE && ivas_format == STEREO_FORMAT ) @@ -954,7 +954,7 @@ ivas_error create_cpe_enc( #endif initMdctStereoEncData( hCPE->hStereoMdct, ivas_format, hCPE->element_mode, hCPE->element_brate, max_bwidth, 0, NULL, 1 ); #ifdef LBR_SBA_CORE_CODING_TUNING - hCPE->hStereoMdct->sba_mode = ( ivas_format == SBA_FORMAT && hCPE->element_brate <= IVAS_80k ); + hCPE->hStereoMdct->isSBAStereoMode = ( ivas_format == SBA_FORMAT && hCPE->element_brate <= IVAS_80k ); #endif if ( hCPE->element_mode == IVAS_CPE_MDCT && element_brate <= MAX_MDCT_ITD_BRATE && ivas_format == STEREO_FORMAT ) diff --git a/lib_enc/ivas_mdct_core_enc.c b/lib_enc/ivas_mdct_core_enc.c index 10b8e886b6..ceea41bcac 100644 --- a/lib_enc/ivas_mdct_core_enc.c +++ b/lib_enc/ivas_mdct_core_enc.c @@ -715,7 +715,7 @@ void ivas_mdct_core_whitening_enc( if ( sts[0]->element_brate < IVAS_80k && sts[0]->core == sts[1]->core && sts[0]->element_mode == IVAS_CPE_MDCT && !mct_on #ifdef LBR_SBA_CORE_CODING_TUNING - && !hCPE->hStereoMdct->sba_mode + && !hCPE->hStereoMdct->isSBAStereoMode #endif ) { diff --git a/lib_enc/ivas_sba_enc.c b/lib_enc/ivas_sba_enc.c index 866db659b6..cf603aa3e5 100644 --- a/lib_enc/ivas_sba_enc.c +++ b/lib_enc/ivas_sba_enc.c @@ -517,7 +517,7 @@ ivas_error ivas_sba_enc_reconfigure( initMdctStereoEncData( st_ivas->hCPE[st_ivas->nCPE - 1]->hStereoMdct, st_ivas->hEncoderConfig->ivas_format, st_ivas->hCPE[st_ivas->nCPE - 1]->element_mode, st_ivas->hCPE[st_ivas->nCPE - 1]->element_brate, st_ivas->hEncoderConfig->max_bwidth, 0, NULL, 1 ); #ifdef LBR_SBA_CORE_CODING_TUNING - st_ivas->hCPE[st_ivas->nCPE - 1]->hStereoMdct->sba_mode = ( st_ivas->hEncoderConfig->ivas_format == SBA_FORMAT && st_ivas->hCPE[st_ivas->nCPE - 1]->element_brate <= IVAS_80k ); + st_ivas->hCPE[st_ivas->nCPE - 1]->hStereoMdct->isSBAStereoMode = ( st_ivas->hEncoderConfig->ivas_format == SBA_FORMAT && st_ivas->hCPE[st_ivas->nCPE - 1]->element_brate <= IVAS_80k ); #endif } } diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index e4fd836265..68426b07e9 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -312,7 +312,7 @@ typedef struct stereo_mdct_enc_data_structure int16_t sw_uncorr; #ifdef LBR_SBA_CORE_CODING_TUNING - int16_t sba_mode; + int16_t isSBAStereoMode; #endif } STEREO_MDCT_ENC_DATA, *STEREO_MDCT_ENC_DATA_HANDLE; diff --git a/lib_enc/ivas_stereo_mdct_core_enc.c b/lib_enc/ivas_stereo_mdct_core_enc.c index 74f5ab1893..00a47e3706 100755 --- a/lib_enc/ivas_stereo_mdct_core_enc.c +++ b/lib_enc/ivas_stereo_mdct_core_enc.c @@ -254,7 +254,7 @@ void stereo_mdct_core_enc( * Stereo Processing *---------------------------------------------------------------*/ #ifdef LBR_SBA_CORE_CODING_TUNING - if ( !hStereoMdct->sba_mode ) + if ( !hStereoMdct->isSBAStereoMode ) #endif { stereo_coder_tcx( hStereoMdct, sts, ms_mask, mdst_spectrum, inv_spectrum, inv_mdst_spectrum, 0 ); @@ -352,7 +352,7 @@ void stereo_mdct_core_enc( if ( ( hStereoMdct->mdct_stereo_mode[n] != hStereoMdct->IGFStereoMode[n] || hStereoMdct->mdct_stereo_mode[n] == SMDCT_BW_MS ) #ifdef LBR_SBA_CORE_CODING_TUNING - && !hStereoMdct->sba_mode + && !hStereoMdct->isSBAStereoMode #endif ) { @@ -403,7 +403,7 @@ void stereo_mdct_core_enc( /* correct side bits per channel*/ sts[0]->side_bits_frame_channel -= SMDCT_NBBITS_SPLIT_RATIO; #ifdef LBR_SBA_CORE_CODING_TUNING - if ( !hStereoMdct->sba_mode ) + if ( !hStereoMdct->isSBAStereoMode ) #endif { stereo_bits = write_stereo_to_bitstream( hStereoMdct, sts, ms_mask, 0, hBstr ); @@ -429,12 +429,11 @@ void stereo_mdct_core_enc( nAvailBits -= meta_bits; nAvailBits -= SMDCT_NBBITS_SPLIT_RATIO; - splitAvailableBits( nAvailBits, hStereoMdct->split_ratio, &sts[0]->bits_frame_channel, &sts[1]->bits_frame_channel #ifdef LBR_SBA_CORE_CODING_TUNING - , - hStereoMdct->sba_mode + splitAvailableBits( nAvailBits, hStereoMdct->split_ratio, hStereoMdct->isSBAStereoMode, &sts[0]->bits_frame_channel, &sts[1]->bits_frame_channel ); +#else + splitAvailableBits( nAvailBits, hStereoMdct->split_ratio, &sts[0]->bits_frame_channel, &sts[1]->bits_frame_channel ); #endif - ); #ifdef DEBUG_MODE_MDCT dbgwrite( &nAvailBits, sizeof( int16_t ), 1, 1, "./res/nAvailBits" ); #endif diff --git a/lib_enc/ivas_stereo_switching_enc.c b/lib_enc/ivas_stereo_switching_enc.c index cdcf749a96..137eaeafbf 100644 --- a/lib_enc/ivas_stereo_switching_enc.c +++ b/lib_enc/ivas_stereo_switching_enc.c @@ -537,7 +537,7 @@ ivas_error stereo_memory_enc( initMdctStereoEncData( hCPE->hStereoMdct, ivas_format, hCPE->element_mode, hCPE->element_brate, hCPE->hCoreCoder[0]->max_bwidth, 0, NULL, 1 ); #ifdef LBR_SBA_CORE_CODING_TUNING - hCPE->hStereoMdct->sba_mode = ( ivas_format == SBA_FORMAT && hCPE->element_brate <= IVAS_80k ); + hCPE->hStereoMdct->isSBAStereoMode = ( ivas_format == SBA_FORMAT && hCPE->element_brate <= IVAS_80k ); #endif if ( hCPE->element_mode == IVAS_CPE_MDCT && hCPE->element_brate <= MAX_MDCT_ITD_BRATE && ivas_format == STEREO_FORMAT ) -- GitLab From 5255cb4f5a585dc2950968b11829d61ccf96b467 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Fri, 19 Aug 2022 13:36:55 +0200 Subject: [PATCH 4/4] make contribution dependent on number of TCs instead bitrate; BE --- lib_com/ivas_prot.h | 5 +++++ lib_dec/ivas_stereo_mdct_core_dec.c | 2 +- lib_enc/ivas_cpe_enc.c | 10 +++++++--- lib_enc/ivas_sba_enc.c | 2 +- lib_enc/ivas_stereo_switching_enc.c | 6 +++++- 5 files changed, 19 insertions(+), 6 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index c15995d0a8..09c70c28b7 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -2513,6 +2513,11 @@ ivas_error stereo_memory_enc( const int16_t max_bwidth, /* i : maximum audio bandwidth */ float *tdm_last_ratio, /* o : TD stereo last ratio */ const IVAS_FORMAT ivas_format /* i : IVAS format */ +#ifdef LBR_SBA_CORE_CODING_TUNING + , + const int16_t nchan_transport /* i : number transport chans */ +#endif + ); ivas_error stereo_memory_dec( diff --git a/lib_dec/ivas_stereo_mdct_core_dec.c b/lib_dec/ivas_stereo_mdct_core_dec.c index ae1c8d5268..faf86eeb06 100644 --- a/lib_dec/ivas_stereo_mdct_core_dec.c +++ b/lib_dec/ivas_stereo_mdct_core_dec.c @@ -226,7 +226,7 @@ void stereo_mdct_core_dec( initMdctStereoDecData( hCPE->hStereoMdct, sts[0]->igf, sts[0]->hIGFDec->igfData.igfInfo.grid, hCPE->element_brate, sts[0]->bwidth ); #ifdef LBR_SBA_CORE_CODING_TUNING - hCPE->hStereoMdct->isSBAStereoMode = ( st_ivas->ivas_format == SBA_FORMAT && hCPE->element_brate <= IVAS_80k ); + hCPE->hStereoMdct->isSBAStereoMode = ( (st_ivas->ivas_format == SBA_FORMAT) && (st_ivas->nchan_transport == 2) ); /*to prevent unitialized values during condition checks for stereo IGF*/ if ( hCPE->hStereoMdct->isSBAStereoMode ) { diff --git a/lib_enc/ivas_cpe_enc.c b/lib_enc/ivas_cpe_enc.c index 3feaddb3a7..ca910fd045 100644 --- a/lib_enc/ivas_cpe_enc.c +++ b/lib_enc/ivas_cpe_enc.c @@ -187,7 +187,11 @@ ivas_error ivas_cpe_enc( * dynamically allocate data structures depending on the actual stereo mode *----------------------------------------------------------------*/ +#ifdef LBR_SBA_CORE_CODING_TUNING + if ( ( error = stereo_memory_enc( hCPE, input_Fs, max_bwidth, &tdm_last_ratio, ivas_format, st_ivas->nchan_transport ) ) != IVAS_ERR_OK ) +#else if ( ( error = stereo_memory_enc( hCPE, input_Fs, max_bwidth, &tdm_last_ratio, ivas_format ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -320,7 +324,7 @@ ivas_error ivas_cpe_enc( #endif initMdctStereoEncData( hCPE->hStereoMdct, ivas_format, hCPE->element_mode, hCPE->element_brate, max_bwidth, 0, NULL, 0 ); #ifdef LBR_SBA_CORE_CODING_TUNING - hCPE->hStereoMdct->isSBAStereoMode = ( ivas_format == SBA_FORMAT && hCPE->element_brate <= IVAS_80k ); + hCPE->hStereoMdct->isSBAStereoMode = ( (ivas_format == SBA_FORMAT) && (st_ivas->nchan_transport == 2) ); #endif } } @@ -492,7 +496,7 @@ ivas_error ivas_cpe_enc( { initMdctStereoEncData( hCPE->hStereoMdct, ivas_format, hCPE->element_mode, hCPE->element_brate, sts[0]->bwidth, 0, NULL, 0 ); #ifdef LBR_SBA_CORE_CODING_TUNING - hCPE->hStereoMdct->isSBAStereoMode = ( ivas_format == SBA_FORMAT && hCPE->element_brate <= IVAS_80k ); + hCPE->hStereoMdct->isSBAStereoMode = ( (ivas_format == SBA_FORMAT) && (st_ivas->nchan_transport == 2) ); #endif if ( hCPE->element_brate <= MAX_MDCT_ITD_BRATE && ivas_format == STEREO_FORMAT ) @@ -954,7 +958,7 @@ ivas_error create_cpe_enc( #endif initMdctStereoEncData( hCPE->hStereoMdct, ivas_format, hCPE->element_mode, hCPE->element_brate, max_bwidth, 0, NULL, 1 ); #ifdef LBR_SBA_CORE_CODING_TUNING - hCPE->hStereoMdct->isSBAStereoMode = ( ivas_format == SBA_FORMAT && hCPE->element_brate <= IVAS_80k ); + hCPE->hStereoMdct->isSBAStereoMode = ( (ivas_format == SBA_FORMAT) && (st_ivas->nchan_transport == 2) ); #endif if ( hCPE->element_mode == IVAS_CPE_MDCT && element_brate <= MAX_MDCT_ITD_BRATE && ivas_format == STEREO_FORMAT ) diff --git a/lib_enc/ivas_sba_enc.c b/lib_enc/ivas_sba_enc.c index cf603aa3e5..acce4615af 100644 --- a/lib_enc/ivas_sba_enc.c +++ b/lib_enc/ivas_sba_enc.c @@ -517,7 +517,7 @@ ivas_error ivas_sba_enc_reconfigure( initMdctStereoEncData( st_ivas->hCPE[st_ivas->nCPE - 1]->hStereoMdct, st_ivas->hEncoderConfig->ivas_format, st_ivas->hCPE[st_ivas->nCPE - 1]->element_mode, st_ivas->hCPE[st_ivas->nCPE - 1]->element_brate, st_ivas->hEncoderConfig->max_bwidth, 0, NULL, 1 ); #ifdef LBR_SBA_CORE_CODING_TUNING - st_ivas->hCPE[st_ivas->nCPE - 1]->hStereoMdct->isSBAStereoMode = ( st_ivas->hEncoderConfig->ivas_format == SBA_FORMAT && st_ivas->hCPE[st_ivas->nCPE - 1]->element_brate <= IVAS_80k ); + st_ivas->hCPE[st_ivas->nCPE - 1]->hStereoMdct->isSBAStereoMode = ( (st_ivas->hEncoderConfig->ivas_format == SBA_FORMAT) && (st_ivas->nchan_transport == 2) ); #endif } } diff --git a/lib_enc/ivas_stereo_switching_enc.c b/lib_enc/ivas_stereo_switching_enc.c index 137eaeafbf..8654299545 100644 --- a/lib_enc/ivas_stereo_switching_enc.c +++ b/lib_enc/ivas_stereo_switching_enc.c @@ -223,6 +223,10 @@ ivas_error stereo_memory_enc( const int16_t max_bwidth, /* i : maximum audio bandwidth */ float *tdm_last_ratio, /* o : TD stereo last ratio */ const IVAS_FORMAT ivas_format /* i : ivas format */ +#ifdef LBR_SBA_CORE_CODING_TUNING + , + const int16_t nchan_transport /* i : number transport chans */ +#endif ) { Encoder_State *st; @@ -537,7 +541,7 @@ ivas_error stereo_memory_enc( initMdctStereoEncData( hCPE->hStereoMdct, ivas_format, hCPE->element_mode, hCPE->element_brate, hCPE->hCoreCoder[0]->max_bwidth, 0, NULL, 1 ); #ifdef LBR_SBA_CORE_CODING_TUNING - hCPE->hStereoMdct->isSBAStereoMode = ( ivas_format == SBA_FORMAT && hCPE->element_brate <= IVAS_80k ); + hCPE->hStereoMdct->isSBAStereoMode = ( (ivas_format == SBA_FORMAT) && (nchan_transport == 2) ); #endif if ( hCPE->element_mode == IVAS_CPE_MDCT && hCPE->element_brate <= MAX_MDCT_ITD_BRATE && ivas_format == STEREO_FORMAT ) -- GitLab