Loading lib_com/options.h +1 −0 Original line number Diff line number Diff line Loading @@ -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 ########################### */ Loading lib_enc/ivas_masa_enc.c +25 −3 Original line number Diff line number Diff line Loading @@ -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 #ifdef FIX_FLOAT_1493_MASA_ENCODE_STABILITY_IMPROVE #define IMPORTANCE_MIN_STEP 0.000244140625f /* 2^-12 to match BASOP */ #endif /*-----------------------------------------------------------------------* Loading Loading @@ -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]; Loading Loading @@ -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; Loading Loading @@ -1177,8 +1187,13 @@ void ivas_masa_combine_directions( uint8_t computeCoherence; MASA_METADATA_HANDLE hMeta; #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]; Loading Loading @@ -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 */ Loading @@ -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; Loading Loading
lib_com/options.h +1 −0 Original line number Diff line number Diff line Loading @@ -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 ########################### */ Loading
lib_enc/ivas_masa_enc.c +25 −3 Original line number Diff line number Diff line Loading @@ -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 #ifdef FIX_FLOAT_1493_MASA_ENCODE_STABILITY_IMPROVE #define IMPORTANCE_MIN_STEP 0.000244140625f /* 2^-12 to match BASOP */ #endif /*-----------------------------------------------------------------------* Loading Loading @@ -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]; Loading Loading @@ -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; Loading Loading @@ -1177,8 +1187,13 @@ void ivas_masa_combine_directions( uint8_t computeCoherence; MASA_METADATA_HANDLE hMeta; #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]; Loading Loading @@ -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 */ Loading @@ -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; Loading