From 38d9ee96531da70c65c207c36bbc31a04645aed2 Mon Sep 17 00:00:00 2001 From: Sumeyra Kanik Date: Wed, 14 Jun 2023 11:15:15 +0200 Subject: [PATCH 1/6] Move TDREND_PLAY_STATUS update outside the subframe loop --- lib_com/options.h | 3 ++- lib_rend/ivas_objectRenderer.c | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index aafa43e9af..2e6cb33e29 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -185,8 +185,9 @@ #define FIX_528_ISM_MD_FILE_TOO_SHORT /* VA: issue 528: ISM Metadata file too short */ +#define FIX_550_FIRST_FRAME_ACCESS /* Eri: Issue 550: TD Object renderer: first frame accesses wrong transport channel offsets */ -/* ################## End DEVELOPMENT switches ######################### */ + /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ #endif diff --git a/lib_rend/ivas_objectRenderer.c b/lib_rend/ivas_objectRenderer.c index d1858ee97f..44aedc5cfa 100644 --- a/lib_rend/ivas_objectRenderer.c +++ b/lib_rend/ivas_objectRenderer.c @@ -296,6 +296,16 @@ ivas_error ivas_td_binaural_renderer_unwrap( hBinRendererTd->Sources[c_indx]->SrcRend_p->InputAvailable = TRUE; c_indx++; } +#ifdef FIX_550_FIRST_FRAME_ACCESS + if (hIsmMetaData[nS]->non_diegetic_flag) + { + TDREND_MIX_SRC_SetPlayState(hBinRendererTd, nS, TDREND_PLAYSTATUS_PLAYING_NON_DIEGETIC); + } + else + { + TDREND_MIX_SRC_SetPlayState(hBinRendererTd, nS, TDREND_PLAYSTATUS_PLAYING); + } +#endif } for ( subframe_idx = 0; subframe_idx < MAX_PARAM_SPATIAL_SUBFRAMES; subframe_idx++ ) @@ -489,11 +499,15 @@ void TDREND_Update_object_positions( Pos[1] = hIsmMetaData[nS]->azimuth / 90.f; Pos[2] = 0; TDREND_MIX_SRC_SetPos( hBinRendererTd, nS, Pos ); +#ifndef FIX_550_FIRST_FRAME_ACCESS TDREND_MIX_SRC_SetPlayState( hBinRendererTd, nS, TDREND_PLAYSTATUS_PLAYING_NON_DIEGETIC ); +#endif } else { +#ifndef FIX_550_FIRST_FRAME_ACCESS TDREND_MIX_SRC_SetPlayState( hBinRendererTd, nS, TDREND_PLAYSTATUS_PLAYING ); +#endif } TDREND_MIX_SRC_SetDir( hBinRendererTd, nS, Dir ); } -- GitLab From 60aa51b3b647c6992191d1eaf4207d24040814ad Mon Sep 17 00:00:00 2001 From: Sumeyra Kanik Date: Wed, 14 Jun 2023 11:18:20 +0200 Subject: [PATCH 2/6] Include the condition for ISM format --- lib_rend/ivas_objectRenderer.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/lib_rend/ivas_objectRenderer.c b/lib_rend/ivas_objectRenderer.c index 44aedc5cfa..07c076edec 100644 --- a/lib_rend/ivas_objectRenderer.c +++ b/lib_rend/ivas_objectRenderer.c @@ -297,13 +297,16 @@ ivas_error ivas_td_binaural_renderer_unwrap( c_indx++; } #ifdef FIX_550_FIRST_FRAME_ACCESS - if (hIsmMetaData[nS]->non_diegetic_flag) + if ( ivas_format == ISM_FORMAT ) { - TDREND_MIX_SRC_SetPlayState(hBinRendererTd, nS, TDREND_PLAYSTATUS_PLAYING_NON_DIEGETIC); - } - else - { - TDREND_MIX_SRC_SetPlayState(hBinRendererTd, nS, TDREND_PLAYSTATUS_PLAYING); + if ( hIsmMetaData[nS]->non_diegetic_flag ) + { + TDREND_MIX_SRC_SetPlayState( hBinRendererTd, nS, TDREND_PLAYSTATUS_PLAYING_NON_DIEGETIC ); + } + else + { + TDREND_MIX_SRC_SetPlayState( hBinRendererTd, nS, TDREND_PLAYSTATUS_PLAYING ); + } } #endif } @@ -501,7 +504,7 @@ void TDREND_Update_object_positions( TDREND_MIX_SRC_SetPos( hBinRendererTd, nS, Pos ); #ifndef FIX_550_FIRST_FRAME_ACCESS TDREND_MIX_SRC_SetPlayState( hBinRendererTd, nS, TDREND_PLAYSTATUS_PLAYING_NON_DIEGETIC ); -#endif +#endif } else { -- GitLab From 63061134f0e7a6ee6a42c275aa70f37db2610aae Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Fri, 16 Jun 2023 09:16:27 +0200 Subject: [PATCH 3/6] Unify subframe pointer increment for TD renderer under FIX_550_FIRST_FRAME_ACCESS --- lib_rend/ivas_objectRenderer.c | 18 ++++++++++++++++++ lib_rend/ivas_objectRenderer_hrFilt.c | 2 ++ 2 files changed, 20 insertions(+) diff --git a/lib_rend/ivas_objectRenderer.c b/lib_rend/ivas_objectRenderer.c index 2495bdb4ab..18022124c1 100644 --- a/lib_rend/ivas_objectRenderer.c +++ b/lib_rend/ivas_objectRenderer.c @@ -330,6 +330,19 @@ ivas_error ivas_td_binaural_renderer_unwrap( { return error; } + +#ifdef FIX_550_FIRST_FRAME_ACCESS + /* Advance subframe pointer */ + c_indx = 0; + for ( nS = 0; nS < num_src; nS++ ) + { + if ( !( ivas_format == MC_FORMAT && nS == lfe_idx ) ) /* Skip LFE for MC */ + { + hBinRendererTd->Sources[c_indx]->InputFrame_p += subframe_length; + c_indx++; + } + } +#endif } if ( hReverb != NULL ) @@ -407,8 +420,13 @@ ivas_error TDREND_GetMix( { pan_left = ( SrcSpatial_p->Pos_p[1] + 1.f ) * 0.5f; pan_right = 1.f - pan_left; +#ifdef FIX_550_FIRST_FRAME_ACCESS + v_multc_acc( Src_p->InputFrame_p, pan_left, output_buf[0], subframe_length ); + v_multc_acc( Src_p->InputFrame_p, pan_right, output_buf[1], subframe_length ); +#else v_multc_acc( &Src_p->InputFrame_p[subframe_idx * subframe_length], pan_left, output_buf[0], subframe_length ); v_multc_acc( &Src_p->InputFrame_p[subframe_idx * subframe_length], pan_right, output_buf[1], subframe_length ); +#endif } } diff --git a/lib_rend/ivas_objectRenderer_hrFilt.c b/lib_rend/ivas_objectRenderer_hrFilt.c index 6463261ec4..930fb29a5b 100644 --- a/lib_rend/ivas_objectRenderer_hrFilt.c +++ b/lib_rend/ivas_objectRenderer_hrFilt.c @@ -79,7 +79,9 @@ ivas_error TDREND_REND_RenderSourceHRFilt( v_add( LeftOutputFrame, output_buf[0], output_buf[0], subframe_length ); v_add( RightOutputFrame, output_buf[1], output_buf[1], subframe_length ); +#ifndef FIX_550_FIRST_FRAME_ACCESS Src_p->InputFrame_p += subframe_length; /* Increment input pointer */ +#endif return IVAS_ERR_OK; -- GitLab From f19dad68c49bb00819ff14d1c54ee534556f3f53 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Sun, 25 Jun 2023 18:11:42 +0200 Subject: [PATCH 4/6] Correct length of unit impulse filter used for initialization --- lib_rend/ivas_objectRenderer_sources.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib_rend/ivas_objectRenderer_sources.c b/lib_rend/ivas_objectRenderer_sources.c index 456b406b1d..ac16efab30 100644 --- a/lib_rend/ivas_objectRenderer_sources.c +++ b/lib_rend/ivas_objectRenderer_sources.c @@ -674,7 +674,11 @@ void TDREND_SRC_Init( /* Reset memory buffers */ Src_p->itd = 0; Src_p->previtd = 0; +#ifdef FIX_550_FIRST_FRAME_ACCESS + Src_p->filterlength = 1; /* Init to unit impulse of length 1 */ +#else Src_p->filterlength = -1; +#endif set_f( Src_p->mem_itd, 0.0f, ITD_MEM_LEN ); set_f( Src_p->mem_hrf_left, 0.0f, SFX_SPAT_BIN_MAX_FILTER_LENGTH - 1 ); set_f( Src_p->mem_hrf_right, 0.0f, SFX_SPAT_BIN_MAX_FILTER_LENGTH - 1 ); -- GitLab From 3009ea05bb67367cf225476e6097d79c30d7e418 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Sun, 25 Jun 2023 19:39:04 +0200 Subject: [PATCH 5/6] Add initialization of Gain for gain interpolation --- lib_rend/ivas_objectRenderer_sources.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib_rend/ivas_objectRenderer_sources.c b/lib_rend/ivas_objectRenderer_sources.c index 3408eb23fb..87cf52ad10 100644 --- a/lib_rend/ivas_objectRenderer_sources.c +++ b/lib_rend/ivas_objectRenderer_sources.c @@ -689,6 +689,9 @@ void TDREND_SRC_Init( Src_p->hrf_right_prev[0] = 1; Src_p->azim_prev = 0.0f; Src_p->elev_prev = 0.0f; +#ifdef FIX_550_FIRST_FRAME_ACCESS + Src_p->Gain = 1; +#endif Src_p->prevGain = 1.0f; return; -- GitLab From 8a2aca499c0ac4f0caa6e9b1d61f779712c59e87 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Mon, 26 Jun 2023 09:45:12 +0200 Subject: [PATCH 6/6] Add FIX_550_FIRST_FRAME_ACCESS_ALT to integrate non-diegetic panning with TD renderer filter states and ITD to handle transitions properly --- lib_com/ivas_cnst.h | 8 ++++ lib_com/options.h | 1 + lib_rend/ivas_objectRenderer.c | 14 ++++++ lib_rend/ivas_objectRenderer_mix.c | 4 ++ lib_rend/ivas_objectRenderer_sources.c | 63 ++++++++++++++++++-------- 5 files changed, 72 insertions(+), 18 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index c43692ea91..0f13eac005 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -1555,14 +1555,22 @@ typedef enum typedef enum { TDREND_POSTYPE_ABSOLUTE, /* The source position is in absolute coordinates */ +#ifdef FIX_550_FIRST_FRAME_ACCESS_ALT + TDREND_POSTYPE_NON_DIEGETIC /* The source position is non-diegetic */ +#else TDREND_POSTYPE_RELATIVE_TO_LISTENER /* The source position is relative to the listener */ +#endif } TDREND_PosType_t; typedef enum { TDREND_PLAYSTATUS_INITIAL, +#ifndef FIX_550_FIRST_FRAME_ACCESS_ALT TDREND_PLAYSTATUS_PLAYING, TDREND_PLAYSTATUS_PLAYING_NON_DIEGETIC +#else + TDREND_PLAYSTATUS_PLAYING +#endif } TDREND_PlayStatus_t; typedef enum diff --git a/lib_com/options.h b/lib_com/options.h index 9254ab412a..661c8beab4 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -159,6 +159,7 @@ #define FIX_TCX_LOWRATE_LIMITATION /* VA: issue 577: TCX bitrate limitation only when DEBUGGING is active */ #define FIX_575_LOW_OVERLAP_PLC_RECOVERY /* FhG: Issue 575 fix for PLC and transistion to TCX5*/ #define FIX_550_FIRST_FRAME_ACCESS /* Eri: Issue 550: TD Object renderer: first frame accesses wrong transport channel offsets */ +#define FIX_550_FIRST_FRAME_ACCESS_ALT /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_rend/ivas_objectRenderer.c b/lib_rend/ivas_objectRenderer.c index d19c605f59..1c035d377d 100644 --- a/lib_rend/ivas_objectRenderer.c +++ b/lib_rend/ivas_objectRenderer.c @@ -291,6 +291,7 @@ ivas_error ivas_td_binaural_renderer_unwrap( hBinRendererTd->Sources[c_indx]->SrcRend_p->InputAvailable = TRUE; c_indx++; } +#ifndef FIX_550_FIRST_FRAME_ACCESS_ALT #ifdef FIX_550_FIRST_FRAME_ACCESS if ( ivas_format == ISM_FORMAT ) { @@ -303,6 +304,7 @@ ivas_error ivas_td_binaural_renderer_unwrap( TDREND_MIX_SRC_SetPlayState( hBinRendererTd, nS, TDREND_PLAYSTATUS_PLAYING ); } } +#endif #endif } @@ -378,7 +380,9 @@ ivas_error TDREND_GetMix( float hrf_left_delta[SFX_SPAT_BIN_MAX_FILTER_LENGTH]; float hrf_right_delta[SFX_SPAT_BIN_MAX_FILTER_LENGTH]; int16_t intp_count; +#ifndef FIX_550_FIRST_FRAME_ACCESS_ALT float pan_left, pan_right; +#endif int16_t subframe_update_flag; subframe_update_flag = subframe_idx == ism_md_subframe_update; @@ -415,6 +419,7 @@ ivas_error TDREND_GetMix( error = TDREND_REND_RenderSourceHRFilt( Src_p, hrf_left_delta, hrf_right_delta, intp_count, output_buf, subframe_length ); } +#ifndef FIX_550_FIRST_FRAME_ACCESS_ALT if ( ( SrcRend_p->InputAvailable == TRUE ) && ( SrcRend_p->PlayStatus == TDREND_PLAYSTATUS_PLAYING_NON_DIEGETIC ) ) { pan_left = ( SrcSpatial_p->Pos_p[1] + 1.f ) * 0.5f; @@ -427,6 +432,7 @@ ivas_error TDREND_GetMix( v_multc_acc( &Src_p->InputFrame_p[subframe_idx * subframe_length], pan_right, output_buf[1], subframe_length ); #endif } +#endif } /* Populate output variable */ @@ -503,14 +509,22 @@ void TDREND_Update_object_positions( Pos[1] = hIsmMetaData[nS]->azimuth / 90.f; Pos[2] = 0; TDREND_MIX_SRC_SetPos( hBinRendererTd, nS, Pos ); +#ifdef FIX_550_FIRST_FRAME_ACCESS_ALT + hBinRendererTd->Sources[nS]->SrcSpatial_p->PosType = TDREND_POSTYPE_NON_DIEGETIC; +#else #ifndef FIX_550_FIRST_FRAME_ACCESS TDREND_MIX_SRC_SetPlayState( hBinRendererTd, nS, TDREND_PLAYSTATUS_PLAYING_NON_DIEGETIC ); +#endif #endif } else { +#ifdef FIX_550_FIRST_FRAME_ACCESS_ALT + hBinRendererTd->Sources[nS]->SrcSpatial_p->PosType = TDREND_POSTYPE_ABSOLUTE; +#else #ifndef FIX_550_FIRST_FRAME_ACCESS TDREND_MIX_SRC_SetPlayState( hBinRendererTd, nS, TDREND_PLAYSTATUS_PLAYING ); +#endif #endif } TDREND_MIX_SRC_SetDir( hBinRendererTd, nS, Dir ); diff --git a/lib_rend/ivas_objectRenderer_mix.c b/lib_rend/ivas_objectRenderer_mix.c index 509d22d320..e218002345 100644 --- a/lib_rend/ivas_objectRenderer_mix.c +++ b/lib_rend/ivas_objectRenderer_mix.c @@ -309,7 +309,11 @@ ivas_error TDREND_MIX_AddSrc( } else { +#ifdef FIX_550_FIRST_FRAME_ACCESS_ALT + if ( ( PosType < TDREND_POSTYPE_ABSOLUTE ) || ( PosType > TDREND_POSTYPE_NON_DIEGETIC ) ) +#else if ( ( PosType < TDREND_POSTYPE_ABSOLUTE ) || ( PosType > TDREND_POSTYPE_RELATIVE_TO_LISTENER ) ) +#endif { return ( IVAS_ERROR( IVAS_ERR_INTERNAL, "Invalid position type!\n" ) ); } diff --git a/lib_rend/ivas_objectRenderer_sources.c b/lib_rend/ivas_objectRenderer_sources.c index 87cf52ad10..fc955d7fe9 100644 --- a/lib_rend/ivas_objectRenderer_sources.c +++ b/lib_rend/ivas_objectRenderer_sources.c @@ -218,7 +218,11 @@ static void TDREND_SRC_REND_Init( /* Internal state */ SrcRend_p->InputAvailable = FALSE; +#ifdef FIX_550_FIRST_FRAME_ACCESS_ALT + SrcRend_p->PlayStatus = TDREND_PLAYSTATUS_PLAYING; +#else SrcRend_p->PlayStatus = TDREND_PLAYSTATUS_INITIAL; +#endif /* SrcGain */ for ( nC = 0; nC < SPAT_BIN_MAX_INPUT_CHANNELS; nC++ ) { @@ -277,6 +281,7 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams( *filterlength = HrFiltSet_p->FiltLength; +#ifndef FIX_550_FIRST_FRAME_ACCESS_ALT /* 1. Map source pos to the coordinate system of the listener */ switch ( SrcSpatial_p->PosType ) { @@ -296,6 +301,13 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams( TDREND_SPATIAL_VecMapToNewCoordSystem( SrcSpatial_p->Pos_p, Listener_p->Pos, Listener_p->Front, Listener_p->Up, Listener_p->Right, ListRelPos, ListRelPosAbs ); break; } +#else + if ( SrcSpatial_p->PosType == TDREND_POSTYPE_ABSOLUTE ) + { + + /* Absolute position */ + TDREND_SPATIAL_VecMapToNewCoordSystem( SrcSpatial_p->Pos_p, Listener_p->Pos, Listener_p->Front, Listener_p->Up, Listener_p->Right, ListRelPos, ListRelPosAbs ); +#endif ListRelDist = TDREND_SPATIAL_VecNorm( ListRelPos ); @@ -351,25 +363,40 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams( azim_delta = ( azim_delta > 180.0f ) ? ( azim_delta - 360 ) : ( ( azim_delta < -180.0f ) ? ( azim_delta + 360 ) : ( azim_delta ) ); /* map to -180:180 range */ *intp_count = min( MAX_INTERPOLATION_STEPS, max( (int16_t) ( fabsf( azim_delta ) * MAX_ANGULAR_STEP_INV ), (int16_t) ( fabsf( elev_delta ) * MAX_ANGULAR_STEP_INV ) ) ); +#ifdef FIX_550_FIRST_FRAME_ACCESS_ALT +} +else /* TDREND_POSTYPE_NON_DIEGETIC */ +{ + *itd = 0; + *Gain = 1.0f; + set_f( hrf_left, 0.0f, *filterlength ); + set_f( hrf_right, 0.0f, *filterlength ); + hrf_left[0] = ( SrcSpatial_p->Pos_p[1] + 1.f ) * 0.5f; + hrf_right[0] = 1.f - hrf_left[0]; + *intp_count = MAX_INTERPOLATION_STEPS; + Src_p->elev_prev = 0; + Src_p->azim_prev = 360.0f; /* Dummy angle -- sets max interpolation if switching to TDREND_POSTYPE_ABSOLUTE */ +} +#endif - if ( ( *intp_count > 0 ) && subframe_update_flag ) - { - /* Set deltas for interpolation */ - v_sub( hrf_left, hrf_left_prev, hrf_left_delta, *filterlength ); - v_multc( hrf_left_delta, 1.0f / *intp_count, hrf_left_delta, *filterlength ); - v_sub( hrf_right, hrf_right_prev, hrf_right_delta, *filterlength ); - v_multc( hrf_right_delta, 1.0f / *intp_count, hrf_right_delta, *filterlength ); - } - else - { - /* No interpolation, just set the new filters and reset deltas */ - mvr2r( hrf_left, hrf_left_prev, *filterlength ); - mvr2r( hrf_right, hrf_right_prev, *filterlength ); - set_f( hrf_left_delta, 0.0f, *filterlength ); - set_f( hrf_right_delta, 0.0f, *filterlength ); - } +if ( ( *intp_count > 0 ) && subframe_update_flag ) +{ + /* Set deltas for interpolation */ + v_sub( hrf_left, hrf_left_prev, hrf_left_delta, *filterlength ); + v_multc( hrf_left_delta, 1.0f / *intp_count, hrf_left_delta, *filterlength ); + v_sub( hrf_right, hrf_right_prev, hrf_right_delta, *filterlength ); + v_multc( hrf_right_delta, 1.0f / *intp_count, hrf_right_delta, *filterlength ); +} +else +{ + /* No interpolation, just set the new filters and reset deltas */ + mvr2r( hrf_left, hrf_left_prev, *filterlength ); + mvr2r( hrf_right, hrf_right_prev, *filterlength ); + set_f( hrf_left_delta, 0.0f, *filterlength ); + set_f( hrf_right_delta, 0.0f, *filterlength ); +} - return; +return; } @@ -677,7 +704,7 @@ void TDREND_SRC_Init( #ifdef FIX_550_FIRST_FRAME_ACCESS Src_p->filterlength = 1; /* Init to unit impulse of length 1 */ #else - Src_p->filterlength = -1; + Src_p->filterlength = -1; #endif set_f( Src_p->mem_itd, 0.0f, ITD_MEM_LEN ); set_f( Src_p->mem_hrf_left, 0.0f, SFX_SPAT_BIN_MAX_FILTER_LENGTH - 1 ); -- GitLab