From 2523a6dfc8f7fdff5a151a5c11b7f721a5f55a4e Mon Sep 17 00:00:00 2001 From: esumdem Date: Tue, 12 Aug 2025 17:11:15 +0200 Subject: [PATCH] Add NONBE_FIX_1196_TD_HEADTRACKING_INTERPOLATION to address clicks in TD renderer with headtracking --- lib_com/options.h | 1 + lib_dec/ivas_objectRenderer_internal_fx.c | 4 ++++ lib_rend/ivas_objectRenderer_fx.c | 28 ++++++++++++++++++++--- lib_rend/ivas_objectRenderer_sources_fx.c | 16 ++++++++++--- lib_rend/ivas_prot_rend_fx.h | 11 ++++++++- 5 files changed, 53 insertions(+), 7 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 62bccdca6..5ceb914ba 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -130,6 +130,7 @@ #define NONBE_FIX_981_PARAMBIN_DEFAULT_EARLY_PART /* Nokia: Set default early part energy correction to unity for BINAURAL_ROOM_REVERB */ #define NONBE_FIX_1174_MCMASA_LBR_LOOP_ERROR /* Nokia: Fix issue 1174 by removing the unnecessary inner loop causing problems. */ #define NONBE_FIX_1052_SBA_EXT_FIX /* VA: SBA external output support fix - do not overwrite "output_config" parameter */ +#define NONBE_FIX_1196_TD_HEADTRACKING_INTERPOLATION /* Ericsson: Issue 1196, Always apply filter interpolation for each subframe */ /* #################### End BASOP porting switches ############################ */ diff --git a/lib_dec/ivas_objectRenderer_internal_fx.c b/lib_dec/ivas_objectRenderer_internal_fx.c index e64e9d220..f4cfa0dc1 100644 --- a/lib_dec/ivas_objectRenderer_internal_fx.c +++ b/lib_dec/ivas_objectRenderer_internal_fx.c @@ -263,7 +263,11 @@ ivas_error ivas_td_binaural_renderer_sf_fx( /* Render subframe */ /* ism_md_subframe_update_jbm != subframe_idx: trigger update only for ism_md_subframe_update_jbm == subframe_idx, where then the two TDREND_GetMix()-arguments subframe_idx and ism_md_subframe_update are equal, and we want to enforce the update inside TDREND_GetMix to use subframe_idx == 0 */ +#ifdef NONBE_FIX_1196_TD_HEADTRACKING_INTERPOLATION + IF( NE_32( ( error = TDREND_GetMix_fx( st_ivas->hBinRendererTd, output_fx_local, output_frame, 0 ) ), IVAS_ERR_OK ) ) +#else IF( NE_32( ( error = TDREND_GetMix_fx( st_ivas->hBinRendererTd, output_fx_local, output_frame, 0, ism_md_subframe_update_jbm != subframe_idx ) ), IVAS_ERR_OK ) ) +#endif { return error; } diff --git a/lib_rend/ivas_objectRenderer_fx.c b/lib_rend/ivas_objectRenderer_fx.c index bfd856656..eca9692b5 100644 --- a/lib_rend/ivas_objectRenderer_fx.c +++ b/lib_rend/ivas_objectRenderer_fx.c @@ -459,7 +459,12 @@ ivas_error ivas_td_binaural_renderer_unwrap_fx( } /* Render subframe */ + +#ifdef NONBE_FIX_1196_TD_HEADTRACKING_INTERPOLATION + IF( NE_32( ( error = TDREND_GetMix_fx( hBinRendererTd, output_fx, subframe_length, subframe_idx ) ), IVAS_ERR_OK ) ) +#else IF( NE_32( ( error = TDREND_GetMix_fx( hBinRendererTd, output_fx, subframe_length, subframe_idx, ism_md_subframe_update ) ), IVAS_ERR_OK ) ) +#endif { return error; } @@ -502,8 +507,12 @@ ivas_error TDREND_GetMix_fx( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ Word32 *output[], /* i/o: ISM object synth / rendered output in 0,1 Q11 */ const Word16 subframe_length, /* i/o: subframe length */ - const Word16 subframe_idx, /* i : Subframe index to 5 ms subframe */ - const Word16 ism_md_subframe_update /* i : Number of subframes to delay ism metadata to sync with audio */ +#ifdef NONBE_FIX_1196_TD_HEADTRACKING_INTERPOLATION + const Word16 subframe_idx /* i : Subframe index to 5 ms subframe */ +#else + const Word16 subframe_idx, /* i : Subframe index to 5 ms subframe */ + const Word16 ism_md_subframe_update /* i : Number of subframes to delay ism metadata to sync with audio */ +#endif ) { Word16 i; @@ -515,14 +524,18 @@ ivas_error TDREND_GetMix_fx( Word32 hrf_left_delta[SFX_SPAT_BIN_MAX_FILTER_LENGTH]; Word32 hrf_right_delta[SFX_SPAT_BIN_MAX_FILTER_LENGTH]; Word16 intp_count; + +#ifndef NONBE_FIX_1196_TD_HEADTRACKING_INTERPOLATION Word16 subframe_update_flag; +#endif Word16 hrf_left_delta_e = 0, hrf_right_delta_e = 0; move16(); move16(); +#ifndef NONBE_FIX_1196_TD_HEADTRACKING_INTERPOLATION subframe_update_flag = (Word16) EQ_16( subframe_idx, ism_md_subframe_update ); move16(); - +#endif error = IVAS_ERR_OK; move32(); /* Clear the output buffer to accumulate rendered sources */ @@ -548,12 +561,21 @@ ivas_error TDREND_GetMix_fx( test(); IF( EQ_16( SrcRend_p->PlayStatus, TDREND_PLAYSTATUS_PLAYING ) && ( hBinRendererTd->Listener_p->PoseUpdated || SrcSpatial_p->Updated ) ) { +#ifdef NONBE_FIX_1196_TD_HEADTRACKING_INTERPOLATION + TDREND_SRC_REND_UpdateFiltersFromSpatialParams_fx( hBinRendererTd, SrcRend_p, SrcSpatial_p, + Src_p->hrf_left_prev_fx, &Src_p->hrf_left_prev_e, Src_p->hrf_right_prev_fx, &Src_p->hrf_right_prev_e, + hrf_left_delta, &hrf_left_delta_e, hrf_right_delta, &hrf_right_delta_e, + &intp_count, &Src_p->filterlength, &Src_p->itd, + &Src_p->Gain_fx, + Src_p ); +#else TDREND_SRC_REND_UpdateFiltersFromSpatialParams_fx( hBinRendererTd, SrcRend_p, SrcSpatial_p, Src_p->hrf_left_prev_fx, &Src_p->hrf_left_prev_e, Src_p->hrf_right_prev_fx, &Src_p->hrf_right_prev_e, hrf_left_delta, &hrf_left_delta_e, hrf_right_delta, &hrf_right_delta_e, &intp_count, &Src_p->filterlength, &Src_p->itd, &Src_p->Gain_fx, Src_p, subframe_update_flag ); +#endif } /* Render source if needed */ diff --git a/lib_rend/ivas_objectRenderer_sources_fx.c b/lib_rend/ivas_objectRenderer_sources_fx.c index bf8b3a30e..62a8fc906 100644 --- a/lib_rend/ivas_objectRenderer_sources_fx.c +++ b/lib_rend/ivas_objectRenderer_sources_fx.c @@ -307,9 +307,14 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams_fx( Word16 *itd, /* o : ITD value */ // Q0 Word32 *Gain, - /* o : Gain value */ // Q30 - TDREND_SRC_t *Src_p, /* i/o: Source pointer */ - const Word16 subframe_update_flag ) +/* o : Gain value */ // Q30 +#ifdef NONBE_FIX_1196_TD_HEADTRACKING_INTERPOLATION + TDREND_SRC_t *Src_p /* i/o: Source pointer */ +#else + TDREND_SRC_t *Src_p, /* i/o: Source pointer */ + const Word16 subframe_update_flag +#endif +) { TDREND_MIX_Listener_t *Listener_p; TDREND_HRFILT_FiltSet_t *HrFiltSet_p; @@ -469,7 +474,12 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams_fx( } test(); + +#ifdef NONBE_FIX_1196_TD_HEADTRACKING_INTERPOLATION + IF( ( *intp_count > 0 ) ) +#else IF( ( *intp_count > 0 ) && subframe_update_flag ) +#endif { /* Set deltas for interpolation */ Word16 tmp_e; diff --git a/lib_rend/ivas_prot_rend_fx.h b/lib_rend/ivas_prot_rend_fx.h index 69034e43c..a144ef6bd 100644 --- a/lib_rend/ivas_prot_rend_fx.h +++ b/lib_rend/ivas_prot_rend_fx.h @@ -686,8 +686,12 @@ ivas_error TDREND_GetMix_fx( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ Word32 *output[], /* i/o: ISM object synth / rendered output in 0,1 */ const Word16 subframe_length, /* i/o: subframe length Q11 */ +#ifdef NONBE_FIX_1196_TD_HEADTRACKING_INTERPOLATION +const Word16 subframe_idx /* i : Subframe index to 5 ms subframe */ +#else const Word16 subframe_idx, /* i : Subframe index to 5 ms subframe */ const Word16 ism_md_subframe_update /* i : Number of subframes to delay ism metadata to sync with audio */ +#endif ); void BSplineModelEvalDealloc_fx( @@ -772,8 +776,13 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams_fx( Word16 *filterlength, /* o : Length of filters */ Word16 *itd, /* o : ITD value */ Word32 *Gain, /* o : Gain value Q30 */ +#ifdef NONBE_FIX_1196_TD_HEADTRACKING_INTERPOLATION + TDREND_SRC_t *Src_p /* i/o: Source pointer */ +#else TDREND_SRC_t *Src_p, /* i/o: Source pointer */ - const Word16 subframe_update_flag); + const Word16 subframe_update_flag /* i : Flag to determine update subframe idx */ +#endif +); ivas_error TDREND_SRC_Alloc( TDREND_SRC_t **Src_pp /* i/o: Source */ -- GitLab