From 44b91a1153743d499703cc243cc5fd50045a53df Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Thu, 5 Mar 2026 11:59:48 +0200 Subject: [PATCH 1/4] Fix the float issue 1528 by adding a rendering time resolution independent counter. --- lib_com/options.h | 1 + lib_rend/ivas_objectRenderer_fx.c | 22 ++++++++++++++++++++++ lib_rend/ivas_prot_rend_fx.h | 8 ++++++++ lib_rend/ivas_stat_rend.h | 3 +++ lib_rend/lib_rend_fx.c | 8 ++++++++ 5 files changed, 42 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index b2727be5a..7826959d1 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -97,6 +97,7 @@ #define FIX_2448_RENDERER_MSAN_ERROR /* FhG: basop issue 2448: fix MSAN error with MSA rendering */ #define FIX_2283_ISM_MD_DELAY /* Dolby: Fix ISM metadata delay round-off */ +#define FIX_FLOAT_1528_5MS_REND_ISM_META_DELAY_COMPENSATION /* Nokia: float issue 1528: Fixes incorrect compensation for ISM metadata delay in 5ms TD rendering */ /* ##################### End NON-BE switches ########################### */ diff --git a/lib_rend/ivas_objectRenderer_fx.c b/lib_rend/ivas_objectRenderer_fx.c index 49836f2d1..31da2eec6 100644 --- a/lib_rend/ivas_objectRenderer_fx.c +++ b/lib_rend/ivas_objectRenderer_fx.c @@ -351,6 +351,10 @@ ivas_error ivas_td_binaural_renderer_unwrap_fx( Word32 *output_fx[], /* i/o: SCE channels / Binaural synthesis Q11 */ const Word16 output_frame, /* i : output frame length */ const Word16 num_subframes /* i : number of subframes to render */ +#ifdef FIX_FLOAT_1528_5MS_REND_ISM_META_DELAY_COMPENSATION + , + Word16 *metaSfCounter /* i/o: subframe counter for metadata update */ +#endif ) { Word16 subframe_length; @@ -400,7 +404,11 @@ ivas_error ivas_td_binaural_renderer_unwrap_fx( FOR( subframe_idx = 0; subframe_idx < num_subframes; subframe_idx++ ) { +#ifdef FIX_FLOAT_1528_5MS_REND_ISM_META_DELAY_COMPENSATION + IF( EQ_16( *metaSfCounter, ism_md_subframe_update ) ) +#else IF( EQ_16( subframe_idx, ism_md_subframe_update ) ) +#endif { /* Update object position(s) */ IF( NE_32( ( error = TDREND_Update_object_positions_fx( hBinRendererTd, num_src, ivas_format, hIsmMetaData ) ), IVAS_ERR_OK ) ) @@ -409,6 +417,10 @@ ivas_error ivas_td_binaural_renderer_unwrap_fx( } } +#ifdef FIX_FLOAT_1528_5MS_REND_ISM_META_DELAY_COMPENSATION + *metaSfCounter = ( *metaSfCounter + 1 ) % 4; + +#endif /* Update the listener's location/orientation */ Word16 tmp_headRotEnabled; tmp_headRotEnabled = 0; @@ -884,7 +896,11 @@ ivas_error ivas_td_binaural_open_ext_fx( *---------------------------------------------------------------------*/ ivas_error ivas_td_binaural_renderer_ext_fx( +#ifdef FIX_FLOAT_1528_5MS_REND_ISM_META_DELAY_COMPENSATION + TDREND_WRAPPER *pTDRend, /* i/o: TD Renderer wrapper structure */ +#else const TDREND_WRAPPER *pTDRend, /* i : TD Renderer wrapper structure */ +#endif const AUDIO_CONFIG inConfig, /* i : Input audio configuration */ const LSSETUP_CUSTOM_HANDLE customLsInput, /* i : Input custom loudspeaker layout */ const COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData, /* i : Combined head and external orientations */ @@ -1005,9 +1021,15 @@ ivas_error ivas_td_binaural_renderer_ext_fx( } } +#ifdef FIX_FLOAT_1528_5MS_REND_ISM_META_DELAY_COMPENSATION + IF( NE_32( ( error = ivas_td_binaural_renderer_unwrap_fx( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, *hCombinedOrientationData, + ism_md_subframe_update_ext, p_output_fx, output_frame, num_subframes, &pTDRend->metaSfCounter ) ), + IVAS_ERR_OK ) ) +#else IF( NE_32( ( error = ivas_td_binaural_renderer_unwrap_fx( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, *hCombinedOrientationData, ism_md_subframe_update_ext, p_output_fx, output_frame, num_subframes ) ), IVAS_ERR_OK ) ) +#endif { return error; } diff --git a/lib_rend/ivas_prot_rend_fx.h b/lib_rend/ivas_prot_rend_fx.h index 83704923a..7206a2093 100644 --- a/lib_rend/ivas_prot_rend_fx.h +++ b/lib_rend/ivas_prot_rend_fx.h @@ -671,10 +671,18 @@ ivas_error ivas_td_binaural_renderer_unwrap_fx( Word32 *output_fx[], /* i/o: SCE channels / Binaural synthesis Q11 */ const Word16 output_frame, /* i : output frame length */ const Word16 num_subframes /* i : number of subframes to render */ +#ifdef FIX_FLOAT_1528_5MS_REND_ISM_META_DELAY_COMPENSATION + , + Word16 *metaSfCounter /* i/o: subframe counter for metadata update */ +#endif ); ivas_error ivas_td_binaural_renderer_ext_fx( +#ifdef FIX_FLOAT_1528_5MS_REND_ISM_META_DELAY_COMPENSATION + TDREND_WRAPPER *pTDRend, /* i/o: TD Renderer wrapper structure */ +#else const TDREND_WRAPPER *pTDRend, /* i : TD Renderer wrapper structure */ +#endif const AUDIO_CONFIG inConfig, /* i : Input audio configuration */ const LSSETUP_CUSTOM_HANDLE customLsInput, /* i : Input custom loudspeaker layout */ const COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData,/* i : Combined head and external orientations */ diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index bf25e92f8..7684dff68 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -1278,6 +1278,9 @@ typedef struct Word32 binaural_latency_ns; BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd; TDREND_HRFILT_FiltSet_t **hHrtfTD; +#ifdef FIX_FLOAT_1528_5MS_REND_ISM_META_DELAY_COMPENSATION + Word16 metaSfCounter; +#endif } TDREND_WRAPPER, *TDREND_WRAPPER_HANDLE; diff --git a/lib_rend/lib_rend_fx.c b/lib_rend/lib_rend_fx.c index e121b5929..423442f94 100644 --- a/lib_rend/lib_rend_fx.c +++ b/lib_rend/lib_rend_fx.c @@ -1425,6 +1425,10 @@ static TDREND_WRAPPER defaultTdRendWrapper( move32(); w.hBinRendererTd = NULL; w.hHrtfTD = NULL; +#ifdef FIX_FLOAT_1528_5MS_REND_ISM_META_DELAY_COMPENSATION + w.metaSfCounter = 0; + move16(); +#endif return w; } @@ -6523,7 +6527,11 @@ static ivas_error rotateFrameSba_fx( static ivas_error renderIsmToBinaural( +#ifdef FIX_FLOAT_1528_5MS_REND_ISM_META_DELAY_COMPENSATION input_ism *ismInput, +#else + const input_ism *ismInput, +#endif IVAS_REND_AudioBuffer outAudio ) { Word32 tmpTDRendBuffer[MAX_OUTPUT_CHANNELS][L_FRAME48k]; -- GitLab From fd52753892cd59d13cef5c248bc01b49620ed022 Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Thu, 5 Mar 2026 12:10:43 +0200 Subject: [PATCH 2/4] Clang format and one structure change to avoid insane formatting. --- lib_rend/ivas_objectRenderer_fx.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/lib_rend/ivas_objectRenderer_fx.c b/lib_rend/ivas_objectRenderer_fx.c index 31da2eec6..aa77997ab 100644 --- a/lib_rend/ivas_objectRenderer_fx.c +++ b/lib_rend/ivas_objectRenderer_fx.c @@ -353,7 +353,7 @@ ivas_error ivas_td_binaural_renderer_unwrap_fx( const Word16 num_subframes /* i : number of subframes to render */ #ifdef FIX_FLOAT_1528_5MS_REND_ISM_META_DELAY_COMPENSATION , - Word16 *metaSfCounter /* i/o: subframe counter for metadata update */ + Word16 *metaSfCounter /* i/o: subframe counter for metadata update */ #endif ) { @@ -406,9 +406,15 @@ ivas_error ivas_td_binaural_renderer_unwrap_fx( { #ifdef FIX_FLOAT_1528_5MS_REND_ISM_META_DELAY_COMPENSATION IF( EQ_16( *metaSfCounter, ism_md_subframe_update ) ) + { + /* Update object position(s) */ + IF( NE_32( ( error = TDREND_Update_object_positions_fx( hBinRendererTd, num_src, ivas_format, hIsmMetaData ) ), IVAS_ERR_OK ) ) + { + return error; + } + } #else IF( EQ_16( subframe_idx, ism_md_subframe_update ) ) -#endif { /* Update object position(s) */ IF( NE_32( ( error = TDREND_Update_object_positions_fx( hBinRendererTd, num_src, ivas_format, hIsmMetaData ) ), IVAS_ERR_OK ) ) @@ -416,6 +422,7 @@ ivas_error ivas_td_binaural_renderer_unwrap_fx( return error; } } +#endif #ifdef FIX_FLOAT_1528_5MS_REND_ISM_META_DELAY_COMPENSATION *metaSfCounter = ( *metaSfCounter + 1 ) % 4; @@ -897,9 +904,9 @@ ivas_error ivas_td_binaural_open_ext_fx( ivas_error ivas_td_binaural_renderer_ext_fx( #ifdef FIX_FLOAT_1528_5MS_REND_ISM_META_DELAY_COMPENSATION - TDREND_WRAPPER *pTDRend, /* i/o: TD Renderer wrapper structure */ + TDREND_WRAPPER *pTDRend, /* i/o: TD Renderer wrapper structure */ #else - const TDREND_WRAPPER *pTDRend, /* i : TD Renderer wrapper structure */ + const TDREND_WRAPPER *pTDRend, /* i : TD Renderer wrapper structure */ #endif const AUDIO_CONFIG inConfig, /* i : Input audio configuration */ const LSSETUP_CUSTOM_HANDLE customLsInput, /* i : Input custom loudspeaker layout */ -- GitLab From c911e9c958a1a6fd15a85ef08990e255f6081ee0 Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Thu, 5 Mar 2026 12:13:49 +0200 Subject: [PATCH 3/4] Apply insane clang format to satisfy it... --- lib_rend/ivas_objectRenderer_fx.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/lib_rend/ivas_objectRenderer_fx.c b/lib_rend/ivas_objectRenderer_fx.c index aa77997ab..1e1ec211f 100644 --- a/lib_rend/ivas_objectRenderer_fx.c +++ b/lib_rend/ivas_objectRenderer_fx.c @@ -414,14 +414,12 @@ ivas_error ivas_td_binaural_renderer_unwrap_fx( } } #else - IF( EQ_16( subframe_idx, ism_md_subframe_update ) ) - { + IF( EQ_16( subframe_idx, ism_md_subframe_update ) ){ /* Update object position(s) */ - IF( NE_32( ( error = TDREND_Update_object_positions_fx( hBinRendererTd, num_src, ivas_format, hIsmMetaData ) ), IVAS_ERR_OK ) ) - { + IF( NE_32( ( error = TDREND_Update_object_positions_fx( hBinRendererTd, num_src, ivas_format, hIsmMetaData ) ), IVAS_ERR_OK ) ){ return error; - } - } + } +} #endif #ifdef FIX_FLOAT_1528_5MS_REND_ISM_META_DELAY_COMPENSATION @@ -446,7 +444,7 @@ ivas_error ivas_td_binaural_renderer_unwrap_fx( #ifdef FIX_2458_USAN_NULLPTR_WITH_ZERO_OFFSET IF( NE_32( ( error = TDREND_Update_listener_orientation_fx( hBinRendererTd, tmp_headRotEnabled, ( Quaternions != NULL ) ? &Quaternions[tmp_CombinedOrient_subframe_idx] : NULL, ( Pos != NULL ) ? &Pos[tmp_CombinedOrient_subframe_idx] : NULL ) ), IVAS_ERR_OK ) ) #else - IF( NE_32( ( error = TDREND_Update_listener_orientation_fx( hBinRendererTd, tmp_headRotEnabled, &Quaternions[tmp_CombinedOrient_subframe_idx], &Pos[tmp_CombinedOrient_subframe_idx] ) ), IVAS_ERR_OK ) ) +IF( NE_32( ( error = TDREND_Update_listener_orientation_fx( hBinRendererTd, tmp_headRotEnabled, &Quaternions[tmp_CombinedOrient_subframe_idx], &Pos[tmp_CombinedOrient_subframe_idx] ) ), IVAS_ERR_OK ) ) #endif { return error; -- GitLab From 4320e52d8f13b97da2d3ad7829ace43406209a9b Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Thu, 5 Mar 2026 13:52:45 +0200 Subject: [PATCH 4/4] Convert increment + modulo to BASOP --- lib_rend/ivas_objectRenderer_fx.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib_rend/ivas_objectRenderer_fx.c b/lib_rend/ivas_objectRenderer_fx.c index 1e1ec211f..a447eeaf1 100644 --- a/lib_rend/ivas_objectRenderer_fx.c +++ b/lib_rend/ivas_objectRenderer_fx.c @@ -423,7 +423,12 @@ ivas_error ivas_td_binaural_renderer_unwrap_fx( #endif #ifdef FIX_FLOAT_1528_5MS_REND_ISM_META_DELAY_COMPENSATION - *metaSfCounter = ( *metaSfCounter + 1 ) % 4; + *metaSfCounter = add( *metaSfCounter, 1 ); + IF( EQ_16( *metaSfCounter, 4 ) ) + { + *metaSfCounter = 0; + move16(); + } #endif /* Update the listener's location/orientation */ -- GitLab