diff --git a/lib_com/options.h b/lib_com/options.h index 84ce4e93ff69e26b1e8404106b049a3d16c67afd..9ef650e07d8dc31f66f8d3dadd27d06073efb57f 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -137,6 +137,7 @@ #define NONBE_FIX_1052_SBA_EXT_FIX /* VA: SBA external output support fix - do not overwrite "output_config" parameter */ #define NONBE_1894_OSBA_SCALING /* 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 BASOP porting switches ############################ */ diff --git a/lib_dec/ivas_init_dec_fx.c b/lib_dec/ivas_init_dec_fx.c index 183c501a24db52202c3a2d34113b1ee68eaf6478..667b9dc32d527761a88f9b5be3787e4f9d5d91d6 100644 --- a/lib_dec/ivas_init_dec_fx.c +++ b/lib_dec/ivas_init_dec_fx.c @@ -2637,7 +2637,18 @@ ivas_error ivas_init_decoder_fx( test(); IF( EQ_32( st_ivas->mc_mode, MC_MODE_MCT ) || EQ_32( st_ivas->mc_mode, MC_MODE_PARAMUPMIX ) ) { +#ifdef NONBE_1360_LFE_DELAY + IF( NE_16( st_ivas->hIntSetup.index_lfe[0], -1 ) ) + { + delay_ns = st_ivas->binaural_latency_ns; + } + ELSE + { + delay_ns = 0; + } +#else delay_ns = st_ivas->binaural_latency_ns; +#endif move32(); IF( st_ivas->hBinRenderer != NULL ) { diff --git a/lib_dec/ivas_lfe_dec_fx.c b/lib_dec/ivas_lfe_dec_fx.c index 45e72438a53b1cc34b1e8e0e41e0af6018bad315..fb0141b72f40d4dd52f666365b75a23bbde1b78e 100644 --- a/lib_dec/ivas_lfe_dec_fx.c +++ b/lib_dec/ivas_lfe_dec_fx.c @@ -436,16 +436,22 @@ ivas_error ivas_create_lfe_dec_fx( #ifdef NONBE_FIX_MC_LFE_LPF const Word32 delay_ns /* i : additional LFE delay to sync other channel outputs */ #else - const Word32 binauralization_delay_ns /* i : additional LFE delay to sync with binaural renderer */ + const Word32 binauralization_delay_ns /* i : additional LFE delay to sync with binaural renderer */ #endif ) { Word16 low_pass_delay_dec_out, block_offset_s; Word16 filt_order, output_frame; LFE_DEC_HANDLE hLFE; - Word16 lfe_addl_delay_s; Word16 i, j; - Word16 add_delay_sa; +#ifndef NONBE_1360_LFE_DELAY + int16_t add_delay_sa; + Word16 lfe_addl_delay_s; +#else + Word16 lfe_block_delay_s_fx; + Word16 block_offset_samples, lfe_block_delay_samples; + Word16 lfe_addl_delay_samples; +#endif Word32 output_fs_fx; low_pass_delay_dec_out = 0; @@ -486,7 +492,11 @@ ivas_error ivas_create_lfe_dec_fx( 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_fx = add( IVAS_LFE_FADE_S_Q15, ivas_lfe_lpf_delay_Q15[IVAS_FILTER_ORDER_4 - 3] ); // Q15 +#else + lfe_block_delay_s_fx = add( IVAS_LFE_FADE_S_Q15, ivas_lfe_lpf_delay_Q15[IVAS_FILTER_ORDER_4 - 3] ); // Q15 +#endif move16(); block_offset_s = BLOCK_OFFSET_S_Q15; // Q15 @@ -507,8 +517,12 @@ ivas_error ivas_create_lfe_dec_fx( hLFE->filter_state.order = filt_order; move16(); +#ifndef NONBE_1360_LFE_DELAY hLFE->lfe_block_delay_s_fx = add( hLFE->lfe_block_delay_s_fx, low_pass_delay_dec_out ); // Q15 move16(); +#else + lfe_block_delay_s_fx = add( lfe_block_delay_s_fx, low_pass_delay_dec_out ); // Q15 +#endif hLFE->lfe_prior_buf_len = NS2SA_FX2( output_Fs, IVAS_LFE_FADE_NS ); // Q0 move16(); @@ -532,7 +546,18 @@ ivas_error ivas_create_lfe_dec_fx( } move32(); - lfe_addl_delay_s = sub( block_offset_s, hLFE->lfe_block_delay_s_fx ); // Q15 +#ifdef NONBE_1360_LFE_DELAY + block_offset_samples = (Word16) L_shr( imult3216( output_Fs, block_offset_s ), 15 ); // Q0 + block_offset_samples = add( block_offset_samples, (Word16) W_round64_L( W_mult0_32_32( L_shl( delay_ns, 1 ), output_fs_fx ) ) ); // Q0 + lfe_block_delay_samples = (Word16) L_shr( imult3216( output_Fs, lfe_block_delay_s_fx ), 15 ); // Q0 + lfe_addl_delay_samples = sub( block_offset_samples, lfe_block_delay_samples ); + lfe_addl_delay_samples = s_max( 0, lfe_addl_delay_samples ); + hLFE->lfe_addl_delay = lfe_addl_delay_samples; + move16(); + hLFE->delay_ns = delay_ns; + move32(); +#else + lfe_addl_delay_s = sub( block_offset_s, hLFE->lfe_block_delay_s_fx ); // Q15 lfe_addl_delay_s = s_max( 0, lfe_addl_delay_s ); #ifdef NONBE_FIX_MC_LFE_LPF add_delay_sa = (Word16) W_round64_L( W_mult0_32_32( L_shl( delay_ns, 1 ), output_fs_fx ) ); // Q0 @@ -551,6 +576,7 @@ ivas_error ivas_create_lfe_dec_fx( hLFE->lfe_block_delay_s_fx = add( hLFE->lfe_block_delay_s_fx, add( lfe_addl_delay_s, idiv1616( add_delay_sa, extract_l( output_Fs ) ) ) ); } move16(); +#endif IF( hLFE->lfe_addl_delay > 0 ) { diff --git a/lib_dec/ivas_mc_paramupmix_dec_fx.c b/lib_dec/ivas_mc_paramupmix_dec_fx.c index 7c3581c93addff59a68781ea773fd02ec2b9f018..c49b413420b7196c23825263692814b65df8f786 100644 --- a/lib_dec/ivas_mc_paramupmix_dec_fx.c +++ b/lib_dec/ivas_mc_paramupmix_dec_fx.c @@ -960,22 +960,38 @@ static void ivas_mc_paramupmix_dec_sf( { FOR( ch = 0; ch < MC_PARAMUPMIX_COMBINATIONS; ch++ ) { - Word32 tmp_buf_fx[L_SUBFRAME5MS_48k]; - Copy32( &output_fx[ch][n_samples_rendered - noparamupmix_delay], tmp_buf_fx, noparamupmix_delay ); - Copy32( output_fx[ch], &output_fx[ch][noparamupmix_delay], sub( n_samples_rendered, noparamupmix_delay ) ); - Copy32( hMCParamUpmix->pcm_delay_fx[ch], output_fx[ch], noparamupmix_delay ); - Copy32( tmp_buf_fx, hMCParamUpmix->pcm_delay_fx[ch], noparamupmix_delay ); +#ifdef NONBE_1360_LFE_DELAY + /*delay is handled within LFE decoder*/ + IF( NE_16( st_ivas->hIntSetup.index_lfe[0], ch ) ) + { +#endif + Word32 tmp_buf_fx[L_SUBFRAME5MS_48k]; + Copy32( &output_fx[ch][n_samples_rendered - noparamupmix_delay], tmp_buf_fx, noparamupmix_delay ); + Copy32( output_fx[ch], &output_fx[ch][noparamupmix_delay], sub( n_samples_rendered, noparamupmix_delay ) ); + Copy32( hMCParamUpmix->pcm_delay_fx[ch], output_fx[ch], noparamupmix_delay ); + Copy32( tmp_buf_fx, hMCParamUpmix->pcm_delay_fx[ch], noparamupmix_delay ); +#ifdef NONBE_1360_LFE_DELAY + } +#endif } } ELSE { FOR( ch = 0; ch < MC_PARAMUPMIX_COMBINATIONS; ch++ ) { - Word32 tmp_buf_fx[L_SUBFRAME5MS_48k]; - Copy32( &output_fx[ch][0], tmp_buf_fx, n_samples_rendered ); - Copy32( hMCParamUpmix->pcm_delay_fx[ch], output_fx[ch], n_samples_rendered ); - Copy32( &hMCParamUpmix->pcm_delay_fx[ch][n_samples_rendered], &hMCParamUpmix->pcm_delay_fx[ch][0], sub( noparamupmix_delay, n_samples_rendered ) ); - Copy32( tmp_buf_fx, &hMCParamUpmix->pcm_delay_fx[ch][noparamupmix_delay - n_samples_rendered], n_samples_rendered ); +#ifdef NONBE_1360_LFE_DELAY + /*delay is handled within LFE decoder*/ + IF( NE_16( st_ivas->hIntSetup.index_lfe[0], ch ) ) + { +#endif + Word32 tmp_buf_fx[L_SUBFRAME5MS_48k]; + Copy32( &output_fx[ch][0], tmp_buf_fx, n_samples_rendered ); + Copy32( hMCParamUpmix->pcm_delay_fx[ch], output_fx[ch], n_samples_rendered ); + Copy32( &hMCParamUpmix->pcm_delay_fx[ch][n_samples_rendered], &hMCParamUpmix->pcm_delay_fx[ch][0], sub( noparamupmix_delay, n_samples_rendered ) ); + Copy32( tmp_buf_fx, &hMCParamUpmix->pcm_delay_fx[ch][noparamupmix_delay - n_samples_rendered], n_samples_rendered ); +#ifdef NONBE_1360_LFE_DELAY + } +#endif } } } diff --git a/lib_dec/ivas_mct_dec_fx.c b/lib_dec/ivas_mct_dec_fx.c index 8d6005ee5188c39dbf217585febd822651631602..cdb117820fcdc7088d74bd34e430b0dec7f1b162 100644 --- a/lib_dec/ivas_mct_dec_fx.c +++ b/lib_dec/ivas_mct_dec_fx.c @@ -1332,6 +1332,8 @@ static ivas_error ivas_mc_dec_reconfig_fx( { return error; } + +#ifndef NONBE_1360_LFE_DELAY /*-----------------------------------------------------------------* * Allocate the LFE handle that is coded separately after the allocation of the core coders *-----------------------------------------------------------------*/ @@ -1389,6 +1391,7 @@ static ivas_error ivas_mc_dec_reconfig_fx( set32_fx( st_ivas->hLFE->prevsynth_buf_fx, 0, LFE_PLC_BUFLEN ); set32_fx( st_ivas->hLFE->prior_out_buffer_fx, 0, L_FRAME48k ); } +#endif /*-----------------------------------------------------------------* * Reconfigure renderers @@ -1546,6 +1549,99 @@ static ivas_error ivas_mc_dec_reconfig_fx( return error; } +#ifdef NONBE_1360_LFE_DELAY + /*-----------------------------------------------------------------* + * Allocate the LFE handle that is coded separately after the allocation of the core coders + *-----------------------------------------------------------------*/ +#ifdef NONBE_1360_LFE_DELAY + test(); + IF( ( EQ_16( st_ivas->mc_mode, MC_MODE_MCT ) || EQ_16( st_ivas->mc_mode, MC_MODE_PARAMUPMIX ) ) ) +#else + test(); + test(); + IF( ( EQ_16( st_ivas->mc_mode, MC_MODE_MCT ) || EQ_16( st_ivas->mc_mode, MC_MODE_PARAMUPMIX ) ) && st_ivas->hLFE == NULL ) +#endif + { +#ifdef NONBE_FIX_MC_LFE_LPF +#ifdef NONBE_1360_LFE_DELAY + Word32 delay_ns; + IF( NE_16( st_ivas->hIntSetup.index_lfe[0], -1 ) ) + { + delay_ns = st_ivas->binaural_latency_ns; + } + ELSE + { + delay_ns = 0; + } +#else + Word32 delay_ns = st_ivas->binaural_latency_ns; +#endif +#else + Word32 binauralization_delay_ns = st_ivas->binaural_latency_ns; +#endif + move32(); + IF( st_ivas->hBinRenderer != NULL ) + { + IF( st_ivas->hBinRenderer->render_lfe ) + { + /* Account for filterbank delay */ +#ifdef NONBE_FIX_MC_LFE_LPF + delay_ns = L_add( delay_ns, IVAS_FB_DEC_DELAY_NS ); +#else + binauralization_delay_ns = L_add( binauralization_delay_ns, IVAS_FB_DEC_DELAY_NS ); +#endif + } + ELSE + { +#ifdef NONBE_FIX_MC_LFE_LPF + delay_ns = 0; +#else + binauralization_delay_ns = 0; +#endif + move32(); + } + } +#ifdef NONBE_FIX_MC_LFE_LPF + ELSE + { + IF( EQ_16( st_ivas->mc_mode, MC_MODE_PARAMUPMIX ) && ( st_ivas->cldfbSynDec[0] != NULL ) ) + { + delay_ns = L_add( delay_ns, IVAS_FB_DEC_DELAY_NS ); + } + } +#endif + +#ifdef NONBE_1360_LFE_DELAY + IF( st_ivas->hLFE != NULL ) + { + IF( NE_32( st_ivas->hLFE->delay_ns, delay_ns ) ) + { + ivas_lfe_dec_close_fx( &( st_ivas->hLFE ) ); + } + } +#endif + +#ifdef NONBE_1360_LFE_DELAY + IF( st_ivas->hLFE == NULL ) + { +#endif +#ifdef NONBE_FIX_MC_LFE_LPF + IF( NE_32( ( error = ivas_create_lfe_dec_fx( &st_ivas->hLFE, st_ivas->hDecoderConfig->output_Fs, delay_ns ) ), IVAS_ERR_OK ) ) +#else + IF( NE_32( ( error = ivas_create_lfe_dec_fx( &st_ivas->hLFE, st_ivas->hDecoderConfig->output_Fs, binauralization_delay_ns ) ), IVAS_ERR_OK ) ) +#endif + { + return error; + } + + set32_fx( st_ivas->hLFE->prevsynth_buf_fx, 0, LFE_PLC_BUFLEN ); + set32_fx( st_ivas->hLFE->prior_out_buffer_fx, 0, L_FRAME48k ); +#ifdef NONBE_1360_LFE_DELAY + } +#endif + } +#endif + /*-----------------------------------------------------------------* * JBM TC buffers *-----------------------------------------------------------------*/ diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index 6855ea2dc516352b9da90bbf3b691dccd1e839ed..39d42ee8611ddc6265f06768850c67908895f541 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -834,7 +834,11 @@ typedef struct ivas_lfe_dec_data_structure LFE_WINDOW_HANDLE pWindow_state; const UWord16 *cum_freq_models[IVAS_MAX_NUM_QUANT_STRATS][IVAS_MAX_NUM_DCT_COEF_GROUPS]; Word16 lfe_dec_indices_coeffs_tbl[IVAS_MAX_NUM_QUANT_STRATS][IVAS_MAX_NUM_DCT_COEF_GROUPS]; +#ifdef NONBE_1360_LFE_DELAY + Word32 delay_ns; /* Q0 */ +#else Word16 lfe_block_delay_s_fx; /* Q15 */ +#endif Word16 lfe_prior_buf_len; Word32 prior_out_buffer_fx[L_FRAME48k]; /* Q9 */