diff --git a/apps/renderer.c b/apps/renderer.c index adf664f97d7fe88cbfcf087f98d6106becc71ff2..9bbd6bb841080087e65c4db6f88d992c68b16b03 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -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; } diff --git a/lib_com/common_api_types.h b/lib_com/common_api_types.h index de6c2a29ed9a8a7c1b66e2496f3207d8cdcd7d9b..677a5f39e9418556d9ad80d6a670d57de3f7b379 100644 --- a/lib_com/common_api_types.h +++ b/lib_com/common_api_types.h @@ -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; #ifdef OBJ_EDITING_API Word32 gain_fx; diff --git a/lib_com/options.h b/lib_com/options.h index af5127066c1d70df5811d25795c3052901c2ba9e..155d95303cf66302af9f5a7f2d12f92afdf2c274 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -114,7 +114,9 @@ #define FIX_2021_BANDWIDTH_EXTENSION_PROBLEM /* FhG: increase cldfb buffer precision*/ #define FIX_2083_FLOATING_POINT_LEFTOVERS /* FhG: convert floating-point leftovers in makeCustomLsSetup()*/ +#define FIX_2084_FLOATING_POINT_LEFTOVERS /* FhG: convert floating-point leftovers in IVAS_ENC_FeedObjectMetadata() */ #define FIX_2085_FLOATING_POINT_LEFTOVERS /* FhG: convert floating-point leftovers in ivas_dirac_config_fx() */ + /* #################### 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 */ diff --git a/lib_enc/lib_enc_fx.c b/lib_enc/lib_enc_fx.c index 295608d6fb902cc09274d92c175fc9668df4ddf9..a242ad6792288918e0eafa5c736b8a3a863b1f55 100644 --- a/lib_enc/lib_enc_fx.c +++ b/lib_enc/lib_enc_fx.c @@ -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 ) { diff --git a/lib_util/ism_file_reader.c b/lib_util/ism_file_reader.c index f3d782aeb7484e7c38b80c103fba546c8f57e216..72b9ba061d5c3bc2f72b42d64f85917ec6eaa8d0 100644 --- a/lib_util/ism_file_reader.c +++ b/lib_util/ism_file_reader.c @@ -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; } diff --git a/lib_util/ism_file_writer.c b/lib_util/ism_file_writer.c index 94bab6dd279ae62eed74ef6a52dd6df614dcb667..91133ae53f5657e581aa4610e61f160fa4a13d62 100644 --- a/lib_util/ism_file_writer.c +++ b/lib_util/ism_file_writer.c @@ -113,7 +113,17 @@ ivas_error IsmFileWriter_writeFrame( } file = ismWriter->file; - +#ifdef FIX_2084_FLOATING_POINT_LEFTOVERS + float azimuth = fixedToFloat( ismMetadata.azimuth_fx, Q22 ); + float elevation = fixedToFloat( ismMetadata.elevation_fx, Q22 ); + float radius = fix16_to_float( ismMetadata.radius_fx, Q9 ); + float spread = fixedToFloat( ismMetadata.spread_fx, Q22 ); + float gainFactor = fixedToFloat( ismMetadata.gainFactor_fx, Q31 ); + float yaw = fixedToFloat( ismMetadata.yaw_fx, Q22 ); + float pitch = fixedToFloat( ismMetadata.pitch_fx, Q22 ); + + snprintf( char_buff, sizeof( char_buff ), "%+07.2f,%+06.2f,%05.2f,%06.2f,%04.2f,%+07.2f,%+06.2f,%d\n", azimuth, elevation, radius, spread, gainFactor, yaw, pitch, ismMetadata.non_diegetic_flag ); +#else ismMetadata.azimuth = fixedToFloat( ismMetadata.azimuth_fx, Q22 ); ismMetadata.elevation = fixedToFloat( ismMetadata.elevation_fx, Q22 ); ismMetadata.radius = fix16_to_float( ismMetadata.radius_fx, Q9 ); @@ -123,6 +133,7 @@ ivas_error IsmFileWriter_writeFrame( ismMetadata.pitch = fixedToFloat( ismMetadata.pitch_fx, Q22 ); snprintf( char_buff, sizeof( char_buff ), "%+07.2f,%+06.2f,%05.2f,%06.2f,%04.2f,%+07.2f,%+06.2f,%d\n", ismMetadata.azimuth, ismMetadata.elevation, ismMetadata.radius, ismMetadata.spread, ismMetadata.gainFactor, ismMetadata.yaw, ismMetadata.pitch, ismMetadata.non_diegetic_flag ); +#endif if ( file ) { fputs( char_buff, file );