From 2da336532dda3fdfdc4d2cf312bf3966a526dd9f Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Fri, 9 Jan 2026 11:55:54 +0200 Subject: [PATCH 1/2] Address float issue 1493 with minor changes to improve stability of decision over platforms and builds. --- lib_enc/ivas_masa_enc.c | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/lib_enc/ivas_masa_enc.c b/lib_enc/ivas_masa_enc.c index 0da38f8e2e..471c3ac528 100644 --- a/lib_enc/ivas_masa_enc.c +++ b/lib_enc/ivas_masa_enc.c @@ -83,6 +83,8 @@ static void masa_metadata_direction_alignment( MASA_ENCODER_HANDLE hMasa ); #define LOWBITRATE_ONSET_GAIN 1.4f #define LOWBITRATE_NUM_BANDS 5 +#define IMPORTANCE_MIN_STEP 0.000244140625f /* 2^-12 to match BASOP */ + /*-----------------------------------------------------------------------* * ivas_masa_enc_open() @@ -979,7 +981,7 @@ static void combine_freqbands_and_subframes( MASA_ENCODER_HANDLE hMasa ) { int16_t i, j, k, m; - float aziRad, eleRad; + volatile float aziRad, eleRad; /* Using volatile to reduce numerically unstable optimization */ float x[MASA_MAXIMUM_DIRECTIONS][MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; float y[MASA_MAXIMUM_DIRECTIONS][MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; float z[MASA_MAXIMUM_DIRECTIONS][MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; @@ -1065,8 +1067,9 @@ static void combine_freqbands_and_subframes( energySum += hMasa->data.energy[j][m]; } - aziRad = atan2f( ySum, xSum ); - eleRad = atan2f( zSum, sqrtf( xSum * xSum + ySum * ySum ) ); + /* Using atan2 instead of atan2f to reduce platform difference */ + aziRad = (float) atan2( ySum, xSum ); + eleRad = (float) atan2( zSum, sqrtf( xSum * xSum + ySum * ySum ) ); hMeta->directional_meta[i].azimuth[j][k] = aziRad / EVS_PI * 180.0f; hMeta->directional_meta[i].elevation[j][k] = eleRad / EVS_PI * 180.0f; @@ -1174,8 +1177,8 @@ void ivas_masa_combine_directions( uint8_t computeCoherence; MASA_METADATA_HANDLE hMeta; - float aziRad; - float eleRad; + volatile float aziRad; /* Using volatile to reduce numerically unstable optimization */ + volatile float eleRad; float x[MASA_MAXIMUM_DIRECTIONS][MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; float y[MASA_MAXIMUM_DIRECTIONS][MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; float z[MASA_MAXIMUM_DIRECTIONS][MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; @@ -1243,6 +1246,11 @@ void ivas_masa_combine_directions( } importance[i] /= (float) numSf; importance[i] *= hMasa->data.importanceWeight[i]; + /* Setting close to zero values to zero to reduce decision differences */ + if ( importance[i] < IMPORTANCE_MIN_STEP ) + { + importance[i] = 0.0f; + } } /* Determine bands where to use two directions */ @@ -1265,8 +1273,9 @@ void ivas_masa_combine_directions( { for ( j = 0; j < numSf; j++ ) { - aziRad = atan2f( ySum[j][i], xSum[j][i] ); - eleRad = atan2f( zSum[j][i], sqrtf( xSum[j][i] * xSum[j][i] + ySum[j][i] * ySum[j][i] ) ); + /* Using atan2 instead of atan2f to reduce platform difference */ + aziRad = (float) atan2( ySum[j][i], xSum[j][i] ); + eleRad = (float) atan2( zSum[j][i], sqrtf( xSum[j][i] * xSum[j][i] + ySum[j][i] * ySum[j][i] ) ); hMeta->directional_meta[0].azimuth[j][i] = aziRad / EVS_PI * 180.0f; hMeta->directional_meta[0].elevation[j][i] = eleRad / EVS_PI * 180.0f; -- GitLab From 7d39805aee63bd9d42abcab56f03ec36bb218597 Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Fri, 9 Jan 2026 12:24:02 +0200 Subject: [PATCH 2/2] Add missing bits to previous commit. --- lib_com/options.h | 1 + lib_enc/ivas_masa_enc.c | 28 +++++++++++++++++++++++++--- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 3c65fe2f4b..36d00d19d3 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -193,6 +193,7 @@ #define FIX_2252_LP_CNG_STARTS_SID /* VA: issues 2251 and 2252: fix LP CNG uninitialized value in bitstream that starts with an SID */ #define FIX_1381_BWD /* VA: issue 1381: apply no hysteresis in BWD at higher bitrates also in mono MASA and OMASA */ #define FIX_2285_CODE_DECODER_INIT_BW /* VA: basop issue 2285: fix core-decoder initialization bandwidth */ +#define FIX_FLOAT_1493_MASA_ENCODE_STABILITY_IMPROVE /* Nokia: float issue 1493: Improves float decision stability in MASA encoding by adjusting reduction code */ /* ##################### End NON-BE switches ########################### */ diff --git a/lib_enc/ivas_masa_enc.c b/lib_enc/ivas_masa_enc.c index 471c3ac528..947f251557 100644 --- a/lib_enc/ivas_masa_enc.c +++ b/lib_enc/ivas_masa_enc.c @@ -82,8 +82,9 @@ static void masa_metadata_direction_alignment( MASA_ENCODER_HANDLE hMasa ); #define LOWBITRATE_ONSET_BETA 0.92f #define LOWBITRATE_ONSET_GAIN 1.4f #define LOWBITRATE_NUM_BANDS 5 - -#define IMPORTANCE_MIN_STEP 0.000244140625f /* 2^-12 to match BASOP */ +#ifdef FIX_FLOAT_1493_MASA_ENCODE_STABILITY_IMPROVE +#define IMPORTANCE_MIN_STEP 0.000244140625f /* 2^-12 to match BASOP */ +#endif /*-----------------------------------------------------------------------* @@ -981,7 +982,11 @@ static void combine_freqbands_and_subframes( MASA_ENCODER_HANDLE hMasa ) { int16_t i, j, k, m; +#ifdef FIX_FLOAT_1493_MASA_ENCODE_STABILITY_IMPROVE volatile float aziRad, eleRad; /* Using volatile to reduce numerically unstable optimization */ +#else + float aziRad, eleRad; +#endif float x[MASA_MAXIMUM_DIRECTIONS][MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; float y[MASA_MAXIMUM_DIRECTIONS][MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; float z[MASA_MAXIMUM_DIRECTIONS][MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; @@ -1067,9 +1072,14 @@ static void combine_freqbands_and_subframes( energySum += hMasa->data.energy[j][m]; } +#ifdef FIX_FLOAT_1493_MASA_ENCODE_STABILITY_IMPROVE /* Using atan2 instead of atan2f to reduce platform difference */ aziRad = (float) atan2( ySum, xSum ); eleRad = (float) atan2( zSum, sqrtf( xSum * xSum + ySum * ySum ) ); +#else + aziRad = atan2f( ySum, xSum ); + eleRad = atan2f( zSum, sqrtf( xSum * xSum + ySum * ySum ) ); +#endif hMeta->directional_meta[i].azimuth[j][k] = aziRad / EVS_PI * 180.0f; hMeta->directional_meta[i].elevation[j][k] = eleRad / EVS_PI * 180.0f; @@ -1177,8 +1187,13 @@ void ivas_masa_combine_directions( uint8_t computeCoherence; MASA_METADATA_HANDLE hMeta; - volatile float aziRad; /* Using volatile to reduce numerically unstable optimization */ +#ifdef FIX_FLOAT_1493_MASA_ENCODE_STABILITY_IMPROVE + volatile float aziRad; /* Using volatile to reduce numerically unstable optimization */ volatile float eleRad; +#else + float aziRad; + float eleRad; +#endif float x[MASA_MAXIMUM_DIRECTIONS][MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; float y[MASA_MAXIMUM_DIRECTIONS][MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; float z[MASA_MAXIMUM_DIRECTIONS][MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; @@ -1246,11 +1261,13 @@ void ivas_masa_combine_directions( } importance[i] /= (float) numSf; importance[i] *= hMasa->data.importanceWeight[i]; +#ifdef FIX_FLOAT_1493_MASA_ENCODE_STABILITY_IMPROVE /* Setting close to zero values to zero to reduce decision differences */ if ( importance[i] < IMPORTANCE_MIN_STEP ) { importance[i] = 0.0f; } +#endif } /* Determine bands where to use two directions */ @@ -1273,9 +1290,14 @@ void ivas_masa_combine_directions( { for ( j = 0; j < numSf; j++ ) { +#ifdef FIX_FLOAT_1493_MASA_ENCODE_STABILITY_IMPROVE /* Using atan2 instead of atan2f to reduce platform difference */ aziRad = (float) atan2( ySum[j][i], xSum[j][i] ); eleRad = (float) atan2( zSum[j][i], sqrtf( xSum[j][i] * xSum[j][i] + ySum[j][i] * ySum[j][i] ) ); +#else + aziRad = atan2f( ySum[j][i], xSum[j][i] ); + eleRad = atan2f( zSum[j][i], sqrtf( xSum[j][i] * xSum[j][i] + ySum[j][i] * ySum[j][i] ) ); +#endif hMeta->directional_meta[0].azimuth[j][i] = aziRad / EVS_PI * 180.0f; hMeta->directional_meta[0].elevation[j][i] = eleRad / EVS_PI * 180.0f; -- GitLab