diff --git a/lib_com/options.h b/lib_com/options.h index cccc1dc2aaee11f5cc09a9e639dbeb8fb4c08d90..66f09059ca958bd8b4fc18c56496f0ec814319f0 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -154,6 +154,7 @@ #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 */ /* ##################### End NON-BE switches ########################### */ 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();