From 33d12e4182dc40997390c53b52181f98f18b9979 Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Mon, 5 Feb 2024 14:47:14 +0100 Subject: [PATCH 1/6] fix #982, fix problems with the delay of the discrete objects for OMASA, set the correct offset for copying the discrete objects into intermediate buffers in case of unified memory. --- lib_com/ivas_cnst.h | 3 +++ lib_com/options.h | 2 +- lib_dec/ivas_ism_renderer.c | 2 ++ lib_dec/ivas_jbm_dec.c | 24 ++++++++++++++++++++++++ lib_dec/ivas_omasa_dec.c | 18 ++++++++++++++++-- 5 files changed, 46 insertions(+), 3 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 38e9518e61..5aeb7c21b1 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -1219,6 +1219,9 @@ enum #define MASA_BIT_REDUCT_PARAM 10 #define MASA_MAXIMUM_TWO_DIR_BANDS 24 #define NBITS_HR_COH 4 +#ifdef NONBE_FIX_982_OMASA_DELAY_COMP_5MS +#define OMASA_TDREND_MATCHING_GAIN 0.7943f +#endif #define MASA_JBM_RINGBUFFER_FRAMES 3 diff --git a/lib_com/options.h b/lib_com/options.h index 8f7a89fcf0..7ccda40340 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -174,7 +174,7 @@ #define NONBE_FIX_967_ISM_MONO_DMX /* FhG: issue 967: accumulating energies in ISM mono DMX */ #define NONBE_FIX_968_ISM_BRIR_WITH_HEADROTATION_5MS_FIX /* FhG : issue #968: differences between 5ms and 20ms rendering for discrete ISM with BRIR and head rotation*/ #define NONBE_FIX_977_OSBA_GAIN_MISMATCH /* Dlb : issue 977 : Output gain mismatch for different bit rates in OSBA */ - +#define NONBE_FIX_982_OMASA_DELAY_COMP_5MS /* FhG : issue #982 : 5ms and 20ms output different for OMASA */ /* ##################### End NON-BE switches ########################### */ /* ################## End DEVELOPMENT switches ######################### */ diff --git a/lib_dec/ivas_ism_renderer.c b/lib_dec/ivas_ism_renderer.c index 5fa4d78eb4..0f42dee733 100644 --- a/lib_dec/ivas_ism_renderer.c +++ b/lib_dec/ivas_ism_renderer.c @@ -555,6 +555,7 @@ void ivas_omasa_separate_object_render_jbm( for ( obj = 0; obj < num_objects; obj++ ) { +#ifndef NONBE_FIX_982_OMASA_DELAY_COMP_5MS /* Delay the signal to match CLDFB delay. Delay the whole buffer with the first rendering call of the stretched buffer. */ if ( slots_rendered == 0 ) { @@ -563,6 +564,7 @@ void ivas_omasa_separate_object_render_jbm( tcBufferSize = hSpatParamRendCom->num_slots * hSpatParamRendCom->slot_size; delay_signal( input_f[obj], tcBufferSize, st_ivas->hMasaIsmData->delayBuffer[obj], st_ivas->hMasaIsmData->delayBuffer_size ); } +#endif offsetSamples = 0; for ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index dc394dda02..67644a6c9d 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -904,6 +904,30 @@ void ivas_jbm_dec_feed_tc_to_renderer( { ivas_ism_dec_digest_tc( st_ivas ); } +#ifdef NONBE_FIX_982_OMASA_DELAY_COMP_5MS + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_DIRAC ) + { + int16_t obj, num_objects; + /* Delay the signal to match CLDFB delay. Delay the whole buffer. */ + num_objects = 0; + if ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) + { + num_objects = 1; + } + else if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC ) + { + num_objects = st_ivas->nchan_ism; + } + for ( obj = 0; obj < num_objects; obj++ ) + { + if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC && st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC ) + { + v_multc( st_ivas->hTcBuffer->tc[CPE_CHANNELS + obj], OMASA_TDREND_MATCHING_GAIN, st_ivas->hTcBuffer->tc[CPE_CHANNELS + obj], st_ivas->hTcBuffer->n_samples_available ); + } + delay_signal( st_ivas->hTcBuffer->tc[CPE_CHANNELS + obj], st_ivas->hTcBuffer->n_samples_available, st_ivas->hMasaIsmData->delayBuffer[obj], st_ivas->hMasaIsmData->delayBuffer_size ); + } + } +#endif } else if ( st_ivas->ivas_format == MC_FORMAT ) { diff --git a/lib_dec/ivas_omasa_dec.c b/lib_dec/ivas_omasa_dec.c index 33a504bae7..0efb2df83f 100644 --- a/lib_dec/ivas_omasa_dec.c +++ b/lib_dec/ivas_omasa_dec.c @@ -46,9 +46,9 @@ /*------------------------------------------------------------------------- * Local constants *------------------------------------------------------------------------*/ - +#ifndef NONBE_FIX_982_OMASA_DELAY_COMP_5MS #define OMASA_TDREND_MATCHING_GAIN 0.7943f - +#endif /*-------------------------------------------------------------------* * ivas_omasa_data_open() * @@ -595,13 +595,21 @@ void ivas_omasa_dirac_rend_jbm( if ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) { +#ifdef NONBE_FIX_982_OMASA_DELAY_COMP_5MS + mvr2r( &output_f[CPE_CHANNELS][st_ivas->hTcBuffer->n_samples_rendered], data_separated_objects[0], nSamplesAsked ); +#else mvr2r( output_f[CPE_CHANNELS], data_separated_objects[0], nSamplesAsked ); +#endif } else { for ( n = 0; n < st_ivas->nchan_ism; n++ ) { +#ifdef NONBE_FIX_982_OMASA_DELAY_COMP_5MS + mvr2r( &output_f[n + CPE_CHANNELS][st_ivas->hTcBuffer->n_samples_rendered], data_separated_objects[n], nSamplesAsked ); +#else mvr2r( output_f[n + CPE_CHANNELS], data_separated_objects[n], nSamplesAsked ); +#endif } } @@ -633,16 +641,21 @@ ivas_error ivas_omasa_dirac_td_binaural_jbm( { int16_t n; float data_separated_objects[MAX_NUM_OBJECTS][L_FRAME48k]; +#ifndef NONBE_FIX_982_OMASA_DELAY_COMP_5MS float gain = OMASA_TDREND_MATCHING_GAIN; +#endif ivas_error error; float *p_sepobj[MAX_NUM_OBJECTS]; +#ifndef NONBE_FIX_982_OMASA_DELAY_COMP_5MS float *tc_local[MAX_TRANSPORT_CHANNELS]; +#endif for ( n = 0; n < MAX_NUM_OBJECTS; n++ ) { p_sepobj[n] = &data_separated_objects[n][0]; } +#ifndef NONBE_FIX_982_OMASA_DELAY_COMP_5MS /* Delay the object signals to match the CLDFB delay. Delay the whole buffer with the first rendering call of the stretched buffer. */ if ( st_ivas->hSpatParamRendCom->slots_rendered == 0 ) { @@ -657,6 +670,7 @@ ivas_error ivas_omasa_dirac_td_binaural_jbm( delay_signal( tc_local[n], tcBufferSize, st_ivas->hMasaIsmData->delayBuffer[n], st_ivas->hMasaIsmData->delayBuffer_size ); } } +#endif ivas_dirac_dec_binaural_render( st_ivas, nSamplesAsked, nSamplesRendered, nSamplesAvailable, nchan_transport, output_f ); -- GitLab From f172c1832389078aa895b442fa619565d5902c0b Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Tue, 6 Feb 2024 11:42:00 +0100 Subject: [PATCH 2/6] fix for #982, fix a condition for OMASA discrete object delay compensation --- lib_com/options.h | 2 +- lib_dec/ivas_jbm_dec.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 7ccda40340..a4a135dff5 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -174,7 +174,7 @@ #define NONBE_FIX_967_ISM_MONO_DMX /* FhG: issue 967: accumulating energies in ISM mono DMX */ #define NONBE_FIX_968_ISM_BRIR_WITH_HEADROTATION_5MS_FIX /* FhG : issue #968: differences between 5ms and 20ms rendering for discrete ISM with BRIR and head rotation*/ #define NONBE_FIX_977_OSBA_GAIN_MISMATCH /* Dlb : issue 977 : Output gain mismatch for different bit rates in OSBA */ -#define NONBE_FIX_982_OMASA_DELAY_COMP_5MS /* FhG : issue #982 : 5ms and 20ms output different for OMASA */ +#define NONBE_FIX_982_OMASA_DELAY_COMP_5MS /* FhG : issue #982 : 5ms and 20ms output different for OMASA */ /* ##################### End NON-BE switches ########################### */ /* ################## End DEVELOPMENT switches ######################### */ diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 67644a6c9d..46259086e9 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -910,7 +910,7 @@ void ivas_jbm_dec_feed_tc_to_renderer( int16_t obj, num_objects; /* Delay the signal to match CLDFB delay. Delay the whole buffer. */ num_objects = 0; - if ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) + if ( (st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ) && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC ) { num_objects = 1; } -- GitLab From 445ad6c7851f8b5fe365bb81aac8066f090bf2e4 Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Wed, 7 Feb 2024 14:56:53 +0100 Subject: [PATCH 3/6] fix for #982, formal improvements --- lib_dec/ivas_jbm_dec.c | 11 ++++++----- lib_dec/ivas_omasa_dec.c | 5 ++--- lib_rend/ivas_dirac_dec_binaural_functions.c | 4 ++++ 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 46259086e9..4ac9b448fd 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -904,13 +904,14 @@ void ivas_jbm_dec_feed_tc_to_renderer( { ivas_ism_dec_digest_tc( st_ivas ); } + #ifdef NONBE_FIX_982_OMASA_DELAY_COMP_5MS if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_DIRAC ) { - int16_t obj, num_objects; + int16_t num_objects; /* Delay the signal to match CLDFB delay. Delay the whole buffer. */ num_objects = 0; - if ( (st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ) && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC ) + if ( ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC ) { num_objects = 1; } @@ -918,13 +919,13 @@ void ivas_jbm_dec_feed_tc_to_renderer( { num_objects = st_ivas->nchan_ism; } - for ( obj = 0; obj < num_objects; obj++ ) + for ( n = 0; n < num_objects; n++ ) { if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC && st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC ) { - v_multc( st_ivas->hTcBuffer->tc[CPE_CHANNELS + obj], OMASA_TDREND_MATCHING_GAIN, st_ivas->hTcBuffer->tc[CPE_CHANNELS + obj], st_ivas->hTcBuffer->n_samples_available ); + v_multc( st_ivas->hTcBuffer->tc[CPE_CHANNELS + n], OMASA_TDREND_MATCHING_GAIN, st_ivas->hTcBuffer->tc[CPE_CHANNELS + n], st_ivas->hTcBuffer->n_samples_available ); } - delay_signal( st_ivas->hTcBuffer->tc[CPE_CHANNELS + obj], st_ivas->hTcBuffer->n_samples_available, st_ivas->hMasaIsmData->delayBuffer[obj], st_ivas->hMasaIsmData->delayBuffer_size ); + delay_signal( st_ivas->hTcBuffer->tc[CPE_CHANNELS + n], st_ivas->hTcBuffer->n_samples_available, st_ivas->hMasaIsmData->delayBuffer[n], st_ivas->hMasaIsmData->delayBuffer_size ); } } #endif diff --git a/lib_dec/ivas_omasa_dec.c b/lib_dec/ivas_omasa_dec.c index 0efb2df83f..5ce2873ccc 100644 --- a/lib_dec/ivas_omasa_dec.c +++ b/lib_dec/ivas_omasa_dec.c @@ -42,11 +42,11 @@ #endif #include "wmc_auto.h" - +#ifndef NONBE_FIX_982_OMASA_DELAY_COMP_5MS /*------------------------------------------------------------------------- * Local constants *------------------------------------------------------------------------*/ -#ifndef NONBE_FIX_982_OMASA_DELAY_COMP_5MS + #define OMASA_TDREND_MATCHING_GAIN 0.7943f #endif /*-------------------------------------------------------------------* @@ -671,7 +671,6 @@ ivas_error ivas_omasa_dirac_td_binaural_jbm( } } #endif - ivas_dirac_dec_binaural_render( st_ivas, nSamplesAsked, nSamplesRendered, nSamplesAvailable, nchan_transport, output_f ); /* reset combined orientation access index before calling the td renderer */ diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index 6909945ff6..38dc053878 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -2145,7 +2145,11 @@ static void ivas_dirac_dec_binaural_determine_processing_matrices( if ( ivas_format == MASA_ISM_FORMAT ) { +#ifdef NONBE_FIX_982_OMASA_DELAY_COMP_5MS + gainFactor = OMASA_TDREND_MATCHING_GAIN * sqrtf( hDiracDecBin->earlyPartEneCorrection[bin] ); +#else gainFactor = 0.7943f * sqrtf( hDiracDecBin->earlyPartEneCorrection[bin] ); +#endif } else { -- GitLab From f9a67b94a4dd10ec29082727eb682ad86bb561a7 Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Wed, 7 Feb 2024 15:42:42 +0100 Subject: [PATCH 4/6] fix for #982, fix remaining asans, move used the wrong number of samples --- lib_dec/ivas_omasa_dec.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lib_dec/ivas_omasa_dec.c b/lib_dec/ivas_omasa_dec.c index 5ce2873ccc..acbd9eb167 100644 --- a/lib_dec/ivas_omasa_dec.c +++ b/lib_dec/ivas_omasa_dec.c @@ -593,10 +593,14 @@ void ivas_omasa_dirac_rend_jbm( int16_t n; float data_separated_objects[MAX_NUM_OBJECTS][L_FRAME48k]; +#ifdef NONBE_FIX_982_OMASA_DELAY_COMP_5MS + *nSamplesRendered = min( nSamplesAsked, st_ivas->hTcBuffer->n_samples_available ); +#endif + if ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) { #ifdef NONBE_FIX_982_OMASA_DELAY_COMP_5MS - mvr2r( &output_f[CPE_CHANNELS][st_ivas->hTcBuffer->n_samples_rendered], data_separated_objects[0], nSamplesAsked ); + mvr2r( &output_f[CPE_CHANNELS][st_ivas->hTcBuffer->n_samples_rendered], data_separated_objects[0], *nSamplesRendered ); #else mvr2r( output_f[CPE_CHANNELS], data_separated_objects[0], nSamplesAsked ); #endif @@ -606,7 +610,7 @@ void ivas_omasa_dirac_rend_jbm( for ( n = 0; n < st_ivas->nchan_ism; n++ ) { #ifdef NONBE_FIX_982_OMASA_DELAY_COMP_5MS - mvr2r( &output_f[n + CPE_CHANNELS][st_ivas->hTcBuffer->n_samples_rendered], data_separated_objects[n], nSamplesAsked ); + mvr2r( &output_f[n + CPE_CHANNELS][st_ivas->hTcBuffer->n_samples_rendered], data_separated_objects[n], *nSamplesRendered ); #else mvr2r( output_f[n + CPE_CHANNELS], data_separated_objects[n], nSamplesAsked ); #endif -- GitLab From 7d185c8d5c60fc8a92e9a41d2916cc22b1af19fc Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Wed, 7 Feb 2024 15:55:42 +0100 Subject: [PATCH 5/6] fix for #982, fix asan, add missing condition to copy discrete objects to the intermediate buffer only in the common memory, i.e. non-TMS, case --- lib_dec/ivas_omasa_dec.c | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/lib_dec/ivas_omasa_dec.c b/lib_dec/ivas_omasa_dec.c index acbd9eb167..cb91eb09be 100644 --- a/lib_dec/ivas_omasa_dec.c +++ b/lib_dec/ivas_omasa_dec.c @@ -594,28 +594,33 @@ void ivas_omasa_dirac_rend_jbm( float data_separated_objects[MAX_NUM_OBJECTS][L_FRAME48k]; #ifdef NONBE_FIX_982_OMASA_DELAY_COMP_5MS - *nSamplesRendered = min( nSamplesAsked, st_ivas->hTcBuffer->n_samples_available ); + if ( st_ivas->hDecoderConfig->Opt_tsm ) + { + *nSamplesRendered = min( nSamplesAsked, st_ivas->hTcBuffer->n_samples_available ); #endif - if ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) - { + if ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) + { #ifdef NONBE_FIX_982_OMASA_DELAY_COMP_5MS - mvr2r( &output_f[CPE_CHANNELS][st_ivas->hTcBuffer->n_samples_rendered], data_separated_objects[0], *nSamplesRendered ); + mvr2r( &output_f[CPE_CHANNELS][st_ivas->hTcBuffer->n_samples_rendered], data_separated_objects[0], *nSamplesRendered ); #else mvr2r( output_f[CPE_CHANNELS], data_separated_objects[0], nSamplesAsked ); #endif - } - else - { - for ( n = 0; n < st_ivas->nchan_ism; n++ ) + } + else { + for ( n = 0; n < st_ivas->nchan_ism; n++ ) + { #ifdef NONBE_FIX_982_OMASA_DELAY_COMP_5MS - mvr2r( &output_f[n + CPE_CHANNELS][st_ivas->hTcBuffer->n_samples_rendered], data_separated_objects[n], *nSamplesRendered ); + mvr2r( &output_f[n + CPE_CHANNELS][st_ivas->hTcBuffer->n_samples_rendered], data_separated_objects[n], *nSamplesRendered ); #else mvr2r( output_f[n + CPE_CHANNELS], data_separated_objects[n], nSamplesAsked ); #endif + } } +#ifdef NONBE_FIX_982_OMASA_DELAY_COMP_5MS } +#endif subframes_rendered = st_ivas->hSpatParamRendCom->subframes_rendered; slots_rendered = st_ivas->hSpatParamRendCom->slots_rendered; -- GitLab From c6ae367e1c6e1b32a95ebf113b6234a8a7fa9905 Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Wed, 7 Feb 2024 16:24:59 +0100 Subject: [PATCH 6/6] fix for #982, fix condition for copying discrete objects to intermediate buffers in the unified memory case --- lib_dec/ivas_omasa_dec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/ivas_omasa_dec.c b/lib_dec/ivas_omasa_dec.c index cb91eb09be..7e58dfe790 100644 --- a/lib_dec/ivas_omasa_dec.c +++ b/lib_dec/ivas_omasa_dec.c @@ -594,7 +594,7 @@ void ivas_omasa_dirac_rend_jbm( float data_separated_objects[MAX_NUM_OBJECTS][L_FRAME48k]; #ifdef NONBE_FIX_982_OMASA_DELAY_COMP_5MS - if ( st_ivas->hDecoderConfig->Opt_tsm ) + if ( !st_ivas->hDecoderConfig->Opt_tsm ) { *nSamplesRendered = min( nSamplesAsked, st_ivas->hTcBuffer->n_samples_available ); #endif -- GitLab