From 40da2feb7227643fea0fc827557645a5b995d4bc Mon Sep 17 00:00:00 2001 From: rtyag Date: Tue, 7 Nov 2023 19:16:18 +1100 Subject: [PATCH 01/13] fix for issue 862 --- lib_com/options.h | 2 +- lib_dec/ivas_corecoder_dec_reconfig.c | 13 +++++++++++++ lib_dec/ivas_spar_md_dec.c | 10 ++++++++-- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 7b61ed4b4a..09c1a00678 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -167,7 +167,7 @@ #define NONBE_FIX_856_TCX_LTP_SYNTH_FILTER /* FhG: issue 856: correct filtering length for tcx-ltp synth filtering*/ #define NONBE_UNIFIED_DECODING_PATHS /* FhG: unify decoding paths */ #define NONBE_FIX_874_OMASA_BRSW_2TD /* Nokia: issue 874: Fixes the crashes with the long test vectors that prompted switching to TD*/ - +#define NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC /* DLB: issue 862 : UBSAN: out-of-bound error in SPAR for OSBA bitrate switching with PLC*/ /* ##################### End NON-BE switches ########################### */ /* ################## End DEVELOPMENT switches ######################### */ diff --git a/lib_dec/ivas_corecoder_dec_reconfig.c b/lib_dec/ivas_corecoder_dec_reconfig.c index 3d965ae036..f81f4d4237 100644 --- a/lib_dec/ivas_corecoder_dec_reconfig.c +++ b/lib_dec/ivas_corecoder_dec_reconfig.c @@ -64,6 +64,10 @@ ivas_error ivas_corecoder_dec_reconfig( MC_MODE last_mc_mode; DECODER_CONFIG_HANDLE hDecoderConfig; ivas_error error; +#ifdef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC + int16_t prev_bfi; + Decoder_State *st0; +#endif /*-----------------------------------------------------------------* * Initialization @@ -141,6 +145,10 @@ ivas_error ivas_corecoder_dec_reconfig( } else { +#ifdef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC + st0 = ( nSCE_old > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0] : st_ivas->hCPE[0]->hCoreCoder[0]; + prev_bfi = st0->prev_bfi; +#endif nSCE_existing = min( nSCE_old, st_ivas->nSCE ); nCPE_existing = min( nCPE_old, st_ivas->nCPE ); @@ -293,6 +301,11 @@ ivas_error ivas_corecoder_dec_reconfig( st_ivas->hCPE[0]->hCoreCoder[n]->mct_chan_mode = MCT_CHAN_MODE_REGULAR; } } + +#ifdef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC + st0 = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0] : st_ivas->hCPE[0]->hCoreCoder[0]; + st0->prev_bfi = prev_bfi; +#endif } /* create dummy CPE element for DFT stereo-like upmix */ diff --git a/lib_dec/ivas_spar_md_dec.c b/lib_dec/ivas_spar_md_dec.c index fd232b1b0c..c84292ca12 100644 --- a/lib_dec/ivas_spar_md_dec.c +++ b/lib_dec/ivas_spar_md_dec.c @@ -1645,8 +1645,14 @@ static void ivas_spar_dec_parse_md_bs( do_diff[i] = ( ( ( i + 1 ) & 3 ) != strat - 4 ); do_repeat[i] = 0; } - - ivas_map_prior_coeffs_quant( &hMdDec->spar_md_prev, &hMdDec->spar_md_cfg, qsi, *nB ); +#ifdef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC + if ( st0->prev_bfi == 0 ) + { +#endif + ivas_map_prior_coeffs_quant( &hMdDec->spar_md_prev, &hMdDec->spar_md_cfg, qsi, *nB ); +#ifdef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC + } +#endif } #ifdef SPAR_HOA_DBG fprintf( stdout, "\n\n no_ec = %d, strat = %d\n", no_ec, strat ); -- GitLab From 94d47204771d4c43f52953e9cce374251c180657 Mon Sep 17 00:00:00 2001 From: rtyag Date: Thu, 9 Nov 2023 14:15:12 +1100 Subject: [PATCH 02/13] BE change around bands bw logic --- lib_dec/ivas_corecoder_dec_reconfig.c | 13 --- lib_dec/ivas_spar_md_dec.c | 140 ++++++++++++++++++++++++-- lib_dec/ivas_stat_dec.h | 6 +- 3 files changed, 136 insertions(+), 23 deletions(-) diff --git a/lib_dec/ivas_corecoder_dec_reconfig.c b/lib_dec/ivas_corecoder_dec_reconfig.c index f81f4d4237..3d965ae036 100644 --- a/lib_dec/ivas_corecoder_dec_reconfig.c +++ b/lib_dec/ivas_corecoder_dec_reconfig.c @@ -64,10 +64,6 @@ ivas_error ivas_corecoder_dec_reconfig( MC_MODE last_mc_mode; DECODER_CONFIG_HANDLE hDecoderConfig; ivas_error error; -#ifdef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC - int16_t prev_bfi; - Decoder_State *st0; -#endif /*-----------------------------------------------------------------* * Initialization @@ -145,10 +141,6 @@ ivas_error ivas_corecoder_dec_reconfig( } else { -#ifdef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC - st0 = ( nSCE_old > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0] : st_ivas->hCPE[0]->hCoreCoder[0]; - prev_bfi = st0->prev_bfi; -#endif nSCE_existing = min( nSCE_old, st_ivas->nSCE ); nCPE_existing = min( nCPE_old, st_ivas->nCPE ); @@ -301,11 +293,6 @@ ivas_error ivas_corecoder_dec_reconfig( st_ivas->hCPE[0]->hCoreCoder[n]->mct_chan_mode = MCT_CHAN_MODE_REGULAR; } } - -#ifdef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC - st0 = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0] : st_ivas->hCPE[0]->hCoreCoder[0]; - st0->prev_bfi = prev_bfi; -#endif } /* create dummy CPE element for DFT stereo-like upmix */ diff --git a/lib_dec/ivas_spar_md_dec.c b/lib_dec/ivas_spar_md_dec.c index c84292ca12..e3ad30d608 100644 --- a/lib_dec/ivas_spar_md_dec.c +++ b/lib_dec/ivas_spar_md_dec.c @@ -82,7 +82,12 @@ static void ivas_parse_parameter_bitstream_dtx( ivas_spar_md_t *pSpar_md, Decode static ivas_error ivas_deindex_real_index( const int16_t *index, const int16_t q_levels, const float min_value, const float max_value, float *quant, const int16_t num_ch_dim2 ); -static void ivas_spar_dec_parse_md_bs( ivas_spar_md_dec_state_t *hMdDec, Decoder_State *st, int16_t *nB, int16_t *bands_bw, int16_t *dtx_vad, const int32_t ivas_total_brate, const int16_t sba_inactive_mode, const int32_t last_active_brate ); +static void ivas_spar_dec_parse_md_bs( ivas_spar_md_dec_state_t *hMdDec, Decoder_State *st, int16_t *nB, int16_t *bands_bw, int16_t *dtx_vad, const int32_t ivas_total_brate, const int16_t sba_inactive_mode +#ifndef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC + , + const int32_t last_active_brate +#endif +); /*------------------------------------------------------------------------- @@ -103,6 +108,12 @@ ivas_error ivas_spar_md_dec_matrix_open( { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for band_coeffs in SPAR MD" ); } +#ifdef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC + if ( ( hMdDec->band_coeffs_prev = (ivas_band_coeffs_t *) malloc( IVAS_MAX_NUM_BANDS * sizeof( ivas_band_coeffs_t ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for band_coeffs in SPAR MD" ); + } +#endif if ( ( hMdDec->mixer_mat = (float ***) malloc( num_channels * sizeof( float ** ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); @@ -365,6 +376,13 @@ void ivas_spar_md_dec_matrix_close( free( hMdDecoder->spar_md.band_coeffs ); hMdDecoder->spar_md.band_coeffs = NULL; } +#ifdef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC + if ( hMdDecoder->band_coeffs_prev != NULL ) + { + free( hMdDecoder->band_coeffs_prev ); + hMdDecoder->band_coeffs_prev = NULL; + } +#endif if ( hMdDecoder->mixer_mat != NULL ) { @@ -543,11 +561,17 @@ ivas_error ivas_spar_md_dec_init( /* initialize PLC state */ set_s( hMdDec->valid_bands, 0, IVAS_MAX_NUM_BANDS ); set_s( hMdDec->base_band_age, 0, IVAS_MAX_NUM_BANDS ); +#ifdef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC + set_s( hMdDec->base_band_coeffs_age, 0, IVAS_MAX_NUM_BANDS ); +#endif hMdDec->spar_plc_num_lost_frames = 0; hMdDec->spar_plc_enable_fadeout_flag = 1; hMdDec->dtx_md_smoothing_cntr = 1; ivas_clear_band_coeffs( hMdDec->spar_md.band_coeffs, IVAS_MAX_NUM_BANDS ); +#ifdef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC + ivas_clear_band_coeffs( hMdDec->band_coeffs_prev, IVAS_MAX_NUM_BANDS ); +#endif ivas_clear_band_coeff_idx( hMdDec->spar_md.band_coeffs_idx, IVAS_MAX_NUM_BANDS ); ivas_clear_band_coeff_idx( hMdDec->spar_md_prev.band_coeffs_idx, IVAS_MAX_NUM_BANDS ); ivas_clear_band_coeff_idx( hMdDec->spar_md_prev.band_coeffs_idx_mapped, IVAS_MAX_NUM_BANDS ); @@ -571,6 +595,9 @@ ivas_error ivas_spar_md_dec_init( set_zero( hMdDec->mixer_mat_prev2[i][j], IVAS_MAX_NUM_BANDS ); } } +#ifdef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC + hMdDec->first_valid_frame = 0; +#endif return IVAS_ERR_OK; } @@ -752,7 +779,17 @@ void ivas_spar_md_dec_process( } ivas_spar_dec_parse_md_bs( hMdDec, st0, &nB, &bw, &dtx_vad, st_ivas->hDecoderConfig->ivas_total_brate, - st_ivas->hQMetaData->sba_inactive_mode, st_ivas->last_active_ivas_total_brate ); + st_ivas->hQMetaData->sba_inactive_mode +#ifndef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC + , + st_ivas->last_active_ivas_total_brate +#endif + ); + +#ifdef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC + assert( nB == hMdDec->spar_md.num_bands ); + assert( bw == 1 ); +#endif ivas_dec_mono_sba_handling( st_ivas ); @@ -763,11 +800,13 @@ void ivas_spar_md_dec_process( } /* set correct number of bands*/ +#ifndef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC nB = IVAS_MAX_NUM_BANDS; if ( bw == IVAS_RED_BAND_FACT ) { nB = nB >> 1; } +#endif #ifdef DEBUG_LBR_SBA /* Dumping SPAR Coefficients */ char f_name[100]; @@ -840,6 +879,7 @@ void ivas_spar_md_dec_process( fprintf( fid, "%.6f\n", hMdDec->mixer_mat[1][0][band] ); } #endif +#ifndef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC if ( bw == IVAS_RED_BAND_FACT ) { nB = nB << 1; @@ -849,9 +889,10 @@ void ivas_spar_md_dec_process( { hMdDec->valid_bands[b] = 1; } - +#endif ivas_spar_md_fill_invalid_bands( &hMdDec->spar_coeffs, &hMdDec->spar_coeffs_prev, &hMdDec->valid_bands[0], &hMdDec->base_band_age[0], num_bands_out, num_md_chs, num_md_sub_frames ); + hMdDec->dtx_md_smoothing_cntr = 1; return; @@ -1461,6 +1502,49 @@ void ivas_spar_dec_gen_umx_mat( return; } +#ifdef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC +static void ivas_spar_md_band_upmix( + ivas_band_coeffs_t *band_coeffs, + int16_t *nB, + int16_t *bands_bw, + int16_t *valid_bands, + int16_t bw_final, + int16_t ndec, + int16_t ndm ) +{ + int16_t i, ii, jj, b, idx, bw_fact; + + bw_fact = *bands_bw / bw_final; + for ( i = *nB - 1; i >= 0; i-- ) + { + + for ( b = bw_fact - 1; b >= 0; b-- ) + { + idx = i * bw_fact + b; + for ( ii = 0; ii < ndec + ndm - 1; ii++ ) + { + band_coeffs[idx].pred_re[ii] = band_coeffs[i].pred_re[ii]; + } + for ( ii = 0; ii < ndec; ii++ ) + { + for ( jj = 0; jj < ndm - 1; jj++ ) + { + band_coeffs[idx].C_re[ii][jj] = band_coeffs[i].C_re[ii][jj]; + } + } + for ( jj = 0; jj < ndec; jj++ ) + { + band_coeffs[idx].P_re[jj] = band_coeffs[i].P_re[jj]; + } + valid_bands[idx] = valid_bands[i]; + } + } + *nB = ( *nB ) * ( *bands_bw ) / bw_final; + *bands_bw = bw_final; + + return; +} +#endif /*-----------------------------------------------------------------------------------------* * Function ivas_spar_dec_parse_md_bs() @@ -1475,19 +1559,29 @@ static void ivas_spar_dec_parse_md_bs( int16_t *bands_bw, int16_t *dtx_vad, const int32_t ivas_total_brate, - const int16_t sba_inactive_mode, - const int32_t last_active_brate ) + const int16_t sba_inactive_mode +#ifndef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC + , + const int32_t last_active_brate +#endif +) { int16_t i, j, k, num_bands; +#ifndef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC int16_t ii, jj, ndec, ndm, b, idx; +#else + int16_t ii, jj, ndec, ndm; +#endif uint16_t qsi; ivas_quant_strat_t qs; int16_t strat, no_ec; int16_t do_diff[IVAS_MAX_NUM_BANDS]; float quant[IVAS_SPAR_MAX_C_COEFF]; int16_t do_repeat[IVAS_MAX_NUM_BANDS]; +#ifndef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC int16_t bw_final, bw_fact; int32_t active_brate; +#endif *dtx_vad = 1; *bands_bw = 1; qsi = 0; @@ -1559,6 +1653,19 @@ static void ivas_spar_dec_parse_md_bs( ivas_parse_parameter_bitstream_dtx( &hMdDec->spar_md, st0, *bands_bw, *nB, hMdDec->spar_md_cfg.num_dmx_chans_per_band, hMdDec->spar_md_cfg.num_decorr_per_band ); +#ifdef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC + ndec = hMdDec->spar_md_cfg.num_decorr_per_band[0]; + ndm = hMdDec->spar_md_cfg.num_dmx_chans_per_band[0]; + ivas_spar_md_band_upmix( + hMdDec->spar_md.band_coeffs, + nB, + bands_bw, + hMdDec->valid_bands, + 1, + ndec, + ndm ); + +#else active_brate = ( ivas_total_brate > IVAS_SID_5k2 ) ? ivas_total_brate : last_active_brate; if ( active_brate >= IVAS_24k4 ) @@ -1593,7 +1700,7 @@ static void ivas_spar_dec_parse_md_bs( *bands_bw = bw_final; *nB = num_bands / bw_final; - +#endif return; } @@ -1646,7 +1753,7 @@ static void ivas_spar_dec_parse_md_bs( do_repeat[i] = 0; } #ifdef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC - if ( st0->prev_bfi == 0 ) + if ( hMdDec->spar_md_cfg.prev_quant_idx >= 0 ) { #endif ivas_map_prior_coeffs_quant( &hMdDec->spar_md_prev, &hMdDec->spar_md_cfg, qsi, *nB ); @@ -1712,13 +1819,30 @@ static void ivas_spar_dec_parse_md_bs( { hMdDec->spar_md_prev.band_coeffs_idx[i].decd_index_re[j] = hMdDec->spar_md.band_coeffs_idx[i].decd_index_re[j]; } +#ifndef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC hMdDec->valid_bands[*bands_bw * i] |= ( do_diff[i] == 0 && do_repeat[i] == 0 ) ? 1 : 0; for ( j = 1; j < *bands_bw; j++ ) { hMdDec->valid_bands[*bands_bw * i + j] = hMdDec->valid_bands[*bands_bw * i]; } +#else + hMdDec->valid_bands[i] |= ( do_diff[i] == 0 && do_repeat[i] == 0 ) ? 1 : 0; +#endif } +#ifdef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC + ndec = hMdDec->spar_md_cfg.num_decorr_per_band[0]; + ndm = hMdDec->spar_md_cfg.num_dmx_chans_per_band[0]; + ivas_spar_md_band_upmix( + hMdDec->spar_md.band_coeffs, + nB, + bands_bw, + hMdDec->valid_bands, + 1, + ndec, + ndm ); +#endif + return; } @@ -1997,7 +2121,6 @@ static void ivas_decode_huffman_bs( * Fill invalid bands in interpolation/extrapolation of valid bands * when PLC is to be done with partial time differential coding *-----------------------------------------------------------------------------------------*/ - static void ivas_spar_md_fill_invalid_bands( ivas_spar_dec_matrices_t *pSpar_coeffs, ivas_spar_dec_matrices_t *pSpar_coeffs_prev, @@ -2111,7 +2234,6 @@ static void ivas_spar_md_fill_invalid_bands( return; } - /*-----------------------------------------------------------------------------------------* * Function ivas_spar_dec_compute_ramp_down_post_matrix() * diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index 4b0135f3af..394e4c6bdc 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -603,7 +603,11 @@ typedef struct ivas_spar_md_dec_state_t float smooth_buf[IVAS_MAX_NUM_BANDS][2 * SBA_DIRAC_NRG_SMOOTH_LONG + 1]; float smooth_fac[IVAS_MAX_NUM_BANDS]; float mixer_mat_prev2[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS]; - +#ifdef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC + int16_t first_valid_frame; + ivas_band_coeffs_t *band_coeffs_prev; + int16_t base_band_coeffs_age[IVAS_MAX_NUM_BANDS]; +#endif } ivas_spar_md_dec_state_t; -- GitLab From 144580638b8c755c4dea3e3896f33ddf62e13b1d Mon Sep 17 00:00:00 2001 From: rtyag Date: Thu, 9 Nov 2023 14:59:40 +1100 Subject: [PATCH 03/13] fix for nB value --- lib_dec/ivas_spar_md_dec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/ivas_spar_md_dec.c b/lib_dec/ivas_spar_md_dec.c index e3ad30d608..6c488adec0 100644 --- a/lib_dec/ivas_spar_md_dec.c +++ b/lib_dec/ivas_spar_md_dec.c @@ -800,8 +800,8 @@ void ivas_spar_md_dec_process( } /* set correct number of bands*/ -#ifndef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC nB = IVAS_MAX_NUM_BANDS; +#ifndef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC if ( bw == IVAS_RED_BAND_FACT ) { nB = nB >> 1; -- GitLab From bda39c5508127769ced88c7166bfb6133c1a8617 Mon Sep 17 00:00:00 2001 From: rtyag Date: Thu, 9 Nov 2023 15:25:27 +1100 Subject: [PATCH 04/13] reverting SAN fix temporarily --- lib_dec/ivas_spar_md_dec.c | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/lib_dec/ivas_spar_md_dec.c b/lib_dec/ivas_spar_md_dec.c index 6c488adec0..7104bcb876 100644 --- a/lib_dec/ivas_spar_md_dec.c +++ b/lib_dec/ivas_spar_md_dec.c @@ -1752,14 +1752,7 @@ static void ivas_spar_dec_parse_md_bs( do_diff[i] = ( ( ( i + 1 ) & 3 ) != strat - 4 ); do_repeat[i] = 0; } -#ifdef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC - if ( hMdDec->spar_md_cfg.prev_quant_idx >= 0 ) - { -#endif - ivas_map_prior_coeffs_quant( &hMdDec->spar_md_prev, &hMdDec->spar_md_cfg, qsi, *nB ); -#ifdef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC - } -#endif + ivas_map_prior_coeffs_quant( &hMdDec->spar_md_prev, &hMdDec->spar_md_cfg, qsi, *nB ); } #ifdef SPAR_HOA_DBG fprintf( stdout, "\n\n no_ec = %d, strat = %d\n", no_ec, strat ); -- GitLab From 14b35e4f640a2246f8f4fc4196b2467625b305a9 Mon Sep 17 00:00:00 2001 From: rtyag Date: Fri, 10 Nov 2023 16:49:57 +1100 Subject: [PATCH 05/13] do Bands bw adjustment if needed --- lib_dec/ivas_spar_md_dec.c | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/lib_dec/ivas_spar_md_dec.c b/lib_dec/ivas_spar_md_dec.c index 7104bcb876..e9ab152e6d 100644 --- a/lib_dec/ivas_spar_md_dec.c +++ b/lib_dec/ivas_spar_md_dec.c @@ -1654,16 +1654,19 @@ static void ivas_spar_dec_parse_md_bs( ivas_parse_parameter_bitstream_dtx( &hMdDec->spar_md, st0, *bands_bw, *nB, hMdDec->spar_md_cfg.num_dmx_chans_per_band, hMdDec->spar_md_cfg.num_decorr_per_band ); #ifdef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC - ndec = hMdDec->spar_md_cfg.num_decorr_per_band[0]; - ndm = hMdDec->spar_md_cfg.num_dmx_chans_per_band[0]; - ivas_spar_md_band_upmix( - hMdDec->spar_md.band_coeffs, - nB, - bands_bw, - hMdDec->valid_bands, - 1, - ndec, - ndm ); + if ( *bands_bw != 1 ) + { + ndec = hMdDec->spar_md_cfg.num_decorr_per_band[0]; + ndm = hMdDec->spar_md_cfg.num_dmx_chans_per_band[0]; + ivas_spar_md_band_upmix( + hMdDec->spar_md.band_coeffs, + nB, + bands_bw, + hMdDec->valid_bands, + 1, + ndec, + ndm ); + } #else active_brate = ( ivas_total_brate > IVAS_SID_5k2 ) ? ivas_total_brate : last_active_brate; -- GitLab From a09f578ba164b6518f85db7942467398642538e6 Mon Sep 17 00:00:00 2001 From: rtyag Date: Mon, 13 Nov 2023 10:49:45 +1100 Subject: [PATCH 06/13] limit band upmixing to cases when band bw is not equal to 1 --- lib_dec/ivas_spar_md_dec.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/lib_dec/ivas_spar_md_dec.c b/lib_dec/ivas_spar_md_dec.c index e9ab152e6d..c33669a397 100644 --- a/lib_dec/ivas_spar_md_dec.c +++ b/lib_dec/ivas_spar_md_dec.c @@ -1829,14 +1829,18 @@ static void ivas_spar_dec_parse_md_bs( #ifdef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC ndec = hMdDec->spar_md_cfg.num_decorr_per_band[0]; ndm = hMdDec->spar_md_cfg.num_dmx_chans_per_band[0]; - ivas_spar_md_band_upmix( - hMdDec->spar_md.band_coeffs, - nB, - bands_bw, - hMdDec->valid_bands, - 1, - ndec, - ndm ); + if ( *bands_bw != 1 ) + { + ivas_spar_md_band_upmix( + hMdDec->spar_md.band_coeffs, + nB, + bands_bw, + hMdDec->valid_bands, + 1, + ndec, + ndm ); + } + #endif return; -- GitLab From 9d18c11e6d52c4bc7fb579a3ac0c564a05376e72 Mon Sep 17 00:00:00 2001 From: rtyag Date: Mon, 13 Nov 2023 12:08:19 +1100 Subject: [PATCH 07/13] disable ubsan switch --- lib_com/options.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index c634f9e8d1..235bfc441a 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -165,7 +165,7 @@ #define NONBE_FIX_871_ACELP_CRASH_IN_OSBA /* FhG: isse 871: crash in ACELP core encoder with OSBA */ #define NONBE_FIX_225_MASA_EXT_REND /* Nokia: Resolve #225: Complete MASA external renderer implementation */ #define NONBE_FIX_897_USAN_WITH_MASA_RENDERING /* Nokia: issue #897: USAN null pointer in MASA external renderer to Ambisonics */ -#define NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC /* DLB: issue 862 : UBSAN: out-of-bound error in SPAR for OSBA bitrate switching with PLC*/ +//#define NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC /* DLB: issue 862 : UBSAN: out-of-bound error in SPAR for OSBA bitrate switching with PLC*/ /* ##################### End NON-BE switches ########################### */ /* ################## End DEVELOPMENT switches ######################### */ -- GitLab From c141724e4084a0775abdf5550893e93aa7f153f9 Mon Sep 17 00:00:00 2001 From: rtyag Date: Mon, 13 Nov 2023 15:14:30 +1100 Subject: [PATCH 08/13] remove unnecessary memory allocation --- lib_com/options.h | 2 +- lib_dec/ivas_spar_md_dec.c | 22 ---------------------- lib_dec/ivas_stat_dec.h | 5 ----- 3 files changed, 1 insertion(+), 28 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 235bfc441a..c634f9e8d1 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -165,7 +165,7 @@ #define NONBE_FIX_871_ACELP_CRASH_IN_OSBA /* FhG: isse 871: crash in ACELP core encoder with OSBA */ #define NONBE_FIX_225_MASA_EXT_REND /* Nokia: Resolve #225: Complete MASA external renderer implementation */ #define NONBE_FIX_897_USAN_WITH_MASA_RENDERING /* Nokia: issue #897: USAN null pointer in MASA external renderer to Ambisonics */ -//#define NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC /* DLB: issue 862 : UBSAN: out-of-bound error in SPAR for OSBA bitrate switching with PLC*/ +#define NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC /* DLB: issue 862 : UBSAN: out-of-bound error in SPAR for OSBA bitrate switching with PLC*/ /* ##################### End NON-BE switches ########################### */ /* ################## End DEVELOPMENT switches ######################### */ diff --git a/lib_dec/ivas_spar_md_dec.c b/lib_dec/ivas_spar_md_dec.c index c33669a397..014221d2b7 100644 --- a/lib_dec/ivas_spar_md_dec.c +++ b/lib_dec/ivas_spar_md_dec.c @@ -108,12 +108,6 @@ ivas_error ivas_spar_md_dec_matrix_open( { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for band_coeffs in SPAR MD" ); } -#ifdef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC - if ( ( hMdDec->band_coeffs_prev = (ivas_band_coeffs_t *) malloc( IVAS_MAX_NUM_BANDS * sizeof( ivas_band_coeffs_t ) ) ) == NULL ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for band_coeffs in SPAR MD" ); - } -#endif if ( ( hMdDec->mixer_mat = (float ***) malloc( num_channels * sizeof( float ** ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); @@ -376,13 +370,6 @@ void ivas_spar_md_dec_matrix_close( free( hMdDecoder->spar_md.band_coeffs ); hMdDecoder->spar_md.band_coeffs = NULL; } -#ifdef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC - if ( hMdDecoder->band_coeffs_prev != NULL ) - { - free( hMdDecoder->band_coeffs_prev ); - hMdDecoder->band_coeffs_prev = NULL; - } -#endif if ( hMdDecoder->mixer_mat != NULL ) { @@ -561,17 +548,11 @@ ivas_error ivas_spar_md_dec_init( /* initialize PLC state */ set_s( hMdDec->valid_bands, 0, IVAS_MAX_NUM_BANDS ); set_s( hMdDec->base_band_age, 0, IVAS_MAX_NUM_BANDS ); -#ifdef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC - set_s( hMdDec->base_band_coeffs_age, 0, IVAS_MAX_NUM_BANDS ); -#endif hMdDec->spar_plc_num_lost_frames = 0; hMdDec->spar_plc_enable_fadeout_flag = 1; hMdDec->dtx_md_smoothing_cntr = 1; ivas_clear_band_coeffs( hMdDec->spar_md.band_coeffs, IVAS_MAX_NUM_BANDS ); -#ifdef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC - ivas_clear_band_coeffs( hMdDec->band_coeffs_prev, IVAS_MAX_NUM_BANDS ); -#endif ivas_clear_band_coeff_idx( hMdDec->spar_md.band_coeffs_idx, IVAS_MAX_NUM_BANDS ); ivas_clear_band_coeff_idx( hMdDec->spar_md_prev.band_coeffs_idx, IVAS_MAX_NUM_BANDS ); ivas_clear_band_coeff_idx( hMdDec->spar_md_prev.band_coeffs_idx_mapped, IVAS_MAX_NUM_BANDS ); @@ -595,9 +576,6 @@ ivas_error ivas_spar_md_dec_init( set_zero( hMdDec->mixer_mat_prev2[i][j], IVAS_MAX_NUM_BANDS ); } } -#ifdef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC - hMdDec->first_valid_frame = 0; -#endif return IVAS_ERR_OK; } diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index 394e4c6bdc..4da5526676 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -603,11 +603,6 @@ typedef struct ivas_spar_md_dec_state_t float smooth_buf[IVAS_MAX_NUM_BANDS][2 * SBA_DIRAC_NRG_SMOOTH_LONG + 1]; float smooth_fac[IVAS_MAX_NUM_BANDS]; float mixer_mat_prev2[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS]; -#ifdef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC - int16_t first_valid_frame; - ivas_band_coeffs_t *band_coeffs_prev; - int16_t base_band_coeffs_age[IVAS_MAX_NUM_BANDS]; -#endif } ivas_spar_md_dec_state_t; -- GitLab From ce32390f10605209370d61d2faf98caae15f702f Mon Sep 17 00:00:00 2001 From: rtyag Date: Tue, 14 Nov 2023 18:01:04 +1100 Subject: [PATCH 09/13] fix for quantization mapping, mono det during PLC and TD coding --- lib_dec/ivas_corecoder_dec_reconfig.c | 13 +++ lib_dec/ivas_spar_md_dec.c | 161 +++++++++++++++++++++++++- lib_dec/ivas_stat_dec.h | 5 + 3 files changed, 178 insertions(+), 1 deletion(-) diff --git a/lib_dec/ivas_corecoder_dec_reconfig.c b/lib_dec/ivas_corecoder_dec_reconfig.c index 3d965ae036..f81f4d4237 100644 --- a/lib_dec/ivas_corecoder_dec_reconfig.c +++ b/lib_dec/ivas_corecoder_dec_reconfig.c @@ -64,6 +64,10 @@ ivas_error ivas_corecoder_dec_reconfig( MC_MODE last_mc_mode; DECODER_CONFIG_HANDLE hDecoderConfig; ivas_error error; +#ifdef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC + int16_t prev_bfi; + Decoder_State *st0; +#endif /*-----------------------------------------------------------------* * Initialization @@ -141,6 +145,10 @@ ivas_error ivas_corecoder_dec_reconfig( } else { +#ifdef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC + st0 = ( nSCE_old > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0] : st_ivas->hCPE[0]->hCoreCoder[0]; + prev_bfi = st0->prev_bfi; +#endif nSCE_existing = min( nSCE_old, st_ivas->nSCE ); nCPE_existing = min( nCPE_old, st_ivas->nCPE ); @@ -293,6 +301,11 @@ ivas_error ivas_corecoder_dec_reconfig( st_ivas->hCPE[0]->hCoreCoder[n]->mct_chan_mode = MCT_CHAN_MODE_REGULAR; } } + +#ifdef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC + st0 = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0] : st_ivas->hCPE[0]->hCoreCoder[0]; + st0->prev_bfi = prev_bfi; +#endif } /* create dummy CPE element for DFT stereo-like upmix */ diff --git a/lib_dec/ivas_spar_md_dec.c b/lib_dec/ivas_spar_md_dec.c index 014221d2b7..cb459923fb 100644 --- a/lib_dec/ivas_spar_md_dec.c +++ b/lib_dec/ivas_spar_md_dec.c @@ -76,6 +76,9 @@ static void ivas_spar_dec_compute_ramp_down_post_matrix( ivas_spar_md_dec_state_ static void ivas_spar_md_fill_invalid_bands( ivas_spar_dec_matrices_t *pSpar_coeffs, ivas_spar_dec_matrices_t *pSpar_coeffs_prev, const int16_t *valid_bands, int16_t *base_band_age, const int16_t num_bands, const int16_t numch_out, const int16_t num_md_sub_frames ); +#ifdef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC +static void ivas_spar_md_fill_invalid_bandcoeffs( ivas_band_coeffs_t *pBand_coeffs, ivas_band_coeffs_t *pBand_coeffs_prev, const int16_t *valid_bands, int16_t *base_band_age, int16_t *first_valid_frame, const int16_t num_bands ); +#endif static ivas_error ivas_spar_set_dec_config( ivas_spar_md_dec_state_t *hMdDec, const int16_t nchan_transport, float *pFC ); static void ivas_parse_parameter_bitstream_dtx( ivas_spar_md_t *pSpar_md, Decoder_State *st, const int16_t bw, const int16_t num_bands, int16_t *num_dmx_per_band, int16_t *num_dec_per_band ); @@ -108,6 +111,12 @@ ivas_error ivas_spar_md_dec_matrix_open( { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for band_coeffs in SPAR MD" ); } +#ifdef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC + if ( ( hMdDec->band_coeffs_prev = (ivas_band_coeffs_t *) malloc( IVAS_MAX_NUM_BANDS * sizeof( ivas_band_coeffs_t ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for band_coeffs in SPAR MD" ); + } +#endif if ( ( hMdDec->mixer_mat = (float ***) malloc( num_channels * sizeof( float ** ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); @@ -370,6 +379,13 @@ void ivas_spar_md_dec_matrix_close( free( hMdDecoder->spar_md.band_coeffs ); hMdDecoder->spar_md.band_coeffs = NULL; } +#ifdef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC + if ( hMdDecoder->band_coeffs_prev != NULL ) + { + free( hMdDecoder->band_coeffs_prev ); + hMdDecoder->band_coeffs_prev = NULL; + } +#endif if ( hMdDecoder->mixer_mat != NULL ) { @@ -548,11 +564,17 @@ ivas_error ivas_spar_md_dec_init( /* initialize PLC state */ set_s( hMdDec->valid_bands, 0, IVAS_MAX_NUM_BANDS ); set_s( hMdDec->base_band_age, 0, IVAS_MAX_NUM_BANDS ); +#ifdef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC + set_s( hMdDec->base_band_coeffs_age, 0, IVAS_MAX_NUM_BANDS ); +#endif hMdDec->spar_plc_num_lost_frames = 0; hMdDec->spar_plc_enable_fadeout_flag = 1; hMdDec->dtx_md_smoothing_cntr = 1; ivas_clear_band_coeffs( hMdDec->spar_md.band_coeffs, IVAS_MAX_NUM_BANDS ); +#ifdef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC + ivas_clear_band_coeffs( hMdDec->band_coeffs_prev, IVAS_MAX_NUM_BANDS ); +#endif ivas_clear_band_coeff_idx( hMdDec->spar_md.band_coeffs_idx, IVAS_MAX_NUM_BANDS ); ivas_clear_band_coeff_idx( hMdDec->spar_md_prev.band_coeffs_idx, IVAS_MAX_NUM_BANDS ); ivas_clear_band_coeff_idx( hMdDec->spar_md_prev.band_coeffs_idx_mapped, IVAS_MAX_NUM_BANDS ); @@ -576,6 +598,9 @@ ivas_error ivas_spar_md_dec_init( set_zero( hMdDec->mixer_mat_prev2[i][j], IVAS_MAX_NUM_BANDS ); } } +#ifdef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC + hMdDec->first_valid_frame = 1; +#endif return IVAS_ERR_OK; } @@ -767,6 +792,13 @@ void ivas_spar_md_dec_process( #ifdef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC assert( nB == hMdDec->spar_md.num_bands ); assert( bw == 1 ); + ivas_spar_md_fill_invalid_bandcoeffs( + hMdDec->spar_md.band_coeffs, + hMdDec->band_coeffs_prev, + &hMdDec->valid_bands[0], + &hMdDec->base_band_coeffs_age[0], + &hMdDec->first_valid_frame, + nB ); #endif ivas_dec_mono_sba_handling( st_ivas ); @@ -1733,7 +1765,14 @@ static void ivas_spar_dec_parse_md_bs( do_diff[i] = ( ( ( i + 1 ) & 3 ) != strat - 4 ); do_repeat[i] = 0; } - ivas_map_prior_coeffs_quant( &hMdDec->spar_md_prev, &hMdDec->spar_md_cfg, qsi, *nB ); +#ifdef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC + if ( hMdDec->spar_md_cfg.prev_quant_idx >= 0 ) + { +#endif + ivas_map_prior_coeffs_quant( &hMdDec->spar_md_prev, &hMdDec->spar_md_cfg, qsi, *nB ); +#ifdef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC + } +#endif } #ifdef SPAR_HOA_DBG fprintf( stdout, "\n\n no_ec = %d, strat = %d\n", no_ec, strat ); @@ -2211,6 +2250,126 @@ static void ivas_spar_md_fill_invalid_bands( return; } +#ifdef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC +static void ivas_spar_md_fill_invalid_bandcoeffs( + ivas_band_coeffs_t *pBand_coeffs, + ivas_band_coeffs_t *pBand_coeffs_prev, + const int16_t *valid_bands, + int16_t *base_band_age, + int16_t *first_valid_frame, + const int16_t num_bands ) +{ + int16_t j, k, b, all_valid; + int16_t valid_band_idx[IVAS_MAX_NUM_BANDS], idx = -1; + int16_t last_valid_band_idx[IVAS_MAX_NUM_BANDS]; + float w = 0; + set_s( valid_band_idx, 0, IVAS_MAX_NUM_BANDS ); + set_s( last_valid_band_idx, 0, IVAS_MAX_NUM_BANDS ); + + all_valid = 1; + for ( b = 0; b < num_bands; b++ ) + { + if ( valid_bands[b] != 0 ) + { + base_band_age[b] = 0; /* reset band age */ + idx++; + valid_band_idx[idx] = b; + } + else + { + base_band_age[b] += 1; /* increment the age of invalid bands */ + + if ( base_band_age[b] > 3 ) + { + last_valid_band_idx[b] = idx; + } + all_valid = 0; + } + } + + assert( idx > 0 ); /* some bands should be valid */ + + if ( all_valid == 0 ) + { + for ( b = 0; b < num_bands; b++ ) + { + /* check against non zero in if and else if */ + if ( ( base_band_age[b] > 3 ) || ( *first_valid_frame == 0 ) ) /* old invalid bands */ + { + int16_t tmp_id, id0, id1; + + tmp_id = last_valid_band_idx[b]; + if ( tmp_id < 0 ) /* Extrapolation */ + { + id1 = valid_band_idx[0]; + id0 = 0; + w = 1; + } + else if ( tmp_id == idx ) /* Extrapolation */ + { + id1 = valid_band_idx[tmp_id]; + id0 = valid_band_idx[tmp_id]; + w = 0; + } + else /* Interpolation */ + { + id0 = valid_band_idx[tmp_id]; + id1 = valid_band_idx[tmp_id + 1]; + w = ( (float) ( b - id0 ) ) / ( id1 - id0 ); + } + + for ( j = 0; j < IVAS_SPAR_MAX_CH - 1; j++ ) + { + pBand_coeffs[b].pred_re[j] = ( 1 - w ) * pBand_coeffs[id0].pred_re[j] + w * pBand_coeffs[id1].pred_re[j]; + } + + for ( j = 0; j < IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS; j++ ) + { + for ( k = 0; k < IVAS_SPAR_MAX_DMX_CHS - 1; k++ ) + { + pBand_coeffs[b].C_re[j][k] = ( 1 - w ) * pBand_coeffs[id0].C_re[j][k] + w * pBand_coeffs[id1].C_re[j][k]; + } + } + + for ( j = 0; j < IVAS_SPAR_MAX_CH - 1; j++ ) + { + pBand_coeffs[b].P_re[j] = ( 1 - w ) * pBand_coeffs[id0].P_re[j] + w * pBand_coeffs[id1].P_re[j]; + } + } + else /* young invalid bands */ + { + if ( valid_bands[b] == 0 ) + { + for ( j = 0; j < IVAS_SPAR_MAX_CH - 1; j++ ) + { + pBand_coeffs[b].pred_re[j] = pBand_coeffs_prev[b].pred_re[j]; + } + + for ( j = 0; j < IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS; j++ ) + { + for ( k = 0; k < IVAS_SPAR_MAX_DMX_CHS - 1; k++ ) + { + pBand_coeffs[b].C_re[j][k] = pBand_coeffs_prev[b].C_re[j][k]; + } + } + + for ( j = 0; j < IVAS_SPAR_MAX_CH - 1; j++ ) + { + pBand_coeffs[b].P_re[j] = pBand_coeffs_prev[b].P_re[j]; + } + } + } + } + } + else + { + *first_valid_frame = 1; + } + + return; +} +#endif + /*-----------------------------------------------------------------------------------------* * Function ivas_spar_dec_compute_ramp_down_post_matrix() diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index 4da5526676..394e4c6bdc 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -603,6 +603,11 @@ typedef struct ivas_spar_md_dec_state_t float smooth_buf[IVAS_MAX_NUM_BANDS][2 * SBA_DIRAC_NRG_SMOOTH_LONG + 1]; float smooth_fac[IVAS_MAX_NUM_BANDS]; float mixer_mat_prev2[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS]; +#ifdef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC + int16_t first_valid_frame; + ivas_band_coeffs_t *band_coeffs_prev; + int16_t base_band_coeffs_age[IVAS_MAX_NUM_BANDS]; +#endif } ivas_spar_md_dec_state_t; -- GitLab From c70bf219921c0d0ddec75a4b8f31ab6628037269 Mon Sep 17 00:00:00 2001 From: rtyag Date: Wed, 15 Nov 2023 13:14:15 +1100 Subject: [PATCH 10/13] remove code duplication --- lib_dec/ivas_spar_md_dec.c | 132 ++++++++++++++++++++++++------------- 1 file changed, 87 insertions(+), 45 deletions(-) diff --git a/lib_dec/ivas_spar_md_dec.c b/lib_dec/ivas_spar_md_dec.c index cb459923fb..a3c7fcf780 100644 --- a/lib_dec/ivas_spar_md_dec.c +++ b/lib_dec/ivas_spar_md_dec.c @@ -2131,6 +2131,76 @@ static void ivas_decode_huffman_bs( return; } +#ifdef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC +static void ivas_spar_plc_get_band_age( + const int16_t *valid_bands, + int16_t *base_band_age, + const int16_t num_bands, + int16_t last_valid_band_idx[IVAS_MAX_NUM_BANDS], + int16_t valid_band_idx[IVAS_MAX_NUM_BANDS], + int16_t *all_valid, + int16_t *b_idx ) +{ + int16_t b, idx; + + set_s( valid_band_idx, 0, IVAS_MAX_NUM_BANDS ); + set_s( last_valid_band_idx, 0, IVAS_MAX_NUM_BANDS ); + idx = -1; + *all_valid = 1; + for ( b = 0; b < num_bands; b++ ) + { + if ( valid_bands[b] != 0 ) + { + base_band_age[b] = 0; /* reset band age */ + idx++; + valid_band_idx[idx] = b; + } + else + { + base_band_age[b] += 1; /* increment the age of invalid bands */ + + if ( base_band_age[b] > 3 ) + { + last_valid_band_idx[b] = idx; + } + *all_valid = 0; + } + } + *b_idx = idx; + + return; +} + +static void ivas_spar_get_plc_interp_weights( + int16_t valid_band_idx[IVAS_MAX_NUM_BANDS], + int16_t last_valid_band_idx, + int16_t idx, + int16_t b, + float *w, + int16_t *id0, + int16_t *id1 ) +{ + if ( last_valid_band_idx < 0 ) /* Extrapolation */ + { + *id1 = valid_band_idx[0]; + *id0 = 0; + *w = 1; + } + else if ( last_valid_band_idx == idx ) /* Extrapolation */ + { + *id1 = valid_band_idx[last_valid_band_idx]; + *id0 = valid_band_idx[last_valid_band_idx]; + *w = 0; + } + else /* Interpolation */ + { + *id0 = valid_band_idx[last_valid_band_idx]; + *id1 = valid_band_idx[last_valid_band_idx + 1]; + *w = ( (float) ( b - *id0 ) ) / ( *id1 - *id0 ); + } + return; +} +#endif /*-----------------------------------------------------------------------------------------* * Function ivas_spar_md_fill_invalid_bands() @@ -2151,6 +2221,10 @@ static void ivas_spar_md_fill_invalid_bands( int16_t valid_band_idx[IVAS_MAX_NUM_BANDS], idx = -1; int16_t last_valid_band_idx[IVAS_MAX_NUM_BANDS]; float w = 0; +#ifdef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC + ivas_spar_plc_get_band_age( valid_bands, base_band_age, num_bands, + last_valid_band_idx, valid_band_idx, &all_valid, &idx ); +#else set_s( valid_band_idx, 0, IVAS_MAX_NUM_BANDS ); set_s( last_valid_band_idx, 0, IVAS_MAX_NUM_BANDS ); @@ -2174,7 +2248,7 @@ static void ivas_spar_md_fill_invalid_bands( all_valid = 0; } } - +#endif assert( idx > 0 ); /* some bands should be valid */ if ( all_valid == 0 ) @@ -2184,6 +2258,11 @@ static void ivas_spar_md_fill_invalid_bands( /* check against non zero in if and else if */ if ( base_band_age[b] > 3 ) /* old invalid bands */ { +#ifdef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC + int16_t id0, id1; + ivas_spar_get_plc_interp_weights( valid_band_idx, last_valid_band_idx[b], + idx, b, &w, &id0, &id1 ); +#else int16_t tmp_id, id0, id1; tmp_id = last_valid_band_idx[b]; @@ -2205,7 +2284,7 @@ static void ivas_spar_md_fill_invalid_bands( id1 = valid_band_idx[tmp_id + 1]; w = ( (float) ( b - id0 ) ) / ( id1 - id0 ); } - +#endif for ( i = 0; i < num_channels; i++ ) { for ( j = 0; j < num_channels; j++ ) @@ -2250,6 +2329,7 @@ static void ivas_spar_md_fill_invalid_bands( return; } + #ifdef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC static void ivas_spar_md_fill_invalid_bandcoeffs( ivas_band_coeffs_t *pBand_coeffs, @@ -2263,29 +2343,9 @@ static void ivas_spar_md_fill_invalid_bandcoeffs( int16_t valid_band_idx[IVAS_MAX_NUM_BANDS], idx = -1; int16_t last_valid_band_idx[IVAS_MAX_NUM_BANDS]; float w = 0; - set_s( valid_band_idx, 0, IVAS_MAX_NUM_BANDS ); - set_s( last_valid_band_idx, 0, IVAS_MAX_NUM_BANDS ); - all_valid = 1; - for ( b = 0; b < num_bands; b++ ) - { - if ( valid_bands[b] != 0 ) - { - base_band_age[b] = 0; /* reset band age */ - idx++; - valid_band_idx[idx] = b; - } - else - { - base_band_age[b] += 1; /* increment the age of invalid bands */ - - if ( base_band_age[b] > 3 ) - { - last_valid_band_idx[b] = idx; - } - all_valid = 0; - } - } + ivas_spar_plc_get_band_age( valid_bands, base_band_age, num_bands, + last_valid_band_idx, valid_band_idx, &all_valid, &idx ); assert( idx > 0 ); /* some bands should be valid */ @@ -2296,27 +2356,9 @@ static void ivas_spar_md_fill_invalid_bandcoeffs( /* check against non zero in if and else if */ if ( ( base_band_age[b] > 3 ) || ( *first_valid_frame == 0 ) ) /* old invalid bands */ { - int16_t tmp_id, id0, id1; - - tmp_id = last_valid_band_idx[b]; - if ( tmp_id < 0 ) /* Extrapolation */ - { - id1 = valid_band_idx[0]; - id0 = 0; - w = 1; - } - else if ( tmp_id == idx ) /* Extrapolation */ - { - id1 = valid_band_idx[tmp_id]; - id0 = valid_band_idx[tmp_id]; - w = 0; - } - else /* Interpolation */ - { - id0 = valid_band_idx[tmp_id]; - id1 = valid_band_idx[tmp_id + 1]; - w = ( (float) ( b - id0 ) ) / ( id1 - id0 ); - } + int16_t id0, id1; + ivas_spar_get_plc_interp_weights( valid_band_idx, last_valid_band_idx[b], + idx, b, &w, &id0, &id1 ); for ( j = 0; j < IVAS_SPAR_MAX_CH - 1; j++ ) { -- GitLab From 86f49eba4732fa70df503e1e63bf5aef46196e4a Mon Sep 17 00:00:00 2001 From: rtyag Date: Thu, 16 Nov 2023 15:01:56 +1100 Subject: [PATCH 11/13] address review comment on saving prev-bfi --- lib_dec/ivas_corecoder_dec_reconfig.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/lib_dec/ivas_corecoder_dec_reconfig.c b/lib_dec/ivas_corecoder_dec_reconfig.c index f81f4d4237..aa9b3355a0 100644 --- a/lib_dec/ivas_corecoder_dec_reconfig.c +++ b/lib_dec/ivas_corecoder_dec_reconfig.c @@ -303,8 +303,20 @@ ivas_error ivas_corecoder_dec_reconfig( } #ifdef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC - st0 = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0] : st_ivas->hCPE[0]->hCoreCoder[0]; - st0->prev_bfi = prev_bfi; + for ( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) + { + st_ivas->hSCE[sce_id]->hCoreCoder[0]->prev_bfi = prev_bfi; + } + for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) + { + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + if ( st_ivas->hCPE[cpe_id]->hCoreCoder[n] != NULL ) + { + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->prev_bfi = prev_bfi; + } + } + } #endif } -- GitLab From 0ac7e71163f9bd26b46eb729190ca5bcc49a734b Mon Sep 17 00:00:00 2001 From: rtyag Date: Mon, 27 Nov 2023 12:46:19 +1100 Subject: [PATCH 12/13] temp change: reverting prev bfi change --- lib_dec/ivas_corecoder_dec_reconfig.c | 28 +++++++++------------------ 1 file changed, 9 insertions(+), 19 deletions(-) diff --git a/lib_dec/ivas_corecoder_dec_reconfig.c b/lib_dec/ivas_corecoder_dec_reconfig.c index aa9b3355a0..b804feedcf 100644 --- a/lib_dec/ivas_corecoder_dec_reconfig.c +++ b/lib_dec/ivas_corecoder_dec_reconfig.c @@ -64,7 +64,7 @@ ivas_error ivas_corecoder_dec_reconfig( MC_MODE last_mc_mode; DECODER_CONFIG_HANDLE hDecoderConfig; ivas_error error; -#ifdef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC +#if 0 // def NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC int16_t prev_bfi; Decoder_State *st0; #endif @@ -145,7 +145,7 @@ ivas_error ivas_corecoder_dec_reconfig( } else { -#ifdef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC +#if 0 // def NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC st0 = ( nSCE_old > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0] : st_ivas->hCPE[0]->hCoreCoder[0]; prev_bfi = st0->prev_bfi; #endif @@ -221,6 +221,9 @@ ivas_error ivas_corecoder_dec_reconfig( { return error; } +#if 0 // def NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC + st_ivas->hSCE[sce_id]->hCoreCoder[0]->prev_bfi = prev_bfi; +#endif } if ( st_ivas->sba_dirac_stereo_flag && sba_dirac_stereo_flag_old && st_ivas->nchan_transport == 1 && nSCE_old == 0 ) { @@ -249,6 +252,10 @@ ivas_error ivas_corecoder_dec_reconfig( { return error; } +#if 0 // def NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC + st_ivas->hCPE[cpe_id]->hCoreCoder[0]->prev_bfi = prev_bfi; + st_ivas->hCPE[cpe_id]->hCoreCoder[1]->prev_bfi = prev_bfi; +#endif } if ( st_ivas->nCPE > 1 && nCPE_old <= 1 ) @@ -301,23 +308,6 @@ ivas_error ivas_corecoder_dec_reconfig( st_ivas->hCPE[0]->hCoreCoder[n]->mct_chan_mode = MCT_CHAN_MODE_REGULAR; } } - -#ifdef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC - for ( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) - { - st_ivas->hSCE[sce_id]->hCoreCoder[0]->prev_bfi = prev_bfi; - } - for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) - { - for ( n = 0; n < CPE_CHANNELS; n++ ) - { - if ( st_ivas->hCPE[cpe_id]->hCoreCoder[n] != NULL ) - { - st_ivas->hCPE[cpe_id]->hCoreCoder[n]->prev_bfi = prev_bfi; - } - } - } -#endif } /* create dummy CPE element for DFT stereo-like upmix */ -- GitLab From 31b728ecfb1798978bc3f0205c29b8ccec9b6076 Mon Sep 17 00:00:00 2001 From: rtyag Date: Mon, 27 Nov 2023 13:07:56 +1100 Subject: [PATCH 13/13] add prev bfi change as per review comments --- lib_dec/ivas_corecoder_dec_reconfig.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib_dec/ivas_corecoder_dec_reconfig.c b/lib_dec/ivas_corecoder_dec_reconfig.c index b804feedcf..14d7ce1dd5 100644 --- a/lib_dec/ivas_corecoder_dec_reconfig.c +++ b/lib_dec/ivas_corecoder_dec_reconfig.c @@ -64,7 +64,7 @@ ivas_error ivas_corecoder_dec_reconfig( MC_MODE last_mc_mode; DECODER_CONFIG_HANDLE hDecoderConfig; ivas_error error; -#if 0 // def NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC +#ifdef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC int16_t prev_bfi; Decoder_State *st0; #endif @@ -145,7 +145,7 @@ ivas_error ivas_corecoder_dec_reconfig( } else { -#if 0 // def NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC +#ifdef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC st0 = ( nSCE_old > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0] : st_ivas->hCPE[0]->hCoreCoder[0]; prev_bfi = st0->prev_bfi; #endif @@ -221,7 +221,7 @@ ivas_error ivas_corecoder_dec_reconfig( { return error; } -#if 0 // def NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC +#ifdef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC st_ivas->hSCE[sce_id]->hCoreCoder[0]->prev_bfi = prev_bfi; #endif } @@ -252,7 +252,7 @@ ivas_error ivas_corecoder_dec_reconfig( { return error; } -#if 0 // def NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC +#ifdef NONBE_FIX_862_UBSAN_SPAR_DEC_BR_SW_PLC st_ivas->hCPE[cpe_id]->hCoreCoder[0]->prev_bfi = prev_bfi; st_ivas->hCPE[cpe_id]->hCoreCoder[1]->prev_bfi = prev_bfi; #endif -- GitLab