Commit 938ebc11 authored by Marek Szczerba's avatar Marek Szczerba
Browse files

Added application interface for reference orientation for orientation tracker

parent 3d97b259
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -1359,11 +1359,22 @@ static ivas_error decodeG192(
        {
            IVAS_QUATERNION Quaternions[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES];

#ifdef FIX_I109_ORIENTATION_TRACKING
            for ( i = 0; i < IVAS_MAX_PARAM_SPATIAL_SUBFRAMES; i++ )
            {
                if ( ( error = HeadRotationFileReading( headRotReader, &Quaternions[i] ) ) != IVAS_ERR_OK )
                {
                    fprintf( stderr, "\nError %s while reading head orientation from %s\n", IVAS_DEC_GetErrorMessage( error ), HeadRotationFileReader_getFilePath( headRotReader ) );
                    goto cleanup;
                }
            }
#else
            if ( ( error = HeadRotationFileReading( headRotReader, Quaternions, frame ) ) != IVAS_ERR_OK )
            {
                fprintf( stderr, "\nError %s while reading head orientation from %s\n", IVAS_DEC_GetErrorMessage( error ), HeadRotationFileReader_getFilePath( headRotReader ) );
                goto cleanup;
            }
#endif

            if ( ( error = IVAS_DEC_FeedHeadTrackData( hIvasDec, Quaternions ) ) != IVAS_ERR_OK )
            {
+56 −0
Original line number Diff line number Diff line
@@ -124,6 +124,9 @@ typedef struct
    char inMetadataFilePaths[RENDERER_MAX_ISM_INPUTS][RENDERER_MAX_CLI_ARG_LENGTH];
    int16_t numInMetadataFiles;
    char headRotationFilePath[RENDERER_MAX_CLI_ARG_LENGTH];
#ifdef FIX_I109_ORIENTATION_TRACKING
    char referenceRotationFilePath[RENDERER_MAX_CLI_ARG_LENGTH];
#endif
    char customHrtfFilePath[RENDERER_MAX_CLI_ARG_LENGTH];
    char renderConfigFilePath[RENDERER_MAX_CLI_ARG_LENGTH];
    int8_t orientationTracking;
@@ -142,6 +145,9 @@ typedef enum
    CmdLnOptionId_outputFormat,
    CmdLnOptionId_sampleRate,
    CmdLnOptionId_trajFile,
#ifdef FIX_I109_ORIENTATION_TRACKING
    CmdLnOptionId_refRotFile,
#endif
    CmdLnOptionId_customHrtfFile,
    CmdLnOptionId_renderConfigFile,
    CmdLnOptionId_noDiegeticPan,
@@ -197,6 +203,14 @@ static const CmdLnParser_Option cliOptions[] = {
        .matchShort = "tf",
        .description = "Head rotation trajectory file for simulation of head tracking (only for BINAURAL and BINAURAL_ROOM outputs)",
    },
#ifdef FIX_I109_ORIENTATION_TRACKING
    {
        .id = CmdLnOptionId_refRotFile,
        .match = "reference_rotation_file",
        .matchShort = "rf",
        .description = "Reference rotation trajectory file for simulation of head tracking (only for BINAURAL and BINAURAL_ROOM outputs)",
    },
#endif
    {
        .id = CmdLnOptionId_customHrtfFile,
        .match = "custom_hrtf",
@@ -508,6 +522,9 @@ int main(
{
    IVAS_REND_HANDLE hIvasRend;
    HeadRotFileReader *headRotReader = NULL;
#ifdef FIX_I109_ORIENTATION_TRACKING
    HeadRotFileReader *referenceRotReader = NULL;
#endif
    hrtfFileReader *hrtfFileReader = NULL;
    IsmPositionProvider *positionProvider;
    RenderConfigReader *renderConfigReader = NULL;
@@ -550,12 +567,22 @@ int main(
    convert_backslash( args.inputFilePath );
    convert_backslash( args.outputFilePath );
    convert_backslash( args.headRotationFilePath );
#ifdef FIX_I109_ORIENTATION_TRACKING
    convert_backslash( args.referenceRotationFilePath );
#endif

    if ( !isEmptyString( args.headRotationFilePath ) )
    {
        HeadRotationFileReader_open( args.headRotationFilePath, &headRotReader );
    }

#ifdef FIX_I109_ORIENTATION_TRACKING
    if ( !isEmptyString( args.referenceRotationFilePath ) )
    {
        HeadRotationFileReader_open( args.referenceRotationFilePath, &referenceRotReader );
    }
#endif

    if ( !isEmptyString( args.customHrtfFilePath ) )
    {
        hrtfFileReader_open( args.customHrtfFilePath, &hrtfFileReader );
@@ -840,7 +867,14 @@ int main(
        if ( headRotReader != NULL )
        {
            IVAS_QUATERNION quatBuffer[RENDERER_HEAD_POSITIONS_PER_FRAME];
#ifdef FIX_I109_ORIENTATION_TRACKING
            for ( i = 0; i < RENDERER_HEAD_POSITIONS_PER_FRAME; i++ )
            {
                HeadRotationFileReading( headRotReader, &quatBuffer[i] );
            }
#else
            HeadRotationFileReading( headRotReader, quatBuffer, frame );
#endif
            IVAS_REND_SetHeadRotation( hIvasRend, quatBuffer );
        }
        else
@@ -848,6 +882,16 @@ int main(
            IVAS_REND_SetHeadRotation( hIvasRend, NULL );
        }

#ifdef FIX_I109_ORIENTATION_TRACKING
        /* Read from reference rotation trajectory file if specified */
        if ( referenceRotReader != NULL )
        {
            IVAS_QUATERNION quaternion;
            HeadRotationFileReading( referenceRotReader, &quaternion );
            IVAS_REND_SetReferenceRotation( hIvasRend, quaternion );
        }
#endif

        for ( i = 0; i < args.inConfig.numMultiChannelBuses; ++i )
        {
            if ( ( error = IVAS_REND_GetInputNumChannels( hIvasRend, mcIds[i], &numChannels ) ) != IVAS_ERR_OK )
@@ -1019,6 +1063,9 @@ int main(
    AudioFileReader_close( &audioReader );
    AudioFileWriter_close( &audioWriter );
    HeadRotationFileReader_close( &headRotReader );
#ifdef FIX_I109_ORIENTATION_TRACKING
    HeadRotationFileReader_close( &referenceRotReader );
#endif
    hrtfFileReader_close( &hrtfFileReader );
    IVAS_REND_Close( &hIvasRend );
    IsmPositionProvider_close( positionProvider );
@@ -1414,6 +1461,9 @@ static CmdlnArgs defaultArgs(
    args.numInMetadataFiles = 0;

    clearString( args.headRotationFilePath );
#ifdef FIX_I109_ORIENTATION_TRACKING
    clearString( args.referenceRotationFilePath );
#endif
    clearString( args.customHrtfFilePath );
    clearString( args.renderConfigFilePath );

@@ -1489,6 +1539,12 @@ static void parseOption(
            assert( numOptionValues == 1 );
            strncpy( args->headRotationFilePath, optionValues[0], RENDERER_MAX_CLI_ARG_LENGTH - 1 );
            break;
#ifdef FIX_I109_ORIENTATION_TRACKING
        case CmdLnOptionId_refRotFile:
            assert( numOptionValues == 1 );
            strncpy( args->referenceRotationFilePath, optionValues[0], RENDERER_MAX_CLI_ARG_LENGTH - 1 );
            break;
#endif
        case CmdLnOptionId_customHrtfFile:
            assert( numOptionValues == 1 );
            strncpy( args->customHrtfFilePath, optionValues[0], RENDERER_MAX_CLI_ARG_LENGTH - 1 );
+2 −0
Original line number Diff line number Diff line
@@ -3828,7 +3828,9 @@ static ivas_error renderIsmToBinauralRoom(
    int16_t tmp;
    rotation_matrix Rmat;
    float tmpCrendBuffer[MAX_OUTPUT_CHANNELS][L_FRAME48k];
#ifndef FIX_I109_ORIENTATION_TRACKING
    IVAS_QUATERNION quat;
#endif
    ivas_error error;
    pan_vector currentPanGains;
    pan_vector previousPanGains;
+31 −1
Original line number Diff line number Diff line
@@ -92,6 +92,36 @@ ivas_error HeadRotationFileReader_open(
 * Read values from the trajectory file
 *-----------------------------------------------------------------------*/

#ifdef FIX_I109_ORIENTATION_TRACKING
ivas_error HeadRotationFileReading(
    HeadRotFileReader *headRotReader, /* i/o: HeadRotFileReader handle       */
    IVAS_QUATERNION *pQuaternion      /* o  : head-tracking data             */
)
{
    float w, x, y, z;

    if ( 4 != fscanf( headRotReader->trajFile, "%f,%f,%f,%f", &w, &x, &y, &z ) )
    {
        if ( feof( headRotReader->trajFile ) )
        {
            rewind( headRotReader->trajFile );
            headRotReader->fileRewind = true;
            return HeadRotationFileReading( headRotReader, pQuaternion );
        }
        return IVAS_ERR_FAILED_FILE_PARSE;
    }

    ( headRotReader->frameCounter )++;

    pQuaternion->w = w;
    pQuaternion->x = x;
    pQuaternion->y = y;
    pQuaternion->z = z;

    return IVAS_ERR_OK;
}

#else
ivas_error HeadRotationFileReading(
    HeadRotFileReader *headRotReader, /* i/o: HeadRotFileReader handle       */
    IVAS_QUATERNION *Quaternions,     /* o  : head-tracking data             */
@@ -125,7 +155,7 @@ ivas_error HeadRotationFileReading(

    return IVAS_ERR_OK;
}

#endif

/*-----------------------------------------------------------------------*
 * HeadRotationFileReader_close()
+7 −0
Original line number Diff line number Diff line
@@ -58,11 +58,18 @@ ivas_error HeadRotationFileReader_open(
 * Read values from the trajectory file
 *-----------------------------------------------------------------------*/

#ifdef FIX_I109_ORIENTATION_TRACKING
ivas_error HeadRotationFileReading(
    HeadRotFileReader *headRotReader, /* i/o: HeadRotFileReader handle       */
    IVAS_QUATERNION *pQuaternion      /* o  : head-tracking data             */
);
#else
ivas_error HeadRotationFileReading(
    HeadRotFileReader *headRotReader, /* i/o: HeadRotFileReader handle       */
    IVAS_QUATERNION *Quaternions,     /* o  : head-tracking data             */
    const int32_t frame_dec           /* i  : decoded frame number           */
);
#endif

/*-----------------------------------------------------------------------*
 * HeadRotationFileReader_close()
Loading