Loading lib_com/options.h +3 −0 Original line number Diff line number Diff line Loading @@ -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 ######################### */ Loading lib_dec/cng_dec.c +32 −1 Original line number Diff line number Diff line Loading @@ -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++ ) { Loading Loading @@ -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; Loading Loading @@ -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 ); Loading lib_dec/ivas_stereo_cng_dec.c +10 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 */ Loading Loading
lib_com/options.h +3 −0 Original line number Diff line number Diff line Loading @@ -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 ######################### */ Loading
lib_dec/cng_dec.c +32 −1 Original line number Diff line number Diff line Loading @@ -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++ ) { Loading Loading @@ -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; Loading Loading @@ -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 ); Loading
lib_dec/ivas_stereo_cng_dec.c +10 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 */ Loading