diff --git a/lib_com/options.h b/lib_com/options.h index 4cc8145f9f4b763b78d3d53a380383aa5c43dae0..9473a7cc22bd2f34a9d5d4b7cfb26b587897199c 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -175,6 +175,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_1250_MCMASA_LS_OUTPUT /* VA: issue 1250: fix crash in McMASA to custom LS output decoding */ #define NONBE_1302_FIX_OMASA_JBM_FLUSH /* VA: issue 1302: fix OMASA JBM bitrate switching flush in binaural output */ +#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 7efcab2f6be49e4810ab50bb8d0a718bec00c7a7..2c6a571c75c529410b464bcd0da9a1ddc21dd4f0 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -2262,11 +2262,35 @@ 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 + 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 ivas_error error; DECODER_TC_BUFFER_HANDLE hTcBuffer; hTcBuffer = st_ivas->hTcBuffer; +#ifdef NONBE_1324_TC_BUFFER_MEMOERY_KEEP + num_tc_buffer_mem = 0; + n_samples_still_available = 0; + + if ( st_ivas->hDecoderConfig->Opt_tsm ) + { + /* save samples of the TC buffer from the previous frame */ + 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 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] + hTcBuffer->n_samples_flushed, tc_buffer_mem[ch_idx], n_samples_still_available ); + } + } + +#endif /* if granularity changes, adapt subframe_nb_slots */ if ( n_samples_granularity != hTcBuffer->n_samples_granularity ) { @@ -2306,11 +2330,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 ); @@ -2320,6 +2345,14 @@ ivas_error ivas_jbm_dec_tc_buffer_reconfigure( return error; } +#ifdef NONBE_1324_TC_BUFFER_MEMOERY_KEEP + /* propagate samples 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], n_samples_still_available ); + } + +#endif return IVAS_ERR_OK; }