diff --git a/lib_com/options.h b/lib_com/options.h index 6579999f28044ff0135600ea87d9cabd47d8fc8a..89b802e7203be877620f77f053047a1abe85eedc 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -151,6 +151,8 @@ #define FIX_BASOP_2517_CLICK_IN_OMASA_LTV /* FhG: BASOP #2517: preserve precision by removing one-bit headroom from Q_min and allowing saturation during buffer scaling */ #define FIX_BASOP_2559_Q_SYNTH_HISTORY_RESET /* FhG: BASOP issue 2559: reset hTcxDec->q_synth_history_fx in allocate_CoreCoder_TCX_fx() */ #define FIX_FLOAT_1578_OMASA_REND_SPIKES /* Nokia: Float issue 1578: Fix spikes and collapsed perception in OMASA/MASA rendering to FOA/HOA */ +#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 */ /* ##################### End NON-BE switches ########################### */ diff --git a/lib_dec/ivas_dec_render_fx.c b/lib_dec/ivas_dec_render_fx.c index ee5105fdebb2c9d9ac44912ada0df77aec7fa0fb..71dec56297e026028391202071b77d1d8baae828 100644 --- a/lib_dec/ivas_dec_render_fx.c +++ b/lib_dec/ivas_dec_render_fx.c @@ -440,6 +440,24 @@ ivas_error ivas_dec_render_fx( return error; } } +#ifdef FIX_1521_SBA_LOUDNESS_BINAURAL + test(); + test(); + test(); + IF( EQ_32( st_ivas->ivas_format, SBA_FORMAT ) && + ( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || + EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) || + EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) ) ) + { + /* 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; + move16(); + FOR( n = 0; n < nchan_out_syn_output; n++ ) + { + v_multc_fx( p_output_fx[n], INV_SQRT2_FX, p_output_fx[n], *nSamplesRendered ); + } + } +#endif } ELSE IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) { diff --git a/lib_dec/ivas_sba_dirac_stereo_dec_fx.c b/lib_dec/ivas_sba_dirac_stereo_dec_fx.c index 905d62d3cfa776ef1651cd4825ba680fe29e2d1e..1d15b3d291a517dabde3e8f20323db25bf0ca526 100644 --- a/lib_dec/ivas_sba_dirac_stereo_dec_fx.c +++ b/lib_dec/ivas_sba_dirac_stereo_dec_fx.c @@ -1566,11 +1566,33 @@ void ivas_sba_dirac_stereo_dec_fx( synchro_synthesis_fx( st_ivas->hDecoderConfig->ivas_total_brate, hCPE, output, output_frame, 1 /*st_ivas->sba_dirac_stereo_flag*/, q_dft[0] ); /* output scaling */ +#ifdef FIX_1521_SBA_LOUDNESS_STEREO + IF( !sba_mono_flag ) +#else test(); IF( !sba_mono_flag && !( EQ_16( st_ivas->ivas_format, SBA_ISM_FORMAT ) && EQ_16( st_ivas->ism_mode, ISM_MODE_NONE ) ) ) +#endif { +#ifdef FIX_1521_SBA_LOUDNESS_STEREO + test(); + IF( EQ_16( st_ivas->ivas_format, SBA_ISM_FORMAT ) && EQ_16( 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_fx( output[0], SQRT2_FX, output[0], output_frame ); + v_multc_fx( output[1], SQRT2_FX, output[1], output_frame ); + v_shr( output[0], -1, output[0], output_frame ); /* q_dft */ + v_shr( output[1], -1, output[1], output_frame ); /* q_dft */ + } + ELSE + { + v_multc_fx( output[0], INV_SQRT2_FX, output[0], output_frame ); + v_multc_fx( output[1], INV_SQRT2_FX, output[1], output_frame ); + } +#else v_shr( output[0], 1, output[0], output_frame ); /*0.5f*/ v_shr( output[1], 1, output[1], output_frame ); /*0.5f*/ +#endif } /* delay HB synth */ diff --git a/lib_rend/ivas_allrad_dec_fx.c b/lib_rend/ivas_allrad_dec_fx.c index 2c5c40b9c30c0eabcc2a43a01b21999c0ffeba84..18793c211a65cdc8858b99a381ff10af200bbc57 100644 --- a/lib_rend/ivas_allrad_dec_fx.c +++ b/lib_rend/ivas_allrad_dec_fx.c @@ -98,10 +98,17 @@ ivas_error ivas_sba_get_hoa_dec_matrix_fx( } ELSE IF( EQ_32( hOutSetup.output_config, IVAS_AUDIO_CONFIG_STEREO ) ) { +#ifdef FIX_1521_SBA_LOUDNESS_STEREO + ( *hoa_dec_mtx )[0] = INV_SQRT2_FX >> 2; + ( *hoa_dec_mtx )[1] = INV_SQRT2_FX >> 2; + ( *hoa_dec_mtx )[SBA_NHARM_HOA3] = INV_SQRT2_FX >> 2; + ( *hoa_dec_mtx )[SBA_NHARM_HOA3 + 1] = -( INV_SQRT2_FX >> 2 ); +#else ( *hoa_dec_mtx )[0] = ONE_IN_Q28; // 0.5f in Q29 ( *hoa_dec_mtx )[1] = ONE_IN_Q28; // 0.5f in Q29 ( *hoa_dec_mtx )[SBA_NHARM_HOA3] = ONE_IN_Q28; // 0.5f in Q29 ( *hoa_dec_mtx )[SBA_NHARM_HOA3 + 1] = -ONE_IN_Q28; // 0.5f in Q29 +#endif move32(); move32(); move32(); diff --git a/lib_rend/ivas_crend_fx.c b/lib_rend/ivas_crend_fx.c index 5e41928918a7834cfefc0d26adc519e431ca8740..e1981b91fb6686c57a954df3d829ea766ee3a566 100644 --- a/lib_rend/ivas_crend_fx.c +++ b/lib_rend/ivas_crend_fx.c @@ -2230,7 +2230,20 @@ ivas_error ivas_rend_crendProcessSubframe_fx( FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { /* move to output */ - Copy32( pcm_tmp_fx[ch], p_output_fx[ch], subframe_len ); +#ifdef FIX_1521_SBA_LOUDNESS_BINAURAL + test(); + IF( EQ_32( inConfigType, IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) && NE_32( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) + { + /* loudness correction for SBA binaural rendering */ + v_multc_fx( pcm_tmp_fx[ch], INV_SQRT2_FX, p_output_fx[ch], subframe_len ); + } + ELSE + { +#endif + Copy32( pcm_tmp_fx[ch], p_output_fx[ch], subframe_len ); +#ifdef FIX_1521_SBA_LOUDNESS_BINAURAL + } +#endif p_output_fx[ch] += subframe_len; }