Commit 84348e6b authored by norvell's avatar norvell
Browse files

Added support of extended metadata and headtracking in external renderer

parent e8a2a3cb
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -1384,7 +1384,7 @@ static ivas_error decodeG192(
    uint16_t numObj = 0;
    IVAS_DEC_BS_FORMAT bsFormat = IVAS_DEC_BS_UNKOWN;
#ifdef TD5
    float Pos[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES][3] = { 0 }; /* Initialization needed for gcc */
    IVAS_POSITION Pos[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; 
#endif

    IsmFileWriter *ismWriters[IVAS_MAX_NUM_OBJECTS];
+71 −2
Original line number Diff line number Diff line
@@ -517,6 +517,9 @@ int main(
    int32_t delayTimeScale = 0;
    int16_t i, numChannels;
    ivas_error error = IVAS_ERR_OK;
#ifdef TD5
    IVAS_POSITION Pos[RENDERER_HEAD_POSITIONS_PER_FRAME];
#endif

#ifdef WMOPS
    reset_wmops();
@@ -645,19 +648,31 @@ int main(
    }

    /* === Configure === */
#ifdef TD5
    if ( ( error = IVAS_REND_InitConfig( hIvasRend, ( args.outConfig.audioConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) || ( args.outConfig.audioConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL ) ) ) != IVAS_ERR_OK )
#else
    if ( ( error = IVAS_REND_InitConfig( hIvasRend, strlen( args.renderConfigFilePath ) != 0 ) ) != IVAS_ERR_OK )
    {
        exit( -1 );
    }
#endif

    if ( args.renderConfigFilePath[0] != '\0' )
    {
        IVAS_RENDER_CONFIG_DATA renderConfig;

        /* sanity check */
#ifdef TD5
        if ( ( args.outConfig.audioConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) && ( args.outConfig.audioConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL ) )
#else
        if ( args.outConfig.audioConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM )
#endif
        {
#ifdef TD5
            fprintf( stderr, "\nExternal Renderer Config is supported only when BINAURAL or BINAURAL_ROOM is used as output. Exiting. \n" );
#else
            fprintf( stderr, "\nExternal Renderer Config is supported only when BINAURAL_ROOM is used as output. Exiting. \n" );
#endif
            exit( -1 );
        }

@@ -889,16 +904,20 @@ int main(
        {
            IVAS_QUATERNION quatBuffer[RENDERER_HEAD_POSITIONS_PER_FRAME];
#ifdef TD5
            float Pos[RENDERER_HEAD_POSITIONS_PER_FRAME][3];
            HeadRotationFileReading( headRotReader, quatBuffer, Pos );
            IVAS_REND_SetHeadRotation( hIvasRend, quatBuffer, Pos );
#else
            HeadRotationFileReading( headRotReader, quatBuffer, frame );
#endif
            IVAS_REND_SetHeadRotation( hIvasRend, quatBuffer );
#endif
        }
        else
        {
#ifdef TD5
            IVAS_REND_SetHeadRotation( hIvasRend, NULL, NULL );
#else
            IVAS_REND_SetHeadRotation( hIvasRend, NULL );
#endif
        }

        for ( i = 0; i < args.inConfig.numMultiChannelBuses; ++i )
@@ -1720,6 +1739,11 @@ void getMetadataFromFileReader(

    objectMetadataBuffer->positions[objIdx].azimuth = ismMetadata.azimuth;
    objectMetadataBuffer->positions[objIdx].elevation = ismMetadata.elevation;
#ifdef TD5
    objectMetadataBuffer->positions[objIdx].radius = ismMetadata.radius;
    objectMetadataBuffer->positions[objIdx].yaw = ismMetadata.yaw;
    objectMetadataBuffer->positions[objIdx].pitch = ismMetadata.pitch;
#endif

    return;
}
@@ -1774,6 +1798,11 @@ static void IsmPositionProvider_getNextFrame(
        {
            objectMetadataBuffer->positions[objIdx].azimuth = 0.0f;
            objectMetadataBuffer->positions[objIdx].elevation = 0.0f;
#ifdef TD5
            objectMetadataBuffer->positions[objIdx].radius = 1.0f;
            objectMetadataBuffer->positions[objIdx].yaw = 0.0f;
            objectMetadataBuffer->positions[objIdx].pitch = 0.0f;
#endif
        }

        /* Wrap azimuth to lie within (-180, 180] range */
@@ -1788,6 +1817,20 @@ static void IsmPositionProvider_getNextFrame(

        /* Clamp elevation to lie within [-90, 90] range (can't be wrapped easily) */
        objectMetadataBuffer->positions[objIdx].elevation = min( max( objectMetadataBuffer->positions[objIdx].elevation, -90 ), 90 );
#ifdef TD5
        /* Wrap yaw to lie within (-180, 180] range */
        while ( objectMetadataBuffer->positions[objIdx].yaw < 0.0f )
        {
            objectMetadataBuffer->positions[objIdx].yaw += 360.0f;
        }
        while ( objectMetadataBuffer->positions[objIdx].yaw >= 360.0f )
        {
            objectMetadataBuffer->positions[objIdx].yaw -= 360.0f;
        }

        /* Clamp pitch to lie within [-90, 90] range (can't be wrapped easily) */
        objectMetadataBuffer->positions[objIdx].pitch = min( max( objectMetadataBuffer->positions[objIdx].pitch, -90 ), 90 );
#endif
    }

    ++positionProvider->frameCounter;
@@ -2049,6 +2092,32 @@ static void parseObjectPosition(
        exit( -1 );
    }

#ifdef TD5
    readNextMetadataChunk( line, "," );
    position->radius = strtof( line, &endptr );

    if ( *endptr != '\0' )
    {
        fprintf( stderr, "Error reading metadata\n" );
        exit( -1 );
    }

    readNextMetadataChunk( line, "\n" );
    position->yaw = strtof( line, &endptr );
    if ( *endptr != '\0' )
    {
        fprintf( stderr, "Error reading metadata\n" );
        exit( -1 );
    }

    readNextMetadataChunk( line, "\n" );
    position->pitch = strtof( line, &endptr );
    if ( *endptr != '\0' )
    {
        fprintf( stderr, "Error reading metadata\n" );
        exit( -1 );
    }
#endif
    return;
}

+5 −0
Original line number Diff line number Diff line
@@ -123,6 +123,11 @@ typedef struct
{
    float azimuth;
    float elevation;
#ifdef TD5
    float radius;
    float yaw;
    float pitch;
#endif
} IVAS_REND_AudioObjectPosition;

typedef struct _IVAS_ROOM_ACOUSTICS_CONFIG
+4 −4
Original line number Diff line number Diff line
@@ -915,7 +915,7 @@ ivas_error IVAS_DEC_FeedHeadTrackData(
    IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle  */
#ifdef TD5
    IVAS_QUATERNION *orientation, /* i  : head-tracking data, listener orientation   */
    float Pos[4][3]               /* i  : listener position    */
    IVAS_POSITION *Pos            /* i  : listener position    */
#else
    IVAS_QUATERNION *orientation /* i  : head-tracking data, listener orientation   */
#endif
@@ -944,9 +944,9 @@ ivas_error IVAS_DEC_FeedHeadTrackData(
        hHeadTrackData->Quaternions[i].y = orientation[i].y;
        hHeadTrackData->Quaternions[i].z = orientation[i].z;
#ifdef TD5
        hHeadTrackData->Pos[i].x = Pos[i][0];
        hHeadTrackData->Pos[i].y = Pos[i][1];
        hHeadTrackData->Pos[i].z = Pos[i][2];
        hHeadTrackData->Pos[i].x = Pos[i].x;
        hHeadTrackData->Pos[i].y = Pos[i].y;
        hHeadTrackData->Pos[i].z = Pos[i].z;
#endif
    }

+1 −1
Original line number Diff line number Diff line
@@ -187,7 +187,7 @@ ivas_error IVAS_DEC_FeedHeadTrackData(
    IVAS_DEC_HANDLE hIvasDec,                   /* i/o: IVAS decoder handle                                                     */
#ifdef TD5 
    IVAS_QUATERNION *orientation,               /* i  : head-tracking data                                                      */
    float Pos[4][3]                             /* i  : listener position                                                       */
    IVAS_POSITION *Pos                          /* i  : listener position                                                       */
#else
    IVAS_QUATERNION *orientation                /* i  : head-tracking data                                                      */
#endif
Loading