diff --git a/lib_com/options.h b/lib_com/options.h index 0a966bc252c7252d2a4507c4d4393f63e2ef3c3e..ef37e3e3b04b838c39db76efeac480655bd98697 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -143,7 +143,8 @@ #define BITSTREAM_INDICES_MEMORY /* Don't count memory for bitstream Indice at the encoder - it is a temporary solution for development only */ #endif -#define DISABLE_ADAP_RES_COD_TMP /* temporary fix for IVAS-403, disables adaptive residual coding */ +/*#define DISABLE_ADAP_RES_COD_TMP*/ /* temporary fix for IVAS-403, disables adaptive residual coding */ +#define ADAP_OPT /* Issue 69: optimized the adap algorithm */ /*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ #ifdef IND_LIST_DYN diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index 5ab31a5b473abfe588479c1265133573d707a073..b3a6e6c16b3d39ea81ffc08991bd66a4c4185b8d 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -256,6 +256,9 @@ typedef struct stereo_dft_enc_data_struct float res_cod_NRG_S[STEREO_DFT_BAND_MAX]; float res_cod_SNR_M[STEREO_DFT_BAND_MAX]; float old_snr; +#ifdef ADAP_OPT + int16_t first_frm_flag; /* ADAP first frame flag */ +#endif /* flags and data for adaptive wideband residual coding */ float res_dmx_ratio_lt; /* long term energy ratio between RES and DMX */ diff --git a/lib_enc/ivas_stereo_dft_enc.c b/lib_enc/ivas_stereo_dft_enc.c index e533ff4c4cf7c269b8b560943fa303976cfa519c..014f23ed9f72e40ea0b4072473001cc0bf0113eb 100644 --- a/lib_enc/ivas_stereo_dft_enc.c +++ b/lib_enc/ivas_stereo_dft_enc.c @@ -508,6 +508,10 @@ void stereo_dft_enc_reset( hStereoDft->hItd->prev_itd1 = 0; hStereoDft->hItd->prev_itd2 = 0; +#ifdef ADAP_OPT + hStereoDft->first_frm_flag = 1; +#endif + #ifdef DEBUG_MODE_DFT hStereoDft->verbose = 1; #endif @@ -1648,7 +1652,11 @@ void stereo_dft_enc_process( { stereo_dft_enc_get_res_cod_mode_flag( hStereoDft, res_nrg_all_curr, dmx_nrg_all_curr, &res_dmx_ratio, &frame_nrg_ratio ); +#ifdef ADAP_OPT + if ( hStereoDft->res_cod_sw_flag ) +#else if ( hStereoDft->res_cod_mode[k_offset] == STEREO_DFT_RES_COD_OFF || hStereoDft->res_cod_sw_flag ) +#endif { int16_t res_cod_band_max; @@ -1749,6 +1757,16 @@ static void stereo_dft_enc_get_res_cod_mode_flag( } /* Calculate long term energy ratio between residual signal and downmix signal */ +#ifdef ADAP_OPT + if ( fast_update_flag ) + { + hStereoDft->res_dmx_ratio_lt = *res_dmx_ratio * 0.2f + hStereoDft->res_dmx_ratio_lt * 0.8f; + } + else + { + hStereoDft->res_dmx_ratio_lt = *res_dmx_ratio * 0.05f + hStereoDft->res_dmx_ratio_lt * 0.95f; + } +#else if ( fast_update_flag ) { hStereoDft->res_dmx_ratio_lt = *res_dmx_ratio * 0.5f + hStereoDft->res_dmx_ratio_lt * 0.5f; @@ -1757,9 +1775,14 @@ static void stereo_dft_enc_get_res_cod_mode_flag( { hStereoDft->res_dmx_ratio_lt = *res_dmx_ratio * 0.1f + hStereoDft->res_dmx_ratio_lt * 0.9f; } +#endif /*Get the residual signal coding initial flag */ +#ifdef ADAP_OPT + if ( hStereoDft->res_dmx_ratio_lt > 0.01f ) +#else if ( hStereoDft->res_dmx_ratio_lt > 0.075f ) +#endif { res_cod_mode_flag = 1; } @@ -1769,12 +1792,28 @@ static void stereo_dft_enc_get_res_cod_mode_flag( } /* Get the residual signal coding flag */ +#ifdef ADAP_OPT + if ( hStereoDft->first_frm_flag ) + { + prev_res_cod_mode_flag = res_cod_mode_flag; + hStereoDft->first_frm_flag = 0; + } + else + { + prev_res_cod_mode_flag = hStereoDft->res_cod_mode[STEREO_DFT_OFFSET - 1]; + } +#else prev_res_cod_mode_flag = hStereoDft->res_cod_mode[STEREO_DFT_OFFSET - 1]; +#endif if ( res_cod_mode_flag != prev_res_cod_mode_flag ) { if ( prev_res_cod_mode_flag == 1 ) { +#ifdef ADAP_OPT + if ( hStereoDft->hangover_cnt0 < 5 && hStereoDft->last_res_cod_mode_modify_flag == 0 && fast_update_flag == 0 ) +#else if ( hStereoDft->hangover_cnt0 < 3 && hStereoDft->last_res_cod_mode_modify_flag == 0 && fast_update_flag == 0 ) +#endif { res_cod_mode_flag = prev_res_cod_mode_flag; hStereoDft->hangover_cnt0++; @@ -1794,7 +1833,11 @@ static void stereo_dft_enc_get_res_cod_mode_flag( } else { +#ifdef ADAP_OPT + if ( hStereoDft->hangover_cnt1 < 5 ) +#else if ( hStereoDft->hangover_cnt1 < 3 ) +#endif { res_cod_mode_flag = prev_res_cod_mode_flag; hStereoDft->hangover_cnt1++;