diff --git a/lib_com/ivas_prot_fx.h b/lib_com/ivas_prot_fx.h index 7dff23282d6d9dbb5a94ae7fd89324d696ed88e3..0bb6d03e99c5d1e9df28a3862bb42b749f35b0f0 100644 --- a/lib_com/ivas_prot_fx.h +++ b/lib_com/ivas_prot_fx.h @@ -3904,6 +3904,17 @@ ivas_error ivas_osba_render_sf_fx( Word32 *p_output[] /* o : rendered time signal */ ); +#ifdef FIX_1849_OBJ_EDITING_API +void ivas_osba_stereo_add_channels_fx( + Word32 *tc_fx[], /* i : transport channels */ + Word32 *output_fx[], /* i/o: output channels */ + const Word16 gain, /* i : gain bed value */ + const Word16 nchan_out, /* i : number of output channels */ + const Word16 nchan_ism, /* i : number of ISM channels */ + const UWord16 n_samples_to_render /* i : output frame length per channel */ +); +#endif + void ivas_osba_data_close_fx( SBA_ISM_DATA_HANDLE *hSbaIsmData /* i/o: OSBA rendering handle */ ); diff --git a/lib_com/options.h b/lib_com/options.h index 62bccdca6536e2e4961f77e12566b9d760a3e613..4769d3de8dec2f0578c290133f19cb02804fbd13 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -131,6 +131,8 @@ #define NONBE_FIX_1174_MCMASA_LBR_LOOP_ERROR /* Nokia: Fix issue 1174 by removing the unnecessary inner loop causing problems. */ #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 */ + /* #################### End BASOP porting switches ############################ */ #define FIX_1766_TCX2ACELP_BWE_ISSUE /* VA : Fix rare BWE issue when switching from TCX to ACELP */ diff --git a/lib_dec/ivas_jbm_dec_fx.c b/lib_dec/ivas_jbm_dec_fx.c index 40a7c207dbcd3651a5cc3f70f9bf59b297680a4f..ec8ab0181f1c97da8c3d9724c2196ddb9aaade67 100644 --- a/lib_dec/ivas_jbm_dec_fx.c +++ b/lib_dec/ivas_jbm_dec_fx.c @@ -2230,10 +2230,19 @@ ivas_error ivas_jbm_dec_render_fx( ivas_ism_render_sf_fx( st_ivas, st_ivas->renderer_type, p_output_fx, *nSamplesRendered ); /* add already rendered SBA part */ +#ifdef FIX_1849_OBJ_EDITING_API + +#ifdef NONBE_1894_OSBA_SCALING + ivas_osba_stereo_add_channels_fx( p_tc_fx, p_output_fx, 1, nchan_out, st_ivas->nchan_ism, *nSamplesRendered ); +#else + ivas_osba_stereo_add_channels_fx( p_tc_fx, p_output_fx, 1, nchan_out, st_ivas->nchan_ism, st_ivas->ism_mode, *nSamplesRendered ); +#endif +#else FOR( n = 0; n < nchan_out; n++ ) { v_add_fixed_no_hdrm( p_output_fx[n], p_tc_fx[n + st_ivas->nchan_ism], p_output_fx[n], *nSamplesRendered ); } +#endif } ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_OSBA_AMBI ) || EQ_32( st_ivas->renderer_type, RENDERER_OSBA_LS ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) { @@ -2265,6 +2274,12 @@ ivas_error ivas_jbm_dec_render_fx( ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) { ivas_dirac_dec_binaural_render_fx( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, nchan_remapped, p_output_fx ); +#ifdef NONBE_1894_OSBA_SCALING + FOR( n = 0; n < st_ivas->hDecoderConfig->nchan_out; n++ ) + { + scale_sig32( p_output_fx[n], *nSamplesRendered, 1 ); + } +#endif } ELSE { @@ -2284,6 +2299,12 @@ ivas_error ivas_jbm_dec_render_fx( set32_fx( p_output_fx[n], 0, *nSamplesRendered ); } } +#ifdef NONBE_1894_OSBA_SCALING + FOR( n = 0; n < st_ivas->hDecoderConfig->nchan_out; n++ ) + { + scale_sig32( p_output_fx[n], *nSamplesRendered, 1 ); + } +#endif } } ELSE IF( EQ_32( st_ivas->ivas_format, MC_FORMAT ) ) diff --git a/lib_dec/ivas_osba_dec_fx.c b/lib_dec/ivas_osba_dec_fx.c index c6c55299a17d7461d61a55ef0c819e5b563e0e25..b31d57ae39c2f0a14935b1f9f198bb70f257d86d 100644 --- a/lib_dec/ivas_osba_dec_fx.c +++ b/lib_dec/ivas_osba_dec_fx.c @@ -203,13 +203,21 @@ ivas_error ivas_osba_dirac_td_binaural_jbm_fx( FOR( b = 0; b < num_cldfb_bands; b++ ) { st_ivas->hSplitBinRend->hMultiBinCldfbData->Cldfb_RealBuffer_Binaural_fx[n][slot_idx_start + slot_idx][b] = +#ifdef NONBE_1894_OSBA_SCALING + L_add( st_ivas->hSplitBinRend->hMultiBinCldfbData->Cldfb_RealBuffer_Binaural_fx[n][add( slot_idx_start, slot_idx )][b], Cldfb_RealBuffer[b] ); +#else L_add( L_shr( st_ivas->hSplitBinRend->hMultiBinCldfbData->Cldfb_RealBuffer_Binaural_fx[n][add( slot_idx_start, slot_idx )][b], 1 ), L_shr( Cldfb_RealBuffer[b], 1 ) ); +#endif move32(); st_ivas->hSplitBinRend->hMultiBinCldfbData->Cldfb_ImagBuffer_Binaural_fx[n][slot_idx_start + slot_idx][b] = +#ifdef NONBE_1894_OSBA_SCALING + L_add( st_ivas->hSplitBinRend->hMultiBinCldfbData->Cldfb_ImagBuffer_Binaural_fx[n][add( slot_idx_start, slot_idx )][b], Cldfb_ImagBuffer[b] ); +#else L_add( L_shr( st_ivas->hSplitBinRend->hMultiBinCldfbData->Cldfb_ImagBuffer_Binaural_fx[n][add( slot_idx_start, slot_idx )][b], 1 ), L_shr( Cldfb_ImagBuffer[b], 1 ) ); +#endif move32(); } } @@ -227,7 +235,11 @@ ivas_error ivas_osba_dirac_td_binaural_jbm_fx( Word16 i; FOR( i = 0; i < nSamplesAsked; i++ ) { +#ifdef NONBE_1894_OSBA_SCALING + output_fx[n][i] = L_add( output_fx[channel_offset + n][i], p_sepobj_fx[n][i] ); +#else output_fx[n][i] = L_add( L_shr( output_fx[channel_offset + n][i], 1 ), L_shr( p_sepobj_fx[n][i], 1 ) ); +#endif move32(); } } @@ -318,13 +330,71 @@ ivas_error ivas_osba_render_sf_fx( { IF( NE_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) { +#ifndef NONBE_1894_OSBA_SCALING v_add_fixed( p_output[n], p_output_ism[n], p_output[n], *nSamplesRendered, 1 ); // takes care of downscaling by 0.5f +#else + v_add_fixed_no_hdrm( p_output[n], p_output_ism[n], p_output[n], *nSamplesRendered ); +#endif } +#ifndef NONBE_1894_OSBA_SCALING ELSE { scale_sig32( p_output[n], *nSamplesRendered, -1 ); } +#endif } return IVAS_ERR_OK; } + + +#ifdef FIX_1849_OBJ_EDITING_API +/*-------------------------------------------------------------------------* + * ivas_osba_stereo_add_channels() + * + * + *-------------------------------------------------------------------------*/ + +void ivas_osba_stereo_add_channels_fx( + Word32 *tc_fx[], /* i : transport channels */ + Word32 *output_fx[], /* i/o: output channels */ + const Word16 gain, /* i : gain bed value */ + const Word16 nchan_out, /* i : number of output channels */ + const Word16 nchan_ism, /* i : number of ISM channels */ +#ifndef NONBE_1894_OSBA_SCALING + const int16_t ism_mode, /* i : ISM mode */ +#endif + const UWord16 n_samples_to_render /* i : output frame length per channel */ +) +{ + int16_t n; + +#ifndef NONBE_1894_OSBA_SCALING + if ( ism_mode == ISM_SBA_MODE_DISC ) + { +#endif + if ( NE_16( gain, 1 ) ) + { + assert( 0 && "Object editing is not implemented in the BASOP code!" ); + } + else + { + FOR( n = 0; n < nchan_out; n++ ) + { + v_add_fixed_no_hdrm( output_fx[n], tc_fx[n + nchan_ism], output_fx[n], n_samples_to_render ); + } + } +#ifndef NONBE_1894_OSBA_SCALING + } + else + { + FOR( n = 0; n < nchan_out; n++ ) + { + v_add_fixed_no_hdrm( output_fx[n], tc_fx[n + nchan_ism], output_fx[n], n_samples_to_render ); + } + } +#endif + + return; +} +#endif