Loading lib_com/ivas_cnst.h +8 −0 Original line number Diff line number Diff line Loading @@ -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 Loading lib_com/options.h +1 −0 Original line number Diff line number Diff line Loading @@ -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 */ Loading lib_rend/ivas_objectRenderer.c +14 −0 Original line number Diff line number Diff line Loading @@ -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 ) { Loading @@ -303,6 +304,7 @@ ivas_error ivas_td_binaural_renderer_unwrap( TDREND_MIX_SRC_SetPlayState( hBinRendererTd, nS, TDREND_PLAYSTATUS_PLAYING ); } } #endif #endif } Loading Loading @@ -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; Loading Loading @@ -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; Loading @@ -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 */ Loading Loading @@ -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 ); Loading lib_rend/ivas_objectRenderer_mix.c +4 −0 Original line number Diff line number Diff line Loading @@ -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" ) ); } Loading lib_rend/ivas_objectRenderer_sources.c +45 −18 Original line number Diff line number Diff line Loading @@ -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++ ) { Loading Loading @@ -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 ) { Loading @@ -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 ); Loading Loading @@ -351,6 +363,21 @@ 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 ) { Loading Loading
lib_com/ivas_cnst.h +8 −0 Original line number Diff line number Diff line Loading @@ -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 Loading
lib_com/options.h +1 −0 Original line number Diff line number Diff line Loading @@ -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 */ Loading
lib_rend/ivas_objectRenderer.c +14 −0 Original line number Diff line number Diff line Loading @@ -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 ) { Loading @@ -303,6 +304,7 @@ ivas_error ivas_td_binaural_renderer_unwrap( TDREND_MIX_SRC_SetPlayState( hBinRendererTd, nS, TDREND_PLAYSTATUS_PLAYING ); } } #endif #endif } Loading Loading @@ -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; Loading Loading @@ -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; Loading @@ -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 */ Loading Loading @@ -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 ); Loading
lib_rend/ivas_objectRenderer_mix.c +4 −0 Original line number Diff line number Diff line Loading @@ -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" ) ); } Loading
lib_rend/ivas_objectRenderer_sources.c +45 −18 Original line number Diff line number Diff line Loading @@ -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++ ) { Loading Loading @@ -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 ) { Loading @@ -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 ); Loading Loading @@ -351,6 +363,21 @@ 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 ) { Loading