From a97df9bdc1d6b5cae732142991deb73539491faf Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 6 Mar 2024 14:13:10 +0530 Subject: [PATCH] [Issue-Fix #697] Fixes ltv crash issue due to st->cngTDLevel_e coming greater than 15 [x] The crash occurs due to st->cngTDLevel_e coming greater than 15, which was leading to -ve Q which was not handled by fix16_to_float() while converting st->cngTDLevel to st->cngTDLevel_float. [x] Used fixedToFloat() instead of fix16_to_float() which is able to handle -ve Q. --- lib_dec/acelp_core_dec.c | 4 ++-- lib_dec/ivas_stereo_mdct_core_dec_fx.c | 2 +- lib_dec/ivas_tcx_core_dec.c | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib_dec/acelp_core_dec.c b/lib_dec/acelp_core_dec.c index bb771d3ee..e405bfb8d 100644 --- a/lib_dec/acelp_core_dec.c +++ b/lib_dec/acelp_core_dec.c @@ -1296,7 +1296,7 @@ ivas_error acelp_core_dec( if ( !( ( st->element_mode == IVAS_CPE_TD || st->element_mode == IVAS_CPE_DFT ) && ( st->hFdCngDec->hFdCngCom->active_frame_counter > 0 ) ) ) { st->hTcxDec->CngLevelBackgroundTrace_bfi = fix_to_float( st->hTcxDec->CngLevelBackgroundTrace_bfi_fx, ( 31 - st->hTcxDec->CngLevelBackgroundTrace_bfi_exp ) ); - st->cngTDLevel_float = fix16_to_float( st->cngTDLevel, ( 15 - st->cngTDLevel_e ) ); + st->cngTDLevel_float = fixedToFloat( st->cngTDLevel, ( 15 - st->cngTDLevel_e ) ); for ( int p = 0; p < ( st->hFdCngDec->hFdCngCom->stopFFTbin - st->hFdCngDec->hFdCngCom->startBand ); p++ ) { st->hFdCngDec->hFdCngCom->cngNoiseLevel_flt[p] = ( (float) st->hFdCngDec->hFdCngCom->cngNoiseLevel[p] / ( 1u << ( 31 - st->hFdCngDec->hFdCngCom->cngNoiseLevelExp ) ) ); @@ -1517,7 +1517,7 @@ ivas_error acelp_core_dec( if ( !( ( st->element_mode == IVAS_CPE_TD || st->element_mode == IVAS_CPE_DFT ) && ( st->hFdCngDec->hFdCngCom->active_frame_counter > 0 ) ) ) { st->hTcxDec->CngLevelBackgroundTrace_bfi = fix_to_float( st->hTcxDec->CngLevelBackgroundTrace_bfi_fx, ( 31 - st->hTcxDec->CngLevelBackgroundTrace_bfi_exp ) ); - st->cngTDLevel_float = fix16_to_float( st->cngTDLevel, ( 15 - st->cngTDLevel_e ) ); + st->cngTDLevel_float = fixedToFloat( st->cngTDLevel, ( 15 - st->cngTDLevel_e ) ); for ( int p = 0; p < ( st->hFdCngDec->hFdCngCom->stopFFTbin - st->hFdCngDec->hFdCngCom->startBand ); p++ ) { st->hFdCngDec->hFdCngCom->cngNoiseLevel_flt[p] = ( (float) st->hFdCngDec->hFdCngCom->cngNoiseLevel[p] / ( 1u << ( 31 - st->hFdCngDec->hFdCngCom->cngNoiseLevelExp ) ) ); diff --git a/lib_dec/ivas_stereo_mdct_core_dec_fx.c b/lib_dec/ivas_stereo_mdct_core_dec_fx.c index 31c92055e..57636e2a1 100644 --- a/lib_dec/ivas_stereo_mdct_core_dec_fx.c +++ b/lib_dec/ivas_stereo_mdct_core_dec_fx.c @@ -1034,7 +1034,7 @@ static void run_min_stats_fx( } st->hTcxDec->CngLevelBackgroundTrace_bfi = (float) ( st->hTcxDec->CngLevelBackgroundTrace_bfi_fx / powf( 2.f, (Float32)( 31 - st->hTcxDec->CngLevelBackgroundTrace_bfi_exp ) ) ); - st->cngTDLevel_float = fix16_to_float( st->cngTDLevel, ( 15 - st->cngTDLevel_e ) ); + st->cngTDLevel_float = fixedToFloat( st->cngTDLevel, ( 15 - st->cngTDLevel_e ) ); for ( int p = 0; p < ( st->hFdCngDec->hFdCngCom->stopFFTbin - st->hFdCngDec->hFdCngCom->startBand ); p++ ) { diff --git a/lib_dec/ivas_tcx_core_dec.c b/lib_dec/ivas_tcx_core_dec.c index fb2e9ba7b..e634e0b78 100644 --- a/lib_dec/ivas_tcx_core_dec.c +++ b/lib_dec/ivas_tcx_core_dec.c @@ -928,7 +928,7 @@ void stereo_tcx_core_dec( ( st->m_frame_type == ZERO_FRAME ) ) { st->hTcxDec->CngLevelBackgroundTrace_bfi = fix_to_float( st->hTcxDec->CngLevelBackgroundTrace_bfi_fx, ( 31 - st->hTcxDec->CngLevelBackgroundTrace_bfi_exp ) ); - st->cngTDLevel_float = fix16_to_float( st->cngTDLevel, ( 15 - st->cngTDLevel_e ) ); + st->cngTDLevel_float = fixedToFloat( st->cngTDLevel, ( 15 - st->cngTDLevel_e ) ); for ( int p = 0; p < st->hFdCngDec->hFdCngCom->fftlen; p++ ) { st->hFdCngDec->hFdCngCom->fftBuffer_flt[p] = ( (float) st->hFdCngDec->hFdCngCom->fftBuffer[p] / ( 1u << ( 31 - st->hFdCngDec->hFdCngCom->fftBuffer_exp ) ) ); @@ -1135,7 +1135,7 @@ void stereo_tcx_core_dec( ( st->m_frame_type == ZERO_FRAME ) ) { st->hTcxDec->CngLevelBackgroundTrace_bfi = fix_to_float( st->hTcxDec->CngLevelBackgroundTrace_bfi_fx, ( 31 - st->hTcxDec->CngLevelBackgroundTrace_bfi_exp ) ); - st->cngTDLevel_float = fix16_to_float( st->cngTDLevel, ( 15 - st->cngTDLevel_e ) ); + st->cngTDLevel_float = fixedToFloat( st->cngTDLevel, ( 15 - st->cngTDLevel_e ) ); for ( int p = 0; p < st->hFdCngDec->hFdCngCom->fftlen; p++ ) { st->hFdCngDec->hFdCngCom->fftBuffer_flt[p] = ( (float) st->hFdCngDec->hFdCngCom->fftBuffer[p] / ( 1u << ( 31 - st->hFdCngDec->hFdCngCom->fftBuffer_exp ) ) ); -- GitLab