From 5cec3af88116ca3005af83168e92975c338d7213 Mon Sep 17 00:00:00 2001 From: vaclav Date: Tue, 3 Jun 2025 18:05:01 +0200 Subject: [PATCH 1/6] fix NONBE_1324_TC_BUFFER_MEMOERY_KEEP --- lib_com/options.h | 1 + lib_dec/ivas_jbm_dec.c | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index a127724dc2..a757112c63 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -178,6 +178,7 @@ #define NONBE_1122_KEEP_EVS_MODE_UNCHANGED /* FhG: Disables fix for issue 1122 in EVS mode to keep BE tests green. This switch should be removed once the 1122 fix is added to EVS via a CR. */ #define NONBE_FIX_1326_MASA_EXTREND_CUSTOMLS_OUT /* FhG: Fix crash for external renderer MASA to custom LS rendering, number of output channels not set correctly */ #define NONBE_1325_TD_STEREO_QUANT_LSF_SEC /* Nokia: issue 1325: fix for usage of active_cnt variable in TD stereo LSFQ */ +#define NONBE_1324_TC_BUFFER_MEMOERY_KEEP /* VA: issue 1324: do not reset TSM memory in JBM bitrate switching */ /* ##################### End NON-BE switches ########################### */ diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 31e6178c48..fd8d389a5c 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -2382,6 +2382,11 @@ ivas_error ivas_jbm_dec_tc_buffer_reconfigure( const int16_t n_samples_granularity /* i : new granularity of the renderer/buffer */ ) { +#ifdef NONBE_1324_TC_BUFFER_MEMOERY_KEEP + float tc_buffer_mem[CPE_CHANNELS * MAX_JBM_L_FRAME48k]; + int16_t num_tc_buffer_mem; + AUDIO_CONFIG output_config; +#endif #ifdef JBM_MEMORY_OPT ivas_error error; #else @@ -2391,7 +2396,18 @@ ivas_error ivas_jbm_dec_tc_buffer_reconfigure( DECODER_TC_BUFFER_HANDLE hTcBuffer; hTcBuffer = st_ivas->hTcBuffer; +#ifdef NONBE_1324_TC_BUFFER_MEMOERY_KEEP + output_config = st_ivas->hDecoderConfig->output_config; + + num_tc_buffer_mem = 0; + if ( output_config == IVAS_AUDIO_CONFIG_BINAURAL || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR || output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) + { + /* keep CPE_CHANNELS channels of the TC buffer for smooth transition for swithing within 1 CPE and TD decorr. on and off */ + num_tc_buffer_mem = min( hTcBuffer->nchan_buffer_full, CPE_CHANNELS ); + mvr2r( hTcBuffer->tc_buffer, tc_buffer_mem, num_tc_buffer_mem * NS2SA( st_ivas->hDecoderConfig->output_Fs, MAX_JBM_L_FRAME_NS ) ); + } +#endif /* if granularity changes, adapt subframe_nb_slots */ if ( n_samples_granularity != hTcBuffer->n_samples_granularity ) { @@ -2510,6 +2526,14 @@ ivas_error ivas_jbm_dec_tc_buffer_reconfigure( } #endif +#ifdef NONBE_1324_TC_BUFFER_MEMOERY_KEEP + if ( num_tc_buffer_mem > 0 ) + { + /* propagate CPE_CHANNELS channels of the TC buffer */ + mvr2r( tc_buffer_mem, hTcBuffer->tc_buffer, num_tc_buffer_mem * NS2SA( st_ivas->hDecoderConfig->output_Fs, MAX_JBM_L_FRAME_NS ) ); + } + +#endif return IVAS_ERR_OK; } -- GitLab From 534154e6c29a0a5af2ecf3e1206f17a7216c7129 Mon Sep 17 00:00:00 2001 From: vaclav Date: Tue, 3 Jun 2025 19:40:39 +0200 Subject: [PATCH 2/6] update --- lib_dec/ivas_jbm_dec.c | 33 ++++++++++++++++----------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index fd8d389a5c..769072664e 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -2383,9 +2383,8 @@ ivas_error ivas_jbm_dec_tc_buffer_reconfigure( ) { #ifdef NONBE_1324_TC_BUFFER_MEMOERY_KEEP - float tc_buffer_mem[CPE_CHANNELS * MAX_JBM_L_FRAME48k]; - int16_t num_tc_buffer_mem; - AUDIO_CONFIG output_config; + int16_t ch_idx, num_tc_buffer_mem, len_tc_buffer_mem; + float tc_buffer_mem[MAX_INTERN_CHANNELS][L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES - 1]; #endif #ifdef JBM_MEMORY_OPT ivas_error error; @@ -2396,15 +2395,15 @@ ivas_error ivas_jbm_dec_tc_buffer_reconfigure( DECODER_TC_BUFFER_HANDLE hTcBuffer; hTcBuffer = st_ivas->hTcBuffer; + #ifdef NONBE_1324_TC_BUFFER_MEMOERY_KEEP - output_config = st_ivas->hDecoderConfig->output_config; + /* save channels of the TC buffer from the previous frame */ + num_tc_buffer_mem = min( hTcBuffer->nchan_transport_internal, nchan_transport_internal ); + len_tc_buffer_mem = min( hTcBuffer->n_samples_granularity - 1, n_samples_granularity - 1 ); - num_tc_buffer_mem = 0; - if ( output_config == IVAS_AUDIO_CONFIG_BINAURAL || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR || output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) + for ( ch_idx = 0; ch_idx < num_tc_buffer_mem; ch_idx++ ) { - /* keep CPE_CHANNELS channels of the TC buffer for smooth transition for swithing within 1 CPE and TD decorr. on and off */ - num_tc_buffer_mem = min( hTcBuffer->nchan_buffer_full, CPE_CHANNELS ); - mvr2r( hTcBuffer->tc_buffer, tc_buffer_mem, num_tc_buffer_mem * NS2SA( st_ivas->hDecoderConfig->output_Fs, MAX_JBM_L_FRAME_NS ) ); + mvr2r( hTcBuffer->tc_buffer_old[ch_idx] + hTcBuffer->n_samples_granularity - 1 - len_tc_buffer_mem, tc_buffer_mem[ch_idx], len_tc_buffer_mem ); } #endif @@ -2464,6 +2463,14 @@ ivas_error ivas_jbm_dec_tc_buffer_reconfigure( { return error; } + +#ifdef NONBE_1324_TC_BUFFER_MEMOERY_KEEP + /* propagate channels of the TC buffer from the previous frame */ + for ( ch_idx = 0; ch_idx < num_tc_buffer_mem; ch_idx++ ) + { + mvr2r( tc_buffer_mem[ch_idx], hTcBuffer->tc_buffer_old[ch_idx] + hTcBuffer->n_samples_granularity - 1 - len_tc_buffer_mem, len_tc_buffer_mem ); + } +#endif #else /* realloc buffers */ if ( hTcBuffer->tc_buffer != NULL ) @@ -2526,14 +2533,6 @@ ivas_error ivas_jbm_dec_tc_buffer_reconfigure( } #endif -#ifdef NONBE_1324_TC_BUFFER_MEMOERY_KEEP - if ( num_tc_buffer_mem > 0 ) - { - /* propagate CPE_CHANNELS channels of the TC buffer */ - mvr2r( tc_buffer_mem, hTcBuffer->tc_buffer, num_tc_buffer_mem * NS2SA( st_ivas->hDecoderConfig->output_Fs, MAX_JBM_L_FRAME_NS ) ); - } - -#endif return IVAS_ERR_OK; } -- GitLab From 0436b6ec6bf6dd151c040f174a1f6a3476ae5c5f Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 4 Jun 2025 09:41:18 +0200 Subject: [PATCH 3/6] fix non-JBM case --- lib_dec/ivas_jbm_dec.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 769072664e..ab8b3e0f08 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -2397,13 +2397,19 @@ ivas_error ivas_jbm_dec_tc_buffer_reconfigure( hTcBuffer = st_ivas->hTcBuffer; #ifdef NONBE_1324_TC_BUFFER_MEMOERY_KEEP - /* save channels of the TC buffer from the previous frame */ - num_tc_buffer_mem = min( hTcBuffer->nchan_transport_internal, nchan_transport_internal ); - len_tc_buffer_mem = min( hTcBuffer->n_samples_granularity - 1, n_samples_granularity - 1 ); + num_tc_buffer_mem = 0; + len_tc_buffer_mem = 0; - for ( ch_idx = 0; ch_idx < num_tc_buffer_mem; ch_idx++ ) + if ( st_ivas->hDecoderConfig->Opt_tsm ) { - mvr2r( hTcBuffer->tc_buffer_old[ch_idx] + hTcBuffer->n_samples_granularity - 1 - len_tc_buffer_mem, tc_buffer_mem[ch_idx], len_tc_buffer_mem ); + /* save channels of the TC buffer from the previous frame */ + num_tc_buffer_mem = min( hTcBuffer->nchan_transport_internal, nchan_transport_internal ); + len_tc_buffer_mem = min( hTcBuffer->n_samples_granularity - 1, n_samples_granularity - 1 ); + + for ( ch_idx = 0; ch_idx < num_tc_buffer_mem; ch_idx++ ) + { + mvr2r( hTcBuffer->tc_buffer_old[ch_idx] + hTcBuffer->n_samples_granularity - 1 - len_tc_buffer_mem, tc_buffer_mem[ch_idx], len_tc_buffer_mem ); + } } #endif -- GitLab From f40ad00b801b48570d976ef38ad2c63efd63b6fb Mon Sep 17 00:00:00 2001 From: vaclav Date: Fri, 13 Jun 2025 10:41:36 +0200 Subject: [PATCH 4/6] correction inside NONBE_1324_TC_BUFFER_MEMOERY_KEEP --- lib_dec/ivas_jbm_dec.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index ab8b3e0f08..0ac201fc22 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -2383,7 +2383,7 @@ ivas_error ivas_jbm_dec_tc_buffer_reconfigure( ) { #ifdef NONBE_1324_TC_BUFFER_MEMOERY_KEEP - int16_t ch_idx, num_tc_buffer_mem, len_tc_buffer_mem; + int16_t ch_idx, num_tc_buffer_mem, n_samples_still_available; float tc_buffer_mem[MAX_INTERN_CHANNELS][L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES - 1]; #endif #ifdef JBM_MEMORY_OPT @@ -2398,17 +2398,20 @@ ivas_error ivas_jbm_dec_tc_buffer_reconfigure( #ifdef NONBE_1324_TC_BUFFER_MEMOERY_KEEP num_tc_buffer_mem = 0; - len_tc_buffer_mem = 0; + n_samples_still_available = 0; if ( st_ivas->hDecoderConfig->Opt_tsm ) { /* save channels of the TC buffer from the previous frame */ num_tc_buffer_mem = min( hTcBuffer->nchan_transport_internal, nchan_transport_internal ); - len_tc_buffer_mem = min( hTcBuffer->n_samples_granularity - 1, n_samples_granularity - 1 ); + n_samples_still_available = hTcBuffer->n_samples_buffered - hTcBuffer->n_samples_rendered; + + /* what is remaining from last frames needs always be smaller than n_samples_granularity */ + assert( ( hTcBuffer->n_samples_buffered - hTcBuffer->n_samples_rendered ) < n_samples_granularity ); for ( ch_idx = 0; ch_idx < num_tc_buffer_mem; ch_idx++ ) { - mvr2r( hTcBuffer->tc_buffer_old[ch_idx] + hTcBuffer->n_samples_granularity - 1 - len_tc_buffer_mem, tc_buffer_mem[ch_idx], len_tc_buffer_mem ); + mvr2r( hTcBuffer->tc_buffer_old[ch_idx], tc_buffer_mem[ch_idx], n_samples_still_available ); } } @@ -2474,7 +2477,7 @@ ivas_error ivas_jbm_dec_tc_buffer_reconfigure( /* propagate channels of the TC buffer from the previous frame */ for ( ch_idx = 0; ch_idx < num_tc_buffer_mem; ch_idx++ ) { - mvr2r( tc_buffer_mem[ch_idx], hTcBuffer->tc_buffer_old[ch_idx] + hTcBuffer->n_samples_granularity - 1 - len_tc_buffer_mem, len_tc_buffer_mem ); + mvr2r( tc_buffer_mem[ch_idx], hTcBuffer->tc_buffer_old[ch_idx], n_samples_still_available ); } #endif #else -- GitLab From cf46f29365b4ffd7a211acd09895583cbb1f8206 Mon Sep 17 00:00:00 2001 From: vaclav Date: Fri, 13 Jun 2025 12:23:16 +0200 Subject: [PATCH 5/6] cleaning --- lib_dec/ivas_jbm_dec.c | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 489b9d76f2..76713ab35f 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -2236,7 +2236,6 @@ ivas_error ivas_jbm_dec_tc_buffer_reconfigure( #ifdef NONBE_1324_TC_BUFFER_MEMOERY_KEEP num_tc_buffer_mem = 0; n_samples_still_available = 0; - int16_t len_tc_buffer_mem = 0; if ( st_ivas->hDecoderConfig->Opt_tsm ) { @@ -2247,19 +2246,10 @@ ivas_error ivas_jbm_dec_tc_buffer_reconfigure( /* what is remaining from last frames needs always be smaller than n_samples_granularity */ assert( ( hTcBuffer->n_samples_buffered - hTcBuffer->n_samples_rendered ) < n_samples_granularity ); -#if 1 - len_tc_buffer_mem = min( hTcBuffer->n_samples_granularity - 1, n_samples_granularity - 1 ); - - for ( ch_idx = 0; ch_idx < num_tc_buffer_mem; ch_idx++ ) - { - mvr2r( hTcBuffer->tc_buffer_old[ch_idx] + hTcBuffer->n_samples_granularity - 1 - len_tc_buffer_mem, tc_buffer_mem[ch_idx], len_tc_buffer_mem ); - } -#else for ( ch_idx = 0; ch_idx < num_tc_buffer_mem; ch_idx++ ) { mvr2r( hTcBuffer->tc_buffer_old[ch_idx], tc_buffer_mem[ch_idx], n_samples_still_available ); } -#endif } #endif @@ -2320,10 +2310,7 @@ ivas_error ivas_jbm_dec_tc_buffer_reconfigure( /* propagate samples of the TC buffer from the previous frame */ for ( ch_idx = 0; ch_idx < num_tc_buffer_mem; ch_idx++ ) { -#if 1 -#else mvr2r( tc_buffer_mem[ch_idx], hTcBuffer->tc_buffer_old[ch_idx], n_samples_still_available ); -#endif } #endif -- GitLab From 548de16479be1af437772225aaa1e5dd65d4e99d Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 18 Jun 2025 10:46:05 +0200 Subject: [PATCH 6/6] update within NONBE_1324_TC_BUFFER_MEMOERY_KEEP --- lib_dec/ivas_jbm_dec.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 76713ab35f..fd19419ca3 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -2243,12 +2243,12 @@ ivas_error ivas_jbm_dec_tc_buffer_reconfigure( num_tc_buffer_mem = min( hTcBuffer->nchan_transport_internal, nchan_transport_internal ); n_samples_still_available = hTcBuffer->n_samples_buffered - hTcBuffer->n_samples_rendered; - /* what is remaining from last frames needs always be smaller than n_samples_granularity */ - assert( ( hTcBuffer->n_samples_buffered - hTcBuffer->n_samples_rendered ) < n_samples_granularity ); + /* what is remaining from last frame needs always be smaller than the new granularity */ + assert( n_samples_still_available < n_samples_granularity ); for ( ch_idx = 0; ch_idx < num_tc_buffer_mem; ch_idx++ ) { - mvr2r( hTcBuffer->tc_buffer_old[ch_idx], tc_buffer_mem[ch_idx], n_samples_still_available ); + mvr2r( hTcBuffer->tc_buffer_old[ch_idx] + hTcBuffer->n_samples_flushed, tc_buffer_mem[ch_idx], n_samples_still_available ); } } @@ -2292,11 +2292,12 @@ ivas_error ivas_jbm_dec_tc_buffer_reconfigure( hTcBuffer->nchan_buffer_full = nchan_full; hTcBuffer->n_samples_granularity = n_samples_granularity; +#ifndef NONBE_1324_TC_BUFFER_MEMOERY_KEEP #ifdef DEBUGGING /* what is remaining from last frames needs always be smaller than n_samples_granularity */ assert( ( hTcBuffer->n_samples_buffered - hTcBuffer->n_samples_rendered ) < n_samples_granularity ); #endif - +#endif /* reallocate TC audio buffers */ ivas_jbm_dec_tc_audio_deallocate( hTcBuffer ); -- GitLab