From 27bf0e3e798ce33d9efdcb43489721c968ffc26b Mon Sep 17 00:00:00 2001 From: vaclav Date: Thu, 23 Oct 2025 21:29:07 +0200 Subject: [PATCH 1/4] port NONBE_1324_TC_BUFFER_MEMOERY_KEEP --- lib_com/options.h | 1 + lib_dec/ivas_jbm_dec_fx.c | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 00de5ad64..51303a45c 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -114,6 +114,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 */ diff --git a/lib_dec/ivas_jbm_dec_fx.c b/lib_dec/ivas_jbm_dec_fx.c index de4de837b..9f5c9dd4f 100644 --- a/lib_dec/ivas_jbm_dec_fx.c +++ b/lib_dec/ivas_jbm_dec_fx.c @@ -3910,6 +3910,10 @@ ivas_error ivas_jbm_dec_tc_buffer_reconfigure_fx( const Word16 n_samples_granularity /* i : new granularity of the renderer/buffer */ ) { +#ifdef NONBE_1324_TC_BUFFER_MEMOERY_KEEP + Word16 ch_idx, num_tc_buffer_mem, n_samples_still_available; + Word32 tc_buffer_mem[MAX_INTERN_CHANNELS][L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES - 1]; +#endif #ifdef JBM_MEMORY_OPT ivas_error error; #else @@ -3921,6 +3925,28 @@ ivas_error ivas_jbm_dec_tc_buffer_reconfigure_fx( hTcBuffer = st_ivas->hTcBuffer; move16(); +#ifdef NONBE_1324_TC_BUFFER_MEMOERY_KEEP + num_tc_buffer_mem = 0; + move16(); + n_samples_still_available = 0; + move16(); + + IF( st_ivas->hDecoderConfig->Opt_tsm ) + { + /* save samples of the TC buffer from the previous frame */ + num_tc_buffer_mem = s_min( hTcBuffer->nchan_transport_internal, nchan_transport_internal ); + n_samples_still_available = sub( 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++ ) + { + Copy32( hTcBuffer->tc_buffer_old_fx[ch_idx] + hTcBuffer->n_samples_flushed, tc_buffer_mem[ch_idx], n_samples_still_available ); + } + } + +#endif /* if granularity changes, adapt subframe_nb_slots */ IF( NE_16( n_samples_granularity, hTcBuffer->n_samples_granularity ) ) { @@ -4031,6 +4057,14 @@ ivas_error ivas_jbm_dec_tc_buffer_reconfigure_fx( } #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++ ) + { + Copy32( tc_buffer_mem[ch_idx], hTcBuffer->tc_buffer_old_fx[ch_idx], n_samples_still_available ); + } + +#endif return IVAS_ERR_OK; } -- GitLab From 94e7c3cf52f614081fe170899f68636eea989dc3 Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 29 Oct 2025 12:55:52 +0100 Subject: [PATCH 2/4] basop operators; align with float --- lib_dec/ivas_jbm_dec_fx.c | 8 ++++---- lib_dec/lib_dec_fx.c | 4 ++++ 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/lib_dec/ivas_jbm_dec_fx.c b/lib_dec/ivas_jbm_dec_fx.c index ff4374ddd..6ba671ee3 100644 --- a/lib_dec/ivas_jbm_dec_fx.c +++ b/lib_dec/ivas_jbm_dec_fx.c @@ -2549,7 +2549,7 @@ ivas_error ivas_jbm_dec_flush_renderer_fx( { /* move it at the beginning of the TC buffer with zero padding */ Copy32( hTcBuffer->tc_buffer_old_fx[ch_idx], hTcBuffer->tc_fx[ch_idx], n_samples_to_render ); - set_zero_fx( hTcBuffer->tc_fx[ch_idx] + n_samples_to_render, hTcBuffer->n_samples_granularity - n_samples_to_render ); + set_zero_fx( hTcBuffer->tc_fx[ch_idx] + n_samples_to_render, sub( hTcBuffer->n_samples_granularity, n_samples_to_render ) ); } #else /* render what is still there with zero padding */ @@ -3369,7 +3369,7 @@ static ivas_error ivas_jbm_dec_tc_audio_allocate_fx( move16(); } - nsamp_to_allocate = s_max( hTcBuffer->nchan_transport_jbm, hTcBuffer->nchan_buffer_full ) * n_samp_full; + nsamp_to_allocate = imult1616( s_max( hTcBuffer->nchan_transport_jbm, hTcBuffer->nchan_buffer_full ), n_samp_full ); IF( Opt_tsm ) { @@ -3382,7 +3382,7 @@ static ivas_error ivas_jbm_dec_tc_audio_allocate_fx( offset = 0; move16(); - FOR( ch_idx = 0; ch_idx < max( hTcBuffer->nchan_transport_jbm, hTcBuffer->nchan_buffer_full ); ch_idx++ ) + FOR( ch_idx = 0; ch_idx < s_max( hTcBuffer->nchan_transport_jbm, hTcBuffer->nchan_buffer_full ); ch_idx++ ) { hTcBuffer->tc_fx[ch_idx] = &hTcBuffer->tc_buffer_fx[offset]; offset = add( offset, n_samp_full ); @@ -3462,6 +3462,7 @@ static void ivas_jbm_dec_tc_audio_deallocate_fx( return; } + #endif /*--------------------------------------------------------------------------* @@ -3470,7 +3471,6 @@ static void ivas_jbm_dec_tc_audio_deallocate_fx( * open and initialize JBM transport channel buffer *--------------------------------------------------------------------------*/ - ivas_error ivas_jbm_dec_tc_buffer_open_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const TC_BUFFER_MODE tc_buffer_mode, /* i : buffer mode */ diff --git a/lib_dec/lib_dec_fx.c b/lib_dec/lib_dec_fx.c index 248b8846b..28417c137 100644 --- a/lib_dec/lib_dec_fx.c +++ b/lib_dec/lib_dec_fx.c @@ -1217,7 +1217,11 @@ ivas_error IVAS_DEC_GetSamplesRenderer( hIvasDec->hasBeenFedFrame = false; /* check for possible flushed samples from a rate switch */ +#ifdef NONBE_1324_TC_BUFFER_MEMOERY_KEEP + IF( GT_16( hIvasDec->nSamplesFlushed, 0 ) ) +#else IF( GE_16( hIvasDec->nSamplesFlushed, 0 ) ) +#endif { /* note: offset (rendered samples) is always 0 */ Copy( hIvasDec->flushbuffer, pcmBuf, imult1616( hIvasDec->nSamplesFlushed, nOutChannels ) ); -- GitLab From 0455292c467e14a649ebdcff7dcc150f138bafcf Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Thu, 30 Oct 2025 10:53:13 +0200 Subject: [PATCH 3/4] Revert "basop operators; align with float" This reverts commit 94e7c3cf52f614081fe170899f68636eea989dc3. --- lib_dec/ivas_jbm_dec_fx.c | 8 ++++---- lib_dec/lib_dec_fx.c | 4 ---- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/lib_dec/ivas_jbm_dec_fx.c b/lib_dec/ivas_jbm_dec_fx.c index 6ba671ee3..ff4374ddd 100644 --- a/lib_dec/ivas_jbm_dec_fx.c +++ b/lib_dec/ivas_jbm_dec_fx.c @@ -2549,7 +2549,7 @@ ivas_error ivas_jbm_dec_flush_renderer_fx( { /* move it at the beginning of the TC buffer with zero padding */ Copy32( hTcBuffer->tc_buffer_old_fx[ch_idx], hTcBuffer->tc_fx[ch_idx], n_samples_to_render ); - set_zero_fx( hTcBuffer->tc_fx[ch_idx] + n_samples_to_render, sub( hTcBuffer->n_samples_granularity, n_samples_to_render ) ); + set_zero_fx( hTcBuffer->tc_fx[ch_idx] + n_samples_to_render, hTcBuffer->n_samples_granularity - n_samples_to_render ); } #else /* render what is still there with zero padding */ @@ -3369,7 +3369,7 @@ static ivas_error ivas_jbm_dec_tc_audio_allocate_fx( move16(); } - nsamp_to_allocate = imult1616( s_max( hTcBuffer->nchan_transport_jbm, hTcBuffer->nchan_buffer_full ), n_samp_full ); + nsamp_to_allocate = s_max( hTcBuffer->nchan_transport_jbm, hTcBuffer->nchan_buffer_full ) * n_samp_full; IF( Opt_tsm ) { @@ -3382,7 +3382,7 @@ static ivas_error ivas_jbm_dec_tc_audio_allocate_fx( offset = 0; move16(); - FOR( ch_idx = 0; ch_idx < s_max( hTcBuffer->nchan_transport_jbm, hTcBuffer->nchan_buffer_full ); ch_idx++ ) + FOR( ch_idx = 0; ch_idx < max( hTcBuffer->nchan_transport_jbm, hTcBuffer->nchan_buffer_full ); ch_idx++ ) { hTcBuffer->tc_fx[ch_idx] = &hTcBuffer->tc_buffer_fx[offset]; offset = add( offset, n_samp_full ); @@ -3462,7 +3462,6 @@ static void ivas_jbm_dec_tc_audio_deallocate_fx( return; } - #endif /*--------------------------------------------------------------------------* @@ -3471,6 +3470,7 @@ static void ivas_jbm_dec_tc_audio_deallocate_fx( * open and initialize JBM transport channel buffer *--------------------------------------------------------------------------*/ + ivas_error ivas_jbm_dec_tc_buffer_open_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const TC_BUFFER_MODE tc_buffer_mode, /* i : buffer mode */ diff --git a/lib_dec/lib_dec_fx.c b/lib_dec/lib_dec_fx.c index 28417c137..248b8846b 100644 --- a/lib_dec/lib_dec_fx.c +++ b/lib_dec/lib_dec_fx.c @@ -1217,11 +1217,7 @@ ivas_error IVAS_DEC_GetSamplesRenderer( hIvasDec->hasBeenFedFrame = false; /* check for possible flushed samples from a rate switch */ -#ifdef NONBE_1324_TC_BUFFER_MEMOERY_KEEP - IF( GT_16( hIvasDec->nSamplesFlushed, 0 ) ) -#else IF( GE_16( hIvasDec->nSamplesFlushed, 0 ) ) -#endif { /* note: offset (rendered samples) is always 0 */ Copy( hIvasDec->flushbuffer, pcmBuf, imult1616( hIvasDec->nSamplesFlushed, nOutChannels ) ); -- GitLab From 1397250242cc9648b73b4cdf4a983985b363a2ba Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Thu, 30 Oct 2025 10:54:07 +0200 Subject: [PATCH 4/4] Disable switch NONBE_1324_TC_BUFFER_MEMOERY_KEEP to align with float. --- lib_com/options.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 9badf3241..b2d60e821 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -113,7 +113,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 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 -- GitLab