Loading lib_dec/ivas_init_dec.c +10 −1 Original line number Diff line number Diff line Loading @@ -758,12 +758,21 @@ ivas_error ivas_init_decoder_front( { return error; } #ifdef IVAS_FLOAT_FIXED error = ivas_orient_trk_SetTrackingType_fx( st_ivas->hHeadTrackData->OrientationTracker_fx, st_ivas->hDecoderConfig->orientation_tracking ); st_ivas->hHeadTrackData->OrientationTracker->orientation_tracking = st_ivas->hHeadTrackData->OrientationTracker_fx->orientation_tracking_fx; IF( ( error ) != IVAS_ERR_OK ) { return error; } } #else IF ( ( error = ivas_orient_trk_SetTrackingType( st_ivas->hHeadTrackData->OrientationTracker, st_ivas->hDecoderConfig->orientation_tracking ) ) != IVAS_ERR_OK ) { return error; } } #endif /*-------------------------------------------------------------------* * Allocate and initialize external orientation handle *--------------------------------------------------------------------*/ Loading lib_rend/ivas_orient_trk.c +75 −0 Original line number Diff line number Diff line Loading @@ -72,6 +72,19 @@ static IVAS_QUATERNION IdentityQuaternion( return q; } #ifdef IVAS_FLOAT_FIXED static IVAS_QUATERNION_FX IdentityQuaternion_fx( void ) { IVAS_QUATERNION_FX q; q.w_fx = ONE_IN_Q31; q.x_fx = q.y_fx = q.z_fx = 0; q.w_qfact = q.x_qfact = q.y_qfact = q.z_qfact = Q31; return q; } #endif /*------------------------------------------------------------------------------------------* * QuaternionProduct() Loading Loading @@ -796,6 +809,23 @@ ivas_error ivas_orient_trk_SetTrackingType( return IVAS_ERR_OK; } #ifdef IVAS_FLOAT_FIXED ivas_error ivas_orient_trk_SetTrackingType_fx( ivas_orient_trk_state_t_fx *pOTR, /* i/o: orientation tracker handle */ const IVAS_HEAD_ORIENT_TRK_T orientation_tracking /* i : orientation tracking type */ ) { if ( pOTR == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; } pOTR->orientation_tracking_fx = orientation_tracking; return IVAS_ERR_OK; } #endif /*-------------------------------------------------------------------* * ivas_orient_trk_SetReferenceRotation() * Loading Loading @@ -860,6 +890,35 @@ ivas_error ivas_orient_trk_GetMainOrientation( return IVAS_ERR_OK; } #ifdef IVAS_FLOAT_FIXED ivas_error ivas_orient_trk_GetMainOrientation_fx( ivas_orient_trk_state_t_fx *pOTR, /* i/o: orientation tracker handle */ IVAS_QUATERNION_FX *pOrientation /* i/o: average/reference orientation */ ) { if ( pOTR == NULL || pOrientation == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; } switch ( pOTR->orientation_tracking_fx ) { case IVAS_HEAD_ORIENT_TRK_NONE: *pOrientation = IdentityQuaternion_fx(); break; case IVAS_HEAD_ORIENT_TRK_REF_VEC: case IVAS_HEAD_ORIENT_TRK_REF_VEC_LEV: case IVAS_HEAD_ORIENT_TRK_REF: *pOrientation = pOTR->refRot_fx; break; case IVAS_HEAD_ORIENT_TRK_AVG: *pOrientation = pOTR->absAvgRot_fx; break; } return IVAS_ERR_OK; } #endif /*-------------------------------------------------------------------* * ivas_orient_trk_GetTrackedRotation() Loading @@ -882,6 +941,22 @@ ivas_error ivas_orient_trk_GetTrackedRotation( return IVAS_ERR_OK; } #ifdef IVAS_FLOAT_FIXED ivas_error ivas_orient_trk_GetTrackedRotation_fx( ivas_orient_trk_state_t_fx *pOTR, /* i/o: orientation tracker handle */ IVAS_QUATERNION_FX *pRotation /* i/o: processed rotation */ ) { if (pOTR == NULL || pRotation == NULL) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; } *pRotation = pOTR->trkRot_fx; return IVAS_ERR_OK; } #endif /*-------------------------------------------------------------------* * ivas_orient_trk_SetReferenceVector() Loading lib_rend/ivas_prot_rend.h +17 −0 Original line number Diff line number Diff line Loading @@ -1787,6 +1787,23 @@ ivas_error ivas_orient_trk_Process( IVAS_QUATERNION *pTrkRot /* o : tracked rotation */ ); #ifdef IVAS_FLOAT_FIXED ivas_error ivas_orient_trk_SetTrackingType_fx( ivas_orient_trk_state_t_fx *pOTR, /* i/o: orientation tracker handle */ const IVAS_HEAD_ORIENT_TRK_T orientation_tracking /* i : orientation tracking type */ ); ivas_error ivas_orient_trk_GetMainOrientation_fx( ivas_orient_trk_state_t_fx *pOTR, /* i/o: orientation tracker handle */ IVAS_QUATERNION_FX *pOrientation /* i/o: average/reference orientation */ ); ivas_error ivas_orient_trk_GetTrackedRotation_fx( ivas_orient_trk_state_t_fx *pOTR, /* i/o: orientation tracker handle */ IVAS_QUATERNION_FX *pRotation /* i/o: processed rotation */ ); #endif /*----------------------------------------------------------------------------------* * Rendering & merging to MASA format Loading lib_rend/ivas_rotation.c +15 −0 Original line number Diff line number Diff line Loading @@ -131,6 +131,13 @@ ivas_error ivas_headTrack_open( return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Orientation tracking" ); } #ifdef IVAS_FLOAT_FIXED if (((*hHeadTrackData)->OrientationTracker_fx = (ivas_orient_trk_state_t_fx *)malloc(sizeof(ivas_orient_trk_state_t_fx))) == NULL) { return IVAS_ERROR(IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Orientation tracking"); } #endif if ( ( error = ivas_orient_trk_Init( ( *hHeadTrackData )->OrientationTracker ) ) != IVAS_ERR_OK ) { return error; Loading Loading @@ -174,6 +181,14 @@ void ivas_headTrack_close( ( *hHeadTrackData )->OrientationTracker = NULL; } #ifdef IVAS_FLOAT_FIXED if ((*hHeadTrackData)->OrientationTracker_fx != NULL) { free((*hHeadTrackData)->OrientationTracker_fx); (*hHeadTrackData)->OrientationTracker_fx = NULL; } #endif free( ( *hHeadTrackData ) ); *hHeadTrackData = NULL; Loading lib_rend/ivas_stat_rend.h +11 −5 Original line number Diff line number Diff line Loading @@ -803,11 +803,11 @@ typedef struct ivas_orient_trk_state_t typedef struct ivas_orient_trk_state_t_fx { IVAS_HEAD_ORIENT_TRK_T orientation_tracking_fx; Word16 centerAdaptationRate_fx; Word16 offCenterAdaptationRate_fx; Word16 adaptationAngle_fx; Word32 centerAdaptationRate_fx; Word32 offCenterAdaptationRate_fx; Word32 adaptationAngle_fx; Word16 alpha_fx; Word32 alpha_fx; IVAS_QUATERNION_FX absAvgRot_fx; /* average absolute orientation */ IVAS_QUATERNION_FX refRot_fx; /* reference orientation */ IVAS_QUATERNION_FX trkRot_fx; /* tracked rotation */ Loading @@ -827,6 +827,7 @@ typedef struct IVAS_VECTOR3 Pos[MAX_PARAM_SPATIAL_SUBFRAMES]; #ifdef IVAS_FLOAT_FIXED Word32 crossfade_fx[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES]; ivas_orient_trk_state_t_fx *hOrientationTracker_fx; #endif float crossfade[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES]; ivas_orient_trk_state_t *hOrientationTracker; Loading Loading @@ -859,7 +860,9 @@ typedef struct ivas_binaural_head_track_struct int16_t shd_rot_max_order; ivas_orient_trk_state_t *OrientationTracker; #ifdef IVAS_FLOAT_FIXED ivas_orient_trk_state_t_fx *OrientationTracker_fx; #endif } HEAD_TRACK_DATA, *HEAD_TRACK_DATA_HANDLE; Loading @@ -874,6 +877,9 @@ typedef struct ivas_external_orientation_struct int8_t enableRotationInterpolation[MAX_PARAM_SPATIAL_SUBFRAMES]; /* 0 - disable, 1 - enable */ int16_t numFramesToTargetOrientation[MAX_PARAM_SPATIAL_SUBFRAMES]; /* Number of frames until target orientation is reached */ IVAS_QUATERNION Quaternions[MAX_PARAM_SPATIAL_SUBFRAMES]; /* External orientation in quaternions */ #ifdef IVAS_FLOAT_FIXED IVAS_QUATERNION_FX Quaternions_fx[MAX_PARAM_SPATIAL_SUBFRAMES]; /* External orientation in quaternions */ #endif int16_t num_subframes; } EXTERNAL_ORIENTATION_DATA, *EXTERNAL_ORIENTATION_HANDLE; Loading Loading
lib_dec/ivas_init_dec.c +10 −1 Original line number Diff line number Diff line Loading @@ -758,12 +758,21 @@ ivas_error ivas_init_decoder_front( { return error; } #ifdef IVAS_FLOAT_FIXED error = ivas_orient_trk_SetTrackingType_fx( st_ivas->hHeadTrackData->OrientationTracker_fx, st_ivas->hDecoderConfig->orientation_tracking ); st_ivas->hHeadTrackData->OrientationTracker->orientation_tracking = st_ivas->hHeadTrackData->OrientationTracker_fx->orientation_tracking_fx; IF( ( error ) != IVAS_ERR_OK ) { return error; } } #else IF ( ( error = ivas_orient_trk_SetTrackingType( st_ivas->hHeadTrackData->OrientationTracker, st_ivas->hDecoderConfig->orientation_tracking ) ) != IVAS_ERR_OK ) { return error; } } #endif /*-------------------------------------------------------------------* * Allocate and initialize external orientation handle *--------------------------------------------------------------------*/ Loading
lib_rend/ivas_orient_trk.c +75 −0 Original line number Diff line number Diff line Loading @@ -72,6 +72,19 @@ static IVAS_QUATERNION IdentityQuaternion( return q; } #ifdef IVAS_FLOAT_FIXED static IVAS_QUATERNION_FX IdentityQuaternion_fx( void ) { IVAS_QUATERNION_FX q; q.w_fx = ONE_IN_Q31; q.x_fx = q.y_fx = q.z_fx = 0; q.w_qfact = q.x_qfact = q.y_qfact = q.z_qfact = Q31; return q; } #endif /*------------------------------------------------------------------------------------------* * QuaternionProduct() Loading Loading @@ -796,6 +809,23 @@ ivas_error ivas_orient_trk_SetTrackingType( return IVAS_ERR_OK; } #ifdef IVAS_FLOAT_FIXED ivas_error ivas_orient_trk_SetTrackingType_fx( ivas_orient_trk_state_t_fx *pOTR, /* i/o: orientation tracker handle */ const IVAS_HEAD_ORIENT_TRK_T orientation_tracking /* i : orientation tracking type */ ) { if ( pOTR == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; } pOTR->orientation_tracking_fx = orientation_tracking; return IVAS_ERR_OK; } #endif /*-------------------------------------------------------------------* * ivas_orient_trk_SetReferenceRotation() * Loading Loading @@ -860,6 +890,35 @@ ivas_error ivas_orient_trk_GetMainOrientation( return IVAS_ERR_OK; } #ifdef IVAS_FLOAT_FIXED ivas_error ivas_orient_trk_GetMainOrientation_fx( ivas_orient_trk_state_t_fx *pOTR, /* i/o: orientation tracker handle */ IVAS_QUATERNION_FX *pOrientation /* i/o: average/reference orientation */ ) { if ( pOTR == NULL || pOrientation == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; } switch ( pOTR->orientation_tracking_fx ) { case IVAS_HEAD_ORIENT_TRK_NONE: *pOrientation = IdentityQuaternion_fx(); break; case IVAS_HEAD_ORIENT_TRK_REF_VEC: case IVAS_HEAD_ORIENT_TRK_REF_VEC_LEV: case IVAS_HEAD_ORIENT_TRK_REF: *pOrientation = pOTR->refRot_fx; break; case IVAS_HEAD_ORIENT_TRK_AVG: *pOrientation = pOTR->absAvgRot_fx; break; } return IVAS_ERR_OK; } #endif /*-------------------------------------------------------------------* * ivas_orient_trk_GetTrackedRotation() Loading @@ -882,6 +941,22 @@ ivas_error ivas_orient_trk_GetTrackedRotation( return IVAS_ERR_OK; } #ifdef IVAS_FLOAT_FIXED ivas_error ivas_orient_trk_GetTrackedRotation_fx( ivas_orient_trk_state_t_fx *pOTR, /* i/o: orientation tracker handle */ IVAS_QUATERNION_FX *pRotation /* i/o: processed rotation */ ) { if (pOTR == NULL || pRotation == NULL) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; } *pRotation = pOTR->trkRot_fx; return IVAS_ERR_OK; } #endif /*-------------------------------------------------------------------* * ivas_orient_trk_SetReferenceVector() Loading
lib_rend/ivas_prot_rend.h +17 −0 Original line number Diff line number Diff line Loading @@ -1787,6 +1787,23 @@ ivas_error ivas_orient_trk_Process( IVAS_QUATERNION *pTrkRot /* o : tracked rotation */ ); #ifdef IVAS_FLOAT_FIXED ivas_error ivas_orient_trk_SetTrackingType_fx( ivas_orient_trk_state_t_fx *pOTR, /* i/o: orientation tracker handle */ const IVAS_HEAD_ORIENT_TRK_T orientation_tracking /* i : orientation tracking type */ ); ivas_error ivas_orient_trk_GetMainOrientation_fx( ivas_orient_trk_state_t_fx *pOTR, /* i/o: orientation tracker handle */ IVAS_QUATERNION_FX *pOrientation /* i/o: average/reference orientation */ ); ivas_error ivas_orient_trk_GetTrackedRotation_fx( ivas_orient_trk_state_t_fx *pOTR, /* i/o: orientation tracker handle */ IVAS_QUATERNION_FX *pRotation /* i/o: processed rotation */ ); #endif /*----------------------------------------------------------------------------------* * Rendering & merging to MASA format Loading
lib_rend/ivas_rotation.c +15 −0 Original line number Diff line number Diff line Loading @@ -131,6 +131,13 @@ ivas_error ivas_headTrack_open( return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Orientation tracking" ); } #ifdef IVAS_FLOAT_FIXED if (((*hHeadTrackData)->OrientationTracker_fx = (ivas_orient_trk_state_t_fx *)malloc(sizeof(ivas_orient_trk_state_t_fx))) == NULL) { return IVAS_ERROR(IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Orientation tracking"); } #endif if ( ( error = ivas_orient_trk_Init( ( *hHeadTrackData )->OrientationTracker ) ) != IVAS_ERR_OK ) { return error; Loading Loading @@ -174,6 +181,14 @@ void ivas_headTrack_close( ( *hHeadTrackData )->OrientationTracker = NULL; } #ifdef IVAS_FLOAT_FIXED if ((*hHeadTrackData)->OrientationTracker_fx != NULL) { free((*hHeadTrackData)->OrientationTracker_fx); (*hHeadTrackData)->OrientationTracker_fx = NULL; } #endif free( ( *hHeadTrackData ) ); *hHeadTrackData = NULL; Loading
lib_rend/ivas_stat_rend.h +11 −5 Original line number Diff line number Diff line Loading @@ -803,11 +803,11 @@ typedef struct ivas_orient_trk_state_t typedef struct ivas_orient_trk_state_t_fx { IVAS_HEAD_ORIENT_TRK_T orientation_tracking_fx; Word16 centerAdaptationRate_fx; Word16 offCenterAdaptationRate_fx; Word16 adaptationAngle_fx; Word32 centerAdaptationRate_fx; Word32 offCenterAdaptationRate_fx; Word32 adaptationAngle_fx; Word16 alpha_fx; Word32 alpha_fx; IVAS_QUATERNION_FX absAvgRot_fx; /* average absolute orientation */ IVAS_QUATERNION_FX refRot_fx; /* reference orientation */ IVAS_QUATERNION_FX trkRot_fx; /* tracked rotation */ Loading @@ -827,6 +827,7 @@ typedef struct IVAS_VECTOR3 Pos[MAX_PARAM_SPATIAL_SUBFRAMES]; #ifdef IVAS_FLOAT_FIXED Word32 crossfade_fx[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES]; ivas_orient_trk_state_t_fx *hOrientationTracker_fx; #endif float crossfade[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES]; ivas_orient_trk_state_t *hOrientationTracker; Loading Loading @@ -859,7 +860,9 @@ typedef struct ivas_binaural_head_track_struct int16_t shd_rot_max_order; ivas_orient_trk_state_t *OrientationTracker; #ifdef IVAS_FLOAT_FIXED ivas_orient_trk_state_t_fx *OrientationTracker_fx; #endif } HEAD_TRACK_DATA, *HEAD_TRACK_DATA_HANDLE; Loading @@ -874,6 +877,9 @@ typedef struct ivas_external_orientation_struct int8_t enableRotationInterpolation[MAX_PARAM_SPATIAL_SUBFRAMES]; /* 0 - disable, 1 - enable */ int16_t numFramesToTargetOrientation[MAX_PARAM_SPATIAL_SUBFRAMES]; /* Number of frames until target orientation is reached */ IVAS_QUATERNION Quaternions[MAX_PARAM_SPATIAL_SUBFRAMES]; /* External orientation in quaternions */ #ifdef IVAS_FLOAT_FIXED IVAS_QUATERNION_FX Quaternions_fx[MAX_PARAM_SPATIAL_SUBFRAMES]; /* External orientation in quaternions */ #endif int16_t num_subframes; } EXTERNAL_ORIENTATION_DATA, *EXTERNAL_ORIENTATION_HANDLE; Loading