From 4a30f61609572e526e3b60061e4138b961693348 Mon Sep 17 00:00:00 2001 From: naghibza Date: Thu, 9 Oct 2025 16:53:11 +0200 Subject: [PATCH 1/4] remove floating-point leftovers from IVAS_ISM_METADATA --- apps/renderer.c | 59 ++++++++++++++++++++++++++++++++++---- lib_com/common_api_types.h | 2 ++ lib_com/options.h | 1 + lib_enc/lib_enc_fx.c | 4 +++ lib_util/ism_file_reader.c | 35 ++++++++++++++++++---- lib_util/ism_file_writer.c | 13 ++++++++- 6 files changed, 102 insertions(+), 12 deletions(-) diff --git a/apps/renderer.c b/apps/renderer.c index 5eba07e53..562649300 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -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; } diff --git a/lib_com/common_api_types.h b/lib_com/common_api_types.h index 112d82607..3ff7f1a15 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; } IVAS_ISM_METADATA; diff --git a/lib_com/options.h b/lib_com/options.h index a7fdd482f..493d32573 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -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 */ diff --git a/lib_enc/lib_enc_fx.c b/lib_enc/lib_enc_fx.c index 295608d6f..a242ad679 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 f3d782aeb..b7ff0ee32 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]; @@ -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; } diff --git a/lib_util/ism_file_writer.c b/lib_util/ism_file_writer.c index 94bab6dd2..91133ae53 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 ); -- GitLab From 74befda637d13c71bde2c8a7b16d389734dd5e96 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Thu, 9 Oct 2025 20:39:29 +0200 Subject: [PATCH 2/4] add forgotten member to #else path --- apps/renderer.c | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/renderer.c b/apps/renderer.c index 562649300..083409d1c 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -3236,6 +3236,7 @@ static void IsmPositionProvider_getNextFrame( objectMetadataBuffer->positions[objIdx].radius = 1.0f; objectMetadataBuffer->positions[objIdx].yaw = 0.0f; objectMetadataBuffer->positions[objIdx].pitch = 0.0f; + objectMetadataBuffer->positions[objIdx].non_diegetic_flag = 0; #endif } -- GitLab From 3f52def79ad8fbe6635db81567e60ccd2e875ce6 Mon Sep 17 00:00:00 2001 From: naghibza Date: Wed, 15 Oct 2025 09:40:51 +0200 Subject: [PATCH 3/4] replaced int16_t with Word16 --- lib_util/ism_file_reader.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib_util/ism_file_reader.c b/lib_util/ism_file_reader.c index b7ff0ee32..72b9ba061 100644 --- a/lib_util/ism_file_reader.c +++ b/lib_util/ism_file_reader.c @@ -156,8 +156,10 @@ 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]; +#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 ); -- GitLab From 26e2d3ea6bb379286a5758893db7a741daf18127 Mon Sep 17 00:00:00 2001 From: naghibza Date: Wed, 15 Oct 2025 13:25:36 +0200 Subject: [PATCH 4/4] minor change to trigger a pipeline refresh. --- lib_com/options.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 41bec8a48..ba65d9ce3 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -113,7 +113,7 @@ #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_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 ############################ */ -- GitLab