diff --git a/lib_com/options.h b/lib_com/options.h index 7f7f959a237b817ae350244832c60f793901af6f..a3ee1266e1575c5fc6ed271fa5e588707433686e 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -107,6 +107,7 @@ #define FIX_1585_ASAN_FORMAT_SW_ALT /* VA,FhG: float issues 1585,1593: alternative fix memory leaks with format switching */ #define FIX_BASOP_2573_RF_MODE_UPDATE /* FhG: BASOP issue 2573: remove duplicated update of rf_mode parameters from evs_enc_fx(); was already done in updt_enc_common_fx() */ #define FIX_2570_BUF_OVFL /* Orange: basop issue 2570: global-buffer-overflow in lib_rend/ivas_objectRenderer_sources_fx.c */ +#define FIX_ISSUE_2586_Q_VALUE /* FhG: basop issue 2586: Q value not updated after value is altered*/ /* #################### End BE switches ################################## */ diff --git a/lib_dec/ivas_stereo_switching_dec_fx.c b/lib_dec/ivas_stereo_switching_dec_fx.c index f0684a3f4a051a9144a67f1c8aeec1f0168985d3..7b94c702b74423890fcc156e5f38b328403fb266 100644 --- a/lib_dec/ivas_stereo_switching_dec_fx.c +++ b/lib_dec/ivas_stereo_switching_dec_fx.c @@ -411,7 +411,7 @@ ivas_error stereo_memory_dec_fx( { delay_comp_DFT = NS2SA_FX2( output_Fs, IVAS_DEC_DELAY_NS - STEREO_DFT32MS_OVL_NS ); /* Q0 */ move16(); - +#ifndef FIX_ISSUE_2586_Q_VALUE /* redressing of the DFT OLA part */ FOR( n = 0; n < CPE_CHANNELS; n++ ) { @@ -423,6 +423,37 @@ ivas_error stereo_memory_dec_fx( // hCPE->output_mem_fx[n][sub(i, delay_comp_DFT)] = hCPE->hStereoDft->win32ms_fx[i_mult(STEREO_DFT32MS_STEP, ( sub(add(sub(hCPE->hStereoDft->dft32ms_ovl, 1), delay_comp_DFT), i) ))]; } } +#else + Word16 exponent_array[STEREO_DFT32MS_OVL_MAX]; + Word32 L_output_buffer[STEREO_DFT32MS_OVL_MAX]; + Word16 max_exponent; + /* redressing of the DFT OLA part */ + FOR( n = 0; n < CPE_CHANNELS; n++ ) + { + max_exponent = -31; + move16(); + FOR( i = delay_comp_DFT; i < hCPE->hStereoDft->dft32ms_ovl; i++ ) + { + div_m = BASOP_Util_Divide3216_Scale( hCPE->output_mem_fx[n][i - delay_comp_DFT], hCPE->hStereoDft->win32ms_fx[STEREO_DFT32MS_STEP * ( hCPE->hStereoDft->dft32ms_ovl - 1 + delay_comp_DFT - i )], &div_e ); // div_e <--> Q(15-div_e) + L_output_buffer[i - delay_comp_DFT] = L_deposit_h( div_m ); // Q(31-div_e) + exponent_array[i - delay_comp_DFT] = div_e; + move16(); + IF( div_m == 0 ) + { + continue; + } + max_exponent = s_max( max_exponent, div_e ); + // hCPE->output_mem_fx[n][sub(i, delay_comp_DFT)] = hCPE->hStereoDft->win32ms_fx[i_mult(STEREO_DFT32MS_STEP, ( sub(add(sub(hCPE->hStereoDft->dft32ms_ovl, 1), delay_comp_DFT), i) ))]; + } + + FOR( i = delay_comp_DFT; i < hCPE->hStereoDft->dft32ms_ovl; i++ ) + { + hCPE->output_mem_fx[n][i - delay_comp_DFT] = L_shr( L_output_buffer[i - delay_comp_DFT], sub( max_exponent, exponent_array[i - delay_comp_DFT] ) ); + move32(); + } + hCPE->q_output_mem_fx[n] = sub( 31, max_exponent ); + } +#endif // !FIX_ISSUE_2586_Q_VALUE IF( hCPE->hCoreCoder[0]->last_core != ACELP_CORE ) {