Commit 2aa01294 authored by fotopoulou's avatar fotopoulou
Browse files

Merge branch '2084-fix-fp-leftovers-IVAS_ENC_FeedObjectMetadata' into 'main'

[non-BE][Split Non-Be][Renderer Non-Be]Resolve: "Floating-point leftovers: lib_enc/lib_enc_fx.c, IVAS_ENC_FeedObjectMetadata()"

Closes #2084

See merge request !2355
parents 93538ed4 8b712ab0
Loading
Loading
Loading
Loading
+53 −5
Original line number Diff line number Diff line
@@ -3108,6 +3108,13 @@ void getMetadataFromFileReader(
        fprintf( stderr, "\nError (%s) while reading ISM metadata from: %s\n\n", ivas_error_to_string( error ), IsmFileReader_getFilePath( ismReader ) );
        exit( -1 );
    }
#ifdef FIX_2084_FLOATING_POINT_LEFTOVERS
    objectMetadataBuffer->positions[objIdx].azimuth_fx = ismMetadata.azimuth_fx;
    objectMetadataBuffer->positions[objIdx].elevation_fx = ismMetadata.elevation_fx;
    objectMetadataBuffer->positions[objIdx].radius_fx = ismMetadata.radius_fx;
    objectMetadataBuffer->positions[objIdx].yaw_fx = ismMetadata.yaw_fx;
    objectMetadataBuffer->positions[objIdx].pitch_fx = ismMetadata.pitch_fx;
#else
    objectMetadataBuffer->positions[objIdx].azimuth_fx = (Word32) ( ismMetadata.azimuth * ( 1 << 22 ) );
    objectMetadataBuffer->positions[objIdx].elevation_fx = (Word32) ( ismMetadata.elevation * ( 1 << 22 ) );
    objectMetadataBuffer->positions[objIdx].radius_fx = (Word16) ( ismMetadata.radius * ( 1 << 9 ) );
