From 820cf6a9afe16d34faeb4bb8e65dcc0e07b396ae Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Thu, 14 Aug 2025 11:14:26 +0200 Subject: [PATCH 1/2] port Float MR1685 to main --- lib_com/options.h | 1 + lib_dec/ivas_dirac_dec_fx.c | 18 +++++++++++++++++- lib_dec/ivas_ism_param_dec_fx.c | 29 +++++++++++++++++++++++++++++ lib_dec/ivas_stat_dec.h | 3 +++ 4 files changed, 50 insertions(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 9ef650e07..5a81ae497 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -137,6 +137,7 @@ #define NONBE_FIX_1052_SBA_EXT_FIX /* VA: SBA external output support fix - do not overwrite "output_config" parameter */ #define NONBE_1894_OSBA_SCALING /* FhG: do not scale OSBA inputs by 0.5 any more */ +#define NONBE_FIX_1141_OSBA_ROOM_RENDERING /* FhG: Fix for issue 1141: render objects in OSBA decoder with room effect */ #define NONBE_1360_LFE_DELAY /* Dlb: LFE delay alignment when rendering in CLDFB domain*/ /* #################### End BASOP porting switches ############################ */ diff --git a/lib_dec/ivas_dirac_dec_fx.c b/lib_dec/ivas_dirac_dec_fx.c index 2516d4ebd..591919d41 100644 --- a/lib_dec/ivas_dirac_dec_fx.c +++ b/lib_dec/ivas_dirac_dec_fx.c @@ -3713,8 +3713,9 @@ void ivas_dirac_dec_render_sf_fx( Word16 num_objects, nchan_out_woLFE, lfe_index; Word16 n_slots_to_render; Word16 n_samples_to_render; +#ifndef NONBE_FIX_1141_OSBA_ROOM_RENDERING Word16 interp_offset; - +#endif Word32 gain_fx, prev_gain_fx; num_objects = st_ivas->nchan_ism; @@ -3724,16 +3725,23 @@ void ivas_dirac_dec_render_sf_fx( n_slots_to_render = st_ivas->hSpar->subframe_nbslots[st_ivas->hSpar->subframes_rendered]; move16(); n_samples_to_render = imult1616( hSpatParamRendCom->num_freq_bands, n_slots_to_render ); +#ifndef NONBE_FIX_1141_OSBA_ROOM_RENDERING interp_offset = st_ivas->hTcBuffer->n_samples_rendered; move16(); +#endif test(); IF( st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[0] ) { ivas_jbm_dec_get_adapted_linear_interpolator_fx( n_samples_to_render, n_samples_to_render, st_ivas->hIsmRendererData->interpolator_fx ); +#ifdef NONBE_FIX_1141_OSBA_ROOM_RENDERING + st_ivas->hIsmRendererData->interp_offset_fx = 0; +#else interp_offset = 0; +#endif move16(); } + FOR( i = 0; i < num_objects; i++ ) { /* Combined rotation: rotate the object positions depending the head and external orientations */ @@ -3779,7 +3787,12 @@ void ivas_dirac_dec_render_sf_fx( { Word32 *tc_re_fx, *tc_im_fx; Word16 *w1_fx, w2_fx; + +#ifdef NONBE_FIX_1141_OSBA_ROOM_RENDERING + w1_fx = &st_ivas->hIsmRendererData->interpolator_fx[st_ivas->hIsmRendererData->interp_offset_fx]; +#else w1_fx = &st_ivas->hIsmRendererData->interpolator_fx[interp_offset]; +#endif tc_re_fx = pppQMfFrame_ts_re_fx[nchan_transport + i][0]; move32(); tc_im_fx = pppQMfFrame_ts_im_fx[nchan_transport + i][0]; @@ -3811,6 +3824,9 @@ void ivas_dirac_dec_render_sf_fx( } } } +#ifdef NONBE_FIX_1141_OSBA_ROOM_RENDERING + st_ivas->hIsmRendererData->interp_offset_fx = add( st_ivas->hIsmRendererData->interp_offset_fx, i_mult( hSpatParamRendCom->num_freq_bands, st_ivas->hSpar->subframe_nbslots[st_ivas->hSpar->subframes_rendered] ) ); +#endif } /* Perform binaural rendering */ diff --git a/lib_dec/ivas_ism_param_dec_fx.c b/lib_dec/ivas_ism_param_dec_fx.c index aa778fd2d..f9d03f6f9 100644 --- a/lib_dec/ivas_ism_param_dec_fx.c +++ b/lib_dec/ivas_ism_param_dec_fx.c @@ -939,9 +939,21 @@ void ivas_ism_dec_digest_tc_fx( test(); test(); +#ifdef NONBE_FIX_1141_OSBA_ROOM_RENDERING + test(); + test(); + test(); +#endif +#ifdef NONBE_FIX_1141_OSBA_ROOM_RENDERING + IF( EQ_32( st_ivas->renderer_type, RENDERER_SBA_LINEAR_ENC ) || + EQ_32( st_ivas->renderer_type, RENDERER_OSBA_AMBI ) || + EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) || + ( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) && EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) && EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) ) +#else IF( EQ_32( st_ivas->renderer_type, RENDERER_SBA_LINEAR_ENC ) || EQ_32( st_ivas->renderer_type, RENDERER_OSBA_AMBI ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) ) +#endif { st_ivas->hIsmRendererData->interpolator_fx[0] = 0; move16(); @@ -966,6 +978,10 @@ void ivas_ism_dec_digest_tc_fx( ivas_jbm_dec_get_adapted_linear_interpolator_fx( extract_l( Mpy_32_32( st_ivas->hDecoderConfig->output_Fs, ONE_BY_FRAMES_PER_SEC_Q31 ) ), st_ivas->hTcBuffer->n_samples_available, st_ivas->hIsmRendererData->interpolator_fx ); move16(); } +#ifdef NONBE_FIX_1141_OSBA_ROOM_RENDERING + st_ivas->hIsmRendererData->interp_offset_fx = 0; + move16(); +#endif /* also get the gains here */ FOR( i = 0; i < st_ivas->nchan_ism; i++ ) @@ -992,10 +1008,23 @@ void ivas_ism_dec_digest_tc_fx( test(); test(); test(); +#ifdef NONBE_FIX_1141_OSBA_ROOM_RENDERING + test(); + test(); + test(); +#endif +#ifdef NONBE_FIX_1141_OSBA_ROOM_RENDERING + IF( ( EQ_32( st_ivas->renderer_type, RENDERER_TD_PANNING ) || + EQ_32( st_ivas->renderer_type, RENDERER_OSBA_LS ) || + EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_MIXER_CONV_ROOM ) || + ( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) && EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) && EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) ) && + st_ivas->hCombinedOrientationData == NULL ) +#else IF( ( EQ_32( st_ivas->renderer_type, RENDERER_TD_PANNING ) || EQ_32( st_ivas->renderer_type, RENDERER_OSBA_LS ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_MIXER_CONV_ROOM ) ) && st_ivas->hCombinedOrientationData == NULL ) +#endif { if ( st_ivas->hIntSetup.is_planar_setup ) { diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index 39d42ee86..f135d651a 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -859,6 +859,9 @@ typedef struct renderer_struct Word32 prev_gains_fx[MAX_NUM_OBJECTS][MAX_OUTPUT_CHANNELS]; /*Q30*/ Word16 *interpolator_fx; /*Q15*/ Word16 interpolator_len; +#ifdef NONBE_FIX_1141_OSBA_ROOM_RENDERING + Word16 interp_offset_fx; +#endif Word32 gains_fx[MAX_NUM_OBJECTS][MAX_OUTPUT_CHANNELS]; /*Q30*/ } ISM_RENDERER_DATA, *ISM_RENDERER_HANDLE; -- GitLab From fd90f3d7b39ec53d601c9f319b3944a581ca8fd7 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Sun, 17 Aug 2025 11:29:08 +0200 Subject: [PATCH 2/2] fix wrong buffer scaling --- lib_com/options.h | 1 + lib_dec/ivas_dirac_dec_fx.c | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 765ba5c0b..aecb8ee69 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -89,6 +89,7 @@ #define NONBE_FIX_TCX5_INTERLEAVING_FOR_FS_IN_UNEQUAL_FS_OUT /* FhG: apply correct TCX5 grouping/interleaving when input_fs != output_fs */ #define FIX_1917_DIRAC_RENDER_PTR_INCR /* FhG: fix wrong pointer increment in ivas_dirac_dec_render_sf_fx() for object rendering */ +#define FIX_CDLFB_BUFFER_SCALING /* FhG: fix wrong buffer scaling in ivas_dirac_dec_render_sf_fx() for object rendering */ #define FIX_1824 #define FIX_1822 diff --git a/lib_dec/ivas_dirac_dec_fx.c b/lib_dec/ivas_dirac_dec_fx.c index 29842bf87..e4311e8e1 100644 --- a/lib_dec/ivas_dirac_dec_fx.c +++ b/lib_dec/ivas_dirac_dec_fx.c @@ -3804,10 +3804,18 @@ void ivas_dirac_dec_render_sf_fx( g_fx = Madd_32_16( Mpy_32_16_1( gain_fx, *w1_fx ), prev_gain_fx, w2_fx ); // Q15 FOR( l = 0; l < hSpatParamRendCom->num_freq_bands; l++ ) { +#ifdef FIX_CDLFB_BUFFER_SCALING + Cldfb_RealBuffer_fx[j2][k][l] = Madd_32_32( Cldfb_RealBuffer_fx[j2][k][l], g_fx, L_shl( *tc_re_fx, 1 ) ); +#else Cldfb_RealBuffer_fx[j2][k][l] = Madd_32_32( Cldfb_RealBuffer_fx[j2][k][l], g_fx, *tc_re_fx ); +#endif move32(); tc_re_fx++; +#ifdef FIX_CDLFB_BUFFER_SCALING + Cldfb_ImagBuffer_fx[j2][k][l] = Madd_32_32( Cldfb_ImagBuffer_fx[j2][k][l], g_fx, L_shl( *tc_im_fx, 1 ) ); +#else Cldfb_ImagBuffer_fx[j2][k][l] = Madd_32_32( Cldfb_ImagBuffer_fx[j2][k][l], g_fx, *tc_im_fx ); +#endif move32(); #ifdef FIX_1917_DIRAC_RENDER_PTR_INCR tc_im_fx++; -- GitLab