Commit 4a30f616 authored by Mohammadreza Naghibzadeh's avatar Mohammadreza Naghibzadeh
Browse files

remove floating-point leftovers from IVAS_ISM_METADATA

parent 0db3d064
Loading
Loading
Loading
Loading
Loading
+53 −6
Original line number Diff line number Diff line
@@ -3151,6 +3151,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 ) );
@@ -3162,6 +3169,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;
@@ -3215,20 +3223,49 @@ static void IsmPositionProvider_getNextFrame(
        /* Otherwise fall back to default position */
        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;
#ifdef FIX_2084_FLOATING_POINT_LEFTOVERS
            objectMetadataBuffer->positions[objIdx].azimuth_fx = 0;
            objectMetadataBuffer->positions[objIdx].elevation_fx = 0;
            objectMetadataBuffer->positions[objIdx].radius_fx = 512;
            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;
#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;
@@ -3256,6 +3293,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;
@@ -3560,6 +3598,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 ) );
@@ -3568,6 +3614,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
@@ -129,6 +129,7 @@ typedef struct _IVAS_ISM_METADATA
    Word32 gainFactor_fx; /* Q31 */
    Word32 yaw_fx;        /* Q22 */
    Word32 pitch_fx;      /* Q22 */
#ifndef FIX_2084_FLOATING_POINT_LEFTOVERS
    float azimuth;
    float elevation;
    float radius;
@@ -136,6 +137,7 @@ typedef struct _IVAS_ISM_METADATA
    float gainFactor;
    float yaw;
    float pitch;
#endif
    Word16 non_diegetic_flag;

} IVAS_ISM_METADATA;
+1 −0
Original line number Diff line number Diff line
@@ -112,6 +112,7 @@
#define FIX_2602_NONBE_SAT_IN_SWB_TBE_SCALE                  /* Dolby/FhG: fix for issue 2026: Saturation in SWB TBE re-scaling function preventing StereoDownmix complexity job to complete */
#define FIX_2021_BANDWIDTH_EXTENSION_PROBLEM                 /* FhG: increase cldfb buffer precision*/

#define FIX_2084_FLOATING_POINT_LEFTOVERS                    /* FhG: convert floating-point leftovers in IVAS_ENC_FeedObjectMetadata()*/
/* #################### Start BASOP porting switches ############################ */

#define NONBE_1244_FIX_SWB_BWE_MEMORY                   /* VA: issue 1244: fix to SWB BWE memory in case of switching from FB coding - pending a review by Huawei */
+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 )
    {
+30 −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];
@@ -155,6 +156,7 @@ ivas_error IsmFileReader_readNextFrame(
    ismMetadata->gainFactor = meta_prm[4];
    ismMetadata->yaw = meta_prm[5];
    ismMetadata->pitch = meta_prm[6];
#endif
    ismMetadata->non_diegetic_flag = (int16_t) meta_prm[7];
    ismMetadata->azimuth_fx = floatToFixed( meta_prm[0], Q22 );
    ismMetadata->elevation_fx = floatToFixed( meta_prm[1], Q22 );
@@ -170,36 +172,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