@@ -3119,6 +3126,7 @@ void getMetadataFromFileReader(
    objectMetadataBuffer->positions[objIdx].radius = ismMetadata.radius;
    objectMetadataBuffer->positions[objIdx].yaw = ismMetadata.yaw;
    objectMetadataBuffer->positions[objIdx].pitch = ismMetadata.pitch;
#endif
    objectMetadataBuffer->positions[objIdx].non_diegetic_flag = ismMetadata.non_diegetic_flag;

    return;
@@ -3172,20 +3180,50 @@ static void IsmPositionProvider_getNextFrame(
        /* Otherwise fall back to default position */
        else
        {
#ifdef FIX_2084_FLOATING_POINT_LEFTOVERS
            objectMetadataBuffer->positions[objIdx].azimuth_fx = 0;
            objectMetadataBuffer->positions[objIdx].elevation_fx = 0;
            objectMetadataBuffer->positions[objIdx].radius_fx = 512; // 1.f in Q9
            objectMetadataBuffer->positions[objIdx].yaw_fx = 0;
            objectMetadataBuffer->positions[objIdx].pitch_fx = 0;
            objectMetadataBuffer->positions[objIdx].non_diegetic_flag = 0;
#else
            objectMetadataBuffer->positions[objIdx].azimuth = 0.0f;
            objectMetadataBuffer->positions[objIdx].elevation = 0.0f;
            objectMetadataBuffer->positions[objIdx].radius = 1.0f;
            objectMetadataBuffer->positions[objIdx].yaw = 0.0f;
            objectMetadataBuffer->positions[objIdx].pitch = 0.0f;
            objectMetadataBuffer->positions[objIdx].azimuth_fx = 0;
            objectMetadataBuffer->positions[objIdx].elevation_fx = 0;
            objectMetadataBuffer->positions[objIdx].radius_fx = 512;
            objectMetadataBuffer->positions[objIdx].yaw_fx = 0;
            objectMetadataBuffer->positions[objIdx].pitch_fx = 0;
            objectMetadataBuffer->positions[objIdx].non_diegetic_flag = 0;
#endif
        }

        /* Wrap azimuth to lie within (-180, 180] range */
#ifdef FIX_2084_FLOATING_POINT_LEFTOVERS
        while ( LT_32( objectMetadataBuffer->positions[objIdx].azimuth_fx, 0 ) )
        {
            objectMetadataBuffer->positions[objIdx].azimuth_fx = L_add( objectMetadataBuffer->positions[objIdx].azimuth_fx, DEG_360_IN_Q22 );
        }
        while ( GE_32( objectMetadataBuffer->positions[objIdx].azimuth_fx, DEG_360_IN_Q22 ) )
        {
            objectMetadataBuffer->positions[objIdx].azimuth_fx = L_sub( objectMetadataBuffer->positions[objIdx].azimuth_fx, DEG_360_IN_Q22 );
        }

        /* Clamp elevation to lie within [-90, 90] range (can't be wrapped easily) */
        objectMetadataBuffer->positions[objIdx].elevation_fx = L_min( L_max( objectMetadataBuffer->positions[objIdx].elevation_fx, -DEG_90_IN_Q22 ), DEG_90_IN_Q22 );

        /* Wrap yaw to lie within (-180, 180] range */
        while ( LT_32( objectMetadataBuffer->positions[objIdx].yaw_fx, 0 ) )
        {
            objectMetadataBuffer->positions[objIdx].yaw_fx = L_add( objectMetadataBuffer->positions[objIdx].yaw_fx, DEG_360_IN_Q22 );
        }
        while ( GE_32( objectMetadataBuffer->positions[objIdx].yaw_fx, DEG_360_IN_Q22 ) )
        {
            objectMetadataBuffer->positions[objIdx].yaw_fx = L_sub( objectMetadataBuffer->positions[objIdx].yaw_fx, DEG_360_IN_Q22 );
        }

        /* Clamp pitch to lie within [-90, 90] range (can't be wrapped easily) */
        objectMetadataBuffer->positions[objIdx].pitch_fx = L_min( L_max( objectMetadataBuffer->positions[objIdx].pitch_fx, -DEG_90_IN_Q22 ), DEG_90_IN_Q22 );
#else
        while ( objectMetadataBuffer->positions[objIdx].azimuth < 0.0f )
        {
            objectMetadataBuffer->positions[objIdx].azimuth += 360.0f;
@@ -3213,6 +3251,7 @@ static void IsmPositionProvider_getNextFrame(
        objectMetadataBuffer->positions[objIdx].pitch = min( max( objectMetadataBuffer->positions[objIdx].pitch, -90 ), 90 );
        objectMetadataBuffer->positions[objIdx].yaw_fx = (Word32) ( ( objectMetadataBuffer->positions[objIdx].yaw ) * ( 1 << Q22 ) );
        objectMetadataBuffer->positions[objIdx].pitch_fx = (Word32) ( ( objectMetadataBuffer->positions[objIdx].pitch ) * ( 1 << Q22 ) );
#endif
    }

    ++positionProvider->frameCounter;
@@ -3517,6 +3556,14 @@ static void parseObjectPosition(
        exit( -1 );
    }

#ifdef FIX_2084_FLOATING_POINT_LEFTOVERS
    position->azimuth_fx = (Word32) ( meta_prm[0] * ( 1 << Q22 ) );   /* Q22 */
    position->elevation_fx = (Word32) ( meta_prm[1] * ( 1 << Q22 ) ); /* Q22 */
    position->radius_fx = (Word16) ( meta_prm[2] * ( 1 << Q9 ) );     /* Q9 */
    position->yaw_fx = (Word32) ( meta_prm[5] * ( 1 << Q22 ) );       /* Q22 */
    position->pitch_fx = (Word32) ( meta_prm[6] * ( 1 << Q22 ) );     /* Q22 */
    position->non_diegetic_flag = (Word16) meta_prm[7];
#else
    position->azimuth = meta_prm[0];
    position->elevation = meta_prm[1];
    position->azimuth_fx = (Word32) ( meta_prm[0] * ( 1 << 22 ) );
@@ -3525,6 +3572,7 @@ static void parseObjectPosition(
    position->yaw = meta_prm[5];
    position->pitch = meta_prm[6];
    position->non_diegetic_flag = (int16_t) meta_prm[7];
#endif

    return;
}
+2 −0
Original line number Diff line number Diff line
@@ -133,6 +133,7 @@ typedef struct _IVAS_ISM_METADATA
    Word32 gainFactor_fx; /* Q29 */
    Word32 yaw_fx;        /* Q22 */
    Word32 pitch_fx;      /* Q22 */
#ifndef FIX_2084_FLOATING_POINT_LEFTOVERS
    float azimuth;
    float elevation;
    float radius;
@@ -140,6 +141,7 @@ typedef struct _IVAS_ISM_METADATA
    float gainFactor;
    float yaw;
    float pitch;
#endif
    Word16 non_diegetic_flag;
    Word32 gain_fx; /* Q29 */

+1 −1
Original line number Diff line number Diff line
@@ -77,7 +77,7 @@
#define FIX_1999_TEMPORARY_DISABLE_DIST_ATT_CHECK            /* Eri: Issue 1999: Range check on float values of distance attenuation, while the float values are not propagated to this function. The test is not correct, but configurable distance attenuation is not used in Characterization.*/
#define TEMP_FIX_2088_MSAN_INIT_ERROR                        /* Eri: Temporary fix for Issue 2088 - MSAN error. Will come with later port of JBM+Split rendering update */
#define FIX_2092_ASSERT_IN_OMASA_RENDER                      /* FhG, Nokia: Fix LTV crash due to overflow in OMASA EXT output */

#define FIX_2084_FLOATING_POINT_LEFTOVERS                    /* FhG: convert floating-point leftovers in IVAS_ENC_FeedObjectMetadata() */
/* ################### End FIXES switches ########################### */

/* #################### Start BASOP porting switches ############################ */
+4 −0
Original line number Diff line number Diff line
@@ -540,12 +540,16 @@ ivas_error IVAS_ENC_FeedObjectMetadata(
    {
        return IVAS_ERR_INVALID_INDEX;
    }
#ifdef FIX_2084_FLOATING_POINT_LEFTOVERS
    error = ivas_set_ism_metadata_fx( hIvasEnc->st_ivas->hIsmMetaData[ismIndex], metadata.azimuth_fx, metadata.elevation_fx, metadata.radius_fx, metadata.yaw_fx, metadata.pitch_fx, metadata.non_diegetic_flag );
#else
    Word32 azimuth_fx = float_to_fix( metadata.azimuth, Q22 );     /* Q22 */
    Word32 elevation_fx = float_to_fix( metadata.elevation, Q22 ); /* Q22 */
    Word16 radius_fx = float_to_fix16( metadata.radius, Q9 );      /* Q9 */
    Word32 yaw_fx = float_to_fix( metadata.yaw, Q22 );             /* Q22 */
    Word32 pitch_fx = float_to_fix( metadata.pitch, Q22 );         /* Q22 */
    error = ivas_set_ism_metadata_fx( hIvasEnc->st_ivas->hIsmMetaData[ismIndex], azimuth_fx, elevation_fx, radius_fx, yaw_fx, pitch_fx, metadata.non_diegetic_flag );
#endif

    IF( error != IVAS_ERR_OK )
    {
+32 −5
Original line number Diff line number Diff line
@@ -148,6 +148,7 @@ ivas_error IsmFileReader_readNextFrame(
        /* Invalid number of metadata parameters (2-7 supported) */
        return IVAS_ERR_ISM_FILE_READER_INVALID_METADATA_FORMAT;
    }
#ifndef FIX_2084_FLOATING_POINT_LEFTOVERS
    ismMetadata->azimuth = meta_prm[0];
    ismMetadata->elevation = meta_prm[1];
    ismMetadata->radius = meta_prm[2];
@@ -156,6 +157,9 @@ ivas_error IsmFileReader_readNextFrame(
    ismMetadata->yaw = meta_prm[5];
    ismMetadata->pitch = meta_prm[6];
    ismMetadata->non_diegetic_flag = (int16_t) meta_prm[7];
#else
    ismMetadata->non_diegetic_flag = (Word16) meta_prm[7];
#endif
    ismMetadata->azimuth_fx = floatToFixed( meta_prm[0], Q22 );
    ismMetadata->elevation_fx = floatToFixed( meta_prm[1], Q22 );
    ismMetadata->radius_fx = (Word16) floatToFixed( meta_prm[2], Q9 );
@@ -170,36 +174,59 @@ ivas_error IsmFileReader_readNextFrame(
        return IVAS_ERR_ISM_INVALID_METADATA_VALUE;
    }

#ifdef FIX_2084_FLOATING_POINT_LEFTOVERS
    if ( GT_32( ismMetadata->azimuth_fx, DEG_180_IN_Q22 ) || LT_32( ismMetadata->azimuth_fx, -DEG_180_IN_Q22 ) )
#else
    if ( ismMetadata->azimuth > 180 || ismMetadata->azimuth < -180 )
#endif
    {
        return IVAS_ERR_ISM_INVALID_METADATA_VALUE;
    }

#ifdef FIX_2084_FLOATING_POINT_LEFTOVERS
    if ( GT_32( ismMetadata->elevation_fx, DEG_90_IN_Q22 ) || LT_32( ismMetadata->elevation_fx, -DEG_90_IN_Q22 ) )
#else
    if ( ismMetadata->elevation > 90 || ismMetadata->elevation < -90 )
#endif
    {
        return IVAS_ERR_ISM_INVALID_METADATA_VALUE;
    }

#ifdef FIX_2084_FLOATING_POINT_LEFTOVERS
    if ( LT_32( ismMetadata->radius_fx, 0 ) ) /* Negative radius not supported. Max quantized radius = (2^ISM_RADIUS_NBITS-1)*0.25 = 15.75 */
#else
    if ( ismMetadata->radius < 0 ) /* Negative radius not supported. Max quantized radius = (2^ISM_RADIUS_NBITS-1)*0.25 = 15.75 */
#endif
    {
        return IVAS_ERR_ISM_INVALID_METADATA_VALUE;
    }

#ifdef FIX_2084_FLOATING_POINT_LEFTOVERS
    if ( GT_32( ismMetadata->spread_fx, DEG_360_IN_Q22 ) || LT_32( ismMetadata->spread_fx, 0 ) )
#else
    if ( ismMetadata->spread > 360 || ismMetadata->spread < 0 )
#endif
    {
        return IVAS_ERR_ISM_INVALID_METADATA_VALUE;
    }

#ifdef FIX_2084_FLOATING_POINT_LEFTOVERS
    if ( /*GT_32( ismMetadata->gainFactor_fx, ONE_IN_Q31 ) ||*/ LT_32( ismMetadata->gainFactor_fx, 0 ) )
#else
    if ( ismMetadata->gainFactor > 1 || ismMetadata->gainFactor < 0 )
#endif
    {
        return IVAS_ERR_ISM_INVALID_METADATA_VALUE;
    }
#ifdef FIX_2084_FLOATING_POINT_LEFTOVERS
    if ( GT_32( ismMetadata->yaw_fx, DEG_180_IN_Q22 ) || LT_32( ismMetadata->yaw_fx, -DEG_180_IN_Q22 ) )
#else
    if ( ismMetadata->yaw > 180 || ismMetadata->yaw < -180 )
#endif
    {
        return IVAS_ERR_ISM_INVALID_METADATA_VALUE;
    }

#ifdef FIX_2084_FLOATING_POINT_LEFTOVERS
    if ( GT_32( ismMetadata->pitch_fx, DEG_90_IN_Q22 ) || LT_32( ismMetadata->pitch_fx, -DEG_90_IN_Q22 ) )
#else
    if ( ismMetadata->pitch > 90 || ismMetadata->pitch < -90 )
#endif
    {
        return IVAS_ERR_ISM_INVALID_METADATA_VALUE;
    }
Loading