diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index cdee1d8904a6dc687dfdea8ad319f28e92f9d2d1..6b29fb22b1cb1bdcc681a2b6fb3501e44248a723 100644 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -177,6 +177,12 @@ 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 85aedbf8196532c959fbec37df1b0f819e9b63c4..57e0f60e8235f42601137b156b44eb3798410a81 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -194,6 +194,7 @@ #define FIX_1330_JBM_MEMORY_FIX /* VA: basop issue: 2179 fix non-BE difference in FIX_1330_JBM_MEMORY */ #define NONBE_1380_OMASA_BUILD_DIFF /* Nokia: Fix for issue #1380: Large differences in OMASA output between Debug and Release builds */ #define NONBE_FIX_1426_STEREO_PANNING_BETWEEN_OPT_LEVEL /* Nokia: Adjustments in remaining stereo panning functions to make them BE between Debug and Release */ +#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. */ #define FIX_1430_EVS_STEREO_DMX_CHANNEL_DISAPPEARING /* Orange: Fix for basop issue 2184 - to prevent one channel from becoming inaudible in the mono downmix output */ diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index a57fa2d119c9c54310f5bcf060dfe0a518b99f8b..e2b3ce8ff71cdcb4825237146bcfab9d834d9dc4 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -1528,13 +1528,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 ) @@ -1549,7 +1571,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 || @@ -1683,7 +1721,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 { @@ -1699,14 +1753,45 @@ ivas_error IVAS_DEC_SetEditableParameters( 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; +#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 06b92a74d2d4a716e7e1c1f7b4eb7f33145ac53f..edf2fbf4ec79e5429670f0d3b74f93a47a1c7529 100644 --- a/lib_util/obj_edit_file_reader.h +++ b/lib_util/obj_edit_file_reader.h @@ -40,9 +40,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;