From d0f9e9d6dea56de18122ba2f1fec1f54bf50321c Mon Sep 17 00:00:00 2001 From: advasila Date: Mon, 18 Dec 2023 15:57:50 +0200 Subject: [PATCH 1/5] fix issue 944 --- lib_com/ivas_prot.h | 12 +++++++++ lib_com/options.h | 2 ++ lib_enc/ivas_enc.c | 47 ++++++++++++++++++++++++++++----- lib_enc/ivas_ism_enc.c | 18 +++++++++++-- lib_enc/ivas_ism_metadata_enc.c | 45 +++++++++++++++++++++++++++---- lib_enc/ivas_omasa_enc.c | 28 ++++++++++++++++++-- lib_enc/ivas_stat_enc.h | 3 +++ 7 files changed, 139 insertions(+), 16 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 72d0ff2683..1274593aa2 100755 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -990,6 +990,10 @@ ivas_error ivas_ism_enc( const int16_t input_frame, /* i : input frame length per channel */ int16_t *nb_bits_metadata, /* i : number of metadata bits */ const int16_t flag_omasa_ener_brate /* i : less bitrate for objects in OMASA flag */ +#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA + , + int16_t changed_object /* i : tells if the separated object changed in OMASA */ +#endif ); ivas_error ivas_ism_metadata_enc( @@ -1008,6 +1012,10 @@ ivas_error ivas_ism_metadata_enc( const int16_t flag_omasa_ener_brate, /* i : less bitrate for objects in OMASA flag */ int16_t *omasa_stereo_sw_cnt, const int16_t ini_frame +#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA + , + int16_t changed_object /* i : tells if the separated object has changed */ +#endif ); ivas_error ivas_ism_metadata_dec( @@ -5702,6 +5710,10 @@ void ivas_omasa_enc( const ISM_MODE ism_mode, /* i : ISM mode */ float *data_separated_object, /* o : Separated object audio signal */ int16_t* idx_separated_object /* o : Index of the separated object */ +#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA + , + int16_t * changed_object /* o : signals if separated object has changed */ +#endif ); void ivas_set_surplus_brate_enc( diff --git a/lib_com/options.h b/lib_com/options.h index ee1d1b1559..1da11147c8 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -166,6 +166,8 @@ #define NONBE_FIX_869_MASA_PREREND_MERGE /* Nokia: issue: #869: MASA pre-rend not updating energy */ #define NONBE_FIX_931_IGF_STEREO_DEC_NOISE /* FhG: issue #931: fix noise substitution in the stereo IGF decoder */ +#define NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA /* Nokia: issue 944: fix FEC error in OMASA */ + /* ##################### End NON-BE switches ########################### */ /* ################## End DEVELOPMENT switches ######################### */ diff --git a/lib_enc/ivas_enc.c b/lib_enc/ivas_enc.c index c52a722c20..2ee8e21a1c 100644 --- a/lib_enc/ivas_enc.c +++ b/lib_enc/ivas_enc.c @@ -196,7 +196,12 @@ ivas_error ivas_enc( ivas_param_ism_stereo_dmx( st_ivas, data_f, input_frame ); /* Core coding of Stereo DMX */ - if ( ( error = ivas_ism_enc( st_ivas, data_f, input_frame, nb_bits_metadata, 0 ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_ism_enc( st_ivas, data_f, input_frame, nb_bits_metadata, 0 +#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA + , + 0 +#endif + ) ) != IVAS_ERR_OK ) { return error; } @@ -204,7 +209,12 @@ ivas_error ivas_enc( else if ( st_ivas->ism_mode == ISM_MODE_DISC ) { /* Analysis, decision about bitrates per channel & core coding */ - if ( ( error = ivas_ism_enc( st_ivas, data_f, input_frame, nb_bits_metadata, 0 ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_ism_enc( st_ivas, data_f, input_frame, nb_bits_metadata, 0 +#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA + , + 0 +#endif + ) ) != IVAS_ERR_OK ) { return error; } @@ -275,9 +285,12 @@ ivas_error ivas_enc( else if ( ivas_format == MASA_ISM_FORMAT ) { float *data_separated_object; - int16_t idx_separated_object; int16_t flag_omasa_ener_brate; +#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA + int16_t force_absolute_coding; + force_absolute_coding = 0; +#endif flag_omasa_ener_brate = 0; @@ -305,7 +318,12 @@ ivas_error ivas_enc( if ( st_ivas->ism_mode != ISM_MASA_MODE_DISC ) { /* Estimate MASA parameters for the objects */ - ivas_omasa_enc( st_ivas->hOMasa, st_ivas->hMasa, st_ivas->hIsmMetaData, data_f, input_frame, st_ivas->nchan_transport, hEncoderConfig->nchan_ism, st_ivas->ism_mode, data_separated_object, &idx_separated_object ); + ivas_omasa_enc( st_ivas->hOMasa, st_ivas->hMasa, st_ivas->hIsmMetaData, data_f, input_frame, st_ivas->nchan_transport, hEncoderConfig->nchan_ism, st_ivas->ism_mode, data_separated_object, &idx_separated_object +#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA + , + &force_absolute_coding +#endif + ); } /* Encode ISMs transport channels */ @@ -319,7 +337,12 @@ ivas_error ivas_enc( } else if ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) { - if ( ( error = ivas_ism_enc( st_ivas, &data_separated_object, input_frame, &nb_bits_metadata[1], 0 ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_ism_enc( st_ivas, &data_separated_object, input_frame, &nb_bits_metadata[1], 0 +#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA + , + force_absolute_coding +#endif + ) ) != IVAS_ERR_OK ) { return error; } @@ -329,7 +352,12 @@ ivas_error ivas_enc( flag_omasa_ener_brate = ivas_omasa_ener_brate( st_ivas->hEncoderConfig->nchan_ism, ivas_total_brate, data_f, input_frame ); /* Analysis, decision about bitrates per channel & core coding */ - if ( ( error = ivas_ism_enc( st_ivas, data_f, input_frame, &nb_bits_metadata[1], flag_omasa_ener_brate ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_ism_enc( st_ivas, data_f, input_frame, &nb_bits_metadata[1], flag_omasa_ener_brate +#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA + , + 0 +#endif + ) ) != IVAS_ERR_OK ) { return error; } @@ -399,7 +427,12 @@ ivas_error ivas_enc( n = hEncoderConfig->nchan_ism; hMetaData = st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData; - if ( ( error = ivas_ism_metadata_enc( &st_ivas->hEncoderConfig->ivas_total_brate, n, st_ivas->hEncoderConfig->nchan_ism, st_ivas->hIsmMetaData, NULL, hMetaData, &nb_bits_metadata[1], 0, st_ivas->ism_mode, NULL, st_ivas->hEncoderConfig->ism_extended_metadata_flag, -1, 0, NULL, st_ivas->hCPE[0]->hCoreCoder[0]->ini_frame ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_ism_metadata_enc( &st_ivas->hEncoderConfig->ivas_total_brate, n, st_ivas->hEncoderConfig->nchan_ism, st_ivas->hIsmMetaData, NULL, hMetaData, &nb_bits_metadata[1], 0, st_ivas->ism_mode, NULL, st_ivas->hEncoderConfig->ism_extended_metadata_flag, -1, 0, NULL, st_ivas->hCPE[0]->hCoreCoder[0]->ini_frame +#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA + , + 0 +#endif + ) ) != IVAS_ERR_OK ) { return error; } diff --git a/lib_enc/ivas_ism_enc.c b/lib_enc/ivas_ism_enc.c index db689cc9f1..cc8718642e 100644 --- a/lib_enc/ivas_ism_enc.c +++ b/lib_enc/ivas_ism_enc.c @@ -54,6 +54,10 @@ ivas_error ivas_ism_enc( const int16_t input_frame, /* i : input frame length per channel */ int16_t *nb_bits_metadata, /* i : number of metadata bits */ const int16_t flag_omasa_ener_brate /* i : less bitrate for objects in OMASA flag */ +#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA + , + int16_t force_absolute_coding +#endif ) { SCE_ENC_HANDLE hSCE; @@ -236,7 +240,12 @@ ivas_error ivas_ism_enc( else if ( st_ivas->ism_mode == ISM_MODE_PARAM ) { if ( ( error = 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->hParamIsm, st_ivas->hEncoderConfig->ism_extended_metadata_flag, -1, 0, NULL, st_ivas->hSCE[0]->hCoreCoder[0]->ini_frame ) ) != IVAS_ERR_OK ) + nb_bits_metadata, vad_flag, st_ivas->ism_mode, st_ivas->hParamIsm, st_ivas->hEncoderConfig->ism_extended_metadata_flag, -1, 0, NULL, st_ivas->hSCE[0]->hCoreCoder[0]->ini_frame +#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA + , + 0 +#endif + ) ) != IVAS_ERR_OK ) { return error; } @@ -259,7 +268,12 @@ ivas_error ivas_ism_enc( ism_total_brate_ref = ism_total_brate; if ( ( error = 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.hOmasaData->lp_noise_CPE : 0, flag_omasa_ener_brate, st_ivas->hMasa != NULL ? &( st_ivas->hMasa->data.hOmasaData->omasa_stereo_sw_cnt ) : NULL, st_ivas->hSCE[0]->hCoreCoder[0]->ini_frame ) ) != IVAS_ERR_OK ) + 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.hOmasaData->lp_noise_CPE : 0, flag_omasa_ener_brate, st_ivas->hMasa != NULL ? &( st_ivas->hMasa->data.hOmasaData->omasa_stereo_sw_cnt ) : NULL, st_ivas->hSCE[0]->hCoreCoder[0]->ini_frame +#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA + , + force_absolute_coding +#endif + ) ) != IVAS_ERR_OK ) { return error; } diff --git a/lib_enc/ivas_ism_metadata_enc.c b/lib_enc/ivas_ism_metadata_enc.c index 849b7957ae..176a0c49d9 100644 --- a/lib_enc/ivas_ism_metadata_enc.c +++ b/lib_enc/ivas_ism_metadata_enc.c @@ -67,7 +67,12 @@ * Local function declarations *-----------------------------------------------------------------------*/ -static void encode_angle_indices( BSTR_ENC_HANDLE hBstr, ISM_METADATA_ANGLE_HANDLE angle, const int16_t last_ism_metadata_flag, const int16_t ini_frame, const int16_t idx_angle1_abs, const int16_t idx_angle2_abs, int16_t *flag_abs_angle1, int16_t *flag_abs_angle2 ); +static void encode_angle_indices( BSTR_ENC_HANDLE hBstr, ISM_METADATA_ANGLE_HANDLE angle, const int16_t last_ism_metadata_flag, const int16_t ini_frame, const int16_t idx_angle1_abs, const int16_t idx_angle2_abs, int16_t *flag_abs_angle1, int16_t *flag_abs_angle2 +#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA + , + int16_t changed_object +#endif +); static void encode_radius( BSTR_ENC_HANDLE hBstr, int16_t *last_radius_idx, int16_t *radius_diff_cnt, const int16_t last_ism_metadata_flag, const int16_t idx_radius_abs, int16_t *flag_abs_radius ); @@ -182,7 +187,12 @@ ivas_error ivas_ism_metadata_enc( const float lp_noise_CPE, const int16_t flag_omasa_ener_brate, /* i : less bitrate for objects in OMASA flag */ int16_t *omasa_stereo_sw_cnt, - const int16_t ini_frame ) + const int16_t ini_frame +#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA + , + int16_t changed_object /* i : tells if the separated object has changed */ +#endif +) { int16_t i, ch, nb_bits_start = 0; int16_t flag_abs_azimuth[MAX_NUM_OBJECTS]; @@ -429,7 +439,12 @@ ivas_error ivas_ism_metadata_enc( } idx_angle1_abs = ism_quant_meta( hIsmMetaData->azimuth, &valQ, ism_azimuth_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_AZIMUTH_NBITS ); - encode_angle_indices( hBstr, &( hIsmMetaData->position_angle ), hIsmMetaData->last_ism_metadata_flag, hSCE[0]->hCoreCoder[0]->ini_frame, idx_angle1_abs, 0, &flag_abs_azimuth[ch], NULL ); + encode_angle_indices( hBstr, &( hIsmMetaData->position_angle ), hIsmMetaData->last_ism_metadata_flag, hSCE[0]->hCoreCoder[0]->ini_frame, idx_angle1_abs, 0, &flag_abs_azimuth[ch], NULL +#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA + , + changed_object +#endif + ); } else { @@ -443,7 +458,12 @@ ivas_error ivas_ism_metadata_enc( idx_angle1_abs = hParamIsm->azi_index[ch]; idx_angle2_abs = hParamIsm->ele_index[ch]; } - encode_angle_indices( hBstr, &( hIsmMetaData->position_angle ), hIsmMetaData->last_ism_metadata_flag, ini_frame, idx_angle1_abs, idx_angle2_abs, &flag_abs_azimuth[ch], &flag_abs_elevation[ch] ); + encode_angle_indices( hBstr, &( hIsmMetaData->position_angle ), hIsmMetaData->last_ism_metadata_flag, ini_frame, idx_angle1_abs, idx_angle2_abs, &flag_abs_azimuth[ch], &flag_abs_elevation[ch] +#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA + , + changed_object +#endif + ); /*----------------------------------------------------------------* * Quantize and encode radius, yaw, and pitch @@ -454,7 +474,12 @@ ivas_error ivas_ism_metadata_enc( idx_angle2_abs = ism_quant_meta( hIsmMetaData->pitch, &valQ, ism_elevation_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_ELEVATION_NBITS ); idx_radius_abs = usquant( hIsmMetaData->radius, &valQ, ISM_RADIUS_MIN, ISM_RADIUS_DELTA, 1 << ISM_RADIUS_NBITS ); - encode_angle_indices( hBstr, &( hIsmMetaData->orientation_angle ), hIsmMetaData->last_ism_metadata_flag, ini_frame, idx_angle1_abs, idx_angle2_abs, &flag_abs_yaw[ch], &flag_abs_pitch[ch] ); + encode_angle_indices( hBstr, &( hIsmMetaData->orientation_angle ), hIsmMetaData->last_ism_metadata_flag, ini_frame, idx_angle1_abs, idx_angle2_abs, &flag_abs_yaw[ch], &flag_abs_pitch[ch] +#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA + , + changed_object +#endif + ); encode_radius( hBstr, &hIsmMetaData->last_radius_idx, &hIsmMetaData->radius_diff_cnt, hIsmMetaData->last_ism_metadata_flag, idx_radius_abs, &flag_abs_radius[ch] ); } } @@ -984,6 +1009,10 @@ static void encode_angle_indices( const int16_t idx_angle2_abs, /* i : Elevation index */ int16_t *flag_abs_angle1, /* o : Azimuth/yaw encoding mode */ int16_t *flag_abs_angle2 /* o : Elevation/pitch encoding mode */ +#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA + , + int16_t changed_object /* i : tells if separated object has changed in OMASA */ +#endif ) { int16_t idx_angle1, nbits_diff_angle1, diff; @@ -1000,6 +1029,9 @@ static void encode_angle_indices( *flag_abs_angle1 = 0; /* differential coding by default */ if ( angle->angle1_diff_cnt == ISM_FEC_MAX /* make differential encoding in ISM_FEC_MAX consecutive frames at maximum (in order to control the decoding in FEC) */ || last_ism_metadata_flag == 0 /* If last frame had no metadata coded, do not use differential coding */ +#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA + || changed_object +#endif ) { *flag_abs_angle1 = 1; @@ -1097,6 +1129,9 @@ static void encode_angle_indices( *flag_abs_angle2 = 0; /* differential coding by default */ if ( angle->angle2_diff_cnt == ISM_FEC_MAX /* make differential encoding in ISM_FEC_MAX consecutive frames at maximum (in order to control the decoding in FEC) */ || last_ism_metadata_flag == 0 /* If last frame had no metadata coded, do not use differential coding */ +#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA + || changed_object +#endif ) { *flag_abs_angle2 = 1; diff --git a/lib_enc/ivas_omasa_enc.c b/lib_enc/ivas_omasa_enc.c index 8f0cf13487..4362442f95 100644 --- a/lib_enc/ivas_omasa_enc.c +++ b/lib_enc/ivas_omasa_enc.c @@ -43,7 +43,9 @@ #include "debug.h" #endif #include "wmc_auto.h" - +#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA +#define OMASA_FEC_MAX 21 +#endif /*------------------------------------------------------------------------- * Local function prototypes @@ -393,11 +395,17 @@ void ivas_omasa_enc( const ISM_MODE ism_mode, /* i : ISM mode */ float *data_separated_object, /* o : Separated object audio signal */ int16_t *idx_separated_object /* o : Index of the separated object */ +#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA + , + int16_t *force_absolute_coding /* o : tells if the separated object has changed */ +#endif ) { int16_t i, j; float data_out_f[MASA_MAX_TRANSPORT_CHANNELS][L_FRAME48k]; - +#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA + *force_absolute_coding = 0; +#endif /* Determine separated object (when applicable) */ if ( ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) { @@ -495,6 +503,22 @@ void ivas_omasa_enc( { hOMasa->broadband_energy_prev[i] = broadband_energy[i]; } +#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA + if ( hOMasa->prev_selected_object != selected_object ) + { + *force_absolute_coding = 1; + hOMasa->since_obj_change_cnt = 0; + } + else + { + hOMasa->since_obj_change_cnt++; + hOMasa->since_obj_change_cnt = min( OMASA_FEC_MAX, hOMasa->since_obj_change_cnt ); + if ( hOMasa->since_obj_change_cnt < OMASA_FEC_MAX ) + { + *force_absolute_coding = 1; + } + } +#endif hOMasa->prev_selected_object = selected_object; /* Separate the selected object */ diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index 6725d778b0..181fe5316b 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -788,6 +788,9 @@ typedef struct ivas_omasa_enc_state_structure float broadband_energy_prev[MAX_NUM_OBJECTS + MASA_MAX_TRANSPORT_CHANNELS]; int16_t prev_selected_object; uint8_t changing_object; +#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA + int16_t since_obj_change_cnt; +#endif float fade_out_gain[L_FRAME48k]; float fade_in_gain[L_FRAME48k]; -- GitLab From 70525a5a770be428682f281df58f6d62137c9c03 Mon Sep 17 00:00:00 2001 From: vaclav Date: Tue, 2 Jan 2024 18:35:18 +0100 Subject: [PATCH 2/5] simplification within NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA --- lib_com/ivas_cnst.h | 4 +++ lib_com/ivas_prot.h | 12 -------- lib_enc/ivas_enc.c | 46 ++++------------------------- lib_enc/ivas_ism_enc.c | 18 ++---------- lib_enc/ivas_ism_metadata_enc.c | 51 +++++++-------------------------- lib_enc/ivas_omasa_enc.c | 23 +++++++++------ 6 files changed, 36 insertions(+), 118 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 3c6a93dd59..6787571189 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -328,6 +328,10 @@ typedef enum #define ISM_Q_STEP 2.5f #define ISM_Q_STEP_BORDER 5.0f +#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA +#define ISM_FEC_MAX 10 +#endif + #define ISM_RADIUS_NBITS 6 #define ISM_RADIUS_MIN 0.0f #define ISM_RADIUS_DELTA 0.25f /* Max radius = (2^ISM_RADIUS_NBITS-1)*0.25 = 15.75 */ diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 1274593aa2..72d0ff2683 100755 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -990,10 +990,6 @@ ivas_error ivas_ism_enc( const int16_t input_frame, /* i : input frame length per channel */ int16_t *nb_bits_metadata, /* i : number of metadata bits */ const int16_t flag_omasa_ener_brate /* i : less bitrate for objects in OMASA flag */ -#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA - , - int16_t changed_object /* i : tells if the separated object changed in OMASA */ -#endif ); ivas_error ivas_ism_metadata_enc( @@ -1012,10 +1008,6 @@ ivas_error ivas_ism_metadata_enc( const int16_t flag_omasa_ener_brate, /* i : less bitrate for objects in OMASA flag */ int16_t *omasa_stereo_sw_cnt, const int16_t ini_frame -#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA - , - int16_t changed_object /* i : tells if the separated object has changed */ -#endif ); ivas_error ivas_ism_metadata_dec( @@ -5710,10 +5702,6 @@ void ivas_omasa_enc( const ISM_MODE ism_mode, /* i : ISM mode */ float *data_separated_object, /* o : Separated object audio signal */ int16_t* idx_separated_object /* o : Index of the separated object */ -#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA - , - int16_t * changed_object /* o : signals if separated object has changed */ -#endif ); void ivas_set_surplus_brate_enc( diff --git a/lib_enc/ivas_enc.c b/lib_enc/ivas_enc.c index 2ee8e21a1c..e2a61aa461 100644 --- a/lib_enc/ivas_enc.c +++ b/lib_enc/ivas_enc.c @@ -196,12 +196,7 @@ ivas_error ivas_enc( ivas_param_ism_stereo_dmx( st_ivas, data_f, input_frame ); /* Core coding of Stereo DMX */ - if ( ( error = ivas_ism_enc( st_ivas, data_f, input_frame, nb_bits_metadata, 0 -#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA - , - 0 -#endif - ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_ism_enc( st_ivas, data_f, input_frame, nb_bits_metadata, 0 ) ) != IVAS_ERR_OK ) { return error; } @@ -209,12 +204,7 @@ ivas_error ivas_enc( else if ( st_ivas->ism_mode == ISM_MODE_DISC ) { /* Analysis, decision about bitrates per channel & core coding */ - if ( ( error = ivas_ism_enc( st_ivas, data_f, input_frame, nb_bits_metadata, 0 -#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA - , - 0 -#endif - ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_ism_enc( st_ivas, data_f, input_frame, nb_bits_metadata, 0 ) ) != IVAS_ERR_OK ) { return error; } @@ -287,10 +277,6 @@ ivas_error ivas_enc( float *data_separated_object; int16_t idx_separated_object; int16_t flag_omasa_ener_brate; -#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA - int16_t force_absolute_coding; - force_absolute_coding = 0; -#endif flag_omasa_ener_brate = 0; @@ -318,12 +304,7 @@ ivas_error ivas_enc( if ( st_ivas->ism_mode != ISM_MASA_MODE_DISC ) { /* Estimate MASA parameters for the objects */ - ivas_omasa_enc( st_ivas->hOMasa, st_ivas->hMasa, st_ivas->hIsmMetaData, data_f, input_frame, st_ivas->nchan_transport, hEncoderConfig->nchan_ism, st_ivas->ism_mode, data_separated_object, &idx_separated_object -#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA - , - &force_absolute_coding -#endif - ); + ivas_omasa_enc( st_ivas->hOMasa, st_ivas->hMasa, st_ivas->hIsmMetaData, data_f, input_frame, st_ivas->nchan_transport, hEncoderConfig->nchan_ism, st_ivas->ism_mode, data_separated_object, &idx_separated_object ); } /* Encode ISMs transport channels */ @@ -337,12 +318,7 @@ ivas_error ivas_enc( } else if ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) { - if ( ( error = ivas_ism_enc( st_ivas, &data_separated_object, input_frame, &nb_bits_metadata[1], 0 -#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA - , - force_absolute_coding -#endif - ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_ism_enc( st_ivas, &data_separated_object, input_frame, &nb_bits_metadata[1], 0 ) ) != IVAS_ERR_OK ) { return error; } @@ -352,12 +328,7 @@ ivas_error ivas_enc( flag_omasa_ener_brate = ivas_omasa_ener_brate( st_ivas->hEncoderConfig->nchan_ism, ivas_total_brate, data_f, input_frame ); /* Analysis, decision about bitrates per channel & core coding */ - if ( ( error = ivas_ism_enc( st_ivas, data_f, input_frame, &nb_bits_metadata[1], flag_omasa_ener_brate -#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA - , - 0 -#endif - ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_ism_enc( st_ivas, data_f, input_frame, &nb_bits_metadata[1], flag_omasa_ener_brate ) ) != IVAS_ERR_OK ) { return error; } @@ -427,12 +398,7 @@ ivas_error ivas_enc( n = hEncoderConfig->nchan_ism; hMetaData = st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData; - if ( ( error = ivas_ism_metadata_enc( &st_ivas->hEncoderConfig->ivas_total_brate, n, st_ivas->hEncoderConfig->nchan_ism, st_ivas->hIsmMetaData, NULL, hMetaData, &nb_bits_metadata[1], 0, st_ivas->ism_mode, NULL, st_ivas->hEncoderConfig->ism_extended_metadata_flag, -1, 0, NULL, st_ivas->hCPE[0]->hCoreCoder[0]->ini_frame -#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA - , - 0 -#endif - ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_ism_metadata_enc( &st_ivas->hEncoderConfig->ivas_total_brate, n, st_ivas->hEncoderConfig->nchan_ism, st_ivas->hIsmMetaData, NULL, hMetaData, &nb_bits_metadata[1], 0, st_ivas->ism_mode, NULL, st_ivas->hEncoderConfig->ism_extended_metadata_flag, -1, 0, NULL, st_ivas->hCPE[0]->hCoreCoder[0]->ini_frame ) ) != IVAS_ERR_OK ) { return error; } diff --git a/lib_enc/ivas_ism_enc.c b/lib_enc/ivas_ism_enc.c index cc8718642e..db689cc9f1 100644 --- a/lib_enc/ivas_ism_enc.c +++ b/lib_enc/ivas_ism_enc.c @@ -54,10 +54,6 @@ ivas_error ivas_ism_enc( const int16_t input_frame, /* i : input frame length per channel */ int16_t *nb_bits_metadata, /* i : number of metadata bits */ const int16_t flag_omasa_ener_brate /* i : less bitrate for objects in OMASA flag */ -#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA - , - int16_t force_absolute_coding -#endif ) { SCE_ENC_HANDLE hSCE; @@ -240,12 +236,7 @@ ivas_error ivas_ism_enc( else if ( st_ivas->ism_mode == ISM_MODE_PARAM ) { if ( ( error = 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->hParamIsm, st_ivas->hEncoderConfig->ism_extended_metadata_flag, -1, 0, NULL, st_ivas->hSCE[0]->hCoreCoder[0]->ini_frame -#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA - , - 0 -#endif - ) ) != IVAS_ERR_OK ) + nb_bits_metadata, vad_flag, st_ivas->ism_mode, st_ivas->hParamIsm, st_ivas->hEncoderConfig->ism_extended_metadata_flag, -1, 0, NULL, st_ivas->hSCE[0]->hCoreCoder[0]->ini_frame ) ) != IVAS_ERR_OK ) { return error; } @@ -268,12 +259,7 @@ ivas_error ivas_ism_enc( ism_total_brate_ref = ism_total_brate; if ( ( error = 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.hOmasaData->lp_noise_CPE : 0, flag_omasa_ener_brate, st_ivas->hMasa != NULL ? &( st_ivas->hMasa->data.hOmasaData->omasa_stereo_sw_cnt ) : NULL, st_ivas->hSCE[0]->hCoreCoder[0]->ini_frame -#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA - , - force_absolute_coding -#endif - ) ) != IVAS_ERR_OK ) + 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.hOmasaData->lp_noise_CPE : 0, flag_omasa_ener_brate, st_ivas->hMasa != NULL ? &( st_ivas->hMasa->data.hOmasaData->omasa_stereo_sw_cnt ) : NULL, st_ivas->hSCE[0]->hCoreCoder[0]->ini_frame ) ) != IVAS_ERR_OK ) { return error; } diff --git a/lib_enc/ivas_ism_metadata_enc.c b/lib_enc/ivas_ism_metadata_enc.c index 176a0c49d9..3b23359850 100644 --- a/lib_enc/ivas_ism_metadata_enc.c +++ b/lib_enc/ivas_ism_metadata_enc.c @@ -55,7 +55,9 @@ #define ISM_MAX_ELEVATION_DIFF_IDX ( ISM_ELEVATION_NBITS - 1 /*zero*/ - 1 /*sign*/ ) #define ISM_MAX_RADIUS_DIFF_IDX ( ISM_RADIUS_NBITS - 1 /*zero*/ - 1 /*sign*/ ) -#define ISM_FEC_MAX 10 +#ifndef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA +#define ISM_FEC_MAX 10 +#endif #define ISM_MD_FEC_DIFF 10 #define ISM_MD_INC_DIFF_CNT_MAX 6 #define ISM_MD_FEC_CNT_MAX 25 @@ -67,12 +69,7 @@ * Local function declarations *-----------------------------------------------------------------------*/ -static void encode_angle_indices( BSTR_ENC_HANDLE hBstr, ISM_METADATA_ANGLE_HANDLE angle, const int16_t last_ism_metadata_flag, const int16_t ini_frame, const int16_t idx_angle1_abs, const int16_t idx_angle2_abs, int16_t *flag_abs_angle1, int16_t *flag_abs_angle2 -#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA - , - int16_t changed_object -#endif -); +static void encode_angle_indices( BSTR_ENC_HANDLE hBstr, ISM_METADATA_ANGLE_HANDLE angle, const int16_t last_ism_metadata_flag, const int16_t ini_frame, const int16_t idx_angle1_abs, const int16_t idx_angle2_abs, int16_t *flag_abs_angle1, int16_t *flag_abs_angle2 ); static void encode_radius( BSTR_ENC_HANDLE hBstr, int16_t *last_radius_idx, int16_t *radius_diff_cnt, const int16_t last_ism_metadata_flag, const int16_t idx_radius_abs, int16_t *flag_abs_radius ); @@ -187,12 +184,7 @@ ivas_error ivas_ism_metadata_enc( const float lp_noise_CPE, const int16_t flag_omasa_ener_brate, /* i : less bitrate for objects in OMASA flag */ int16_t *omasa_stereo_sw_cnt, - const int16_t ini_frame -#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA - , - int16_t changed_object /* i : tells if the separated object has changed */ -#endif -) + const int16_t ini_frame ) { int16_t i, ch, nb_bits_start = 0; int16_t flag_abs_azimuth[MAX_NUM_OBJECTS]; @@ -439,12 +431,8 @@ ivas_error ivas_ism_metadata_enc( } idx_angle1_abs = ism_quant_meta( hIsmMetaData->azimuth, &valQ, ism_azimuth_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_AZIMUTH_NBITS ); - encode_angle_indices( hBstr, &( hIsmMetaData->position_angle ), hIsmMetaData->last_ism_metadata_flag, hSCE[0]->hCoreCoder[0]->ini_frame, idx_angle1_abs, 0, &flag_abs_azimuth[ch], NULL -#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA - , - changed_object -#endif - ); + + encode_angle_indices( hBstr, &( hIsmMetaData->position_angle ), hIsmMetaData->last_ism_metadata_flag, hSCE[0]->hCoreCoder[0]->ini_frame, idx_angle1_abs, 0, &flag_abs_azimuth[ch], NULL ); } else { @@ -458,12 +446,8 @@ ivas_error ivas_ism_metadata_enc( idx_angle1_abs = hParamIsm->azi_index[ch]; idx_angle2_abs = hParamIsm->ele_index[ch]; } - encode_angle_indices( hBstr, &( hIsmMetaData->position_angle ), hIsmMetaData->last_ism_metadata_flag, ini_frame, idx_angle1_abs, idx_angle2_abs, &flag_abs_azimuth[ch], &flag_abs_elevation[ch] -#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA - , - changed_object -#endif - ); + + encode_angle_indices( hBstr, &( hIsmMetaData->position_angle ), hIsmMetaData->last_ism_metadata_flag, ini_frame, idx_angle1_abs, idx_angle2_abs, &flag_abs_azimuth[ch], &flag_abs_elevation[ch] ); /*----------------------------------------------------------------* * Quantize and encode radius, yaw, and pitch @@ -474,12 +458,7 @@ ivas_error ivas_ism_metadata_enc( idx_angle2_abs = ism_quant_meta( hIsmMetaData->pitch, &valQ, ism_elevation_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_ELEVATION_NBITS ); idx_radius_abs = usquant( hIsmMetaData->radius, &valQ, ISM_RADIUS_MIN, ISM_RADIUS_DELTA, 1 << ISM_RADIUS_NBITS ); - encode_angle_indices( hBstr, &( hIsmMetaData->orientation_angle ), hIsmMetaData->last_ism_metadata_flag, ini_frame, idx_angle1_abs, idx_angle2_abs, &flag_abs_yaw[ch], &flag_abs_pitch[ch] -#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA - , - changed_object -#endif - ); + encode_angle_indices( hBstr, &( hIsmMetaData->orientation_angle ), hIsmMetaData->last_ism_metadata_flag, ini_frame, idx_angle1_abs, idx_angle2_abs, &flag_abs_yaw[ch], &flag_abs_pitch[ch] ); encode_radius( hBstr, &hIsmMetaData->last_radius_idx, &hIsmMetaData->radius_diff_cnt, hIsmMetaData->last_ism_metadata_flag, idx_radius_abs, &flag_abs_radius[ch] ); } } @@ -1009,10 +988,6 @@ static void encode_angle_indices( const int16_t idx_angle2_abs, /* i : Elevation index */ int16_t *flag_abs_angle1, /* o : Azimuth/yaw encoding mode */ int16_t *flag_abs_angle2 /* o : Elevation/pitch encoding mode */ -#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA - , - int16_t changed_object /* i : tells if separated object has changed in OMASA */ -#endif ) { int16_t idx_angle1, nbits_diff_angle1, diff; @@ -1029,9 +1004,6 @@ static void encode_angle_indices( *flag_abs_angle1 = 0; /* differential coding by default */ if ( angle->angle1_diff_cnt == ISM_FEC_MAX /* make differential encoding in ISM_FEC_MAX consecutive frames at maximum (in order to control the decoding in FEC) */ || last_ism_metadata_flag == 0 /* If last frame had no metadata coded, do not use differential coding */ -#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA - || changed_object -#endif ) { *flag_abs_angle1 = 1; @@ -1129,9 +1101,6 @@ static void encode_angle_indices( *flag_abs_angle2 = 0; /* differential coding by default */ if ( angle->angle2_diff_cnt == ISM_FEC_MAX /* make differential encoding in ISM_FEC_MAX consecutive frames at maximum (in order to control the decoding in FEC) */ || last_ism_metadata_flag == 0 /* If last frame had no metadata coded, do not use differential coding */ -#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA - || changed_object -#endif ) { *flag_abs_angle2 = 1; diff --git a/lib_enc/ivas_omasa_enc.c b/lib_enc/ivas_omasa_enc.c index 4362442f95..10f9b1d769 100644 --- a/lib_enc/ivas_omasa_enc.c +++ b/lib_enc/ivas_omasa_enc.c @@ -43,7 +43,13 @@ #include "debug.h" #endif #include "wmc_auto.h" + + #ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA +/*------------------------------------------------------------------------- + * Local constants + *------------------------------------------------------------------------*/ + #define OMASA_FEC_MAX 21 #endif @@ -135,6 +141,9 @@ ivas_error ivas_omasa_enc_open( set_zero( hOMasa->broadband_energy_prev, MAX_NUM_OBJECTS + MASA_MAX_TRANSPORT_CHANNELS ); hOMasa->prev_selected_object = 0; hOMasa->changing_object = 0; +#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASAaa + hOMasa->since_obj_change_cnt = 0; +#endif input_frame = (int16_t) ( st_ivas->hEncoderConfig->input_Fs / FRAMES_PER_SEC ); for ( i = 0; i < input_frame; i++ ) @@ -395,17 +404,11 @@ void ivas_omasa_enc( const ISM_MODE ism_mode, /* i : ISM mode */ float *data_separated_object, /* o : Separated object audio signal */ int16_t *idx_separated_object /* o : Index of the separated object */ -#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA - , - int16_t *force_absolute_coding /* o : tells if the separated object has changed */ -#endif ) { int16_t i, j; float data_out_f[MASA_MAX_TRANSPORT_CHANNELS][L_FRAME48k]; -#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA - *force_absolute_coding = 0; -#endif + /* Determine separated object (when applicable) */ if ( ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) { @@ -503,11 +506,13 @@ void ivas_omasa_enc( { hOMasa->broadband_energy_prev[i] = broadband_energy[i]; } + #ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA + /* force absolute MD coding in case of change of separated object */ if ( hOMasa->prev_selected_object != selected_object ) { - *force_absolute_coding = 1; hOMasa->since_obj_change_cnt = 0; + hIsmMeta[0]->position_angle.angle1_diff_cnt = ISM_FEC_MAX; } else { @@ -515,7 +520,7 @@ void ivas_omasa_enc( hOMasa->since_obj_change_cnt = min( OMASA_FEC_MAX, hOMasa->since_obj_change_cnt ); if ( hOMasa->since_obj_change_cnt < OMASA_FEC_MAX ) { - *force_absolute_coding = 1; + hIsmMeta[0]->position_angle.angle1_diff_cnt = ISM_FEC_MAX; } } #endif -- GitLab From f6526015972eb734f42986606536bfef44d87dfd Mon Sep 17 00:00:00 2001 From: vaclav Date: Tue, 2 Jan 2024 18:36:37 +0100 Subject: [PATCH 3/5] change OMASA_FEC_MAX from 21 to 5 --- lib_enc/ivas_omasa_enc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_enc/ivas_omasa_enc.c b/lib_enc/ivas_omasa_enc.c index 10f9b1d769..f0ee5162a9 100644 --- a/lib_enc/ivas_omasa_enc.c +++ b/lib_enc/ivas_omasa_enc.c @@ -50,7 +50,7 @@ * Local constants *------------------------------------------------------------------------*/ -#define OMASA_FEC_MAX 21 +#define OMASA_FEC_MAX 5 #endif /*------------------------------------------------------------------------- -- GitLab From fdd8807b8e79bab5e64a17a55ce0a6aaae5711d1 Mon Sep 17 00:00:00 2001 From: vaclav Date: Tue, 2 Jan 2024 18:38:13 +0100 Subject: [PATCH 4/5] remove empty line --- lib_com/options.h | 1 - 1 file changed, 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 4049733a92..1f1d3285ca 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -162,7 +162,6 @@ #define NONBE_FIX_856_TCX_LTP_SYNTH_FILTER /* FhG: issue 856: correct filtering length for tcx-ltp synth filtering*/ #define NONBE_FIX_943_RECONFIG_IGF_AFTER_SETTING_BW /* FhG: issue 943: fix crash in BW switchin from WB in MDCT-Stereo core encoder */ - #define NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA /* Nokia: issue 944: fix FEC error in OMASA */ /* ##################### End NON-BE switches ########################### */ -- GitLab From 925707ac55df75e75ec13861488cca0e3b9a8d4c Mon Sep 17 00:00:00 2001 From: vaclav Date: Tue, 2 Jan 2024 18:41:03 +0100 Subject: [PATCH 5/5] correct typo --- lib_enc/ivas_omasa_enc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_enc/ivas_omasa_enc.c b/lib_enc/ivas_omasa_enc.c index f0ee5162a9..b5382f9060 100644 --- a/lib_enc/ivas_omasa_enc.c +++ b/lib_enc/ivas_omasa_enc.c @@ -141,7 +141,7 @@ ivas_error ivas_omasa_enc_open( set_zero( hOMasa->broadband_energy_prev, MAX_NUM_OBJECTS + MASA_MAX_TRANSPORT_CHANNELS ); hOMasa->prev_selected_object = 0; hOMasa->changing_object = 0; -#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASAaa +#ifdef NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA hOMasa->since_obj_change_cnt = 0; #endif -- GitLab