From 1a95e172cf8e66851c1b73ef907123c4e3234944 Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Mon, 3 Nov 2025 16:11:41 +0200 Subject: [PATCH 1/3] Stabilize optimization of decoder side stereo panning functions by changing LsAngleRad to defined value and also precalculating inverse of tangent. --- lib_com/ivas_cnst.h | 4 ++++ lib_com/options.h | 2 ++ lib_dec/ivas_ism_renderer.c | 14 ++++++++++++++ lib_dec/ivas_sba_dirac_stereo_dec.c | 15 ++++++++++++++- lib_rend/ivas_dirac_dec_binaural_functions.c | 14 ++++++++++++++ 5 files changed, 48 insertions(+), 1 deletion(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 3e8521f47d..35698fb83f 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -1483,6 +1483,10 @@ typedef enum #define VBAP_NUM_SEARCH_SECTORS 4 +#ifdef NONBE_FIX_1426_STEREO_PANNING_BETWEEN_OPT_LEVEL +#define LS_ANGLE_RAD_30_DEG 0.52359879f /* 30.0f * PI_OVER_180 */ +#define INV_TAN_LS_ANGLE_RAD_30_DEG 1.7320507f /* 1.0f/(30.0f * PI_OVER_180)*/ +#endif /*----------------------------------------------------------------------------------* * Binaural Rendering Constants diff --git a/lib_com/options.h b/lib_com/options.h index b72be74b4f..8f5a19f624 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -192,6 +192,8 @@ /*#define NONBE_1324_TC_BUFFER_MEMOERY_KEEP*/ /* VA: issue 1324: do not reset TSM memory in JBM bitrate switching */ #define NONBE_1380_OMASA_BUILD_DIFF /* Nokia: Fix for issue #1380: Large differences in OMASA output between Debug and Release builds */ +#define NONBE_FIX_1426_STEREO_PANNING_BETWEEN_OPT_LEVEL /* Nokia: Adjustments in remaining stereo panning functions to make them BE between Debug and Release */ + /* ##################### End NON-BE switches ########################### */ diff --git a/lib_dec/ivas_ism_renderer.c b/lib_dec/ivas_ism_renderer.c index 11d797253a..38ef231629 100644 --- a/lib_dec/ivas_ism_renderer.c +++ b/lib_dec/ivas_ism_renderer.c @@ -301,7 +301,9 @@ void ivas_ism_get_stereo_gains( { float aziRad, eleRad; float y, mappedX, aziRadMapped, A, A2, A3; +#ifndef NONBE_FIX_1426_STEREO_PANNING_BETWEEN_OPT_LEVEL const float LsAngleRad = 30.0f * PI_OVER_180; +#endif /* Convert azi and ele to an azi value of the cone of confusion */ aziRad = azimuth * PI_OVER_180; @@ -311,19 +313,31 @@ void ivas_ism_get_stereo_gains( aziRadMapped = atan2f( y, mappedX ); /* Determine the amplitude panning gains */ +#ifdef NONBE_FIX_1426_STEREO_PANNING_BETWEEN_OPT_LEVEL + if ( aziRadMapped >= LS_ANGLE_RAD_30_DEG ) +#else if ( aziRadMapped >= LsAngleRad ) +#endif { /* Left side */ *left_gain = 1.0f; *right_gain = 0.0f; } +#ifdef NONBE_FIX_1426_STEREO_PANNING_BETWEEN_OPT_LEVEL + else if ( aziRadMapped <= -LS_ANGLE_RAD_30_DEG ) +#else else if ( aziRadMapped <= -LsAngleRad ) +#endif { /* Right side */ *left_gain = 0.0f; *right_gain = 1.0f; } else /* Tangent panning law */ { +#ifdef NONBE_FIX_1426_STEREO_PANNING_BETWEEN_OPT_LEVEL + A = tanf( aziRadMapped ) * INV_TAN_LS_ANGLE_RAD_30_DEG; +#else A = tanf( aziRadMapped ) / tanf( LsAngleRad ); +#endif A2 = ( A - 1.0f ) / max( 0.001f, A + 1.0f ); A3 = 1.0f / ( A2 * A2 + 1.0f ); *left_gain = sqrtf( A3 ); diff --git a/lib_dec/ivas_sba_dirac_stereo_dec.c b/lib_dec/ivas_sba_dirac_stereo_dec.c index 52262a9e8f..b20afdca41 100644 --- a/lib_dec/ivas_sba_dirac_stereo_dec.c +++ b/lib_dec/ivas_sba_dirac_stereo_dec.c @@ -187,8 +187,9 @@ static float get_panning( { float aziRad, eleRad, y, mappedX, aziRadMapped, panning; float A, A2, A3; +#ifndef NONBE_FIX_1426_STEREO_PANNING_BETWEEN_OPT_LEVEL const float LsAngleRad = 30.0f * PI_OVER_180; - +#endif aziRad = aziDeg * PI_OVER_180; eleRad = eleDeg * PI_OVER_180; y = ( sinf( aziRad ) * cosf( eleRad ) ); @@ -197,17 +198,29 @@ static float get_panning( /* Determine the real valued amplitude panning gains */ panning = 0.0f; +#ifdef NONBE_FIX_1426_STEREO_PANNING_BETWEEN_OPT_LEVEL + if ( aziRadMapped >= LS_ANGLE_RAD_30_DEG ) +#else if ( aziRadMapped >= LsAngleRad ) +#endif { /* Left side */ panning = 1.0f; } +#ifdef NONBE_FIX_1426_STEREO_PANNING_BETWEEN_OPT_LEVEL + else if ( aziRadMapped <= -LS_ANGLE_RAD_30_DEG ) +#else else if ( aziRadMapped <= -LsAngleRad ) +#endif { /* Right side */ panning = -1.0f; } else /* Tangent panning law */ { +#ifdef NONBE_FIX_1426_STEREO_PANNING_BETWEEN_OPT_LEVEL + A = tanf( aziRadMapped ) * INV_TAN_LS_ANGLE_RAD_30_DEG; +#else A = tanf( aziRadMapped ) / tanf( LsAngleRad ); +#endif A2 = ( A - 1.0f ) / max( 0.001f, A + 1.0f ); A3 = 1.0f / ( A2 * A2 + 1.0f ); panning = 2 * A3 - 1.0f; diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index 6a162142e8..381dd5fe34 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -2450,7 +2450,9 @@ static void getDirectPartGains( { float aziRad, eleRad; float y, mappedX, aziRadMapped, A, A2, A3; +#ifndef NONBE_FIX_1426_STEREO_PANNING_BETWEEN_OPT_LEVEL const float LsAngleRad = 30.0f * PI_OVER_180; +#endif if ( renderStereoOutputInsteadOfBinaural ) /* In stereo (i.e. non-binaural) rendering mode */ { @@ -2471,19 +2473,31 @@ static void getDirectPartGains( aziRadMapped = atan2f( y, mappedX ); /* Determine the real valued amplitude panning gains */ +#ifdef NONBE_FIX_1426_STEREO_PANNING_BETWEEN_OPT_LEVEL + if ( aziRadMapped >= LS_ANGLE_RAD_30_DEG ) +#else if ( aziRadMapped >= LsAngleRad ) +#endif { /* Left side */ *lRealp = 1.0f; *rRealp = 0.0f; } +#ifdef NONBE_FIX_1426_STEREO_PANNING_BETWEEN_OPT_LEVEL + else if ( aziRadMapped <= -LS_ANGLE_RAD_30_DEG ) +#else else if ( aziRadMapped <= -LsAngleRad ) +#endif { /* Right side */ *lRealp = 0.0f; *rRealp = 1.0f; } else /* Tangent panning law */ { +#ifdef NONBE_FIX_1426_STEREO_PANNING_BETWEEN_OPT_LEVEL + A = tanf( aziRadMapped ) * INV_TAN_LS_ANGLE_RAD_30_DEG; +#else A = tanf( aziRadMapped ) / tanf( LsAngleRad ); +#endif A2 = ( A - 1.0f ) / max( 0.001f, A + 1.0f ); A3 = 1.0f / ( A2 * A2 + 1.0f ); *lRealp = sqrtf( A3 ); -- GitLab From ccf563d64e29a8b0c3b6a5f93c7b8f646a11c126 Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Mon, 3 Nov 2025 16:16:52 +0200 Subject: [PATCH 2/3] Minor comment change. --- lib_com/ivas_cnst.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 35698fb83f..ad822d0e1c 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -1484,7 +1484,7 @@ typedef enum #define VBAP_NUM_SEARCH_SECTORS 4 #ifdef NONBE_FIX_1426_STEREO_PANNING_BETWEEN_OPT_LEVEL -#define LS_ANGLE_RAD_30_DEG 0.52359879f /* 30.0f * PI_OVER_180 */ +#define LS_ANGLE_RAD_30_DEG 0.52359879f /* 30.0f * PI_OVER_180 */ #define INV_TAN_LS_ANGLE_RAD_30_DEG 1.7320507f /* 1.0f/(30.0f * PI_OVER_180)*/ #endif -- GitLab From c4b0d9aa5820ec2af2f265fabe8859be052bdade Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Fri, 7 Nov 2025 08:18:06 +0200 Subject: [PATCH 3/3] Update file ivas_cnst.h --- lib_com/ivas_cnst.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index ad822d0e1c..5ddd74d391 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -1485,7 +1485,7 @@ typedef enum #ifdef NONBE_FIX_1426_STEREO_PANNING_BETWEEN_OPT_LEVEL #define LS_ANGLE_RAD_30_DEG 0.52359879f /* 30.0f * PI_OVER_180 */ -#define INV_TAN_LS_ANGLE_RAD_30_DEG 1.7320507f /* 1.0f/(30.0f * PI_OVER_180)*/ +#define INV_TAN_LS_ANGLE_RAD_30_DEG 1.7320507f /* 1.0f/tanf(30.0f * PI_OVER_180) */ #endif /*----------------------------------------------------------------------------------* -- GitLab