From 4a759afb95c84fcd797e63c99680839f7e2d6871 Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Thu, 16 Apr 2026 14:11:11 +0300 Subject: [PATCH] Port changes of float MR 2417 to BASOP. --- apps/renderer.c | 46 ++++++++++++++++++++++++++++++++ lib_com/ivas_cnst.h | 11 ++++++++ lib_com/options.h | 1 + lib_rend/ivas_render_config_fx.c | 39 +++++++++++++++++++++++++++ lib_rend/ivas_rom_rend_fx.c | 20 ++++++++++++++ lib_rend/lib_rend_fx.c | 8 ++++++ lib_util/render_config_reader.c | 6 +++++ 7 files changed, 131 insertions(+) diff --git a/apps/renderer.c b/apps/renderer.c index a11d07725..cfdaeee46 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -1174,7 +1174,53 @@ int main( fprintf( stderr, "\nError in Renderer Config Init: %s\n", ivas_error_to_string( error ) ); goto cleanup; } +#ifdef FIX_1452_DEFAULT_REVERB + if ( args.outConfig.audioConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) + { + /* Set reverb room size if specified or select based automatically based on default per input formats */ + IVAS_ROOM_SIZE_T selectedReverbRoomSize = args.reverbRoomSize; + if ( selectedReverbRoomSize == IVAS_ROOM_SIZE_AUTO ) + { + bool combinedFormat = false; + selectedReverbRoomSize = IVAS_ROOM_SIZE_MEDIUM; + + /* ISM present with MASA/SBA inputs; treat as combined format */ + if ( args.inConfig.numAudioObjects > 0 && ( args.inConfig.numMasaBuses > 0 || args.inConfig.numAmbisonicsBuses > 0 ) ) + { + combinedFormat = true; + } + + if ( combinedFormat ) + { + selectedReverbRoomSize = IVAS_ROOM_SIZE_MEDIUM; + } + else + { + /* Only set large if ISM is present alone, MASA and Ambisonic have been checked above */ + if ( args.inConfig.numAudioObjects > 0 && args.inConfig.numMultiChannelBuses == 0 ) + { + selectedReverbRoomSize = IVAS_ROOM_SIZE_LARGE; + } + /* if only MC is present, set medium; Will not be overridden by the subsequent block */ + else if ( args.inConfig.numMultiChannelBuses > 0 ) + { + selectedReverbRoomSize = IVAS_ROOM_SIZE_MEDIUM; + } + else if ( args.inConfig.numMasaBuses > 0 || args.inConfig.numAmbisonicsBuses > 0 ) + { + selectedReverbRoomSize = IVAS_ROOM_SIZE_SMALL; + } + } + } + + if ( ( error = IVAS_REND_SetReverbRoomSize( hIvasRend, selectedReverbRoomSize ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError setting reverb room size\n" ); + goto cleanup; + } + } +#endif if ( args.renderConfigFilePath[0] != '\0' ) { diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 2c83a0264..7bb753feb 100644 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -1640,6 +1640,17 @@ typedef enum #define IVAS_REVERB_DEFAULT_M_N_BANDS 31 #define IVAS_REVERB_DEFAULT_S_N_BANDS 60 +#ifdef FIX_1452_DEFAULT_REVERB +#define IVAS_REVERB_DEFAULT_S_ACOUSTIC_PRE_DELAY_FX 2013266 /* 0.015f in Q27 */ +#define IVAS_REVERB_DEFAULT_S_INPUT_PRE_DELAY_FX 2684355 /* 0.02f in Q27 */ + +#define IVAS_REVERB_DEFAULT_M_ACOUSTIC_PRE_DELAY_FX 2013266 /* 0.015f in Q27 */ +#define IVAS_REVERB_DEFAULT_M_INPUT_PRE_DELAY_FX 2684355 /* 0.02f in Q27 */ + +#define IVAS_REVERB_DEFAULT_L_ACOUSTIC_PRE_DELAY_FX 2181038 /* 0.01625f in Q27 */ +#define IVAS_REVERB_DEFAULT_L_INPUT_PRE_DELAY_FX 13421773 /* 0.1f in Q27 */ +#endif + #define LR_IAC_LENGTH_NR_FC ( RV_LENGTH_NR_FC ) #define LR_IAC_LENGTH_NR_FC_16KHZ ( RV_LENGTH_NR_FC_16KHZ ) diff --git a/lib_com/options.h b/lib_com/options.h index 074d03919..54bfbc146 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -121,6 +121,7 @@ #define FIX_BASOP_2522_MAP_PARAMS_DIRAC_STEREO /* FhG: BASOP issue 2522: Fix copy and paste error for side_gain calculation in map_params_dirac_to_stereo() */ #define FIX_2505_IVAS_DEC_SEGFAULT /* FhG: BASOP #2505: Add headroom to input of ivas_rend_crendProcessSubframe_fx() for ivas_mdft_fx() calculation */ #define HARMONIZE_DoRTFTn /* VA: harmonize functions DoRTFTn_fx() and DoRTFTn_fx_ivas() */ +#define FIX_1452_DEFAULT_REVERB /* Nokia/Philips/FhG: Fix default room presets and their usage in renderer */ /* ##################### End NON-BE switches ########################### */ diff --git a/lib_rend/ivas_render_config_fx.c b/lib_rend/ivas_render_config_fx.c index 81f66bf60..086970381 100644 --- a/lib_rend/ivas_render_config_fx.c +++ b/lib_rend/ivas_render_config_fx.c @@ -35,6 +35,9 @@ #include "prot_fx.h" #include "ivas_prot_rend_fx.h" #include "ivas_rom_rend.h" +#ifdef FIX_1452_DEFAULT_REVERB +#include "ivas_cnst.h" +#endif #include "ivas_rom_TdBinauralRenderer.h" #include "wmc_auto.h" @@ -42,6 +45,7 @@ * Local constants *-----------------------------------------------------------------------*/ +#ifndef FIX_1452_DEFAULT_REVERB #define IVAS_REVERB_DEFAULT_L_PRE_DELAY_FX 2147484 // 0.016 #define IVAS_REVERB_DEFAULT_L_INPUT_DELAY_FX 13421773 // 0.1 @@ -50,6 +54,7 @@ #define IVAS_REVERB_DEFAULT_M_PRE_DELAY_FX 1677722 // 0.0125f #define IVAS_REVERB_DEFAULT_M_INPUT_DELAY_FX 0 // 0.0f +#endif #define IVAS_REVERB_DEFAULT_USE_ER 0 @@ -117,10 +122,17 @@ ivas_error ivas_render_config_init_from_rom_fx( move16(); ( *hRenderConfig )->roomAcoustics.nBands = IVAS_REVERB_DEFAULT_L_N_BANDS; move16(); +#ifdef FIX_1452_DEFAULT_REVERB + ( *hRenderConfig )->roomAcoustics.acousticPreDelay_fx = IVAS_REVERB_DEFAULT_L_ACOUSTIC_PRE_DELAY_FX; + move32(); + ( *hRenderConfig )->roomAcoustics.inputPreDelay_fx = IVAS_REVERB_DEFAULT_L_INPUT_PRE_DELAY_FX; + move32(); +#else ( *hRenderConfig )->roomAcoustics.acousticPreDelay_fx = IVAS_REVERB_DEFAULT_L_PRE_DELAY_FX; move32(); ( *hRenderConfig )->roomAcoustics.inputPreDelay_fx = IVAS_REVERB_DEFAULT_L_INPUT_DELAY_FX; move32(); +#endif ( *hRenderConfig )->roomAcoustics.use_er = IVAS_REVERB_DEFAULT_USE_ER; move16(); set32_fx( &( *hRenderConfig )->roomAcoustics.pFc_input_fx[0], 0, CLDFB_NO_CHANNELS_MAX ); @@ -182,17 +194,30 @@ ivas_error ivas_render_config_change_defaults( IVAS_DefaultReverbSize defaultReverbSize /* i: Reverb default size */ ) { +#ifdef FIX_1452_DEFAULT_REVERB + hRenderConfig->roomAcoustics.use_er = IVAS_REVERB_DEFAULT_USE_ER; + move16(); + +#endif + SWITCH( defaultReverbSize ) { case DEFAULT_REVERB_SMALL: hRenderConfig->roomAcoustics.nBands = IVAS_REVERB_DEFAULT_S_N_BANDS; move16(); +#ifdef FIX_1452_DEFAULT_REVERB + hRenderConfig->roomAcoustics.acousticPreDelay_fx = IVAS_REVERB_DEFAULT_S_ACOUSTIC_PRE_DELAY_FX; + move32(); + hRenderConfig->roomAcoustics.inputPreDelay_fx = IVAS_REVERB_DEFAULT_S_INPUT_PRE_DELAY_FX; + move32(); +#else hRenderConfig->roomAcoustics.acousticPreDelay_fx = IVAS_REVERB_DEFAULT_S_PRE_DELAY_FX; move32(); hRenderConfig->roomAcoustics.inputPreDelay_fx = IVAS_REVERB_DEFAULT_S_INPUT_DELAY_FX; move32(); hRenderConfig->roomAcoustics.use_er = IVAS_REVERB_DEFAULT_USE_ER; move16(); +#endif set_zero_fx( &hRenderConfig->roomAcoustics.pFc_input_fx[0], CLDFB_NO_CHANNELS_MAX ); set_zero_fx( &hRenderConfig->roomAcoustics.pAcoustic_rt60_fx[0], CLDFB_NO_CHANNELS_MAX ); set_zero_fx( &hRenderConfig->roomAcoustics.pAcoustic_dsr_fx[0], CLDFB_NO_CHANNELS_MAX ); @@ -204,12 +229,19 @@ ivas_error ivas_render_config_change_defaults( case DEFAULT_REVERB_MEDIUM: hRenderConfig->roomAcoustics.nBands = IVAS_REVERB_DEFAULT_M_N_BANDS; move16(); +#ifdef FIX_1452_DEFAULT_REVERB + hRenderConfig->roomAcoustics.acousticPreDelay_fx = IVAS_REVERB_DEFAULT_M_ACOUSTIC_PRE_DELAY_FX; + move32(); + hRenderConfig->roomAcoustics.inputPreDelay_fx = IVAS_REVERB_DEFAULT_M_INPUT_PRE_DELAY_FX; + move32(); +#else hRenderConfig->roomAcoustics.acousticPreDelay_fx = IVAS_REVERB_DEFAULT_M_PRE_DELAY_FX; move32(); hRenderConfig->roomAcoustics.inputPreDelay_fx = IVAS_REVERB_DEFAULT_M_INPUT_DELAY_FX; move32(); hRenderConfig->roomAcoustics.use_er = IVAS_REVERB_DEFAULT_USE_ER; move16(); +#endif set_zero_fx( &hRenderConfig->roomAcoustics.pFc_input_fx[0], CLDFB_NO_CHANNELS_MAX ); set_zero_fx( &hRenderConfig->roomAcoustics.pAcoustic_rt60_fx[0], CLDFB_NO_CHANNELS_MAX ); set_zero_fx( &hRenderConfig->roomAcoustics.pAcoustic_dsr_fx[0], CLDFB_NO_CHANNELS_MAX ); @@ -221,12 +253,19 @@ ivas_error ivas_render_config_change_defaults( case DEFAULT_REVERB_LARGE: hRenderConfig->roomAcoustics.nBands = IVAS_REVERB_DEFAULT_L_N_BANDS; move16(); +#ifdef FIX_1452_DEFAULT_REVERB + hRenderConfig->roomAcoustics.acousticPreDelay_fx = IVAS_REVERB_DEFAULT_L_ACOUSTIC_PRE_DELAY_FX; + move32(); + hRenderConfig->roomAcoustics.inputPreDelay_fx = IVAS_REVERB_DEFAULT_L_INPUT_PRE_DELAY_FX; + move32(); +#else hRenderConfig->roomAcoustics.acousticPreDelay_fx = IVAS_REVERB_DEFAULT_L_PRE_DELAY_FX; move32(); hRenderConfig->roomAcoustics.inputPreDelay_fx = IVAS_REVERB_DEFAULT_L_INPUT_DELAY_FX; move32(); hRenderConfig->roomAcoustics.use_er = IVAS_REVERB_DEFAULT_USE_ER; move16(); +#endif set_zero_fx( &hRenderConfig->roomAcoustics.pFc_input_fx[0], CLDFB_NO_CHANNELS_MAX ); set_zero_fx( &hRenderConfig->roomAcoustics.pAcoustic_rt60_fx[0], CLDFB_NO_CHANNELS_MAX ); set_zero_fx( &hRenderConfig->roomAcoustics.pAcoustic_dsr_fx[0], CLDFB_NO_CHANNELS_MAX ); diff --git a/lib_rend/ivas_rom_rend_fx.c b/lib_rend/ivas_rom_rend_fx.c index 18c018f29..cd57355f5 100644 --- a/lib_rend/ivas_rom_rend_fx.c +++ b/lib_rend/ivas_rom_rend_fx.c @@ -270,12 +270,21 @@ const Word32 ivas_reverb_default_small_RT60_fx[IVAS_REVERB_DEFAULT_S_N_BANDS] = const Word32 ivas_reverb_default_small_DSR_fx[IVAS_REVERB_DEFAULT_S_N_BANDS] = { +#ifdef FIX_1452_DEFAULT_REVERB + 7492, 3154, 2033, 1848, 2280, 2721, 2988, 3693, 4165, 4276, + 3797, 3273, 2676, 2205, 1756, 1386, 1142, 932, 832, 952, + 1084, 1320, 1508, 1675, 1659, 1610, 1475, 1263, 1118, 981, + 876, 769, 666, 612, 535, 467, 429, 379, 351, 321, + 296, 273, 250, 226, 203, 180, 160, 149, 141, 133, + 129, 123, 118, 115, 111, 110, 107, 106, 106, 105 +#else 16773, 7628, 5046, 4620, 5666, 6853, 7771, 9876, 11530, 12337, 11421, 10287, 8791, 7565, 6305, 5215, 4504, 3860, 3627, 4363, 5246, 6739, 8151, 9611, 10088, 10416, 10154, 9187, 8628, 8012, 7491, 6931, 6320, 6074, 5589, 5145, 4977, 4646, 4558, 4411, 4331, 4253, 4147, 4018, 3821, 3629, 3428, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361 +#endif }; const Word32 ivas_reverb_default_medium_fc_fx[IVAS_REVERB_DEFAULT_M_N_BANDS] = @@ -304,6 +313,16 @@ const Word32 ivas_reverb_default_medium_RT60_fx[IVAS_REVERB_DEFAULT_M_N_BANDS] = const Word32 ivas_reverb_default_medium_DSR_fx[IVAS_REVERB_DEFAULT_M_N_BANDS] = { +#ifdef FIX_1452_DEFAULT_REVERB + 5324, 5580, 5917, 6365, + 6903, 7617, 8575, 9732, + 11218, 13358, 15873, 14689, + 13167, 11206, 8942, 6549, + 5536, 4354, 4110, 4418, + 5367, 6294, 8399, 8798, + 5894, 2958, 2403, 3968, + 1999, 840, 433 +#else 15978, 16341, 16813, 17430, 18156, 19101, 20335, 21788, 23603, 26145, 29050, 27037, @@ -312,6 +331,7 @@ const Word32 ivas_reverb_default_medium_DSR_fx[IVAS_REVERB_DEFAULT_M_N_BANDS] = 10526, 12575, 17260, 19074, 13653, 7464, 6609, 12688, 7607, 3835, 2373 +#endif }; const Word32 ivas_reverb_default_large_fc_fx[IVAS_REVERB_DEFAULT_L_N_BANDS] /*Q16*/ = diff --git a/lib_rend/lib_rend_fx.c b/lib_rend/lib_rend_fx.c index 72a2eca3e..0971b8660 100644 --- a/lib_rend/lib_rend_fx.c +++ b/lib_rend/lib_rend_fx.c @@ -5554,6 +5554,10 @@ ivas_error IVAS_REND_FeedRenderConfig( hRenderConfig->roomAcoustics.aeID = renderConfig.roomAcoustics.aeID; move16(); +#ifdef FIX_1452_DEFAULT_REVERB + hIvasRend->selectedRoomReverbSize = DEFAULT_REVERB_UNSET; + move32(); +#endif hRenderConfig->roomAcoustics.nBands = renderConfig.roomAcoustics.nBands; move16(); hRenderConfig->roomAcoustics.acousticPreDelay_fx = renderConfig.roomAcoustics.acousticPreDelay_fx; @@ -6093,9 +6097,13 @@ ivas_error IVAS_REND_SetReverbRoomSize( BREAK; case IVAS_ROOM_SIZE_AUTO: default: +#ifdef FIX_1452_DEFAULT_REVERB + assert( 0 && "Room size is not set" ); +#else hIvasRend->selectedRoomReverbSize = DEFAULT_REVERB_UNSET; move32(); BREAK; /* will be setup in IVAS_REND_AddInput() */ +#endif } IF( hIvasRend->hRendererConfig != NULL ) diff --git a/lib_util/render_config_reader.c b/lib_util/render_config_reader.c index 318072fe8..b153ea2d9 100644 --- a/lib_util/render_config_reader.c +++ b/lib_util/render_config_reader.c @@ -2326,6 +2326,9 @@ ivas_error RenderConfigReader_read( aeHasERsize = aeHasERabs = FALSE; params_idx = 0; pValue = (char *) calloc( strlen( pParams ), sizeof( char ) ); +#ifdef FIX_1452_DEFAULT_REVERB + hRenderConfig->roomAcoustics.acousticPreDelay_fx = IVAS_REVERB_DEFAULT_L_ACOUSTIC_PRE_DELAY_FX; +#endif while ( sscanf( pParams + params_idx, "%64[^=]=%[^;];", item, pValue ) == 2 ) { params_idx += (int32_t) ( strlen( item ) + strlen( pValue ) + 2 ); @@ -2941,6 +2944,9 @@ ivas_error RenderConfigReader_getAcousticEnvironment( { if ( id == pRenderConfigReader->pAE[n].id ) { +#ifdef FIX_1452_DEFAULT_REVERB + pAcEnv->aeID = (UWord16) pRenderConfigReader->pAE[n].id; +#endif pAcEnv->nBands = (int16_t) pRenderConfigReader->pAE[n].pFG->nrBands; pAcEnv->inputPreDelay_fx = (Word32) ( pRenderConfigReader->pAE[n].preDelay * ONE_IN_Q27 ); if ( pRenderConfigReader->pAE[n].preDelay > INPUTPREDELAY_MAX || -- GitLab