From f14ce8f226984db55b8c3b9770f37caece39273a Mon Sep 17 00:00:00 2001 From: Adam Mills Date: Sun, 21 Apr 2024 20:55:57 +1000 Subject: [PATCH 01/14] Adding back in the LFE LPF for the decoder --- lib_com/ivas_prot.h | 19 +++++++++++ lib_dec/ivas_init_dec.c | 8 +++++ lib_dec/ivas_jbm_dec.c | 3 ++ lib_dec/ivas_lfe_dec.c | 74 +++++++++++++++++++++++++++++++++++++++++ lib_dec/ivas_stat_dec.h | 1 + 5 files changed, 105 insertions(+) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 7a8ebafe55..919a638a7e 100755 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -5482,6 +5482,25 @@ void ivas_lfe_lpf_enc_apply( const int16_t input_frame /* i : input frame length per channel */ ); +/*----------------------------------------------------------------------------------* + * LFE decoder low pass filter prototypes + *----------------------------------------------------------------------------------*/ + +ivas_error ivas_create_lfe_lpf_dec( + ivas_filters_process_state_t **hLfeLpf, /* o : LFE LPF handle */ + const int32_t input_Fs /* i : input sampling rate */ +); + +void ivas_lfe_lpf_dec_close( + ivas_filters_process_state_t **hLfeLpf /* i/o: LFE LPF handle */ +); + +void ivas_lfe_lpf_dec_apply( + ivas_filters_process_state_t *hLfeLpf, /* i/o: LFE LPF handle */ + float data_lfe_ch[], /* i/o: LFE signal */ + const int16_t input_frame /* i : input frame length per channel */ +); + /*----------------------------------------------------------------------------------* * LFE Coding prototypes diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index 68badb98dd..279b4597fe 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -1747,6 +1747,11 @@ ivas_error ivas_init_decoder( } else if ( st_ivas->ivas_format == MC_FORMAT ) { + if ( ( error = ivas_create_lfe_lpf_dec( &st_ivas->hLfeLpf, hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + if ( st_ivas->mc_mode == MC_MODE_MCT ) { /* init EFAP for custom LS setup */ @@ -2691,6 +2696,9 @@ void ivas_destroy_dec( /* LFE handle */ ivas_lfe_dec_close( &( st_ivas->hLFE ) ); + /* LFE low pass filter state */ + ivas_lfe_lpf_dec_close( &( st_ivas->hLfeLpf ) ); + /* Param-Upmix MC handle */ ivas_mc_paramupmix_dec_close( &( st_ivas->hMCParamUpmix ) ); diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index ffb018c06d..c933e4b55a 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -725,6 +725,9 @@ ivas_error ivas_jbm_dec_tc( ivas_mono_stereo_downmix_mcmasa( st_ivas, p_output, output_frame ); } } + + /* LFE low pass filter */ + ivas_lfe_lpf_dec_apply( st_ivas->hLfeLpf, p_output[LFE_CHANNEL], output_frame ); } /*----------------------------------------------------------------* diff --git a/lib_dec/ivas_lfe_dec.c b/lib_dec/ivas_lfe_dec.c index 83b1961907..d3175800e0 100644 --- a/lib_dec/ivas_lfe_dec.c +++ b/lib_dec/ivas_lfe_dec.c @@ -473,3 +473,77 @@ void ivas_lfe_dec_close( return; } + +/*------------------------------------------------------------------------- + * ivas_create_lfe_lpf_dec() + * + * Create, allocate and initialize IVAS decoder LFE low pass filter state handle + *-------------------------------------------------------------------------*/ + +ivas_error ivas_create_lfe_lpf_dec( + ivas_filters_process_state_t **hLfeLpf, /* o : LFE LPF handle */ + const int32_t input_Fs /* i : input sampling rate */ +) +{ + const float *filt_coeff; + + if ( hLfeLpf == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_UNEXPECTED_NULL_POINTER, "Can not allocate memory for LFE LPF\n" ) ); + } + + /*-----------------------------------------------------------------* + * Allocate LFE LPF handle + *-----------------------------------------------------------------*/ + + if ( ( *hLfeLpf = (ivas_filters_process_state_t *) malloc( sizeof( ivas_filters_process_state_t ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LFE LPF\n" ) ); + } + + ivas_lfe_lpf_select_filt_coeff( input_Fs, IVAS_FILTER_ORDER_4, &filt_coeff ); + + ivas_filters_init( *hLfeLpf, filt_coeff, IVAS_FILTER_ORDER_4 ); + + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------------- + * ivas_lfe_lpf_dec_close() + * + * Destroy IVAS decoder LFE low pass filter state + *-------------------------------------------------------------------------*/ + +void ivas_lfe_lpf_dec_close( + ivas_filters_process_state_t **hLfeLpf /* i/o: LFE LPF handle */ +) +{ + if ( hLfeLpf == NULL || *hLfeLpf == NULL ) + { + return; + } + + free( ( *hLfeLpf ) ); + ( *hLfeLpf ) = NULL; + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_lfe_lpf_dec_apply() + * + * Apply IVAS decoder LFE low pass filter + *-------------------------------------------------------------------------*/ + +void ivas_lfe_lpf_dec_apply( + ivas_filters_process_state_t *hLfeLpf, /* i/o: LFE LPF handle */ + float data_lfe_ch[], /* i/o: LFE signal */ + const int16_t input_frame /* i : input frame length per channel */ +) +{ + ivas_filter_process( hLfeLpf, data_lfe_ch, input_frame ); + + return; +} diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index ac0a802257..5847668983 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -1094,6 +1094,7 @@ typedef struct Decoder_Struct MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix; /* MC Param-Upmix handle */ MASA_DECODER_HANDLE hMasa; /* MASA handle */ LFE_DEC_HANDLE hLFE; /* LFE handle */ + ivas_filters_process_state_t *hLfeLpf; /* low pass filter state for LFE */ ISM_MODE ism_mode; /* ISM format mode */ int16_t nchan_ism; /* number of ISM channels */ -- GitLab From 2c5e5b74e941f2797be7bc80549563fbc21a54ce Mon Sep 17 00:00:00 2001 From: Adam Mills Date: Sun, 21 Apr 2024 20:55:57 +1000 Subject: [PATCH 02/14] Adding back in the LFE LPF for the decoder --- lib_com/ivas_prot.h | 19 +++++++++++ lib_dec/ivas_init_dec.c | 11 ++++++ lib_dec/ivas_jbm_dec.c | 3 ++ lib_dec/ivas_lfe_dec.c | 74 +++++++++++++++++++++++++++++++++++++++++ lib_dec/ivas_stat_dec.h | 1 + 5 files changed, 108 insertions(+) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 7a8ebafe55..919a638a7e 100755 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -5482,6 +5482,25 @@ void ivas_lfe_lpf_enc_apply( const int16_t input_frame /* i : input frame length per channel */ ); +/*----------------------------------------------------------------------------------* + * LFE decoder low pass filter prototypes + *----------------------------------------------------------------------------------*/ + +ivas_error ivas_create_lfe_lpf_dec( + ivas_filters_process_state_t **hLfeLpf, /* o : LFE LPF handle */ + const int32_t input_Fs /* i : input sampling rate */ +); + +void ivas_lfe_lpf_dec_close( + ivas_filters_process_state_t **hLfeLpf /* i/o: LFE LPF handle */ +); + +void ivas_lfe_lpf_dec_apply( + ivas_filters_process_state_t *hLfeLpf, /* i/o: LFE LPF handle */ + float data_lfe_ch[], /* i/o: LFE signal */ + const int16_t input_frame /* i : input frame length per channel */ +); + /*----------------------------------------------------------------------------------* * LFE Coding prototypes diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index 68badb98dd..66a2c7a776 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -1747,6 +1747,11 @@ ivas_error ivas_init_decoder( } else if ( st_ivas->ivas_format == MC_FORMAT ) { + if ( ( error = ivas_create_lfe_lpf_dec( &st_ivas->hLfeLpf, hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + if ( st_ivas->mc_mode == MC_MODE_MCT ) { /* init EFAP for custom LS setup */ @@ -2527,6 +2532,9 @@ void ivas_initialize_handles_dec( st_ivas->hParamMC = NULL; st_ivas->hLFE = NULL; + /* LFE low pass filter handle */ + st_ivas->hLfeLpf = NULL; + /* rendering handles */ st_ivas->hBinRenderer = NULL; #ifdef SPLIT_REND_WITH_HEAD_ROT @@ -2691,6 +2699,9 @@ void ivas_destroy_dec( /* LFE handle */ ivas_lfe_dec_close( &( st_ivas->hLFE ) ); + /* LFE low pass filter state */ + ivas_lfe_lpf_dec_close( &( st_ivas->hLfeLpf ) ); + /* Param-Upmix MC handle */ ivas_mc_paramupmix_dec_close( &( st_ivas->hMCParamUpmix ) ); diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index ffb018c06d..c933e4b55a 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -725,6 +725,9 @@ ivas_error ivas_jbm_dec_tc( ivas_mono_stereo_downmix_mcmasa( st_ivas, p_output, output_frame ); } } + + /* LFE low pass filter */ + ivas_lfe_lpf_dec_apply( st_ivas->hLfeLpf, p_output[LFE_CHANNEL], output_frame ); } /*----------------------------------------------------------------* diff --git a/lib_dec/ivas_lfe_dec.c b/lib_dec/ivas_lfe_dec.c index 83b1961907..d3175800e0 100644 --- a/lib_dec/ivas_lfe_dec.c +++ b/lib_dec/ivas_lfe_dec.c @@ -473,3 +473,77 @@ void ivas_lfe_dec_close( return; } + +/*------------------------------------------------------------------------- + * ivas_create_lfe_lpf_dec() + * + * Create, allocate and initialize IVAS decoder LFE low pass filter state handle + *-------------------------------------------------------------------------*/ + +ivas_error ivas_create_lfe_lpf_dec( + ivas_filters_process_state_t **hLfeLpf, /* o : LFE LPF handle */ + const int32_t input_Fs /* i : input sampling rate */ +) +{ + const float *filt_coeff; + + if ( hLfeLpf == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_UNEXPECTED_NULL_POINTER, "Can not allocate memory for LFE LPF\n" ) ); + } + + /*-----------------------------------------------------------------* + * Allocate LFE LPF handle + *-----------------------------------------------------------------*/ + + if ( ( *hLfeLpf = (ivas_filters_process_state_t *) malloc( sizeof( ivas_filters_process_state_t ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LFE LPF\n" ) ); + } + + ivas_lfe_lpf_select_filt_coeff( input_Fs, IVAS_FILTER_ORDER_4, &filt_coeff ); + + ivas_filters_init( *hLfeLpf, filt_coeff, IVAS_FILTER_ORDER_4 ); + + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------------- + * ivas_lfe_lpf_dec_close() + * + * Destroy IVAS decoder LFE low pass filter state + *-------------------------------------------------------------------------*/ + +void ivas_lfe_lpf_dec_close( + ivas_filters_process_state_t **hLfeLpf /* i/o: LFE LPF handle */ +) +{ + if ( hLfeLpf == NULL || *hLfeLpf == NULL ) + { + return; + } + + free( ( *hLfeLpf ) ); + ( *hLfeLpf ) = NULL; + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_lfe_lpf_dec_apply() + * + * Apply IVAS decoder LFE low pass filter + *-------------------------------------------------------------------------*/ + +void ivas_lfe_lpf_dec_apply( + ivas_filters_process_state_t *hLfeLpf, /* i/o: LFE LPF handle */ + float data_lfe_ch[], /* i/o: LFE signal */ + const int16_t input_frame /* i : input frame length per channel */ +) +{ + ivas_filter_process( hLfeLpf, data_lfe_ch, input_frame ); + + return; +} diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index ac0a802257..5847668983 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -1094,6 +1094,7 @@ typedef struct Decoder_Struct MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix; /* MC Param-Upmix handle */ MASA_DECODER_HANDLE hMasa; /* MASA handle */ LFE_DEC_HANDLE hLFE; /* LFE handle */ + ivas_filters_process_state_t *hLfeLpf; /* low pass filter state for LFE */ ISM_MODE ism_mode; /* ISM format mode */ int16_t nchan_ism; /* number of ISM channels */ -- GitLab From cbc671c9209339e801f927e5cbbae44a178ad233 Mon Sep 17 00:00:00 2001 From: Adam Mills Date: Mon, 22 Apr 2024 21:27:08 +1000 Subject: [PATCH 03/14] Fixing the delay compensation --- lib_com/ivas_prot.h | 2 +- lib_dec/ivas_init_dec.c | 27 ++++++++++++++++++--------- lib_dec/ivas_jbm_dec.c | 6 +++--- lib_dec/ivas_lfe_dec.c | 4 ++-- lib_dec/ivas_mct_dec.c | 16 ++++++++++++---- 5 files changed, 36 insertions(+), 19 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 919a638a7e..431a29cf5c 100755 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -5525,7 +5525,7 @@ void ivas_lfe_enc( ivas_error ivas_create_lfe_dec( LFE_DEC_HANDLE *hLFE_out, /* o : IVAS LFE decoder structure */ const int32_t output_Fs, /* i : output sampling rate */ - const int32_t binauralization_delay_ns /* i : additional LFE delay to sync with binaural renderer */ + const int32_t delay_ns /* i : additional LFE delay to sync other channel outputs */ ); void ivas_lfe_dec_close( diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index 66a2c7a776..472624a44e 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -1127,7 +1127,7 @@ ivas_error ivas_init_decoder( int16_t numCldfbAnalyses, numCldfbSyntheses; int16_t granularity, n_channels_transport_jbm; int32_t output_Fs, ivas_total_brate; - int32_t binauralization_delay_ns; + int32_t delay_ns; AUDIO_CONFIG output_config; DECODER_CONFIG_HANDLE hDecoderConfig; ivas_error error; @@ -1747,10 +1747,6 @@ ivas_error ivas_init_decoder( } else if ( st_ivas->ivas_format == MC_FORMAT ) { - if ( ( error = ivas_create_lfe_lpf_dec( &st_ivas->hLfeLpf, hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) - { - return error; - } if ( st_ivas->mc_mode == MC_MODE_MCT ) { @@ -1789,6 +1785,11 @@ ivas_error ivas_init_decoder( } else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) { + if ( ( error = ivas_create_lfe_lpf_dec( &st_ivas->hLfeLpf, hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + /* init EFAP for custom LS setup */ if ( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM ) { @@ -2203,7 +2204,7 @@ ivas_error ivas_init_decoder( if ( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) { - binauralization_delay_ns = st_ivas->binaural_latency_ns; + delay_ns = st_ivas->binaural_latency_ns; if ( st_ivas->hBinRenderer != NULL ) { if ( st_ivas->hBinRenderer->render_lfe ) @@ -2213,16 +2214,24 @@ ivas_error ivas_init_decoder( #endif { /* Account for filterbank delay */ - binauralization_delay_ns += IVAS_FB_DEC_DELAY_NS; + delay_ns += IVAS_FB_DEC_DELAY_NS; } } else { - binauralization_delay_ns = 0; + delay_ns = 0; + } + } + else + { + delay_ns = IVAS_FB_DEC_DELAY_NS; + if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) + { + delay_ns += 3500000L; /* 3.5 ms */ } } - if ( ( error = ivas_create_lfe_dec( &st_ivas->hLFE, output_Fs, binauralization_delay_ns ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_create_lfe_dec( &st_ivas->hLFE, output_Fs, delay_ns ) ) != IVAS_ERR_OK ) { return error; } diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index c933e4b55a..7fdb128568 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -647,6 +647,9 @@ ivas_error ivas_jbm_dec_tc( { ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, output_frame, p_output, p_output ); } + + /* LFE low pass filter */ + ivas_lfe_lpf_dec_apply( st_ivas->hLfeLpf, p_output[LFE_CHANNEL], output_frame ); } else if ( st_ivas->mc_mode == MC_MODE_MCMASA ) { @@ -725,9 +728,6 @@ ivas_error ivas_jbm_dec_tc( ivas_mono_stereo_downmix_mcmasa( st_ivas, p_output, output_frame ); } } - - /* LFE low pass filter */ - ivas_lfe_lpf_dec_apply( st_ivas->hLfeLpf, p_output[LFE_CHANNEL], output_frame ); } /*----------------------------------------------------------------* diff --git a/lib_dec/ivas_lfe_dec.c b/lib_dec/ivas_lfe_dec.c index d3175800e0..5afa088165 100644 --- a/lib_dec/ivas_lfe_dec.c +++ b/lib_dec/ivas_lfe_dec.c @@ -352,7 +352,7 @@ void ivas_lfe_dec( ivas_error ivas_create_lfe_dec( LFE_DEC_HANDLE *hLFE_out, /* o : IVAS LFE decoder structure */ const int32_t output_Fs, /* i : output sampling rate */ - const int32_t binauralization_delay_ns /* i : additional LFE delay to sync with binaural renderer */ + const int32_t delay_ns /* i : additional LFE delay to sync other channel outputs */ ) { float low_pass_delay_dec_out, block_offset_s; @@ -411,7 +411,7 @@ ivas_error ivas_create_lfe_dec( lfe_addl_delay_s = block_offset_s - hLFE->lfe_block_delay_s; lfe_addl_delay_s = max( 0.0f, lfe_addl_delay_s ); - add_delay_sa = (int16_t) roundf( (float) binauralization_delay_ns * output_Fs / 1000000000.f ); + 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; diff --git a/lib_dec/ivas_mct_dec.c b/lib_dec/ivas_mct_dec.c index 368f6e76b7..978fe8a92d 100644 --- a/lib_dec/ivas_mct_dec.c +++ b/lib_dec/ivas_mct_dec.c @@ -1117,21 +1117,29 @@ static ivas_error ivas_mc_dec_reconfig( if ( ( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) && st_ivas->hLFE == NULL ) { - int32_t binauralization_delay_ns = st_ivas->binaural_latency_ns; + int32_t delay_ns = st_ivas->binaural_latency_ns; if ( st_ivas->hBinRenderer != NULL ) { if ( st_ivas->hBinRenderer->render_lfe ) { /* Account for filterbank delay */ - binauralization_delay_ns += IVAS_FB_DEC_DELAY_NS; + delay_ns += IVAS_FB_DEC_DELAY_NS; } else { - binauralization_delay_ns = 0; + delay_ns = 0; + } + } + else + { + delay_ns = IVAS_FB_DEC_DELAY_NS; + if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) + { + delay_ns += 3500000L; /* 3.5 ms */ } } - if ( ( error = ivas_create_lfe_dec( &st_ivas->hLFE, st_ivas->hDecoderConfig->output_Fs, binauralization_delay_ns ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_create_lfe_dec( &st_ivas->hLFE, st_ivas->hDecoderConfig->output_Fs, delay_ns ) ) != IVAS_ERR_OK ) { return error; } -- GitLab From 217b72eaf9c267e72ec96ac5e23477d626f7ff67 Mon Sep 17 00:00:00 2001 From: Adam Mills Date: Tue, 23 Apr 2024 20:17:57 +1000 Subject: [PATCH 04/14] Fixing delay properly and moving things into the right positions --- lib_com/ivas_prot.h | 19 ------- lib_dec/ivas_init_dec.c | 89 ++++++++++++++++---------------- lib_dec/ivas_jbm_dec.c | 3 -- lib_dec/ivas_lfe_dec.c | 109 +++++++++++++--------------------------- 4 files changed, 77 insertions(+), 143 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 431a29cf5c..203722d296 100755 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -5482,25 +5482,6 @@ void ivas_lfe_lpf_enc_apply( const int16_t input_frame /* i : input frame length per channel */ ); -/*----------------------------------------------------------------------------------* - * LFE decoder low pass filter prototypes - *----------------------------------------------------------------------------------*/ - -ivas_error ivas_create_lfe_lpf_dec( - ivas_filters_process_state_t **hLfeLpf, /* o : LFE LPF handle */ - const int32_t input_Fs /* i : input sampling rate */ -); - -void ivas_lfe_lpf_dec_close( - ivas_filters_process_state_t **hLfeLpf /* i/o: LFE LPF handle */ -); - -void ivas_lfe_lpf_dec_apply( - ivas_filters_process_state_t *hLfeLpf, /* i/o: LFE LPF handle */ - float data_lfe_ch[], /* i/o: LFE signal */ - const int16_t input_frame /* i : input frame length per channel */ -); - /*----------------------------------------------------------------------------------* * LFE Coding prototypes diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index 472624a44e..1a9e4a0cd0 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -1785,11 +1785,6 @@ ivas_error ivas_init_decoder( } else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) { - if ( ( error = ivas_create_lfe_lpf_dec( &st_ivas->hLfeLpf, hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) - { - return error; - } - /* init EFAP for custom LS setup */ if ( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM ) { @@ -2198,6 +2193,42 @@ ivas_error ivas_init_decoder( } } + /*-----------------------------------------------------------------* + * CLDFB handles for rendering + *-----------------------------------------------------------------*/ + + ivas_init_dec_get_num_cldfb_instances( st_ivas, &numCldfbAnalyses, &numCldfbSyntheses ); + + for ( i = 0; i < numCldfbAnalyses; i++ ) + { + if ( ( error = openCldfb( &( st_ivas->cldfbAnaDec[i] ), CLDFB_ANALYSIS, output_Fs, CLDFB_PROTOTYPE_5_00MS ) ) != IVAS_ERR_OK ) + { + return error; + } + } + for ( ; i < MAX_INTERN_CHANNELS; i++ ) + { + st_ivas->cldfbAnaDec[i] = NULL; + } + + for ( i = 0; i < numCldfbSyntheses; i++ ) + { + if ( ( error = openCldfb( &( st_ivas->cldfbSynDec[i] ), CLDFB_SYNTHESIS, output_Fs, CLDFB_PROTOTYPE_5_00MS ) ) != IVAS_ERR_OK ) + { + return error; + } + } + for ( ; i < MAX_OUTPUT_CHANNELS; i++ ) + { + st_ivas->cldfbSynDec[i] = NULL; + } + + /* CLDFB Interpolation weights */ + if ( ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT ) && !st_ivas->sba_dirac_stereo_flag && st_ivas->hDecoderConfig->nchan_out != 1 ) + { + ivas_spar_get_cldfb_gains( st_ivas->hSpar, st_ivas->cldfbAnaDec[0], st_ivas->cldfbSynDec[0], hDecoderConfig ); + } + /*-----------------------------------------------------------------* * LFE handles for rendering after rendering to adjust LFE delay to binaural filter delay *-----------------------------------------------------------------*/ @@ -2224,10 +2255,13 @@ ivas_error ivas_init_decoder( } else { - delay_ns = IVAS_FB_DEC_DELAY_NS; - if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) + if ( ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) && ( st_ivas->cldfbSynDec[0] != NULL ) ) { - delay_ns += 3500000L; /* 3.5 ms */ + delay_ns = IVAS_FB_DEC_DELAY_NS; + } + else + { + delay_ns = 0; } } @@ -2240,42 +2274,6 @@ ivas_error ivas_init_decoder( set_zero( st_ivas->hLFE->prior_out_buffer, L_FRAME48k ); } - /*-----------------------------------------------------------------* - * CLDFB handles for rendering - *-----------------------------------------------------------------*/ - - ivas_init_dec_get_num_cldfb_instances( st_ivas, &numCldfbAnalyses, &numCldfbSyntheses ); - - for ( i = 0; i < numCldfbAnalyses; i++ ) - { - if ( ( error = openCldfb( &( st_ivas->cldfbAnaDec[i] ), CLDFB_ANALYSIS, output_Fs, CLDFB_PROTOTYPE_5_00MS ) ) != IVAS_ERR_OK ) - { - return error; - } - } - for ( ; i < MAX_INTERN_CHANNELS; i++ ) - { - st_ivas->cldfbAnaDec[i] = NULL; - } - - for ( i = 0; i < numCldfbSyntheses; i++ ) - { - if ( ( error = openCldfb( &( st_ivas->cldfbSynDec[i] ), CLDFB_SYNTHESIS, output_Fs, CLDFB_PROTOTYPE_5_00MS ) ) != IVAS_ERR_OK ) - { - return error; - } - } - for ( ; i < MAX_OUTPUT_CHANNELS; i++ ) - { - st_ivas->cldfbSynDec[i] = NULL; - } - - /* CLDFB Interpolation weights */ - if ( ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT ) && !st_ivas->sba_dirac_stereo_flag && st_ivas->hDecoderConfig->nchan_out != 1 ) - { - ivas_spar_get_cldfb_gains( st_ivas->hSpar, st_ivas->cldfbAnaDec[0], st_ivas->cldfbSynDec[0], hDecoderConfig ); - } - /*-----------------------------------------------------------------* * Allocate and initialize limiter struct *-----------------------------------------------------------------*/ @@ -2708,9 +2706,6 @@ void ivas_destroy_dec( /* LFE handle */ ivas_lfe_dec_close( &( st_ivas->hLFE ) ); - /* LFE low pass filter state */ - ivas_lfe_lpf_dec_close( &( st_ivas->hLfeLpf ) ); - /* Param-Upmix MC handle */ ivas_mc_paramupmix_dec_close( &( st_ivas->hMCParamUpmix ) ); diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 7fdb128568..ffb018c06d 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -647,9 +647,6 @@ ivas_error ivas_jbm_dec_tc( { ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, output_frame, p_output, p_output ); } - - /* LFE low pass filter */ - ivas_lfe_lpf_dec_apply( st_ivas->hLfeLpf, p_output[LFE_CHANNEL], output_frame ); } else if ( st_ivas->mc_mode == MC_MODE_MCMASA ) { diff --git a/lib_dec/ivas_lfe_dec.c b/lib_dec/ivas_lfe_dec.c index 5afa088165..9a6080861c 100644 --- a/lib_dec/ivas_lfe_dec.c +++ b/lib_dec/ivas_lfe_dec.c @@ -252,6 +252,29 @@ static int16_t ivas_lfe_dec_dequant( } + + +/*------------------------------------------------------------------------- + * ivas_create_lfe_lpf_dec() + * + * Create, allocate and initialize IVAS decoder LFE low pass filter state handle + *-------------------------------------------------------------------------*/ + +static ivas_error ivas_create_lfe_lpf_dec( + ivas_filters_process_state_t *hLfeLpf, /* o : LFE LPF handle */ + const int32_t input_Fs /* i : input sampling rate */ +) +{ + const float *filt_coeff; + + ivas_lfe_lpf_select_filt_coeff( input_Fs, IVAS_FILTER_ORDER_4, &filt_coeff ); + + ivas_filters_init( hLfeLpf, filt_coeff, IVAS_FILTER_ORDER_4 ); + + return IVAS_ERR_OK; +} + + /*-----------------------------------------------------------------------------------------* * Function ivas_lfe_dec() * @@ -361,6 +384,7 @@ ivas_error ivas_create_lfe_dec( float lfe_addl_delay_s; int16_t i, j; int16_t add_delay_sa; + ivas_error error; low_pass_delay_dec_out = 0; block_offset_s = 0; @@ -401,8 +425,19 @@ ivas_error ivas_create_lfe_dec( hLFE->lfe_block_delay_s = ( IVAS_LFE_FADE_NS / 1000000000.f ) + ivas_lfe_lpf_delay[IVAS_FILTER_ORDER_4 - 3]; block_offset_s = BLOCK_OFFSET_MS * 0.001f; + filt_order = 0; low_pass_delay_dec_out = 0; + if ( ( delay_ns / 1000000000.f ) > ivas_lfe_lpf_delay[IVAS_FILTER_ORDER_4 - 3] ) + { + filt_order = 4; + low_pass_delay_dec_out = 3500000L; + if ( ( error = ivas_create_lfe_lpf_dec( &( hLFE->filter_state ), output_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + } + hLFE->filter_state.order = filt_order; hLFE->lfe_block_delay_s = hLFE->lfe_block_delay_s + low_pass_delay_dec_out; hLFE->lfe_prior_buf_len = NS2SA( output_Fs, IVAS_LFE_FADE_NS ); @@ -473,77 +508,3 @@ void ivas_lfe_dec_close( return; } - -/*------------------------------------------------------------------------- - * ivas_create_lfe_lpf_dec() - * - * Create, allocate and initialize IVAS decoder LFE low pass filter state handle - *-------------------------------------------------------------------------*/ - -ivas_error ivas_create_lfe_lpf_dec( - ivas_filters_process_state_t **hLfeLpf, /* o : LFE LPF handle */ - const int32_t input_Fs /* i : input sampling rate */ -) -{ - const float *filt_coeff; - - if ( hLfeLpf == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_UNEXPECTED_NULL_POINTER, "Can not allocate memory for LFE LPF\n" ) ); - } - - /*-----------------------------------------------------------------* - * Allocate LFE LPF handle - *-----------------------------------------------------------------*/ - - if ( ( *hLfeLpf = (ivas_filters_process_state_t *) malloc( sizeof( ivas_filters_process_state_t ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LFE LPF\n" ) ); - } - - ivas_lfe_lpf_select_filt_coeff( input_Fs, IVAS_FILTER_ORDER_4, &filt_coeff ); - - ivas_filters_init( *hLfeLpf, filt_coeff, IVAS_FILTER_ORDER_4 ); - - return IVAS_ERR_OK; -} - - -/*------------------------------------------------------------------------- - * ivas_lfe_lpf_dec_close() - * - * Destroy IVAS decoder LFE low pass filter state - *-------------------------------------------------------------------------*/ - -void ivas_lfe_lpf_dec_close( - ivas_filters_process_state_t **hLfeLpf /* i/o: LFE LPF handle */ -) -{ - if ( hLfeLpf == NULL || *hLfeLpf == NULL ) - { - return; - } - - free( ( *hLfeLpf ) ); - ( *hLfeLpf ) = NULL; - - return; -} - - -/*------------------------------------------------------------------------- - * ivas_lfe_lpf_dec_apply() - * - * Apply IVAS decoder LFE low pass filter - *-------------------------------------------------------------------------*/ - -void ivas_lfe_lpf_dec_apply( - ivas_filters_process_state_t *hLfeLpf, /* i/o: LFE LPF handle */ - float data_lfe_ch[], /* i/o: LFE signal */ - const int16_t input_frame /* i : input frame length per channel */ -) -{ - ivas_filter_process( hLfeLpf, data_lfe_ch, input_frame ); - - return; -} -- GitLab From 7e1be44a39d51c847953b6e2bf2ad52364fdfc65 Mon Sep 17 00:00:00 2001 From: Adam Mills Date: Tue, 23 Apr 2024 20:17:57 +1000 Subject: [PATCH 05/14] Fixing delay properly and moving things into the right positions --- lib_com/ivas_prot.h | 19 ------- lib_dec/ivas_init_dec.c | 92 ++++++++++++++++----------------- lib_dec/ivas_jbm_dec.c | 3 -- lib_dec/ivas_lfe_dec.c | 109 +++++++++++++--------------------------- lib_dec/ivas_stat_dec.h | 1 - 5 files changed, 77 insertions(+), 147 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 431a29cf5c..203722d296 100755 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -5482,25 +5482,6 @@ void ivas_lfe_lpf_enc_apply( const int16_t input_frame /* i : input frame length per channel */ ); -/*----------------------------------------------------------------------------------* - * LFE decoder low pass filter prototypes - *----------------------------------------------------------------------------------*/ - -ivas_error ivas_create_lfe_lpf_dec( - ivas_filters_process_state_t **hLfeLpf, /* o : LFE LPF handle */ - const int32_t input_Fs /* i : input sampling rate */ -); - -void ivas_lfe_lpf_dec_close( - ivas_filters_process_state_t **hLfeLpf /* i/o: LFE LPF handle */ -); - -void ivas_lfe_lpf_dec_apply( - ivas_filters_process_state_t *hLfeLpf, /* i/o: LFE LPF handle */ - float data_lfe_ch[], /* i/o: LFE signal */ - const int16_t input_frame /* i : input frame length per channel */ -); - /*----------------------------------------------------------------------------------* * LFE Coding prototypes diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index 472624a44e..8016ac778a 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -1785,11 +1785,6 @@ ivas_error ivas_init_decoder( } else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) { - if ( ( error = ivas_create_lfe_lpf_dec( &st_ivas->hLfeLpf, hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) - { - return error; - } - /* init EFAP for custom LS setup */ if ( output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM ) { @@ -2198,6 +2193,42 @@ ivas_error ivas_init_decoder( } } + /*-----------------------------------------------------------------* + * CLDFB handles for rendering + *-----------------------------------------------------------------*/ + + ivas_init_dec_get_num_cldfb_instances( st_ivas, &numCldfbAnalyses, &numCldfbSyntheses ); + + for ( i = 0; i < numCldfbAnalyses; i++ ) + { + if ( ( error = openCldfb( &( st_ivas->cldfbAnaDec[i] ), CLDFB_ANALYSIS, output_Fs, CLDFB_PROTOTYPE_5_00MS ) ) != IVAS_ERR_OK ) + { + return error; + } + } + for ( ; i < MAX_INTERN_CHANNELS; i++ ) + { + st_ivas->cldfbAnaDec[i] = NULL; + } + + for ( i = 0; i < numCldfbSyntheses; i++ ) + { + if ( ( error = openCldfb( &( st_ivas->cldfbSynDec[i] ), CLDFB_SYNTHESIS, output_Fs, CLDFB_PROTOTYPE_5_00MS ) ) != IVAS_ERR_OK ) + { + return error; + } + } + for ( ; i < MAX_OUTPUT_CHANNELS; i++ ) + { + st_ivas->cldfbSynDec[i] = NULL; + } + + /* CLDFB Interpolation weights */ + if ( ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT ) && !st_ivas->sba_dirac_stereo_flag && st_ivas->hDecoderConfig->nchan_out != 1 ) + { + ivas_spar_get_cldfb_gains( st_ivas->hSpar, st_ivas->cldfbAnaDec[0], st_ivas->cldfbSynDec[0], hDecoderConfig ); + } + /*-----------------------------------------------------------------* * LFE handles for rendering after rendering to adjust LFE delay to binaural filter delay *-----------------------------------------------------------------*/ @@ -2224,10 +2255,13 @@ ivas_error ivas_init_decoder( } else { - delay_ns = IVAS_FB_DEC_DELAY_NS; - if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) + if ( ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) && ( st_ivas->cldfbSynDec[0] != NULL ) ) + { + delay_ns = IVAS_FB_DEC_DELAY_NS; + } + else { - delay_ns += 3500000L; /* 3.5 ms */ + delay_ns = 0; } } @@ -2240,42 +2274,6 @@ ivas_error ivas_init_decoder( set_zero( st_ivas->hLFE->prior_out_buffer, L_FRAME48k ); } - /*-----------------------------------------------------------------* - * CLDFB handles for rendering - *-----------------------------------------------------------------*/ - - ivas_init_dec_get_num_cldfb_instances( st_ivas, &numCldfbAnalyses, &numCldfbSyntheses ); - - for ( i = 0; i < numCldfbAnalyses; i++ ) - { - if ( ( error = openCldfb( &( st_ivas->cldfbAnaDec[i] ), CLDFB_ANALYSIS, output_Fs, CLDFB_PROTOTYPE_5_00MS ) ) != IVAS_ERR_OK ) - { - return error; - } - } - for ( ; i < MAX_INTERN_CHANNELS; i++ ) - { - st_ivas->cldfbAnaDec[i] = NULL; - } - - for ( i = 0; i < numCldfbSyntheses; i++ ) - { - if ( ( error = openCldfb( &( st_ivas->cldfbSynDec[i] ), CLDFB_SYNTHESIS, output_Fs, CLDFB_PROTOTYPE_5_00MS ) ) != IVAS_ERR_OK ) - { - return error; - } - } - for ( ; i < MAX_OUTPUT_CHANNELS; i++ ) - { - st_ivas->cldfbSynDec[i] = NULL; - } - - /* CLDFB Interpolation weights */ - if ( ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == SBA_ISM_FORMAT ) && !st_ivas->sba_dirac_stereo_flag && st_ivas->hDecoderConfig->nchan_out != 1 ) - { - ivas_spar_get_cldfb_gains( st_ivas->hSpar, st_ivas->cldfbAnaDec[0], st_ivas->cldfbSynDec[0], hDecoderConfig ); - } - /*-----------------------------------------------------------------* * Allocate and initialize limiter struct *-----------------------------------------------------------------*/ @@ -2541,9 +2539,6 @@ void ivas_initialize_handles_dec( st_ivas->hParamMC = NULL; st_ivas->hLFE = NULL; - /* LFE low pass filter handle */ - st_ivas->hLfeLpf = NULL; - /* rendering handles */ st_ivas->hBinRenderer = NULL; #ifdef SPLIT_REND_WITH_HEAD_ROT @@ -2708,9 +2703,6 @@ void ivas_destroy_dec( /* LFE handle */ ivas_lfe_dec_close( &( st_ivas->hLFE ) ); - /* LFE low pass filter state */ - ivas_lfe_lpf_dec_close( &( st_ivas->hLfeLpf ) ); - /* Param-Upmix MC handle */ ivas_mc_paramupmix_dec_close( &( st_ivas->hMCParamUpmix ) ); diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 7fdb128568..ffb018c06d 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -647,9 +647,6 @@ ivas_error ivas_jbm_dec_tc( { ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, output_frame, p_output, p_output ); } - - /* LFE low pass filter */ - ivas_lfe_lpf_dec_apply( st_ivas->hLfeLpf, p_output[LFE_CHANNEL], output_frame ); } else if ( st_ivas->mc_mode == MC_MODE_MCMASA ) { diff --git a/lib_dec/ivas_lfe_dec.c b/lib_dec/ivas_lfe_dec.c index 5afa088165..9a6080861c 100644 --- a/lib_dec/ivas_lfe_dec.c +++ b/lib_dec/ivas_lfe_dec.c @@ -252,6 +252,29 @@ static int16_t ivas_lfe_dec_dequant( } + + +/*------------------------------------------------------------------------- + * ivas_create_lfe_lpf_dec() + * + * Create, allocate and initialize IVAS decoder LFE low pass filter state handle + *-------------------------------------------------------------------------*/ + +static ivas_error ivas_create_lfe_lpf_dec( + ivas_filters_process_state_t *hLfeLpf, /* o : LFE LPF handle */ + const int32_t input_Fs /* i : input sampling rate */ +) +{ + const float *filt_coeff; + + ivas_lfe_lpf_select_filt_coeff( input_Fs, IVAS_FILTER_ORDER_4, &filt_coeff ); + + ivas_filters_init( hLfeLpf, filt_coeff, IVAS_FILTER_ORDER_4 ); + + return IVAS_ERR_OK; +} + + /*-----------------------------------------------------------------------------------------* * Function ivas_lfe_dec() * @@ -361,6 +384,7 @@ ivas_error ivas_create_lfe_dec( float lfe_addl_delay_s; int16_t i, j; int16_t add_delay_sa; + ivas_error error; low_pass_delay_dec_out = 0; block_offset_s = 0; @@ -401,8 +425,19 @@ ivas_error ivas_create_lfe_dec( hLFE->lfe_block_delay_s = ( IVAS_LFE_FADE_NS / 1000000000.f ) + ivas_lfe_lpf_delay[IVAS_FILTER_ORDER_4 - 3]; block_offset_s = BLOCK_OFFSET_MS * 0.001f; + filt_order = 0; low_pass_delay_dec_out = 0; + if ( ( delay_ns / 1000000000.f ) > ivas_lfe_lpf_delay[IVAS_FILTER_ORDER_4 - 3] ) + { + filt_order = 4; + low_pass_delay_dec_out = 3500000L; + if ( ( error = ivas_create_lfe_lpf_dec( &( hLFE->filter_state ), output_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + } + hLFE->filter_state.order = filt_order; hLFE->lfe_block_delay_s = hLFE->lfe_block_delay_s + low_pass_delay_dec_out; hLFE->lfe_prior_buf_len = NS2SA( output_Fs, IVAS_LFE_FADE_NS ); @@ -473,77 +508,3 @@ void ivas_lfe_dec_close( return; } - -/*------------------------------------------------------------------------- - * ivas_create_lfe_lpf_dec() - * - * Create, allocate and initialize IVAS decoder LFE low pass filter state handle - *-------------------------------------------------------------------------*/ - -ivas_error ivas_create_lfe_lpf_dec( - ivas_filters_process_state_t **hLfeLpf, /* o : LFE LPF handle */ - const int32_t input_Fs /* i : input sampling rate */ -) -{ - const float *filt_coeff; - - if ( hLfeLpf == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_UNEXPECTED_NULL_POINTER, "Can not allocate memory for LFE LPF\n" ) ); - } - - /*-----------------------------------------------------------------* - * Allocate LFE LPF handle - *-----------------------------------------------------------------*/ - - if ( ( *hLfeLpf = (ivas_filters_process_state_t *) malloc( sizeof( ivas_filters_process_state_t ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LFE LPF\n" ) ); - } - - ivas_lfe_lpf_select_filt_coeff( input_Fs, IVAS_FILTER_ORDER_4, &filt_coeff ); - - ivas_filters_init( *hLfeLpf, filt_coeff, IVAS_FILTER_ORDER_4 ); - - return IVAS_ERR_OK; -} - - -/*------------------------------------------------------------------------- - * ivas_lfe_lpf_dec_close() - * - * Destroy IVAS decoder LFE low pass filter state - *-------------------------------------------------------------------------*/ - -void ivas_lfe_lpf_dec_close( - ivas_filters_process_state_t **hLfeLpf /* i/o: LFE LPF handle */ -) -{ - if ( hLfeLpf == NULL || *hLfeLpf == NULL ) - { - return; - } - - free( ( *hLfeLpf ) ); - ( *hLfeLpf ) = NULL; - - return; -} - - -/*------------------------------------------------------------------------- - * ivas_lfe_lpf_dec_apply() - * - * Apply IVAS decoder LFE low pass filter - *-------------------------------------------------------------------------*/ - -void ivas_lfe_lpf_dec_apply( - ivas_filters_process_state_t *hLfeLpf, /* i/o: LFE LPF handle */ - float data_lfe_ch[], /* i/o: LFE signal */ - const int16_t input_frame /* i : input frame length per channel */ -) -{ - ivas_filter_process( hLfeLpf, data_lfe_ch, input_frame ); - - return; -} diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index 5847668983..ac0a802257 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -1094,7 +1094,6 @@ typedef struct Decoder_Struct MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix; /* MC Param-Upmix handle */ MASA_DECODER_HANDLE hMasa; /* MASA handle */ LFE_DEC_HANDLE hLFE; /* LFE handle */ - ivas_filters_process_state_t *hLfeLpf; /* low pass filter state for LFE */ ISM_MODE ism_mode; /* ISM format mode */ int16_t nchan_ism; /* number of ISM channels */ -- GitLab From 9aa18f1f10aaeb63a190496a581185229aa14fce Mon Sep 17 00:00:00 2001 From: Adam Mills Date: Tue, 23 Apr 2024 23:48:38 +1000 Subject: [PATCH 06/14] Fixing formatting --- lib_dec/ivas_lfe_dec.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/lib_dec/ivas_lfe_dec.c b/lib_dec/ivas_lfe_dec.c index 9a6080861c..3a22fb400c 100644 --- a/lib_dec/ivas_lfe_dec.c +++ b/lib_dec/ivas_lfe_dec.c @@ -252,8 +252,6 @@ static int16_t ivas_lfe_dec_dequant( } - - /*------------------------------------------------------------------------- * ivas_create_lfe_lpf_dec() * @@ -262,7 +260,7 @@ static int16_t ivas_lfe_dec_dequant( static ivas_error ivas_create_lfe_lpf_dec( ivas_filters_process_state_t *hLfeLpf, /* o : LFE LPF handle */ - const int32_t input_Fs /* i : input sampling rate */ + const int32_t input_Fs /* i : input sampling rate */ ) { const float *filt_coeff; @@ -373,9 +371,9 @@ void ivas_lfe_dec( *-------------------------------------------------------------------------*/ ivas_error ivas_create_lfe_dec( - LFE_DEC_HANDLE *hLFE_out, /* o : IVAS LFE decoder structure */ - const int32_t output_Fs, /* i : output sampling rate */ - const int32_t delay_ns /* i : additional LFE delay to sync other channel outputs */ + LFE_DEC_HANDLE *hLFE_out, /* o : IVAS LFE decoder structure */ + const int32_t output_Fs, /* i : output sampling rate */ + const int32_t delay_ns /* i : additional LFE delay to sync other channel outputs */ ) { float low_pass_delay_dec_out, block_offset_s; @@ -425,10 +423,10 @@ ivas_error ivas_create_lfe_dec( hLFE->lfe_block_delay_s = ( IVAS_LFE_FADE_NS / 1000000000.f ) + ivas_lfe_lpf_delay[IVAS_FILTER_ORDER_4 - 3]; block_offset_s = BLOCK_OFFSET_MS * 0.001f; - + filt_order = 0; low_pass_delay_dec_out = 0; - if ( ( delay_ns / 1000000000.f ) > ivas_lfe_lpf_delay[IVAS_FILTER_ORDER_4 - 3] ) + if ( ( delay_ns / 1000000000.f ) > ivas_lfe_lpf_delay[IVAS_FILTER_ORDER_4 - 3] ) { filt_order = 4; low_pass_delay_dec_out = 3500000L; -- GitLab From 85a59553b7a1bb27cccd14af4973d289aa4b95d9 Mon Sep 17 00:00:00 2001 From: Adam Mills Date: Wed, 24 Apr 2024 09:58:38 +1000 Subject: [PATCH 07/14] Updating LFE delay in other create LFE location --- lib_dec/ivas_mct_dec.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/lib_dec/ivas_mct_dec.c b/lib_dec/ivas_mct_dec.c index 978fe8a92d..87b4dd1e0e 100644 --- a/lib_dec/ivas_mct_dec.c +++ b/lib_dec/ivas_mct_dec.c @@ -1132,10 +1132,13 @@ static ivas_error ivas_mc_dec_reconfig( } else { - delay_ns = IVAS_FB_DEC_DELAY_NS; - if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) + if ( ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) && ( st_ivas->cldfbSynDec[0] != NULL ) ) { - delay_ns += 3500000L; /* 3.5 ms */ + delay_ns = IVAS_FB_DEC_DELAY_NS; + } + else + { + delay_ns = 0; } } -- GitLab From 48598cd540ce381472aed488b5b21b59310b8333 Mon Sep 17 00:00:00 2001 From: Adam Mills Date: Fri, 26 Apr 2024 16:57:44 +1000 Subject: [PATCH 08/14] fixing the delay for other mc cases --- lib_dec/ivas_init_dec.c | 6 +----- lib_dec/ivas_mct_dec.c | 6 +----- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index 8016ac778a..407a5f7edb 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -2257,11 +2257,7 @@ ivas_error ivas_init_decoder( { if ( ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) && ( st_ivas->cldfbSynDec[0] != NULL ) ) { - delay_ns = IVAS_FB_DEC_DELAY_NS; - } - else - { - delay_ns = 0; + delay_ns += IVAS_FB_DEC_DELAY_NS; } } diff --git a/lib_dec/ivas_mct_dec.c b/lib_dec/ivas_mct_dec.c index 87b4dd1e0e..c7cba14ebe 100644 --- a/lib_dec/ivas_mct_dec.c +++ b/lib_dec/ivas_mct_dec.c @@ -1134,11 +1134,7 @@ static ivas_error ivas_mc_dec_reconfig( { if ( ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) && ( st_ivas->cldfbSynDec[0] != NULL ) ) { - delay_ns = IVAS_FB_DEC_DELAY_NS; - } - else - { - delay_ns = 0; + delay_ns += IVAS_FB_DEC_DELAY_NS; } } -- GitLab From 4725d6c2a378cadcbd92af328c9f9818c8c83782 Mon Sep 17 00:00:00 2001 From: Adam Mills Date: Mon, 29 Apr 2024 10:33:17 +1000 Subject: [PATCH 09/14] Removing the unused 2nd order filter code --- lib_com/ivas_cnst.h | 1 - lib_com/ivas_filters.c | 3 +-- lib_com/ivas_lfe_com.c | 16 ---------------- lib_com/ivas_rom_com.c | 5 ----- lib_com/ivas_rom_com.h | 1 - 5 files changed, 1 insertion(+), 25 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index d8901eec0f..dda086431c 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -1424,7 +1424,6 @@ typedef enum typedef enum { IVAS_FILTER_ORDER_1 = 1, - IVAS_FILTER_ORDER_2 = 2, IVAS_FILTER_ORDER_4 = 4, } ivas_filter_order; diff --git a/lib_com/ivas_filters.c b/lib_com/ivas_filters.c index fcb871ff34..cf5a0cc049 100644 --- a/lib_com/ivas_filters.c +++ b/lib_com/ivas_filters.c @@ -62,7 +62,7 @@ void ivas_filters_init( int16_t i; filter_state->order = order; - if ( order == IVAS_FILTER_ORDER_2 || order == IVAS_FILTER_ORDER_1 ) + if ( order == IVAS_FILTER_ORDER_1 ) { filter_state->filt_len = order + 1; @@ -116,7 +116,6 @@ void ivas_filter_process( switch ( filter_state->order ) { case IVAS_FILTER_ORDER_1: - case IVAS_FILTER_ORDER_2: ivas_iir_2_filter( filter_state, pIn_Out, length, IVAS_FILTER_STAGE_0 ); break; case IVAS_FILTER_ORDER_4: diff --git a/lib_com/ivas_lfe_com.c b/lib_com/ivas_lfe_com.c index 83c94551e0..0e29fcc7d6 100644 --- a/lib_com/ivas_lfe_com.c +++ b/lib_com/ivas_lfe_com.c @@ -60,22 +60,6 @@ void ivas_lfe_lpf_select_filt_coeff( { switch ( order ) { - case IVAS_FILTER_ORDER_2: - switch ( sampling_rate ) - { - case 16000: - *ppFilt_coeff = ivas_lpf_2_butter_16k; - break; - case 32000: - *ppFilt_coeff = ivas_lpf_2_butter_32k; - break; - case 48000: - *ppFilt_coeff = ivas_lpf_2_butter_48k; - break; - default: - break; - } - break; case IVAS_FILTER_ORDER_4: switch ( sampling_rate ) { diff --git a/lib_com/ivas_rom_com.c b/lib_com/ivas_rom_com.c index 68169f10d4..85b82709c2 100644 --- a/lib_com/ivas_rom_com.c +++ b/lib_com/ivas_rom_com.c @@ -3079,11 +3079,6 @@ const float ivas_lpf_4_butter_48k_sos[IVAS_BIQUAD_FILT_LEN << 2] = 1.00000000471366f, 1.f , -1.98677297369091f, 0.987060670205863f }; -const float ivas_lpf_2_butter_16k[IVAS_BIQUAD_FILT_LEN << 1] = -{ - 0.000628720643081143f, 0.00125744128616229f, 0.000628720643081143f, 1.f, -1.92783286977036f, 0.930347752342683f -}; - const float ivas_lpf_2_butter_32k[IVAS_BIQUAD_FILT_LEN << 1] = { 0.000159990787823749f, 0.000319981575647499f, 0.000159990787823749f, 1.f, -1.96390539174033f, 0.964545354891623f diff --git a/lib_com/ivas_rom_com.h b/lib_com/ivas_rom_com.h index 2cfecaefb3..e492c81ec5 100644 --- a/lib_com/ivas_rom_com.h +++ b/lib_com/ivas_rom_com.h @@ -348,7 +348,6 @@ extern const int16_t Param_ISM_band_grouping[MAX_PARAM_ISM_NBANDS + 1]; extern const float ivas_lpf_4_butter_16k_sos[IVAS_BIQUAD_FILT_LEN << 2]; extern const float ivas_lpf_4_butter_32k_sos[IVAS_BIQUAD_FILT_LEN << 2]; extern const float ivas_lpf_4_butter_48k_sos[IVAS_BIQUAD_FILT_LEN << 2]; -extern const float ivas_lpf_2_butter_16k[IVAS_BIQUAD_FILT_LEN << 1]; extern const float ivas_lpf_2_butter_32k[IVAS_BIQUAD_FILT_LEN << 1]; extern const float ivas_lpf_2_butter_48k[IVAS_BIQUAD_FILT_LEN << 1]; -- GitLab From ca907584260adc3936f031efb6e93ea6e6be3681 Mon Sep 17 00:00:00 2001 From: Adam Mills Date: Mon, 29 Apr 2024 14:10:13 +1000 Subject: [PATCH 10/14] Adding in a switch for the code changes --- lib_com/ivas_cnst.h | 3 +++ lib_com/ivas_filters.c | 7 +++++++ lib_com/ivas_lfe_com.c | 18 +++++++++++++++++ lib_com/ivas_prot.h | 4 ++++ lib_com/ivas_rom_com.c | 7 +++++++ lib_com/ivas_rom_com.h | 3 +++ lib_com/options.h | 2 ++ lib_dec/ivas_init_dec.c | 43 ++++++++++++++++++++++++++++++++++++++++- lib_dec/ivas_lfe_dec.c | 19 +++++++++++++++--- lib_dec/ivas_mct_dec.c | 18 +++++++++++++++++ 10 files changed, 120 insertions(+), 4 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index dda086431c..9d842f9b37 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -1424,6 +1424,9 @@ typedef enum typedef enum { IVAS_FILTER_ORDER_1 = 1, +#ifndef NONBE_FIX_MC_LFE_LPF + IVAS_FILTER_ORDER_2 = 2, +#endif IVAS_FILTER_ORDER_4 = 4, } ivas_filter_order; diff --git a/lib_com/ivas_filters.c b/lib_com/ivas_filters.c index cf5a0cc049..2c60e8743d 100644 --- a/lib_com/ivas_filters.c +++ b/lib_com/ivas_filters.c @@ -62,7 +62,11 @@ void ivas_filters_init( int16_t i; filter_state->order = order; +#ifdef NONBE_FIX_MC_LFE_LPF if ( order == IVAS_FILTER_ORDER_1 ) +#else + if ( order == IVAS_FILTER_ORDER_2 || order == IVAS_FILTER_ORDER_1 ) +#endif { filter_state->filt_len = order + 1; @@ -116,6 +120,9 @@ void ivas_filter_process( switch ( filter_state->order ) { case IVAS_FILTER_ORDER_1: +#ifndef NONBE_FIX_MC_LFE_LPF + case IVAS_FILTER_ORDER_2: +#endif ivas_iir_2_filter( filter_state, pIn_Out, length, IVAS_FILTER_STAGE_0 ); break; case IVAS_FILTER_ORDER_4: diff --git a/lib_com/ivas_lfe_com.c b/lib_com/ivas_lfe_com.c index 0e29fcc7d6..34e3a9925c 100644 --- a/lib_com/ivas_lfe_com.c +++ b/lib_com/ivas_lfe_com.c @@ -60,6 +60,24 @@ void ivas_lfe_lpf_select_filt_coeff( { switch ( order ) { +#ifndef NONBE_FIX_MC_LFE_LPF + case IVAS_FILTER_ORDER_2: + switch ( sampling_rate ) + { + case 16000: + *ppFilt_coeff = ivas_lpf_2_butter_16k; + break; + case 32000: + *ppFilt_coeff = ivas_lpf_2_butter_32k; + break; + case 48000: + *ppFilt_coeff = ivas_lpf_2_butter_48k; + break; + default: + break; + } + break; +#endif case IVAS_FILTER_ORDER_4: switch ( sampling_rate ) { diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 5eda65089b..9d34acc1de 100755 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -5507,7 +5507,11 @@ void ivas_lfe_enc( ivas_error ivas_create_lfe_dec( LFE_DEC_HANDLE *hLFE_out, /* o : IVAS LFE decoder structure */ const int32_t output_Fs, /* i : output sampling rate */ +#ifdef NONBE_FIX_MC_LFE_LPF const int32_t delay_ns /* i : additional LFE delay to sync other channel outputs */ +#else + const int32_t binauralization_delay_ns /* i : additional LFE delay to sync with binaural renderer */ +#endif ); void ivas_lfe_dec_close( diff --git a/lib_com/ivas_rom_com.c b/lib_com/ivas_rom_com.c index 85b82709c2..d05dacd58b 100644 --- a/lib_com/ivas_rom_com.c +++ b/lib_com/ivas_rom_com.c @@ -3079,6 +3079,12 @@ const float ivas_lpf_4_butter_48k_sos[IVAS_BIQUAD_FILT_LEN << 2] = 1.00000000471366f, 1.f , -1.98677297369091f, 0.987060670205863f }; +#ifndef NONBE_FIX_MC_LFE_LPF +const float ivas_lpf_2_butter_16k[IVAS_BIQUAD_FILT_LEN << 1] = +{ + 0.000628720643081143f, 0.00125744128616229f, 0.000628720643081143f, 1.f, -1.92783286977036f, 0.930347752342683f +}; + const float ivas_lpf_2_butter_32k[IVAS_BIQUAD_FILT_LEN << 1] = { 0.000159990787823749f, 0.000319981575647499f, 0.000159990787823749f, 1.f, -1.96390539174033f, 0.964545354891623f @@ -3088,6 +3094,7 @@ const float ivas_lpf_2_butter_48k[IVAS_BIQUAD_FILT_LEN << 1] = { 7.15317998432330e-05f, 0.000143063599686466f, 7.15317998432330e-05f, 1.f, -1.97593552482925f, 0.976221652028620f }; +#endif const ivas_lfe_freq_models ivas_str_lfe_freq_models = { diff --git a/lib_com/ivas_rom_com.h b/lib_com/ivas_rom_com.h index e492c81ec5..a87d186465 100644 --- a/lib_com/ivas_rom_com.h +++ b/lib_com/ivas_rom_com.h @@ -348,8 +348,11 @@ extern const int16_t Param_ISM_band_grouping[MAX_PARAM_ISM_NBANDS + 1]; extern const float ivas_lpf_4_butter_16k_sos[IVAS_BIQUAD_FILT_LEN << 2]; extern const float ivas_lpf_4_butter_32k_sos[IVAS_BIQUAD_FILT_LEN << 2]; extern const float ivas_lpf_4_butter_48k_sos[IVAS_BIQUAD_FILT_LEN << 2]; +#ifndef NONBE_FIX_MC_LFE_LPF +extern const float ivas_lpf_2_butter_16k[IVAS_BIQUAD_FILT_LEN << 1]; extern const float ivas_lpf_2_butter_32k[IVAS_BIQUAD_FILT_LEN << 1]; extern const float ivas_lpf_2_butter_48k[IVAS_BIQUAD_FILT_LEN << 1]; +#endif extern const float ivas_lfe_window_coeff_48k[IVAS_LFE_FADE_LEN_48K]; extern const float ivas_lfe_window_coeff_32k[IVAS_LFE_FADE_LEN_32K]; diff --git a/lib_com/options.h b/lib_com/options.h index eabcfa0239..ccc2b166e8 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -174,6 +174,8 @@ #define NONBE_FIX_1028_1DB_TCX_LEVEL_DROP /* VA: Harmonize the logic setting LP weighting factor between TCX encoder and TCX decoder */ #define NONBE_FIX_SBA_SIGNALING_BITS_B /* FhG: issue 1061: option B: signal sba order additionally in OSBA */ +#define NONBE_FIX_MC_LFE_LPF /* Dlb: Adding the LFE LPF filter back for MC content. */ + /* ##################### End NON-BE switches ########################### */ diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index d42d0ec5d4..00945c8645 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -1117,7 +1117,11 @@ ivas_error ivas_init_decoder( int16_t numCldfbAnalyses, numCldfbSyntheses; int16_t granularity, n_channels_transport_jbm; int32_t output_Fs, ivas_total_brate; +#ifdef NONBE_FIX_MC_LFE_LPF int32_t delay_ns; +#else + int32_t binauralization_delay_ns; +#endif AUDIO_CONFIG output_config; DECODER_CONFIG_HANDLE hDecoderConfig; ivas_error error; @@ -1738,7 +1742,6 @@ ivas_error ivas_init_decoder( } else if ( st_ivas->ivas_format == MC_FORMAT ) { - if ( st_ivas->mc_mode == MC_MODE_MCT ) { /* init EFAP for custom LS setup */ @@ -2184,6 +2187,42 @@ ivas_error ivas_init_decoder( } } +#ifndef NONBE_FIX_MC_LFE_LPF + /*-----------------------------------------------------------------* + * LFE handles for rendering after rendering to adjust LFE delay to binaural filter delay + *-----------------------------------------------------------------*/ + + if ( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) + { + binauralization_delay_ns = st_ivas->binaural_latency_ns; + if ( st_ivas->hBinRenderer != NULL ) + { + if ( st_ivas->hBinRenderer->render_lfe ) + { +#ifdef SPLIT_REND_WITH_HEAD_ROT + if ( st_ivas->hDecoderConfig->output_config != IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED && st_ivas->hDecoderConfig->output_config != IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) +#endif + { + /* Account for filterbank delay */ + binauralization_delay_ns += IVAS_FB_DEC_DELAY_NS; + } + } + else + { + binauralization_delay_ns = 0; + } + } + + if ( ( error = ivas_create_lfe_dec( &st_ivas->hLFE, output_Fs, binauralization_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 + /*-----------------------------------------------------------------* * CLDFB handles for rendering *-----------------------------------------------------------------*/ @@ -2220,6 +2259,7 @@ ivas_error ivas_init_decoder( ivas_spar_get_cldfb_gains( st_ivas->hSpar, st_ivas->cldfbAnaDec[0], st_ivas->cldfbSynDec[0], hDecoderConfig ); } +#ifdef NONBE_FIX_MC_LFE_LPF /*-----------------------------------------------------------------* * LFE handles for rendering after rendering to adjust LFE delay to binaural filter delay *-----------------------------------------------------------------*/ @@ -2260,6 +2300,7 @@ ivas_error ivas_init_decoder( set_zero( st_ivas->hLFE->prevsynth_buf, LFE_PLC_BUFLEN ); set_zero( st_ivas->hLFE->prior_out_buffer, L_FRAME48k ); } +#endif /*-----------------------------------------------------------------* * Allocate and initialize limiter struct diff --git a/lib_dec/ivas_lfe_dec.c b/lib_dec/ivas_lfe_dec.c index 3a22fb400c..430cc40578 100644 --- a/lib_dec/ivas_lfe_dec.c +++ b/lib_dec/ivas_lfe_dec.c @@ -251,7 +251,7 @@ static int16_t ivas_lfe_dec_dequant( return lfe_bits; } - +#ifdef NONBE_FIX_MC_LFE_LPF /*------------------------------------------------------------------------- * ivas_create_lfe_lpf_dec() * @@ -271,7 +271,7 @@ static ivas_error ivas_create_lfe_lpf_dec( return IVAS_ERR_OK; } - +#endif /*-----------------------------------------------------------------------------------------* * Function ivas_lfe_dec() @@ -371,9 +371,15 @@ void ivas_lfe_dec( *-------------------------------------------------------------------------*/ ivas_error ivas_create_lfe_dec( +#ifdef NONBE_FIX_MC_LFE_LPF LFE_DEC_HANDLE *hLFE_out, /* o : IVAS LFE decoder structure */ const int32_t output_Fs, /* i : output sampling rate */ const int32_t delay_ns /* i : additional LFE delay to sync other channel outputs */ +#else + LFE_DEC_HANDLE *hLFE_out, /* o : IVAS LFE decoder structure */ + const int32_t output_Fs, /* i : output sampling rate */ + const int32_t binauralization_delay_ns /* i : additional LFE delay to sync with binaural renderer */ +#endif ) { float low_pass_delay_dec_out, block_offset_s; @@ -382,7 +388,9 @@ ivas_error ivas_create_lfe_dec( float lfe_addl_delay_s; int16_t i, j; int16_t add_delay_sa; +#ifdef NONBE_FIX_MC_LFE_LPF ivas_error error; +#endif low_pass_delay_dec_out = 0; block_offset_s = 0; @@ -423,9 +431,9 @@ ivas_error ivas_create_lfe_dec( hLFE->lfe_block_delay_s = ( IVAS_LFE_FADE_NS / 1000000000.f ) + ivas_lfe_lpf_delay[IVAS_FILTER_ORDER_4 - 3]; block_offset_s = BLOCK_OFFSET_MS * 0.001f; - filt_order = 0; low_pass_delay_dec_out = 0; +#ifdef NONBE_FIX_MC_LFE_LPF if ( ( delay_ns / 1000000000.f ) > ivas_lfe_lpf_delay[IVAS_FILTER_ORDER_4 - 3] ) { filt_order = 4; @@ -435,6 +443,7 @@ ivas_error ivas_create_lfe_dec( return error; } } +#endif hLFE->filter_state.order = filt_order; hLFE->lfe_block_delay_s = hLFE->lfe_block_delay_s + low_pass_delay_dec_out; @@ -444,7 +453,11 @@ ivas_error ivas_create_lfe_dec( lfe_addl_delay_s = block_offset_s - hLFE->lfe_block_delay_s; lfe_addl_delay_s = max( 0.0f, lfe_addl_delay_s ); +#ifdef NONBE_FIX_MC_LFE_LPF add_delay_sa = (int16_t) roundf( (float) delay_ns * output_Fs / 1000000000.f ); +#else + add_delay_sa = (int16_t) roundf( (float) binauralization_delay_ns * output_Fs / 1000000000.f ); +#endif 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; diff --git a/lib_dec/ivas_mct_dec.c b/lib_dec/ivas_mct_dec.c index c7cba14ebe..35099d4dca 100644 --- a/lib_dec/ivas_mct_dec.c +++ b/lib_dec/ivas_mct_dec.c @@ -1117,19 +1117,32 @@ static ivas_error ivas_mc_dec_reconfig( if ( ( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) && st_ivas->hLFE == NULL ) { +#ifdef NONBE_FIX_MC_LFE_LPF int32_t delay_ns = st_ivas->binaural_latency_ns; +#else + int32_t binauralization_delay_ns = st_ivas->binaural_latency_ns; +#endif if ( st_ivas->hBinRenderer != NULL ) { if ( st_ivas->hBinRenderer->render_lfe ) { /* Account for filterbank delay */ +#ifdef NONBE_FIX_MC_LFE_LPF delay_ns += IVAS_FB_DEC_DELAY_NS; +#else + 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 } } +#ifdef NONBE_FIX_MC_LFE_LPF else { if ( ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) && ( st_ivas->cldfbSynDec[0] != NULL ) ) @@ -1137,8 +1150,13 @@ static ivas_error ivas_mc_dec_reconfig( delay_ns += IVAS_FB_DEC_DELAY_NS; } } +#endif +#ifdef NONBE_FIX_MC_LFE_LPF if ( ( error = ivas_create_lfe_dec( &st_ivas->hLFE, st_ivas->hDecoderConfig->output_Fs, delay_ns ) ) != IVAS_ERR_OK ) +#else + if ( ( error = ivas_create_lfe_dec( &st_ivas->hLFE, st_ivas->hDecoderConfig->output_Fs, binauralization_delay_ns ) ) != IVAS_ERR_OK ) +#endif { return error; } -- GitLab From 6fcded338da6cc75d1351da465b759095dbdd7ce Mon Sep 17 00:00:00 2001 From: Adam Mills Date: Tue, 30 Apr 2024 10:23:57 +1000 Subject: [PATCH 11/14] Addressing review comments --- lib_com/ivas_rom_com.c | 1 - lib_dec/ivas_lfe_dec.c | 13 ++++--------- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/lib_com/ivas_rom_com.c b/lib_com/ivas_rom_com.c index d05dacd58b..c0c8de6ad5 100644 --- a/lib_com/ivas_rom_com.c +++ b/lib_com/ivas_rom_com.c @@ -3095,7 +3095,6 @@ const float ivas_lpf_2_butter_48k[IVAS_BIQUAD_FILT_LEN << 1] = 7.15317998432330e-05f, 0.000143063599686466f, 7.15317998432330e-05f, 1.f, -1.97593552482925f, 0.976221652028620f }; #endif - const ivas_lfe_freq_models ivas_str_lfe_freq_models = { { 16384, 14924, 13463, 12003, 10542, 9082, 7622, 6161, diff --git a/lib_dec/ivas_lfe_dec.c b/lib_dec/ivas_lfe_dec.c index 430cc40578..f391c4fc55 100644 --- a/lib_dec/ivas_lfe_dec.c +++ b/lib_dec/ivas_lfe_dec.c @@ -258,7 +258,7 @@ static int16_t ivas_lfe_dec_dequant( * Create, allocate and initialize IVAS decoder LFE low pass filter state handle *-------------------------------------------------------------------------*/ -static ivas_error ivas_create_lfe_lpf_dec( +static void ivas_create_lfe_lpf_dec( ivas_filters_process_state_t *hLfeLpf, /* o : LFE LPF handle */ const int32_t input_Fs /* i : input sampling rate */ ) @@ -266,13 +266,11 @@ static ivas_error ivas_create_lfe_lpf_dec( const float *filt_coeff; ivas_lfe_lpf_select_filt_coeff( input_Fs, IVAS_FILTER_ORDER_4, &filt_coeff ); - ivas_filters_init( hLfeLpf, filt_coeff, IVAS_FILTER_ORDER_4 ); - return IVAS_ERR_OK; + return; } #endif - /*-----------------------------------------------------------------------------------------* * Function ivas_lfe_dec() * @@ -374,7 +372,7 @@ ivas_error ivas_create_lfe_dec( #ifdef NONBE_FIX_MC_LFE_LPF LFE_DEC_HANDLE *hLFE_out, /* o : IVAS LFE decoder structure */ const int32_t output_Fs, /* i : output sampling rate */ - const int32_t delay_ns /* i : additional LFE delay to sync other channel outputs */ + const int32_t delay_ns /* i : additional LFE delay to sync other channel outputs */ #else LFE_DEC_HANDLE *hLFE_out, /* o : IVAS LFE decoder structure */ const int32_t output_Fs, /* i : output sampling rate */ @@ -438,10 +436,7 @@ ivas_error ivas_create_lfe_dec( { filt_order = 4; low_pass_delay_dec_out = 3500000L; - if ( ( error = ivas_create_lfe_lpf_dec( &( hLFE->filter_state ), output_Fs ) ) != IVAS_ERR_OK ) - { - return error; - } + ivas_create_lfe_lpf_dec( &( hLFE->filter_state ), output_Fs ); } #endif -- GitLab From 64afb4c3cd26154ebc37f56a3853c9384fbfab0f Mon Sep 17 00:00:00 2001 From: Adam Mills Date: Tue, 30 Apr 2024 10:23:57 +1000 Subject: [PATCH 12/14] Addressing review comments --- lib_com/ivas_rom_com.c | 1 - lib_dec/ivas_lfe_dec.c | 16 ++++------------ 2 files changed, 4 insertions(+), 13 deletions(-) diff --git a/lib_com/ivas_rom_com.c b/lib_com/ivas_rom_com.c index d05dacd58b..c0c8de6ad5 100644 --- a/lib_com/ivas_rom_com.c +++ b/lib_com/ivas_rom_com.c @@ -3095,7 +3095,6 @@ const float ivas_lpf_2_butter_48k[IVAS_BIQUAD_FILT_LEN << 1] = 7.15317998432330e-05f, 0.000143063599686466f, 7.15317998432330e-05f, 1.f, -1.97593552482925f, 0.976221652028620f }; #endif - const ivas_lfe_freq_models ivas_str_lfe_freq_models = { { 16384, 14924, 13463, 12003, 10542, 9082, 7622, 6161, diff --git a/lib_dec/ivas_lfe_dec.c b/lib_dec/ivas_lfe_dec.c index 430cc40578..83229d86ac 100644 --- a/lib_dec/ivas_lfe_dec.c +++ b/lib_dec/ivas_lfe_dec.c @@ -258,7 +258,7 @@ static int16_t ivas_lfe_dec_dequant( * Create, allocate and initialize IVAS decoder LFE low pass filter state handle *-------------------------------------------------------------------------*/ -static ivas_error ivas_create_lfe_lpf_dec( +static void ivas_create_lfe_lpf_dec( ivas_filters_process_state_t *hLfeLpf, /* o : LFE LPF handle */ const int32_t input_Fs /* i : input sampling rate */ ) @@ -266,13 +266,11 @@ static ivas_error ivas_create_lfe_lpf_dec( const float *filt_coeff; ivas_lfe_lpf_select_filt_coeff( input_Fs, IVAS_FILTER_ORDER_4, &filt_coeff ); - ivas_filters_init( hLfeLpf, filt_coeff, IVAS_FILTER_ORDER_4 ); - return IVAS_ERR_OK; + return; } #endif - /*-----------------------------------------------------------------------------------------* * Function ivas_lfe_dec() * @@ -374,7 +372,7 @@ ivas_error ivas_create_lfe_dec( #ifdef NONBE_FIX_MC_LFE_LPF LFE_DEC_HANDLE *hLFE_out, /* o : IVAS LFE decoder structure */ const int32_t output_Fs, /* i : output sampling rate */ - const int32_t delay_ns /* i : additional LFE delay to sync other channel outputs */ + const int32_t delay_ns /* i : additional LFE delay to sync other channel outputs */ #else LFE_DEC_HANDLE *hLFE_out, /* o : IVAS LFE decoder structure */ const int32_t output_Fs, /* i : output sampling rate */ @@ -388,9 +386,6 @@ ivas_error ivas_create_lfe_dec( float lfe_addl_delay_s; int16_t i, j; int16_t add_delay_sa; -#ifdef NONBE_FIX_MC_LFE_LPF - ivas_error error; -#endif low_pass_delay_dec_out = 0; block_offset_s = 0; @@ -438,10 +433,7 @@ ivas_error ivas_create_lfe_dec( { filt_order = 4; low_pass_delay_dec_out = 3500000L; - if ( ( error = ivas_create_lfe_lpf_dec( &( hLFE->filter_state ), output_Fs ) ) != IVAS_ERR_OK ) - { - return error; - } + ivas_create_lfe_lpf_dec( &( hLFE->filter_state ), output_Fs ); } #endif -- GitLab From af56d8f98dfdb89830095b89d7f5b92813d31716 Mon Sep 17 00:00:00 2001 From: Adam Mills Date: Tue, 7 May 2024 15:52:19 +1000 Subject: [PATCH 13/14] Addressing review comments --- lib_dec/ivas_init_dec.c | 5 ++--- lib_dec/ivas_lfe_dec.c | 5 ++++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index 64788d02b7..1bc65f8e29 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -2181,7 +2181,7 @@ ivas_error ivas_init_decoder( #ifndef NONBE_FIX_MC_LFE_LPF /*-----------------------------------------------------------------* - * LFE handles for rendering after rendering to adjust LFE delay to binaural filter delay + * LFE handles for rendering after rendering to adjust LFE delay to filter delay *-----------------------------------------------------------------*/ if ( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) @@ -2214,7 +2214,6 @@ ivas_error ivas_init_decoder( set_zero( st_ivas->hLFE->prior_out_buffer, L_FRAME48k ); } #endif - /*-----------------------------------------------------------------* * CLDFB handles for rendering *-----------------------------------------------------------------*/ @@ -2253,7 +2252,7 @@ ivas_error ivas_init_decoder( #ifdef NONBE_FIX_MC_LFE_LPF /*-----------------------------------------------------------------* - * LFE handles for rendering after rendering to adjust LFE delay to binaural filter delay + * LFE handles for rendering after rendering to adjust LFE delay to filter delay *-----------------------------------------------------------------*/ if ( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) diff --git a/lib_dec/ivas_lfe_dec.c b/lib_dec/ivas_lfe_dec.c index 83229d86ac..b7cd6ba282 100644 --- a/lib_dec/ivas_lfe_dec.c +++ b/lib_dec/ivas_lfe_dec.c @@ -251,6 +251,7 @@ static int16_t ivas_lfe_dec_dequant( return lfe_bits; } + #ifdef NONBE_FIX_MC_LFE_LPF /*------------------------------------------------------------------------- * ivas_create_lfe_lpf_dec() @@ -271,6 +272,8 @@ static void ivas_create_lfe_lpf_dec( return; } #endif + + /*-----------------------------------------------------------------------------------------* * Function ivas_lfe_dec() * @@ -432,7 +435,7 @@ ivas_error ivas_create_lfe_dec( if ( ( delay_ns / 1000000000.f ) > ivas_lfe_lpf_delay[IVAS_FILTER_ORDER_4 - 3] ) { filt_order = 4; - low_pass_delay_dec_out = 3500000L; + low_pass_delay_dec_out = ivas_lfe_lpf_delay[IVAS_FILTER_ORDER_4 - 3] * 1000000000.f; ivas_create_lfe_lpf_dec( &( hLFE->filter_state ), output_Fs ); } #endif -- GitLab From c7c2b151ea269f85048004ca051cd77a85cf7881 Mon Sep 17 00:00:00 2001 From: Adam Mills Date: Tue, 7 May 2024 17:29:58 +1000 Subject: [PATCH 14/14] Fixing formatting --- lib_dec/ivas_lfe_dec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/ivas_lfe_dec.c b/lib_dec/ivas_lfe_dec.c index b7cd6ba282..f672fe75ec 100644 --- a/lib_dec/ivas_lfe_dec.c +++ b/lib_dec/ivas_lfe_dec.c @@ -435,7 +435,7 @@ ivas_error ivas_create_lfe_dec( if ( ( delay_ns / 1000000000.f ) > ivas_lfe_lpf_delay[IVAS_FILTER_ORDER_4 - 3] ) { filt_order = 4; - low_pass_delay_dec_out = ivas_lfe_lpf_delay[IVAS_FILTER_ORDER_4 - 3] * 1000000000.f; + low_pass_delay_dec_out = ivas_lfe_lpf_delay[IVAS_FILTER_ORDER_4 - 3] * 1000000000.f; ivas_create_lfe_lpf_dec( &( hLFE->filter_state ), output_Fs ); } #endif -- GitLab