diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 1abe8462cce17452d195d7f8da6ae6e2cc2d99bd..497c6a6bef8503f40417ad13041a2aa465583c62 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -2155,6 +2155,9 @@ 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 */ +#ifdef LBR_SBA_CORE_CODING_TUNING + 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 */ ); @@ -2172,6 +2175,9 @@ 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) */ +#ifdef LBR_SBA_CORE_CODING_TUNING + 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 */ ); @@ -2507,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( @@ -3002,7 +3013,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 c284c5778aec3d71c3989dd3569889296a0e67a7..28a66df68f65ee9848c21fa973add36335894a30 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 7852d678beef1613cd5fdef0f5983d6b0d97ee61..1b8caa0c7cdb4958831fb19fc8739d354eba30c4 100644 --- a/lib_com/ivas_stereo_mdct_stereo_com.c +++ b/lib_com/ivas_stereo_mdct_stereo_com.c @@ -44,16 +44,26 @@ *-------------------------------------------------------------------*/ 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 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 ); *bits_ch0 = split_ratio * total_bits / SMDCT_BITRATE_RATIO_RANGE; - *bits_ch1 = total_bits + 0 - *bits_ch0; +#ifdef LBR_SBA_CORE_CODING_TUNING + /* for SBA mode bias the distribution towards the W channel */ + if ( split_ratio < 7 && isSBAStereoMode ) + { + *bits_ch0 += (int16_t) ( 0.2 * *bits_ch0 ); + } +#endif + *bits_ch1 = total_bits - *bits_ch0; return; } diff --git a/lib_com/options.h b/lib_com/options.h index 7345441ef44d01d1298e042c5520001e0cc12c0a..98d71f99c3137d48b0079b5304e349b62e238129 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -147,6 +147,7 @@ /*#define FIX_I1_113*/ /* under review : MCT bit distribution optimization for SBA high bitrates*/ +#define LBR_SBA_CORE_CODING_TUNING /* Contribution "3 Core Coder Tuning for low bitrate SBA with 2 TCs" */ /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_dec/ivas_cpe_dec.c b/lib_dec/ivas_cpe_dec.c index c2c4319e647e180332f9359196ab37900755e46e..c75ece2bce02fd54f512b7c6a986222946c61e74 100644 --- a/lib_dec/ivas_cpe_dec.c +++ b/lib_dec/ivas_cpe_dec.c @@ -361,7 +361,8 @@ 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 ) ) { if ( ( error = ivas_core_dec( st_ivas, NULL, hCPE, st_ivas->hMCT, n_channels, output, outputHB, NULL, 0 ) ) != IVAS_ERR_OK ) { @@ -375,6 +376,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 c8d91b9b076e3087b6bdba2b83a1d943166ab126..1d1ccb0a3aaf8622f43e8f0ce251c0f1043163f4 100644 --- a/lib_dec/ivas_mct_dec_mct.c +++ b/lib_dec/ivas_mct_dec_mct.c @@ -147,7 +147,11 @@ void ivas_mct_dec_mct( p_st[0] = sts[hBlock->ch1]; p_st[1] = sts[hBlock->ch2]; +#ifdef LBR_SBA_CORE_CODING_TUNING + 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 9df27a84eee1fda18cadd3152871ee66f7f860c0..f8f1c5cb8513404c346a37b2b5b4a83eea587bd9 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 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 d87be7f23a050874e2128e7040f7e738ddb39608..faf86eeb06a1df03f2767f103df5004c90bdf03f 100644 --- a/lib_dec/ivas_stereo_mdct_core_dec.c +++ b/lib_dec/ivas_stereo_mdct_core_dec.c @@ -116,12 +116,20 @@ static void stereo_mdct_dec_stereo( sts = hCPE->hCoreCoder; +#ifdef LBR_SBA_CORE_CODING_TUNING + 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 ); +#ifdef LBR_SBA_CORE_CODING_TUNING + 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; @@ -217,6 +225,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->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 ) + { + 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 +304,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->isSBAStereoMode +#endif + ) { assert( ( sts[0]->core == sts[1]->core ) || ( hCPE->hStereoMdct->mdct_stereo_mode[0] == SMDCT_DUAL_MONO ) ); @@ -363,7 +384,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->isSBAStereoMode +#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 +399,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 1762927e8db85907c2e87545e4040cc68d4348ba..05c9c12ae221d09c42137a1955550f8782d6c710 100644 --- a/lib_dec/ivas_stereo_mdct_stereo_dec.c +++ b/lib_dec/ivas_stereo_mdct_stereo_dec.c @@ -57,6 +57,9 @@ 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)*/ +#ifdef LBR_SBA_CORE_CODING_TUNING + 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 */ ) @@ -66,114 +69,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 ( !isSBAStereoMode ) +#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 f2d3241979b6f8146f5e071113e9f9580003396e..25cba61cc4244299b459d7cc7d17999c3b5e3efb 100755 --- 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; } @@ -319,6 +323,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->isSBAStereoMode = ( (ivas_format == SBA_FORMAT) && (st_ivas->nchan_transport == 2) ); +#endif } } @@ -488,6 +495,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->isSBAStereoMode = ( (ivas_format == SBA_FORMAT) && (st_ivas->nchan_transport == 2) ); +#endif if ( hCPE->element_brate <= MAX_MDCT_ITD_BRATE && ivas_format == STEREO_FORMAT ) { @@ -947,6 +957,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->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_mdct_core_enc.c b/lib_enc/ivas_mdct_core_enc.c index 6385d20b2d48eb596fc0d3c05ab2429482a8a5c9..ceea41bcacadc775c0002172d942dbd4d8ffd6d5 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->isSBAStereoMode +#endif + ) { int16_t nSampCore; int32_t totalRate; diff --git a/lib_enc/ivas_sba_enc.c b/lib_enc/ivas_sba_enc.c index 3e9094c8e38ae15e4f9bbc0cbf9c9cdad27445a2..acce4615af9eab78f507101a3c373c2eced6d6d7 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->isSBAStereoMode = ( (st_ivas->hEncoderConfig->ivas_format == SBA_FORMAT) && (st_ivas->nchan_transport == 2) ); +#endif } } } diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index e542fed71cb9cb623d52f109e3f6a8b911b4184d..170c03d9975763526d827f7402fe6010e1165ee7 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 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 old mode 100644 new mode 100755 index 710e6719720265d8ede3de3e9e03e508bd328352..00a47e37063a7c061ba96f9fd85d66f73a9ffee4 --- 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->isSBAStereoMode ) +#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->isSBAStereoMode +#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->isSBAStereoMode ) +#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,11 @@ void stereo_mdct_core_enc( nAvailBits -= meta_bits; nAvailBits -= SMDCT_NBBITS_SPLIT_RATIO; +#ifdef LBR_SBA_CORE_CODING_TUNING + 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 3074509870a0fdc5f4ea025b4d326aadf80c68eb..86542995450319a27d531da3167865553a324c07 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; @@ -536,6 +540,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->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 ) { if ( ( error = initMdctItdHandling( hCPE->hStereoMdct, input_Fs ) ) != IVAS_ERR_OK )