From 02f8c3379be27d1a870d8f4334adc851fd5b5455 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Mon, 11 Aug 2025 13:39:15 +0200 Subject: [PATCH 1/2] port float MR1575 to ivas-float-update --- lib_com/ivas_prot.h | 4 ++++ lib_com/options.h | 2 ++ lib_enc/ivas_mct_core_enc.c | 39 +++++++++++++++++++++++++++++++++---- lib_enc/ivas_mct_enc_mct.c | 12 ++++++++---- 4 files changed, 49 insertions(+), 8 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 9d2384043..75506f1c1 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -3074,7 +3074,11 @@ void mctStereoIGF_enc( MCT_ENC_HANDLE hMCT, /* i/o: MCT encoder structure */ Encoder_State **sts, /* i/o: encoder state structure */ float *orig_spectrum[MCT_MAX_CHANNELS][NB_DIV], /* i : MDCT spectrum for ITF */ +#ifdef NONBE_FIX_1097_SBA_DTX_BRATE_SWITCHING_ENC + float *powerSpec[MCT_MAX_CHANNELS], /* i/o: MDCT^2 + MDST^2 spectrum,or estimate */ +#else float powerSpec[MCT_MAX_CHANNELS][L_FRAME48k], /* i/o: MDCT^2 + MDST^2 spectrum,or estimate */ +#endif float *powerSpecMsInv[MCT_MAX_CHANNELS][NB_DIV], /* i : same as above but for inverse spect. */ float *inv_spectrum[MCT_MAX_CHANNELS][NB_DIV], /* i : inverse spectrum */ const int16_t sp_aud_decision0[MCT_MAX_CHANNELS] /* i : speech audio decision */ diff --git a/lib_com/options.h b/lib_com/options.h index 2128f5987..93046ccfd 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -204,6 +204,8 @@ #define FIX_1138_SBA_EXT_ERROR_PRINTOUT /* VA: issue 1138: Fix SBA EXT output call of audioCfg2channels() */ #define NONBE_FIX_981_PARAMBIN_DEFAULT_EARLY_PART /* Nokia: Set default early part energy correction to unity for BINAURAL_ROOM_REVERB */ #define NONBE_FIX_1174_MCMASA_LBR_LOOP_ERROR /* Nokia: Fix issue 1174 by removing the unnecessary inner loop causing problems. */ +#define NONBE_FIX_1097_SBA_DTX_BRATE_SWITCHING_ENC /* FhG: fix out-of-bound errors when switching from SID frame to active frame*/ + /* #################### End BASOP porting switches ############################ */ diff --git a/lib_enc/ivas_mct_core_enc.c b/lib_enc/ivas_mct_core_enc.c index c378d66dc..afdfe16ca 100644 --- a/lib_enc/ivas_mct_core_enc.c +++ b/lib_enc/ivas_mct_core_enc.c @@ -197,13 +197,27 @@ void ivas_mct_core_enc( int16_t i, cpe_id, n, nAvailBits; int16_t nCPE; float *orig_spectrum[MCT_MAX_CHANNELS][2]; /* Pointers to MDCT output for a short block (L/R) */ +#ifdef NONBE_FIX_1097_SBA_DTX_BRATE_SWITCHING_ENC + float powerSpecMsInv_long_cpe0[CPE_CHANNELS][L_FRAME_PLUS]; + float inv_spectrum_long_cpe0[CPE_CHANNELS][L_FRAME_PLUS]; + float powerSpec_long_cpe0[CPE_CHANNELS][L_FRAME_PLUS]; + float powerSpec_long[MCT_MAX_CHANNELS - CPE_CHANNELS][L_FRAME48k]; + float inv_spectrum_long[MCT_MAX_CHANNELS - CPE_CHANNELS][L_FRAME48k]; /* quantized MDCT spectrum, inv ms mask mdst spectrum, scratch for MS spectra in the MS decision */ + float powerSpecMsInv_long[MCT_MAX_CHANNELS - CPE_CHANNELS][L_FRAME48k]; /* MS inv power spectrum, also inverse MDST spectrum */ +#else float powerSpec[MCT_MAX_CHANNELS][L_FRAME48k]; float powerSpecMsInv_long[MCT_MAX_CHANNELS][L_FRAME48k]; /* MS inv power spectrum, also inverse MDST spectrum */ +#endif +#ifdef NONBE_FIX_1097_SBA_DTX_BRATE_SWITCHING_ENC + float *powerSpec[MCT_MAX_CHANNELS]; +#endif float *powerSpecMsInv[MCT_MAX_CHANNELS][2]; float *inv_mdst_spectrum[MCT_MAX_CHANNELS][2]; float *inv_spectrum[MCT_MAX_CHANNELS][2]; float *mdst_spectrum[MCT_MAX_CHANNELS][2]; +#ifndef NONBE_FIX_1097_SBA_DTX_BRATE_SWITCHING_ENC float inv_spectrum_long[MCT_MAX_CHANNELS][L_FRAME48k]; /* quantized MDCT spectrum, inv ms mask mdst spectrum, scratch for MS spectra in the MS decision */ +#endif int16_t total_side_bits; int16_t chBitRatios[MCT_MAX_CHANNELS]; Encoder_State *sts[MCT_MAX_CHANNELS]; @@ -238,12 +252,29 @@ void ivas_mct_core_enc( nCPE++; } +#ifdef NONBE_FIX_1097_SBA_DTX_BRATE_SWITCHING_ENC + /* point first CPE channels to longer buffers where switching from ACELP to TCX may occur in SBA with DTX (total memory saving)*/ + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + inv_mdst_spectrum[ch][0] = powerSpecMsInv[ch][0] = powerSpecMsInv_long_cpe0[ch]; + inv_mdst_spectrum[ch][1] = powerSpecMsInv[ch][1] = powerSpecMsInv_long_cpe0[ch] + N_TCX10_MAX; + inv_spectrum[ch][0] = inv_spectrum_long_cpe0[ch]; + inv_spectrum[ch][1] = inv_spectrum_long_cpe0[ch] + N_TCX10_MAX; + powerSpec[ch] = powerSpec_long_cpe0[ch]; + } + + for ( ch = CPE_CHANNELS; ch < nChannels; ch++ ) +#else for ( ch = 0; ch < nChannels; ch++ ) +#endif { - inv_mdst_spectrum[ch][0] = powerSpecMsInv[ch][0] = powerSpecMsInv_long[ch]; - inv_mdst_spectrum[ch][1] = powerSpecMsInv[ch][1] = powerSpecMsInv_long[ch] + N_TCX10_MAX; - inv_spectrum[ch][0] = inv_spectrum_long[ch]; - inv_spectrum[ch][1] = inv_spectrum_long[ch] + N_TCX10_MAX; + inv_mdst_spectrum[ch][0] = powerSpecMsInv[ch][0] = powerSpecMsInv_long[ch - CPE_CHANNELS]; + inv_mdst_spectrum[ch][1] = powerSpecMsInv[ch][1] = powerSpecMsInv_long[ch - CPE_CHANNELS] + N_TCX10_MAX; + inv_spectrum[ch][0] = inv_spectrum_long[ch - CPE_CHANNELS]; + inv_spectrum[ch][1] = inv_spectrum_long[ch - CPE_CHANNELS] + N_TCX10_MAX; +#ifdef NONBE_FIX_1097_SBA_DTX_BRATE_SWITCHING_ENC + powerSpec[ch] = powerSpec_long[ch - CPE_CHANNELS]; +#endif } for ( cpe_id = 0, i = 0; cpe_id < nCPE; cpe_id++ ) diff --git a/lib_enc/ivas_mct_enc_mct.c b/lib_enc/ivas_mct_enc_mct.c index d9401d013..8818baf67 100644 --- a/lib_enc/ivas_mct_enc_mct.c +++ b/lib_enc/ivas_mct_enc_mct.c @@ -814,10 +814,14 @@ void write_mct_bitstream( *--------------------------------------------------------------------*/ void mctStereoIGF_enc( - MCT_ENC_HANDLE hMCT, /* i/o: MCT encoder structure */ - Encoder_State **sts, /* i/o: encoder state structure */ - float *orig_spectrum[MCT_MAX_CHANNELS][2], /* i : MDCT spectrum for ITF */ - float powerSpec[MCT_MAX_CHANNELS][L_FRAME48k], /* i/o: MDCT^2 + MDST^2 spectrum,or estimate*/ + MCT_ENC_HANDLE hMCT, /* i/o: MCT encoder structure */ + Encoder_State **sts, /* i/o: encoder state structure */ + float *orig_spectrum[MCT_MAX_CHANNELS][2], /* i : MDCT spectrum for ITF */ +#ifdef NONBE_FIX_1097_SBA_DTX_BRATE_SWITCHING_ENC + float *powerSpec[MCT_MAX_CHANNELS], /* i/o: MDCT^2 + MDST^2 spectrum,or estimate*/ +#else + float powerSpec[MCT_MAX_CHANNELS][L_FRAME48k], /* i/o: MDCT^2 + MDST^2 spectrum,or estimate*/ +#endif float *powerSpecMsInv[MCT_MAX_CHANNELS][NB_DIV], /* i : same as above but for inverse spect.*/ float *inv_spectrum[MCT_MAX_CHANNELS][NB_DIV], /* i : inverse spectrum */ const int16_t sp_aud_decision0[MCT_MAX_CHANNELS] /* i : speech audio decision */ -- GitLab From 9aba2ebf7979740d8bb7207e209ea5a3beeae7c6 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Mon, 18 Aug 2025 20:36:30 +0200 Subject: [PATCH 2/2] proper encapsulation --- lib_enc/ivas_mct_core_enc.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib_enc/ivas_mct_core_enc.c b/lib_enc/ivas_mct_core_enc.c index afdfe16ca..2626cfe09 100644 --- a/lib_enc/ivas_mct_core_enc.c +++ b/lib_enc/ivas_mct_core_enc.c @@ -268,12 +268,17 @@ void ivas_mct_core_enc( for ( ch = 0; ch < nChannels; ch++ ) #endif { +#ifdef NONBE_FIX_1097_SBA_DTX_BRATE_SWITCHING_ENC inv_mdst_spectrum[ch][0] = powerSpecMsInv[ch][0] = powerSpecMsInv_long[ch - CPE_CHANNELS]; inv_mdst_spectrum[ch][1] = powerSpecMsInv[ch][1] = powerSpecMsInv_long[ch - CPE_CHANNELS] + N_TCX10_MAX; inv_spectrum[ch][0] = inv_spectrum_long[ch - CPE_CHANNELS]; inv_spectrum[ch][1] = inv_spectrum_long[ch - CPE_CHANNELS] + N_TCX10_MAX; -#ifdef NONBE_FIX_1097_SBA_DTX_BRATE_SWITCHING_ENC powerSpec[ch] = powerSpec_long[ch - CPE_CHANNELS]; +#else + inv_mdst_spectrum[ch][0] = powerSpecMsInv[ch][0] = powerSpecMsInv_long[ch]; + inv_mdst_spectrum[ch][1] = powerSpecMsInv[ch][1] = powerSpecMsInv_long[ch] + N_TCX10_MAX; + inv_spectrum[ch][0] = inv_spectrum_long[ch]; + inv_spectrum[ch][1] = inv_spectrum_long[ch] + N_TCX10_MAX; #endif } -- GitLab