diff --git a/lib_com/cnst.h b/lib_com/cnst.h index 8c986b363abb499b01f02f4bfdd211ff980e635a..a374b46cfa0546ac3eb4c170abbb1138e410d9ac 100644 --- a/lib_com/cnst.h +++ b/lib_com/cnst.h @@ -1434,7 +1434,12 @@ typedef enum _DCTTYPE #define CHEAP_NORM_SIZE 161 #define CNA_MAX_BRATE ACELP_13k20 -#define MAX_CNA_NBANDS 12 + +#ifdef FIX_I414_OOA_CNA +#define CNA_INIT_NBANDS 6 +#else +#define MAX_CNA_NBANDS 12 +#endif #define GAIN_Q_OFFSET_EVS 60.f #define GAIN_Q_OFFSET_IVAS 45.f diff --git a/lib_com/options.h b/lib_com/options.h index f6cee9d9e1cb46d3516153cc8cc337b433c04913..5b1e9df0929e529d4b18fda05f946f7d340b6015 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -146,6 +146,8 @@ #define FIX_398_MASA_DIRECTION_ALIGNMENT /* Nokia: Issue 398: in 2dir MASA, dynamically adjust directions to be consistent */ #define REND_DEBUGGING_REVISION /* VA: encapsulate rendering debugging options with DEBUGGING */ #define FIX_419_ISM_MD_FIX /* VA: Issue 419: fix the upper value limitation for parameter angle1_diff_cnt */ +#define FIX_I414_OOA_CNA /* VA: Issue 414: Fixing out-of-array write operation in stereo CNA */ + #define SNS_MSVQ /* FhG: contribution 33 - MSVQ for SNS parameters at stereo mid bitrates */ diff --git a/lib_dec/fd_cng_dec.c b/lib_dec/fd_cng_dec.c index cae9b6945fda3e885e521aa57bb21f1246a4f9e9..8a76717541df64d1bbcd7e08841c8cc55d2ed20d 100644 --- a/lib_dec/fd_cng_dec.c +++ b/lib_dec/fd_cng_dec.c @@ -158,8 +158,13 @@ void initFdCngDec( hFdCngDec->cna_ILD_LT = 0.0f; hFdCngDec->first_cna_noise_updated = 0; hFdCngDec->first_cna_noise_update_cnt = 0; +#ifdef FIX_I414_OOA_CNA + hFdCngDec->cna_nbands = CNA_INIT_NBANDS; + mvs2s( cna_init_bands, hFdCngDec->cna_band_limits, CNA_INIT_NBANDS + 1 ); +#else hFdCngDec->cna_nbands = 6; mvs2s( cna_init_bands, hFdCngDec->cna_band_limits, MAX_CNA_NBANDS + 1 ); +#endif hFdCngDec->cna_act_fact = 1.0f; hFdCngDec->cna_rescale_fact = 0.0f; hFdCngDec->cna_seed = 5687; diff --git a/lib_dec/ivas_rom_dec.c b/lib_dec/ivas_rom_dec.c index 78d4eafea1b1674fe291cdfa5026538b71dceb20..66a2bc56639d6ca0a27c77bbc83050c4dfabc9d1 100644 --- a/lib_dec/ivas_rom_dec.c +++ b/lib_dec/ivas_rom_dec.c @@ -226,7 +226,11 @@ const float dft_win_8k[70] = * stereo CNA tables *------------------------------------------------------------------------*/ +#ifdef FIX_I414_OOA_CNA +const int16_t cna_init_bands[CNA_INIT_NBANDS + 1] = +#else const int16_t cna_init_bands[MAX_CNA_NBANDS + 1] = +#endif { 1, 4, 14, 33, 67, 171, 320 }; diff --git a/lib_dec/ivas_rom_dec.h b/lib_dec/ivas_rom_dec.h index 4366077bbb3b45e0367057e36a01ae93c01512a5..95612634b03e2dd582e1c1f8bce209bb120c9732 100644 --- a/lib_dec/ivas_rom_dec.h +++ b/lib_dec/ivas_rom_dec.h @@ -68,7 +68,11 @@ extern const float dft_win232ms_48k[450]; extern const float dft_win_8k[70]; +#ifdef FIX_I414_OOA_CNA +extern const int16_t cna_init_bands[CNA_INIT_NBANDS + 1]; +#else extern const int16_t cna_init_bands[MAX_CNA_NBANDS + 1]; +#endif extern const float min_smooth_gains1[SBA_DIRAC_STEREO_NUM_BANDS]; extern const float max_smooth_gains1[SBA_DIRAC_STEREO_NUM_BANDS]; diff --git a/lib_dec/ivas_stereo_dft_dec.c b/lib_dec/ivas_stereo_dft_dec.c index 1fac575de9ca52f830685283633792f0785bea37..08ca989f3d4a4f4a82ae02805682b96132513da3 100644 --- a/lib_dec/ivas_stereo_dft_dec.c +++ b/lib_dec/ivas_stereo_dft_dec.c @@ -1340,6 +1340,7 @@ void stereo_dft_dec( { g = hStereoDft->g_state[b]; } + /* store side gains from inactive frames for later use by the stereo CNA */ if ( hStereoDft->band_limits[b] < L_FRAME16k && ( hStereoDft->frame_sid_nodata || st0->VAD == 0 ) ) { @@ -1595,7 +1596,11 @@ void stereo_dft_dec( if ( hStereoDft->frame_sid_nodata || st0->VAD == 0 ) { +#ifdef FIX_I414_OOA_CNA + hFdCngDec->cna_band_limits[hFdCngDec->cna_nbands] = hStereoDft->band_limits[hFdCngDec->cna_nbands]; +#else hFdCngDec->cna_band_limits[b] = hStereoDft->band_limits[hFdCngDec->cna_nbands]; +#endif } if ( hStereoDft->frame_sid_nodata && !sba_dirac_stereo_flag ) diff --git a/lib_dec/stat_dec.h b/lib_dec/stat_dec.h index 13fed9573b4368d84ebb555c061e07bc69fb8c29..9d3adbb18193ce2fd2e544a82d52661eb4734214 100644 --- a/lib_dec/stat_dec.h +++ b/lib_dec/stat_dec.h @@ -98,21 +98,30 @@ typedef struct float bandNoiseShape[FFTLEN2]; /* CNG spectral shape computed at the decoder */ float partNoiseShape[NPART]; /* CNG spectral shape computed at the decoder */ - float smoothed_psd[L_FRAME16k]; /* stereo CNA - periodogram smoothed with IIR filter */ - float msPeriodog_ST[NPART_SHAPING]; /* stereo CNA - short-term periodogram */ - int16_t ms_last_inactive_bwidth; /* stereo CNA - bandwidth from the last inactive frame */ - int16_t ms_cnt_bw_up; /* stereo CNA - downward counter of frames since the last NB->WB switch */ - float cna_LR_LT; /* stereo CNA - long-term L/R correlation factor calculated on stereo upmix */ - float cna_ILD_LT; /* stereo CNA - long-term ILD factor calculated on stereo upmix */ - float cna_g_state[STEREO_DFT_BAND_MAX]; /* stereo CNA - side gains from the last inactive frame */ + float smoothed_psd[L_FRAME16k]; /* stereo CNA - periodogram smoothed with IIR filter */ + float msPeriodog_ST[NPART_SHAPING]; /* stereo CNA - short-term periodogram */ + int16_t ms_last_inactive_bwidth; /* stereo CNA - bandwidth from the last inactive frame */ + int16_t ms_cnt_bw_up; /* stereo CNA - downward counter of frames since the last NB->WB switch */ + float cna_LR_LT; /* stereo CNA - long-term L/R correlation factor calculated on stereo upmix */ + float cna_ILD_LT; /* stereo CNA - long-term ILD factor calculated on stereo upmix */ + float cna_g_state[STEREO_DFT_BAND_MAX]; /* stereo CNA - side gains from the last inactive frame */ +#ifdef FIX_I414_OOA_CNA + float cna_cm[STEREO_DFT_BAND_MAX]; /* stereo CNA - coherence from the last inactive frame */ +#else float cna_cm[STEREO_DFT_BAND_MAX + 1]; /* stereo CNA - coherence from the last inactive frame */ - int16_t first_cna_noise_updated; /* stereo CNA - flag indicating that comfort noise has been properly initialized during warmup */ - int16_t first_cna_noise_update_cnt; /* stereo CNA - counter of CN initialization frames */ - int16_t cna_nbands; /* stereo CNA - number of frequency bands used by the CNA in DFT stereo mode */ +#endif + int16_t first_cna_noise_updated; /* stereo CNA - flag indicating that comfort noise has been properly initialized during warmup */ + int16_t first_cna_noise_update_cnt; /* stereo CNA - counter of CN initialization frames */ + int16_t cna_nbands; /* stereo CNA - number of frequency bands used by the CNA in DFT stereo mode */ + +#ifdef FIX_I414_OOA_CNA + int16_t cna_band_limits[STEREO_DFT_BAND_MAX + 1]; /* stereo CNA - band limits used by the CNA in DFT stereo mode */ +#else int16_t cna_band_limits[MAX_CNA_NBANDS + 1]; /* stereo CNA - band limits used by the CNA in DFT stereo mode */ - float cna_act_fact; /* stereo CNA - long-term signal activity factor (0-1) */ - float cna_rescale_fact; /* stereo CNA - CN energy re-scaling factor to maintain decoded energy */ - int16_t cna_seed; /* stereo CNA - seed for random CN generator */ +#endif + float cna_act_fact; /* stereo CNA - long-term signal activity factor (0-1) */ + float cna_rescale_fact; /* stereo CNA - CN energy re-scaling factor to maintain decoded energy */ + int16_t cna_seed; /* stereo CNA - seed for random CN generator */ int16_t flag_dtx_mode; float lp_speech;