From 6a83549ea6b92a933da34468628edf09eaadb2a9 Mon Sep 17 00:00:00 2001 From: Jonas Sv Date: Thu, 20 Jul 2023 16:41:25 +0200 Subject: [PATCH 1/6] added initilizations and asserts for issue #617 DTX and IO16(enc) IO32(dec) --- lib_com/options.h | 3 +++ lib_dec/cng_dec.c | 33 ++++++++++++++++++++++++++++++++- lib_dec/ivas_stereo_cng_dec.c | 10 ++++++++++ 3 files changed, 45 insertions(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index b02e63cd1e..81557dce9a 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -194,6 +194,9 @@ #define SPLIT_REND_WITH_HEAD_ROT /* Dlb,FhG: Split Rendering contributions 21 and 35 */ + +#define FIX617_UBSAN_DIVBYZERO_STEREOCNG /* Eri: Issue 617: Decoder UBSAN: division by zero in stereo cng when inut is 16kHz and output is 32kHz */ + /* ################## End BE DEVELOPMENT switches ######################### */ diff --git a/lib_dec/cng_dec.c b/lib_dec/cng_dec.c index 64403736c4..664e333701 100644 --- a/lib_dec/cng_dec.c +++ b/lib_dec/cng_dec.c @@ -728,7 +728,7 @@ static void shb_CNG_decod( if ( hTdCngDec->trans_cnt > 0 ) { - i = (int16_t) ( (float) hTdCngDec->trans_cnt / 15.0f * 255 ); + i = ( int16_t )( (float) hTdCngDec->trans_cnt / 15.0f * 255 ); ener = hTdCngDec->shb_cng_ener + sin_table256[i] * ( hTdCngDec->last_shb_ener - hTdCngDec->shb_cng_ener ); hTdCngDec->trans_cnt--; } @@ -737,9 +737,15 @@ static void shb_CNG_decod( ener = hTdCngDec->shb_cng_ener; } + gain = (float) sqrt( pow( 10, 0.1f * ener ) * L_FRAME16k / ener_excSHB ); st->hTdCngDec->shb_cng_gain = ener; +#ifdef FIX617_UBSAN_DIVBYZERO_STEREOCNG +#ifdef DEBUGGING + /* note: state shb_cng_gain is actually an energy value in dB */ +#endif +#endif for ( i = 0; i < L_FRAME16k; i++ ) { @@ -783,6 +789,20 @@ void td_cng_dec_init( mvr2r( st->lsp_old, st->lspCNG, M ); hTdCngDec->last_allow_cn_step = 0; hTdCngDec->shb_cng_ener = -6.02f; +#ifdef FIX617_UBSAN_DIVBYZERO_STEREOCNG + if ( st->element_mode != EVS_MONO ) + { + set_f( hTdCngDec->shb_lpcCNG, 0.0f, LPC_SHB_ORDER + 1 ); + hTdCngDec->shb_lpcCNG[0] = 1.0f; + hTdCngDec->shb_cng_gain = -82.0; /* a dB value approximately corresponding to shb index 0(used as index -15) */ + } + /* + else { + EVS_MONO case + } + */ +#endif + hTdCngDec->wb_cng_ener = -6.02f; hTdCngDec->last_wb_cng_ener = -6.02f; hTdCngDec->last_shb_cng_ener = -6.02f; @@ -825,7 +845,18 @@ void td_cng_dec_init( hTdCngDec->shb_dtx_count = 0; hTdCngDec->trans_cnt = 0; hTdCngDec->burst_cnt = 0; +#ifdef FIX617_UBSAN_DIVBYZERO_STEREOCNG + if ( st->element_mode != EVS_MONO ) + { + hTdCngDec->last_shb_ener = -82.0f; /* in dB domain */ + } + else + { + hTdCngDec->last_shb_ener = 0.001f; + } +#else hTdCngDec->last_shb_ener = 0.001f; +#endif set_f( hTdCngDec->interpol_3_2_cng_dec, 0.0f, INTERP_3_2_MEM_LEN ); diff --git a/lib_dec/ivas_stereo_cng_dec.c b/lib_dec/ivas_stereo_cng_dec.c index c12498c015..99a568d61d 100644 --- a/lib_dec/ivas_stereo_cng_dec.c +++ b/lib_dec/ivas_stereo_cng_dec.c @@ -375,9 +375,16 @@ static void stereo_dft_generate_comfort_noise( ptr0 = shb_shape; ptr1 = ptr0 + 2; ptr2 = ptr1 + 1; + for ( i = 0; i < L_FRAME16k / 2 - 1; i++ ) { +#ifdef FIX617_UBSAN_DIVBYZERO_STEREOCNG + ftmp = ( *ptr1 * *ptr1 + *ptr2 * *ptr2 ); + assert( ftmp != 0.0f ); + ftmp = 1.0f / ftmp; +#else ftmp = 1.0f / ( *ptr1 * *ptr1 + *ptr2 * *ptr2 ); +#endif enr += ftmp; *ptr0++ = sqrtf( ftmp ); ptr1 += 2; @@ -455,6 +462,9 @@ static void stereo_dft_generate_comfort_noise( { /* high band generation, flipped spectrum */ +#ifdef FIX617_UBSAN_DIVBYZERO_STEREOCNG + assert( enr != 0.0f ); +#endif scale = sqrtf( powf( 10, 0.1f * st->hTdCngDec->shb_cng_gain ) / enr ); ptr_shb = shb_shape + L_FRAME16k / 2 - 1; /* Averaging for Nyquist frequency */ -- GitLab From 206ff2ecdf8978bf25a9f3e3aca979e4d7fced1a Mon Sep 17 00:00:00 2001 From: Jonas Sv Date: Thu, 20 Jul 2023 18:09:09 +0200 Subject: [PATCH 2/6] separated initilization value fix into its own define and deactivated it, clang formatting applied --- lib_com/options.h | 3 ++- lib_dec/cng_dec.c | 14 +++++++------- lib_dec/ivas_stereo_cng_dec.c | 22 ++++++++++++++-------- 3 files changed, 23 insertions(+), 16 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index b8c83b19ed..2864a43764 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -204,7 +204,8 @@ #define FIX_622_SILENCE_USAN_WARNING /* FhG: silenceusan warning in ifft code */ -#define FIX617_UBSAN_DIVBYZERO_STEREOCNG /* Eri: Issue 617: Decoder UBSAN: division by zero in stereo cng when inut is 16kHz and output is 32kHz */ +#define FIX617_UBSAN_DIVBYZERO_STEREOCNG /* Eri: Issue 617: Decoder UBSAN: division by zero in stereo cng when inut is 16kHz and output is 32kHz */ +//#define FIX617_UBSAN_DIVBYZERO_STEREOCNG_LAST_SHB_ENER_INIT /* Eri: Issue 617: old EVS initilization leads to incorrect interpolation in dB domain, likely not BE */ /* ################## End BE DEVELOPMENT switches ######################### */ diff --git a/lib_dec/cng_dec.c b/lib_dec/cng_dec.c index 664e333701..23ef2f7ad9 100644 --- a/lib_dec/cng_dec.c +++ b/lib_dec/cng_dec.c @@ -728,7 +728,7 @@ static void shb_CNG_decod( if ( hTdCngDec->trans_cnt > 0 ) { - i = ( int16_t )( (float) hTdCngDec->trans_cnt / 15.0f * 255 ); + i = (int16_t) ( (float) hTdCngDec->trans_cnt / 15.0f * 255 ); ener = hTdCngDec->shb_cng_ener + sin_table256[i] * ( hTdCngDec->last_shb_ener - hTdCngDec->shb_cng_ener ); hTdCngDec->trans_cnt--; } @@ -745,7 +745,7 @@ static void shb_CNG_decod( #ifdef DEBUGGING /* note: state shb_cng_gain is actually an energy value in dB */ #endif -#endif +#endif for ( i = 0; i < L_FRAME16k; i++ ) { @@ -796,10 +796,10 @@ void td_cng_dec_init( hTdCngDec->shb_lpcCNG[0] = 1.0f; hTdCngDec->shb_cng_gain = -82.0; /* a dB value approximately corresponding to shb index 0(used as index -15) */ } - /* + /* else { - EVS_MONO case - } + EVS_MONO case + } */ #endif @@ -845,10 +845,10 @@ void td_cng_dec_init( hTdCngDec->shb_dtx_count = 0; hTdCngDec->trans_cnt = 0; hTdCngDec->burst_cnt = 0; -#ifdef FIX617_UBSAN_DIVBYZERO_STEREOCNG +#ifdef FIX617_UBSAN_DIVBYZERO_STEREOCNG_LAST_SHB_ENER_INIT if ( st->element_mode != EVS_MONO ) { - hTdCngDec->last_shb_ener = -82.0f; /* in dB domain */ + hTdCngDec->last_shb_ener = -82.0f; /* low level in dB domain corresspodning to index 0(-15) */ } else { diff --git a/lib_dec/ivas_stereo_cng_dec.c b/lib_dec/ivas_stereo_cng_dec.c index 99a568d61d..70c95bfb4e 100644 --- a/lib_dec/ivas_stereo_cng_dec.c +++ b/lib_dec/ivas_stereo_cng_dec.c @@ -378,13 +378,19 @@ static void stereo_dft_generate_comfort_noise( for ( i = 0; i < L_FRAME16k / 2 - 1; i++ ) { -#ifdef FIX617_UBSAN_DIVBYZERO_STEREOCNG - ftmp = ( *ptr1 * *ptr1 + *ptr2 * *ptr2 ); - assert( ftmp != 0.0f ); - ftmp = 1.0f / ftmp; +#ifdef FIX617_UBSAN_DIVBYZERO_STEREOCNG + ftmp = ( *ptr1 * *ptr1 + *ptr2 * *ptr2 ); + assert( ftmp != 0.0f ); + ftmp = 1.0f / ftmp; + /* in float: + both a = "div"=(1/(x^2+y^2) and sqrt(a) is used and summed up in the same loop. + + in BASOP: + sum up using inv_sqrt( *ptr1 * *ptr1 + *ptr2 * *ptr2 ), in this loop + and then sum up enr = sum( *ptr0 * *ptr0 ), in a subsequent MAC loop */ #else ftmp = 1.0f / ( *ptr1 * *ptr1 + *ptr2 * *ptr2 ); -#endif +#endif enr += ftmp; *ptr0++ = sqrtf( ftmp ); ptr1 += 2; @@ -462,9 +468,9 @@ static void stereo_dft_generate_comfort_noise( { /* high band generation, flipped spectrum */ -#ifdef FIX617_UBSAN_DIVBYZERO_STEREOCNG - assert( enr != 0.0f ); -#endif +#ifdef FIX617_UBSAN_DIVBYZERO_STEREOCNG + assert( enr != 0.0f ); +#endif scale = sqrtf( powf( 10, 0.1f * st->hTdCngDec->shb_cng_gain ) / enr ); ptr_shb = shb_shape + L_FRAME16k / 2 - 1; /* Averaging for Nyquist frequency */ -- GitLab From ffa2407b8e6403f976f542c799b909a55e001f00 Mon Sep 17 00:00:00 2001 From: Jonas Sv Date: Thu, 20 Jul 2023 18:35:58 +0200 Subject: [PATCH 3/6] clang formatting applied again --- lib_dec/cng_dec.c | 2 +- lib_dec/ivas_stereo_cng_dec.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_dec/cng_dec.c b/lib_dec/cng_dec.c index 23ef2f7ad9..26b5ce543e 100644 --- a/lib_dec/cng_dec.c +++ b/lib_dec/cng_dec.c @@ -745,7 +745,7 @@ static void shb_CNG_decod( #ifdef DEBUGGING /* note: state shb_cng_gain is actually an energy value in dB */ #endif -#endif +#endif for ( i = 0; i < L_FRAME16k; i++ ) { diff --git a/lib_dec/ivas_stereo_cng_dec.c b/lib_dec/ivas_stereo_cng_dec.c index 70c95bfb4e..dd7b1653f2 100644 --- a/lib_dec/ivas_stereo_cng_dec.c +++ b/lib_dec/ivas_stereo_cng_dec.c @@ -386,7 +386,7 @@ static void stereo_dft_generate_comfort_noise( both a = "div"=(1/(x^2+y^2) and sqrt(a) is used and summed up in the same loop. in BASOP: - sum up using inv_sqrt( *ptr1 * *ptr1 + *ptr2 * *ptr2 ), in this loop + sum up using inv_sqrt( *ptr1 * *ptr1 + *ptr2 * *ptr2 ), in this loop and then sum up enr = sum( *ptr0 * *ptr0 ), in a subsequent MAC loop */ #else ftmp = 1.0f / ( *ptr1 * *ptr1 + *ptr2 * *ptr2 ); -- GitLab From 993c6285ea69205a0784c0b52ee198eb5ee9f2e3 Mon Sep 17 00:00:00 2001 From: Jonas Sv Date: Thu, 20 Jul 2023 19:00:48 +0200 Subject: [PATCH 4/6] added additional DivByZero asserts in the stereo dtx decoder --- lib_dec/ivas_stereo_cng_dec.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/lib_dec/ivas_stereo_cng_dec.c b/lib_dec/ivas_stereo_cng_dec.c index dd7b1653f2..88fa786656 100644 --- a/lib_dec/ivas_stereo_cng_dec.c +++ b/lib_dec/ivas_stereo_cng_dec.c @@ -342,12 +342,25 @@ static void stereo_dft_generate_comfort_noise( ptr0 = cngNoiseLevel_upd; ptr1 = ptr0 + 2; ptr2 = ptr1 + 1; +#ifdef FIX617_UBSAN_DIVBYZERO_STEREOCNG + assert( st->lp_ener > 0.0f ); + factor = 2.0f * sqrtf( st->lp_ener / st->L_frame * 0.5f ); /* fixed factor in the loop below */ + for ( i = 0; i < st->L_frame / 2 - 1; i++ ) + { + ftmp = *ptr1 * *ptr1 + *ptr2 * *ptr2; + assert( ftmp > 0.0f ); + *ptr0++ = factor * inv_sqrt( ftmp ); + ptr1 += 2; + ptr2 += 2; + } +#else for ( i = 0; i < st->L_frame / 2 - 1; i++ ) { *ptr0++ = 2.0f * sqrtf( st->lp_ener / st->L_frame * 0.5f ) * inv_sqrt( *ptr1 * *ptr1 + *ptr2 * *ptr2 ); ptr1 += 2; ptr2 += 2; } +#endif if ( min( output_frame, L_FRAME32k ) - hFdCngCom->stopFFTbin > 0 ) { @@ -380,7 +393,7 @@ static void stereo_dft_generate_comfort_noise( { #ifdef FIX617_UBSAN_DIVBYZERO_STEREOCNG ftmp = ( *ptr1 * *ptr1 + *ptr2 * *ptr2 ); - assert( ftmp != 0.0f ); + assert( ftmp > 0.0f ); ftmp = 1.0f / ftmp; /* in float: both a = "div"=(1/(x^2+y^2) and sqrt(a) is used and summed up in the same loop. -- GitLab From c42f42580633312595edfd54eb80373b5c9e2fff Mon Sep 17 00:00:00 2001 From: Jonas Sv Date: Thu, 20 Jul 2023 19:23:39 +0200 Subject: [PATCH 5/6] clang-format applied --- lib_dec/ivas_stereo_cng_dec.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_dec/ivas_stereo_cng_dec.c b/lib_dec/ivas_stereo_cng_dec.c index 88fa786656..c674f8bec9 100644 --- a/lib_dec/ivas_stereo_cng_dec.c +++ b/lib_dec/ivas_stereo_cng_dec.c @@ -344,7 +344,7 @@ static void stereo_dft_generate_comfort_noise( ptr2 = ptr1 + 1; #ifdef FIX617_UBSAN_DIVBYZERO_STEREOCNG assert( st->lp_ener > 0.0f ); - factor = 2.0f * sqrtf( st->lp_ener / st->L_frame * 0.5f ); /* fixed factor in the loop below */ + factor = 2.0f * sqrtf( st->lp_ener / st->L_frame * 0.5f ); /* fixed factor in the loop below */ for ( i = 0; i < st->L_frame / 2 - 1; i++ ) { ftmp = *ptr1 * *ptr1 + *ptr2 * *ptr2; @@ -360,7 +360,7 @@ static void stereo_dft_generate_comfort_noise( ptr1 += 2; ptr2 += 2; } -#endif +#endif if ( min( output_frame, L_FRAME32k ) - hFdCngCom->stopFFTbin > 0 ) { -- GitLab From cff9a68e65d6f8128235c68dcd897bce045b8206 Mon Sep 17 00:00:00 2001 From: Jonas Sv Date: Fri, 21 Jul 2023 15:32:42 +0200 Subject: [PATCH 6/6] removed inactive define FIX617_UBSAN_DIVBYZERO_STEREOCNG_LAST_SHB_ENER_INIT , now in issue #628 --- lib_com/options.h | 1 - lib_dec/cng_dec.c | 13 ++----------- 2 files changed, 2 insertions(+), 12 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 2864a43764..95a35e7f15 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -205,7 +205,6 @@ #define FIX617_UBSAN_DIVBYZERO_STEREOCNG /* Eri: Issue 617: Decoder UBSAN: division by zero in stereo cng when inut is 16kHz and output is 32kHz */ -//#define FIX617_UBSAN_DIVBYZERO_STEREOCNG_LAST_SHB_ENER_INIT /* Eri: Issue 617: old EVS initilization leads to incorrect interpolation in dB domain, likely not BE */ /* ################## End BE DEVELOPMENT switches ######################### */ diff --git a/lib_dec/cng_dec.c b/lib_dec/cng_dec.c index 26b5ce543e..d5e1404a7f 100644 --- a/lib_dec/cng_dec.c +++ b/lib_dec/cng_dec.c @@ -845,18 +845,9 @@ void td_cng_dec_init( hTdCngDec->shb_dtx_count = 0; hTdCngDec->trans_cnt = 0; hTdCngDec->burst_cnt = 0; -#ifdef FIX617_UBSAN_DIVBYZERO_STEREOCNG_LAST_SHB_ENER_INIT - if ( st->element_mode != EVS_MONO ) - { - hTdCngDec->last_shb_ener = -82.0f; /* low level in dB domain corresspodning to index 0(-15) */ - } - else - { - hTdCngDec->last_shb_ener = 0.001f; - } -#else + hTdCngDec->last_shb_ener = 0.001f; -#endif + set_f( hTdCngDec->interpol_3_2_cng_dec, 0.0f, INTERP_3_2_MEM_LEN ); -- GitLab