From ad0af430e08e76c9c70c832dfeab747c42d839cc Mon Sep 17 00:00:00 2001 From: rtyag Date: Wed, 6 Aug 2025 16:30:21 +1000 Subject: [PATCH 1/2] fix for LFE delay alignment when rendering happens in cldfb domain --- lib_com/options.h | 1 + lib_dec/ivas_init_dec.c | 13 +++++++- lib_dec/ivas_lfe_dec.c | 13 +++++++- lib_dec/ivas_mc_paramupmix_dec.c | 35 +++++++++++++++------ lib_dec/ivas_mct_dec.c | 53 ++++++++++++++++++++++++++++++++ 5 files changed, 103 insertions(+), 12 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index edd60e4680..290815001d 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -176,6 +176,7 @@ #define NONBE_FIX_TCX5_INTERLEAVING_FOR_FS_IN_UNEQUAL_FS_OUT /* FhG: apply correct TCX5 grouping/interleaving when input_fs != output_fs */ #define NONBE_1339_FIXOSBA_EXT_LOUDNESS /* FhG: issue 1339: apply scaling with EXT output in OSBA high-BR mode */ #define NONBE_1352_HARMONIZE_OSBA_LOUDNESS /* FhG: do not scale OSBA inputs by 0.5 any more */ +#define NONBE_1360_LFE_DELAY /* Dlb: LFE delay alignment when rendering in CLDFB domain*/ /* ##################### End NON-BE switches ########################### */ diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index a303c6d65b..0b04eedb3b 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -2305,7 +2305,18 @@ ivas_error ivas_init_decoder( if ( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) { - delay_ns = st_ivas->binaural_latency_ns; +#ifdef NONBE_1360_LFE_DELAY + if ( st_ivas->hIntSetup.index_lfe[0] != -1 ) + { + delay_ns = st_ivas->binaural_latency_ns; + } + else + { + delay_ns = 0; + } +#else + int32_t delay_ns = st_ivas->binaural_latency_ns; +#endif if ( st_ivas->hBinRenderer != NULL ) { if ( st_ivas->hBinRenderer->render_lfe ) diff --git a/lib_dec/ivas_lfe_dec.c b/lib_dec/ivas_lfe_dec.c index eed016b09f..ce8417110d 100644 --- a/lib_dec/ivas_lfe_dec.c +++ b/lib_dec/ivas_lfe_dec.c @@ -426,7 +426,11 @@ ivas_error ivas_create_lfe_dec( if ( ( delay_ns / 1000000000.f ) > ivas_lfe_lpf_delay[IVAS_FILTER_ORDER_4 - 3] ) { filt_order = 4; +#ifdef NONBE_1360_LFE_DELAY + low_pass_delay_dec_out = ivas_lfe_lpf_delay[IVAS_FILTER_ORDER_4 - 3]; +#else low_pass_delay_dec_out = ivas_lfe_lpf_delay[IVAS_FILTER_ORDER_4 - 3] * 1000000000.f; +#endif ivas_create_lfe_lpf_dec( &( hLFE->filter_state ), output_Fs ); } @@ -435,12 +439,19 @@ ivas_error ivas_create_lfe_dec( hLFE->lfe_prior_buf_len = NS2SA( output_Fs, IVAS_LFE_FADE_NS ); hLFE->bfi_count = 0; - +#ifdef NONBE_1360_LFE_DELAY + block_offset_s += delay_ns / 1000000000.f; +#endif lfe_addl_delay_s = block_offset_s - hLFE->lfe_block_delay_s; lfe_addl_delay_s = max( 0.0f, lfe_addl_delay_s ); +#ifndef NONBE_1360_LFE_DELAY add_delay_sa = (int16_t) roundf( (float) delay_ns * output_Fs / 1000000000.f ); hLFE->lfe_addl_delay = (int16_t) ( lfe_addl_delay_s * output_Fs ) + add_delay_sa; hLFE->lfe_block_delay_s += lfe_addl_delay_s + add_delay_sa / output_Fs; +#else + hLFE->lfe_addl_delay = (int16_t) ( lfe_addl_delay_s * output_Fs ); + hLFE->lfe_block_delay_s += lfe_addl_delay_s; +#endif if ( hLFE->lfe_addl_delay > 0 ) { diff --git a/lib_dec/ivas_mc_paramupmix_dec.c b/lib_dec/ivas_mc_paramupmix_dec.c index c06e8b3fa1..049cc120b3 100644 --- a/lib_dec/ivas_mc_paramupmix_dec.c +++ b/lib_dec/ivas_mc_paramupmix_dec.c @@ -844,22 +844,37 @@ static void ivas_mc_paramupmix_dec_sf( { for ( ch = 0; ch < MC_PARAMUPMIX_COMBINATIONS; ch++ ) { - float tmp_buf[L_SUBFRAME5MS_48k]; - mvr2r( &output_f[ch][n_samples_rendered - noparamupmix_delay], tmp_buf, noparamupmix_delay ); - mvr2r( output_f[ch], &output_f[ch][noparamupmix_delay], n_samples_rendered - noparamupmix_delay ); - mvr2r( hMCParamUpmix->pcm_delay[ch], output_f[ch], noparamupmix_delay ); - mvr2r( tmp_buf, hMCParamUpmix->pcm_delay[ch], noparamupmix_delay ); +#ifdef NONBE_1360_LFE_DELAY + /*delay is handled within LFE decoder*/ + if ( st_ivas->hIntSetup.index_lfe[0] != ch ) + { +#endif + float tmp_buf[L_SUBFRAME5MS_48k]; + mvr2r( &output_f[ch][n_samples_rendered - noparamupmix_delay], tmp_buf, noparamupmix_delay ); + mvr2r( output_f[ch], &output_f[ch][noparamupmix_delay], n_samples_rendered - noparamupmix_delay ); + mvr2r( hMCParamUpmix->pcm_delay[ch], output_f[ch], noparamupmix_delay ); + mvr2r( tmp_buf, hMCParamUpmix->pcm_delay[ch], noparamupmix_delay ); +#ifdef NONBE_1360_LFE_DELAY + } +#endif } } else { for ( ch = 0; ch < MC_PARAMUPMIX_COMBINATIONS; ch++ ) { - float tmp_buf[L_SUBFRAME5MS_48k]; - mvr2r( &output_f[ch][0], tmp_buf, n_samples_rendered ); - mvr2r( hMCParamUpmix->pcm_delay[ch], output_f[ch], n_samples_rendered ); - mvr2r( &hMCParamUpmix->pcm_delay[ch][n_samples_rendered], &hMCParamUpmix->pcm_delay[ch][0], noparamupmix_delay - n_samples_rendered ); - mvr2r( tmp_buf, &hMCParamUpmix->pcm_delay[ch][noparamupmix_delay - n_samples_rendered], n_samples_rendered ); +#ifdef NONBE_1360_LFE_DELAY + if ( st_ivas->hIntSetup.index_lfe[0] != ch ) + { +#endif + float tmp_buf[L_SUBFRAME5MS_48k]; + mvr2r( &output_f[ch][0], tmp_buf, n_samples_rendered ); + mvr2r( hMCParamUpmix->pcm_delay[ch], output_f[ch], n_samples_rendered ); + mvr2r( &hMCParamUpmix->pcm_delay[ch][n_samples_rendered], &hMCParamUpmix->pcm_delay[ch][0], noparamupmix_delay - n_samples_rendered ); + mvr2r( tmp_buf, &hMCParamUpmix->pcm_delay[ch][noparamupmix_delay - n_samples_rendered], n_samples_rendered ); +#ifdef NONBE_1360_LFE_DELAY + } +#endif } } } diff --git a/lib_dec/ivas_mct_dec.c b/lib_dec/ivas_mct_dec.c index 8fb966c365..260002721f 100644 --- a/lib_dec/ivas_mct_dec.c +++ b/lib_dec/ivas_mct_dec.c @@ -1077,6 +1077,7 @@ static ivas_error ivas_mc_dec_reconfig( return error; } +#ifndef NONBE_1360_LFE_DELAY /*-----------------------------------------------------------------* * Allocate the LFE handle that is coded separately after the allocation of the core coders *-----------------------------------------------------------------*/ @@ -1112,6 +1113,7 @@ static ivas_error ivas_mc_dec_reconfig( set_zero( st_ivas->hLFE->prevsynth_buf, LFE_PLC_BUFLEN ); set_zero( st_ivas->hLFE->prior_out_buffer, L_FRAME48k ); } +#endif /*-----------------------------------------------------------------* * Reconfigure renderers @@ -1264,6 +1266,57 @@ static ivas_error ivas_mc_dec_reconfig( return error; } + +#ifdef NONBE_1360_LFE_DELAY + /*-----------------------------------------------------------------* + * Allocate the LFE handle that is coded separately after the allocation of the core coders + *-----------------------------------------------------------------*/ + + if ( ( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) && st_ivas->hLFE == NULL ) + { +#ifdef NONBE_1360_LFE_DELAY + int32_t delay_ns; + if ( st_ivas->hIntSetup.index_lfe[0] != -1 ) + { + delay_ns = st_ivas->binaural_latency_ns; + } + else + { + delay_ns = 0; + } +#else + int32_t delay_ns = st_ivas->binaural_latency_ns; +#endif + if ( st_ivas->hBinRenderer != NULL ) + { + if ( st_ivas->hBinRenderer->render_lfe ) + { + /* Account for filterbank delay */ + delay_ns += IVAS_FB_DEC_DELAY_NS; + } + else + { + delay_ns = 0; + } + } + else + { + if ( ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) && ( st_ivas->cldfbSynDec[0] != NULL ) ) + { + delay_ns += IVAS_FB_DEC_DELAY_NS; + } + } + + if ( ( error = ivas_create_lfe_dec( &st_ivas->hLFE, st_ivas->hDecoderConfig->output_Fs, delay_ns ) ) != IVAS_ERR_OK ) + { + return error; + } + + set_zero( st_ivas->hLFE->prevsynth_buf, LFE_PLC_BUFLEN ); + set_zero( st_ivas->hLFE->prior_out_buffer, L_FRAME48k ); + } +#endif + /*-----------------------------------------------------------------* * JBM TC buffers *-----------------------------------------------------------------*/ -- GitLab From 51acf5ce5b7deca20bc6a6554ce7d36873b8fbe6 Mon Sep 17 00:00:00 2001 From: rtyag Date: Wed, 6 Aug 2025 16:55:05 +1000 Subject: [PATCH 2/2] issue fix on mc reconfig --- lib_dec/ivas_lfe_dec.c | 20 ++++++++++++++++++-- lib_dec/ivas_mct_dec.c | 30 +++++++++++++++++++++++++----- lib_dec/ivas_stat_dec.h | 4 ++++ 3 files changed, 47 insertions(+), 7 deletions(-) diff --git a/lib_dec/ivas_lfe_dec.c b/lib_dec/ivas_lfe_dec.c index ce8417110d..e734f1e0fd 100644 --- a/lib_dec/ivas_lfe_dec.c +++ b/lib_dec/ivas_lfe_dec.c @@ -380,7 +380,11 @@ ivas_error ivas_create_lfe_dec( LFE_DEC_HANDLE hLFE; float lfe_addl_delay_s; int16_t i, j; +#ifndef NONBE_1360_LFE_DELAY int16_t add_delay_sa; +#else + float lfe_block_delay_s; +#endif low_pass_delay_dec_out = 0; block_offset_s = 0; @@ -418,7 +422,11 @@ ivas_error ivas_create_lfe_dec( hLFE->cum_freq_models[1][3] = &ivas_str_lfe_freq_models.entropy_coder_model_coarse_sg4; /* delay calculation */ +#ifndef NONBE_1360_LFE_DELAY hLFE->lfe_block_delay_s = ( IVAS_LFE_FADE_NS / 1000000000.f ) + ivas_lfe_lpf_delay[IVAS_FILTER_ORDER_4 - 3]; +#else + lfe_block_delay_s = ( IVAS_LFE_FADE_NS / 1000000000.f ) + ivas_lfe_lpf_delay[IVAS_FILTER_ORDER_4 - 3]; +#endif block_offset_s = BLOCK_OFFSET_MS * 0.001f; filt_order = 0; @@ -435,22 +443,30 @@ ivas_error ivas_create_lfe_dec( } hLFE->filter_state.order = filt_order; +#ifndef NONBE_1360_LFE_DELAY hLFE->lfe_block_delay_s = hLFE->lfe_block_delay_s + low_pass_delay_dec_out; +#else + lfe_block_delay_s = lfe_block_delay_s + low_pass_delay_dec_out; +#endif hLFE->lfe_prior_buf_len = NS2SA( output_Fs, IVAS_LFE_FADE_NS ); hLFE->bfi_count = 0; #ifdef NONBE_1360_LFE_DELAY block_offset_s += delay_ns / 1000000000.f; -#endif + lfe_addl_delay_s = block_offset_s - lfe_block_delay_s; +#else lfe_addl_delay_s = block_offset_s - hLFE->lfe_block_delay_s; +#endif + lfe_addl_delay_s = max( 0.0f, lfe_addl_delay_s ); #ifndef NONBE_1360_LFE_DELAY add_delay_sa = (int16_t) roundf( (float) delay_ns * output_Fs / 1000000000.f ); hLFE->lfe_addl_delay = (int16_t) ( lfe_addl_delay_s * output_Fs ) + add_delay_sa; hLFE->lfe_block_delay_s += lfe_addl_delay_s + add_delay_sa / output_Fs; + hLFE->lfe_block_delay_s += lfe_addl_delay_s; #else hLFE->lfe_addl_delay = (int16_t) ( lfe_addl_delay_s * output_Fs ); - hLFE->lfe_block_delay_s += lfe_addl_delay_s; + hLFE->delay_ns = delay_ns; #endif if ( hLFE->lfe_addl_delay > 0 ) diff --git a/lib_dec/ivas_mct_dec.c b/lib_dec/ivas_mct_dec.c index 260002721f..28f5321a3a 100644 --- a/lib_dec/ivas_mct_dec.c +++ b/lib_dec/ivas_mct_dec.c @@ -1271,8 +1271,11 @@ static ivas_error ivas_mc_dec_reconfig( /*-----------------------------------------------------------------* * Allocate the LFE handle that is coded separately after the allocation of the core coders *-----------------------------------------------------------------*/ - +#ifdef NONBE_1360_LFE_DELAY + if ( ( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) ) +#else if ( ( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) && st_ivas->hLFE == NULL ) +#endif { #ifdef NONBE_1360_LFE_DELAY int32_t delay_ns; @@ -1307,13 +1310,30 @@ static ivas_error ivas_mc_dec_reconfig( } } - if ( ( error = ivas_create_lfe_dec( &st_ivas->hLFE, st_ivas->hDecoderConfig->output_Fs, delay_ns ) ) != IVAS_ERR_OK ) +#ifdef NONBE_1360_LFE_DELAY + if ( st_ivas->hLFE != NULL ) { - return error; + if ( st_ivas->hLFE->delay_ns != delay_ns ) + { + ivas_lfe_dec_close( &( st_ivas->hLFE ) ); + } } +#endif - set_zero( st_ivas->hLFE->prevsynth_buf, LFE_PLC_BUFLEN ); - set_zero( st_ivas->hLFE->prior_out_buffer, L_FRAME48k ); +#ifdef NONBE_1360_LFE_DELAY + if ( st_ivas->hLFE == NULL ) + { +#endif + if ( ( error = ivas_create_lfe_dec( &st_ivas->hLFE, st_ivas->hDecoderConfig->output_Fs, delay_ns ) ) != IVAS_ERR_OK ) + { + return error; + } + + set_zero( st_ivas->hLFE->prevsynth_buf, LFE_PLC_BUFLEN ); + set_zero( st_ivas->hLFE->prior_out_buffer, L_FRAME48k ); +#ifdef NONBE_1360_LFE_DELAY + } +#endif } #endif diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index 282d798e4d..1d04bea71f 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -790,7 +790,11 @@ typedef struct ivas_lfe_dec_data_structure LFE_WINDOW_HANDLE pWindow_state; const uint16_t *cum_freq_models[IVAS_MAX_NUM_QUANT_STRATS][IVAS_MAX_NUM_DCT_COEF_GROUPS]; int16_t lfe_dec_indices_coeffs_tbl[IVAS_MAX_NUM_QUANT_STRATS][IVAS_MAX_NUM_DCT_COEF_GROUPS]; +#ifdef NONBE_1360_LFE_DELAY + int32_t delay_ns; +#else float lfe_block_delay_s; +#endif int16_t lfe_prior_buf_len; float prior_out_buffer[L_FRAME48k]; -- GitLab