diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 27a361bdb883b290a922a0c0497db30246346099..5f22991fbfb4271788d62cf8bd69da98f68d0df5 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -327,7 +327,12 @@ 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 +#endif #define ISM_METADATA_FLAG_BITS 2 #define ISM_NO_META 0 @@ -381,6 +386,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 { @@ -397,8 +405,14 @@ 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_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, 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 a28fb77d20ed6fa9c379ac903dca440a83a46a23..bd064a584a3b91787faaf72f12631fb324873b8e 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,15 @@ 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 */ +#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 */ + 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 +132,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 +166,26 @@ ivas_error ivas_ism_config( for ( ch = 0; ch < n_ISms; ch++ ) { +#ifdef FIX_532_ISM_MD_INACTIVE + 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_INACTIVE_FLAG_BITS; + } + } +#else if ( hIsmMeta[ch]->ism_metadata_flag == 0 ) { nb_bits_metadata[0] += ISM_METADATA_VAD_FLAG_BITS; } +#endif } } @@ -175,7 +211,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 +252,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 +326,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 +380,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 b4759ee7208a8323918efd36d697c50d8db25f5d..9a3d5129a16ea2245fe94098797e454f63b9d814 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -873,7 +873,11 @@ 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 */ +#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 */ 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 4328602f5a105a9733328433e16ba0d3cba3fd38..3003d307c74034ffea03060da5e6c80fa8cf28cc 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -175,6 +175,8 @@ #define MASA_PREREND /* Nokia: Contribution 42: Support for IVAS_rend to merge MASA + other format to MASA */ +#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_metadata_dec.c b/lib_dec/ivas_ism_metadata_dec.c index a39c496ab6e3e0f4f7bd1d131a8ebdb559673073..0f54c699d6f737b44ec4cbe3ed758eb89618504a 100644 --- a/lib_dec/ivas_ism_metadata_dec.c +++ b/lib_dec/ivas_ism_metadata_dec.c @@ -168,7 +168,12 @@ 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 null_metadata_flag[MAX_NUM_OBJECTS]; + int16_t lowrate_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 +181,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 +192,10 @@ 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( null_metadata_flag, 0, nchan_ism ); + set_s( lowrate_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++ ) @@ -233,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 */ { @@ -249,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 ); @@ -272,6 +281,39 @@ ivas_error ivas_ism_metadata_dec( ism_metadata_flag_global |= hIsmMeta[ch]->ism_metadata_flag; } +#ifdef FIX_532_ISM_MD_INACTIVE + /* read 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 ) + { + /* 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 */ + 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 /* read VAD flag */ for ( ch = 0; ch < *nchan_transport; ch++ ) { @@ -284,6 +326,7 @@ ivas_error ivas_ism_metadata_dec( localVAD[ch] = 1; } } +#endif if ( ism_metadata_flag_global ) { @@ -310,7 +353,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 || lowrate_metadata_flag[ch] ) +#else if ( hIsmMeta[ch]->ism_metadata_flag ) +#endif { if ( non_diegetic_flag_global ) { @@ -478,7 +525,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, 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 { return error; } @@ -490,7 +541,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 ( ism_imp[ch] == ISM_NO_META ) +#else if ( hIsmMeta[ch]->ism_metadata_flag == 0 && localVAD[ch] == 0 && ism_metadata_flag_global ) +#endif { hSCE[ch]->hCoreCoder[0]->low_rate_mode = 1; } diff --git a/lib_enc/ivas_ism_enc.c b/lib_enc/ivas_ism_enc.c index 6c6a0c8837a378e879f6ac180d4291a546f7a51c..1175499b8266e73652a9334cb47da58ad4a4fa72 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_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 ) +#endif { return error; } diff --git a/lib_enc/ivas_ism_metadata_enc.c b/lib_enc/ivas_ism_metadata_enc.c index a8c4982e4b39bb22a706951690e3d69be4caef77..518ba3353a7474428b8190292fa26e0bcdafd4fc 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 lowrate_metadata_flag[MAX_NUM_OBJECTS], /* i : low-rate MD flag */ +#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 || lowrate_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,10 @@ 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 null_metadata_flag[MAX_NUM_OBJECTS]; + int16_t lowrate_metadata_flag[MAX_NUM_OBJECTS]; +#endif int16_t nbands, nblocks; ivas_error error; @@ -210,6 +221,10 @@ 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( null_metadata_flag, 0, nchan_ism ); + set_s( lowrate_metadata_flag, 0, nchan_ism ); +#endif /*----------------------------------------------------------------* * Set Metadata presence / importance flag @@ -223,22 +238,35 @@ 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 */ - 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 + lowrate_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 + lowrate_metadata_flag[ch] = 1; +#else hIsmMeta[ch]->ism_metadata_flag = 1; +#endif if ( hIsmMeta[ch]->ism_md_inc_diff_cnt % 2 == 0 ) { @@ -251,7 +279,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 + lowrate_metadata_flag[ch] = 1; +#else hIsmMeta[ch]->ism_metadata_flag = 1; +#endif hIsmMeta[ch]->position_angle.angle1_diff_cnt = ISM_FEC_MAX; } } @@ -263,8 +295,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, lowrate_metadata_flag, ism_imp ); +#else rate_ism_importance( nchan_transport, hIsmMeta, hSCE, ism_imp ); - +#endif /*----------------------------------------------------------------* * Write ISM common signaling @@ -280,6 +315,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 |= lowrate_metadata_flag[ch]; +#endif non_diegetic_flag_global |= hIsmMeta[ch]->non_diegetic_flag; } @@ -295,6 +333,35 @@ 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++ ) + { + if ( null_metadata_flag[ch] ) + { + /* signal NULL metadata frame */ + push_indice( hBstr, IND_ISM_MD_NULL_FLAG, 1, ISM_METADATA_MD_FLAG_BITS ); + + /* 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_MD_INACTIVE_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 ) + { + /* 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 /* write ISM metadata flag (one per object) */ for ( ch = 0; ch < nchan_transport; ch++ ) { @@ -309,16 +376,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 +405,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 || lowrate_metadata_flag[ch] ) +#else if ( hIsmMeta[ch]->ism_metadata_flag ) +#endif { /*----------------------------------------------------------------* * Quantize and encode azimuth and elevation @@ -532,7 +605,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, 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 { return error; } @@ -558,7 +635,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 ( ism_imp[ch] == ISM_NO_META ) +#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; } @@ -1064,11 +1145,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 )