diff --git a/lib_com/options.h b/lib_com/options.h index d573f13932eb7745079bf1ecb0368e572c4e453f..39d975a8f5ee3feb1031452dba7384a3abc60528 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -172,6 +172,8 @@ /* any switch which is non-be wrt. TS 26.258 V3.0 */ #define USE_RTPDUMP /* FhG: RTPDUMP format (rtptools standard) instead of custom format */ +#define FIX_1521_SBA_LOUDNESS_STEREO /* FhG: issue 1521: Fix loudness for SBA to stereo rendering */ +#define FIX_1521_SBA_LOUDNESS_BINAURAL /* FhG: issue 1521: Fix loudness for SBA to binaural rendering */ #define FIX_1540_EXPOSE_PT_IN_RTP_HEADER_API /* Expose Payload Type setting in RTP Header */ #define FIX_BASOP_2023_TDREND_DISTATT_PRECISION /* Eri: Basop issue 2023: Distance attenuation scaling, synch with BASOP updates and adding clamping of distance att input and listener position */ #define FIX_1574_EFAP_CODE_LINT /* FhG: issue 1574: Code quality fixes in ivas_efap.c */ diff --git a/lib_dec/ivas_dec_render.c b/lib_dec/ivas_dec_render.c index cfef84e48c96dab97891d441d11123fb85564f47..278bb18ac5ac20f7c8519da933747d25a5f5328f 100644 --- a/lib_dec/ivas_dec_render.c +++ b/lib_dec/ivas_dec_render.c @@ -341,6 +341,22 @@ ivas_error ivas_dec_render( return error; } } +#ifdef FIX_1521_SBA_LOUDNESS_BINAURAL + if ( st_ivas->ivas_format == SBA_FORMAT && + ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || + st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || + st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV ) && + output_config != IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED && + output_config != IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) + { + /* loudness correction for SBA binaural rendering */ + nchan_out_syn_output = ( st_ivas->hSplitBinRend != NULL ) ? st_ivas->hSplitBinRend->splitrend.multiBinPoseData.num_poses * BINAURAL_CHANNELS : BINAURAL_CHANNELS; + for ( n = 0; n < nchan_out_syn_output; n++ ) + { + v_multc( p_output[n], INV_SQRT2, p_output[n], *nSamplesRendered ); + } + } +#endif } else if ( st_ivas->ivas_format == MASA_ISM_FORMAT ) { diff --git a/lib_dec/ivas_sba_dirac_stereo_dec.c b/lib_dec/ivas_sba_dirac_stereo_dec.c index e074d13f7e8756427e3e6d8c6ab2e3a070e8c437..fcc4f941244363590c434f075095a6ff13a2ccd1 100644 --- a/lib_dec/ivas_sba_dirac_stereo_dec.c +++ b/lib_dec/ivas_sba_dirac_stereo_dec.c @@ -910,10 +910,29 @@ void ivas_sba_dirac_stereo_dec( synchro_synthesis( st_ivas->hDecoderConfig->ivas_total_brate, hCPE, output, output_frame, 1 /*st_ivas->sba_dirac_stereo_flag*/ ); /* output scaling */ +#ifdef FIX_1521_SBA_LOUDNESS_STEREO + if ( !sba_mono_flag ) +#else if ( !sba_mono_flag && !( st_ivas->ivas_format == SBA_ISM_FORMAT && st_ivas->ism_mode == ISM_MODE_NONE ) ) +#endif { +#ifdef FIX_1521_SBA_LOUDNESS_STEREO + if ( st_ivas->ivas_format == SBA_ISM_FORMAT && st_ivas->ism_mode == ISM_MODE_NONE ) + { + /* low bitrate OSBA needs a makeup gain of 2.f to compensate for the encoder side + INV_SQRT2 * 2 = SQRT2 */ + v_multc( output[0], SQRT2, output[0], output_frame ); + v_multc( output[1], SQRT2, output[1], output_frame ); + } + else + { + v_multc( output[0], INV_SQRT2, output[0], output_frame ); + v_multc( output[1], INV_SQRT2, output[1], output_frame ); + } +#else v_multc( output[0], 0.5f, output[0], output_frame ); v_multc( output[1], 0.5f, output[1], output_frame ); +#endif } /* delay HB synth */ diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 63f78a94903e16f22cc54966c4b626f9cfa7fe79..7430e9e6fc691f75f60ee05559a238b8e762a0fa 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -2250,6 +2250,19 @@ static ivas_error isar_generate_metadata_and_bitstream( return error; } +#ifdef FIX_1521_SBA_LOUDNESS_BINAURAL + if ( pcm_out_flag && st_ivas->ivas_format == SBA_FORMAT && + ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || + st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || + st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV ) ) + { + for ( i = 0; i < st_ivas->hDecoderConfig->nchan_out; ++i ) + { + v_multc( p_head_pose_buf[i], INV_SQRT2, p_head_pose_buf[i], nSamples ); + } + } +#endif + return IVAS_ERR_OK; } diff --git a/lib_rend/ivas_allrad_dec.c b/lib_rend/ivas_allrad_dec.c index 141e538817c686b0e3b282e38567b1434d325866..5b27c04cb982a81ea66d9aef94b7fb52ac994ab7 100644 --- a/lib_rend/ivas_allrad_dec.c +++ b/lib_rend/ivas_allrad_dec.c @@ -129,10 +129,17 @@ ivas_error ivas_sba_get_hoa_dec_matrix( } else if ( hOutSetup.output_config == IVAS_AUDIO_CONFIG_STEREO ) { +#ifdef FIX_1521_SBA_LOUDNESS_STEREO + ( *hoa_dec_mtx )[0] = INV_SQRT2; + ( *hoa_dec_mtx )[1] = INV_SQRT2; + ( *hoa_dec_mtx )[SBA_NHARM_HOA3] = INV_SQRT2; + ( *hoa_dec_mtx )[SBA_NHARM_HOA3 + 1] = -INV_SQRT2; +#else ( *hoa_dec_mtx )[0] = 0.5f; ( *hoa_dec_mtx )[1] = 0.5f; ( *hoa_dec_mtx )[SBA_NHARM_HOA3] = 0.5f; ( *hoa_dec_mtx )[SBA_NHARM_HOA3 + 1] = -0.5f; +#endif } else if ( hOutSetup.is_loudspeaker_setup ) { diff --git a/lib_rend/ivas_crend.c b/lib_rend/ivas_crend.c index 6befa436ab77aff92117622557821adb370982ad..e2abbd34179acad3f4ad33ed473990dcb88b023a 100644 --- a/lib_rend/ivas_crend.c +++ b/lib_rend/ivas_crend.c @@ -1854,7 +1854,19 @@ ivas_error ivas_rend_crendProcessSubframe( for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { /* move to output */ - mvr2r( pcm_tmp[ch], p_output[ch], subframe_len ); +#ifdef FIX_1521_SBA_LOUDNESS_BINAURAL + if ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS && outConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) + { + /* loudness correction for SBA binaural rendering */ + v_multc( pcm_tmp[ch], INV_SQRT2, p_output[ch], subframe_len ); + } + else + { +#endif + mvr2r( pcm_tmp[ch], p_output[ch], subframe_len ); +#ifdef FIX_1521_SBA_LOUDNESS_BINAURAL + } +#endif p_output[ch] += subframe_len; }