diff --git a/lib_com/options.h b/lib_com/options.h index 41bb0d0180193e72702318682996220988337e22..13e6a86960393e0056f85a16500bf0b692afb00a 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -185,6 +185,7 @@ #define FIX_NCHAN_BUFFERS /* VA: issue 1322: Correct the number of float buffers (channels) at the decoder */ #define FIX_RENDERER_STACK /* VA: issue 1322: reduction of renderers' buffers size */ #define JBM_MEMORY_OPT /* VA: issue 916: optimization of RAM in the JBM decoder */ +/*#define NONBE_1324_TC_BUFFER_MEMOERY_KEEP*/ /* VA: issue 1324: do not reset TSM memory in JBM bitrate switching */ #define FIX_1370_EXTERNAL_ORIENTATION_CHECK /* Nokia: add sanity check for Euler angles for external orientations */ #define FIX_1413_IGF_INIT_PRINTOUT /* FhG: use correct variable for IGF initiliazation */ #define CODE_IMPROVEMENTS diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index c9a3d49ded07657c0fe510fb982029d9b3043ac7..f2825c8ce98768fec7b034d665ccc91f889e9a26 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -2422,7 +2422,10 @@ 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 #ifdef JBM_MEMORY_OPT ivas_error error; #else @@ -2433,6 +2436,26 @@ ivas_error ivas_jbm_dec_tc_buffer_reconfigure( 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 ) { @@ -2550,6 +2573,14 @@ ivas_error ivas_jbm_dec_tc_buffer_reconfigure( } #endif +#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; }