From cdcec2362905782d2a1dd6f103cacfd2870a0fcf Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Fri, 24 Oct 2025 12:17:31 +0300 Subject: [PATCH 1/4] Port changes from float MR 2076 to BASOP main. --- lib_com/ivas_prot_fx.h | 9 ++++++++ lib_com/options.h | 1 + lib_dec/ivas_jbm_dec_fx.c | 22 +++++++++++++++++++ lib_dec/ivas_objectRenderer_internal_fx.c | 18 ++++++++++++++++ lib_dec/ivas_omasa_dec_fx.c | 26 +++++++++++++++++++++++ lib_dec/lib_dec_fx.c | 16 ++++++++++++++ 6 files changed, 92 insertions(+) diff --git a/lib_com/ivas_prot_fx.h b/lib_com/ivas_prot_fx.h index 109ca1372..08e5694d6 100644 --- a/lib_com/ivas_prot_fx.h +++ b/lib_com/ivas_prot_fx.h @@ -178,6 +178,15 @@ void ivas_omasa_render_objects_from_mix_fx( Word16 *output_q /* i/o: output Q value */ ); +#ifdef NONBE_FIX_1305_OMASA_OBJ_EDIT_EXT +void ivas_omasa_gain_masa_tc_fx( + Word32 *output_fx[], /* i/o: output synthesis signal */ + const Word16 gainMasa_fx, /* i : gain for MASA transport channels */ + const Word16 nchan_transport_ism, /* i : number of ISM TCs */ + const Word16 output_frame /* i : output frame length per channel */ +); +#endif + ivas_error ivas_omasa_ism_metadata_dec_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const Word32 ism_total_brate, /* i : ISM total bitrate */ diff --git a/lib_com/options.h b/lib_com/options.h index 7fa7ca32a..4d1bd4e03 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -127,6 +127,7 @@ #define NONBE_FIX_1255_OBJ_EDIT_JBM /* VA: issue 1255: restore object editing in JBM */ #define FIX_1372_OSBA_OBJECT_EDITING /* VA: issue 1372: Fix OSBA object-editing in BINAURAL_ROOM_IR */ #define FIX_2140_OBJECT_EDITING_SANITIZER_ISSUES /* Nokia: Issue 2140, fixes three different sanitizer issues persisting in object editing code. */ +#define NONBE_FIX_1305_OMASA_OBJ_EDIT_EXT /* Nokia: issue 1305: Fix OMASA ext output in case of object editing */ /* #################### End BASOP porting switches ############################ */ diff --git a/lib_dec/ivas_jbm_dec_fx.c b/lib_dec/ivas_jbm_dec_fx.c index 3e171a8de..4b7df165f 100644 --- a/lib_dec/ivas_jbm_dec_fx.c +++ b/lib_dec/ivas_jbm_dec_fx.c @@ -4424,6 +4424,16 @@ void ivas_dec_prepare_renderer_fx( { ivas_jbm_masa_sf_to_slot_map( st_ivas, n_render_timeslots ); } +#ifdef NONBE_FIX_1305_OMASA_OBJ_EDIT_EXT + /* MASA transport gaining for edited disc OMASA EXT. For ISMs, only metadata is modified */ + test(); + test(); + test(); + IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) && EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) && EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) && EQ_16( st_ivas->hMasaIsmData->masa_gain_is_edited, 1 ) ) + { + ivas_omasa_gain_masa_tc_fx( st_ivas->hTcBuffer->tc_fx, st_ivas->hMasaIsmData->gain_masa_edited_fx, st_ivas->nchan_ism, st_ivas->hTcBuffer->n_samples_available ); + } +#endif } ELSE IF( EQ_16( st_ivas->ivas_format, STEREO_FORMAT ) ) { @@ -4547,6 +4557,18 @@ void ivas_dec_prepare_renderer_fx( { ivas_jbm_masa_sf_to_slot_map( st_ivas, n_render_timeslots ); } +#ifdef NONBE_FIX_1305_OMASA_OBJ_EDIT_EXT + /* MASA transport gaining for edited param_one OMASA EXT. For ISMs, only metadata is modified. */ + IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) && EQ_16( st_ivas->hMasaIsmData->masa_gain_is_edited, 1 ) ) + { + FOR( n = 0; n < CPE_CHANNELS; n++ ) + { + v_multc_fx_16( st_ivas->hTcBuffer->tc_fx[n], st_ivas->hMasaIsmData->gain_masa_edited_fx, st_ivas->hTcBuffer->tc_fx[n], st_ivas->hTcBuffer->n_samples_available ); // Q8 + Scale_sig32( st_ivas->hTcBuffer->tc_fx[n], st_ivas->hTcBuffer->n_samples_available, Q3 ); // Q8 -> Q11 + } + } +#endif + } ELSE { diff --git a/lib_dec/ivas_objectRenderer_internal_fx.c b/lib_dec/ivas_objectRenderer_internal_fx.c index 98a57c4cd..c32195b6b 100644 --- a/lib_dec/ivas_objectRenderer_internal_fx.c +++ b/lib_dec/ivas_objectRenderer_internal_fx.c @@ -214,7 +214,11 @@ ivas_error ivas_td_binaural_renderer_sf_fx( IF( EQ_16( subframe_idx, ism_md_subframe_update_jbm ) ) { test(); +#ifdef NONBE_FIX_1305_OMASA_OBJ_EDIT_EXT + IF( EQ_16( st_ivas->ivas_format, ISM_FORMAT ) || EQ_16( st_ivas->ivas_format, SBA_ISM_FORMAT ) || EQ_16( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) +#else IF( EQ_16( st_ivas->ivas_format, ISM_FORMAT ) || EQ_16( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) +#endif { ISM_METADATA_FRAME ismMetaData[MAX_NUM_OBJECTS]; ISM_METADATA_HANDLE hIsmMetaData[MAX_NUM_OBJECTS]; @@ -232,8 +236,22 @@ ivas_error ivas_td_binaural_renderer_sf_fx( move32(); ismMetaData[nS].non_diegetic_flag = st_ivas->hIsmMetaData[nS]->non_diegetic_flag; move16(); +#ifdef NONBE_FIX_1305_OMASA_OBJ_EDIT_EXT + IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) + { + /* DISC OMASA ISM gaining with TDREND is done in ivas_dec_prepare_renderer()*/ + ismMetaData[nS].gain_fx = ONE_IN_Q29; + move32(); + } + ELSE + { + ismMetaData[nS].gain_fx = st_ivas->hIsmMetaData[nS]->edited_gain_fx; + move32(); + } +#else ismMetaData[nS].gain_fx = st_ivas->hIsmMetaData[nS]->edited_gain_fx; move32(); +#endif hIsmMetaData[nS] = &ismMetaData[nS]; } diff --git a/lib_dec/ivas_omasa_dec_fx.c b/lib_dec/ivas_omasa_dec_fx.c index 75e5a0afc..4749fc22d 100644 --- a/lib_dec/ivas_omasa_dec_fx.c +++ b/lib_dec/ivas_omasa_dec_fx.c @@ -2158,3 +2158,29 @@ void ivas_omasa_render_objects_from_mix_fx( return; } + +#ifdef NONBE_FIX_1305_OMASA_OBJ_EDIT_EXT +/*--------------------------------------------------------------------------* + * ivas_omasa_gain_masa_tc_fx() + * + * in case of external rendering with object editing, MASA transport channels + * need to be gained + *--------------------------------------------------------------------------*/ + +void ivas_omasa_gain_masa_tc_fx( + Word32 *output_fx[], /* i/o: output synthesis signal, Q11 */ + const Word16 gainMasa_fx, /* i : gain, Q12 */ + const Word16 nchan_transport_ism, /* i : number of ISM TCs */ + const Word16 output_frame /* i : output frame length per channel */ +) +{ + /* Edited OMASA EXT MASA transport gaining */ + FOR( Word16 ch = 0; ch < 2; ch++ ) + { + v_multc_fx_16( output_fx[nchan_transport_ism + ch], gainMasa_fx, output_fx[nchan_transport_ism + ch], output_frame ); // Q8 + Scale_sig32( output_fx[nchan_transport_ism + ch], output_frame, Q3 ); // Q8 -> Q11 + } + + return; +} +#endif diff --git a/lib_dec/lib_dec_fx.c b/lib_dec/lib_dec_fx.c index 7ee9289a6..6e0e8a7de 100644 --- a/lib_dec/lib_dec_fx.c +++ b/lib_dec/lib_dec_fx.c @@ -2318,7 +2318,11 @@ ivas_error IVAS_DEC_GetObjectMetadata( metadata->gainFactor_fx = ONE_IN_Q29; metadata->non_diegetic_flag = hIsmMeta->non_diegetic_flag; } +#ifdef NONBE_FIX_1305_OMASA_OBJ_EDIT_EXT + ELSE IF( EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) || EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) || EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) ) +#else ELSE IF( EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) || EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) +#endif { metadata->azimuth_fx = st_ivas->hIsmMetaData[objectIdx]->edited_azimuth_fx; metadata->elevation_fx = st_ivas->hIsmMetaData[objectIdx]->edited_elevation_fx; @@ -4579,6 +4583,18 @@ ivas_error IVAS_DEC_SetEditableParameters( /* Copy edited values to hIsmMetaData struct */ IF( st_ivas->hIsmMetaData[obj] != NULL ) { +#ifdef NONBE_FIX_1305_OMASA_OBJ_EDIT_EXT + st_ivas->hIsmMetaData[obj]->edited_azimuth_fx = hIvasEditableParameters.ism_metadata[obj].azimuth_fx; + move32(); + st_ivas->hIsmMetaData[obj]->edited_elevation_fx = hIvasEditableParameters.ism_metadata[obj].elevation_fx; + move32(); + st_ivas->hIsmMetaData[obj]->edited_yaw_fx = hIvasEditableParameters.ism_metadata[obj].yaw_fx; + move32(); + st_ivas->hIsmMetaData[obj]->edited_pitch_fx = hIvasEditableParameters.ism_metadata[obj].pitch_fx; + move32(); + st_ivas->hIsmMetaData[obj]->edited_radius_fx = hIvasEditableParameters.ism_metadata[obj].radius_fx; + move32(); +#endif st_ivas->hIsmMetaData[obj]->azimuth_fx = hIvasEditableParameters.ism_metadata[obj].azimuth_fx; move32(); st_ivas->hIsmMetaData[obj]->elevation_fx = hIvasEditableParameters.ism_metadata[obj].elevation_fx; -- GitLab From 7bdc49968d20445305e7f0b7dd5909ae79ec6624 Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Fri, 24 Oct 2025 12:21:15 +0300 Subject: [PATCH 2/4] Port changes from float MR 2135 to BASOP main. --- lib_com/options.h | 1 + lib_dec/lib_dec_fx.c | 8 +++++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 4d1bd4e03..800602d62 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -128,6 +128,7 @@ #define FIX_1372_OSBA_OBJECT_EDITING /* VA: issue 1372: Fix OSBA object-editing in BINAURAL_ROOM_IR */ #define FIX_2140_OBJECT_EDITING_SANITIZER_ISSUES /* Nokia: Issue 2140, fixes three different sanitizer issues persisting in object editing code. */ #define NONBE_FIX_1305_OMASA_OBJ_EDIT_EXT /* Nokia: issue 1305: Fix OMASA ext output in case of object editing */ +#define NONBE_FIX_1172_OBJ_EDIT_JBM /* VA: issue 1172: fix OMASA object editing in JBM */ /* #################### End BASOP porting switches ############################ */ diff --git a/lib_dec/lib_dec_fx.c b/lib_dec/lib_dec_fx.c index 6e0e8a7de..be60b0580 100644 --- a/lib_dec/lib_dec_fx.c +++ b/lib_dec/lib_dec_fx.c @@ -4391,12 +4391,12 @@ ivas_error IVAS_DEC_SetEditableParameters( move32(); st_ivas->hIsmMetaData[obj]->edited_radius_fx = hIvasEditableParameters.ism_metadata[obj].radius_fx; move32(); - st_ivas->hIsmMetaData[obj]->edited_gain_fx = hIvasEditableParameters.ism_metadata[obj].gain_fx; - move32(); st_ivas->hIsmMetaData[obj]->edited_yaw_fx = hIvasEditableParameters.ism_metadata[obj].yaw_fx; move32(); st_ivas->hIsmMetaData[obj]->edited_pitch_fx = hIvasEditableParameters.ism_metadata[obj].pitch_fx; move32(); + st_ivas->hIsmMetaData[obj]->edited_gain_fx = hIvasEditableParameters.ism_metadata[obj].gain_fx; + move32(); st_ivas->hIsmMetaData[obj]->non_diegetic_flag = hIvasEditableParameters.ism_metadata[obj].non_diegetic_flag; move16(); } @@ -4547,7 +4547,7 @@ ivas_error IVAS_DEC_SetEditableParameters( } ELSE { - /* detect editing in ISM_MASA_MODE_DISC. optionally, add quantization-resolution -based thresholds */ + /* detect editing in ISM_MASA_MODE_DISC mode */ test(); IF( L_abs( L_sub( st_ivas->hIsmMetaData[obj]->azimuth_fx, hIvasEditableParameters.ism_metadata[obj].azimuth_fx ) ) > OMASA_AZI_EDIT_THR_FX || L_abs( L_sub( st_ivas->hIsmMetaData[obj]->elevation_fx, hIvasEditableParameters.ism_metadata[obj].elevation_fx ) ) > OMASA_ELE_EDIT_THR_FX ) @@ -4595,6 +4595,7 @@ ivas_error IVAS_DEC_SetEditableParameters( st_ivas->hIsmMetaData[obj]->edited_radius_fx = hIvasEditableParameters.ism_metadata[obj].radius_fx; move32(); #endif +#ifndef NONBE_FIX_1172_OBJ_EDIT_JBM st_ivas->hIsmMetaData[obj]->azimuth_fx = hIvasEditableParameters.ism_metadata[obj].azimuth_fx; move32(); st_ivas->hIsmMetaData[obj]->elevation_fx = hIvasEditableParameters.ism_metadata[obj].elevation_fx; @@ -4605,6 +4606,7 @@ ivas_error IVAS_DEC_SetEditableParameters( move32(); st_ivas->hIsmMetaData[obj]->radius_fx = hIvasEditableParameters.ism_metadata[obj].radius_fx; move32(); +#endif st_ivas->hIsmMetaData[obj]->edited_gain_fx = hIvasEditableParameters.ism_metadata[obj].gain_fx; // TODO: check incoming Q value move32(); st_ivas->hIsmMetaData[obj]->non_diegetic_flag = hIvasEditableParameters.ism_metadata[obj].non_diegetic_flag; -- GitLab From e1cf6f95a720f2aaee8756d6c28c54fadcdb6a3a Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Fri, 24 Oct 2025 12:28:01 +0300 Subject: [PATCH 3/4] Clang format --- lib_dec/ivas_jbm_dec_fx.c | 1 - 1 file changed, 1 deletion(-) diff --git a/lib_dec/ivas_jbm_dec_fx.c b/lib_dec/ivas_jbm_dec_fx.c index 4b7df165f..e5492cdc6 100644 --- a/lib_dec/ivas_jbm_dec_fx.c +++ b/lib_dec/ivas_jbm_dec_fx.c @@ -4568,7 +4568,6 @@ void ivas_dec_prepare_renderer_fx( } } #endif - } ELSE { -- GitLab From 3ad2786fe4de9405b6a4e95fa5d4cf230432d9e2 Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Fri, 24 Oct 2025 13:21:52 +0300 Subject: [PATCH 4/4] Code review fixes --- lib_dec/ivas_jbm_dec_fx.c | 1 + lib_dec/ivas_objectRenderer_internal_fx.c | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/lib_dec/ivas_jbm_dec_fx.c b/lib_dec/ivas_jbm_dec_fx.c index e5492cdc6..62a5b5490 100644 --- a/lib_dec/ivas_jbm_dec_fx.c +++ b/lib_dec/ivas_jbm_dec_fx.c @@ -4559,6 +4559,7 @@ void ivas_dec_prepare_renderer_fx( } #ifdef NONBE_FIX_1305_OMASA_OBJ_EDIT_EXT /* MASA transport gaining for edited param_one OMASA EXT. For ISMs, only metadata is modified. */ + test(); IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) && EQ_16( st_ivas->hMasaIsmData->masa_gain_is_edited, 1 ) ) { FOR( n = 0; n < CPE_CHANNELS; n++ ) diff --git a/lib_dec/ivas_objectRenderer_internal_fx.c b/lib_dec/ivas_objectRenderer_internal_fx.c index c32195b6b..0e30c9323 100644 --- a/lib_dec/ivas_objectRenderer_internal_fx.c +++ b/lib_dec/ivas_objectRenderer_internal_fx.c @@ -215,7 +215,8 @@ ivas_error ivas_td_binaural_renderer_sf_fx( { test(); #ifdef NONBE_FIX_1305_OMASA_OBJ_EDIT_EXT - IF( EQ_16( st_ivas->ivas_format, ISM_FORMAT ) || EQ_16( st_ivas->ivas_format, SBA_ISM_FORMAT ) || EQ_16( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) + test(); + IF( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) || EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) || EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) #else IF( EQ_16( st_ivas->ivas_format, ISM_FORMAT ) || EQ_16( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) #endif -- GitLab