From aa8309087d02ca56079a74cd2aa13cf5232b4da6 Mon Sep 17 00:00:00 2001 From: rtyag Date: Thu, 12 Jun 2025 14:21:45 +1000 Subject: [PATCH] fix for issue 1329 --- lib_com/ivas_prot.h | 7 +++++ lib_com/options.h | 1 + lib_enc/ivas_mct_enc_mct.c | 12 ++++++++ lib_enc/ivas_stereo_mdct_stereo_enc.c | 40 +++++++++++++++++++++++++++ 4 files changed, 60 insertions(+) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 0a804a5815..87088ac1de 100755 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -2541,6 +2541,13 @@ void SetCurrentPsychParams( TCX_CONFIG_HANDLE hTcxCfg ); +#ifdef NONBE_FIX_1329_OSBA_CRASH_128 +int16_t is_available_bits( + Encoder_State **sts, /* i/o: encoder state structure */ + const int16_t mct_on /* i : flag mct block (1) or stereo (0) */ +); +#endif + void stereo_coder_tcx( STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, /* i/o: MDCT encoder structure */ Encoder_State **sts, /* i/o: encoder state structure */ diff --git a/lib_com/options.h b/lib_com/options.h index aec5a9e672..d56bb35b66 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -179,6 +179,7 @@ #define NONBE_FIX_1326_MASA_EXTREND_CUSTOMLS_OUT /* FhG: Fix crash for external renderer MASA to custom LS rendering, number of output channels not set correctly */ #define NONBE_1325_TD_STEREO_QUANT_LSF_SEC /* Nokia: issue 1325: fix for usage of active_cnt variable in TD stereo LSFQ */ #define NONBE_FIX_1172_OBJ_EDIT_JBM /* VA: issue 1172: fix OMASA object editing in JBM */ +#define NONBE_FIX_1329_OSBA_CRASH_128 /* Dlb: Fix for issue 1329, OSBA cras at 128 kbps*/ /* ##################### End NON-BE switches ########################### */ diff --git a/lib_enc/ivas_mct_enc_mct.c b/lib_enc/ivas_mct_enc_mct.c index feefd008ee..c1478b2b09 100644 --- a/lib_enc/ivas_mct_enc_mct.c +++ b/lib_enc/ivas_mct_enc_mct.c @@ -588,6 +588,18 @@ void apply_MCT_enc( if ( ( fabsf( max_corr ) > DEFAULT_CORR_THRES && !hMCT->hbr_mct ) || ( fabsf( max_corr ) > SPAR_CORR_THRES && hMCT->hbr_mct ) ) { +#ifdef NONBE_FIX_1329_OSBA_CRASH_128 + { + Encoder_State *p_st[2]; + p_st[0] = sts[ch1]; + p_st[1] = sts[ch2]; + if ( is_available_bits( p_st, 1 ) == 0 ) + { + break; + } + } +#endif + if ( !forceKeepTree ) { /*save channel pair*/ diff --git a/lib_enc/ivas_stereo_mdct_stereo_enc.c b/lib_enc/ivas_stereo_mdct_stereo_enc.c index fa97984539..553f8e259e 100755 --- a/lib_enc/ivas_stereo_mdct_stereo_enc.c +++ b/lib_enc/ivas_stereo_mdct_stereo_enc.c @@ -167,6 +167,46 @@ static void write_itd_data( } +#ifdef NONBE_FIX_1329_OSBA_CRASH_128 +int16_t is_available_bits( + Encoder_State **sts, /* i/o: encoder state structure */ + const int16_t mct_on /* i : flag mct block (1) or stereo (0) */ +) +{ + int16_t nSubframes, bits_available; + nSubframes = ( sts[0]->core == TCX_20_CORE && sts[1]->core == TCX_20_CORE ) ? 1 : NB_DIV; + if ( !mct_on ) + { + return 1; + } + else + { + if ( +#ifdef DEBUG_FORCE_MDCT_STEREO_MODE + hStereoMdct->fDualMono || +#endif + ( sts[0]->hTcxEnc->transform_type[0] != sts[1]->hTcxEnc->transform_type[0] ) || ( sts[0]->hTcxEnc->transform_type[1] != sts[1]->hTcxEnc->transform_type[1] ) || ( sts[0]->last_core != sts[1]->last_core && ( sts[0]->last_core == ACELP_CORE || sts[1]->last_core == ACELP_CORE ) ) || sts[0]->last_core == ACELP_CORE || sts[1]->last_core == ACELP_CORE ) + { + return 1; + } + else + { + int16_t k; + for ( k = 0; k < nSubframes; k++ ) + { + bits_available = ( ( mct_on ? 2 * sts[0]->bits_frame_channel : sts[0]->bits_frame_nominal ) - sts[0]->side_bits_frame_channel - sts[1]->side_bits_frame_channel - ( nSubframes == 2 ? OFFSET_BITS_TCX10 : OFFSET_BITS_TCX20 ) ) / nSubframes; + /*check if this should be 0 or a higher value*/ + if ( bits_available <= 0 ) + { + return 0; + } + } + } + } + return 1; +} +#endif + /*-------------------------------------------------------------------* * stereo_coder_tcx() * -- GitLab