From 485903eb55cb9e70f63127e5d7b287fd729f74e5 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Mon, 19 May 2025 13:34:49 +0200 Subject: [PATCH 1/4] port float MR 1361 --- lib_com/options.h | 6 +++ lib_dec/ivas_ism_renderer.c | 3 +- lib_dec/ivas_jbm_dec.c | 27 ++++++++++++ lib_dec/ivas_omasa_dec.c | 45 +++++++++++++++++--- lib_rend/ivas_dirac_dec_binaural_functions.c | 5 +++ 5 files changed, 78 insertions(+), 8 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index bc577060b..68a2cecb7 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -209,6 +209,12 @@ #define FIX_966_VAR_OVERFLOW_IN_HARM_MODEL_ARI /* FhG: fix and undef behaviour bug in the harmonic TCX model arithmetic coder */ #define NONBE_FIX_974_OSBA_JBM_MONO_RS_USAN /* FhG : issue #974: usan in mono and stereo output in OSBA JBM RS */ +#define NONBE_FIX_982_OMASA_DELAY_COMP_5MS /* FhG : issue #982 : 5ms and 20ms output different for OMASA */ +#ifdef NONBE_FIX_982_OMASA_DELAY_COMP_5MS +#define OMASA_TDREND_MATCHING_GAIN 0.7943f +#endif + + /* #################### End BASOP porting switches ############################ */ diff --git a/lib_dec/ivas_ism_renderer.c b/lib_dec/ivas_ism_renderer.c index 58e4b4216..09b7b60a3 100644 --- a/lib_dec/ivas_ism_renderer.c +++ b/lib_dec/ivas_ism_renderer.c @@ -524,6 +524,7 @@ void ivas_omasa_separate_object_render_jbm( for ( obj = 0; obj < num_objects; obj++ ) { /* Delay the signal to match CLDFB delay. Delay the whole buffer with the first rendering call of the stretched buffer. */ +#ifndef NONBE_FIX_982_OMASA_DELAY_COMP_5MS if ( slots_rendered == 0 ) { int16_t tcBufferSize; @@ -532,7 +533,7 @@ void ivas_omasa_separate_object_render_jbm( delay_signal( input_f[obj], tcBufferSize, st_ivas->hMasaIsmData->delayBuffer[obj], st_ivas->hMasaIsmData->delayBuffer_size ); } offsetSamples = 0; - +#endif for ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) { n_samples_sf = hSpatParamRendCom->subframe_nbslots[subframe_idx] * hSpatParamRendCom->slot_size; diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 2d88afca5..8d414ca38 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -892,6 +892,33 @@ 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 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 ) + { + num_objects = 1; + } + else if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC ) + { + num_objects = st_ivas->nchan_ism; + } + 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 + 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 + n], st_ivas->hTcBuffer->n_samples_available, st_ivas->hMasaIsmData->delayBuffer[n], 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 883b4638c..482daa328 100644 --- a/lib_dec/ivas_omasa_dec.c +++ b/lib_dec/ivas_omasa_dec.c @@ -47,7 +47,10 @@ * Local constants *------------------------------------------------------------------------*/ +#ifndef NONBE_FIX_982_OMASA_DELAY_COMP_5MS #define OMASA_TDREND_MATCHING_GAIN 0.7943f +#endif + /*-------------------------------------------------------------------* * ivas_omasa_data_open() @@ -600,17 +603,39 @@ void ivas_omasa_dirac_rend_jbm( int16_t n; float data_separated_objects[MAX_NUM_OBJECTS][L_FRAME48k]; - if ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) - { - mvr2r( output_f[CPE_CHANNELS], data_separated_objects[0], nSamplesAsked ); - } - else +#ifdef NONBE_FIX_982_OMASA_DELAY_COMP_5MS + if ( !st_ivas->hDecoderConfig->Opt_tsm ) { - for ( n = 0; n < st_ivas->nchan_ism; n++ ) + *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], *nSamplesRendered ); +#else + mvr2r( output_f[CPE_CHANNELS], data_separated_objects[0], nSamplesAsked ); +#endif + + } + else { - mvr2r( output_f[n + CPE_CHANNELS], data_separated_objects[n], nSamplesAsked ); + 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 ); +#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; @@ -640,10 +665,14 @@ 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 #ifdef SPLIT_REND_WITH_HEAD_ROT int16_t slot_idx_start; @@ -655,6 +684,7 @@ ivas_error ivas_omasa_dirac_td_binaural_jbm( 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 ) { @@ -669,6 +699,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 ); diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index 396afca14..5ea4eaa7b 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -2169,7 +2169,12 @@ 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 c7e6bed6a4750ba81bb6a4b01f8cd563ee9d64c1 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Mon, 19 May 2025 13:41:07 +0200 Subject: [PATCH 2/4] fix formatting --- lib_dec/ivas_jbm_dec.c | 3 +-- lib_dec/ivas_omasa_dec.c | 12 +++++------- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 8d414ca38..6942b1e7d 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -897,7 +897,7 @@ void ivas_jbm_dec_feed_tc_to_renderer( if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_DIRAC ) { 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 ) @@ -918,7 +918,6 @@ void ivas_jbm_dec_feed_tc_to_renderer( } } #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 482daa328..ba7bed4b3 100644 --- a/lib_dec/ivas_omasa_dec.c +++ b/lib_dec/ivas_omasa_dec.c @@ -615,10 +615,9 @@ void ivas_omasa_dirac_rend_jbm( #ifdef NONBE_FIX_982_OMASA_DELAY_COMP_5MS 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 ); + mvr2r( output_f[CPE_CHANNELS], data_separated_objects[0], nSamplesAsked ); #endif - - } + } else { for ( n = 0; n < st_ivas->nchan_ism; n++ ) @@ -627,10 +626,9 @@ void ivas_omasa_dirac_rend_jbm( #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 ); #else - mvr2r( output_f[n + CPE_CHANNELS], data_separated_objects[n], nSamplesAsked ); + mvr2r( output_f[n + CPE_CHANNELS], data_separated_objects[n], nSamplesAsked ); #endif - - } + } } #ifdef NONBE_FIX_982_OMASA_DELAY_COMP_5MS @@ -699,7 +697,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 +#endif ivas_dirac_dec_binaural_render( st_ivas, nSamplesAsked, nSamplesRendered, nSamplesAvailable, nchan_transport, output_f ); -- GitLab From 4bbfd575133650b88d2bf96e92eda4480b427be5 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Mon, 19 May 2025 14:36:49 +0200 Subject: [PATCH 3/4] move #define OMASA_TDREND_MATCHING_GAIN to the correct place --- lib_com/ivas_cnst.h | 3 +++ lib_com/options.h | 4 ---- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 5177af1e0..e997589cc 100644 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -1216,6 +1216,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 68a2cecb7..08206202f 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -210,10 +210,6 @@ #define NONBE_FIX_974_OSBA_JBM_MONO_RS_USAN /* FhG : issue #974: usan in mono and stereo output in OSBA JBM RS */ #define NONBE_FIX_982_OMASA_DELAY_COMP_5MS /* FhG : issue #982 : 5ms and 20ms output different for OMASA */ -#ifdef NONBE_FIX_982_OMASA_DELAY_COMP_5MS -#define OMASA_TDREND_MATCHING_GAIN 0.7943f -#endif - /* #################### End BASOP porting switches ############################ */ -- GitLab From 30d120030acb2c88a51fc3ca1e45328ee6e13713 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Tue, 20 May 2025 07:51:45 +0200 Subject: [PATCH 4/4] fix decoder hang-up --- lib_dec/ivas_ism_renderer.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib_dec/ivas_ism_renderer.c b/lib_dec/ivas_ism_renderer.c index 09b7b60a3..a11e70a06 100644 --- a/lib_dec/ivas_ism_renderer.c +++ b/lib_dec/ivas_ism_renderer.c @@ -532,8 +532,9 @@ 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 ); } - offsetSamples = 0; #endif + offsetSamples = 0; + for ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) { n_samples_sf = hSpatParamRendCom->subframe_nbslots[subframe_idx] * hSpatParamRendCom->slot_size; -- GitLab