Loading lib_com/options.h +1 −0 Original line number Diff line number Diff line Loading @@ -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 ############################ */ Loading lib_dec/ivas_init_dec_fx.c +11 −0 Original line number Diff line number Diff line Loading @@ -2636,8 +2636,19 @@ 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 ) { Loading lib_dec/ivas_lfe_dec_fx.c +30 −4 Original line number Diff line number Diff line Loading @@ -443,9 +443,15 @@ ivas_error ivas_create_lfe_dec_fx( 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; Loading Loading @@ -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 Loading @@ -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(); Loading @@ -532,6 +546,17 @@ ivas_error ivas_create_lfe_dec_fx( } move32(); #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 Loading @@ -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 ) { Loading lib_dec/ivas_mc_paramupmix_dec_fx.c +26 −10 Original line number Diff line number Diff line Loading @@ -960,22 +960,38 @@ static void ivas_mc_paramupmix_dec_sf( { FOR( ch = 0; ch < MC_PARAMUPMIX_COMBINATIONS; ch++ ) { #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++ ) { #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 } } } Loading lib_dec/ivas_mct_dec_fx.c +96 −0 Original line number Diff line number Diff line Loading @@ -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 *-----------------------------------------------------------------*/ Loading Loading @@ -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 Loading Loading @@ -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 *-----------------------------------------------------------------*/ Loading Loading
lib_com/options.h +1 −0 Original line number Diff line number Diff line Loading @@ -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 ############################ */ Loading
lib_dec/ivas_init_dec_fx.c +11 −0 Original line number Diff line number Diff line Loading @@ -2636,8 +2636,19 @@ 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 ) { Loading
lib_dec/ivas_lfe_dec_fx.c +30 −4 Original line number Diff line number Diff line Loading @@ -443,9 +443,15 @@ ivas_error ivas_create_lfe_dec_fx( 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; Loading Loading @@ -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 Loading @@ -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(); Loading @@ -532,6 +546,17 @@ ivas_error ivas_create_lfe_dec_fx( } move32(); #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 Loading @@ -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 ) { Loading
lib_dec/ivas_mc_paramupmix_dec_fx.c +26 −10 Original line number Diff line number Diff line Loading @@ -960,22 +960,38 @@ static void ivas_mc_paramupmix_dec_sf( { FOR( ch = 0; ch < MC_PARAMUPMIX_COMBINATIONS; ch++ ) { #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++ ) { #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 } } } Loading
lib_dec/ivas_mct_dec_fx.c +96 −0 Original line number Diff line number Diff line Loading @@ -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 *-----------------------------------------------------------------*/ Loading Loading @@ -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 Loading Loading @@ -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 *-----------------------------------------------------------------*/ Loading