diff --git a/lib_com/cnst.h b/lib_com/cnst.h index 8c986b363abb499b01f02f4bfdd211ff980e635a..df62d65d14e88e9555e77d4c97c23930f4c0323f 100644 --- a/lib_com/cnst.h +++ b/lib_com/cnst.h @@ -263,6 +263,9 @@ enum{ enum { IND_IVAS_FORMAT, +#ifdef FIX_OMASA_STEREO_SWITCHING + IND_SMODE_OMASA, +#endif IND_SMODE, IND_SID_TYPE, IND_BWIDTH, diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 1c155a48e25122c1b0afdd03ee776942ceb5ed65..be34fdb4773df02c9d70e63153835cc07f5d4243 100644 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -1221,10 +1221,17 @@ enum #define MASA_STEREO_MIN_BITRATE IVAS_24k4 #ifdef MASA_AND_OBJECTS #define MAXIMUM_OMASA_FREQ_BANDS 8 /* Corresponds to maximum number of coding bands at 32 kbps */ + +#ifdef FIX_OMASA_STEREO_SWITCHING +#define OMASA_STEREO_SW_CNT_MAX 100 +#define OMASA_STEREO_SW_CNT_MAX2 5 +#endif + #endif #define MASA_BIT_REDUCT_PARAM 10 -#define MASA_MAXIMUM_TWO_DIR_BANDS 18 +#define MASA_MAXIMUM_TWO_DIR_BANDS 18 + typedef enum { MASA_STEREO_NOT_DEFINED, diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index a3c2b820434f97009771f4c0ced0a68250d06080..21439160e05b08b483d92d3b9d72a75353af1aea 100755 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -837,6 +837,9 @@ ivas_error ivas_ism_metadata_enc( const int16_t ism_extended_metadata_flag /* i : Extended metadata flag */ #ifdef MASA_AND_OBJECTS ,const float lp_noise_CPE /* i : LP filterend total noise estimation */ +#ifdef FIX_OMASA_STEREO_SWITCHING + ,int16_t *omasa_stereo_sw_cnt +#endif #endif ); diff --git a/lib_com/options.h b/lib_com/options.h index e78be0744c399b8fc09ad351ee11c74712d831db..c23efa7568382f5d53303e92c4eab932ac5cdb9d 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/" */ @@ -179,6 +179,7 @@ #define MASA_AND_OBJECTS /* Nokia: Combination of MASA and objects */ #ifdef MASA_AND_OBJECTS #define MASAISM_EDIT_OBJECTS /* Nokia: Temporary command line editing of object directions in the decoder */ +#define FIX_OMASA_STEREO_SWITCHING // VA: introduce Unified/MDCT stereo switching for 3ISM @96 kbps and 4ISM @128 kbps #endif diff --git a/lib_dec/ivas_cpe_dec.c b/lib_dec/ivas_cpe_dec.c index 9667995683fa7c0f417b5319ba067df960897a41..714149b9aaa063e26faf7c9303fb41e3748c5538 100644 --- a/lib_dec/ivas_cpe_dec.c +++ b/lib_dec/ivas_cpe_dec.c @@ -79,6 +79,9 @@ ivas_error ivas_cpe_dec( ivas_error error; #ifdef MASA_AND_OBJECTS int32_t cpe_brate; +#ifdef FIX_OMASA_STEREO_SWITCHING + int32_t element_brate_ref; +#endif #endif error = IVAS_ERR_OK; @@ -95,10 +98,40 @@ ivas_error ivas_cpe_dec( sts[0]->BER_detect |= st_ivas->BER_detect; sts[1]->BER_detect |= st_ivas->BER_detect; +#ifdef FIX_OMASA_STEREO_SWITCHING + element_brate_ref = hCPE->element_brate; +#endif + /*------------------------------------------------------------------* * Read stereo technology info & audio bandwidth *-----------------------------------------------------------------*/ +#ifdef FIX_OMASA_STEREO_SWITCHING + if ( st_ivas->ivas_format == MASA_ISM_FORMAT ) + { + if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC && + ( ( st_ivas->nchan_ism == 3 && ivas_total_brate == IVAS_96k ) || + ( st_ivas->nchan_ism == 4 && ivas_total_brate == IVAS_128k ) ) ) + { + /* read OMASA stereo mode signalling */ + if ( get_next_indice( sts[0], NBITS_ELEMENT_MODE ) ) + { + hCPE->element_mode = IVAS_CPE_MDCT; + } + else + { + hCPE->element_mode = IVAS_CPE_DFT; + } + + if ( hCPE->element_mode == IVAS_CPE_MDCT ) + { + hCPE->element_brate = IVAS_64k; + hCPE->brate_surplus -= ( hCPE->element_brate - element_brate_ref ); + } + } + } +#endif + read_stereo_mode_and_bwidth( hCPE, st_ivas ); /*----------------------------------------------------------------* @@ -551,6 +584,13 @@ ivas_error ivas_cpe_dec( hCPE->last_element_brate = hCPE->element_brate; hCPE->last_element_mode = hCPE->element_mode; +#ifdef FIX_OMASA_STEREO_SWITCHING + if ( st_ivas->ivas_format == MASA_ISM_FORMAT ) + { + hCPE->element_brate = element_brate_ref; + } +#endif + if ( hCPE->element_mode == IVAS_CPE_DFT || hCPE->element_mode == IVAS_CPE_TD ) { stereo_cng_dec_update( hCPE, ivas_total_brate ); diff --git a/lib_enc/ivas_cpe_enc.c b/lib_enc/ivas_cpe_enc.c index 5c13e032e8d2d4bde0659922fa74736d2df98941..c6b33d75397f4fe7cbb256b33e47c828f305401b 100644 --- a/lib_enc/ivas_cpe_enc.c +++ b/lib_enc/ivas_cpe_enc.c @@ -103,6 +103,10 @@ ivas_error ivas_cpe_enc( ivas_error error; #ifdef MASA_AND_OBJECTS int32_t cpe_brate; +#ifdef FIX_OMASA_STEREO_SWITCHING + int32_t element_brate_ref; + int16_t element_mode_ref; +#endif #endif error = IVAS_ERR_OK; @@ -117,6 +121,10 @@ ivas_error ivas_cpe_enc( ivas_format = hEncoderConfig->ivas_format; input_Fs = hEncoderConfig->input_Fs; ivas_total_brate = hEncoderConfig->ivas_total_brate; +#ifdef FIX_OMASA_STEREO_SWITCHING + element_brate_ref = hCPE->element_brate; + element_mode_ref = hCPE->element_mode; +#endif /*------------------------------------------------------------------* * Initialization - general @@ -172,6 +180,43 @@ ivas_error ivas_cpe_enc( hCPE->element_mode = select_stereo_mode( hCPE, ivas_format, ivas_total_brate ); } +#ifdef FIX_OMASA_STEREO_SWITCHING + if ( ivas_format == MASA_ISM_FORMAT ) + { + if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC && + ( ( hEncoderConfig->nchan_ism == 3 && ivas_total_brate == IVAS_96k ) || + ( hEncoderConfig->nchan_ism == 4 && ivas_total_brate == IVAS_128k ) ) ) + { + if ( hCPE->element_brate + hCPE->brate_surplus > IVAS_64k ) + { + st_ivas->hMasa->data.omasa_stereo_sw_cnt = 0; + } + else + { + st_ivas->hMasa->data.omasa_stereo_sw_cnt++; + st_ivas->hMasa->data.omasa_stereo_sw_cnt = min( st_ivas->hMasa->data.omasa_stereo_sw_cnt, OMASA_STEREO_SW_CNT_MAX ); + } + + if ( st_ivas->hMasa->data.omasa_stereo_sw_cnt < OMASA_STEREO_SW_CNT_MAX ) + { + hCPE->element_mode = IVAS_CPE_MDCT; + hCPE->element_brate = IVAS_64k; + hCPE->brate_surplus -= ( hCPE->element_brate - element_brate_ref ); + } + + /* write OMASA stereo mode signalling */ + if ( hCPE->element_mode == IVAS_CPE_MDCT ) + { + push_indice( hCPE->hCoreCoder[0]->hBstr, IND_SMODE_OMASA, 1, NBITS_ELEMENT_MODE ); + } + else + { + push_indice( hCPE->hCoreCoder[0]->hBstr, IND_SMODE_OMASA, 0, NBITS_ELEMENT_MODE ); + } + } + } +#endif + if ( ( error = front_vad( hCPE, NULL, hEncoderConfig, &hCPE->hFrontVad[0], st_ivas->hMCT != NULL, input_frame, vad_flag_dtx, fr_bands, Etot_LR, lf_E, localVAD_HE_SAD, vad_hover_flag, band_energies_LR, NULL, NULL ) ) != IVAS_ERR_OK ) { return error; @@ -197,6 +242,7 @@ ivas_error ivas_cpe_enc( return error; } + /*----------------------------------------------------------------* * Set TD stereo parameters *----------------------------------------------------------------*/ @@ -728,6 +774,14 @@ ivas_error ivas_cpe_enc( hCPE->last_element_brate = hCPE->element_brate; hCPE->last_element_mode = hCPE->element_mode; +#ifdef FIX_OMASA_STEREO_SWITCHING + if ( ivas_format == MASA_ISM_FORMAT ) + { + hCPE->element_brate = element_brate_ref; + } +#endif + + if ( hCPE->element_mode == IVAS_CPE_MDCT && hCPE->hStereoMdct != NULL && hCPE->hStereoMdct->hItd != NULL ) { /* update input samples buffer */ diff --git a/lib_enc/ivas_ism_enc.c b/lib_enc/ivas_ism_enc.c index b560d04f4db3db89fc1ea264ccc9f1586a30c8b5..35de64ab2658e14f88d0643c915aa15f1d40c1ac 100644 --- a/lib_enc/ivas_ism_enc.c +++ b/lib_enc/ivas_ism_enc.c @@ -245,7 +245,12 @@ ivas_error ivas_ism_enc( { #ifdef MASA_AND_OBJECTS ivas_ism_metadata_enc( &st_ivas->hEncoderConfig->ivas_total_brate, nchan_ism, nchan_transport_ism, st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData, - nb_bits_metadata, vad_flag, st_ivas->ism_mode, st_ivas->hDirAC->hParamIsm, st_ivas->hEncoderConfig->ism_extended_metadata_flag, -1 ); + nb_bits_metadata, vad_flag, st_ivas->ism_mode, st_ivas->hDirAC->hParamIsm, st_ivas->hEncoderConfig->ism_extended_metadata_flag, -1 +#ifdef FIX_OMASA_STEREO_SWITCHING + , + NULL +#endif + ); #else ivas_ism_metadata_enc( st_ivas->hEncoderConfig->ivas_total_brate, nchan_ism, st_ivas->nchan_transport, st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData, nb_bits_metadata, vad_flag, st_ivas->ism_mode, st_ivas->hDirAC->hParamIsm, st_ivas->hEncoderConfig->ism_extended_metadata_flag ); #endif @@ -269,7 +274,12 @@ ivas_error ivas_ism_enc( ism_total_brate_ref = ism_total_brate; ivas_ism_metadata_enc( &ism_total_brate, nchan_ism, nchan_transport_ism, st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData, - nb_bits_metadata, vad_flag, st_ivas->ism_mode, NULL, st_ivas->hEncoderConfig->ism_extended_metadata_flag, st_ivas->hMasa != NULL ? st_ivas->hMasa->data.lp_noise_CPE : 0 ); + nb_bits_metadata, vad_flag, st_ivas->ism_mode, NULL, st_ivas->hEncoderConfig->ism_extended_metadata_flag, st_ivas->hMasa != NULL ? st_ivas->hMasa->data.lp_noise_CPE : 0 +#ifdef FIX_OMASA_STEREO_SWITCHING + , + st_ivas->hMasa != NULL ? &( st_ivas->hMasa->data.omasa_stereo_sw_cnt ) : NULL +#endif + ); if ( st_ivas->hEncoderConfig->ivas_format == MASA_ISM_FORMAT ) { diff --git a/lib_enc/ivas_ism_metadata_enc.c b/lib_enc/ivas_ism_metadata_enc.c index b4c5f01dcb9877d812f9e4d68f22a40fc2aaa323..2fcffbb3588780a40cdd2fc1cbcb32d0c9c5d984 100644 --- a/lib_enc/ivas_ism_metadata_enc.c +++ b/lib_enc/ivas_ism_metadata_enc.c @@ -185,6 +185,10 @@ ivas_error ivas_ism_metadata_enc( #ifdef MASA_AND_OBJECTS , const float lp_noise_CPE +#ifdef FIX_OMASA_STEREO_SWITCHING + , + int16_t *omasa_stereo_sw_cnt +#endif #endif ) { @@ -583,7 +587,6 @@ ivas_error ivas_ism_metadata_enc( *----------------------------------------------------------------*/ if ( ism_mode == ISM_MASA_MODE_DISC || ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) - { int16_t bits_ism, bits_element[MAX_NUM_OBJECTS]; int16_t brate_limit_flag; @@ -601,6 +604,22 @@ ivas_error ivas_ism_metadata_enc( *ism_total_brate += ivas_interformat_brate( ism_mode, nchan_ism, hSCE[ch]->element_brate, ism_imp[ch], brate_limit_flag ); } ism_metadata_flag_global = 1; + +#ifdef FIX_OMASA_STEREO_SWITCHING + if ( ism_mode == ISM_MASA_MODE_DISC ) + { + brate_limit_flag = 0; + for ( int16_t n = 0; n < nchan_ism; n++ ) + { + brate_limit_flag += ism_imp[n]; + } + + if ( brate_limit_flag >= nchan_ism * ISM_HIGH_IMP - 2 ) + { + *omasa_stereo_sw_cnt = OMASA_STEREO_SW_CNT_MAX; + } + } +#endif } #endif diff --git a/lib_enc/ivas_masa_enc.c b/lib_enc/ivas_masa_enc.c index e12251abf7a15aad379aee8b7c79091f47747c13..048adbe2dc4fc56e07462e6957c54996cc5396c8 100644 --- a/lib_enc/ivas_masa_enc.c +++ b/lib_enc/ivas_masa_enc.c @@ -185,6 +185,10 @@ ivas_error ivas_masa_enc_open( #ifdef MASA_AND_OBJECTS hMasa->data.lp_noise_CPE = -1; +#ifdef FIX_OMASA_STEREO_SWITCHING + hMasa->data.omasa_stereo_sw_cnt = OMASA_STEREO_SW_CNT_MAX; + hMasa->data.omasa_stereo_sw_cnt2 = OMASA_STEREO_SW_CNT_MAX2; +#endif #endif st_ivas->hMasa = hMasa; @@ -795,7 +799,12 @@ ivas_error ivas_masa_enc_config( #ifdef MASA_AND_OBJECTS if ( ivas_format == MASA_ISM_FORMAT && ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_DISC ) ) { +#ifdef FIX_OMASA_STEREO_SWITCHING + if ( st_ivas->hCPE[0]->element_mode == IVAS_CPE_DFT || st_ivas->hMasa->data.omasa_stereo_sw_cnt < OMASA_STEREO_SW_CNT_MAX ) +#else + if ( st_ivas->hCPE[0]->element_mode == IVAS_CPE_DFT ) +#endif { st_ivas->hMasa->data.lp_noise_CPE = st_ivas->hCPE[0]->hCoreCoder[0]->lp_noise; } diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index 5927114b2fe2fe266941d6b65fb07a56466c17c1..67345ab8c9b18050bfe2f8512b0d7e64ca5a8207 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -750,7 +750,11 @@ typedef struct ivas_masa_encoder_data_struct float energy_ratio_ism[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS]; float q_energy_ratio_ism[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS]; int16_t nchan_ism; - float lp_noise_CPE; /* LP filterend total noise estimation */ + float lp_noise_CPE; /* LP filtered total noise estimation */ +#ifdef FIX_OMASA_STEREO_SWITCHING + int16_t omasa_stereo_sw_cnt; + int16_t omasa_stereo_sw_cnt2; +#endif #endif int16_t num_Cldfb_instances;