diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 3e8521f47d8f5fc485771b6c1ce76bfaffcf783d..5ddd74d3915d9c08df8f6a6b530ff7379c2b42ee 100644 --- 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/tanf(30.0f * PI_OVER_180) */ +#endif /*----------------------------------------------------------------------------------* * Binaural Rendering Constants diff --git a/lib_com/options.h b/lib_com/options.h index 6dcb2f491a6dd529b837fe33bfa05ce8f6a6704e..cb3dd907e9f67e0209b5993d02949eb074024887 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 FIX_1330_JBM_MEMORY_FIX /* VA: basop issue: 2179 fix non-BE difference in FIX_1330_JBM_MEMORY */ #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 11d797253aa423b253950e3707bf6404e9e97e93..38ef231629a03754352245eedba06d3d9ba29c72 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 52262a9e8fe2af2205b2146115a6dc6e45651467..b20afdca419156bd75d5b8aa574f5f803d49d379 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 6a162142e88a00a1031a2e4d3b67b2a4e4a8ce67..381dd5fe346a078cc42d75507dc7ed4ec6bc07c3 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 );