diff --git a/lib_com/options.h b/lib_com/options.h index 1e23c1a8b6684ab81fb60985c5576568b08c061d..c357e4d4dd2e9b3c620b3af24d3826d88fc7f4ac 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -106,6 +106,7 @@ #define HARMONIZE_2539_cng_energy /* FhG: basop issue 2539: harmonize cng_energy with its ivas derivate */ #define FIX_1585_ASAN_FORMAT_SW_ALT /* VA,FhG: float issues 1585,1593: alternative fix memory leaks with format switching */ #define FIX_BASOP_2573_RF_MODE_UPDATE /* FhG: BASOP issue 2573: remove duplicated update of rf_mode parameters from evs_enc_fx(); was already done in updt_enc_common_fx() */ +#define FIX_2570_BUF_OVFL /* Orange: basop issue 2570: global-buffer-overflow in lib_rend/ivas_objectRenderer_sources_fx.c */ /* #################### End BE switches ################################## */ diff --git a/lib_rend/ivas_objectRenderer_sources_fx.c b/lib_rend/ivas_objectRenderer_sources_fx.c index 611c0c45e39e86cfae34fbe6f5c6c72cd1d2cd0f..e18fd72917f67decf17816e6db9262fc7447450b 100644 --- a/lib_rend/ivas_objectRenderer_sources_fx.c +++ b/lib_rend/ivas_objectRenderer_sources_fx.c @@ -332,6 +332,9 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams_fx( #ifdef FIX_1548_HARMONIZE_NON_DIEGETIC_PANNING_LAW Word16 pan; #endif +#ifdef FIX_2570_BUF_OVFL + Word32 wrapped_angle; +#endif #ifdef FIX_BASOP_2023_TDREND_DISTATT_PRECISION Word16 pos_q; Word32 Src_p_tmp[3]; @@ -488,7 +491,24 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams_fx( set32_fx( hrf_right, 0, *filterlength ); #ifdef FIX_1548_HARMONIZE_NON_DIEGETIC_PANNING_LAW #ifdef FIX_BASOP_2023_TDREND_DISTATT_PRECISION - pan = add( extract_h( L_shl( SrcSpatial_p->Pos_p_fx[1], sub( Q21, SrcSpatial_p->q_Pos_p ) ) ), 32 ); +#ifdef FIX_2570_BUF_OVFL + IF( LT_32( L_add( ONE_IN_Q25, SrcSpatial_p->Pos_p_fx[1] ), 0 ) ) + { + wrapped_angle = L_negate( L_add( ONE_IN_Q26, SrcSpatial_p->Pos_p_fx[1] ) ); + } + ELSE IF( GT_32( L_sub( SrcSpatial_p->Pos_p_fx[1], ONE_IN_Q25 ), 0 ) ) + { + wrapped_angle = L_sub( ONE_IN_Q26, SrcSpatial_p->Pos_p_fx[1] ); + } + ELSE + { + wrapped_angle = SrcSpatial_p->Pos_p_fx[1]; + move32(); + } + pan = add( extract_h( L_shr( wrapped_angle, sub( SrcSpatial_p->q_Pos_p, Q21 ) ) ), 32 ); +#else + pan = add( extract_h( L_shr( SrcSpatial_p->Pos_p_fx[1], sub( SrcSpatial_p->q_Pos_p, Q21 ) ) ), 32 ); +#endif #else pan = add( mult_r( extract_h( SrcSpatial_p->Pos_p_fx[1] ), 2048 ), 32 ); #endif