From 58f5544902899564884902e977e333fe26046768 Mon Sep 17 00:00:00 2001 From: lintervo Date: Fri, 7 Nov 2025 15:38:43 +0200 Subject: [PATCH] Reference port for ivas-float-update --- lib_com/ivas_cnst.h | 5 ++ lib_com/options.h | 1 + lib_dec/lib_dec.c | 85 +++++++++++++++++++++++++++++++++ lib_util/obj_edit_file_reader.h | 5 ++ 4 files changed, 96 insertions(+) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 23802a3b1..51af5140c 100644 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -182,6 +182,11 @@ typedef enum #define MAX_SPAR_INTERNAL_CHANNELS IVAS_SPAR_MAX_CH #define MAX_CLDFB_DIGEST_CHANNELS 3 /* == maximum of ParamISM TCs and ParamMC TCs */ +#ifdef FIX_GAIN_EDIT_LIMITS +#define EDIT_GAIN_MIN 0.0630957f /* Minimum allowed gain edit with parametric modes: -24 dB */ +#define EDIT_GAIN_MAX 3.9810719f /* Maximum allowed gain edit: +12 dB */ +#endif + typedef enum { TC_BUFFER_MODE_RENDERER, diff --git a/lib_com/options.h b/lib_com/options.h index 934e7552d..e6e1b65c2 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -201,6 +201,7 @@ #define NONBE_1412_AVOID_ROUNDING_AZ_ELEV /* FhG: Avoid rounding when passing azimuth and elevation to efap_determine_gains() */ #define NONBE_FIX_NONBE_BETWEEN_OPTIMIZATION_LEVELS /* FhG: fix non-BE in DFT stereo encoder between optimization levels */ #define NONBE_FIX_NONBE_BETWEEN_OPTIMIZATION_LEVELS_2 /* FhG: fix even more non-BEnesses */ +#define FIX_GAIN_EDIT_LIMITS /* Harmonize gain edit limits for all opertation points. For all modes, limit to max +12dB. For parametric modes, limit to min -24dB. */ // object-editing feature porting #define FIX_HRTF_LOAD_API // solves API conflicts between HRTF and object-editing features diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 57e3ad030..e40a72628 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -1545,13 +1545,35 @@ ivas_error IVAS_DEC_SetEditableParameters( st_ivas->hIsmMetaData[obj]->edited_radius = hIvasEditableParameters.ism_metadata[obj].radius; st_ivas->hIsmMetaData[obj]->edited_yaw = hIvasEditableParameters.ism_metadata[obj].yaw; st_ivas->hIsmMetaData[obj]->edited_pitch = hIvasEditableParameters.ism_metadata[obj].pitch; +#ifdef FIX_GAIN_EDIT_LIMITS + if ( hIvasEditableParameters.ism_metadata[obj].gain > EDIT_GAIN_MAX ) + { + st_ivas->hIsmMetaData[obj]->edited_gain = EDIT_GAIN_MAX; + } + else + { + st_ivas->hIsmMetaData[obj]->edited_gain = hIvasEditableParameters.ism_metadata[obj].gain; + } +#else st_ivas->hIsmMetaData[obj]->edited_gain = hIvasEditableParameters.ism_metadata[obj].gain; +#endif st_ivas->hIsmMetaData[obj]->non_diegetic_flag = hIvasEditableParameters.ism_metadata[obj].non_diegetic_flag; } if ( ism_mode == ISM_SBA_MODE_DISC ) { +#ifdef FIX_GAIN_EDIT_LIMITS + if ( hIvasEditableParameters.gain_bed > EDIT_GAIN_MAX ) + { + st_ivas->hSbaIsmData->gain_bed = EDIT_GAIN_MAX; + } + else + { + st_ivas->hSbaIsmData->gain_bed = hIvasEditableParameters.gain_bed; + } +#else st_ivas->hSbaIsmData->gain_bed = hIvasEditableParameters.gain_bed; +#endif } } else if ( ism_mode == ISM_MODE_PARAM ) @@ -1566,7 +1588,23 @@ ivas_error IVAS_DEC_SetEditableParameters( if ( st_ivas->hMasaIsmData != NULL ) { +#ifdef FIX_GAIN_EDIT_LIMITS + /* Limit gain edit to a range of +12dB to -24dB with parametric ISM mode */ + if ( hIvasEditableParameters.ism_metadata[obj].gain > EDIT_GAIN_MAX ) + { + st_ivas->hMasaIsmData->gain_ism_edited[obj] = EDIT_GAIN_MAX; + } + else if ( hIvasEditableParameters.ism_metadata[obj].gain < EDIT_GAIN_MIN ) + { + st_ivas->hMasaIsmData->gain_ism_edited[obj] = EDIT_GAIN_MIN; + } + else + { + st_ivas->hMasaIsmData->gain_ism_edited[obj] = hIvasEditableParameters.ism_metadata[obj].gain; + } +#else st_ivas->hMasaIsmData->gain_ism_edited[obj] = hIvasEditableParameters.ism_metadata[obj].gain; +#endif /* Detect direction editing in Param-ISM mode */ if ( fabsf( st_ivas->hParamIsmDec->azimuth_values[obj] - hIvasEditableParameters.ism_metadata[obj].azimuth ) > OMASA_AZI_EDIT_THR || @@ -1700,7 +1738,23 @@ ivas_error IVAS_DEC_SetEditableParameters( if ( fabsf( st_ivas->hIsmMetaData[obj]->edited_gain - hIvasEditableParameters.ism_metadata[obj].gain ) > OMASA_GAIN_EDIT_THR ) { st_ivas->hMasaIsmData->ism_gain_is_edited[obj] = 1u; +#ifdef FIX_GAIN_EDIT_LIMITS + /* Limit masa gain edit to a range of +12dB to -infdB with discrete OMASA mode and +12dB to -24dB with parametric OMASA mode */ + if ( hIvasEditableParameters.ism_metadata[obj].gain > EDIT_GAIN_MAX ) + { + st_ivas->hMasaIsmData->gain_ism_edited[obj] = EDIT_GAIN_MAX; + } + else if ( ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ && hIvasEditableParameters.ism_metadata[obj].gain < EDIT_GAIN_MIN ) + { + st_ivas->hMasaIsmData->gain_ism_edited[obj] = EDIT_GAIN_MIN; + } + else + { + st_ivas->hMasaIsmData->gain_ism_edited[obj] = hIvasEditableParameters.ism_metadata[obj].gain; + } +#else st_ivas->hMasaIsmData->gain_ism_edited[obj] = hIvasEditableParameters.ism_metadata[obj].gain; +#endif } else { @@ -1723,14 +1777,45 @@ ivas_error IVAS_DEC_SetEditableParameters( st_ivas->hIsmMetaData[obj]->pitch = hIvasEditableParameters.ism_metadata[obj].pitch; st_ivas->hIsmMetaData[obj]->radius = hIvasEditableParameters.ism_metadata[obj].radius; #endif +#ifdef FIX_GAIN_EDIT_LIMITS + if ( hIvasEditableParameters.ism_metadata[obj].gain > EDIT_GAIN_MAX ) + { + st_ivas->hIsmMetaData[obj]->edited_gain = EDIT_GAIN_MAX; + } + else if ( ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ && hIvasEditableParameters.ism_metadata[obj].gain < EDIT_GAIN_MIN ) + { + st_ivas->hIsmMetaData[obj]->edited_gain = EDIT_GAIN_MIN; + } + else + { + st_ivas->hIsmMetaData[obj]->edited_gain = hIvasEditableParameters.ism_metadata[obj].gain; + } +#else st_ivas->hIsmMetaData[obj]->edited_gain = hIvasEditableParameters.ism_metadata[obj].gain; +#endif st_ivas->hIsmMetaData[obj]->non_diegetic_flag = hIvasEditableParameters.ism_metadata[obj].non_diegetic_flag; } } if ( fabsf( hIvasEditableParameters.gain_bed - 1.0f ) > OMASA_GAIN_EDIT_THR ) { +#ifdef FIX_GAIN_EDIT_LIMITS + /* Limit masa gain edit to a range of +12dB to -infdB with discrete OMASA mode and +12dB to -24dB with parametric OMASA mode */ + if ( hIvasEditableParameters.gain_bed > EDIT_GAIN_MAX ) + { + st_ivas->hMasaIsmData->gain_masa_edited = EDIT_GAIN_MAX; + } + else if ( ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ && hIvasEditableParameters.gain_bed < EDIT_GAIN_MIN ) + { + st_ivas->hMasaIsmData->gain_masa_edited = EDIT_GAIN_MIN; + } + else + { + st_ivas->hMasaIsmData->gain_masa_edited = hIvasEditableParameters.gain_bed; + } +#else st_ivas->hMasaIsmData->gain_masa_edited = hIvasEditableParameters.gain_bed; +#endif st_ivas->hMasaIsmData->masa_gain_is_edited = 1u; } else diff --git a/lib_util/obj_edit_file_reader.h b/lib_util/obj_edit_file_reader.h index 06b92a74d..0d4509a91 100644 --- a/lib_util/obj_edit_file_reader.h +++ b/lib_util/obj_edit_file_reader.h @@ -41,8 +41,13 @@ the United Nations Convention on Contracts on the International Sales of Goods. * Constants ans structures *---------------------------------------------------------------------*/ +#ifdef FIX_GAIN_EDIT_LIMITS +#define OBJ_EDIT_GAIN_MIN 0.0f /* -inf dB */ +#define OBJ_EDIT_GAIN_MAX 3.9810719f /* +12 dB */ +#else #define OBJ_EDIT_GAIN_MIN 0.06309573f /* -24 dB */ #define OBJ_EDIT_GAIN_MAX 15.84893f /* +24 dB */ +#endif typedef struct ObjectEditFileReader ObjectEditFileReader; typedef struct ReadObjectEditInfo ReadObjectEditInfo; -- GitLab