From ba1f5355357c0c2bcab341ef5cfe84f932a0a355 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Wed, 28 Aug 2024 20:01:20 +0200 Subject: [PATCH 01/31] patch for introducing static scaling for ParamMC --- lib_com/ivas_rom_com.c | 99 +++++++++++++++++++++++++++++++++++++ lib_com/ivas_stat_com.h | 4 ++ lib_com/options.h | 2 + lib_dec/ivas_jbm_dec.c | 6 +++ lib_dec/ivas_mc_param_dec.c | 6 +++ lib_dec/ivas_stat_dec.h | 3 ++ lib_enc/ivas_mc_param_enc.c | 9 ++++ lib_enc/ivas_stat_enc.h | 3 ++ 8 files changed, 132 insertions(+) diff --git a/lib_com/ivas_rom_com.c b/lib_com/ivas_rom_com.c index 12223badd4..9b7112b184 100644 --- a/lib_com/ivas_rom_com.c +++ b/lib_com/ivas_rom_com.c @@ -1831,18 +1831,30 @@ const int16_t Param_MC_index[MAX_CICP_CHANNELS] = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; +#ifdef NONBE_FIX_1165_STATIC_SCAL_PARAMMC +const float ivas_param_mc_dmx_scal_fac_CICP6_2tc_static = (2.0f + 2.f * INV_SQRT2); +const float ivas_param_mc_dmx_scal_fac_CICP6_2tc_static_inv = 1.f / (2.0f + 2.f * INV_SQRT2); +#endif const float ivas_param_mc_dmx_fac_CICP6_2tc[12] = { 1.0f, 0.0f, INV_SQRT2, INV_SQRT2, 1.0f, 0.0f, /*Lt*/ 0.0f, 1.0f, INV_SQRT2, INV_SQRT2, 0.0f, 1.0f /*Rt*/ }; +#ifdef NONBE_FIX_1165_STATIC_SCAL_PARAMMC +const float ivas_param_mc_dmx_scal_fac_CICP12_2tc_static = (3.0f + 2.f * INV_SQRT2); +const float ivas_param_mc_dmx_scal_fac_CICP12_2tc_static_inv = 1.f / (3.0f + 2.f * INV_SQRT2); +#endif const float ivas_param_mc_dmx_fac_CICP12_2tc[16] = { 1.0f, 0.0f, INV_SQRT2, INV_SQRT2, 1.0f, 0.0f, 1.0f, 0.0f, /*Lt*/ 0.0f, 1.0f, INV_SQRT2, INV_SQRT2, 0.0f, 1.0f, 0.0f, 1.0f /*Rt*/ }; +#ifdef NONBE_FIX_1165_STATIC_SCAL_PARAMMC +const float ivas_param_mc_dmx_scal_fac_CICP12_3tc_static = (3.0f); +const float ivas_param_mc_dmx_scal_fac_CICP12_3tc_static_inv = 1.f / (3.0f); +#endif const float ivas_param_mc_dmx_fac_CICP12_3tc[24] = { 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, /*Lt*/ @@ -1850,11 +1862,20 @@ const float ivas_param_mc_dmx_fac_CICP12_3tc[24] = 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f /*Ct*/ }; +#ifdef NONBE_FIX_1165_STATIC_SCAL_PARAMMC +const float ivas_param_mc_dmx_scal_fac_CICP14_2tc_static = (3.0f + 2.f * INV_SQRT2); +const float ivas_param_mc_dmx_scal_fac_CICP14_2tc_static_inv = 1.f / (3.0f + 2.f * INV_SQRT2); +#endif const float ivas_param_mc_dmx_fac_CICP14_2tc[16] = { 1.0f, 0.0f, INV_SQRT2, INV_SQRT2, 1.0f, 0.0f, 1.0f, 0.0f, /*Lt*/ 0.0f, 1.0f, INV_SQRT2, INV_SQRT2, 0.0f, 1.0f, 0.0f, 1.0f /*Rt*/ }; + +#ifdef NONBE_FIX_1165_STATIC_SCAL_PARAMMC +const float ivas_param_mc_dmx_scal_fac_CICP14_3tc_static = (3.0f); +const float ivas_param_mc_dmx_scal_fac_CICP14_3tc_static_inv = 1.f / (3.0f); +#endif const float ivas_param_mc_dmx_fac_CICP14_3tc[24] = { 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, /*Lt*/ @@ -1862,6 +1883,10 @@ const float ivas_param_mc_dmx_fac_CICP14_3tc[24] = 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, /*Ct*/ }; +#ifdef NONBE_FIX_1165_STATIC_SCAL_PARAMMC +const float ivas_param_mc_dmx_scal_fac_CICP16_3tc_static = (4.0f); +const float ivas_param_mc_dmx_scal_fac_CICP16_3tc_static_inv = 1.f / (4.0f); +#endif const float ivas_param_mc_dmx_fac_CICP16_3tc[30] = { 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, /*Lt*/ @@ -1869,6 +1894,10 @@ const float ivas_param_mc_dmx_fac_CICP16_3tc[30] = 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f /*Ct*/ }; +#ifdef NONBE_FIX_1165_STATIC_SCAL_PARAMMC +const float ivas_param_mc_dmx_scal_fac_CICP19_3tc_static = (5.0); +const float ivas_param_mc_dmx_scal_fac_CICP19_3tc_static_inv = 1.f / (5.0); +#endif const float ivas_param_mc_dmx_fac_CICP19_3tc[36] = { 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, /*Lt*/ @@ -2140,6 +2169,11 @@ const PARAM_MC_CONF ivas_param_mc_conf[PARAM_MC_NUM_CONFIGS] = &ivas_param_mc_icc_mapping_CICP6_2tc, &ivas_param_mc_dmx_fac_CICP6_2tc[0], &ivas_param_mc_ild_fac_CICP6_2tc[0] +#ifdef NONBE_FIX_1165_STATIC_SCAL_PARAMMC + , + ivas_param_mc_dmx_scal_fac_CICP6_2tc_static, + ivas_param_mc_dmx_scal_fac_CICP6_2tc_static_inv +#endif }, /* CICP6 64000 */ { @@ -2151,6 +2185,11 @@ const PARAM_MC_CONF ivas_param_mc_conf[PARAM_MC_NUM_CONFIGS] = &ivas_param_mc_icc_mapping_CICP6_2tc, &ivas_param_mc_dmx_fac_CICP6_2tc[0], &ivas_param_mc_ild_fac_CICP6_2tc[0] +#ifdef NONBE_FIX_1165_STATIC_SCAL_PARAMMC + , + ivas_param_mc_dmx_scal_fac_CICP6_2tc_static, + ivas_param_mc_dmx_scal_fac_CICP6_2tc_static_inv +#endif }, /* CICP6 80000 */ { @@ -2162,6 +2201,11 @@ const PARAM_MC_CONF ivas_param_mc_conf[PARAM_MC_NUM_CONFIGS] = &ivas_param_mc_icc_mapping_CICP6_2tc, &ivas_param_mc_dmx_fac_CICP6_2tc[0], &ivas_param_mc_ild_fac_CICP6_2tc[0] +#ifdef NONBE_FIX_1165_STATIC_SCAL_PARAMMC + , + ivas_param_mc_dmx_scal_fac_CICP6_2tc_static, + ivas_param_mc_dmx_scal_fac_CICP6_2tc_static_inv +#endif }, /* CICP12 48000 */ { @@ -2173,6 +2217,11 @@ const PARAM_MC_CONF ivas_param_mc_conf[PARAM_MC_NUM_CONFIGS] = &ivas_param_mc_icc_mapping_CICP12_2tc, &ivas_param_mc_dmx_fac_CICP12_2tc[0], &ivas_param_mc_ild_fac_CICP12_2tc[0] +#ifdef NONBE_FIX_1165_STATIC_SCAL_PARAMMC + , + ivas_param_mc_dmx_scal_fac_CICP12_2tc_static, + ivas_param_mc_dmx_scal_fac_CICP12_2tc_static_inv +#endif }, /* CICP12 64000 */ { @@ -2184,6 +2233,11 @@ const PARAM_MC_CONF ivas_param_mc_conf[PARAM_MC_NUM_CONFIGS] = &ivas_param_mc_icc_mapping_CICP12_2tc, &ivas_param_mc_dmx_fac_CICP12_2tc[0], &ivas_param_mc_ild_fac_CICP12_2tc[0] +#ifdef NONBE_FIX_1165_STATIC_SCAL_PARAMMC + , + ivas_param_mc_dmx_scal_fac_CICP12_2tc_static, + ivas_param_mc_dmx_scal_fac_CICP12_2tc_static_inv +#endif }, /* CICP12 80000 */ { @@ -2195,6 +2249,11 @@ const PARAM_MC_CONF ivas_param_mc_conf[PARAM_MC_NUM_CONFIGS] = &ivas_param_mc_icc_mapping_CICP12_2tc, &ivas_param_mc_dmx_fac_CICP12_2tc[0], &ivas_param_mc_ild_fac_CICP12_2tc[0] +#ifdef NONBE_FIX_1165_STATIC_SCAL_PARAMMC + , + ivas_param_mc_dmx_scal_fac_CICP12_2tc_static, + ivas_param_mc_dmx_scal_fac_CICP12_2tc_static_inv +#endif }, /* CICP12 96000 */ { @@ -2206,6 +2265,11 @@ const PARAM_MC_CONF ivas_param_mc_conf[PARAM_MC_NUM_CONFIGS] = &ivas_param_mc_icc_mapping_CICP12_3tc, &ivas_param_mc_dmx_fac_CICP12_3tc[0], &ivas_param_mc_ild_fac_CICP12_3tc[0] +#ifdef NONBE_FIX_1165_STATIC_SCAL_PARAMMC + , + ivas_param_mc_dmx_scal_fac_CICP12_3tc_static, + ivas_param_mc_dmx_scal_fac_CICP12_3tc_static_inv +#endif }, /* CICP14 48000 */ { @@ -2217,6 +2281,11 @@ const PARAM_MC_CONF ivas_param_mc_conf[PARAM_MC_NUM_CONFIGS] = &ivas_param_mc_icc_mapping_CICP14_2tc, &ivas_param_mc_dmx_fac_CICP14_2tc[0], &ivas_param_mc_ild_fac_CICP14_2tc[0] +#ifdef NONBE_FIX_1165_STATIC_SCAL_PARAMMC + , + ivas_param_mc_dmx_scal_fac_CICP14_2tc_static, + ivas_param_mc_dmx_scal_fac_CICP14_2tc_static_inv +#endif }, /* CICP14 64000 */ { @@ -2228,6 +2297,11 @@ const PARAM_MC_CONF ivas_param_mc_conf[PARAM_MC_NUM_CONFIGS] = &ivas_param_mc_icc_mapping_CICP14_2tc, &ivas_param_mc_dmx_fac_CICP14_2tc[0], &ivas_param_mc_ild_fac_CICP14_2tc[0] +#ifdef NONBE_FIX_1165_STATIC_SCAL_PARAMMC + , + ivas_param_mc_dmx_scal_fac_CICP14_2tc_static, + ivas_param_mc_dmx_scal_fac_CICP14_2tc_static_inv +#endif }, /* CICP14 80000 */ { @@ -2239,6 +2313,11 @@ const PARAM_MC_CONF ivas_param_mc_conf[PARAM_MC_NUM_CONFIGS] = &ivas_param_mc_icc_mapping_CICP14_2tc, &ivas_param_mc_dmx_fac_CICP14_2tc[0], &ivas_param_mc_ild_fac_CICP14_2tc[0] +#ifdef NONBE_FIX_1165_STATIC_SCAL_PARAMMC + , + ivas_param_mc_dmx_scal_fac_CICP14_2tc_static, + ivas_param_mc_dmx_scal_fac_CICP14_2tc_static_inv +#endif }, /* CICP14 96000 */ { @@ -2250,6 +2329,11 @@ const PARAM_MC_CONF ivas_param_mc_conf[PARAM_MC_NUM_CONFIGS] = &ivas_param_mc_icc_mapping_CICP14_3tc, &ivas_param_mc_dmx_fac_CICP14_3tc[0], &ivas_param_mc_ild_fac_CICP14_3tc[0] +#ifdef NONBE_FIX_1165_STATIC_SCAL_PARAMMC + , + ivas_param_mc_dmx_scal_fac_CICP14_3tc_static, + ivas_param_mc_dmx_scal_fac_CICP14_3tc_static_inv +#endif }, /* CICP16 96000 */ { @@ -2261,6 +2345,11 @@ const PARAM_MC_CONF ivas_param_mc_conf[PARAM_MC_NUM_CONFIGS] = &ivas_param_mc_icc_mapping_CICP16_3tc, &ivas_param_mc_dmx_fac_CICP16_3tc[0], &ivas_param_mc_ild_fac_CICP16_3tc[0] +#ifdef NONBE_FIX_1165_STATIC_SCAL_PARAMMC + , + ivas_param_mc_dmx_scal_fac_CICP16_3tc_static, + ivas_param_mc_dmx_scal_fac_CICP16_3tc_static_inv +#endif }, /* CICP16 128000 */ { @@ -2272,6 +2361,11 @@ const PARAM_MC_CONF ivas_param_mc_conf[PARAM_MC_NUM_CONFIGS] = &ivas_param_mc_icc_mapping_CICP16_3tc, &ivas_param_mc_dmx_fac_CICP16_3tc[0], &ivas_param_mc_ild_fac_CICP16_3tc[0] +#ifdef NONBE_FIX_1165_STATIC_SCAL_PARAMMC + , + ivas_param_mc_dmx_scal_fac_CICP16_3tc_static, + ivas_param_mc_dmx_scal_fac_CICP16_3tc_static_inv +#endif }, /* CICP19 128000 */ { @@ -2283,6 +2377,11 @@ const PARAM_MC_CONF ivas_param_mc_conf[PARAM_MC_NUM_CONFIGS] = &ivas_param_mc_icc_mapping_CICP19_3tc, &ivas_param_mc_dmx_fac_CICP19_3tc[0], &ivas_param_mc_ild_fac_CICP19_3tc[0] +#ifdef NONBE_FIX_1165_STATIC_SCAL_PARAMMC + , + ivas_param_mc_dmx_scal_fac_CICP19_3tc_static, + ivas_param_mc_dmx_scal_fac_CICP19_3tc_static_inv +#endif } }; diff --git a/lib_com/ivas_stat_com.h b/lib_com/ivas_stat_com.h index 23645a77dc..8437bcb332 100644 --- a/lib_com/ivas_stat_com.h +++ b/lib_com/ivas_stat_com.h @@ -575,6 +575,10 @@ typedef struct ivas_param_mc_conf_struct /* structure for ROM Table */ const PARAM_MC_ICC_MAPPING *icc_mapping_conf; const float *dmx_fac; const float *ild_factors; +#ifdef NONBE_FIX_1165_STATIC_SCAL_PARAMMC + float static_dmx_fac; + float static_dmx_fac_inv; +#endif } PARAM_MC_CONF; diff --git a/lib_com/options.h b/lib_com/options.h index 68dbb25b4e..a1257d1b91 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -189,6 +189,8 @@ #define NONE_BE_FIX_816_LFE_PLC_FLOAT /* DLB: issue 816: reduce required precision to float for LFE-PLC*/ +#define NONBE_FIX_1165_STATIC_SCAL_PARAMMC /* FhG: add static scaling to ParamMC DMX */ + /* ##################### End NON-BE switches ########################### */ /* ################## End DEVELOPMENT switches ######################### */ diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index b005723168..559ce9ef4f 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -634,6 +634,12 @@ ivas_error ivas_jbm_dec_tc( hp20( p_output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs ); } +#ifdef NONBE_FIX_1165_STATIC_SCAL_PARAMMC + for ( n = 0; n < st_ivas->nchan_transport; n++ ) + { + v_multc( p_output[n], st_ivas->hParamMC->static_dmx_fac, p_output[n], output_frame ); + } +#endif /* Rendering */ if ( output_config == IVAS_AUDIO_CONFIG_MONO || output_config == IVAS_AUDIO_CONFIG_STEREO ) { diff --git a/lib_dec/ivas_mc_param_dec.c b/lib_dec/ivas_mc_param_dec.c index a9f2c7b26d..ac095abb21 100644 --- a/lib_dec/ivas_mc_param_dec.c +++ b/lib_dec/ivas_mc_param_dec.c @@ -312,6 +312,9 @@ ivas_error ivas_param_mc_dec_open( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); } mvr2r( ivas_param_mc_conf[config_index].dmx_fac, hParamMC->proto_matrix_int, nchan_transport * nchan_out_transport ); +#ifdef NONBE_FIX_1165_STATIC_SCAL_PARAMMC + hParamMC->static_dmx_fac = ivas_param_mc_conf[config_index].static_dmx_fac; +#endif if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_COV || hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) { @@ -763,6 +766,9 @@ ivas_error ivas_param_mc_dec_reconfig( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC\n" ) ); } mvr2r( ivas_param_mc_conf[config_index].dmx_fac, hParamMC->proto_matrix_int, nchan_transport * nchan_out_transport ); +#ifdef NONBE_FIX_1165_STATIC_SCAL_PARAMMC + hParamMC->static_dmx_fac = ivas_param_mc_conf[config_index].static_dmx_fac; +#endif } if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_COV || hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index b100848685..8656bb9165 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -529,6 +529,9 @@ typedef struct ivas_param_mc_dec_data_structure int16_t max_param_band_abs_cov; float *ls_conv_dmx_matrix; float *proto_matrix_int; +#ifdef NONBE_FIX_1165_STATIC_SCAL_PARAMMC + float static_dmx_fac; +#endif /*sub-modules*/ HANDLE_DIRAC_DECORR_PARAMS h_freq_domain_decorr_ap_params; diff --git a/lib_enc/ivas_mc_param_enc.c b/lib_enc/ivas_mc_param_enc.c index 4269103937..3390c6d739 100644 --- a/lib_enc/ivas_mc_param_enc.c +++ b/lib_enc/ivas_mc_param_enc.c @@ -136,6 +136,9 @@ ivas_error ivas_param_mc_enc_open( /* get dmx factors */ hParamMC->dmx_factors = ivas_param_mc_conf[config_index].dmx_fac; +#ifdef NONBE_FIX_1165_STATIC_SCAL_PARAMMC + hParamMC->static_dmx_fac_inv = ivas_param_mc_conf[config_index].static_dmx_fac_inv; +#endif /* set FB config. */ if ( ( error = ivas_fb_set_cfg( &fb_cfg, MC_FORMAT, nchan_inp, 0, 0, input_Fs, 0 ) ) != IVAS_ERR_OK ) @@ -260,6 +263,9 @@ ivas_error ivas_param_mc_enc_reconfig( /* get dmx factors */ hParamMC->dmx_factors = ivas_param_mc_conf[config_index].dmx_fac; +#ifdef NONBE_FIX_1165_STATIC_SCAL_PARAMMC + hParamMC->static_dmx_fac_inv = ivas_param_mc_conf[config_index].static_dmx_fac_inv; +#endif /* open/init parameter coding */ ivas_param_mc_metadata_open( mc_input_setup, ivas_total_brate, &hParamMC->hMetadataPMC ); @@ -538,6 +544,9 @@ static void ivas_param_mc_dmx( { ( *dmx_sample ) += data_f[idx[inp_ch]][i] * ( *( p_dmx_fac++ ) ); } +#ifdef NONBE_FIX_1165_STATIC_SCAL_PARAMMC + *dmx_sample *= hParamMC->static_dmx_fac_inv; +#endif } } diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index 3962ac055f..6745c6d1b4 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -723,6 +723,9 @@ typedef struct ivas_param_mc_enc_data_structure IVAS_FB_MIXER_HANDLE hFbMixer; int16_t transient_detector_delay; const float *dmx_factors; +#ifdef NONBE_FIX_1165_STATIC_SCAL_PARAMMC + float static_dmx_fac_inv; +#endif /* Multichannel Specific Parameters */ IVAS_PARAM_MC_METADATA hMetadataPMC; -- GitLab From acfc43769da06a31e4c5a42477e527344a7bf7dc Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Thu, 29 Aug 2024 10:34:25 +0200 Subject: [PATCH 02/31] fix compilation on some platforms --- lib_com/ivas_rom_com.c | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/lib_com/ivas_rom_com.c b/lib_com/ivas_rom_com.c index 9b7112b184..47279dccc5 100644 --- a/lib_com/ivas_rom_com.c +++ b/lib_com/ivas_rom_com.c @@ -1832,8 +1832,8 @@ const int16_t Param_MC_index[MAX_CICP_CHANNELS] = }; #ifdef NONBE_FIX_1165_STATIC_SCAL_PARAMMC -const float ivas_param_mc_dmx_scal_fac_CICP6_2tc_static = (2.0f + 2.f * INV_SQRT2); -const float ivas_param_mc_dmx_scal_fac_CICP6_2tc_static_inv = 1.f / (2.0f + 2.f * INV_SQRT2); +#define ivas_param_mc_dmx_scal_fac_CICP6_2tc_static (2.0f + 2.f * INV_SQRT2) +#define ivas_param_mc_dmx_scal_fac_CICP6_2tc_static_inv (1.f / ivas_param_mc_dmx_scal_fac_CICP6_2tc_static) #endif const float ivas_param_mc_dmx_fac_CICP6_2tc[12] = { @@ -1842,8 +1842,8 @@ const float ivas_param_mc_dmx_fac_CICP6_2tc[12] = }; #ifdef NONBE_FIX_1165_STATIC_SCAL_PARAMMC -const float ivas_param_mc_dmx_scal_fac_CICP12_2tc_static = (3.0f + 2.f * INV_SQRT2); -const float ivas_param_mc_dmx_scal_fac_CICP12_2tc_static_inv = 1.f / (3.0f + 2.f * INV_SQRT2); +#define ivas_param_mc_dmx_scal_fac_CICP12_2tc_static (3.0f + 2.f * INV_SQRT2) +#define ivas_param_mc_dmx_scal_fac_CICP12_2tc_static_inv (1.f / ivas_param_mc_dmx_scal_fac_CICP12_2tc_static) #endif const float ivas_param_mc_dmx_fac_CICP12_2tc[16] = { @@ -1852,8 +1852,8 @@ const float ivas_param_mc_dmx_fac_CICP12_2tc[16] = }; #ifdef NONBE_FIX_1165_STATIC_SCAL_PARAMMC -const float ivas_param_mc_dmx_scal_fac_CICP12_3tc_static = (3.0f); -const float ivas_param_mc_dmx_scal_fac_CICP12_3tc_static_inv = 1.f / (3.0f); +#define ivas_param_mc_dmx_scal_fac_CICP12_3tc_static (3.0f) +#define ivas_param_mc_dmx_scal_fac_CICP12_3tc_static_inv (1.f / ivas_param_mc_dmx_scal_fac_CICP12_3tc_static) #endif const float ivas_param_mc_dmx_fac_CICP12_3tc[24] = { @@ -1863,8 +1863,8 @@ const float ivas_param_mc_dmx_fac_CICP12_3tc[24] = }; #ifdef NONBE_FIX_1165_STATIC_SCAL_PARAMMC -const float ivas_param_mc_dmx_scal_fac_CICP14_2tc_static = (3.0f + 2.f * INV_SQRT2); -const float ivas_param_mc_dmx_scal_fac_CICP14_2tc_static_inv = 1.f / (3.0f + 2.f * INV_SQRT2); +#define ivas_param_mc_dmx_scal_fac_CICP14_2tc_static (3.0f + 2.f * INV_SQRT2) +#define ivas_param_mc_dmx_scal_fac_CICP14_2tc_static_inv (1.f / ivas_param_mc_dmx_scal_fac_CICP14_2tc_static) #endif const float ivas_param_mc_dmx_fac_CICP14_2tc[16] = { @@ -1873,8 +1873,8 @@ const float ivas_param_mc_dmx_fac_CICP14_2tc[16] = }; #ifdef NONBE_FIX_1165_STATIC_SCAL_PARAMMC -const float ivas_param_mc_dmx_scal_fac_CICP14_3tc_static = (3.0f); -const float ivas_param_mc_dmx_scal_fac_CICP14_3tc_static_inv = 1.f / (3.0f); +#define ivas_param_mc_dmx_scal_fac_CICP14_3tc_static (3.0f) +#define ivas_param_mc_dmx_scal_fac_CICP14_3tc_static_inv (1.f / ivas_param_mc_dmx_scal_fac_CICP14_3tc_static) #endif const float ivas_param_mc_dmx_fac_CICP14_3tc[24] = { @@ -1884,8 +1884,8 @@ const float ivas_param_mc_dmx_fac_CICP14_3tc[24] = }; #ifdef NONBE_FIX_1165_STATIC_SCAL_PARAMMC -const float ivas_param_mc_dmx_scal_fac_CICP16_3tc_static = (4.0f); -const float ivas_param_mc_dmx_scal_fac_CICP16_3tc_static_inv = 1.f / (4.0f); +#define ivas_param_mc_dmx_scal_fac_CICP16_3tc_static (4.0f) +#define ivas_param_mc_dmx_scal_fac_CICP16_3tc_static_inv (1.f / ivas_param_mc_dmx_scal_fac_CICP16_3tc_static) #endif const float ivas_param_mc_dmx_fac_CICP16_3tc[30] = { @@ -1895,8 +1895,8 @@ const float ivas_param_mc_dmx_fac_CICP16_3tc[30] = }; #ifdef NONBE_FIX_1165_STATIC_SCAL_PARAMMC -const float ivas_param_mc_dmx_scal_fac_CICP19_3tc_static = (5.0); -const float ivas_param_mc_dmx_scal_fac_CICP19_3tc_static_inv = 1.f / (5.0); +#define ivas_param_mc_dmx_scal_fac_CICP19_3tc_static (5.0f) +#define ivas_param_mc_dmx_scal_fac_CICP19_3tc_static_inv (1.f / ivas_param_mc_dmx_scal_fac_CICP19_3tc_static) #endif const float ivas_param_mc_dmx_fac_CICP19_3tc[36] = { -- GitLab From be3b00f0bcf492679107ea19e47972676673291e Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Thu, 5 Sep 2024 14:18:06 +0300 Subject: [PATCH 03/31] Implements downmix gain scaling and reversion for McMASA and OMASA. --- lib_com/ivas_cnst.h | 62 +++++++++++++++++++++++++++ lib_com/ivas_prot.h | 16 +++++++ lib_com/options.h | 3 ++ lib_dec/ivas_jbm_dec.c | 23 ++++++++++ lib_dec/ivas_mcmasa_dec.c | 82 ++++++++++++++++++++++++++++++++++++ lib_dec/ivas_omasa_dec.c | 63 ++++++++++++++++++++++++++++ lib_enc/ivas_mcmasa_enc.c | 88 +++++++++++++++++++++++++++++++++++++++ lib_enc/ivas_omasa_enc.c | 75 +++++++++++++++++++++++++++++++++ 8 files changed, 412 insertions(+) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 4e5d9d8ae5..0f08d45144 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -1776,6 +1776,68 @@ typedef enum } STEREO_DMX_EVS_PRC; +#endif + + +/*----------------------------------------------------------------------------------* + * Static downmix scaling factors + *----------------------------------------------------------------------------------*/ + +#ifdef NONBE_FIX_1165_STATIC_SCAL_MCMASA +/* McMASA */ +/* 5.1 */ +#define ivas_mcmasa_dmx_scal_fac_CICP6_1tc_static ( 2.44948983f ) +#define ivas_mcmasa_dmx_scal_fac_CICP6_1tc_static_inv ( 1.0f / ivas_mcmasa_dmx_scal_fac_CICP6_1tc_static ) + +/* 7.1 */ +#define ivas_mcmasa_dmx_scal_fac_CICP12_1tc_static ( 2.82842708f ) +#define ivas_mcmasa_dmx_scal_fac_CICP12_1tc_static_inv ( 1.0f / ivas_mcmasa_dmx_scal_fac_CICP12_1tc_static ) + +/* 5.1+2 */ +#define ivas_mcmasa_dmx_scal_fac_CICP14_1tc_static ( 2.82842708f ) +#define ivas_mcmasa_dmx_scal_fac_CICP14_1tc_static_inv ( 1.0f / ivas_mcmasa_dmx_scal_fac_CICP14_1tc_static ) + +/* 5.1+4 */ +#define ivas_mcmasa_dmx_scal_fac_CICP16_1tc_static ( 3.1622777f ) +#define ivas_mcmasa_dmx_scal_fac_CICP16_1tc_static_inv ( 1.0f / ivas_mcmasa_dmx_scal_fac_CICP16_1tc_static ) + +#define ivas_mcmasa_dmx_scal_fac_CICP16_2tc_static ( 2.44948983f ) +#define ivas_mcmasa_dmx_scal_fac_CICP16_2tc_static_inv ( 1.0f / ivas_mcmasa_dmx_scal_fac_CICP16_2tc_static ) + +#define ivas_mcmasa_dmx_scal_fac_CICP16_3tc_static ( 2.0f ) +#define ivas_mcmasa_dmx_scal_fac_CICP16_3tc_static_inv ( 1.0f / ivas_mcmasa_dmx_scal_fac_CICP16_3tc_static ) + +/* 7.1+4 */ +#define ivas_mcmasa_dmx_scal_fac_CICP19_1tc_static ( 3.46410155f ) +#define ivas_mcmasa_dmx_scal_fac_CICP19_1tc_static_inv ( 1.0f / ivas_mcmasa_dmx_scal_fac_CICP19_1tc_static ) + +#define ivas_mcmasa_dmx_scal_fac_CICP19_2tc_static ( 2.64575124f ) +#define ivas_mcmasa_dmx_scal_fac_CICP19_2tc_static_inv ( 1.0f / ivas_mcmasa_dmx_scal_fac_CICP19_2tc_static ) + +#define ivas_mcmasa_dmx_scal_fac_CICP19_3tc_static ( 2.23606801f ) +#define ivas_mcmasa_dmx_scal_fac_CICP19_3tc_static_inv ( 1.0f / ivas_mcmasa_dmx_scal_fac_CICP19_3tc_static ) + +/* Separated channel */ +#define ivas_mcmasa_dmx_scal_fac_sep_chan_static ( 2.0f ) +#define ivas_mcmasa_dmx_scal_fac_sep_chan_static_inv ( 1.0f / ivas_mcmasa_dmx_scal_fac_sep_chan_static ) + +#endif + +#ifdef NONBE_FIX_1165_STATIC_SCAL_OMASA +/* OMASA */ +/* Approximates that 2 channels sum coherently and rest are incoherent */ +#define ivas_omasa_dmx_scal_fac_2ch_static ( 2.0f ) +#define ivas_omasa_dmx_scal_fac_2ch_static_inv ( 1.0f / ivas_omasa_dmx_scal_fac_2ch_static ) + +#define ivas_omasa_dmx_scal_fac_3ch_static ( 2.23606801f ) +#define ivas_omasa_dmx_scal_fac_3ch_static_inv ( 1.0f / ivas_omasa_dmx_scal_fac_3ch_static ) + +#define ivas_omasa_dmx_scal_fac_4ch_static ( 2.44948983f ) +#define ivas_omasa_dmx_scal_fac_4ch_static_inv ( 1.0f / ivas_omasa_dmx_scal_fac_4ch_static ) + +#define ivas_omasa_dmx_scal_fac_5ch_static ( 2.64575124f ) +#define ivas_omasa_dmx_scal_fac_5ch_static_inv ( 1.0f / ivas_omasa_dmx_scal_fac_5ch_static ) + #endif /* clang-format on */ /* IVAS_CNST_H */ diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 10d35eab49..1199a02edc 100755 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -5362,6 +5362,14 @@ ivas_error ivas_mcmasa_dec_reconfig( Decoder_Struct *st_ivas /* i/o: IVAS decoder handle */ ); +#ifdef NONBE_FIX_1165_STATIC_SCAL_MCMASA +void ivas_mcmasa_gain_umx( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float *data_f[], /* i/o: output signals */ + const int16_t output_frame /* i : output frame length per channel */ +); + +#endif void ivas_mcmasa_setNumTransportChannels( int16_t* nchan_transport, /* o : Pointer to number of transport channels to be set */ int16_t* element_mode, /* o : Pointer to element mode to be set */ @@ -5858,6 +5866,14 @@ void ivas_omasa_modify_masa_energy_ratios( float masa_to_total_energy_ratio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_MAXIMUM_CODING_SUBBANDS] ); +#ifdef NONBE_FIX_1165_STATIC_SCAL_OMASA +void ivas_omasa_gain_umx( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float *data_f[], /* i/o: output signals */ + const int16_t output_frame /* i : output frame length per channel */ +); + +#endif /*----------------------------------------------------------------------------------* * TD Binaural Object renderer diff --git a/lib_com/options.h b/lib_com/options.h index db55475d1a..ebf52a4370 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -195,6 +195,9 @@ #define NONE_BE_FIX_816_LFE_PLC_FLOAT /* DLB: issue 816: reduce required precision to float for LFE-PLC*/ #define NONBE_FIX_1220_OMASA_JBM_EXT_USAN /* Nokia: fix issue 1220 OMASA EXT JBM USAN, also fix similar cases of free to avoid future problems */ +#define NONBE_FIX_1165_STATIC_SCAL_MCMASA /* Nok: add static scaling to McMASA DMX */ +#define NONBE_FIX_1165_STATIC_SCAL_OMASA /* Nok: add static scaling to OMASA DMX */ + #define NONBE_FIX_1165_STATIC_SCAL_PARAMMC /* FhG: add static scaling to ParamMC DMX */ diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 48f48eb820..879ecee5fc 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -308,6 +308,14 @@ ivas_error ivas_jbm_dec_tc( if ( st_ivas->ivas_format == MASA_FORMAT ) { +#ifdef NONBE_FIX_1165_STATIC_SCAL_OMASA + if ( st_ivas->hMasa->config.input_ivas_format == MASA_ISM_FORMAT ) + { + /* Revert scaling done to the downmix in the encoder */ + ivas_omasa_gain_umx( st_ivas, p_output, output_frame ); + } + +#endif ivas_masa_prerender( st_ivas, p_output, output_frame, nchan_remapped ); /* external output */ @@ -390,6 +398,11 @@ ivas_error ivas_jbm_dec_tc( hp20( p_output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs ); } +#ifdef NONBE_FIX_1165_STATIC_SCAL_OMASA + /* Revert scaling done to the downmix in the encoder */ + ivas_omasa_gain_umx( st_ivas, p_output, output_frame ); + +#endif if ( st_ivas->renderer_type == RENDERER_MONO_DOWNMIX ) { ivas_ism_mono_dmx( st_ivas, p_output, output_frame ); @@ -682,6 +695,11 @@ ivas_error ivas_jbm_dec_tc( return error; } +#ifdef NONBE_FIX_1165_STATIC_SCAL_MCMASA + /* Revert scaling done to the downmix in the encoder */ + ivas_mcmasa_gain_umx( st_ivas, p_output, output_frame ); + +#endif /* Delay the separated channel to sync with CLDFB delay of the DirAC synthesis, and synthesize the LFE signal. */ if ( output_config == IVAS_AUDIO_CONFIG_5_1 || output_config == IVAS_AUDIO_CONFIG_7_1 || output_config == IVAS_AUDIO_CONFIG_5_1_4 || output_config == IVAS_AUDIO_CONFIG_7_1_4 || @@ -711,6 +729,11 @@ ivas_error ivas_jbm_dec_tc( return error; } } + +#ifdef NONBE_FIX_1165_STATIC_SCAL_MCMASA + /* Revert scaling done to the downmix in the encoder */ + ivas_mcmasa_gain_umx( st_ivas, p_output, output_frame ); +#endif } if ( st_ivas->sba_dirac_stereo_flag ) /* use the flag to trigger the DFT upmix */ diff --git a/lib_dec/ivas_mcmasa_dec.c b/lib_dec/ivas_mcmasa_dec.c index e66eb5d24d..7b1632213f 100755 --- a/lib_dec/ivas_mcmasa_dec.c +++ b/lib_dec/ivas_mcmasa_dec.c @@ -98,3 +98,85 @@ ivas_error ivas_mcmasa_dec_reconfig( return error; } + +#ifdef NONBE_FIX_1165_STATIC_SCAL_MCMASA + +/* Gain decoded signals to match the gains applied to the downmix signals in the encoder */ +void ivas_mcmasa_gain_umx( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float *data_f[], /* i/o: output signals */ + const int16_t output_frame /* i : output frame length per channel */ +) +{ + float gain; + int16_t nchan_transport; + uint8_t separateChannelEnabled; + + nchan_transport = st_ivas->nchan_transport; + separateChannelEnabled = st_ivas->hOutSetup.separateChannelEnabled; + gain = 1.0f; + + if ( separateChannelEnabled ) + { + /* Separate channel gaining */ + v_multc( data_f[2], ivas_mcmasa_dmx_scal_fac_sep_chan_static, data_f[2], output_frame ); + + /* Downmix channels gaining */ + if ( st_ivas->transport_config == IVAS_AUDIO_CONFIG_5_1_4 ) + { + gain = ivas_mcmasa_dmx_scal_fac_CICP16_3tc_static; + } + else if ( st_ivas->transport_config == IVAS_AUDIO_CONFIG_7_1_4 ) + { + gain = ivas_mcmasa_dmx_scal_fac_CICP19_3tc_static; + } + + v_multc( data_f[0], gain, data_f[0], output_frame ); + v_multc( data_f[1], gain, data_f[1], output_frame ); + } + else + { + if ( nchan_transport == 2 ) + { + if ( st_ivas->transport_config == IVAS_AUDIO_CONFIG_5_1_4 ) + { + gain = ivas_mcmasa_dmx_scal_fac_CICP16_2tc_static; + } + else if ( st_ivas->transport_config == IVAS_AUDIO_CONFIG_7_1_4 ) + { + gain = ivas_mcmasa_dmx_scal_fac_CICP19_2tc_static; + } + + v_multc( data_f[0], gain, data_f[0], output_frame ); + v_multc( data_f[1], gain, data_f[1], output_frame ); + } + else + { + if ( st_ivas->transport_config == IVAS_AUDIO_CONFIG_5_1 ) + { + gain = ivas_mcmasa_dmx_scal_fac_CICP6_1tc_static; + } + else if ( st_ivas->transport_config == IVAS_AUDIO_CONFIG_7_1 ) + { + gain = ivas_mcmasa_dmx_scal_fac_CICP12_1tc_static; + } + else if ( st_ivas->transport_config == IVAS_AUDIO_CONFIG_5_1_2 ) + { + gain = ivas_mcmasa_dmx_scal_fac_CICP14_1tc_static; + } + else if ( st_ivas->transport_config == IVAS_AUDIO_CONFIG_5_1_4 ) + { + gain = ivas_mcmasa_dmx_scal_fac_CICP16_1tc_static; + } + else if ( st_ivas->transport_config == IVAS_AUDIO_CONFIG_7_1_4 ) + { + gain = ivas_mcmasa_dmx_scal_fac_CICP19_1tc_static; + } + + v_multc( data_f[0], gain, data_f[0], output_frame ); + } + } + + return; +} +#endif diff --git a/lib_dec/ivas_omasa_dec.c b/lib_dec/ivas_omasa_dec.c index c38f9bc174..2ae871e323 100644 --- a/lib_dec/ivas_omasa_dec.c +++ b/lib_dec/ivas_omasa_dec.c @@ -1424,3 +1424,66 @@ void ivas_omasa_render_objects_from_mix( return; } + +#ifdef NONBE_FIX_1165_STATIC_SCAL_OMASA +/* Gain decoded signals to match the gains applied to the downmix signals in the encoder */ +void ivas_omasa_gain_umx( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float *data_f[], /* i/o: output signals */ + const int16_t output_frame /* i : output frame length per channel */ +) +{ + float gain; + int16_t nchan_ism; + + nchan_ism = st_ivas->nchan_ism; + gain = 1.0f; + + if ( st_ivas->ivas_format == MASA_FORMAT && st_ivas->hMasa->config.input_ivas_format == MASA_ISM_FORMAT ) + { + /* Full downmix mode */ + if ( nchan_ism == 1 ) + { + gain = ivas_omasa_dmx_scal_fac_2ch_static; + } + else if ( nchan_ism == 2 ) + { + gain = ivas_omasa_dmx_scal_fac_3ch_static; + } + else if ( nchan_ism == 3 ) + { + gain = ivas_omasa_dmx_scal_fac_4ch_static; + } + else if ( nchan_ism == 4 ) + { + gain = ivas_omasa_dmx_scal_fac_5ch_static; + } + } + else if ( st_ivas->ivas_format == MASA_ISM_FORMAT && ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) ) + { + /* One separated object + downmix mode */ + if ( nchan_ism == 2 ) + { + gain = ivas_omasa_dmx_scal_fac_2ch_static; + } + else if ( nchan_ism == 3 ) + { + gain = ivas_omasa_dmx_scal_fac_3ch_static; + } + else if ( nchan_ism == 4 ) + { + gain = ivas_omasa_dmx_scal_fac_4ch_static; + } + } + else + { + /* Skip gain */ + return; + } + + v_multc( data_f[0], gain, data_f[0], output_frame ); + v_multc( data_f[1], gain, data_f[1], output_frame ); + + return; +} +#endif diff --git a/lib_enc/ivas_mcmasa_enc.c b/lib_enc/ivas_mcmasa_enc.c index a08dcea74d..c7d4c41261 100644 --- a/lib_enc/ivas_mcmasa_enc.c +++ b/lib_enc/ivas_mcmasa_enc.c @@ -67,6 +67,10 @@ typedef struct static void ivas_mcmasa_dmx( MCMASA_ENC_HANDLE hMcMasa, float *data_f[], const int16_t input_frame, const int16_t nchan_transport, const int16_t nchan_inp ); +#ifdef NONBE_FIX_1165_STATIC_SCAL_MCMASA +static void ivas_mcmasa_gain_dmx( MCMASA_ENC_HANDLE hMcMasa, float *data_f[], const int16_t input_frame, const int16_t nchan_transport, const MC_LS_SETUP mc_ls_setup ); + +#endif static void compute_cov_mtx( float sr[MCMASA_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], float si[MCMASA_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], const int16_t freq, const int16_t N, CovarianceMatrix *COVls ); static void computeIntensityVector_enc( const int16_t *band_grouping, float Cldfb_RealBuffer[FOA_CHANNELS][DIRAC_NO_FB_BANDS_MAX], float Cldfb_ImagBuffer[FOA_CHANNELS][DIRAC_NO_FB_BANDS_MAX], const int16_t enc_param_start_band, const int16_t num_frequency_bands, float intensity_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS] ); @@ -666,6 +670,11 @@ void ivas_mcmasa_enc( mvr2r( separatedChannelSignal, data_f[2], input_frame ); } +#ifdef NONBE_FIX_1165_STATIC_SCAL_MCMASA + /* Apply gains to prevent clipping of downmix signals */ + ivas_mcmasa_gain_dmx( hMcMasa, data_f, input_frame, nchan_transport, hQMeta->q_direction->cfg.mc_ls_setup ); + +#endif /* Update mcMASA-relevant coding parameters */ /* These are reset to default values as they may be modified during later processing. */ hMasa->config.joinedSubframes = FALSE; @@ -1427,6 +1436,85 @@ static void ivas_mcmasa_dmx( return; } +#ifdef NONBE_FIX_1165_STATIC_SCAL_MCMASA + +/* Gain downmix signals to prevent clipping */ +static void ivas_mcmasa_gain_dmx( + MCMASA_ENC_HANDLE hMcMasa, + float *data_f[], + const int16_t input_frame, + const int16_t nchan_transport, + const MC_LS_SETUP mc_ls_setup ) +{ + float gain; + + gain = 1.0f; + + if ( hMcMasa->separateChannelEnabled ) + { + /* Separate channel gaining */ + v_multc( data_f[2], ivas_mcmasa_dmx_scal_fac_sep_chan_static_inv, data_f[2], input_frame ); + + /* Downmix channels gaining */ + if ( mc_ls_setup == MC_LS_SETUP_5_1_4 ) + { + gain = ivas_mcmasa_dmx_scal_fac_CICP16_3tc_static_inv; + } + else if ( mc_ls_setup == MC_LS_SETUP_7_1_4 ) + { + gain = ivas_mcmasa_dmx_scal_fac_CICP19_3tc_static_inv; + } + + v_multc( data_f[0], gain, data_f[0], input_frame ); + v_multc( data_f[1], gain, data_f[1], input_frame ); + } + else + { + if ( nchan_transport == 2 ) + { + if ( mc_ls_setup == MC_LS_SETUP_5_1_4 ) + { + gain = ivas_mcmasa_dmx_scal_fac_CICP16_2tc_static_inv; + } + else if ( mc_ls_setup == MC_LS_SETUP_7_1_4 ) + { + gain = ivas_mcmasa_dmx_scal_fac_CICP19_2tc_static_inv; + } + + v_multc( data_f[0], gain, data_f[0], input_frame ); + v_multc( data_f[1], gain, data_f[1], input_frame ); + } + else + { + if ( mc_ls_setup == MC_LS_SETUP_5_1 ) + { + gain = ivas_mcmasa_dmx_scal_fac_CICP6_1tc_static_inv; + } + else if ( mc_ls_setup == MC_LS_SETUP_7_1 ) + { + gain = ivas_mcmasa_dmx_scal_fac_CICP12_1tc_static_inv; + } + else if ( mc_ls_setup == MC_LS_SETUP_5_1_2 ) + { + gain = ivas_mcmasa_dmx_scal_fac_CICP14_1tc_static_inv; + } + else if ( mc_ls_setup == MC_LS_SETUP_5_1_4 ) + { + gain = ivas_mcmasa_dmx_scal_fac_CICP16_1tc_static_inv; + } + else if ( mc_ls_setup == MC_LS_SETUP_7_1_4 ) + { + gain = ivas_mcmasa_dmx_scal_fac_CICP19_1tc_static_inv; + } + + v_multc( data_f[0], gain, data_f[0], input_frame ); + } + } + + return; +} + +#endif /* Compute covariance matrix, i.e., xT * conj(x), and accumulate to the output */ static void compute_cov_mtx( diff --git a/lib_enc/ivas_omasa_enc.c b/lib_enc/ivas_omasa_enc.c index 4e184d59a5..564f16dc35 100644 --- a/lib_enc/ivas_omasa_enc.c +++ b/lib_enc/ivas_omasa_enc.c @@ -65,6 +65,11 @@ static void computeIntensityVector_enc( const int16_t *band_grouping, float Cldf static void computeReferencePower_omasa( const int16_t *band_grouping, float Cldfb_RealBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], float Cldfb_ImagBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], float *reference_power, const int16_t enc_param_start_band, const int16_t num_freq_bands ); +#ifdef NONBE_FIX_1165_STATIC_SCAL_OMASA +static void ivas_omasa_gain_dmx( ISM_MODE ism_mode, float *data_f[], const int16_t nchan_transport, const int16_t nchan_ism, const int16_t input_frame ); + +#endif + /*--------------------------------------------------------------------------* * ivas_omasa_enc_open() * @@ -631,6 +636,11 @@ void ivas_omasa_enc( /* Merge transport signals */ ivas_merge_masa_transports( data_out_f, &( data_in_f[nchan_ism] ), data_in_f, input_frame, nchan_transport ); +#ifdef NONBE_FIX_1165_STATIC_SCAL_OMASA + /* Apply scaling gain */ + ivas_omasa_gain_dmx( ism_mode, data_in_f, nchan_transport, nchan_ism, input_frame ); + +#endif return; } @@ -1238,3 +1248,68 @@ static void computeReferencePower_omasa( return; } + +#ifdef NONBE_FIX_1165_STATIC_SCAL_OMASA +/* Gain downmix signals to prevent clipping */ +static void ivas_omasa_gain_dmx( + ISM_MODE ism_mode, + float *data_f[], + const int16_t nchan_transport, + const int16_t nchan_ism, + const int16_t input_frame ) +{ + int16_t ch; + float gain; + + gain = 1.0f; + + if ( ism_mode == ISM_MODE_NONE ) + { + /* Full downmix mode. */ + if ( nchan_ism == 1 ) + { + gain = ivas_omasa_dmx_scal_fac_2ch_static_inv; + } + else if ( nchan_ism == 2 ) + { + gain = ivas_omasa_dmx_scal_fac_3ch_static_inv; + } + else if ( nchan_ism == 3 ) + { + gain = ivas_omasa_dmx_scal_fac_4ch_static_inv; + } + else if ( nchan_ism == 4 ) + { + gain = ivas_omasa_dmx_scal_fac_5ch_static_inv; + } + } + else if ( ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) + { + /* One separated object + downmix mode. */ + if ( nchan_ism == 2 ) + { + gain = ivas_omasa_dmx_scal_fac_2ch_static_inv; + } + else if ( nchan_ism == 3 ) + { + gain = ivas_omasa_dmx_scal_fac_3ch_static_inv; + } + else if ( nchan_ism == 4 ) + { + gain = ivas_omasa_dmx_scal_fac_4ch_static_inv; + } + } + else + { + /* Skip gain */ + return; + } + + for ( ch = 0; ch < nchan_transport; ch++ ) + { + v_multc( data_f[ch], gain, data_f[ch], input_frame ); + } + + return; +} +#endif -- GitLab From 449148c72fa3525fc6b61a4c515d03bc3da131b8 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Wed, 11 Sep 2024 11:28:15 +0200 Subject: [PATCH 04/31] add limiter on dmx for param MC --- lib_com/ivas_limiter.c | 11 +++++++++++ lib_com/ivas_prot.h | 4 ++++ lib_com/ivas_stat_com.h | 25 +++++++++++++++++++++++++ lib_com/options.h | 1 + lib_dec/ivas_jbm_dec.c | 8 ++++++++ lib_dec/lib_dec.c | 8 ++++++++ lib_enc/ivas_enc.c | 11 +++++++++++ lib_enc/ivas_init_enc.c | 18 ++++++++++++++++++ lib_enc/ivas_stat_enc.h | 5 +++++ lib_rend/ivas_stat_rend.h | 3 ++- 10 files changed, 93 insertions(+), 1 deletion(-) diff --git a/lib_com/ivas_limiter.c b/lib_com/ivas_limiter.c index 657e41683f..1e20578d6c 100644 --- a/lib_com/ivas_limiter.c +++ b/lib_com/ivas_limiter.c @@ -170,6 +170,16 @@ void ivas_limiter_close( } +#ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX +/*-------------------------------------------------------------------* + * ivas_limiter_apply() + * + * In-place saturation control for multichannel buffers with adaptive + * release time and special handling of bit errors + *-------------------------------------------------------------------*/ + +void ivas_limiter_apply( +#else /*-------------------------------------------------------------------* * ivas_limiter_dec() * @@ -178,6 +188,7 @@ void ivas_limiter_close( *-------------------------------------------------------------------*/ void ivas_limiter_dec( +#endif IVAS_LIMITER_HANDLE hLimiter, /* i/o: limiter struct handle */ float *output[MAX_OUTPUT_CHANNELS], /* i/o: input/output buffer */ const int16_t num_channels, /* i : number of channels to be processed */ diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 1199a02edc..a37ed0a935 100755 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -6001,7 +6001,11 @@ void ivas_limiter_close( IVAS_LIMITER_HANDLE* phLimiter /* i/o: pointer to limiter handle, can be NULL */ ); +#ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX +void ivas_limiter_apply +#else void ivas_limiter_dec +#endif ( IVAS_LIMITER_HANDLE hLimiter, /* i/o: limiter struct handle */ float *output[MAX_OUTPUT_CHANNELS], /* i/o: input/output buffer */ diff --git a/lib_com/ivas_stat_com.h b/lib_com/ivas_stat_com.h index d98f1d5810..0efb86249a 100644 --- a/lib_com/ivas_stat_com.h +++ b/lib_com/ivas_stat_com.h @@ -798,4 +798,29 @@ typedef struct ivas_param_ism_data_structure float last_cardioid_left[MAX_NUM_OBJECTS]; } PARAM_ISM_CONFIG_DATA, *PARAM_ISM_CONFIG_HANDLE; +#ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX + + +/*----------------------------------------------------------------------------------* + * Limiter structure + *----------------------------------------------------------------------------------*/ + +typedef struct +{ + int16_t max_num_channels; + int16_t num_channels; + float **channel_ptrs; + int32_t sampling_rate; + float gain; + float release_heuristic; + float attack_constant; + int16_t strong_saturation_count; +#ifdef DEBUGGING + int32_t cnt_frames_limited; /* counter of frames in which the limiter is applied */ +#endif + +} IVAS_LIMITER, *IVAS_LIMITER_HANDLE; + +#endif + #endif /* IVAS_STAT_COM */ diff --git a/lib_com/options.h b/lib_com/options.h index ebf52a4370..9ae6f5ff82 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -200,6 +200,7 @@ #define NONBE_FIX_1165_STATIC_SCAL_PARAMMC /* FhG: add static scaling to ParamMC DMX */ +#define NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX /* FhG: apply the limiter before the core encoder for formats with downmixing where the signal could exceed the 16-bit value range */ /* ##################### End NON-BE switches ########################### */ diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 879ecee5fc..19d74b78c9 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -1546,7 +1546,11 @@ ivas_error ivas_jbm_dec_render( if ( st_ivas->ivas_format != MONO_FORMAT ) { #ifndef DISABLE_LIMITER +#ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX + ivas_limiter_apply( st_ivas->hLimiter, p_output, nchan_out, *nSamplesRendered, st_ivas->BER_detect ); +#else ivas_limiter_dec( st_ivas->hLimiter, p_output, nchan_out, *nSamplesRendered, st_ivas->BER_detect ); +#endif #endif } } @@ -1812,7 +1816,11 @@ ivas_error ivas_jbm_dec_flush_renderer( if ( st_ivas->ivas_format != MONO_FORMAT ) { #ifndef DISABLE_LIMITER +#ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX + ivas_limiter_apply( st_ivas->hLimiter, p_output, st_ivas->hDecoderConfig->nchan_out, *nSamplesRendered, st_ivas->BER_detect ); +#else ivas_limiter_dec( st_ivas->hLimiter, p_output, st_ivas->hDecoderConfig->nchan_out, *nSamplesRendered, st_ivas->BER_detect ); +#endif #endif } } diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 61ba65f590..87fca48c0f 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -1822,12 +1822,20 @@ ivas_error IVAS_DEC_GetSplitBinauralBitstream( if ( st_ivas->hDecoderConfig->render_framesize == IVAS_RENDER_FRAMESIZE_5MS ) { #ifndef DISABLE_LIMITER +#ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX + ivas_limiter_apply( st_ivas->hLimiter, pOutput, st_ivas->hDecoderConfig->nchan_out, numSamplesPerChannelToDecode, st_ivas->BER_detect ); +#else ivas_limiter_dec( st_ivas->hLimiter, pOutput, st_ivas->hDecoderConfig->nchan_out, numSamplesPerChannelToDecode, st_ivas->BER_detect ); +#endif #endif } else { +#ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX + ivas_limiter_apply( st_ivas->hLimiter, pOutput, st_ivas->hDecoderConfig->nchan_out, numSamplesPerChannelToDecode, st_ivas->BER_detect ); +#else ivas_limiter_dec( st_ivas->hLimiter, pOutput, st_ivas->hDecoderConfig->nchan_out, numSamplesPerChannelToDecode, st_ivas->BER_detect ); +#endif } #ifdef DEBUGGING diff --git a/lib_enc/ivas_enc.c b/lib_enc/ivas_enc.c index 5ddcf9a506..89f16c1e39 100644 --- a/lib_enc/ivas_enc.c +++ b/lib_enc/ivas_enc.c @@ -482,6 +482,17 @@ ivas_error ivas_enc( /* encode Parametric MC parameters and write bitstream */ ivas_param_mc_enc( st_ivas, hMetaData, data_f, input_frame ); +#ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX + /* Apply limiter on downmix */ + if ( st_ivas->hLimiter != NULL ) + { + int16_t BER_detect_dummy; + + BER_detect_dummy = 0; + ivas_limiter_apply( st_ivas->hLimiter, data_f, st_ivas->nchan_transport, input_frame, BER_detect_dummy ); + } +#endif + if ( st_ivas->nCPE == 1 ) /* Stereo DMX */ { if ( ( error = ivas_cpe_enc( st_ivas, 0, data_f[0], data_f[1], input_frame, hMetaData->nb_bits_tot ) ) != IVAS_ERR_OK ) diff --git a/lib_enc/ivas_init_enc.c b/lib_enc/ivas_init_enc.c index 05621dfaaa..a2a863cc51 100644 --- a/lib_enc/ivas_init_enc.c +++ b/lib_enc/ivas_init_enc.c @@ -367,6 +367,11 @@ void ivas_initialize_handles_enc( /* OSBA handle */ st_ivas->hOSba = NULL; + +#ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX + /* Limiter handle */ + st_ivas->hLimiter = NULL; +#endif return; } @@ -851,6 +856,14 @@ ivas_error ivas_init_encoder( return error; } } + +#ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX + if ( ( error = ivas_limiter_open( &st_ivas->hLimiter, st_ivas->nchan_transport, st_ivas->hEncoderConfig->input_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } +#endif + } else if ( st_ivas->mc_mode == MC_MODE_MCMASA ) { @@ -1124,6 +1137,11 @@ void ivas_destroy_enc( } } +#ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX + /* Limiter handle */ + ivas_limiter_close( &st_ivas->hLimiter ); +#endif + /* HP20 filter handles */ if ( st_ivas->mem_hp20_in != NULL ) { diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index 8ab2f0d857..28fc01f1d6 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -1257,6 +1257,11 @@ typedef struct int16_t nCPE; /* number of total CPEs */ SCE_ENC_HANDLE hSCE[MAX_SCE]; /* SCE handles */ CPE_ENC_HANDLE hCPE[MCT_MAX_BLOCKS]; /* CPE handles */ + + +#ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX + IVAS_LIMITER_HANDLE hLimiter; /* Limiter handle */ +#endif /* multichannel modules */ ISM_METADATA_HANDLE hIsmMetaData[MAX_NUM_OBJECTS]; /* ISM metadata handles (storage for one frame of read ISM metadata) */ diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index 22bd0d277e..806684859b 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -1323,6 +1323,7 @@ typedef struct ivas_hrtfs_statistics_struct } HRTFS_STATISTICS, *HRTFS_STATISTICS_HANDLE; +#ifndef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX /*----------------------------------------------------------------------------------* * Limiter structure *----------------------------------------------------------------------------------*/ @@ -1343,7 +1344,7 @@ typedef struct } IVAS_LIMITER, *IVAS_LIMITER_HANDLE; - +#endif /*----------------------------------------------------------------------------------* * Loudspeaker Configuration Conversion structure *----------------------------------------------------------------------------------*/ -- GitLab From c861f0160a050c41e2566899d291dd111716cd62 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Wed, 11 Sep 2024 12:41:34 +0200 Subject: [PATCH 05/31] add limiter for paramISM --- lib_enc/ivas_enc.c | 19 ++++++++++++++++--- lib_enc/ivas_init_enc.c | 7 +++++++ 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/lib_enc/ivas_enc.c b/lib_enc/ivas_enc.c index 89f16c1e39..8e0e154075 100644 --- a/lib_enc/ivas_enc.c +++ b/lib_enc/ivas_enc.c @@ -64,6 +64,11 @@ ivas_error ivas_enc( float *data_f[MAX_INPUT_CHANNELS + MAX_NUM_OBJECTS]; int32_t ivas_total_brate; ivas_error error; +#ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX + int16_t BER_detect_dummy; + + BER_detect_dummy = 0; +#endif error = IVAS_ERR_OK; push_wmops( "ivas_enc" ); @@ -194,6 +199,17 @@ ivas_error ivas_enc( /* Stereo DMX generation */ ivas_param_ism_stereo_dmx( st_ivas, data_f, input_frame ); +#ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX + + /* Apply limiter on downmix */ + if ( st_ivas->hLimiter != NULL ) + { + int16_t num_dmx_channels; + + num_dmx_channels = 2; + ivas_limiter_apply( st_ivas->hLimiter, data_f, num_dmx_channels , input_frame, BER_detect_dummy ); + } +#endif /* Core coding of Stereo DMX */ if ( ( error = ivas_ism_enc( st_ivas, data_f, input_frame, nb_bits_metadata, 0 ) ) != IVAS_ERR_OK ) @@ -486,9 +502,6 @@ ivas_error ivas_enc( /* Apply limiter on downmix */ if ( st_ivas->hLimiter != NULL ) { - int16_t BER_detect_dummy; - - BER_detect_dummy = 0; ivas_limiter_apply( st_ivas->hLimiter, data_f, st_ivas->nchan_transport, input_frame, BER_detect_dummy ); } #endif diff --git a/lib_enc/ivas_init_enc.c b/lib_enc/ivas_init_enc.c index a2a863cc51..63348e44eb 100644 --- a/lib_enc/ivas_init_enc.c +++ b/lib_enc/ivas_init_enc.c @@ -548,6 +548,13 @@ ivas_error ivas_init_encoder( { return error; } + +#ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX + if ( ( error = ivas_limiter_open( &st_ivas->hLimiter, st_ivas->nchan_transport, st_ivas->hEncoderConfig->input_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } +#endif } if ( st_ivas->hEncoderConfig->Opt_DTX_ON ) -- GitLab From 5ab882325fdfb57fa602804f770c090a37682c60 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Wed, 11 Sep 2024 12:43:35 +0200 Subject: [PATCH 06/31] rename DISABLE_LIMITER -> DISABLE_LIMITER_IN_DECODER limiter is now there in encoder as well. The DISABLE_LIMITER switch is mainly used for debugging and the 20ms vs 5ms rendering test which is not affected by the encoder side application of the limiter. --- .gitlab-ci.yml | 4 ++-- lib_com/options.h | 4 ++-- lib_dec/ivas_jbm_dec.c | 4 ++-- lib_dec/lib_dec.c | 2 +- lib_isar/lib_isar_post_rend.c | 4 ++-- lib_rend/lib_rend.c | 4 ++-- scripts/prepare_delivery.sh | 2 +- 7 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a57b67497a..d80ba0705b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -181,8 +181,8 @@ stages: - Pop-Location .disable-limiter: &disable-limiter -# automatically enable #define DISABLE_LIMITER in options.h, handling both /**/-comment and //-comment - - sed -i.bak -e "s/\/\*[[:space:]]*\(#define[[:space:]]*DISABLE_LIMITER\)[[:space:]]*\*\//\1/g" ./lib_com/options.h +# automatically enable #define DISABLE_LIMITER_IN_DECODER in options.h, handling both /**/-comment and //-comment + - sed -i.bak -e "s/\/\*[[:space:]]*\(#define[[:space:]]*DISABLE_LIMITER_IN_DECODER\)[[:space:]]*\*\//\1/g" ./lib_com/options.h .get-commits-behind-count: &get-commits-behind-count - echo $CI_COMMIT_SHA diff --git a/lib_com/options.h b/lib_com/options.h index 9ae6f5ff82..34ea636918 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -133,7 +133,7 @@ /*#define DEBUG_AGC_ENCODER_CMD_OPTION*/ /* Ability to force enable or disable AGC behaviour in DIRAC/SPAR via command line option */ /*#define DEBUG_JBM_CMD_OPTION*/ /* ability for telling the decoder the frontend fetch size and to not delay compensate for bad frames at the beginning */ /*#define VARIABLE_SPEED_DECODING*/ /* variable speed decoding employing the JBM functioniality; move to DEBUGGING after build for disabled is fixed */ -/*#define DISABLE_LIMITER*/ /* disable the limiter */ +/*#define DISABLE_LIMITER_IN_DECODER*/ /* disable the limiter */ /*Split Rendering Debug switches*/ /*#define DBG_WAV_WRITER*/ /* add debugging function dbgwrite_wav() */ @@ -150,7 +150,7 @@ /* keep as part of options.h */ #define BASOP_NOGLOB /* Disable global symbols in BASOPs, Overflow/Carry in BASOPs disabled, additional BASOPs in case of Overflow */ -/*#define DISABLE_LIMITER */ /* test switch for testing BE between 5ms and 20ms rendering */ +/*#define DISABLE_LIMITER_IN_DECODER */ /* test switch for testing BE between 5ms and 20ms rendering */ /* ################## Start DEVELOPMENT switches ######################### */ diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 19d74b78c9..9245d88513 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -1545,7 +1545,7 @@ ivas_error ivas_jbm_dec_render( { if ( st_ivas->ivas_format != MONO_FORMAT ) { -#ifndef DISABLE_LIMITER +#ifndef DISABLE_LIMITER_IN_DECODER #ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX ivas_limiter_apply( st_ivas->hLimiter, p_output, nchan_out, *nSamplesRendered, st_ivas->BER_detect ); #else @@ -1815,7 +1815,7 @@ ivas_error ivas_jbm_dec_flush_renderer( { if ( st_ivas->ivas_format != MONO_FORMAT ) { -#ifndef DISABLE_LIMITER +#ifndef DISABLE_LIMITER_IN_DECODER #ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX ivas_limiter_apply( st_ivas->hLimiter, p_output, st_ivas->hDecoderConfig->nchan_out, *nSamplesRendered, st_ivas->BER_detect ); #else diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 87fca48c0f..39f51e1cbb 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -1821,7 +1821,7 @@ ivas_error IVAS_DEC_GetSplitBinauralBitstream( { if ( st_ivas->hDecoderConfig->render_framesize == IVAS_RENDER_FRAMESIZE_5MS ) { -#ifndef DISABLE_LIMITER +#ifndef DISABLE_LIMITER_IN_DECODER #ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX ivas_limiter_apply( st_ivas->hLimiter, pOutput, st_ivas->hDecoderConfig->nchan_out, numSamplesPerChannelToDecode, st_ivas->BER_detect ); #else diff --git a/lib_isar/lib_isar_post_rend.c b/lib_isar/lib_isar_post_rend.c index 101768bb34..e804c99cc1 100644 --- a/lib_isar/lib_isar_post_rend.c +++ b/lib_isar/lib_isar_post_rend.c @@ -259,7 +259,7 @@ static void accumulate2dArrayToBuffer( return; } -#ifndef DISABLE_LIMITER +#ifndef DISABLE_LIMITER_IN_DECODER /*-------------------------------------------------------------------* * limitRendererOutput() @@ -1676,7 +1676,7 @@ ivas_error ISAR_POST_REND_getSamples( return error; } -#ifndef DISABLE_LIMITER +#ifndef DISABLE_LIMITER_IN_DECODER #ifdef DEBUGGING hIvasRend->numClipping += #endif diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 3efafb6a29..e6d4d3f597 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -449,7 +449,7 @@ static void accumulate2dArrayToBuffer( * In-place saturation control for multichannel buffers with adaptive release time *-------------------------------------------------------------------*/ -#ifndef DISABLE_LIMITER +#ifndef DISABLE_LIMITER_IN_DECODER /*! r: number of clipped output samples */ static int32_t limitRendererOutput( IVAS_LIMITER_HANDLE hLimiter, /* i/o: limiter struct handle */ @@ -7640,7 +7640,7 @@ static ivas_error getSamplesInternal( if ( outAudio.config.is_cldfb == 0 ) { -#ifndef DISABLE_LIMITER +#ifndef DISABLE_LIMITER_IN_DECODER #ifdef DEBUGGING hIvasRend->numClipping += #endif diff --git a/scripts/prepare_delivery.sh b/scripts/prepare_delivery.sh index ac93a91043..2bb0711edf 100755 --- a/scripts/prepare_delivery.sh +++ b/scripts/prepare_delivery.sh @@ -237,7 +237,7 @@ if coan_exists; then echo "-UDEBUG_AGC_ENCODER_CMD_OPTION" >> $COAN_LIST echo "-UDEBUG_JBM_CMD_OPTION" >> $COAN_LIST echo "-UVARIABLE_SPEED_DECODING" >> $COAN_LIST - echo "-UDISABLE_LIMITER" >> $COAN_LIST + echo "-UDISABLE_LIMITER_IN_DECODER" >> $COAN_LIST echo "-UDBG_WAV_WRITER" >> $COAN_LIST echo "-USPLIT_REND_WITH_HEAD_ROT_DEBUG" >> $COAN_LIST echo "-USPLIT_POSE_CORRECTION_DEBUG" >> $COAN_LIST -- GitLab From 05371776fab94ca0b8abe96d27f894fa6ea05ebf Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Wed, 11 Sep 2024 13:23:25 +0200 Subject: [PATCH 07/31] add limiter for remaining formats with downmixing needs to be reviewed by respective experts --- lib_enc/ivas_enc.c | 46 +++++++++++++++++++++++++++++++++++++++++ lib_enc/ivas_init_enc.c | 45 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+) diff --git a/lib_enc/ivas_enc.c b/lib_enc/ivas_enc.c index 8e0e154075..0c48436268 100644 --- a/lib_enc/ivas_enc.c +++ b/lib_enc/ivas_enc.c @@ -263,6 +263,14 @@ ivas_error ivas_enc( if ( ivas_format == SBA_FORMAT ) { ivas_sba_getTCs( data_f, st_ivas, input_frame ); +#ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX + + /* Apply limiter on transport channels */ + if ( st_ivas->hLimiter != NULL ) + { + ivas_limiter_apply( st_ivas->hLimiter, data_f, st_ivas->nchan_transport, input_frame, BER_detect_dummy ); + } +#endif } /* core-coding of transport channels */ @@ -290,11 +298,25 @@ ivas_error ivas_enc( } else if ( ivas_format == MASA_ISM_FORMAT ) { +#ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX + int16_t num_channels; +#endif float *data_separated_object; int16_t idx_separated_object; int16_t flag_omasa_ener_brate; flag_omasa_ener_brate = 0; +#ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX + num_channels = st_ivas->nchan_transport; + if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC ) + { + num_channels += hEncoderConfig->nchan_ism; + } + else if ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) + { + num_channels += 1; + } +#endif /* Stereo transport is used also with monoMASA, duplicate mono if monoMASA */ if ( ( st_ivas->hEncoderConfig->nchan_inp - hEncoderConfig->nchan_ism ) == 1 ) @@ -323,6 +345,14 @@ ivas_error ivas_enc( 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_1165_APPLY_LIMITER_ON_ENCODER_DMX + /* Apply limiter on downmix */ + if ( st_ivas->hLimiter != NULL ) + { + ivas_limiter_apply( st_ivas->hLimiter, data_f, num_channels, input_frame, BER_detect_dummy ); + } +#endif + /* Encode ISMs transport channels */ n = 0; if ( st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) @@ -429,6 +459,14 @@ ivas_error ivas_enc( ivas_sba_getTCs( &data_f[n], st_ivas, input_frame ); } +#ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX + /* Apply limiter on downmix */ + if ( st_ivas->hLimiter != NULL ) + { + ivas_limiter_apply( st_ivas->hLimiter, data_f, st_ivas->nchan_transport, input_frame, BER_detect_dummy ); + } +#endif + /* core-coding of transport channels */ if ( st_ivas->nSCE == 1 ) { @@ -536,6 +574,14 @@ ivas_error ivas_enc( return error; } +#ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX + /* Apply limiter on downmix */ + if ( st_ivas->hLimiter != NULL ) + { + ivas_limiter_apply( st_ivas->hLimiter, data_f, st_ivas->nchan_transport, input_frame, BER_detect_dummy ); + } +#endif + if ( st_ivas->hMcMasa->separateChannelEnabled ) { if ( ( error = ivas_sce_enc( st_ivas, 0, data_f[2], input_frame, 0 ) ) != IVAS_ERR_OK ) diff --git a/lib_enc/ivas_init_enc.c b/lib_enc/ivas_init_enc.c index 63348e44eb..edaf6bbf32 100644 --- a/lib_enc/ivas_init_enc.c +++ b/lib_enc/ivas_init_enc.c @@ -632,14 +632,38 @@ ivas_error ivas_init_encoder( return error; } } + +#ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX + if ( ivas_format == SBA_FORMAT) + { + if ( ( error = ivas_limiter_open( &st_ivas->hLimiter, st_ivas->nchan_transport, st_ivas->hEncoderConfig->input_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + } +#endif } else if ( ivas_format == MASA_ISM_FORMAT ) { +#ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX + int16_t num_channels; +#endif int32_t ism_total_brate; int16_t k; st_ivas->ism_mode = ivas_omasa_ism_mode_select( ivas_total_brate, hEncoderConfig->nchan_ism ); st_ivas->nchan_transport = 2; +#ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX + num_channels = st_ivas->nchan_transport; + if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC ) + { + num_channels += hEncoderConfig->nchan_ism; + } + else if ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) + { + num_channels += 1; + } +#endif if ( ( error = ivas_ism_metadata_enc_create( st_ivas, hEncoderConfig->nchan_ism, element_brate_tmp ) ) != IVAS_ERR_OK ) { @@ -692,6 +716,13 @@ ivas_error ivas_init_encoder( { return error; } + +#ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX + if ( ( error = ivas_limiter_open( &st_ivas->hLimiter, num_channels, st_ivas->hEncoderConfig->input_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } +#endif } else if ( ivas_format == SBA_ISM_FORMAT ) { @@ -777,6 +808,13 @@ ivas_error ivas_init_encoder( { return error; } + +#ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX + if ( ( error = ivas_limiter_open( &st_ivas->hLimiter, st_ivas->nchan_transport, st_ivas->hEncoderConfig->input_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } +#endif } else if ( ivas_format == MC_FORMAT ) { @@ -912,6 +950,13 @@ ivas_error ivas_init_encoder( return error; } } + +#ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX + if ( ( error = ivas_limiter_open( &st_ivas->hLimiter, st_ivas->nchan_transport, st_ivas->hEncoderConfig->input_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } +#endif } } #ifdef DEBUGGING -- GitLab From 365fea304d50bc34ad9163e1636cbedfadf5b8d2 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Wed, 11 Sep 2024 13:26:05 +0200 Subject: [PATCH 08/31] clang-format --- lib_enc/ivas_enc.c | 14 +++++++------- lib_enc/ivas_init_enc.c | 5 ++--- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/lib_enc/ivas_enc.c b/lib_enc/ivas_enc.c index 0c48436268..4879689345 100644 --- a/lib_enc/ivas_enc.c +++ b/lib_enc/ivas_enc.c @@ -66,7 +66,7 @@ ivas_error ivas_enc( ivas_error error; #ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX int16_t BER_detect_dummy; - + BER_detect_dummy = 0; #endif error = IVAS_ERR_OK; @@ -207,7 +207,7 @@ ivas_error ivas_enc( int16_t num_dmx_channels; num_dmx_channels = 2; - ivas_limiter_apply( st_ivas->hLimiter, data_f, num_dmx_channels , input_frame, BER_detect_dummy ); + ivas_limiter_apply( st_ivas->hLimiter, data_f, num_dmx_channels, input_frame, BER_detect_dummy ); } #endif @@ -346,11 +346,11 @@ ivas_error ivas_enc( } #ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX - /* Apply limiter on downmix */ - if ( st_ivas->hLimiter != NULL ) - { - ivas_limiter_apply( st_ivas->hLimiter, data_f, num_channels, input_frame, BER_detect_dummy ); - } + /* Apply limiter on downmix */ + if ( st_ivas->hLimiter != NULL ) + { + ivas_limiter_apply( st_ivas->hLimiter, data_f, num_channels, input_frame, BER_detect_dummy ); + } #endif /* Encode ISMs transport channels */ diff --git a/lib_enc/ivas_init_enc.c b/lib_enc/ivas_init_enc.c index edaf6bbf32..f11c89596c 100644 --- a/lib_enc/ivas_init_enc.c +++ b/lib_enc/ivas_init_enc.c @@ -367,7 +367,7 @@ void ivas_initialize_handles_enc( /* OSBA handle */ st_ivas->hOSba = NULL; - + #ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX /* Limiter handle */ st_ivas->hLimiter = NULL; @@ -634,7 +634,7 @@ ivas_error ivas_init_encoder( } #ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX - if ( ivas_format == SBA_FORMAT) + if ( ivas_format == SBA_FORMAT ) { if ( ( error = ivas_limiter_open( &st_ivas->hLimiter, st_ivas->nchan_transport, st_ivas->hEncoderConfig->input_Fs ) ) != IVAS_ERR_OK ) { @@ -908,7 +908,6 @@ ivas_error ivas_init_encoder( return error; } #endif - } else if ( st_ivas->mc_mode == MC_MODE_MCMASA ) { -- GitLab From 8d38ad7a0b6f9c1b9b956051198b38e25c16ae53 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Wed, 11 Sep 2024 13:28:28 +0200 Subject: [PATCH 09/31] remove check for nullptr to have meaningful fails having the limiter handle allocated is simply necessary for those operating points now, no hiding of errors --- lib_enc/ivas_enc.c | 39 ++++++++++++--------------------------- 1 file changed, 12 insertions(+), 27 deletions(-) diff --git a/lib_enc/ivas_enc.c b/lib_enc/ivas_enc.c index 4879689345..196f40847a 100644 --- a/lib_enc/ivas_enc.c +++ b/lib_enc/ivas_enc.c @@ -195,6 +195,12 @@ ivas_error ivas_enc( if ( st_ivas->ism_mode == ISM_MODE_PARAM ) { +#ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX + int16_t num_dmx_channels; + + num_dmx_channels = 2; + +#endif ivas_param_ism_enc( st_ivas, data_f, input_frame ); /* Stereo DMX generation */ @@ -202,13 +208,7 @@ ivas_error ivas_enc( #ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX /* Apply limiter on downmix */ - if ( st_ivas->hLimiter != NULL ) - { - int16_t num_dmx_channels; - - num_dmx_channels = 2; - ivas_limiter_apply( st_ivas->hLimiter, data_f, num_dmx_channels, input_frame, BER_detect_dummy ); - } + ivas_limiter_apply( st_ivas->hLimiter, data_f, num_dmx_channels, input_frame, BER_detect_dummy ); #endif /* Core coding of Stereo DMX */ @@ -266,10 +266,7 @@ ivas_error ivas_enc( #ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX /* Apply limiter on transport channels */ - if ( st_ivas->hLimiter != NULL ) - { - ivas_limiter_apply( st_ivas->hLimiter, data_f, st_ivas->nchan_transport, input_frame, BER_detect_dummy ); - } + ivas_limiter_apply( st_ivas->hLimiter, data_f, st_ivas->nchan_transport, input_frame, BER_detect_dummy ); #endif } @@ -347,10 +344,7 @@ ivas_error ivas_enc( #ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX /* Apply limiter on downmix */ - if ( st_ivas->hLimiter != NULL ) - { - ivas_limiter_apply( st_ivas->hLimiter, data_f, num_channels, input_frame, BER_detect_dummy ); - } + ivas_limiter_apply( st_ivas->hLimiter, data_f, num_channels, input_frame, BER_detect_dummy ); #endif /* Encode ISMs transport channels */ @@ -461,10 +455,7 @@ ivas_error ivas_enc( #ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX /* Apply limiter on downmix */ - if ( st_ivas->hLimiter != NULL ) - { - ivas_limiter_apply( st_ivas->hLimiter, data_f, st_ivas->nchan_transport, input_frame, BER_detect_dummy ); - } + ivas_limiter_apply( st_ivas->hLimiter, data_f, st_ivas->nchan_transport, input_frame, BER_detect_dummy ); #endif /* core-coding of transport channels */ @@ -538,10 +529,7 @@ ivas_error ivas_enc( #ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX /* Apply limiter on downmix */ - if ( st_ivas->hLimiter != NULL ) - { - ivas_limiter_apply( st_ivas->hLimiter, data_f, st_ivas->nchan_transport, input_frame, BER_detect_dummy ); - } + ivas_limiter_apply( st_ivas->hLimiter, data_f, st_ivas->nchan_transport, input_frame, BER_detect_dummy ); #endif if ( st_ivas->nCPE == 1 ) /* Stereo DMX */ @@ -576,10 +564,7 @@ ivas_error ivas_enc( #ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX /* Apply limiter on downmix */ - if ( st_ivas->hLimiter != NULL ) - { - ivas_limiter_apply( st_ivas->hLimiter, data_f, st_ivas->nchan_transport, input_frame, BER_detect_dummy ); - } + ivas_limiter_apply( st_ivas->hLimiter, data_f, st_ivas->nchan_transport, input_frame, BER_detect_dummy ); #endif if ( st_ivas->hMcMasa->separateChannelEnabled ) -- GitLab From 7b8f2afbffea73a6e9cc7a246dc773cdc6b4c266 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Wed, 11 Sep 2024 13:29:39 +0200 Subject: [PATCH 10/31] deactivate limiter macro by default --- lib_com/options.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 34ea636918..2a3da9fe32 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -200,7 +200,7 @@ #define NONBE_FIX_1165_STATIC_SCAL_PARAMMC /* FhG: add static scaling to ParamMC DMX */ -#define NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX /* FhG: apply the limiter before the core encoder for formats with downmixing where the signal could exceed the 16-bit value range */ +/*#define NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX*/ /* FhG: apply the limiter before the core encoder for formats with downmixing where the signal could exceed the 16-bit value range */ /* ##################### End NON-BE switches ########################### */ -- GitLab From 938b04ae8e44d5ebb64e698c83334925d6270fa9 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Wed, 11 Sep 2024 14:12:22 +0200 Subject: [PATCH 11/31] open limiter for max channels possible per operating point --- lib_enc/ivas_init_enc.c | 26 ++++++-------------------- 1 file changed, 6 insertions(+), 20 deletions(-) diff --git a/lib_enc/ivas_init_enc.c b/lib_enc/ivas_init_enc.c index f11c89596c..92c354e099 100644 --- a/lib_enc/ivas_init_enc.c +++ b/lib_enc/ivas_init_enc.c @@ -550,7 +550,7 @@ ivas_error ivas_init_encoder( } #ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX - if ( ( error = ivas_limiter_open( &st_ivas->hLimiter, st_ivas->nchan_transport, st_ivas->hEncoderConfig->input_Fs ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_limiter_open( &st_ivas->hLimiter, MAX_NUM_OBJECTS, st_ivas->hEncoderConfig->input_Fs ) ) != IVAS_ERR_OK ) { return error; } @@ -636,7 +636,7 @@ ivas_error ivas_init_encoder( #ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX if ( ivas_format == SBA_FORMAT ) { - if ( ( error = ivas_limiter_open( &st_ivas->hLimiter, st_ivas->nchan_transport, st_ivas->hEncoderConfig->input_Fs ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_limiter_open( &st_ivas->hLimiter, MAX_INPUT_CHANNELS, st_ivas->hEncoderConfig->input_Fs ) ) != IVAS_ERR_OK ) { return error; } @@ -645,25 +645,11 @@ ivas_error ivas_init_encoder( } else if ( ivas_format == MASA_ISM_FORMAT ) { -#ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX - int16_t num_channels; -#endif int32_t ism_total_brate; int16_t k; st_ivas->ism_mode = ivas_omasa_ism_mode_select( ivas_total_brate, hEncoderConfig->nchan_ism ); st_ivas->nchan_transport = 2; -#ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX - num_channels = st_ivas->nchan_transport; - if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC ) - { - num_channels += hEncoderConfig->nchan_ism; - } - else if ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) - { - num_channels += 1; - } -#endif if ( ( error = ivas_ism_metadata_enc_create( st_ivas, hEncoderConfig->nchan_ism, element_brate_tmp ) ) != IVAS_ERR_OK ) { @@ -718,7 +704,7 @@ ivas_error ivas_init_encoder( } #ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX - if ( ( error = ivas_limiter_open( &st_ivas->hLimiter, num_channels, st_ivas->hEncoderConfig->input_Fs ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_limiter_open( &st_ivas->hLimiter, CPE_CHANNELS + MAX_NUM_OBJECTS, st_ivas->hEncoderConfig->input_Fs ) ) != IVAS_ERR_OK ) { return error; } @@ -810,7 +796,7 @@ ivas_error ivas_init_encoder( } #ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX - if ( ( error = ivas_limiter_open( &st_ivas->hLimiter, st_ivas->nchan_transport, st_ivas->hEncoderConfig->input_Fs ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_limiter_open( &st_ivas->hLimiter, MAX_INPUT_CHANNELS + MAX_NUM_OBJECTS, st_ivas->hEncoderConfig->input_Fs ) ) != IVAS_ERR_OK ) { return error; } @@ -903,7 +889,7 @@ ivas_error ivas_init_encoder( } #ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX - if ( ( error = ivas_limiter_open( &st_ivas->hLimiter, st_ivas->nchan_transport, st_ivas->hEncoderConfig->input_Fs ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_limiter_open( &st_ivas->hLimiter, PARAM_MC_MAX_TRANSPORT_CHANS, st_ivas->hEncoderConfig->input_Fs ) ) != IVAS_ERR_OK ) { return error; } @@ -951,7 +937,7 @@ ivas_error ivas_init_encoder( } #ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX - if ( ( error = ivas_limiter_open( &st_ivas->hLimiter, st_ivas->nchan_transport, st_ivas->hEncoderConfig->input_Fs ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_limiter_open( &st_ivas->hLimiter, CPE_CHANNELS + 1, st_ivas->hEncoderConfig->input_Fs ) ) != IVAS_ERR_OK ) { return error; } -- GitLab From 2b25a614e00a74aca700bebc8c4940a863e42221 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Thu, 12 Sep 2024 08:24:50 +0200 Subject: [PATCH 12/31] correct limiter usage in OMASA only the MASA channels need limiting, the object channels do not --- lib_enc/ivas_enc.c | 23 +++++------------------ 1 file changed, 5 insertions(+), 18 deletions(-) diff --git a/lib_enc/ivas_enc.c b/lib_enc/ivas_enc.c index 196f40847a..01e57df03b 100644 --- a/lib_enc/ivas_enc.c +++ b/lib_enc/ivas_enc.c @@ -295,25 +295,11 @@ ivas_error ivas_enc( } else if ( ivas_format == MASA_ISM_FORMAT ) { -#ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX - int16_t num_channels; -#endif float *data_separated_object; int16_t idx_separated_object; int16_t flag_omasa_ener_brate; flag_omasa_ener_brate = 0; -#ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX - num_channels = st_ivas->nchan_transport; - if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC ) - { - num_channels += hEncoderConfig->nchan_ism; - } - else if ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) - { - num_channels += 1; - } -#endif /* Stereo transport is used also with monoMASA, duplicate mono if monoMASA */ if ( ( st_ivas->hEncoderConfig->nchan_inp - hEncoderConfig->nchan_ism ) == 1 ) @@ -340,12 +326,13 @@ ivas_error ivas_enc( { /* 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_1165_APPLY_LIMITER_ON_ENCODER_DMX - /* Apply limiter on downmix */ - ivas_limiter_apply( st_ivas->hLimiter, data_f, num_channels, input_frame, BER_detect_dummy ); + + /* Apply limiter on downmix */ + ivas_limiter_apply( st_ivas->hLimiter, &data_f[st_ivas->hEncoderConfig->nchan_ism], CPE_CHANNELS, input_frame, BER_detect_dummy ); #endif + } + /* Encode ISMs transport channels */ n = 0; -- GitLab From f8b1261bba468d8ae2ae7f79637ae7cbdb53a5a6 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Thu, 12 Sep 2024 08:27:59 +0200 Subject: [PATCH 13/31] use constant for num of paramISM TCs --- lib_enc/ivas_enc.c | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/lib_enc/ivas_enc.c b/lib_enc/ivas_enc.c index 01e57df03b..73eccde7ae 100644 --- a/lib_enc/ivas_enc.c +++ b/lib_enc/ivas_enc.c @@ -195,12 +195,6 @@ ivas_error ivas_enc( if ( st_ivas->ism_mode == ISM_MODE_PARAM ) { -#ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX - int16_t num_dmx_channels; - - num_dmx_channels = 2; - -#endif ivas_param_ism_enc( st_ivas, data_f, input_frame ); /* Stereo DMX generation */ @@ -208,7 +202,7 @@ ivas_error ivas_enc( #ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX /* Apply limiter on downmix */ - ivas_limiter_apply( st_ivas->hLimiter, data_f, num_dmx_channels, input_frame, BER_detect_dummy ); + ivas_limiter_apply( st_ivas->hLimiter, data_f, MAX_PARAM_ISM_WAVE, input_frame, BER_detect_dummy ); #endif /* Core coding of Stereo DMX */ -- GitLab From d4de205072ecbb0325355aa718dc26b57e0db322 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Thu, 12 Sep 2024 08:34:22 +0200 Subject: [PATCH 14/31] in OSBA, apply limiter only on SBA dmx channels --- lib_enc/ivas_enc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_enc/ivas_enc.c b/lib_enc/ivas_enc.c index 73eccde7ae..a756a50c81 100644 --- a/lib_enc/ivas_enc.c +++ b/lib_enc/ivas_enc.c @@ -435,8 +435,8 @@ ivas_error ivas_enc( } #ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX - /* Apply limiter on downmix */ - ivas_limiter_apply( st_ivas->hLimiter, data_f, st_ivas->nchan_transport, input_frame, BER_detect_dummy ); + /* Apply limiter on SBA channels */ + ivas_limiter_apply( st_ivas->hLimiter, &data_f[n], st_ivas->nchan_transport, input_frame, BER_detect_dummy ); #endif /* core-coding of transport channels */ -- GitLab From bef8444e8c526d8105b7e4ed50429b6b1684ee52 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Thu, 12 Sep 2024 08:57:19 +0200 Subject: [PATCH 15/31] correct max num of channels in limiter init --- lib_enc/ivas_init_enc.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib_enc/ivas_init_enc.c b/lib_enc/ivas_init_enc.c index 92c354e099..484c5d8716 100644 --- a/lib_enc/ivas_init_enc.c +++ b/lib_enc/ivas_init_enc.c @@ -550,7 +550,7 @@ ivas_error ivas_init_encoder( } #ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX - if ( ( error = ivas_limiter_open( &st_ivas->hLimiter, MAX_NUM_OBJECTS, st_ivas->hEncoderConfig->input_Fs ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_limiter_open( &st_ivas->hLimiter, MAX_PARAM_ISM_WAVE, st_ivas->hEncoderConfig->input_Fs ) ) != IVAS_ERR_OK ) { return error; } @@ -636,7 +636,7 @@ ivas_error ivas_init_encoder( #ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX if ( ivas_format == SBA_FORMAT ) { - if ( ( error = ivas_limiter_open( &st_ivas->hLimiter, MAX_INPUT_CHANNELS, st_ivas->hEncoderConfig->input_Fs ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_limiter_open( &st_ivas->hLimiter, HOA3_CHANNELS, st_ivas->hEncoderConfig->input_Fs ) ) != IVAS_ERR_OK ) { return error; } @@ -704,7 +704,7 @@ ivas_error ivas_init_encoder( } #ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX - if ( ( error = ivas_limiter_open( &st_ivas->hLimiter, CPE_CHANNELS + MAX_NUM_OBJECTS, st_ivas->hEncoderConfig->input_Fs ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_limiter_open( &st_ivas->hLimiter, CPE_CHANNELS, st_ivas->hEncoderConfig->input_Fs ) ) != IVAS_ERR_OK ) { return error; } @@ -796,7 +796,7 @@ ivas_error ivas_init_encoder( } #ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX - if ( ( error = ivas_limiter_open( &st_ivas->hLimiter, MAX_INPUT_CHANNELS + MAX_NUM_OBJECTS, st_ivas->hEncoderConfig->input_Fs ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_limiter_open( &st_ivas->hLimiter, FOA_CHANNELS, st_ivas->hEncoderConfig->input_Fs ) ) != IVAS_ERR_OK ) { return error; } -- GitLab From 5fd5166007e0805a473331aa07c7471687572c29 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Thu, 12 Sep 2024 09:35:46 +0200 Subject: [PATCH 16/31] apply limiter on sep object in OMASA as well --- lib_enc/ivas_enc.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lib_enc/ivas_enc.c b/lib_enc/ivas_enc.c index a756a50c81..b11d730f43 100644 --- a/lib_enc/ivas_enc.c +++ b/lib_enc/ivas_enc.c @@ -318,12 +318,18 @@ ivas_error ivas_enc( /* put audio object data in SCE's */ if ( st_ivas->ism_mode != ISM_MASA_MODE_DISC ) { +#ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX + int16_t num_sep_obj; + + num_sep_obj = ( st_ivas->ism_mode == ISM_MODE_NONE ) ? 0 : 1; + +#endif /* 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_1165_APPLY_LIMITER_ON_ENCODER_DMX /* Apply limiter on downmix */ - ivas_limiter_apply( st_ivas->hLimiter, &data_f[st_ivas->hEncoderConfig->nchan_ism], CPE_CHANNELS, input_frame, BER_detect_dummy ); + ivas_limiter_apply( st_ivas->hLimiter, &data_f[st_ivas->hEncoderConfig->nchan_ism], CPE_CHANNELS + num_sep_obj, input_frame, BER_detect_dummy ); #endif } -- GitLab From 1b9a88a8c8e582e9d47f3f402d35bf5b8ca183ff Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Thu, 12 Sep 2024 10:50:53 +0300 Subject: [PATCH 17/31] Fix SID start bug in OMASA path. --- lib_dec/ivas_masa_dec.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib_dec/ivas_masa_dec.c b/lib_dec/ivas_masa_dec.c index c18369d1f6..6411789a10 100644 --- a/lib_dec/ivas_masa_dec.c +++ b/lib_dec/ivas_masa_dec.c @@ -452,6 +452,9 @@ ivas_error ivas_masa_decode( } else if ( !st->bfi && ivas_format == MASA_FORMAT && ivas_total_brate == IVAS_SID_5k2 ) { +#ifdef NONBE_FIX_1165_STATIC_SCAL_OMASA + hMasa->config.input_ivas_format = MASA_FORMAT; /* Default in SID as OMASA does not support SID */ +#endif if ( hQMetaData->q_direction == NULL ) { /* replicate ivas_masa_dec_config() in case that first good received frame is SID frame */ -- GitLab From 5c3b1dde370c33e01c110857877b00ade9bffc88 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Thu, 12 Sep 2024 10:18:30 +0200 Subject: [PATCH 18/31] fix encoder-side limiter call for pre-rendered OSBA mode --- lib_enc/ivas_enc.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/lib_enc/ivas_enc.c b/lib_enc/ivas_enc.c index a756a50c81..cfe9bedc1a 100644 --- a/lib_enc/ivas_enc.c +++ b/lib_enc/ivas_enc.c @@ -413,6 +413,11 @@ ivas_error ivas_enc( } hEncoderConfig->sba_planar = planar_sba_orig; + +#ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX + /* Apply limiter on SBA channels */ + ivas_limiter_apply( st_ivas->hLimiter, data_f, st_ivas->nchan_transport, input_frame, BER_detect_dummy ); +#endif } else { @@ -432,12 +437,12 @@ ivas_error ivas_enc( /* get SBA TCs */ ivas_sba_getTCs( &data_f[n], st_ivas, input_frame ); - } #ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX - /* Apply limiter on SBA channels */ - ivas_limiter_apply( st_ivas->hLimiter, &data_f[n], st_ivas->nchan_transport, input_frame, BER_detect_dummy ); + /* Apply limiter on SBA channels */ + ivas_limiter_apply( st_ivas->hLimiter, &data_f[n], st_ivas->nchan_transport, input_frame, BER_detect_dummy ); #endif + } /* core-coding of transport channels */ if ( st_ivas->nSCE == 1 ) -- GitLab From 0e93370c06bd1388674e17304807b1f0dbcfdc9a Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Thu, 12 Sep 2024 11:37:55 +0300 Subject: [PATCH 19/31] Revert application of limiter on separated object in OMASA. --- lib_com/options.h | 2 +- lib_enc/ivas_enc.c | 8 +------- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index f03a2256ff..cc8f9d9806 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -200,7 +200,7 @@ #define NONBE_FIX_1165_STATIC_SCAL_PARAMMC /* FhG: add static scaling to ParamMC DMX */ -/*#define NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX*/ /* FhG: apply the limiter before the core encoder for formats with downmixing where the signal could exceed the 16-bit value range */ +#define NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX /* FhG: apply the limiter before the core encoder for formats with downmixing where the signal could exceed the 16-bit value range */ #define NONBE_FIX_1174_MCMASA_LBR_LOOP_ERROR /* Nokia: Fix issue 1174 by removing the unnecessary inner loop causing problems. */ /* ##################### End NON-BE switches ########################### */ diff --git a/lib_enc/ivas_enc.c b/lib_enc/ivas_enc.c index 48febbab41..cfe9bedc1a 100644 --- a/lib_enc/ivas_enc.c +++ b/lib_enc/ivas_enc.c @@ -318,18 +318,12 @@ ivas_error ivas_enc( /* put audio object data in SCE's */ if ( st_ivas->ism_mode != ISM_MASA_MODE_DISC ) { -#ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX - int16_t num_sep_obj; - - num_sep_obj = ( st_ivas->ism_mode == ISM_MODE_NONE ) ? 0 : 1; - -#endif /* 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_1165_APPLY_LIMITER_ON_ENCODER_DMX /* Apply limiter on downmix */ - ivas_limiter_apply( st_ivas->hLimiter, &data_f[st_ivas->hEncoderConfig->nchan_ism], CPE_CHANNELS + num_sep_obj, input_frame, BER_detect_dummy ); + ivas_limiter_apply( st_ivas->hLimiter, &data_f[st_ivas->hEncoderConfig->nchan_ism], CPE_CHANNELS, input_frame, BER_detect_dummy ); #endif } -- GitLab From 6d5b29149f98e3a2efc23b3cee36fbbe42e1b7df Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Thu, 12 Sep 2024 11:38:46 +0300 Subject: [PATCH 20/31] Disable the limiter switch. --- lib_com/options.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index cc8f9d9806..f03a2256ff 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -200,7 +200,7 @@ #define NONBE_FIX_1165_STATIC_SCAL_PARAMMC /* FhG: add static scaling to ParamMC DMX */ -#define NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX /* FhG: apply the limiter before the core encoder for formats with downmixing where the signal could exceed the 16-bit value range */ +/*#define NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX*/ /* FhG: apply the limiter before the core encoder for formats with downmixing where the signal could exceed the 16-bit value range */ #define NONBE_FIX_1174_MCMASA_LBR_LOOP_ERROR /* Nokia: Fix issue 1174 by removing the unnecessary inner loop causing problems. */ /* ##################### End NON-BE switches ########################### */ -- GitLab From a3aa6460a3ccd8c1fe92c7cc897fc9447b6a9b78 Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Thu, 12 Sep 2024 11:49:14 +0300 Subject: [PATCH 21/31] Fix number of channels for limiter in McMASA. --- lib_enc/ivas_enc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_enc/ivas_enc.c b/lib_enc/ivas_enc.c index cfe9bedc1a..9e9468c529 100644 --- a/lib_enc/ivas_enc.c +++ b/lib_enc/ivas_enc.c @@ -550,7 +550,7 @@ ivas_error ivas_enc( #ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX /* Apply limiter on downmix */ - ivas_limiter_apply( st_ivas->hLimiter, data_f, st_ivas->nchan_transport, input_frame, BER_detect_dummy ); + ivas_limiter_apply( st_ivas->hLimiter, data_f, st_ivas->hMcMasa->separateChannelEnabled ? st_ivas->nchan_transport + 1 : st_ivas->nchan_transport, input_frame, BER_detect_dummy ); #endif if ( st_ivas->hMcMasa->separateChannelEnabled ) -- GitLab From c5f14e3a5999eec39ccb23d4704fb3d66ec165c2 Mon Sep 17 00:00:00 2001 From: vaclav Date: Fri, 13 Sep 2024 08:31:22 +0200 Subject: [PATCH 22/31] output number of frames where Limiter is applied; under DEBUGGING --- apps/encoder.c | 6 ++++++ lib_enc/lib_enc.c | 23 +++++++++++++++++++++++ lib_enc/lib_enc.h | 5 +++++ 3 files changed, 34 insertions(+) diff --git a/apps/encoder.c b/apps/encoder.c index f64986ec84..a0f7796206 100644 --- a/apps/encoder.c +++ b/apps/encoder.c @@ -792,6 +792,12 @@ int main( } #ifdef DEBUGGING + int32_t cnt_frames_limited; + if ( ( cnt_frames_limited = IVAS_ENC_GetCntFramesLimited( hIvasEnc ) ) > 0 ) + { + fprintf( stdout, "\nLimiter applied in %d frames.\n\n", cnt_frames_limited ); + } + print_snr(); #endif /*------------------------------------------------------------------------------------------* diff --git a/lib_enc/lib_enc.c b/lib_enc/lib_enc.c index 23e666a7f0..892be5aa32 100644 --- a/lib_enc/lib_enc.c +++ b/lib_enc/lib_enc.c @@ -2417,3 +2417,26 @@ static void init_encoder_config( return; } + +#ifdef DEBUGGING + +/*---------------------------------------------------------------------* + * IVAS_ENC_GetCntFramesLimited() + * + * return number of frames where limiter is applied + *---------------------------------------------------------------------*/ + +int32_t IVAS_ENC_GetCntFramesLimited( + IVAS_ENC_HANDLE hIvasEnc /* i : IVAS encoder handle */ +) +{ + if ( hIvasEnc->st_ivas->hLimiter == NULL ) + { + return 0; + } + else + { + return hIvasEnc->st_ivas->hLimiter->cnt_frames_limited; + } +} +#endif diff --git a/lib_enc/lib_enc.h b/lib_enc/lib_enc.h index 2f40c1ab1b..8918d6c612 100644 --- a/lib_enc/lib_enc.h +++ b/lib_enc/lib_enc.h @@ -383,6 +383,11 @@ void IVAS_ENC_PrintDisclaimer( void ); +#ifdef DEBUGGING +int32_t IVAS_ENC_GetCntFramesLimited( + IVAS_ENC_HANDLE hIvasEnc /* i : IVAS encoder handle */ +); +#endif /* clang-format on */ #endif /* LIB_ENC_H */ -- GitLab From 5f12f841df5c446e68ebf34d450671ab310fbfd8 Mon Sep 17 00:00:00 2001 From: vaclav Date: Fri, 13 Sep 2024 08:57:14 +0200 Subject: [PATCH 23/31] formal improvements --- lib_com/ivas_rom_com.c | 99 ++++++++++++++++++++++--------------- lib_com/options.h | 4 +- lib_dec/ivas_jbm_dec.c | 2 + lib_dec/ivas_masa_dec.c | 1 + lib_dec/ivas_mcmasa_dec.c | 7 ++- lib_dec/ivas_omasa_dec.c | 8 ++- lib_enc/ivas_enc.c | 19 +++---- lib_enc/ivas_mc_param_enc.c | 2 + lib_enc/ivas_mcmasa_enc.c | 2 +- lib_enc/ivas_omasa_enc.c | 2 +- 10 files changed, 89 insertions(+), 57 deletions(-) diff --git a/lib_com/ivas_rom_com.c b/lib_com/ivas_rom_com.c index 47279dccc5..0001288b55 100644 --- a/lib_com/ivas_rom_com.c +++ b/lib_com/ivas_rom_com.c @@ -1835,6 +1835,7 @@ const int16_t Param_MC_index[MAX_CICP_CHANNELS] = #define ivas_param_mc_dmx_scal_fac_CICP6_2tc_static (2.0f + 2.f * INV_SQRT2) #define ivas_param_mc_dmx_scal_fac_CICP6_2tc_static_inv (1.f / ivas_param_mc_dmx_scal_fac_CICP6_2tc_static) #endif + const float ivas_param_mc_dmx_fac_CICP6_2tc[12] = { 1.0f, 0.0f, INV_SQRT2, INV_SQRT2, 1.0f, 0.0f, /*Lt*/ @@ -1845,6 +1846,7 @@ const float ivas_param_mc_dmx_fac_CICP6_2tc[12] = #define ivas_param_mc_dmx_scal_fac_CICP12_2tc_static (3.0f + 2.f * INV_SQRT2) #define ivas_param_mc_dmx_scal_fac_CICP12_2tc_static_inv (1.f / ivas_param_mc_dmx_scal_fac_CICP12_2tc_static) #endif + const float ivas_param_mc_dmx_fac_CICP12_2tc[16] = { 1.0f, 0.0f, INV_SQRT2, INV_SQRT2, 1.0f, 0.0f, 1.0f, 0.0f, /*Lt*/ @@ -1855,6 +1857,7 @@ const float ivas_param_mc_dmx_fac_CICP12_2tc[16] = #define ivas_param_mc_dmx_scal_fac_CICP12_3tc_static (3.0f) #define ivas_param_mc_dmx_scal_fac_CICP12_3tc_static_inv (1.f / ivas_param_mc_dmx_scal_fac_CICP12_3tc_static) #endif + const float ivas_param_mc_dmx_fac_CICP12_3tc[24] = { 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, /*Lt*/ @@ -1866,6 +1869,7 @@ const float ivas_param_mc_dmx_fac_CICP12_3tc[24] = #define ivas_param_mc_dmx_scal_fac_CICP14_2tc_static (3.0f + 2.f * INV_SQRT2) #define ivas_param_mc_dmx_scal_fac_CICP14_2tc_static_inv (1.f / ivas_param_mc_dmx_scal_fac_CICP14_2tc_static) #endif + const float ivas_param_mc_dmx_fac_CICP14_2tc[16] = { 1.0f, 0.0f, INV_SQRT2, INV_SQRT2, 1.0f, 0.0f, 1.0f, 0.0f, /*Lt*/ @@ -1876,6 +1880,7 @@ const float ivas_param_mc_dmx_fac_CICP14_2tc[16] = #define ivas_param_mc_dmx_scal_fac_CICP14_3tc_static (3.0f) #define ivas_param_mc_dmx_scal_fac_CICP14_3tc_static_inv (1.f / ivas_param_mc_dmx_scal_fac_CICP14_3tc_static) #endif + const float ivas_param_mc_dmx_fac_CICP14_3tc[24] = { 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, /*Lt*/ @@ -1887,6 +1892,7 @@ const float ivas_param_mc_dmx_fac_CICP14_3tc[24] = #define ivas_param_mc_dmx_scal_fac_CICP16_3tc_static (4.0f) #define ivas_param_mc_dmx_scal_fac_CICP16_3tc_static_inv (1.f / ivas_param_mc_dmx_scal_fac_CICP16_3tc_static) #endif + const float ivas_param_mc_dmx_fac_CICP16_3tc[30] = { 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, /*Lt*/ @@ -1898,6 +1904,7 @@ const float ivas_param_mc_dmx_fac_CICP16_3tc[30] = #define ivas_param_mc_dmx_scal_fac_CICP19_3tc_static (5.0f) #define ivas_param_mc_dmx_scal_fac_CICP19_3tc_static_inv (1.f / ivas_param_mc_dmx_scal_fac_CICP19_3tc_static) #endif + const float ivas_param_mc_dmx_fac_CICP19_3tc[36] = { 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, /*Lt*/ @@ -2168,11 +2175,12 @@ const PARAM_MC_CONF ivas_param_mc_conf[PARAM_MC_NUM_CONFIGS] = &ivas_param_mc_ild_mapping_CICP6_2tc, &ivas_param_mc_icc_mapping_CICP6_2tc, &ivas_param_mc_dmx_fac_CICP6_2tc[0], - &ivas_param_mc_ild_fac_CICP6_2tc[0] #ifdef NONBE_FIX_1165_STATIC_SCAL_PARAMMC - , + &ivas_param_mc_ild_fac_CICP6_2tc[0], ivas_param_mc_dmx_scal_fac_CICP6_2tc_static, ivas_param_mc_dmx_scal_fac_CICP6_2tc_static_inv +#else + &ivas_param_mc_ild_fac_CICP6_2tc[0] #endif }, /* CICP6 64000 */ @@ -2183,12 +2191,13 @@ const PARAM_MC_CONF ivas_param_mc_conf[PARAM_MC_NUM_CONFIGS] = IVAS_64k, &ivas_param_mc_ild_mapping_CICP6_2tc, &ivas_param_mc_icc_mapping_CICP6_2tc, - &ivas_param_mc_dmx_fac_CICP6_2tc[0], - &ivas_param_mc_ild_fac_CICP6_2tc[0] + &ivas_param_mc_dmx_fac_CICP6_2tc[0], #ifdef NONBE_FIX_1165_STATIC_SCAL_PARAMMC - , + &ivas_param_mc_ild_fac_CICP6_2tc[0], ivas_param_mc_dmx_scal_fac_CICP6_2tc_static, ivas_param_mc_dmx_scal_fac_CICP6_2tc_static_inv +#else + &ivas_param_mc_ild_fac_CICP6_2tc[0] #endif }, /* CICP6 80000 */ @@ -2199,12 +2208,13 @@ const PARAM_MC_CONF ivas_param_mc_conf[PARAM_MC_NUM_CONFIGS] = IVAS_80k, &ivas_param_mc_ild_mapping_CICP6_2tc, &ivas_param_mc_icc_mapping_CICP6_2tc, - &ivas_param_mc_dmx_fac_CICP6_2tc[0], - &ivas_param_mc_ild_fac_CICP6_2tc[0] + &ivas_param_mc_dmx_fac_CICP6_2tc[0], #ifdef NONBE_FIX_1165_STATIC_SCAL_PARAMMC - , + &ivas_param_mc_ild_fac_CICP6_2tc[0], ivas_param_mc_dmx_scal_fac_CICP6_2tc_static, ivas_param_mc_dmx_scal_fac_CICP6_2tc_static_inv +#else + &ivas_param_mc_ild_fac_CICP6_2tc[0] #endif }, /* CICP12 48000 */ @@ -2215,12 +2225,13 @@ const PARAM_MC_CONF ivas_param_mc_conf[PARAM_MC_NUM_CONFIGS] = IVAS_48k, &ivas_param_mc_ild_mapping_CICP12_2tc, &ivas_param_mc_icc_mapping_CICP12_2tc, - &ivas_param_mc_dmx_fac_CICP12_2tc[0], - &ivas_param_mc_ild_fac_CICP12_2tc[0] + &ivas_param_mc_dmx_fac_CICP12_2tc[0], #ifdef NONBE_FIX_1165_STATIC_SCAL_PARAMMC - , + &ivas_param_mc_ild_fac_CICP12_2tc[0], ivas_param_mc_dmx_scal_fac_CICP12_2tc_static, ivas_param_mc_dmx_scal_fac_CICP12_2tc_static_inv +#else + &ivas_param_mc_ild_fac_CICP12_2tc[0] #endif }, /* CICP12 64000 */ @@ -2231,12 +2242,13 @@ const PARAM_MC_CONF ivas_param_mc_conf[PARAM_MC_NUM_CONFIGS] = IVAS_64k, &ivas_param_mc_ild_mapping_CICP12_2tc, &ivas_param_mc_icc_mapping_CICP12_2tc, - &ivas_param_mc_dmx_fac_CICP12_2tc[0], - &ivas_param_mc_ild_fac_CICP12_2tc[0] + &ivas_param_mc_dmx_fac_CICP12_2tc[0], #ifdef NONBE_FIX_1165_STATIC_SCAL_PARAMMC - , + &ivas_param_mc_ild_fac_CICP12_2tc[0], ivas_param_mc_dmx_scal_fac_CICP12_2tc_static, ivas_param_mc_dmx_scal_fac_CICP12_2tc_static_inv +#else + &ivas_param_mc_ild_fac_CICP12_2tc[0] #endif }, /* CICP12 80000 */ @@ -2248,11 +2260,12 @@ const PARAM_MC_CONF ivas_param_mc_conf[PARAM_MC_NUM_CONFIGS] = &ivas_param_mc_ild_mapping_CICP12_2tc, &ivas_param_mc_icc_mapping_CICP12_2tc, &ivas_param_mc_dmx_fac_CICP12_2tc[0], - &ivas_param_mc_ild_fac_CICP12_2tc[0] #ifdef NONBE_FIX_1165_STATIC_SCAL_PARAMMC - , + &ivas_param_mc_ild_fac_CICP12_2tc[0], ivas_param_mc_dmx_scal_fac_CICP12_2tc_static, ivas_param_mc_dmx_scal_fac_CICP12_2tc_static_inv +#else + &ivas_param_mc_ild_fac_CICP12_2tc[0] #endif }, /* CICP12 96000 */ @@ -2263,12 +2276,13 @@ const PARAM_MC_CONF ivas_param_mc_conf[PARAM_MC_NUM_CONFIGS] = IVAS_96k, &ivas_param_mc_ild_mapping_CICP12_3tc, &ivas_param_mc_icc_mapping_CICP12_3tc, - &ivas_param_mc_dmx_fac_CICP12_3tc[0], - &ivas_param_mc_ild_fac_CICP12_3tc[0] + &ivas_param_mc_dmx_fac_CICP12_3tc[0], #ifdef NONBE_FIX_1165_STATIC_SCAL_PARAMMC - , + &ivas_param_mc_ild_fac_CICP12_3tc[0], ivas_param_mc_dmx_scal_fac_CICP12_3tc_static, ivas_param_mc_dmx_scal_fac_CICP12_3tc_static_inv +#else + &ivas_param_mc_ild_fac_CICP12_3tc[0] #endif }, /* CICP14 48000 */ @@ -2279,12 +2293,13 @@ const PARAM_MC_CONF ivas_param_mc_conf[PARAM_MC_NUM_CONFIGS] = IVAS_48k, &ivas_param_mc_ild_mapping_CICP14_2tc, &ivas_param_mc_icc_mapping_CICP14_2tc, - &ivas_param_mc_dmx_fac_CICP14_2tc[0], - &ivas_param_mc_ild_fac_CICP14_2tc[0] + &ivas_param_mc_dmx_fac_CICP14_2tc[0], #ifdef NONBE_FIX_1165_STATIC_SCAL_PARAMMC - , + &ivas_param_mc_ild_fac_CICP14_2tc[0], ivas_param_mc_dmx_scal_fac_CICP14_2tc_static, ivas_param_mc_dmx_scal_fac_CICP14_2tc_static_inv +#else + &ivas_param_mc_ild_fac_CICP14_2tc[0] #endif }, /* CICP14 64000 */ @@ -2295,12 +2310,13 @@ const PARAM_MC_CONF ivas_param_mc_conf[PARAM_MC_NUM_CONFIGS] = IVAS_64k, &ivas_param_mc_ild_mapping_CICP14_2tc, &ivas_param_mc_icc_mapping_CICP14_2tc, - &ivas_param_mc_dmx_fac_CICP14_2tc[0], - &ivas_param_mc_ild_fac_CICP14_2tc[0] + &ivas_param_mc_dmx_fac_CICP14_2tc[0], #ifdef NONBE_FIX_1165_STATIC_SCAL_PARAMMC - , + &ivas_param_mc_ild_fac_CICP14_2tc[0], ivas_param_mc_dmx_scal_fac_CICP14_2tc_static, ivas_param_mc_dmx_scal_fac_CICP14_2tc_static_inv +#else + &ivas_param_mc_ild_fac_CICP14_2tc[0] #endif }, /* CICP14 80000 */ @@ -2311,12 +2327,13 @@ const PARAM_MC_CONF ivas_param_mc_conf[PARAM_MC_NUM_CONFIGS] = IVAS_80k, &ivas_param_mc_ild_mapping_CICP14_2tc, &ivas_param_mc_icc_mapping_CICP14_2tc, - &ivas_param_mc_dmx_fac_CICP14_2tc[0], - &ivas_param_mc_ild_fac_CICP14_2tc[0] + &ivas_param_mc_dmx_fac_CICP14_2tc[0], #ifdef NONBE_FIX_1165_STATIC_SCAL_PARAMMC - , + &ivas_param_mc_ild_fac_CICP14_2tc[0], ivas_param_mc_dmx_scal_fac_CICP14_2tc_static, ivas_param_mc_dmx_scal_fac_CICP14_2tc_static_inv +#else + &ivas_param_mc_ild_fac_CICP14_2tc[0] #endif }, /* CICP14 96000 */ @@ -2328,11 +2345,12 @@ const PARAM_MC_CONF ivas_param_mc_conf[PARAM_MC_NUM_CONFIGS] = &ivas_param_mc_ild_mapping_CICP14_3tc, &ivas_param_mc_icc_mapping_CICP14_3tc, &ivas_param_mc_dmx_fac_CICP14_3tc[0], - &ivas_param_mc_ild_fac_CICP14_3tc[0] #ifdef NONBE_FIX_1165_STATIC_SCAL_PARAMMC - , + &ivas_param_mc_ild_fac_CICP14_3tc[0], ivas_param_mc_dmx_scal_fac_CICP14_3tc_static, ivas_param_mc_dmx_scal_fac_CICP14_3tc_static_inv +#else + &ivas_param_mc_ild_fac_CICP14_3tc[0] #endif }, /* CICP16 96000 */ @@ -2343,12 +2361,13 @@ const PARAM_MC_CONF ivas_param_mc_conf[PARAM_MC_NUM_CONFIGS] = IVAS_96k, &ivas_param_mc_ild_mapping_CICP16_3tc, &ivas_param_mc_icc_mapping_CICP16_3tc, - &ivas_param_mc_dmx_fac_CICP16_3tc[0], - &ivas_param_mc_ild_fac_CICP16_3tc[0] + &ivas_param_mc_dmx_fac_CICP16_3tc[0], #ifdef NONBE_FIX_1165_STATIC_SCAL_PARAMMC - , + &ivas_param_mc_ild_fac_CICP16_3tc[0], ivas_param_mc_dmx_scal_fac_CICP16_3tc_static, ivas_param_mc_dmx_scal_fac_CICP16_3tc_static_inv +#else + &ivas_param_mc_ild_fac_CICP16_3tc[0] #endif }, /* CICP16 128000 */ @@ -2359,12 +2378,13 @@ const PARAM_MC_CONF ivas_param_mc_conf[PARAM_MC_NUM_CONFIGS] = IVAS_128k, &ivas_param_mc_ild_mapping_CICP16_3tc, &ivas_param_mc_icc_mapping_CICP16_3tc, - &ivas_param_mc_dmx_fac_CICP16_3tc[0], - &ivas_param_mc_ild_fac_CICP16_3tc[0] + &ivas_param_mc_dmx_fac_CICP16_3tc[0], #ifdef NONBE_FIX_1165_STATIC_SCAL_PARAMMC - , + &ivas_param_mc_ild_fac_CICP16_3tc[0], ivas_param_mc_dmx_scal_fac_CICP16_3tc_static, ivas_param_mc_dmx_scal_fac_CICP16_3tc_static_inv +#else + &ivas_param_mc_ild_fac_CICP16_3tc[0] #endif }, /* CICP19 128000 */ @@ -2375,12 +2395,13 @@ const PARAM_MC_CONF ivas_param_mc_conf[PARAM_MC_NUM_CONFIGS] = IVAS_128k, &ivas_param_mc_ild_mapping_CICP19_3tc, &ivas_param_mc_icc_mapping_CICP19_3tc, - &ivas_param_mc_dmx_fac_CICP19_3tc[0], - &ivas_param_mc_ild_fac_CICP19_3tc[0] + &ivas_param_mc_dmx_fac_CICP19_3tc[0], #ifdef NONBE_FIX_1165_STATIC_SCAL_PARAMMC - , + &ivas_param_mc_ild_fac_CICP19_3tc[0], ivas_param_mc_dmx_scal_fac_CICP19_3tc_static, ivas_param_mc_dmx_scal_fac_CICP19_3tc_static_inv +#else + &ivas_param_mc_ild_fac_CICP19_3tc[0] #endif } }; diff --git a/lib_com/options.h b/lib_com/options.h index f03a2256ff..258929dedb 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -48,7 +48,7 @@ /* ################### Start DEBUGGING switches ########################### */ #ifndef RELEASE -/*#define DEBUGGING*/ /* Activate debugging part of the code */ +#define DEBUGGING /* Activate debugging part of the code */ #endif /*#define WMOPS*/ /* Activate complexity and memory counters */ /*#define WMOPS_PER_FRAME*/ /* Output per-frame complexity (writes one float value per frame to the file "wmops_analysis") */ @@ -200,7 +200,7 @@ #define NONBE_FIX_1165_STATIC_SCAL_PARAMMC /* FhG: add static scaling to ParamMC DMX */ -/*#define NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX*/ /* FhG: apply the limiter before the core encoder for formats with downmixing where the signal could exceed the 16-bit value range */ +#define NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX /* FhG: apply the limiter before the core encoder for formats with downmixing where the signal could exceed the 16-bit value range */ #define NONBE_FIX_1174_MCMASA_LBR_LOOP_ERROR /* Nokia: Fix issue 1174 by removing the unnecessary inner loop causing problems. */ /* ##################### End NON-BE switches ########################### */ diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 9245d88513..d7ccb3f9b1 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -654,10 +654,12 @@ ivas_error ivas_jbm_dec_tc( } #ifdef NONBE_FIX_1165_STATIC_SCAL_PARAMMC + /* Revert scaling done to the downmix in the encoder */ for ( n = 0; n < st_ivas->nchan_transport; n++ ) { v_multc( p_output[n], st_ivas->hParamMC->static_dmx_fac, p_output[n], output_frame ); } + #endif /* Rendering */ if ( output_config == IVAS_AUDIO_CONFIG_MONO || output_config == IVAS_AUDIO_CONFIG_STEREO ) diff --git a/lib_dec/ivas_masa_dec.c b/lib_dec/ivas_masa_dec.c index 6411789a10..9c3fa8f5fb 100644 --- a/lib_dec/ivas_masa_dec.c +++ b/lib_dec/ivas_masa_dec.c @@ -454,6 +454,7 @@ ivas_error ivas_masa_decode( { #ifdef NONBE_FIX_1165_STATIC_SCAL_OMASA hMasa->config.input_ivas_format = MASA_FORMAT; /* Default in SID as OMASA does not support SID */ + #endif if ( hQMetaData->q_direction == NULL ) { diff --git a/lib_dec/ivas_mcmasa_dec.c b/lib_dec/ivas_mcmasa_dec.c index 7b1632213f..811a240900 100755 --- a/lib_dec/ivas_mcmasa_dec.c +++ b/lib_dec/ivas_mcmasa_dec.c @@ -101,7 +101,12 @@ ivas_error ivas_mcmasa_dec_reconfig( #ifdef NONBE_FIX_1165_STATIC_SCAL_MCMASA -/* Gain decoded signals to match the gains applied to the downmix signals in the encoder */ +/*------------------------------------------------------------------------- + * ivas_mcmasa_gain_umx() + * + * Gain decoded signals to match the gains applied to the downmix signals in the encoder + *------------------------------------------------------------------------*/ + void ivas_mcmasa_gain_umx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ float *data_f[], /* i/o: output signals */ diff --git a/lib_dec/ivas_omasa_dec.c b/lib_dec/ivas_omasa_dec.c index 2ae871e323..020a98c898 100644 --- a/lib_dec/ivas_omasa_dec.c +++ b/lib_dec/ivas_omasa_dec.c @@ -1426,7 +1426,13 @@ void ivas_omasa_render_objects_from_mix( } #ifdef NONBE_FIX_1165_STATIC_SCAL_OMASA -/* Gain decoded signals to match the gains applied to the downmix signals in the encoder */ + +/*--------------------------------------------------------------------------* + * ivas_omasa_gain_umx() + * + * Gain decoded signals to match the gains applied to the downmix signals in the encoder + *--------------------------------------------------------------------------*/ + void ivas_omasa_gain_umx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ float *data_f[], /* i/o: output signals */ diff --git a/lib_enc/ivas_enc.c b/lib_enc/ivas_enc.c index 9e9468c529..1583dd4c33 100644 --- a/lib_enc/ivas_enc.c +++ b/lib_enc/ivas_enc.c @@ -64,11 +64,7 @@ ivas_error ivas_enc( float *data_f[MAX_INPUT_CHANNELS + MAX_NUM_OBJECTS]; int32_t ivas_total_brate; ivas_error error; -#ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX - int16_t BER_detect_dummy; - BER_detect_dummy = 0; -#endif error = IVAS_ERR_OK; push_wmops( "ivas_enc" ); @@ -202,7 +198,7 @@ ivas_error ivas_enc( #ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX /* Apply limiter on downmix */ - ivas_limiter_apply( st_ivas->hLimiter, data_f, MAX_PARAM_ISM_WAVE, input_frame, BER_detect_dummy ); + ivas_limiter_apply( st_ivas->hLimiter, data_f, MAX_PARAM_ISM_WAVE, input_frame, 0 ); #endif /* Core coding of Stereo DMX */ @@ -260,7 +256,7 @@ ivas_error ivas_enc( #ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX /* Apply limiter on transport channels */ - ivas_limiter_apply( st_ivas->hLimiter, data_f, st_ivas->nchan_transport, input_frame, BER_detect_dummy ); + ivas_limiter_apply( st_ivas->hLimiter, data_f, st_ivas->nchan_transport, input_frame, 0 ); #endif } @@ -323,11 +319,10 @@ ivas_error ivas_enc( #ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX /* Apply limiter on downmix */ - ivas_limiter_apply( st_ivas->hLimiter, &data_f[st_ivas->hEncoderConfig->nchan_ism], CPE_CHANNELS, input_frame, BER_detect_dummy ); + ivas_limiter_apply( st_ivas->hLimiter, &data_f[hEncoderConfig->nchan_ism], CPE_CHANNELS, input_frame, 0 ); #endif } - /* Encode ISMs transport channels */ n = 0; if ( st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) @@ -416,7 +411,7 @@ ivas_error ivas_enc( #ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX /* Apply limiter on SBA channels */ - ivas_limiter_apply( st_ivas->hLimiter, data_f, st_ivas->nchan_transport, input_frame, BER_detect_dummy ); + ivas_limiter_apply( st_ivas->hLimiter, data_f, st_ivas->nchan_transport, input_frame, 0 ); #endif } else @@ -440,7 +435,7 @@ ivas_error ivas_enc( #ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX /* Apply limiter on SBA channels */ - ivas_limiter_apply( st_ivas->hLimiter, &data_f[n], st_ivas->nchan_transport, input_frame, BER_detect_dummy ); + ivas_limiter_apply( st_ivas->hLimiter, &data_f[n], st_ivas->nchan_transport, input_frame, 0 ); #endif } @@ -515,7 +510,7 @@ ivas_error ivas_enc( #ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX /* Apply limiter on downmix */ - ivas_limiter_apply( st_ivas->hLimiter, data_f, st_ivas->nchan_transport, input_frame, BER_detect_dummy ); + ivas_limiter_apply( st_ivas->hLimiter, data_f, st_ivas->nchan_transport, input_frame, 0 ); #endif if ( st_ivas->nCPE == 1 ) /* Stereo DMX */ @@ -550,7 +545,7 @@ ivas_error ivas_enc( #ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX /* Apply limiter on downmix */ - ivas_limiter_apply( st_ivas->hLimiter, data_f, st_ivas->hMcMasa->separateChannelEnabled ? st_ivas->nchan_transport + 1 : st_ivas->nchan_transport, input_frame, BER_detect_dummy ); + ivas_limiter_apply( st_ivas->hLimiter, data_f, st_ivas->hMcMasa->separateChannelEnabled ? st_ivas->nchan_transport + 1 : st_ivas->nchan_transport, input_frame, 0 ); #endif if ( st_ivas->hMcMasa->separateChannelEnabled ) diff --git a/lib_enc/ivas_mc_param_enc.c b/lib_enc/ivas_mc_param_enc.c index 3390c6d739..5247f7f8b5 100644 --- a/lib_enc/ivas_mc_param_enc.c +++ b/lib_enc/ivas_mc_param_enc.c @@ -545,6 +545,8 @@ static void ivas_param_mc_dmx( ( *dmx_sample ) += data_f[idx[inp_ch]][i] * ( *( p_dmx_fac++ ) ); } #ifdef NONBE_FIX_1165_STATIC_SCAL_PARAMMC + + /* Apply scaling gain to prevent clipping of downmix signals */ *dmx_sample *= hParamMC->static_dmx_fac_inv; #endif } diff --git a/lib_enc/ivas_mcmasa_enc.c b/lib_enc/ivas_mcmasa_enc.c index c7d4c41261..7b7ce1143a 100644 --- a/lib_enc/ivas_mcmasa_enc.c +++ b/lib_enc/ivas_mcmasa_enc.c @@ -671,7 +671,7 @@ void ivas_mcmasa_enc( } #ifdef NONBE_FIX_1165_STATIC_SCAL_MCMASA - /* Apply gains to prevent clipping of downmix signals */ + /* Apply scaling gain to prevent clipping of downmix signals */ ivas_mcmasa_gain_dmx( hMcMasa, data_f, input_frame, nchan_transport, hQMeta->q_direction->cfg.mc_ls_setup ); #endif diff --git a/lib_enc/ivas_omasa_enc.c b/lib_enc/ivas_omasa_enc.c index 564f16dc35..1248e35176 100644 --- a/lib_enc/ivas_omasa_enc.c +++ b/lib_enc/ivas_omasa_enc.c @@ -637,7 +637,7 @@ void ivas_omasa_enc( ivas_merge_masa_transports( data_out_f, &( data_in_f[nchan_ism] ), data_in_f, input_frame, nchan_transport ); #ifdef NONBE_FIX_1165_STATIC_SCAL_OMASA - /* Apply scaling gain */ + /* Apply scaling gain to prevent clipping of downmix signals */ ivas_omasa_gain_dmx( ism_mode, data_in_f, nchan_transport, nchan_ism, input_frame ); #endif -- GitLab From d5c3095ad825a2ecbb9f23e4dd4547816735b159 Mon Sep 17 00:00:00 2001 From: vaclav Date: Fri, 13 Sep 2024 09:22:31 +0200 Subject: [PATCH 24/31] output number of clipped samples in downmixed channels; under DEBUGGING --- apps/encoder.c | 6 +++++- lib_com/options.h | 4 ++-- lib_com/prot.h | 9 +++++++++ lib_com/tools.c | 33 +++++++++++++++++++++++++++++++++ lib_enc/ivas_cpe_enc.c | 4 ++++ lib_enc/ivas_init_enc.c | 3 +++ lib_enc/ivas_ism_enc.c | 4 ++++ lib_enc/ivas_sce_enc.c | 4 ++++ lib_enc/ivas_stat_enc.h | 8 +++++--- lib_enc/lib_enc.c | 13 +++++++++++++ lib_enc/lib_enc.h | 4 ++++ 11 files changed, 86 insertions(+), 6 deletions(-) diff --git a/apps/encoder.c b/apps/encoder.c index a0f7796206..957c760c27 100644 --- a/apps/encoder.c +++ b/apps/encoder.c @@ -195,6 +195,7 @@ int main( #ifdef DEBUG_SBA int16_t numTransportChannels = 1; #endif + int32_t cnt_frames_limited, noClipping; #endif #ifdef DEBUGGING @@ -792,11 +793,14 @@ int main( } #ifdef DEBUGGING - int32_t cnt_frames_limited; if ( ( cnt_frames_limited = IVAS_ENC_GetCntFramesLimited( hIvasEnc ) ) > 0 ) { fprintf( stdout, "\nLimiter applied in %d frames.\n\n", cnt_frames_limited ); } + if ( ( noClipping = IVAS_ENC_GetNoCLipping( hIvasEnc ) ) > 0 ) + { + fprintf( stdout, "Clipping (saturation) detected: %d samples clipped!!!\n\n", noClipping ); + } print_snr(); #endif diff --git a/lib_com/options.h b/lib_com/options.h index 258929dedb..f03a2256ff 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -48,7 +48,7 @@ /* ################### Start DEBUGGING switches ########################### */ #ifndef RELEASE -#define DEBUGGING /* Activate debugging part of the code */ +/*#define DEBUGGING*/ /* Activate debugging part of the code */ #endif /*#define WMOPS*/ /* Activate complexity and memory counters */ /*#define WMOPS_PER_FRAME*/ /* Output per-frame complexity (writes one float value per frame to the file "wmops_analysis") */ @@ -200,7 +200,7 @@ #define NONBE_FIX_1165_STATIC_SCAL_PARAMMC /* FhG: add static scaling to ParamMC DMX */ -#define NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX /* FhG: apply the limiter before the core encoder for formats with downmixing where the signal could exceed the 16-bit value range */ +/*#define NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX*/ /* FhG: apply the limiter before the core encoder for formats with downmixing where the signal could exceed the 16-bit value range */ #define NONBE_FIX_1174_MCMASA_LBR_LOOP_ERROR /* Nokia: Fix issue 1174 by removing the unnecessary inner loop causing problems. */ /* ##################### End NON-BE switches ########################### */ diff --git a/lib_com/prot.h b/lib_com/prot.h index 4f4222b2f9..401b557a10 100644 --- a/lib_com/prot.h +++ b/lib_com/prot.h @@ -222,6 +222,15 @@ void mvs2s( const int16_t n /* i : vector size */ ); +#ifdef DEBUGGING +/*! r: number of clipped samples */ +uint32_t check_clipping( + const float x[], /* i : input vector */ + const int16_t n /* i : vector size */ +); + +#endif +/*! r: number of clipped samples */ uint32_t mvr2s( const float x[], /* i : input vector */ int16_t y[], /* o : output vector */ diff --git a/lib_com/tools.c b/lib_com/tools.c index 9dfa8b9f81..0f90282039 100644 --- a/lib_com/tools.c +++ b/lib_com/tools.c @@ -373,6 +373,39 @@ void mvs2s( return; } +#ifdef DEBUGGING +/*! r: number of clipped samples */ +uint32_t check_clipping( + const float x[], /* i : input vector */ + const int16_t n /* i : vector size */ +) +{ + int16_t i; + float temp; + uint32_t noClipping = 0; + + for ( i = 0; i < n; i++ ) + { + temp = x[i]; + temp = (float) floor( temp + 0.5f ); + + if ( temp > MAX16B_FLT ) + { + temp = MAX16B_FLT; + noClipping++; + } + else if ( temp < MIN16B_FLT ) + { + temp = MIN16B_FLT; + noClipping++; + } + } + + return noClipping; +} + +#endif +/*! r: number of clipped samples */ uint32_t mvr2s( const float x[], /* i : input vector */ int16_t y[], /* o : output vector */ diff --git a/lib_enc/ivas_cpe_enc.c b/lib_enc/ivas_cpe_enc.c index a3a2bec257..5ab323c39d 100644 --- a/lib_enc/ivas_cpe_enc.c +++ b/lib_enc/ivas_cpe_enc.c @@ -471,6 +471,10 @@ ivas_error ivas_cpe_enc( for ( n = 0; n < n_CoreChannels; n++ ) { +#ifdef DEBUGGING + st_ivas->noClipping += check_clipping( hCPE->hCoreCoder[n]->input, input_frame ); + +#endif error = pre_proc_front_ivas( NULL, hCPE, hCPE->element_brate, nb_bits_metadata, input_frame, n, old_inp_12k8[n], old_inp_16k[n], &ener[n], &relE[n], A[n], Aw[n], epsP[n], lsp_new[n], lsp_mid[n], &vad_hover_flag[n], &attack_flag[n], realBuffer[n], imagBuffer[n], old_wsp[n], pitch_fr[n], voicing_fr[n], &loc_harm[n], &cor_map_sum[n], &vad_flag_dtx[n], enerBuffer[n], diff --git a/lib_enc/ivas_init_enc.c b/lib_enc/ivas_init_enc.c index 484c5d8716..2c72dd9cd5 100644 --- a/lib_enc/ivas_init_enc.c +++ b/lib_enc/ivas_init_enc.c @@ -415,6 +415,9 @@ ivas_error ivas_init_encoder( st_ivas->nchan_transport = -1; +#ifdef DEBUGGING + st_ivas->noClipping = 0; +#endif /*-----------------------------------------------------------------* * Allocate floating-point input audio buffers *-----------------------------------------------------------------*/ diff --git a/lib_enc/ivas_ism_enc.c b/lib_enc/ivas_ism_enc.c index 6e2732f44a..e3569f44ac 100644 --- a/lib_enc/ivas_ism_enc.c +++ b/lib_enc/ivas_ism_enc.c @@ -172,6 +172,10 @@ ivas_error ivas_ism_enc( * Front Pre-processing *----------------------------------------------------------------*/ +#ifdef DEBUGGING + st_ivas->noClipping += check_clipping( hSCE->hCoreCoder[0]->input, input_frame ); + +#endif error = pre_proc_front_ivas( hSCE, NULL, hSCE->element_brate, nb_bits_metadata[sce_id], input_frame, 0, old_inp_12k8[sce_id][0], old_inp_16k[sce_id][0], &ener[sce_id][0], &relE[sce_id][0], A[sce_id][0], Aw[sce_id][0], epsP[sce_id][0], lsp_new[sce_id][0], lsp_mid[sce_id][0], &vad_hover_flag[sce_id][0], &attack_flag[sce_id][0], realBuffer[sce_id][0], imagBuffer[sce_id][0], old_wsp[sce_id][0], pitch_fr[sce_id][0], voicing_fr[sce_id][0], &loc_harm[sce_id][0], &cor_map_sum[sce_id][0], &vad_flag_dtx[sce_id][0], enerBuffer[sce_id][0], diff --git a/lib_enc/ivas_sce_enc.c b/lib_enc/ivas_sce_enc.c index 8f5d472ea9..cb3d8dea6e 100644 --- a/lib_enc/ivas_sce_enc.c +++ b/lib_enc/ivas_sce_enc.c @@ -180,6 +180,10 @@ ivas_error ivas_sce_enc( * Front Pre-processing *----------------------------------------------------------------*/ +#ifdef DEBUGGING + st_ivas->noClipping += check_clipping( hSCE->hCoreCoder[0]->input, input_frame ); + +#endif error = pre_proc_front_ivas( hSCE, NULL, hSCE->element_brate, nb_bits_metadata, input_frame, 0, old_inp_12k8[0], old_inp_16k[0], &ener[0], &relE[0], A[0], Aw[0], epsP[0], lsp_new[0], lsp_mid[0], &vad_hover_flag[0], &attack_flag[0], realBuffer[0], imagBuffer[0], old_wsp[0], pitch_fr[0], voicing_fr[0], &loc_harm[0], &cor_map_sum[0], &vad_flag_dtx[0], enerBuffer[0], diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index 28fc01f1d6..f9278bcf45 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -1256,11 +1256,13 @@ typedef struct int16_t nSCE; /* number of total SCEs */ int16_t nCPE; /* number of total CPEs */ SCE_ENC_HANDLE hSCE[MAX_SCE]; /* SCE handles */ - CPE_ENC_HANDLE hCPE[MCT_MAX_BLOCKS]; /* CPE handles */ - + CPE_ENC_HANDLE hCPE[MCT_MAX_BLOCKS]; /* CPE handles */ #ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX - IVAS_LIMITER_HANDLE hLimiter; /* Limiter handle */ + IVAS_LIMITER_HANDLE hLimiter; /* Limiter handle */ +#endif +#ifdef DEBUGGING + int32_t noClipping; /* number of clipped samples */ #endif /* multichannel modules */ diff --git a/lib_enc/lib_enc.c b/lib_enc/lib_enc.c index 892be5aa32..280d208533 100644 --- a/lib_enc/lib_enc.c +++ b/lib_enc/lib_enc.c @@ -2439,4 +2439,17 @@ int32_t IVAS_ENC_GetCntFramesLimited( return hIvasEnc->st_ivas->hLimiter->cnt_frames_limited; } } + +/*---------------------------------------------------------------------* + * IVAS_ENC_GetNoCLipping() + * + * return number of clipped samples + *---------------------------------------------------------------------*/ + +int32_t IVAS_ENC_GetNoCLipping( + IVAS_ENC_HANDLE hIvasEnc /* i : IVAS encoder handle */ +) +{ + return hIvasEnc->st_ivas->noClipping; +} #endif diff --git a/lib_enc/lib_enc.h b/lib_enc/lib_enc.h index 8918d6c612..c0bd0a115a 100644 --- a/lib_enc/lib_enc.h +++ b/lib_enc/lib_enc.h @@ -387,6 +387,10 @@ void IVAS_ENC_PrintDisclaimer( int32_t IVAS_ENC_GetCntFramesLimited( IVAS_ENC_HANDLE hIvasEnc /* i : IVAS encoder handle */ ); + +int32_t IVAS_ENC_GetNoCLipping( + IVAS_ENC_HANDLE hIvasEnc /* i : IVAS encoder handle */ +); #endif /* clang-format on */ -- GitLab From ecc5069033b6aa2974d70eee8b4267832086c7bb Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Wed, 18 Sep 2024 12:13:34 +0300 Subject: [PATCH 25/31] Add scaling to McMASA to STEREO decoding path --- lib_dec/ivas_jbm_dec.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index c73bfd10a7..a010eb80e7 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -741,6 +741,11 @@ ivas_error ivas_jbm_dec_tc( if ( st_ivas->sba_dirac_stereo_flag ) /* use the flag to trigger the DFT upmix */ { ivas_sba_dirac_stereo_dec( st_ivas, p_output, output_frame, 1 ); +#ifdef NONBE_FIX_1165_STATIC_SCAL_MCMASA + + /* Revert scaling done to the downmix in the encoder */ + ivas_mcmasa_gain_umx( st_ivas, p_output, output_frame ); +#endif } /* HP filtering */ -- GitLab From 1df39ca6da0458dfd86a1a583b52dd7c75624725 Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Wed, 18 Sep 2024 14:41:36 +0300 Subject: [PATCH 26/31] Revert "Add scaling to McMASA to STEREO decoding path" This reverts commit ecc5069033b6aa2974d70eee8b4267832086c7bb. --- lib_dec/ivas_jbm_dec.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index a010eb80e7..c73bfd10a7 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -741,11 +741,6 @@ ivas_error ivas_jbm_dec_tc( if ( st_ivas->sba_dirac_stereo_flag ) /* use the flag to trigger the DFT upmix */ { ivas_sba_dirac_stereo_dec( st_ivas, p_output, output_frame, 1 ); -#ifdef NONBE_FIX_1165_STATIC_SCAL_MCMASA - - /* Revert scaling done to the downmix in the encoder */ - ivas_mcmasa_gain_umx( st_ivas, p_output, output_frame ); -#endif } /* HP filtering */ -- GitLab From 038c90739a1a66168e31643c31343d1d3cf4cc83 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Fri, 20 Sep 2024 14:22:08 +0200 Subject: [PATCH 27/31] introduce scaling factor for pre-rendered OSBA modes --- lib_com/ivas_cnst.h | 1 + lib_com/options.h | 4 +++- lib_dec/ivas_jbm_dec.c | 14 +++++++++++++- lib_enc/ivas_osba_enc.c | 6 +++++- 4 files changed, 22 insertions(+), 3 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 29c3f10c15..299a21b2da 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -1835,5 +1835,6 @@ typedef enum #define ivas_omasa_dmx_scal_fac_5ch_static_inv ( 1.0f / ivas_omasa_dmx_scal_fac_5ch_static ) #endif + /* clang-format on */ /* IVAS_CNST_H */ diff --git a/lib_com/options.h b/lib_com/options.h index dc020ce4d7..aced61c7c0 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -181,12 +181,14 @@ #define NONBE_FIX_1165_STATIC_SCAL_MCMASA /* Nok: add static scaling to McMASA DMX */ #define NONBE_FIX_1165_STATIC_SCAL_OMASA /* Nok: add static scaling to OMASA DMX */ - +#define NONBE_FIX_1165_STATIC_SCAL_OSBA_PREREND /* FhG: static scaling factor for pre-rendered OSBA modes */ #define NONBE_FIX_1165_STATIC_SCAL_PARAMMC /* FhG: add static scaling to ParamMC DMX */ /*#define NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX*/ /* FhG: apply the limiter before the core encoder for formats with downmixing where the signal could exceed the 16-bit value range */ #define NONBE_FIX_1174_MCMASA_LBR_LOOP_ERROR /* Nokia: Fix issue 1174 by removing the unnecessary inner loop causing problems. */ + + /* ##################### End NON-BE switches ########################### */ /* ################## End DEVELOPMENT switches ######################### */ diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index c73bfd10a7..f91aa8392d 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -1340,13 +1340,25 @@ ivas_error ivas_jbm_dec_render( else if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) { ivas_dirac_dec_binaural_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, nchan_remapped, p_output ); - } +#ifdef NONBE_FIX_1165_STATIC_SCAL_OSBA_PREREND + for (n = 0; n < nchan_out; n++) + { + v_multc(p_output[n], 2.0f, p_output[n], *nSamplesRendered); + } +#endif + } else { if ( ( error = ivas_sba_dec_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output ) ) != IVAS_ERR_OK ) { return error; } +#ifdef NONBE_FIX_1165_STATIC_SCAL_OSBA_PREREND + for(n = 0; n < nchan_out; n++) + { + v_multc(p_output[n], 2.0f, p_output[n], *nSamplesRendered); + } +#endif if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) { diff --git a/lib_enc/ivas_osba_enc.c b/lib_enc/ivas_osba_enc.c index b00396bfab..f5b2d127e3 100644 --- a/lib_enc/ivas_osba_enc.c +++ b/lib_enc/ivas_osba_enc.c @@ -72,7 +72,11 @@ static void ivas_merge_sba_transports( { for ( j = 0; j < input_frame; j++ ) { - data_out_f[i][j] = 0.5f * ( data_in_f1[i][j] + data_in_f2[i][j] ); +#ifdef NONBE_FIX_1165_STATIC_SCAL_OSBA_PREREND + data_out_f[i][j] = 0.25f * ( data_in_f1[i][j] + data_in_f2[i][j] ); +#else + data_out_f[i][j] = 0.5f * (data_in_f1[i][j] + data_in_f2[i][j]); +#endif } } -- GitLab From 15a7c10f09d1f5df744b1bb6961ce6d5cfac5529 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Fri, 20 Sep 2024 14:23:38 +0200 Subject: [PATCH 28/31] fix formatting --- lib_dec/ivas_jbm_dec.c | 18 +++++++++--------- lib_enc/ivas_osba_enc.c | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index f91aa8392d..18b80b350a 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -1341,12 +1341,12 @@ ivas_error ivas_jbm_dec_render( { ivas_dirac_dec_binaural_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, nchan_remapped, p_output ); #ifdef NONBE_FIX_1165_STATIC_SCAL_OSBA_PREREND - for (n = 0; n < nchan_out; n++) - { - v_multc(p_output[n], 2.0f, p_output[n], *nSamplesRendered); - } + for ( n = 0; n < nchan_out; n++ ) + { + v_multc( p_output[n], 2.0f, p_output[n], *nSamplesRendered ); + } #endif - } + } else { if ( ( error = ivas_sba_dec_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output ) ) != IVAS_ERR_OK ) @@ -1354,10 +1354,10 @@ ivas_error ivas_jbm_dec_render( return error; } #ifdef NONBE_FIX_1165_STATIC_SCAL_OSBA_PREREND - for(n = 0; n < nchan_out; n++) - { - v_multc(p_output[n], 2.0f, p_output[n], *nSamplesRendered); - } + for ( n = 0; n < nchan_out; n++ ) + { + v_multc( p_output[n], 2.0f, p_output[n], *nSamplesRendered ); + } #endif if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) diff --git a/lib_enc/ivas_osba_enc.c b/lib_enc/ivas_osba_enc.c index f5b2d127e3..d80ba381b1 100644 --- a/lib_enc/ivas_osba_enc.c +++ b/lib_enc/ivas_osba_enc.c @@ -75,7 +75,7 @@ static void ivas_merge_sba_transports( #ifdef NONBE_FIX_1165_STATIC_SCAL_OSBA_PREREND data_out_f[i][j] = 0.25f * ( data_in_f1[i][j] + data_in_f2[i][j] ); #else - data_out_f[i][j] = 0.5f * (data_in_f1[i][j] + data_in_f2[i][j]); + data_out_f[i][j] = 0.5f * ( data_in_f1[i][j] + data_in_f2[i][j] ); #endif } } -- GitLab From 5f67b4023abcb38bf160281ba7f2df0ee85ccea3 Mon Sep 17 00:00:00 2001 From: vaclav Date: Tue, 24 Sep 2024 18:21:58 +0200 Subject: [PATCH 29/31] fix compilation when DEBUGGINH is activated and NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX deactivated --- apps/encoder.c | 4 ++++ lib_enc/lib_enc.c | 2 ++ lib_enc/lib_enc.h | 2 ++ 3 files changed, 8 insertions(+) diff --git a/apps/encoder.c b/apps/encoder.c index 957c760c27..e8a4f880b7 100644 --- a/apps/encoder.c +++ b/apps/encoder.c @@ -195,8 +195,10 @@ int main( #ifdef DEBUG_SBA int16_t numTransportChannels = 1; #endif +#ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX int32_t cnt_frames_limited, noClipping; #endif +#endif #ifdef DEBUGGING dbgargs( &argc, argv ); @@ -793,6 +795,7 @@ int main( } #ifdef DEBUGGING +#ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX if ( ( cnt_frames_limited = IVAS_ENC_GetCntFramesLimited( hIvasEnc ) ) > 0 ) { fprintf( stdout, "\nLimiter applied in %d frames.\n\n", cnt_frames_limited ); @@ -801,6 +804,7 @@ int main( { fprintf( stdout, "Clipping (saturation) detected: %d samples clipped!!!\n\n", noClipping ); } +#endif print_snr(); #endif diff --git a/lib_enc/lib_enc.c b/lib_enc/lib_enc.c index 280d208533..05dafc660e 100644 --- a/lib_enc/lib_enc.c +++ b/lib_enc/lib_enc.c @@ -2419,6 +2419,7 @@ static void init_encoder_config( } #ifdef DEBUGGING +#ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX /*---------------------------------------------------------------------* * IVAS_ENC_GetCntFramesLimited() @@ -2453,3 +2454,4 @@ int32_t IVAS_ENC_GetNoCLipping( return hIvasEnc->st_ivas->noClipping; } #endif +#endif diff --git a/lib_enc/lib_enc.h b/lib_enc/lib_enc.h index c0bd0a115a..2af7d5af70 100644 --- a/lib_enc/lib_enc.h +++ b/lib_enc/lib_enc.h @@ -384,6 +384,7 @@ void IVAS_ENC_PrintDisclaimer( ); #ifdef DEBUGGING +#ifdef NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX int32_t IVAS_ENC_GetCntFramesLimited( IVAS_ENC_HANDLE hIvasEnc /* i : IVAS encoder handle */ ); @@ -392,6 +393,7 @@ int32_t IVAS_ENC_GetNoCLipping( IVAS_ENC_HANDLE hIvasEnc /* i : IVAS encoder handle */ ); #endif +#endif /* clang-format on */ #endif /* LIB_ENC_H */ -- GitLab From e9175ff1972cf345997835802628eb1c7a2c3263 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 24 Sep 2024 20:47:07 +0200 Subject: [PATCH 30/31] for ParamMC: change static scaling to constant 4.0, which reduces the worst-case and corresponds to a simple 2-bit shift --- lib_com/ivas_rom_com.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib_com/ivas_rom_com.c b/lib_com/ivas_rom_com.c index 8a0a6b1cdb..949fc58602 100644 --- a/lib_com/ivas_rom_com.c +++ b/lib_com/ivas_rom_com.c @@ -1832,7 +1832,7 @@ const int16_t Param_MC_index[MAX_CICP_CHANNELS] = }; #ifdef NONBE_FIX_1165_STATIC_SCAL_PARAMMC -#define ivas_param_mc_dmx_scal_fac_CICP6_2tc_static (2.0f + 2.f * INV_SQRT2) +#define ivas_param_mc_dmx_scal_fac_CICP6_2tc_static 4.f /* orig: (2.0f + 2.f * INV_SQRT2) */ #define ivas_param_mc_dmx_scal_fac_CICP6_2tc_static_inv (1.f / ivas_param_mc_dmx_scal_fac_CICP6_2tc_static) #endif @@ -1843,7 +1843,7 @@ const float ivas_param_mc_dmx_fac_CICP6_2tc[12] = }; #ifdef NONBE_FIX_1165_STATIC_SCAL_PARAMMC -#define ivas_param_mc_dmx_scal_fac_CICP12_2tc_static (3.0f + 2.f * INV_SQRT2) +#define ivas_param_mc_dmx_scal_fac_CICP12_2tc_static 4.f /* orig: (3.0f + 2.f * INV_SQRT2) */ #define ivas_param_mc_dmx_scal_fac_CICP12_2tc_static_inv (1.f / ivas_param_mc_dmx_scal_fac_CICP12_2tc_static) #endif @@ -1854,7 +1854,7 @@ const float ivas_param_mc_dmx_fac_CICP12_2tc[16] = }; #ifdef NONBE_FIX_1165_STATIC_SCAL_PARAMMC -#define ivas_param_mc_dmx_scal_fac_CICP12_3tc_static (3.0f) +#define ivas_param_mc_dmx_scal_fac_CICP12_3tc_static 4.f /* orig: (3.0f) */ #define ivas_param_mc_dmx_scal_fac_CICP12_3tc_static_inv (1.f / ivas_param_mc_dmx_scal_fac_CICP12_3tc_static) #endif @@ -1866,7 +1866,7 @@ const float ivas_param_mc_dmx_fac_CICP12_3tc[24] = }; #ifdef NONBE_FIX_1165_STATIC_SCAL_PARAMMC -#define ivas_param_mc_dmx_scal_fac_CICP14_2tc_static (3.0f + 2.f * INV_SQRT2) +#define ivas_param_mc_dmx_scal_fac_CICP14_2tc_static 4.f /* orig: (3.0f + 2.f * INV_SQRT2) */ #define ivas_param_mc_dmx_scal_fac_CICP14_2tc_static_inv (1.f / ivas_param_mc_dmx_scal_fac_CICP14_2tc_static) #endif @@ -1877,7 +1877,7 @@ const float ivas_param_mc_dmx_fac_CICP14_2tc[16] = }; #ifdef NONBE_FIX_1165_STATIC_SCAL_PARAMMC -#define ivas_param_mc_dmx_scal_fac_CICP14_3tc_static (3.0f) +#define ivas_param_mc_dmx_scal_fac_CICP14_3tc_static 4.f /* orig: (3.0f) */ #define ivas_param_mc_dmx_scal_fac_CICP14_3tc_static_inv (1.f / ivas_param_mc_dmx_scal_fac_CICP14_3tc_static) #endif @@ -1901,7 +1901,7 @@ const float ivas_param_mc_dmx_fac_CICP16_3tc[30] = }; #ifdef NONBE_FIX_1165_STATIC_SCAL_PARAMMC -#define ivas_param_mc_dmx_scal_fac_CICP19_3tc_static (5.0f) +#define ivas_param_mc_dmx_scal_fac_CICP19_3tc_static 4.f /* orig: (5.0f) */ #define ivas_param_mc_dmx_scal_fac_CICP19_3tc_static_inv (1.f / ivas_param_mc_dmx_scal_fac_CICP19_3tc_static) #endif -- GitLab From ad825ca94b8c6c547f20796a95e480536bc0f116 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Thu, 26 Sep 2024 14:00:01 +0200 Subject: [PATCH 31/31] activate limiter --- lib_com/options.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index aced61c7c0..ab290ab6e4 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -184,7 +184,7 @@ #define NONBE_FIX_1165_STATIC_SCAL_OSBA_PREREND /* FhG: static scaling factor for pre-rendered OSBA modes */ #define NONBE_FIX_1165_STATIC_SCAL_PARAMMC /* FhG: add static scaling to ParamMC DMX */ -/*#define NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX*/ /* FhG: apply the limiter before the core encoder for formats with downmixing where the signal could exceed the 16-bit value range */ +#define NONBE_FIX_1165_APPLY_LIMITER_ON_ENCODER_DMX /* FhG: apply the limiter before the core encoder for formats with downmixing where the signal could exceed the 16-bit value range */ #define NONBE_FIX_1174_MCMASA_LBR_LOOP_ERROR /* Nokia: Fix issue 1174 by removing the unnecessary inner loop causing problems. */ -- GitLab