From bbc2aa81a08d2c6c942bec39d343cfac84bdd002 Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Tue, 8 Apr 2025 16:40:05 +0300 Subject: [PATCH 1/2] Fix issue 1305. --- lib_com/ivas_prot.h | 9 +++++++++ lib_com/options.h | 1 + lib_dec/ivas_jbm_dec.c | 14 ++++++++++++++ lib_dec/ivas_objectRenderer_internal.c | 16 ++++++++++++++++ lib_dec/ivas_omasa_dec.c | 25 +++++++++++++++++++++++++ lib_dec/lib_dec.c | 11 +++++++++++ 6 files changed, 76 insertions(+) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 4722f322d2..da8c856aa0 100755 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -5804,6 +5804,15 @@ void ivas_omasa_render_objects_from_mix( const int16_t output_frame /* i : output frame length per channel */ ); +#ifdef NONBE_FIX_1305_OMASA_OBJ_EDIT_EXT +void ivas_omasa_gain_masa_tc( + float *output[], /* o : output synthesis signal */ + const float gainMasa, /* i : gain for MASA transport channels */ + const int16_t nchan_transport_ism, /* i : number of ISM TCs */ + const int16_t output_frame /* i : output frame length per channel */ +); +#endif + void ivas_omasa_dirac_rend_jbm( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ const uint16_t nSamplesAsked, /* i : number of samples requested */ diff --git a/lib_com/options.h b/lib_com/options.h index ebfc3519ab..5bb6286cd0 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -174,6 +174,7 @@ #define NONBE_1122_KEEP_EVS_MODE_UNCHANGED /* FhG: Disables fix for issue 1122 in EVS mode to keep BE tests green. This switch should be removed once the 1122 fix is added to EVS via a CR. */ #define NONBE_1118_EVS_LR_HQ_BITERROR /* VA: issue 1118: fix EVS decoder crash in LR-HQ in case of bit errors */ #define NONBE_1303_REND_GRANULARITY /* VA: issue 1303: Renderer granularity revision */ +#define NONBE_FIX_1305_OMASA_OBJ_EDIT_EXT /* Nokia: issue 1305: Fix OMASA ext output in case of object editing */ /* ##################### End NON-BE switches ########################### */ diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 0d8c06abc1..bf9cb7bf54 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -925,6 +925,13 @@ ivas_error ivas_jbm_dec_render( else if ( st_ivas->hTcBuffer->tc_buffer_mode == TC_BUFFER_MODE_BUFFER ) { ivas_jbm_dec_tc_buffer_playout( st_ivas, nSamplesAskedLocal, nSamplesRendered, p_output ); +#ifdef NONBE_FIX_1305_OMASA_OBJ_EDIT_EXT + /* MASA transport gaining for edited disc OMASA EXT. For ISMs, only metadata is modified */ + if ( st_ivas->ivas_format == MASA_ISM_FORMAT && st_ivas->ism_mode == ISM_MASA_MODE_DISC && st_ivas->hMasaIsmData->masa_gain_is_edited == 1 ) + { + ivas_omasa_gain_masa_tc( p_output, st_ivas->hMasaIsmData->gain_masa_edited, st_ivas->nchan_ism, *nSamplesRendered ); + } +#endif } else if ( st_ivas->ivas_format == STEREO_FORMAT ) { @@ -1063,6 +1070,13 @@ ivas_error ivas_jbm_dec_render( { ivas_jbm_dec_tc_buffer_playout( st_ivas, nSamplesAskedLocal, nSamplesRendered, p_output ); ivas_omasa_rearrange_channels( p_output, st_ivas->nchan_ism, *nSamplesRendered ); +#ifdef NONBE_FIX_1305_OMASA_OBJ_EDIT_EXT + /* MASA transport gaining for edited param_one OMASA EXT. For ISMs, only metadata is modified. */ + if ( st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ && st_ivas->hMasaIsmData->masa_gain_is_edited == 1 ) + { + ivas_omasa_gain_masa_tc( p_output, st_ivas->hMasaIsmData->gain_masa_edited, st_ivas->nchan_ism, *nSamplesRendered ); + } +#endif } } else if ( st_ivas->ivas_format == SBA_ISM_FORMAT ) diff --git a/lib_dec/ivas_objectRenderer_internal.c b/lib_dec/ivas_objectRenderer_internal.c index d64720c44a..597480b8ea 100644 --- a/lib_dec/ivas_objectRenderer_internal.c +++ b/lib_dec/ivas_objectRenderer_internal.c @@ -185,7 +185,11 @@ ivas_error ivas_td_binaural_renderer_sf( if ( subframe_idx == ism_md_subframe_update_jbm ) { +#ifdef NONBE_FIX_1305_OMASA_OBJ_EDIT_EXT + if ( st_ivas->ivas_format == ISM_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT || st_ivas->ivas_format == MASA_ISM_FORMAT ) +#else if ( st_ivas->ivas_format == ISM_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT ) +#endif { ISM_METADATA_FRAME ismMetaData[MAX_NUM_OBJECTS]; ISM_METADATA_HANDLE hIsmMetaData[MAX_NUM_OBJECTS]; @@ -198,7 +202,19 @@ ivas_error ivas_td_binaural_renderer_sf( ismMetaData[nS].yaw = st_ivas->hIsmMetaData[nS]->edited_yaw; ismMetaData[nS].pitch = st_ivas->hIsmMetaData[nS]->edited_pitch; ismMetaData[nS].non_diegetic_flag = st_ivas->hIsmMetaData[nS]->non_diegetic_flag; +#ifdef NONBE_FIX_1305_OMASA_OBJ_EDIT_EXT + if ( st_ivas->ivas_format == MASA_ISM_FORMAT ) + { + /* DISC OMASA ISM gaining with TDREND is done in ivas_dec_prepare_renderer()*/ + ismMetaData[nS].gain = 1; + } + else + { + ismMetaData[nS].gain = st_ivas->hIsmMetaData[nS]->edited_gain; + } +#else ismMetaData[nS].gain = st_ivas->hIsmMetaData[nS]->edited_gain; +#endif hIsmMetaData[nS] = &ismMetaData[nS]; } diff --git a/lib_dec/ivas_omasa_dec.c b/lib_dec/ivas_omasa_dec.c index 497233122c..cb5c3129b7 100644 --- a/lib_dec/ivas_omasa_dec.c +++ b/lib_dec/ivas_omasa_dec.c @@ -1321,3 +1321,28 @@ void ivas_omasa_render_objects_from_mix( return; } + +#ifdef NONBE_FIX_1305_OMASA_OBJ_EDIT_EXT +/*--------------------------------------------------------------------------* + * ivas_omasa_gain_masa_channels() + * + * in case of external rendering with object editing, MASA transport channels + * need to be gained + *--------------------------------------------------------------------------*/ + +void ivas_omasa_gain_masa_tc( + float *output[], /* o : output synthesis signal */ + const float gainMasa, /* o : gain */ + const int16_t nchan_transport_ism, /* o : number of ISM TCs */ + const int16_t output_frame /* i : output frame length per channel */ +) +{ + /* Edited OMASA EXT MASA transport gaining */ + for ( int16_t ch = 0; ch < 2; ch++ ) + { + v_multc( output[nchan_transport_ism + ch], gainMasa, output[nchan_transport_ism + ch], output_frame ); + } + + return; +} +#endif diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index fc5bbc74d4..cc111b436a 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -1683,6 +1683,13 @@ 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 = hIvasEditableParameters.ism_metadata[obj].azimuth; + st_ivas->hIsmMetaData[obj]->edited_elevation = hIvasEditableParameters.ism_metadata[obj].elevation; + st_ivas->hIsmMetaData[obj]->edited_yaw = hIvasEditableParameters.ism_metadata[obj].yaw; + st_ivas->hIsmMetaData[obj]->edited_pitch = hIvasEditableParameters.ism_metadata[obj].pitch; + st_ivas->hIsmMetaData[obj]->edited_radius = hIvasEditableParameters.ism_metadata[obj].radius; +#endif st_ivas->hIsmMetaData[obj]->azimuth = hIvasEditableParameters.ism_metadata[obj].azimuth; st_ivas->hIsmMetaData[obj]->elevation = hIvasEditableParameters.ism_metadata[obj].elevation; st_ivas->hIsmMetaData[obj]->yaw = hIvasEditableParameters.ism_metadata[obj].yaw; @@ -2547,7 +2554,11 @@ ivas_error IVAS_DEC_GetObjectMetadata( metadata->gainFactor = 1.f; metadata->non_diegetic_flag = hIsmMeta->non_diegetic_flag; } +#ifdef NONBE_FIX_1305_OMASA_OBJ_EDIT_EXT + else if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC || st_ivas->ism_mode == ISM_MASA_MODE_DISC || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) +#else else if ( st_ivas->ism_mode == ISM_SBA_MODE_DISC || st_ivas->ism_mode == ISM_MASA_MODE_DISC ) +#endif { metadata->azimuth = st_ivas->hIsmMetaData[objectIdx]->edited_azimuth; metadata->elevation = st_ivas->hIsmMetaData[objectIdx]->edited_elevation; -- GitLab From bbbb6b9a929cc12f79c3dc34525536b9f0f46c6c Mon Sep 17 00:00:00 2001 From: lintervo Date: Mon, 14 Apr 2025 09:24:28 +0300 Subject: [PATCH 2/2] Address MR comments --- lib_com/ivas_prot.h | 2 +- lib_dec/ivas_jbm_dec.c | 31 +++++++++++++++++-------------- lib_dec/ivas_omasa_dec.c | 8 ++++---- 3 files changed, 22 insertions(+), 19 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index da8c856aa0..dd07c2fafb 100755 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -5806,7 +5806,7 @@ void ivas_omasa_render_objects_from_mix( #ifdef NONBE_FIX_1305_OMASA_OBJ_EDIT_EXT void ivas_omasa_gain_masa_tc( - float *output[], /* o : output synthesis signal */ + float *output[], /* i/o : output synthesis signal */ const float gainMasa, /* i : gain for MASA transport channels */ const int16_t nchan_transport_ism, /* i : number of ISM TCs */ const int16_t output_frame /* i : output frame length per channel */ diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index bf9cb7bf54..376bd00c4d 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -925,13 +925,6 @@ ivas_error ivas_jbm_dec_render( else if ( st_ivas->hTcBuffer->tc_buffer_mode == TC_BUFFER_MODE_BUFFER ) { ivas_jbm_dec_tc_buffer_playout( st_ivas, nSamplesAskedLocal, nSamplesRendered, p_output ); -#ifdef NONBE_FIX_1305_OMASA_OBJ_EDIT_EXT - /* MASA transport gaining for edited disc OMASA EXT. For ISMs, only metadata is modified */ - if ( st_ivas->ivas_format == MASA_ISM_FORMAT && st_ivas->ism_mode == ISM_MASA_MODE_DISC && st_ivas->hMasaIsmData->masa_gain_is_edited == 1 ) - { - ivas_omasa_gain_masa_tc( p_output, st_ivas->hMasaIsmData->gain_masa_edited, st_ivas->nchan_ism, *nSamplesRendered ); - } -#endif } else if ( st_ivas->ivas_format == STEREO_FORMAT ) { @@ -1070,13 +1063,6 @@ ivas_error ivas_jbm_dec_render( { ivas_jbm_dec_tc_buffer_playout( st_ivas, nSamplesAskedLocal, nSamplesRendered, p_output ); ivas_omasa_rearrange_channels( p_output, st_ivas->nchan_ism, *nSamplesRendered ); -#ifdef NONBE_FIX_1305_OMASA_OBJ_EDIT_EXT - /* MASA transport gaining for edited param_one OMASA EXT. For ISMs, only metadata is modified. */ - if ( st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ && st_ivas->hMasaIsmData->masa_gain_is_edited == 1 ) - { - ivas_omasa_gain_masa_tc( p_output, st_ivas->hMasaIsmData->gain_masa_edited, st_ivas->nchan_ism, *nSamplesRendered ); - } -#endif } } else if ( st_ivas->ivas_format == SBA_ISM_FORMAT ) @@ -2890,6 +2876,13 @@ void ivas_dec_prepare_renderer( { 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 */ + if ( st_ivas->ivas_format == MASA_ISM_FORMAT && st_ivas->ism_mode == ISM_MASA_MODE_DISC && st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL && st_ivas->hMasaIsmData->masa_gain_is_edited == 1 ) + { + ivas_omasa_gain_masa_tc( st_ivas->hTcBuffer->tc, st_ivas->hMasaIsmData->gain_masa_edited, st_ivas->nchan_ism, st_ivas->hTcBuffer->n_samples_available ); + } +#endif } else if ( st_ivas->ivas_format == STEREO_FORMAT ) { @@ -2965,6 +2958,16 @@ void ivas_dec_prepare_renderer( { 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 ( st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ && st_ivas->hMasaIsmData->masa_gain_is_edited == 1 ) + { + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + v_multc( st_ivas->hTcBuffer->tc[n], st_ivas->hMasaIsmData->gain_masa_edited, st_ivas->hTcBuffer->tc[n], st_ivas->hTcBuffer->n_samples_available ); + } + } +#endif } else { diff --git a/lib_dec/ivas_omasa_dec.c b/lib_dec/ivas_omasa_dec.c index cb5c3129b7..b468df0439 100644 --- a/lib_dec/ivas_omasa_dec.c +++ b/lib_dec/ivas_omasa_dec.c @@ -1324,16 +1324,16 @@ void ivas_omasa_render_objects_from_mix( #ifdef NONBE_FIX_1305_OMASA_OBJ_EDIT_EXT /*--------------------------------------------------------------------------* - * ivas_omasa_gain_masa_channels() + * ivas_omasa_gain_masa_tc() * * in case of external rendering with object editing, MASA transport channels * need to be gained *--------------------------------------------------------------------------*/ void ivas_omasa_gain_masa_tc( - float *output[], /* o : output synthesis signal */ - const float gainMasa, /* o : gain */ - const int16_t nchan_transport_ism, /* o : number of ISM TCs */ + float *output[], /* i/o : output synthesis signal */ + const float gainMasa, /* i : gain */ + const int16_t nchan_transport_ism, /* i : number of ISM TCs */ const int16_t output_frame /* i : output frame length per channel */ ) { -- GitLab