From 58707842611b8952d5dc1df3bd40609ae661feb6 Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Fri, 24 Oct 2025 14:51:46 +0300 Subject: [PATCH 1/3] Port float MR 2199 to BASOP main --- lib_com/options.h | 1 + lib_rend/ivas_omasa_ana_fx.c | 66 +++++++++++++++++++++++++++++++++++- 2 files changed, 66 insertions(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 53c55e725..64f0b0da3 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -117,6 +117,7 @@ #define FIX_RENDERER_STACK /* VA: issue 1322: reduction of renderers' buffers size */ #define FIX_1370_EXTERNAL_ORIENTATION_CHECK /* Nokia: add sanity check for Euler angles for external orientations */ #define NONBE_FIX_1197_OMASA_META_BUFFER /* Nokia: OMASA ISM_MASA_MODE_PARAM_ONE_OBJ history zero in rateswitching - port 251 */ +#define NONBE_1362_FIX_OMASA_TO_MASA1_RENDERING /* Nokia: Fix OMASA to MASA1 rendering in IVAS_rend */ // object-editing feature porting #define TMP_FIX_SPLIT_REND // temporary fix to split-rendering (it follows the later state of the framework but it is needed now because of current test-conditions) diff --git a/lib_rend/ivas_omasa_ana_fx.c b/lib_rend/ivas_omasa_ana_fx.c index e441b3596..37c4343d4 100644 --- a/lib_rend/ivas_omasa_ana_fx.c +++ b/lib_rend/ivas_omasa_ana_fx.c @@ -671,7 +671,70 @@ static void ivas_omasa_dmx_fx( FOR( i = 0; i < nchan_ism; i++ ) { +#ifdef NONBE_1362_FIX_OMASA_TO_MASA1_RENDERING + IF( EQ_16( nchan_transport, 1 ) ) + { + v_add_32( data_out_f_fx[0], data_in_f_fx[i], data_out_f_fx[0], input_frame ); + } + ELSE + { + azimuth_fx = extract_l( L_shr( ism_azimuth_fx[i], Q22 ) ); // Q0 + elevation_fx = extract_l( L_shr( ism_elevation_fx[i], Q22 ) ); // Q0 + + ivas_ism_get_stereo_gains_fx( azimuth_fx, elevation_fx, &gains_fx[0], &gains_fx[1] ); + /* Downmix using the panning gains */ + FOR( j = 0; j < nchan_transport; j++ ) + { + test(); + IF( abs_s( gains_fx[j] ) > 0 || L_abs( prev_gains_fx[i][j] ) > 0 ) + { + FOR( k = 0; k < input_frame; k++ ) + { + g1_fx = interpolator_fx[k]; // Q15 + move16(); + scale = BASOP_Util_Add_MantExp( 16384, 1, negate( g1_fx ), 0, &g2_fx ); + + tmp1 = mult( g1_fx, gains_fx[j] ); + tmp2 = mult( g2_fx, (Word16) L_shr( prev_gains_fx[i][j], 16 ) ); // Q: ( ( ( 15 - scale ) + ( Q31 - Q16 ) ) - Q15 ) -> ( 15 - scale ) + scale = BASOP_Util_Add_MantExp( tmp1, 0, tmp2, scale, &tmp1 ); + + L_tmp = data_in_f_fx[i][k]; // data_in_q + move32(); + tmp_e = sub( 31, *data_in_q ); + move16(); + + L_tmp = Mpy_32_16_1( L_tmp, tmp1 ); + scale = add( scale, tmp_e ); + + data_out_f_fx[j][k] = BASOP_Util_Add_Mant32Exp( data_out_f_fx[j][k], data_e[j], L_tmp, scale, &in_e[k] ); + move32(); + } + max_e = in_e[0]; + move16(); + FOR( l = 1; l < L_FRAME48k; l++ ) + { + IF( LT_16( max_e, in_e[l] ) ) + { + max_e = in_e[l]; + move16(); + } + } + + FOR( l = 0; l < L_FRAME48k; l++ ) + { + data_out_f_fx[j][l] = L_shr( data_out_f_fx[j][l], sub( max_e, in_e[l] ) ); // exponent: max_e, Q: ( 15 - max_e ) + move32(); + } + data_e[j] = max_e; + move16(); + } + + prev_gains_fx[i][j] = L_deposit_h( gains_fx[j] ); // Q31 + move32(); + } + } +#else azimuth_fx = extract_l( L_shr( ism_azimuth_fx[i], Q22 ) ); // Q0 elevation_fx = extract_l( L_shr( ism_elevation_fx[i], Q22 ) ); // Q0 @@ -727,13 +790,14 @@ static void ivas_omasa_dmx_fx( prev_gains_fx[i][j] = L_deposit_h( gains_fx[j] ); // Q31 move32(); } +#endif } max_e = data_e[0]; move16(); FOR( i = 1; i < nchan_transport; i++ ) { - if ( LT_16( max_e, data_e[i] ) ) + IF( LT_16( max_e, data_e[i] ) ) { max_e = data_e[i]; move16(); -- GitLab From 052736f1560873beec233b59bdfffcad78f9a589 Mon Sep 17 00:00:00 2001 From: lintervo Date: Wed, 29 Oct 2025 16:21:13 +0200 Subject: [PATCH 2/3] Handle exp properly in 1TC case --- lib_rend/ivas_omasa_ana_fx.c | 39 +++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/lib_rend/ivas_omasa_ana_fx.c b/lib_rend/ivas_omasa_ana_fx.c index 37c4343d4..2800b3019 100644 --- a/lib_rend/ivas_omasa_ana_fx.c +++ b/lib_rend/ivas_omasa_ana_fx.c @@ -674,7 +674,11 @@ static void ivas_omasa_dmx_fx( #ifdef NONBE_1362_FIX_OMASA_TO_MASA1_RENDERING IF( EQ_16( nchan_transport, 1 ) ) { - v_add_32( data_out_f_fx[0], data_in_f_fx[i], data_out_f_fx[0], input_frame ); + FOR( j = 0; j < input_frame; j++ ) + { + data_out_f_fx[0][j] = L_add_sat( data_out_f_fx[0][j], data_in_f_fx[i][j] ); + move32(); + } } ELSE { @@ -793,6 +797,30 @@ static void ivas_omasa_dmx_fx( #endif } +#ifdef NONBE_1362_FIX_OMASA_TO_MASA1_RENDERING + IF( NE_16( nchan_transport, 1 ) ) + { + max_e = data_e[0]; + move16(); + FOR( i = 1; i < nchan_transport; i++ ) + { + IF( LT_16( max_e, data_e[i] ) ) + { + max_e = data_e[i]; + move16(); + } + } + + FOR( i = 0; i < nchan_transport; i++ ) + { + FOR( j = 0; j < input_frame; j++ ) + { + data_out_f_fx[i][j] = L_shr( data_out_f_fx[i][j], sub( max_e, data_e[i] ) ); // exponent: max_e, Q: ( 15 - max_e ) + move32(); + } + } + } +#else max_e = data_e[0]; move16(); FOR( i = 1; i < nchan_transport; i++ ) @@ -812,12 +840,21 @@ static void ivas_omasa_dmx_fx( move32(); } } +#endif FOR( i = 0; i < nchan_transport; i++ ) { Copy32( data_out_f_fx[i], data_in_f_fx[i], input_frame ); +#ifdef NONBE_1362_FIX_OMASA_TO_MASA1_RENDERING + IF( NE_16( nchan_transport, 1 ) ) + { + *data_in_q = sub( 31, max_e ); + move16(); + } +#else *data_in_q = sub( 31, max_e ); move16(); +#endif } return; -- GitLab From c606b8f860898cc29fb1eeb97d518947da100a1c Mon Sep 17 00:00:00 2001 From: lintervo Date: Wed, 29 Oct 2025 16:39:58 +0200 Subject: [PATCH 3/3] Fix build issue --- lib_rend/ivas_omasa_ana_fx.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib_rend/ivas_omasa_ana_fx.c b/lib_rend/ivas_omasa_ana_fx.c index 2800b3019..310addb66 100644 --- a/lib_rend/ivas_omasa_ana_fx.c +++ b/lib_rend/ivas_omasa_ana_fx.c @@ -668,6 +668,9 @@ static void ivas_omasa_dmx_fx( } set16_fx( data_e, 0, 4 ); set16_fx( in_e, 0, 960 ); +#ifdef NONBE_1362_FIX_OMASA_TO_MASA1_RENDERING + max_e = 0; +#endif FOR( i = 0; i < nchan_ism; i++ ) { -- GitLab