From 2761d08dc88916d035eb3533d10a95b9e61d7253 Mon Sep 17 00:00:00 2001 From: vaclav Date: Tue, 6 Jun 2023 16:17:33 +0200 Subject: [PATCH 1/6] FIX_532_ISM_MD_INACTIVE, step 1 --- lib_com/ivas_cnst.h | 12 +++++ lib_com/ivas_ism_com.c | 67 +++++++++++++++++++++++-- lib_com/ivas_prot.h | 2 + lib_com/options.h | 4 +- lib_dec/ivas_ism_dec.c | 4 ++ lib_dec/ivas_ism_metadata_dec.c | 37 +++++++++++++- lib_enc/ivas_ism_enc.c | 4 ++ lib_enc/ivas_ism_metadata_enc.c | 87 ++++++++++++++++++++++++++++++--- 8 files changed, 203 insertions(+), 14 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 9557f7aef1..77ef754b81 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -329,7 +329,11 @@ typedef enum #define ISM_NB_BITS_METADATA_NOMINAL ( ( SCE_CORE_16k_LOW_LIMIT - ACELP_16k_LOW_LIMIT ) / FRAMES_PER_SEC ) /* nominal number of metadata bits - used for configuration of Core-Coder modules */ +#ifdef FIX_532_ISM_MD_INACTIVE +#define ISM_METADATA_INACTIVE_FLAG_BITS 1 /* flag to signal whether MD are sent in low-rate inactive frame */ +#else #define ISM_METADATA_VAD_FLAG_BITS 1 +#endif #define ISM_METADATA_FLAG_BITS 2 #define ISM_NO_META 0 @@ -383,6 +387,9 @@ typedef enum #define ISM_Q_STEP_LOW (ISM_Q_STEP * 2) #define ISM_Q_STEP_BORDER_LOW (ISM_Q_STEP_BORDER * 2) +#ifdef FIX_532_ISM_MD_INACTIVE +#define BRATE_ISM_INACTIVE 2450 /* CoreCoder bitrate in ISM inactive frames */ +#endif typedef enum { @@ -399,8 +406,13 @@ enum IND_ISM_EXTENDED_FLAG = IND_ISM_NUM_OBJECTS + MAX_NUM_OBJECTS, IND_ISM_EXTENDED_NDP_FLAG, IND_ISM_METADATA_FLAG, +#ifdef FIX_532_ISM_MD_INACTIVE + IND_ISM_MD_INACTIVE_FLAG = IND_ISM_METADATA_FLAG + MAX_NUM_OBJECTS, + IND_ISM_NOISY_SPEECH_FLAG = IND_ISM_MD_INACTIVE_FLAG + MAX_NUM_OBJECTS, +#else IND_ISM_VAD_FLAG = IND_ISM_METADATA_FLAG + MAX_NUM_OBJECTS, IND_ISM_NOISY_SPEECH_FLAG = IND_ISM_VAD_FLAG + MAX_NUM_OBJECTS, +#endif IND_ISM_SCE_ID_DTX, IND_ISM_DTX_COH_SCA, diff --git a/lib_com/ivas_ism_com.c b/lib_com/ivas_ism_com.c index a28fb77d20..40622f9d4d 100644 --- a/lib_com/ivas_ism_com.c +++ b/lib_com/ivas_ism_com.c @@ -49,10 +49,14 @@ * Local constants *-----------------------------------------------------------------------*/ +#ifdef FIX_532_ISM_MD_INACTIVE +#define BITS_ISM_INACTIVE ( BRATE_ISM_INACTIVE / FRAMES_PER_SEC ) +#else #define FRMS_PER_SECOND ( 1000000000 / FRAME_SIZE_NS ) #define BRATE_ISM_INACTIVE 2450 /* CoreCoder bitrate in ISM inactive frames */ #define BITS_ISM_INACTIVE ( BRATE_ISM_INACTIVE / FRMS_PER_SECOND ) +#endif #define BETA_ISM_LOW_IMP 0.6f #define BETA_ISM_MEDIUM_IMP 0.8f @@ -74,7 +78,11 @@ static void bitbudget_to_brate( for ( i = 0; i < N; i++ ) { +#ifdef FIX_532_ISM_MD_INACTIVE + y[i] = FRAMES_PER_SEC * x[i]; +#else y[i] = FRMS_PER_SECOND * x[i]; +#endif } return; @@ -93,11 +101,13 @@ ivas_error ivas_ism_config( const int16_t nchan_ism, /* i : number of objects */ ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ const int16_t ism_extended_metadata_flag, /* i : extended metadata flag */ - const int16_t localVAD[MAX_NUM_OBJECTS], /* i : local VAD flag */ - const int16_t ism_imp[], /* i : ISM importance flags */ - int32_t element_brate[], /* o : element bitrate per object */ - int32_t total_brate[], /* o : total bitrate per object */ - int16_t nb_bits_metadata[] /* i/o: number of metadata bits */ +#ifndef FIX_532_ISM_MD_INACTIVE + const int16_t localVAD[MAX_NUM_OBJECTS], /* i : local VAD flag */ +#endif + const int16_t ism_imp[], /* i : ISM importance flags */ + int32_t element_brate[], /* o : element bitrate per object */ + int32_t total_brate[], /* o : total bitrate per object */ + int16_t nb_bits_metadata[] /* i/o: number of metadata bits */ ) { int16_t ch; @@ -120,12 +130,20 @@ ivas_error ivas_ism_config( { for ( ch = 0; ch < n_ISms; ch++ ) { +#ifdef FIX_532_ISM_MD_INACTIVE + ism_metadata_flag_global |= ism_imp[ch]; +#else ism_metadata_flag_global |= hIsmMeta[ch]->ism_metadata_flag; +#endif } } /* decision about bitrates per channel - constant during the session (at one ivas_total_brate) */ +#ifdef FIX_532_ISM_MD_INACTIVE + bits_ism = (int16_t) ( ism_total_brate / FRAMES_PER_SEC ); +#else bits_ism = (int16_t) ( ism_total_brate / FRMS_PER_SECOND ); +#endif set_s( bits_element, bits_ism / n_ISms, n_ISms ); bits_element[n_ISms - 1] += bits_ism % n_ISms; bitbudget_to_brate( bits_element, element_brate, n_ISms ); @@ -146,10 +164,17 @@ ivas_error ivas_ism_config( for ( ch = 0; ch < n_ISms; ch++ ) { +#ifdef FIX_532_ISM_MD_INACTIVE + if ( ism_imp[ch] == ISM_NO_META ) + { + nb_bits_metadata[0] += ISM_METADATA_INACTIVE_FLAG_BITS; + } +#else if ( hIsmMeta[ch]->ism_metadata_flag == 0 ) { nb_bits_metadata[0] += ISM_METADATA_VAD_FLAG_BITS; } +#endif } } @@ -175,7 +200,11 @@ ivas_error ivas_ism_config( diff = 0; for ( ch = 0; ch < n_ISms; ch++ ) { +#ifdef FIX_532_ISM_MD_INACTIVE + if ( ism_imp[ch] == ISM_NO_META ) +#else if ( hIsmMeta[ch]->ism_metadata_flag == 0 && localVAD[ch] == 0 ) +#endif { diff += bits_CoreCoder[ch] - BITS_ISM_INACTIVE; bits_CoreCoder[ch] = BITS_ISM_INACTIVE; @@ -212,18 +241,34 @@ ivas_error ivas_ism_config( { int16_t limit; +#ifdef FIX_532_ISM_MD_INACTIVE + limit = MIN_BRATE_SWB_BWE / FRAMES_PER_SEC; +#else limit = MIN_BRATE_SWB_BWE / FRMS_PER_SECOND; +#endif if ( element_brate[ch] < MIN_BRATE_SWB_STEREO ) /* replicate function set_bw() -> check the coded audio band-width */ { +#ifdef FIX_532_ISM_MD_INACTIVE + limit = MIN_BRATE_WB_BWE / FRAMES_PER_SEC; +#else limit = MIN_BRATE_WB_BWE / FRMS_PER_SECOND; +#endif } else if ( element_brate[ch] >= SCE_CORE_16k_LOW_LIMIT ) /* replicate function set_ACELP_flag() -> it is not intended to switch the ACELP internal sampling rate within an object */ { /*limit = SCE_CORE_16k_LOW_LIMIT;*/ +#ifdef FIX_532_ISM_MD_INACTIVE + limit = ( ACELP_16k_LOW_LIMIT + SWB_TBE_1k6 ) / FRAMES_PER_SEC; +#else limit = ( ACELP_16k_LOW_LIMIT + SWB_TBE_1k6 ) / FRMS_PER_SECOND; +#endif } +#ifdef FIX_532_ISM_MD_INACTIVE + if ( ism_imp[ch] == ISM_NO_META ) +#else if ( ism_imp[ch] == ISM_NO_META && localVAD[ch] == 0 ) +#endif { tmp = BITS_ISM_INACTIVE; } @@ -270,10 +315,18 @@ ivas_error ivas_ism_config( diff = 0; for ( ch = 0; ch < n_ISms; ch++ ) { +#ifdef FIX_532_ISM_MD_INACTIVE + limit_high = IVAS_512k / FRAMES_PER_SEC; +#else limit_high = IVAS_512k / FRMS_PER_SECOND; +#endif if ( element_brate[ch] < SCE_CORE_16k_LOW_LIMIT ) /* replicate function set_ACELP_flag() -> it is not intended to switch the ACELP internal sampling rate within an object */ { +#ifdef FIX_532_ISM_MD_INACTIVE + limit_high = ACELP_12k8_HIGH_LIMIT / FRAMES_PER_SEC; +#else limit_high = ACELP_12k8_HIGH_LIMIT / FRMS_PER_SECOND; +#endif } tmp = (int16_t) min( bits_CoreCoder[ch], limit_high ); @@ -316,7 +369,11 @@ ivas_error ivas_ism_config( if ( nb_bits_metadata != NULL ) { int32_t tmpL; +#ifdef FIX_532_ISM_MD_INACTIVE + tmpL = sum_l( total_brate, n_ISms ) + bits_side * FRAMES_PER_SEC; +#else tmpL = sum_l( total_brate, n_ISms ) + bits_side * FRMS_PER_SECOND; +#endif if ( sum_l( element_brate, n_ISms ) != tmpL ) { return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "\nError: Mismatch in ISM bit-budget distribution. Exiting!\n" ); diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 2804668e0f..a437c5cd74 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -885,7 +885,9 @@ ivas_error ivas_ism_config( const int16_t nchan_ism, /* i : number of objects */ ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ const int16_t ism_extended_metadata_flag, /* i : extended metadata flag */ +#ifndef FIX_532_ISM_MD_INACTIVE const int16_t localVAD[MAX_NUM_OBJECTS], /* i : local VAD flag */ +#endif const int16_t ism_imp[], /* i : ISM importance flags */ int32_t element_brate[], /* o : element bitrate per object */ int32_t total_brate[], /* o : total bitrate per object */ diff --git a/lib_com/options.h b/lib_com/options.h index d8428a0810..52afff9259 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -58,7 +58,7 @@ #ifdef DEBUGGING -/*#define DEBUG_MODE_INFO*/ /* output most important parameters to the subdirectory "res/" */ +#define DEBUG_MODE_INFO /* output most important parameters to the subdirectory "res/" */ #ifdef DEBUG_MODE_INFO /*#define DEBUG_MODE_ACELP*/ /* output most important ACELP core parameters to the subdirectory "res/" */ /*#define DEBUG_MODE_TCX*/ /* output most important TCX core parameters to the subdirectory "res/" */ @@ -242,6 +242,8 @@ #define BINAURAL_AUDIO_CMDLINE #define FIX_570_TCX_LPC_WRITE /* FhG: fix issue 570: LPC bitstream writer in TCX */ +#define FIX_532_ISM_MD_INACTIVE /* VA: issue 532: impprove MD coding in ISM inactive frames */ + /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_dec/ivas_ism_dec.c b/lib_dec/ivas_ism_dec.c index fe98ca0dcb..d3c33e40db 100644 --- a/lib_dec/ivas_ism_dec.c +++ b/lib_dec/ivas_ism_dec.c @@ -84,7 +84,11 @@ static ivas_error ivas_ism_bitrate_switching( ivas_init_dec_get_num_cldfb_instances( st_ivas, &numCldfbAnalyses_old, &numCldfbSyntheses_old ); st_ivas->ism_mode = ism_mode; +#ifdef FIX_532_ISM_MD_INACTIVE + if ( ( error = ivas_ism_config( st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->nchan_ism, NULL, 0, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_ism_config( st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->nchan_ism, NULL, 0, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) +#endif { return error; } diff --git a/lib_dec/ivas_ism_metadata_dec.c b/lib_dec/ivas_ism_metadata_dec.c index a39c496ab6..570fa95631 100644 --- a/lib_dec/ivas_ism_metadata_dec.c +++ b/lib_dec/ivas_ism_metadata_dec.c @@ -168,7 +168,11 @@ ivas_error ivas_ism_metadata_dec( uint16_t i, bstr_meta[MAX_BITS_METADATA], *bstr_orig; ISM_METADATA_HANDLE hIsmMetaData; int16_t nchan_transport_prev, ism_metadata_flag_global; +#ifdef FIX_532_ISM_MD_INACTIVE + int16_t inactive_metadata_flag[MAX_NUM_OBJECTS]; +#else int16_t localVAD[MAX_NUM_OBJECTS]; +#endif int16_t ism_imp[MAX_NUM_OBJECTS]; int16_t nbands, nblocks; int16_t md_diff_flag[MAX_NUM_OBJECTS]; @@ -176,7 +180,6 @@ ivas_error ivas_ism_metadata_dec( push_wmops( "ism_meta_dec" ); - /* initialization */ st0 = hSCE[0]->hCoreCoder[0]; ism_metadata_flag_global = 0; @@ -188,6 +191,9 @@ ivas_error ivas_ism_metadata_dec( st0->next_bit_pos = 0; ism_extmeta_bitstream = 0; non_diegetic_flag_global = 0; +#ifdef FIX_532_ISM_MD_INACTIVE + set_s( inactive_metadata_flag, 0, nchan_ism ); +#endif /* reverse the bitstream for easier reading of indices */ for ( i = 0; i < min( MAX_BITS_METADATA, last_bit_pos ); i++ ) @@ -272,6 +278,18 @@ ivas_error ivas_ism_metadata_dec( ism_metadata_flag_global |= hIsmMeta[ch]->ism_metadata_flag; } +#ifdef FIX_532_ISM_MD_INACTIVE + /* signal presence of MD in low-rate ISM_NO_META frame */ + for ( ch = 0; ch < *nchan_transport; ch++ ) + { + if ( hIsmMeta[ch]->ism_metadata_flag == 0 ) + { + inactive_metadata_flag[ch] = get_next_indice( st0, ISM_METADATA_INACTIVE_FLAG_BITS ); + + ism_metadata_flag_global |= inactive_metadata_flag[ch]; + } + } +#else /* read VAD flag */ for ( ch = 0; ch < *nchan_transport; ch++ ) { @@ -284,6 +302,7 @@ ivas_error ivas_ism_metadata_dec( localVAD[ch] = 1; } } +#endif if ( ism_metadata_flag_global ) { @@ -310,7 +329,11 @@ ivas_error ivas_ism_metadata_dec( flag_abs_orientation = 0; flag_abs_radius = 0; +#ifdef FIX_532_ISM_MD_INACTIVE + if ( hIsmMeta[ch]->ism_metadata_flag || inactive_metadata_flag[ch] ) +#else if ( hIsmMeta[ch]->ism_metadata_flag ) +#endif { if ( non_diegetic_flag_global ) { @@ -478,7 +501,11 @@ ivas_error ivas_ism_metadata_dec( if ( !bfi ) { +#ifdef FIX_532_ISM_MD_INACTIVE + if ( ( error = ivas_ism_config( ism_total_brate, *nchan_transport, nchan_ism, hIsmMeta, ism_extmeta_bitstream, ism_imp, element_brate, total_brate, nb_bits_metadata ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_ism_config( ism_total_brate, *nchan_transport, nchan_ism, hIsmMeta, ism_extmeta_bitstream, localVAD, ism_imp, element_brate, total_brate, nb_bits_metadata ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -490,7 +517,11 @@ ivas_error ivas_ism_metadata_dec( hSCE[ch]->hCoreCoder[0]->low_rate_mode = 0; if ( ism_mode == ISM_MODE_DISC ) { +#ifdef FIX_532_ISM_MD_INACTIVE + if ( total_brate[ch] == BRATE_ISM_INACTIVE ) +#else if ( hIsmMeta[ch]->ism_metadata_flag == 0 && localVAD[ch] == 0 && ism_metadata_flag_global ) +#endif { hSCE[ch]->hCoreCoder[0]->low_rate_mode = 1; } @@ -583,7 +614,11 @@ ivas_error ivas_ism_metadata_dec_create( ivas_ism_reset_metadata( st_ivas->hIsmMetaData[ch] ); } +#ifdef FIX_532_ISM_MD_INACTIVE + if ( ( error = ivas_ism_config( st_ivas->hDecoderConfig->ivas_total_brate, n_ISms, n_ISms, NULL, 0, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_ism_config( st_ivas->hDecoderConfig->ivas_total_brate, n_ISms, n_ISms, NULL, 0, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) +#endif { return error; } diff --git a/lib_enc/ivas_ism_enc.c b/lib_enc/ivas_ism_enc.c index 6c6a0c8837..1c8a9f975f 100644 --- a/lib_enc/ivas_ism_enc.c +++ b/lib_enc/ivas_ism_enc.c @@ -412,7 +412,11 @@ ivas_error ivas_ism_enc_config( st_ivas->nSCE = st_ivas->nchan_transport; st_ivas->nCPE = 0; +#ifdef FIX_532_ISM_MD_INACTIVE + if ( ( error = ivas_ism_config( st_ivas->hEncoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hEncoderConfig->nchan_inp, NULL, 0, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_ism_config( st_ivas->hEncoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hEncoderConfig->nchan_inp, NULL, 0, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) +#endif { return error; } diff --git a/lib_enc/ivas_ism_metadata_enc.c b/lib_enc/ivas_ism_metadata_enc.c index a8c4982e4b..3cd19ddafe 100644 --- a/lib_enc/ivas_ism_metadata_enc.c +++ b/lib_enc/ivas_ism_metadata_enc.c @@ -117,7 +117,10 @@ static void rate_ism_importance( const int16_t nchan_transport, /* i : number of transported channels */ ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ SCE_ENC_HANDLE hSCE[], /* i/o: SCE encoder handles */ - int16_t ism_imp[] /* o : ISM importance flags */ +#ifdef FIX_532_ISM_MD_INACTIVE + const int16_t inactive_metadata_flag[MAX_NUM_OBJECTS], /* i : flag indicating MD in ISM_NO_META frame for FEC */ +#endif + int16_t ism_imp[] /* o : ISM importance flags */ ) { int16_t ch, ctype; @@ -138,7 +141,11 @@ static void rate_ism_importance( } } +#ifdef FIX_532_ISM_MD_INACTIVE + if ( ( hIsmMeta[ch]->ism_metadata_flag == 0 || inactive_metadata_flag[ch] == 1 ) && hSCE[ch]->hCoreCoder[0]->localVAD == 0 ) +#else if ( hIsmMeta[ch]->ism_metadata_flag == 0 ) +#endif { ism_imp[ch] = ISM_NO_META; } @@ -174,7 +181,7 @@ ivas_error ivas_ism_metadata_enc( SCE_ENC_HANDLE hSCE[], /* i/o: SCE encoder handles */ BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ int16_t nb_bits_metadata[], /* o : number of metadata bits */ - const int16_t localVAD[], /* i : VAD flag */ + const int16_t vad_flag[], /* i : VAD flag */ const int16_t ism_mode, /* i : ISM mode */ const PARAM_ISM_CONFIG_HANDLE hParamIsm, /* i : Param ISM Enc Handle */ const int16_t ism_extended_metadata_flag /* i : Extended metadata flag */ @@ -194,6 +201,9 @@ ivas_error ivas_ism_metadata_enc( int16_t ism_metadata_flag_global; int16_t non_diegetic_flag_global; int16_t ism_imp[MAX_NUM_OBJECTS]; +#ifdef FIX_532_ISM_MD_INACTIVE + int16_t inactive_metadata_flag[MAX_NUM_OBJECTS]; +#endif int16_t nbands, nblocks; ivas_error error; @@ -210,6 +220,9 @@ ivas_error ivas_ism_metadata_enc( set_s( flag_abs_yaw, 0, nchan_ism ); set_s( flag_abs_pitch, 0, nchan_ism ); set_s( flag_abs_radius, 0, nchan_ism ); +#ifdef FIX_532_ISM_MD_INACTIVE + set_s( inactive_metadata_flag, 0, nchan_ism ); +#endif /*----------------------------------------------------------------* * Set Metadata presence / importance flag @@ -226,19 +239,28 @@ ivas_error ivas_ism_metadata_enc( if ( hIsmMeta[ch]->ism_metadata_flag == 1 ) { /* In case of low level noise for low bitrate inactive frames, do not sent metadata */ - hIsmMeta[ch]->ism_metadata_flag = localVAD[ch] || hSCE[ch]->hCoreCoder[0]->lp_noise > 10 || hSCE[ch]->hCoreCoder[0]->tcxonly; + hIsmMeta[ch]->ism_metadata_flag = vad_flag[ch] || hSCE[ch]->hCoreCoder[0]->lp_noise > 10 || hSCE[ch]->hCoreCoder[0]->tcxonly; + /* in inactive frames, send MD 1) in ISM_MD_INC_DIFF_CNT_MAX consecutive frames when MD significantly change, 2) at least every ISM_MD_FEC_DIFF frames */ if ( hIsmMeta[ch]->ism_metadata_flag == 0 ) { if ( ( fabsf( hIsmMeta[ch]->azimuth - hIsmMeta[ch]->last_true_azimuth ) > ISM_MD_FEC_DIFF ) || ( fabsf( hIsmMeta[ch]->elevation - hIsmMeta[ch]->last_true_elevation ) > ISM_MD_FEC_DIFF ) || ( fabsf( hIsmMeta[ch]->radius - hIsmMeta[ch]->last_true_radius ) > ISM_MD_RAD_FEC_DIFF ) ) { +#ifdef FIX_532_ISM_MD_INACTIVE + inactive_metadata_flag[ch] = 1; +#else hIsmMeta[ch]->ism_metadata_flag = 1; +#endif hIsmMeta[ch]->ism_md_inc_diff_cnt = 0; } else if ( hIsmMeta[ch]->ism_md_inc_diff_cnt < ISM_MD_INC_DIFF_CNT_MAX ) { +#ifdef FIX_532_ISM_MD_INACTIVE + inactive_metadata_flag[ch] = 1; +#else hIsmMeta[ch]->ism_metadata_flag = 1; +#endif if ( hIsmMeta[ch]->ism_md_inc_diff_cnt % 2 == 0 ) { @@ -251,7 +273,11 @@ ivas_error ivas_ism_metadata_enc( } else if ( hIsmMeta[ch]->ism_md_fec_cnt_enc == ISM_MD_FEC_CNT_MAX ) { +#ifdef FIX_532_ISM_MD_INACTIVE + inactive_metadata_flag[ch] = 1; +#else hIsmMeta[ch]->ism_metadata_flag = 1; +#endif hIsmMeta[ch]->position_angle.angle1_diff_cnt = ISM_FEC_MAX; } } @@ -263,8 +289,11 @@ ivas_error ivas_ism_metadata_enc( * Rate importance of particular ISM streams *----------------------------------------------------------------*/ +#ifdef FIX_532_ISM_MD_INACTIVE + rate_ism_importance( nchan_transport, hIsmMeta, hSCE, inactive_metadata_flag, ism_imp ); +#else rate_ism_importance( nchan_transport, hIsmMeta, hSCE, ism_imp ); - +#endif /*----------------------------------------------------------------* * Write ISM common signaling @@ -280,6 +309,9 @@ ivas_error ivas_ism_metadata_enc( for ( ch = 0; ch < nchan_ism; ch++ ) { ism_metadata_flag_global |= hIsmMeta[ch]->ism_metadata_flag; +#ifdef FIX_532_ISM_MD_INACTIVE + ism_metadata_flag_global |= inactive_metadata_flag[ch]; +#endif non_diegetic_flag_global |= hIsmMeta[ch]->non_diegetic_flag; } @@ -301,6 +333,21 @@ ivas_error ivas_ism_metadata_enc( push_indice( hBstr, IND_ISM_METADATA_FLAG, ism_imp[ch], ISM_METADATA_FLAG_BITS ); } + +#ifdef FIX_532_ISM_MD_INACTIVE + /* signal presence of MD in low-rate ISM_NO_META frame */ + if ( ism_mode == ISM_MODE_DISC ) + { + for ( ch = 0; ch < nchan_transport; ch++ ) + { + if ( ism_imp[ch] == ISM_NO_META ) + { + push_indice( hBstr, IND_ISM_MD_INACTIVE_FLAG, inactive_metadata_flag[ch], ISM_METADATA_INACTIVE_FLAG_BITS ); + } + } + } + +#else if ( ism_mode == ISM_MODE_DISC ) { /* write VAD flag */ @@ -309,16 +356,18 @@ ivas_error ivas_ism_metadata_enc( if ( hIsmMeta[ch]->ism_metadata_flag == 0 ) { /* this flag distinguishes between coding of inactive frame and active frame w/o. metadata */ - push_indice( hBstr, IND_ISM_VAD_FLAG, localVAD[ch], ISM_METADATA_VAD_FLAG_BITS ); + push_indice( hBstr, IND_ISM_VAD_FLAG, vad_flag[ch], ISM_METADATA_VAD_FLAG_BITS ); } } } +#endif if ( ism_metadata_flag_global ) { /*----------------------------------------------------------------* * Metadata quantization and coding, loop over all objects *----------------------------------------------------------------*/ + int16_t total_bits_metadata = 0; int16_t bits_metadata_ism = 0; int16_t nb_bits_objcod_written; @@ -336,7 +385,11 @@ ivas_error ivas_ism_metadata_enc( nb_bits_start = hBstr->nb_bits_tot; } +#ifdef FIX_532_ISM_MD_INACTIVE + if ( hIsmMeta[ch]->ism_metadata_flag || inactive_metadata_flag[ch] ) +#else if ( hIsmMeta[ch]->ism_metadata_flag ) +#endif { /*----------------------------------------------------------------* * Quantize and encode azimuth and elevation @@ -532,7 +585,11 @@ ivas_error ivas_ism_metadata_enc( * Configuration and decision about bitrates per channel *----------------------------------------------------------------*/ - if ( ( error = ivas_ism_config( ism_total_brate, nchan_transport, nchan_ism, hIsmMeta, ism_extended_metadata_flag, localVAD, ism_imp, element_brate, total_brate, nb_bits_metadata ) ) != IVAS_ERR_OK ) +#ifdef FIX_532_ISM_MD_INACTIVE + if ( ( error = ivas_ism_config( ism_total_brate, nchan_transport, nchan_ism, hIsmMeta, ism_extended_metadata_flag, ism_imp, element_brate, total_brate, nb_bits_metadata ) ) != IVAS_ERR_OK ) +#else + if ( ( error = ivas_ism_config( ism_total_brate, nchan_transport, nchan_ism, hIsmMeta, ism_extended_metadata_flag, vad_flag, ism_imp, element_brate, total_brate, nb_bits_metadata ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -558,7 +615,11 @@ ivas_error ivas_ism_metadata_enc( hSCE[ch]->hCoreCoder[0]->low_rate_mode = 0; if ( ism_mode == ISM_MODE_DISC ) { - if ( hIsmMeta[ch]->ism_metadata_flag == 0 && localVAD[ch] == 0 && ism_metadata_flag_global ) +#ifdef FIX_532_ISM_MD_INACTIVE + if ( total_brate[ch] == BRATE_ISM_INACTIVE ) +#else + if ( hIsmMeta[ch]->ism_metadata_flag == 0 && vad_flag[ch] == 0 && ism_metadata_flag_global ) +#endif { hSCE[ch]->hCoreCoder[0]->low_rate_mode = 1; } @@ -643,7 +704,11 @@ ivas_error ivas_ism_metadata_enc_create( st_ivas->hIsmMetaData[ch]->last_true_radius = 1.0f; } +#ifdef FIX_532_ISM_MD_INACTIVE + if ( ( error = ivas_ism_config( st_ivas->hEncoderConfig->ivas_total_brate, nchan_transport, n_ISms, NULL, 0, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_ism_config( st_ivas->hEncoderConfig->ivas_total_brate, nchan_transport, n_ISms, NULL, 0, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -1064,11 +1129,19 @@ void ivas_ism_metadata_sid_enc( { if ( ism_mode == ISM_MODE_DISC ) { +#ifdef FIX_532_ISM_MD_INACTIVE + push_indice( hBstr, IND_ISM_MD_INACTIVE_FLAG, 0, 1 ); +#else push_indice( hBstr, IND_ISM_VAD_FLAG, 0, 1 ); +#endif } else { +#ifdef FIX_532_ISM_MD_INACTIVE + push_indice( hBstr, IND_ISM_MD_INACTIVE_FLAG, 1, 1 ); +#else push_indice( hBstr, IND_ISM_VAD_FLAG, 1, 1 ); +#endif } if ( ism_mode == ISM_MODE_PARAM ) -- GitLab From 23b648c496191e88bbd32d89b86ca09a40cfd6e6 Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 7 Jun 2023 11:21:02 +0200 Subject: [PATCH 2/6] introduce 'null_metadata_flag' and rename 'lowrate_metadata_flag'; 1 bit is added to ISM_NO_META mode --- lib_com/ivas_cnst.h | 4 ++- lib_com/ivas_ism_com.c | 15 +++++++-- lib_com/ivas_prot.h | 4 ++- lib_com/options.h | 2 +- lib_dec/ivas_ism_dec.c | 4 --- lib_dec/ivas_ism_metadata_dec.c | 39 ++++++++++++++++-------- lib_enc/ivas_ism_enc.c | 2 +- lib_enc/ivas_ism_metadata_enc.c | 54 ++++++++++++++++++++++----------- 8 files changed, 83 insertions(+), 41 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 1bebf9f460..5f22991fbf 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -328,6 +328,7 @@ typedef enum #define ISM_NB_BITS_METADATA_NOMINAL ( ( SCE_CORE_16k_LOW_LIMIT - ACELP_16k_LOW_LIMIT ) / FRAMES_PER_SEC ) /* nominal number of metadata bits - used for configuration of Core-Coder modules */ #ifdef FIX_532_ISM_MD_INACTIVE +#define ISM_METADATA_MD_FLAG_BITS 1 /* flag to distinguish between NULL metadata and low-rate ISM_NO_META class */ #define ISM_METADATA_INACTIVE_FLAG_BITS 1 /* flag to signal whether MD are sent in low-rate inactive frame */ #else #define ISM_METADATA_VAD_FLAG_BITS 1 @@ -405,7 +406,8 @@ enum IND_ISM_EXTENDED_NDP_FLAG, IND_ISM_METADATA_FLAG, #ifdef FIX_532_ISM_MD_INACTIVE - IND_ISM_MD_INACTIVE_FLAG = IND_ISM_METADATA_FLAG + MAX_NUM_OBJECTS, + IND_ISM_MD_NULL_FLAG = IND_ISM_METADATA_FLAG + MAX_NUM_OBJECTS, + IND_ISM_MD_INACTIVE_FLAG = IND_ISM_MD_NULL_FLAG + MAX_NUM_OBJECTS, IND_ISM_NOISY_SPEECH_FLAG = IND_ISM_MD_INACTIVE_FLAG + MAX_NUM_OBJECTS, #else IND_ISM_VAD_FLAG = IND_ISM_METADATA_FLAG + MAX_NUM_OBJECTS, diff --git a/lib_com/ivas_ism_com.c b/lib_com/ivas_ism_com.c index 40622f9d4d..42118da48b 100644 --- a/lib_com/ivas_ism_com.c +++ b/lib_com/ivas_ism_com.c @@ -101,7 +101,9 @@ ivas_error ivas_ism_config( const int16_t nchan_ism, /* i : number of objects */ ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ const int16_t ism_extended_metadata_flag, /* i : extended metadata flag */ -#ifndef FIX_532_ISM_MD_INACTIVE +#ifdef FIX_532_ISM_MD_INACTIVE + const int16_t null_metadata_flag[MAX_NUM_OBJECTS], /* i : NULL MD flag */ +#else const int16_t localVAD[MAX_NUM_OBJECTS], /* i : local VAD flag */ #endif const int16_t ism_imp[], /* i : ISM importance flags */ @@ -167,7 +169,16 @@ ivas_error ivas_ism_config( #ifdef FIX_532_ISM_MD_INACTIVE if ( ism_imp[ch] == ISM_NO_META ) { - nb_bits_metadata[0] += ISM_METADATA_INACTIVE_FLAG_BITS; + nb_bits_metadata[0] += ISM_METADATA_MD_FLAG_BITS; + + if ( null_metadata_flag[ch] ) + { + nb_bits_metadata[0] += ISM_METADATA_FLAG_BITS; + } + else + { + nb_bits_metadata[0] += ISM_METADATA_INACTIVE_FLAG_BITS; + } } #else if ( hIsmMeta[ch]->ism_metadata_flag == 0 ) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 684a77c9fa..9a3d5129a1 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -873,7 +873,9 @@ ivas_error ivas_ism_config( const int16_t nchan_ism, /* i : number of objects */ ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ const int16_t ism_extended_metadata_flag, /* i : extended metadata flag */ -#ifndef FIX_532_ISM_MD_INACTIVE +#ifdef FIX_532_ISM_MD_INACTIVE + const int16_t null_metadata_flag[MAX_NUM_OBJECTS], /* i : NULL MD flag */ +#else const int16_t localVAD[MAX_NUM_OBJECTS], /* i : local VAD flag */ #endif const int16_t ism_imp[], /* i : ISM importance flags */ diff --git a/lib_com/options.h b/lib_com/options.h index 1d82476cc5..f144b0f5ac 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -170,7 +170,7 @@ #define EXTERNAL_ORIENTATIONS /* Nokia: Contribution 41: (external) orientation information handling */ -#define FIX_532_ISM_MD_INACTIVE /* VA: issue 532: impprove MD coding in ISM inactive frames */ +#define FIX_532_ISM_MD_INACTIVE /* VA: issue 532: improve MD coding in ISM inactive frames */ /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_dec/ivas_ism_dec.c b/lib_dec/ivas_ism_dec.c index 3fc94db397..5ad0ce08c7 100644 --- a/lib_dec/ivas_ism_dec.c +++ b/lib_dec/ivas_ism_dec.c @@ -77,11 +77,7 @@ static ivas_error ivas_ism_bitrate_switching( ivas_init_dec_get_num_cldfb_instances( st_ivas, &numCldfbAnalyses_old, &numCldfbSyntheses_old ); st_ivas->ism_mode = ism_mode; -#ifdef FIX_532_ISM_MD_INACTIVE - if ( ( error = ivas_ism_config( st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->nchan_ism, NULL, 0, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) -#else if ( ( error = ivas_ism_config( st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->nchan_ism, NULL, 0, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) -#endif { return error; } diff --git a/lib_dec/ivas_ism_metadata_dec.c b/lib_dec/ivas_ism_metadata_dec.c index 570fa95631..2bfe7894d7 100644 --- a/lib_dec/ivas_ism_metadata_dec.c +++ b/lib_dec/ivas_ism_metadata_dec.c @@ -169,7 +169,8 @@ ivas_error ivas_ism_metadata_dec( ISM_METADATA_HANDLE hIsmMetaData; int16_t nchan_transport_prev, ism_metadata_flag_global; #ifdef FIX_532_ISM_MD_INACTIVE - int16_t inactive_metadata_flag[MAX_NUM_OBJECTS]; + int16_t null_metadata_flag[MAX_NUM_OBJECTS]; + int16_t lowrate_metadata_flag[MAX_NUM_OBJECTS]; #else int16_t localVAD[MAX_NUM_OBJECTS]; #endif @@ -192,7 +193,8 @@ ivas_error ivas_ism_metadata_dec( ism_extmeta_bitstream = 0; non_diegetic_flag_global = 0; #ifdef FIX_532_ISM_MD_INACTIVE - set_s( inactive_metadata_flag, 0, nchan_ism ); + set_s( null_metadata_flag, 0, nchan_ism ); + set_s( lowrate_metadata_flag, 0, nchan_ism ); #endif /* reverse the bitstream for easier reading of indices */ @@ -279,14 +281,29 @@ ivas_error ivas_ism_metadata_dec( } #ifdef FIX_532_ISM_MD_INACTIVE - /* signal presence of MD in low-rate ISM_NO_META frame */ - for ( ch = 0; ch < *nchan_transport; ch++ ) + /* read ISM_NO_META class signalling */ + if ( ism_mode == ISM_MODE_DISC ) { - if ( hIsmMeta[ch]->ism_metadata_flag == 0 ) + for ( ch = 0; ch < *nchan_transport; ch++ ) { - inactive_metadata_flag[ch] = get_next_indice( st0, ISM_METADATA_INACTIVE_FLAG_BITS ); + if ( ism_imp[ch] == ISM_NO_META ) + { + /* low-rate ISM_NO_META frame */ + null_metadata_flag[ch] = get_next_indice( st0, ISM_METADATA_INACTIVE_FLAG_BITS ); - ism_metadata_flag_global |= inactive_metadata_flag[ch]; + if ( null_metadata_flag[ch] ) + { + /* read the true ISM class */ + ism_imp[ch] = get_next_indice( st0, ISM_METADATA_FLAG_BITS ); + } + else + { + /* read presence of MD in low-rate ISM_NO_META frame flag */ + lowrate_metadata_flag[ch] = get_next_indice( st0, ISM_METADATA_INACTIVE_FLAG_BITS ); + + ism_metadata_flag_global |= lowrate_metadata_flag[ch]; + } + } } } #else @@ -330,7 +347,7 @@ ivas_error ivas_ism_metadata_dec( flag_abs_radius = 0; #ifdef FIX_532_ISM_MD_INACTIVE - if ( hIsmMeta[ch]->ism_metadata_flag || inactive_metadata_flag[ch] ) + if ( hIsmMeta[ch]->ism_metadata_flag || lowrate_metadata_flag[ch] ) #else if ( hIsmMeta[ch]->ism_metadata_flag ) #endif @@ -502,7 +519,7 @@ ivas_error ivas_ism_metadata_dec( if ( !bfi ) { #ifdef FIX_532_ISM_MD_INACTIVE - if ( ( error = ivas_ism_config( ism_total_brate, *nchan_transport, nchan_ism, hIsmMeta, ism_extmeta_bitstream, ism_imp, element_brate, total_brate, nb_bits_metadata ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_ism_config( ism_total_brate, *nchan_transport, nchan_ism, hIsmMeta, ism_extmeta_bitstream, null_metadata_flag, ism_imp, element_brate, total_brate, nb_bits_metadata ) ) != IVAS_ERR_OK ) #else if ( ( error = ivas_ism_config( ism_total_brate, *nchan_transport, nchan_ism, hIsmMeta, ism_extmeta_bitstream, localVAD, ism_imp, element_brate, total_brate, nb_bits_metadata ) ) != IVAS_ERR_OK ) #endif @@ -614,11 +631,7 @@ ivas_error ivas_ism_metadata_dec_create( ivas_ism_reset_metadata( st_ivas->hIsmMetaData[ch] ); } -#ifdef FIX_532_ISM_MD_INACTIVE - if ( ( error = ivas_ism_config( st_ivas->hDecoderConfig->ivas_total_brate, n_ISms, n_ISms, NULL, 0, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) -#else if ( ( error = ivas_ism_config( st_ivas->hDecoderConfig->ivas_total_brate, n_ISms, n_ISms, NULL, 0, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) -#endif { return error; } diff --git a/lib_enc/ivas_ism_enc.c b/lib_enc/ivas_ism_enc.c index 1c8a9f975f..1175499b82 100644 --- a/lib_enc/ivas_ism_enc.c +++ b/lib_enc/ivas_ism_enc.c @@ -412,7 +412,7 @@ ivas_error ivas_ism_enc_config( st_ivas->nSCE = st_ivas->nchan_transport; st_ivas->nCPE = 0; -#ifdef FIX_532_ISM_MD_INACTIVE +#ifdef FIX_532_ISM_MD_INACTIVEaa if ( ( error = ivas_ism_config( st_ivas->hEncoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hEncoderConfig->nchan_inp, NULL, 0, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) #else if ( ( error = ivas_ism_config( st_ivas->hEncoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hEncoderConfig->nchan_inp, NULL, 0, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) diff --git a/lib_enc/ivas_ism_metadata_enc.c b/lib_enc/ivas_ism_metadata_enc.c index 3cd19ddafe..c1c48a1ec3 100644 --- a/lib_enc/ivas_ism_metadata_enc.c +++ b/lib_enc/ivas_ism_metadata_enc.c @@ -118,7 +118,7 @@ static void rate_ism_importance( ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ SCE_ENC_HANDLE hSCE[], /* i/o: SCE encoder handles */ #ifdef FIX_532_ISM_MD_INACTIVE - const int16_t inactive_metadata_flag[MAX_NUM_OBJECTS], /* i : flag indicating MD in ISM_NO_META frame for FEC */ + const int16_t lowrate_metadata_flag[MAX_NUM_OBJECTS], /* i : low-rate MD flag */ #endif int16_t ism_imp[] /* o : ISM importance flags */ ) @@ -142,7 +142,7 @@ static void rate_ism_importance( } #ifdef FIX_532_ISM_MD_INACTIVE - if ( ( hIsmMeta[ch]->ism_metadata_flag == 0 || inactive_metadata_flag[ch] == 1 ) && hSCE[ch]->hCoreCoder[0]->localVAD == 0 ) + if ( ( hIsmMeta[ch]->ism_metadata_flag == 0 || lowrate_metadata_flag[ch] == 1 ) && hSCE[ch]->hCoreCoder[0]->localVAD == 0 ) #else if ( hIsmMeta[ch]->ism_metadata_flag == 0 ) #endif @@ -202,7 +202,8 @@ ivas_error ivas_ism_metadata_enc( int16_t non_diegetic_flag_global; int16_t ism_imp[MAX_NUM_OBJECTS]; #ifdef FIX_532_ISM_MD_INACTIVE - int16_t inactive_metadata_flag[MAX_NUM_OBJECTS]; + int16_t null_metadata_flag[MAX_NUM_OBJECTS]; + int16_t lowrate_metadata_flag[MAX_NUM_OBJECTS]; #endif int16_t nbands, nblocks; ivas_error error; @@ -221,7 +222,8 @@ ivas_error ivas_ism_metadata_enc( set_s( flag_abs_pitch, 0, nchan_ism ); set_s( flag_abs_radius, 0, nchan_ism ); #ifdef FIX_532_ISM_MD_INACTIVE - set_s( inactive_metadata_flag, 0, nchan_ism ); + set_s( null_metadata_flag, 0, nchan_ism ); + set_s( lowrate_metadata_flag, 0, nchan_ism ); #endif /*----------------------------------------------------------------* @@ -236,6 +238,10 @@ ivas_error ivas_ism_metadata_enc( } else if ( ism_mode == ISM_MODE_DISC ) { +#ifdef FIX_532_ISM_MD_INACTIVE + null_metadata_flag[ch] = !hIsmMeta[ch]->ism_metadata_flag; +#endif + if ( hIsmMeta[ch]->ism_metadata_flag == 1 ) { /* In case of low level noise for low bitrate inactive frames, do not sent metadata */ @@ -248,7 +254,7 @@ ivas_error ivas_ism_metadata_enc( ( fabsf( hIsmMeta[ch]->elevation - hIsmMeta[ch]->last_true_elevation ) > ISM_MD_FEC_DIFF ) || ( fabsf( hIsmMeta[ch]->radius - hIsmMeta[ch]->last_true_radius ) > ISM_MD_RAD_FEC_DIFF ) ) { #ifdef FIX_532_ISM_MD_INACTIVE - inactive_metadata_flag[ch] = 1; + lowrate_metadata_flag[ch] = 1; #else hIsmMeta[ch]->ism_metadata_flag = 1; #endif @@ -257,7 +263,7 @@ ivas_error ivas_ism_metadata_enc( else if ( hIsmMeta[ch]->ism_md_inc_diff_cnt < ISM_MD_INC_DIFF_CNT_MAX ) { #ifdef FIX_532_ISM_MD_INACTIVE - inactive_metadata_flag[ch] = 1; + lowrate_metadata_flag[ch] = 1; #else hIsmMeta[ch]->ism_metadata_flag = 1; #endif @@ -274,7 +280,7 @@ ivas_error ivas_ism_metadata_enc( else if ( hIsmMeta[ch]->ism_md_fec_cnt_enc == ISM_MD_FEC_CNT_MAX ) { #ifdef FIX_532_ISM_MD_INACTIVE - inactive_metadata_flag[ch] = 1; + lowrate_metadata_flag[ch] = 1; #else hIsmMeta[ch]->ism_metadata_flag = 1; #endif @@ -290,7 +296,7 @@ ivas_error ivas_ism_metadata_enc( *----------------------------------------------------------------*/ #ifdef FIX_532_ISM_MD_INACTIVE - rate_ism_importance( nchan_transport, hIsmMeta, hSCE, inactive_metadata_flag, ism_imp ); + rate_ism_importance( nchan_transport, hIsmMeta, hSCE, lowrate_metadata_flag, ism_imp ); #else rate_ism_importance( nchan_transport, hIsmMeta, hSCE, ism_imp ); #endif @@ -310,7 +316,7 @@ ivas_error ivas_ism_metadata_enc( { ism_metadata_flag_global |= hIsmMeta[ch]->ism_metadata_flag; #ifdef FIX_532_ISM_MD_INACTIVE - ism_metadata_flag_global |= inactive_metadata_flag[ch]; + ism_metadata_flag_global |= lowrate_metadata_flag[ch]; #endif non_diegetic_flag_global |= hIsmMeta[ch]->non_diegetic_flag; } @@ -335,18 +341,34 @@ ivas_error ivas_ism_metadata_enc( #ifdef FIX_532_ISM_MD_INACTIVE - /* signal presence of MD in low-rate ISM_NO_META frame */ + /* write ISM_NO_META class signalling */ if ( ism_mode == ISM_MODE_DISC ) { for ( ch = 0; ch < nchan_transport; ch++ ) { if ( ism_imp[ch] == ISM_NO_META ) { - push_indice( hBstr, IND_ISM_MD_INACTIVE_FLAG, inactive_metadata_flag[ch], ISM_METADATA_INACTIVE_FLAG_BITS ); + if ( null_metadata_flag[ch] ) + { + /* signal NULL metadata frame */ + push_indice( hBstr, IND_ISM_MD_NULL_FLAG, 1, ISM_METADATA_MD_FLAG_BITS ); + + /* rewrite the ISM class to ISM_NO_META foloowed by the true class */ + delete_indice( hBstr, IND_ISM_METADATA_FLAG ); + push_indice( hBstr, IND_ISM_METADATA_FLAG, ISM_NO_META, ISM_METADATA_FLAG_BITS ); + push_indice( hBstr, IND_ISM_NOISY_SPEECH_FLAG, ism_imp[ch], ISM_METADATA_FLAG_BITS ); + } + else + { + /* signal low-rate ISM_NO_META frame */ + push_indice( hBstr, IND_ISM_MD_NULL_FLAG, 0, ISM_METADATA_MD_FLAG_BITS ); + + /* signal presence of MD in low-rate ISM_NO_META frame */ + push_indice( hBstr, IND_ISM_MD_INACTIVE_FLAG, lowrate_metadata_flag[ch], ISM_METADATA_INACTIVE_FLAG_BITS ); + } } } } - #else if ( ism_mode == ISM_MODE_DISC ) { @@ -386,7 +408,7 @@ ivas_error ivas_ism_metadata_enc( } #ifdef FIX_532_ISM_MD_INACTIVE - if ( hIsmMeta[ch]->ism_metadata_flag || inactive_metadata_flag[ch] ) + if ( hIsmMeta[ch]->ism_metadata_flag || lowrate_metadata_flag[ch] ) #else if ( hIsmMeta[ch]->ism_metadata_flag ) #endif @@ -586,7 +608,7 @@ ivas_error ivas_ism_metadata_enc( *----------------------------------------------------------------*/ #ifdef FIX_532_ISM_MD_INACTIVE - if ( ( error = ivas_ism_config( ism_total_brate, nchan_transport, nchan_ism, hIsmMeta, ism_extended_metadata_flag, ism_imp, element_brate, total_brate, nb_bits_metadata ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_ism_config( ism_total_brate, nchan_transport, nchan_ism, hIsmMeta, ism_extended_metadata_flag, null_metadata_flag, ism_imp, element_brate, total_brate, nb_bits_metadata ) ) != IVAS_ERR_OK ) #else if ( ( error = ivas_ism_config( ism_total_brate, nchan_transport, nchan_ism, hIsmMeta, ism_extended_metadata_flag, vad_flag, ism_imp, element_brate, total_brate, nb_bits_metadata ) ) != IVAS_ERR_OK ) #endif @@ -704,11 +726,7 @@ ivas_error ivas_ism_metadata_enc_create( st_ivas->hIsmMetaData[ch]->last_true_radius = 1.0f; } -#ifdef FIX_532_ISM_MD_INACTIVE - if ( ( error = ivas_ism_config( st_ivas->hEncoderConfig->ivas_total_brate, nchan_transport, n_ISms, NULL, 0, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) -#else if ( ( error = ivas_ism_config( st_ivas->hEncoderConfig->ivas_total_brate, nchan_transport, n_ISms, NULL, 0, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) -#endif { return error; } -- GitLab From f48584a882ef2084a68ec42133f73dc983e8d23e Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 7 Jun 2023 12:01:48 +0200 Subject: [PATCH 3/6] adapt NULL MD support --- lib_com/ivas_ism_com.c | 11 +++++--- lib_dec/ivas_ism_metadata_dec.c | 11 ++++++-- lib_enc/ivas_ism_metadata_enc.c | 48 ++++++++++++++++----------------- 3 files changed, 40 insertions(+), 30 deletions(-) diff --git a/lib_com/ivas_ism_com.c b/lib_com/ivas_ism_com.c index 42118da48b..984186493a 100644 --- a/lib_com/ivas_ism_com.c +++ b/lib_com/ivas_ism_com.c @@ -167,17 +167,22 @@ ivas_error ivas_ism_config( for ( ch = 0; ch < n_ISms; ch++ ) { #ifdef FIX_532_ISM_MD_INACTIVE - if ( ism_imp[ch] == ISM_NO_META ) + //if ( ism_imp[ch] == ISM_NO_META ) { - nb_bits_metadata[0] += ISM_METADATA_MD_FLAG_BITS; + if ( null_metadata_flag[ch] ) { + nb_bits_metadata[0] += ISM_METADATA_MD_FLAG_BITS; nb_bits_metadata[0] += ISM_METADATA_FLAG_BITS; } else { - nb_bits_metadata[0] += ISM_METADATA_INACTIVE_FLAG_BITS; + if ( ism_imp[ch] == ISM_NO_META ) + { + nb_bits_metadata[0] += ISM_METADATA_MD_FLAG_BITS; + nb_bits_metadata[0] += ISM_METADATA_INACTIVE_FLAG_BITS; + } } } #else diff --git a/lib_dec/ivas_ism_metadata_dec.c b/lib_dec/ivas_ism_metadata_dec.c index 2bfe7894d7..637a6ba697 100644 --- a/lib_dec/ivas_ism_metadata_dec.c +++ b/lib_dec/ivas_ism_metadata_dec.c @@ -241,6 +241,7 @@ ivas_error ivas_ism_metadata_dec( non_diegetic_flag_global = get_next_indice( st0, ISM_METADATA_IS_NDP_BITS ); } } + /* Apply hysteresis in case rate switching causes fluctuation in presence of extended metadata */ if ( *ism_extmeta_active == -1 || *ism_extmeta_active == ism_extmeta_bitstream ) /* If first frame or bitstream matches internal state */ { @@ -257,7 +258,7 @@ ivas_error ivas_ism_metadata_dec( } } - /* Read ISM present flags (one per object) */ + /* Read ISM metadata flags (one per object) */ for ( ch = 0; ch < *nchan_transport; ch++ ) { ism_imp[ch] = get_next_indice( st0, ISM_METADATA_FLAG_BITS ); @@ -290,10 +291,16 @@ ivas_error ivas_ism_metadata_dec( { /* low-rate ISM_NO_META frame */ null_metadata_flag[ch] = get_next_indice( st0, ISM_METADATA_INACTIVE_FLAG_BITS ); + } + } + for ( ch = 0; ch < *nchan_transport; ch++ ) + { + if ( ism_imp[ch] == ISM_NO_META ) + { if ( null_metadata_flag[ch] ) { - /* read the true ISM class */ + /* read the true ISM class */ ism_imp[ch] = get_next_indice( st0, ISM_METADATA_FLAG_BITS ); } else diff --git a/lib_enc/ivas_ism_metadata_enc.c b/lib_enc/ivas_ism_metadata_enc.c index c1c48a1ec3..d3abf35904 100644 --- a/lib_enc/ivas_ism_metadata_enc.c +++ b/lib_enc/ivas_ism_metadata_enc.c @@ -333,43 +333,41 @@ ivas_error ivas_ism_metadata_enc( } } +#ifdef FIX_532_ISM_MD_INACTIVE /* write ISM metadata flag (one per object) */ for ( ch = 0; ch < nchan_transport; ch++ ) { - push_indice( hBstr, IND_ISM_METADATA_FLAG, ism_imp[ch], ISM_METADATA_FLAG_BITS ); - } - + if ( null_metadata_flag[ch] ) + { + /* signal NULL metadata frame */ + push_indice( hBstr, IND_ISM_MD_NULL_FLAG, 1, ISM_METADATA_MD_FLAG_BITS ); -#ifdef FIX_532_ISM_MD_INACTIVE - /* write ISM_NO_META class signalling */ - if ( ism_mode == ISM_MODE_DISC ) - { - for ( ch = 0; ch < nchan_transport; ch++ ) + /* write the ISM class to ISM_NO_META and again the true ISM class */ + push_indice( hBstr, IND_ISM_METADATA_FLAG, ISM_NO_META, ISM_METADATA_FLAG_BITS ); + push_indice( hBstr, IND_ISM_NOISY_SPEECH_FLAG, ism_imp[ch], ISM_METADATA_FLAG_BITS ); + } + else { + push_indice( hBstr, IND_ISM_METADATA_FLAG, ism_imp[ch], ISM_METADATA_FLAG_BITS ); + if ( ism_imp[ch] == ISM_NO_META ) { - if ( null_metadata_flag[ch] ) - { - /* signal NULL metadata frame */ - push_indice( hBstr, IND_ISM_MD_NULL_FLAG, 1, ISM_METADATA_MD_FLAG_BITS ); + /* signal low-rate ISM_NO_META frame */ + push_indice( hBstr, IND_ISM_MD_NULL_FLAG, 0, ISM_METADATA_MD_FLAG_BITS ); - /* rewrite the ISM class to ISM_NO_META foloowed by the true class */ - delete_indice( hBstr, IND_ISM_METADATA_FLAG ); - push_indice( hBstr, IND_ISM_METADATA_FLAG, ISM_NO_META, ISM_METADATA_FLAG_BITS ); - push_indice( hBstr, IND_ISM_NOISY_SPEECH_FLAG, ism_imp[ch], ISM_METADATA_FLAG_BITS ); - } - else - { - /* signal low-rate ISM_NO_META frame */ - push_indice( hBstr, IND_ISM_MD_NULL_FLAG, 0, ISM_METADATA_MD_FLAG_BITS ); - - /* signal presence of MD in low-rate ISM_NO_META frame */ - push_indice( hBstr, IND_ISM_MD_INACTIVE_FLAG, lowrate_metadata_flag[ch], ISM_METADATA_INACTIVE_FLAG_BITS ); - } + /* signal presence of MD in low-rate ISM_NO_META frame */ + push_indice( hBstr, IND_ISM_MD_INACTIVE_FLAG, lowrate_metadata_flag[ch], ISM_METADATA_INACTIVE_FLAG_BITS ); } } } + #else + /* write ISM metadata flag (one per object) */ + for ( ch = 0; ch < nchan_transport; ch++ ) + { + push_indice( hBstr, IND_ISM_METADATA_FLAG, ism_imp[ch], ISM_METADATA_FLAG_BITS ); + } + if ( ism_mode == ISM_MODE_DISC ) { /* write VAD flag */ -- GitLab From 7c6d6937e1e64fb19d7e9b4654cc0c73805e02bf Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 7 Jun 2023 12:03:41 +0200 Subject: [PATCH 4/6] cleaning --- lib_com/ivas_ism_com.c | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/lib_com/ivas_ism_com.c b/lib_com/ivas_ism_com.c index 984186493a..bd064a584a 100644 --- a/lib_com/ivas_ism_com.c +++ b/lib_com/ivas_ism_com.c @@ -167,22 +167,17 @@ ivas_error ivas_ism_config( for ( ch = 0; ch < n_ISms; ch++ ) { #ifdef FIX_532_ISM_MD_INACTIVE - //if ( ism_imp[ch] == ISM_NO_META ) + if ( null_metadata_flag[ch] ) { - - - if ( null_metadata_flag[ch] ) + nb_bits_metadata[0] += ISM_METADATA_MD_FLAG_BITS; + nb_bits_metadata[0] += ISM_METADATA_FLAG_BITS; + } + else + { + if ( ism_imp[ch] == ISM_NO_META ) { nb_bits_metadata[0] += ISM_METADATA_MD_FLAG_BITS; - nb_bits_metadata[0] += ISM_METADATA_FLAG_BITS; - } - else - { - if ( ism_imp[ch] == ISM_NO_META ) - { - nb_bits_metadata[0] += ISM_METADATA_MD_FLAG_BITS; - nb_bits_metadata[0] += ISM_METADATA_INACTIVE_FLAG_BITS; - } + nb_bits_metadata[0] += ISM_METADATA_INACTIVE_FLAG_BITS; } } #else -- GitLab From 1ed8539ea07a2a242151fc17f7c97c824c76a929 Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 7 Jun 2023 14:45:53 +0200 Subject: [PATCH 5/6] fix in MD flags writing --- lib_com/options.h | 2 +- lib_enc/ivas_ism_metadata_enc.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index f144b0f5ac..15f8fa1b18 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -58,7 +58,7 @@ #ifdef DEBUGGING -#define DEBUG_MODE_INFO /* output most important parameters to the subdirectory "res/" */ +/*#define DEBUG_MODE_INFO*/ /* output most important parameters to the subdirectory "res/" */ #ifdef DEBUG_MODE_INFO /*#define DEBUG_MODE_ACELP*/ /* output most important ACELP core parameters to the subdirectory "res/" */ /*#define DEBUG_MODE_TCX*/ /* output most important TCX core parameters to the subdirectory "res/" */ diff --git a/lib_enc/ivas_ism_metadata_enc.c b/lib_enc/ivas_ism_metadata_enc.c index d3abf35904..b3e7b2e179 100644 --- a/lib_enc/ivas_ism_metadata_enc.c +++ b/lib_enc/ivas_ism_metadata_enc.c @@ -344,7 +344,7 @@ ivas_error ivas_ism_metadata_enc( /* write the ISM class to ISM_NO_META and again the true ISM class */ push_indice( hBstr, IND_ISM_METADATA_FLAG, ISM_NO_META, ISM_METADATA_FLAG_BITS ); - push_indice( hBstr, IND_ISM_NOISY_SPEECH_FLAG, ism_imp[ch], ISM_METADATA_FLAG_BITS ); + push_indice( hBstr, IND_ISM_MD_INACTIVE_FLAG, ism_imp[ch], ISM_METADATA_FLAG_BITS ); } else { -- GitLab From b9ac80685531b504c17bfc75467253db04c52174 Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 7 Jun 2023 15:11:12 +0200 Subject: [PATCH 6/6] fix low_rate_mode flag logic --- lib_dec/ivas_ism_metadata_dec.c | 2 +- lib_enc/ivas_ism_metadata_enc.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_dec/ivas_ism_metadata_dec.c b/lib_dec/ivas_ism_metadata_dec.c index 637a6ba697..0f54c699d6 100644 --- a/lib_dec/ivas_ism_metadata_dec.c +++ b/lib_dec/ivas_ism_metadata_dec.c @@ -542,7 +542,7 @@ ivas_error ivas_ism_metadata_dec( if ( ism_mode == ISM_MODE_DISC ) { #ifdef FIX_532_ISM_MD_INACTIVE - if ( total_brate[ch] == BRATE_ISM_INACTIVE ) + if ( ism_imp[ch] == ISM_NO_META ) #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 b3e7b2e179..518ba3353a 100644 --- a/lib_enc/ivas_ism_metadata_enc.c +++ b/lib_enc/ivas_ism_metadata_enc.c @@ -636,7 +636,7 @@ ivas_error ivas_ism_metadata_enc( if ( ism_mode == ISM_MODE_DISC ) { #ifdef FIX_532_ISM_MD_INACTIVE - if ( total_brate[ch] == BRATE_ISM_INACTIVE ) + if ( ism_imp[ch] == ISM_NO_META ) #else if ( hIsmMeta[ch]->ism_metadata_flag == 0 && vad_flag[ch] == 0 && ism_metadata_flag_global ) #endif -- GitLab