diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index e16553e85a3a061c6ab250a31b781092bd4d923a..3a6894d435111ef557724879c2e8a39ccaed2018 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -1584,11 +1584,19 @@ typedef enum #define RV_FILTER_MAX_HISTORY ( 512 - 160 ) /* for longest history */ #define RV_LENGTH_NR_FC ( RV_FILTER_MAX_FFT_SIZE / 2 ) + 1 #define RV_LENGTH_NR_FC_16KHZ ( RV_FILTER_MAX_FFT_SIZE / 4 ) + 1 -#define IVAS_REVERB_DEFAULT_N_BANDS 31 +#define IVAS_REVERB_DEFAULT_L_N_BANDS 31 +#define IVAS_REVERB_DEFAULT_M_N_BANDS 31 +#define IVAS_REVERB_DEFAULT_S_N_BANDS 60 #define LR_IAC_LENGTH_NR_FC ( RV_LENGTH_NR_FC ) #define LR_IAC_LENGTH_NR_FC_16KHZ ( RV_LENGTH_NR_FC_16KHZ ) +typedef enum +{ + DEFAULT_REVERB_SMALL, + DEFAULT_REVERB_MEDIUM, + DEFAULT_REVERB_LARGE +} IVAS_DefaultReverbSize; /*----------------------------------------------------------------------------------* * FB mixer constants diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index 80b8c7e5e961c7713b4de1e009490e5fe82e7b40..c89bde525e19d9181f133a4c871b584d89064663 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -1381,16 +1381,52 @@ ivas_error ivas_init_decoder( } } - /*--------------------------------------------------------------------* - * Allocate and initialize HRTF Statistics handle - *--------------------------------------------------------------------*/ + /*--------------------------------------------------------------------------* + * Allocate and initialize HRTF Statistics handle, get default reverb values + *--------------------------------------------------------------------------*/ if ( st_ivas->hOutSetup.output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) { + /* Init HRTF statistics */ if ( ( error = ivas_HRTF_statistics_init( &st_ivas->hHrtfStatistics, output_Fs ) ) != IVAS_ERR_OK ) { return error; } + + /* Get default reverb values based on format, if custom values were not given */ + if ( st_ivas->hDecoderConfig->Opt_RendConfigCustom == 0 ) + { + IVAS_DefaultReverbSize defaultReverbSize; + + switch ( st_ivas->ivas_format ) + { + case ISM_FORMAT: + defaultReverbSize = DEFAULT_REVERB_MEDIUM; + break; + case SBA_FORMAT: + defaultReverbSize = DEFAULT_REVERB_SMALL; + break; + case MASA_FORMAT: + defaultReverbSize = DEFAULT_REVERB_SMALL; + break; + case MC_FORMAT: + defaultReverbSize = DEFAULT_REVERB_MEDIUM; + break; + case MASA_ISM_FORMAT: + defaultReverbSize = DEFAULT_REVERB_MEDIUM; + break; + case SBA_ISM_FORMAT: + defaultReverbSize = DEFAULT_REVERB_MEDIUM; + break; + default: + defaultReverbSize = DEFAULT_REVERB_LARGE; + } + + if ( ( error = ivas_render_config_change_defaults( st_ivas->hRenderConfig, defaultReverbSize ) ) != IVAS_ERR_OK ) + { + return error; + } + } } /*-----------------------------------------------------------------* diff --git a/lib_rend/ivas_prot_rend.h b/lib_rend/ivas_prot_rend.h index ae80304ee04ae85ea7bf3e40026aa3718a8004a0..894821855d8ca736e592bc97961734ad312fb748 100644 --- a/lib_rend/ivas_prot_rend.h +++ b/lib_rend/ivas_prot_rend.h @@ -1343,6 +1343,11 @@ ivas_error ivas_render_config_init_from_rom( RENDER_CONFIG_HANDLE *hRenderConfig /* i/o: Renderer config handle */ ); +ivas_error ivas_render_config_change_defaults( + RENDER_CONFIG_HANDLE hRenderConfig, /* i/o: Renderer config handle */ + IVAS_DefaultReverbSize reverbDefault /* i: Reverb default size */ +); + /*----------------------------------------------------------------------------------* * Quaternion operations diff --git a/lib_rend/ivas_render_config.c b/lib_rend/ivas_render_config.c index c3a39b426e39a0c1f372a5e0f88464c1c7e4c18b..50094cf79aaffdcda1eee62656d332c47cf89e37 100644 --- a/lib_rend/ivas_render_config.c +++ b/lib_rend/ivas_render_config.c @@ -45,8 +45,14 @@ * Local constants *-----------------------------------------------------------------------*/ -#define IVAS_REVERB_DEFAULT_PRE_DELAY 0.016f -#define IVAS_REVERB_DEFAULT_INPUT_DELAY 0.1f +#define IVAS_REVERB_DEFAULT_L_PRE_DELAY 0.016f +#define IVAS_REVERB_DEFAULT_L_INPUT_DELAY 0.1f + +#define IVAS_REVERB_DEFAULT_S_PRE_DELAY 0.0125f +#define IVAS_REVERB_DEFAULT_S_INPUT_DELAY 0.0f + +#define IVAS_REVERB_DEFAULT_M_PRE_DELAY 0.0125f +#define IVAS_REVERB_DEFAULT_M_INPUT_DELAY 0.0f #define IVAS_REVERB_DEFAULT_USE_ER 0 @@ -113,17 +119,17 @@ ivas_error ivas_render_config_init_from_rom( #ifdef DEBUGGING ( *hRenderConfig )->renderer_type_override = IVAS_RENDER_TYPE_OVERRIDE_NONE; #endif - ( *hRenderConfig )->roomAcoustics.nBands = IVAS_REVERB_DEFAULT_N_BANDS; - ( *hRenderConfig )->roomAcoustics.acousticPreDelay = IVAS_REVERB_DEFAULT_PRE_DELAY; - ( *hRenderConfig )->roomAcoustics.inputPreDelay = IVAS_REVERB_DEFAULT_INPUT_DELAY; + ( *hRenderConfig )->roomAcoustics.nBands = IVAS_REVERB_DEFAULT_L_N_BANDS; + ( *hRenderConfig )->roomAcoustics.acousticPreDelay = IVAS_REVERB_DEFAULT_L_PRE_DELAY; + ( *hRenderConfig )->roomAcoustics.inputPreDelay = IVAS_REVERB_DEFAULT_L_INPUT_DELAY; ( *hRenderConfig )->roomAcoustics.use_er = IVAS_REVERB_DEFAULT_USE_ER; set_zero( &( *hRenderConfig )->roomAcoustics.pFc_input[0], CLDFB_NO_CHANNELS_MAX ); set_zero( &( *hRenderConfig )->roomAcoustics.pAcoustic_rt60[0], CLDFB_NO_CHANNELS_MAX ); set_zero( &( *hRenderConfig )->roomAcoustics.pAcoustic_dsr[0], CLDFB_NO_CHANNELS_MAX ); - mvr2r( ivas_reverb_default_fc, ( *hRenderConfig )->roomAcoustics.pFc_input, IVAS_REVERB_DEFAULT_N_BANDS ); - mvr2r( ivas_reverb_default_RT60, ( *hRenderConfig )->roomAcoustics.pAcoustic_rt60, IVAS_REVERB_DEFAULT_N_BANDS ); - mvr2r( ivas_reverb_default_DSR, ( *hRenderConfig )->roomAcoustics.pAcoustic_dsr, IVAS_REVERB_DEFAULT_N_BANDS ); + mvr2r( ivas_reverb_default_large_fc, ( *hRenderConfig )->roomAcoustics.pFc_input, IVAS_REVERB_DEFAULT_L_N_BANDS ); + mvr2r( ivas_reverb_default_large_RT60, ( *hRenderConfig )->roomAcoustics.pAcoustic_rt60, IVAS_REVERB_DEFAULT_L_N_BANDS ); + mvr2r( ivas_reverb_default_large_DSR, ( *hRenderConfig )->roomAcoustics.pAcoustic_dsr, IVAS_REVERB_DEFAULT_L_N_BANDS ); for ( i = 0; i < MAX_NUM_OBJECTS; i++ ) { @@ -150,3 +156,63 @@ ivas_error ivas_render_config_init_from_rom( return IVAS_ERR_OK; } + + +/*-------------------------------------------------------------------* + * ivas_render_config_change_defaults() + * + * Changes default values from ROM + *-------------------------------------------------------------------*/ + +ivas_error ivas_render_config_change_defaults( + RENDER_CONFIG_HANDLE hRenderConfig, /* i/o: Renderer config handle */ + IVAS_DefaultReverbSize defaultReverbSize /* i: Reverb default size */ +) +{ + switch ( defaultReverbSize ) + { + case DEFAULT_REVERB_SMALL: + hRenderConfig->roomAcoustics.nBands = IVAS_REVERB_DEFAULT_S_N_BANDS; + hRenderConfig->roomAcoustics.acousticPreDelay = IVAS_REVERB_DEFAULT_S_PRE_DELAY; + hRenderConfig->roomAcoustics.inputPreDelay = IVAS_REVERB_DEFAULT_S_INPUT_DELAY; + hRenderConfig->roomAcoustics.use_er = IVAS_REVERB_DEFAULT_USE_ER; + set_zero( &hRenderConfig->roomAcoustics.pFc_input[0], CLDFB_NO_CHANNELS_MAX ); + set_zero( &hRenderConfig->roomAcoustics.pAcoustic_rt60[0], CLDFB_NO_CHANNELS_MAX ); + set_zero( &hRenderConfig->roomAcoustics.pAcoustic_dsr[0], CLDFB_NO_CHANNELS_MAX ); + + mvr2r( ivas_reverb_default_small_fc, hRenderConfig->roomAcoustics.pFc_input, IVAS_REVERB_DEFAULT_S_N_BANDS ); + mvr2r( ivas_reverb_default_small_RT60, hRenderConfig->roomAcoustics.pAcoustic_rt60, IVAS_REVERB_DEFAULT_S_N_BANDS ); + mvr2r( ivas_reverb_default_small_DSR, hRenderConfig->roomAcoustics.pAcoustic_dsr, IVAS_REVERB_DEFAULT_S_N_BANDS ); + break; + case DEFAULT_REVERB_MEDIUM: + hRenderConfig->roomAcoustics.nBands = IVAS_REVERB_DEFAULT_M_N_BANDS; + hRenderConfig->roomAcoustics.acousticPreDelay = IVAS_REVERB_DEFAULT_M_PRE_DELAY; + hRenderConfig->roomAcoustics.inputPreDelay = IVAS_REVERB_DEFAULT_M_INPUT_DELAY; + hRenderConfig->roomAcoustics.use_er = IVAS_REVERB_DEFAULT_USE_ER; + set_zero( &hRenderConfig->roomAcoustics.pFc_input[0], CLDFB_NO_CHANNELS_MAX ); + set_zero( &hRenderConfig->roomAcoustics.pAcoustic_rt60[0], CLDFB_NO_CHANNELS_MAX ); + set_zero( &hRenderConfig->roomAcoustics.pAcoustic_dsr[0], CLDFB_NO_CHANNELS_MAX ); + + mvr2r( ivas_reverb_default_medium_fc, hRenderConfig->roomAcoustics.pFc_input, IVAS_REVERB_DEFAULT_M_N_BANDS ); + mvr2r( ivas_reverb_default_medium_RT60, hRenderConfig->roomAcoustics.pAcoustic_rt60, IVAS_REVERB_DEFAULT_M_N_BANDS ); + mvr2r( ivas_reverb_default_medium_DSR, hRenderConfig->roomAcoustics.pAcoustic_dsr, IVAS_REVERB_DEFAULT_M_N_BANDS ); + break; + case DEFAULT_REVERB_LARGE: + hRenderConfig->roomAcoustics.nBands = IVAS_REVERB_DEFAULT_L_N_BANDS; + hRenderConfig->roomAcoustics.acousticPreDelay = IVAS_REVERB_DEFAULT_L_PRE_DELAY; + hRenderConfig->roomAcoustics.inputPreDelay = IVAS_REVERB_DEFAULT_L_INPUT_DELAY; + hRenderConfig->roomAcoustics.use_er = IVAS_REVERB_DEFAULT_USE_ER; + set_zero( &hRenderConfig->roomAcoustics.pFc_input[0], CLDFB_NO_CHANNELS_MAX ); + set_zero( &hRenderConfig->roomAcoustics.pAcoustic_rt60[0], CLDFB_NO_CHANNELS_MAX ); + set_zero( &hRenderConfig->roomAcoustics.pAcoustic_dsr[0], CLDFB_NO_CHANNELS_MAX ); + + mvr2r( ivas_reverb_default_large_fc, hRenderConfig->roomAcoustics.pFc_input, IVAS_REVERB_DEFAULT_L_N_BANDS ); + mvr2r( ivas_reverb_default_large_RT60, hRenderConfig->roomAcoustics.pAcoustic_rt60, IVAS_REVERB_DEFAULT_L_N_BANDS ); + mvr2r( ivas_reverb_default_large_DSR, hRenderConfig->roomAcoustics.pAcoustic_dsr, IVAS_REVERB_DEFAULT_L_N_BANDS ); + break; + default: + return IVAS_ERR_ACOUSTIC_ENVIRONMENT_MISSING; + } + + return IVAS_ERR_OK; +} diff --git a/lib_rend/ivas_rom_rend.c b/lib_rend/ivas_rom_rend.c index 3f4b906bd6fdaa8159f22abe9ed3fb2686c3fd6e..726ec105d5cf8cb520c82fa5eba9e5f99c605654 100644 --- a/lib_rend/ivas_rom_rend.c +++ b/lib_rend/ivas_rom_rend.c @@ -346,7 +346,73 @@ const float t_design_11_elevation[70] = * Reverberator ROM tables *-----------------------------------------------------------------------*/ -const float ivas_reverb_default_fc[IVAS_REVERB_DEFAULT_N_BANDS] = +const float ivas_reverb_default_small_fc[IVAS_REVERB_DEFAULT_S_N_BANDS] = +{ + 200.0f, 600.0f, 1000.0f, 1400.0f, 1800.0f, 2200.0f, 2600.0f, 3000.0f, 3400.0f, 3800.0f, + 4200.0f, 4600.0f, 5000.0f, 5400.0f, 5800.0f, 6200.0f, 6600.0f, 7000.0f, 7400.0f, 7800.0f, + 8200.0f, 8600.0f, 9000.0f, 9400.0f, 9800.0f, 10200.0f, 10600.0f, 11000.0f, 11400.0f, 11800.0f, + 12200.0f, 12600.0f, 13000.0f, 13400.0f, 13800.0f, 14200.0f, 14600.0f, 15000.0f, 15400.0f, 15800.0f, + 16200.0f, 16600.0f, 17000.0f, 17400.0f, 17800.0f, 18200.0f, 18600.0f, 19000.0f, 19400.0f, 19800.0f, + 20200.0f, 20600.0f, 21000.0f, 21400.0f, 21800.0f, 22200.0f, 22600.0f, 23000.0f, 23400.0f, 23800.0f +}; + +const float ivas_reverb_default_small_RT60[IVAS_REVERB_DEFAULT_S_N_BANDS] = +{ + 0.300000f, 0.273750f, 0.265941f, 0.263784f, 0.265572f, 0.261790f, 0.252988f, 0.245801f, 0.237429f, 0.228169f, + 0.219536f, 0.211116f, 0.203262f, 0.196144f, 0.189161f, 0.182436f, 0.176237f, 0.170114f, 0.164250f, 0.158791f, + 0.153349f, 0.148312f, 0.143266f, 0.138398f, 0.133929f, 0.129493f, 0.125309f, 0.121833f, 0.118321f, 0.115130f, + 0.112655f, 0.109958f, 0.107465f, 0.105311f, 0.103006f, 0.100783f, 0.098629f, 0.096469f, 0.094335f, 0.092217f, + 0.090115f, 0.088057f, 0.086034f, 0.084061f, 0.082327f, 0.080552f, 0.078876f, 0.077614f, 0.076203f, 0.074918f, + 0.074102f, 0.073068f, 0.072153f, 0.071659f, 0.070969f, 0.070686f, 0.070224f, 0.069878f, 0.069936f, 0.069820f +}; + +const float ivas_reverb_default_small_DSR[IVAS_REVERB_DEFAULT_S_N_BANDS] = +{ + 1.562141e-05f, 7.104127e-06f, 4.699859e-06f, 4.302786e-06f, 5.277136e-06f, 6.382504e-06f, 7.237492e-06f, 9.198124e-06f, 1.073813e-05f, 1.148954e-05f, + 1.063691e-05f, 9.580873e-06f, 8.187593e-06f, 7.045559e-06f, 5.871790e-06f, 4.857175e-06f, 4.194530e-06f, 3.594923e-06f, 3.377501e-06f, 4.063327e-06f, + 4.885563e-06f, 6.276646e-06f, 7.591577e-06f, 8.950862e-06f, 9.394771e-06f, 9.701081e-06f, 9.456415e-06f, 8.555601e-06f, 8.035221e-06f, 7.461511e-06f, + 6.976915e-06f, 6.454842e-06f, 5.885498e-06f, 5.657134e-06f, 5.205549e-06f, 4.791783e-06f, 4.635302e-06f, 4.326645e-06f, 4.245139e-06f, 4.107671e-06f, + 4.033808e-06f, 3.961318e-06f, 3.862554e-06f, 3.742024e-06f, 3.559007e-06f, 3.379882e-06f, 3.192690e-06f, 3.129763e-06f, 3.129763e-06f, 3.129763e-06f, + 3.129763e-06f, 3.129763e-06f, 3.129763e-06f, 3.129763e-06f, 3.129763e-06f, 3.129763e-06f, 3.129763e-06f, 3.129763e-06f, 3.129763e-06f, 3.129763e-06f +}; + +const float ivas_reverb_default_medium_fc[IVAS_REVERB_DEFAULT_M_N_BANDS] = +{ + 20.0f, 25.0f, 31.5f, 40.0f, + 50.0f, 63.0f, 80.0f, 100.0f, + 125.0f, 160.0f, 200.0f, 250.0f, + 315.0f, 400.0f, 500.0f, 630.0f, + 800.0f, 1000.0f, 1250.0f, 1600.0f, + 2000.0f, 2500.0f, 3150.0f, 4000.0f, + 5000.0f, 6300.0f, 8000.0f, 10000.0f, + 12500.0f, 16000.0f, 20000.0f +}; + +const float ivas_reverb_default_medium_RT60[IVAS_REVERB_DEFAULT_M_N_BANDS] = +{ + 0.22000000f, 0.22500000f, 0.23150000f, 0.24000000f, + 0.25000000f, 0.26300000f, 0.28000000f, 0.30000000f, + 0.32500000f, 0.36000000f, 0.40000000f, 0.39625000f, + 0.39137500f, 0.38500000f, 0.37750000f, 0.36933070f, + 0.36553800f, 0.36107600f, 0.35953475f, 0.35963200f, + 0.35849250f, 0.34878675f, 0.33447100f, 0.31297400f, + 0.28944200f, 0.26387000f, 0.23550800f, 0.20767000f, + 0.18357975f, 0.16133300f, 0.14229700f +}; + +const float ivas_reverb_default_medium_DSR[IVAS_REVERB_DEFAULT_M_N_BANDS] = +{ + 1.488034e-05f, 1.521853e-05f, 1.565818e-05f, 1.623310e-05f, + 1.690948e-05f, 1.778877e-05f, 1.893862e-05f, 2.029138e-05f, + 2.198233e-05f, 2.434965e-05f, 2.705517e-05f, 2.518051e-05f, + 2.274345e-05f, 1.955652e-05f, 1.580720e-05f, 1.174766e-05f, + 9.989742e-06f, 7.921604e-06f, 7.494128e-06f, 8.064566e-06f, + 9.803470e-06f, 1.171147e-05f, 1.607462e-05f, 1.776450e-05f, + 1.271521e-05f, 6.951610e-06f, 6.154952e-06f, 1.181682e-05f, + 7.084896e-06f, 3.571991e-06f, 2.210372e-06f +}; + +const float ivas_reverb_default_large_fc[IVAS_REVERB_DEFAULT_L_N_BANDS] = { 20.0f, 25.0f, 31.5f, 40.0f, 50.0f, 63.0f, 80.0f, 100.0f, @@ -358,7 +424,7 @@ const float ivas_reverb_default_fc[IVAS_REVERB_DEFAULT_N_BANDS] = 12500.0f, 16000.0f, 20000.0f }; -const float ivas_reverb_default_RT60[IVAS_REVERB_DEFAULT_N_BANDS] = +const float ivas_reverb_default_large_RT60[IVAS_REVERB_DEFAULT_L_N_BANDS] = { 1.3622f, 1.4486f, 1.3168f, 1.5787f, 1.4766f, 1.3954f, 1.2889f, 1.3462f, @@ -370,7 +436,7 @@ const float ivas_reverb_default_RT60[IVAS_REVERB_DEFAULT_N_BANDS] = 0.71945f, 0.61682f, 0.60031f }; -const float ivas_reverb_default_DSR[IVAS_REVERB_DEFAULT_N_BANDS] = +const float ivas_reverb_default_large_DSR[IVAS_REVERB_DEFAULT_L_N_BANDS] = { 1.8811e-08f, 2.1428e-08f, 1.3972e-08f, 1.51e-08f, 1.287e-08f, 1.8747e-08f, 2.413e-08f, 3.9927e-08f, diff --git a/lib_rend/ivas_rom_rend.h b/lib_rend/ivas_rom_rend.h index 927287ecd96a2b33cb061c32d40013623da77469..880408e69d184b3c8aba26db1eecc380f09a4aa8 100644 --- a/lib_rend/ivas_rom_rend.h +++ b/lib_rend/ivas_rom_rend.h @@ -113,9 +113,18 @@ extern const float t_design_11_elevation[70]; * Reverberator ROM tables *-----------------------------------------------------------------------*/ -extern const float ivas_reverb_default_fc[]; -extern const float ivas_reverb_default_RT60[]; -extern const float ivas_reverb_default_DSR[]; +extern const float ivas_reverb_default_small_fc[]; +extern const float ivas_reverb_default_small_RT60[]; +extern const float ivas_reverb_default_small_DSR[]; + +extern const float ivas_reverb_default_medium_fc[]; +extern const float ivas_reverb_default_medium_RT60[]; +extern const float ivas_reverb_default_medium_DSR[]; + +extern const float ivas_reverb_default_large_fc[]; +extern const float ivas_reverb_default_large_RT60[]; +extern const float ivas_reverb_default_large_DSR[]; + /*----------------------------------------------------------------------------------* * Renderer SBA & MC enc/dec matrices