From 9b47beb14ffc065d7cb5706afb477b99ae1107c0 Mon Sep 17 00:00:00 2001 From: vaclav Date: Mon, 19 Jun 2023 14:08:20 +0200 Subject: [PATCH] issue 562: fix ISM2 at 64kbps quality; under FIX_562_ISM2_64KBPS --- lib_com/ivas_ism_com.c | 21 +++++++++++++++++++++ lib_com/options.h | 3 +++ lib_dec/ivas_ism_metadata_dec.c | 5 +++++ lib_enc/ivas_ism_metadata_enc.c | 5 +++++ 4 files changed, 34 insertions(+) diff --git a/lib_com/ivas_ism_com.c b/lib_com/ivas_ism_com.c index bd064a584a..703983a1d4 100644 --- a/lib_com/ivas_ism_com.c +++ b/lib_com/ivas_ism_com.c @@ -61,6 +61,10 @@ #define BETA_ISM_LOW_IMP 0.6f #define BETA_ISM_MEDIUM_IMP 0.8f +#ifdef FIX_562_ISM2_64KBPS +#define MAX_BRATE_TCX_32k 48000 +#endif + /*-------------------------------------------------------------------* * bitbudget_to_brate() @@ -346,6 +350,23 @@ ivas_error ivas_ism_config( bits_CoreCoder[ch] = tmp; } +#ifdef FIX_562_ISM2_64KBPS + /* limitaton to avoid too high bitrate in one active TCX channel */ + if ( element_brate[0] >= SCE_CORE_16k_LOW_LIMIT && element_brate[0] <= IVAS_32k ) + { + diff = 0; + limit_high = MAX_BRATE_TCX_32k / FRAMES_PER_SEC; + + for ( ch = 0; ch < n_ISms; ch++ ) + { + tmp = (int16_t) min( bits_CoreCoder[ch], limit_high ); + + diff += bits_CoreCoder[ch] - tmp; + bits_CoreCoder[ch] = tmp; + } + } +#endif + if ( diff > 0 ) { ch = 0; diff --git a/lib_com/options.h b/lib_com/options.h index e51736a79f..0b79fc733c 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -162,6 +162,9 @@ #define FIX_522_ISM_FIRST_SID /* VA: fix ISM decoder crash if first received frame is an SID */ +#define FIX_562_ISM2_64KBPS /* VA: issue 562: fix ISM2 at 64kbps issue */ + + /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_dec/ivas_ism_metadata_dec.c b/lib_dec/ivas_ism_metadata_dec.c index eb14177b0b..e6c9951b48 100644 --- a/lib_dec/ivas_ism_metadata_dec.c +++ b/lib_dec/ivas_ism_metadata_dec.c @@ -542,7 +542,12 @@ ivas_error ivas_ism_metadata_dec( if ( ism_mode == ISM_MODE_DISC ) { #ifdef FIX_532_ISM_MD_INACTIVE +#ifdef FIX_562_ISM2_64KBPS + if ( ism_imp[ch] == ISM_NO_META && ( ( total_brate[ch] < ACELP_8k00 && element_brate[ch] < SCE_CORE_16k_LOW_LIMIT ) || + ( total_brate[ch] <= ACELP_16k_LOW_LIMIT && element_brate[ch] >= SCE_CORE_16k_LOW_LIMIT ) ) ) +#else if ( ism_imp[ch] == ISM_NO_META && total_brate[ch] < ACELP_8k00 ) +#endif #else if ( hIsmMeta[ch]->ism_metadata_flag == 0 && localVAD[ch] == 0 && ism_metadata_flag_global ) #endif diff --git a/lib_enc/ivas_ism_metadata_enc.c b/lib_enc/ivas_ism_metadata_enc.c index 27a4a3b0cb..003676c56b 100644 --- a/lib_enc/ivas_ism_metadata_enc.c +++ b/lib_enc/ivas_ism_metadata_enc.c @@ -636,7 +636,12 @@ ivas_error ivas_ism_metadata_enc( if ( ism_mode == ISM_MODE_DISC ) { #ifdef FIX_532_ISM_MD_INACTIVE +#ifdef FIX_562_ISM2_64KBPS + if ( ism_imp[ch] == ISM_NO_META && ( ( total_brate[ch] < ACELP_8k00 && element_brate[ch] < SCE_CORE_16k_LOW_LIMIT ) || + ( total_brate[ch] <= ACELP_16k_LOW_LIMIT && element_brate[ch] >= SCE_CORE_16k_LOW_LIMIT ) ) ) +#else if ( ism_imp[ch] == ISM_NO_META && total_brate[ch] < ACELP_8k00 ) +#endif #else if ( hIsmMeta[ch]->ism_metadata_flag == 0 && vad_flag[ch] == 0 && ism_metadata_flag_global ) #endif -- GitLab