diff --git a/lib_com/options.h b/lib_com/options.h index 08222bc9478e43609b74ebacfdc5e79b98696b16..c7efa9e0c42b50aad806e3603e2961dc993f67f6 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 @@ -141,6 +142,7 @@ #define NONBE_FIX_1110_STEREO_DTX_BRATE_SWITCHING /* VA: issue 1110: fix encoder crash in the stereo DTX bitrate switching condition */ #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*/ #define NONBE_1229_FIX_ISM1_DPID /* Eri: issue 1229: fix bug causing ISM 1 to use default -dpid instead of the specified one */ diff --git a/lib_dec/ivas_dirac_dec_fx.c b/lib_dec/ivas_dirac_dec_fx.c index 1bc3d42f94121964a7df60800b576d347bd86ccd..e4311e8e14aef62aa6f35cd98bb7a42fefca1b07 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]; @@ -3791,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++; @@ -3815,6 +3836,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 aa778fd2da0373b23f96dbc92030b9987b27a783..f9d03f6f91bb4ec98d89655420f4a9c996927d87 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 39d42ee8611ddc6265f06768850c67908895f541..f135d651a71987b207444120634b655f392d3e8c 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;