From 7e7609d2c42727344a9a06a56a5a7d063efa09a1 Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 9 Apr 2025 18:53:52 +0200 Subject: [PATCH 01/29] issue 916: optimization of RAM in the JBM decoder; under - first try to reduce stack --- lib_com/options.h | 1 + lib_dec/jbm_pcmdsp_apa.c | 4 ++++ lib_dec/jbm_pcmdsp_apa.h | 7 ++++++- 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index ebfc3519ab..fa6f8623a2 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -160,6 +160,7 @@ /*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ #define TMP_FIX_1119_SPLIT_RENDERING_VOIP /* FhG: Add error check for unsupported config: split rendering with VoIP mode */ +#define JBM_MEMORY_OPT /* VA: issue 916: optimization of RAM in the JBM decoder */ /* #################### End BE switches ################################## */ diff --git a/lib_dec/jbm_pcmdsp_apa.c b/lib_dec/jbm_pcmdsp_apa.c index 3305a1e48d..fdb41a3cb2 100644 --- a/lib_dec/jbm_pcmdsp_apa.c +++ b/lib_dec/jbm_pcmdsp_apa.c @@ -562,7 +562,11 @@ uint8_t apa_exec( ) { uint16_t i; +#ifdef JBM_MEMORY_OPT + float frm_in[APA_BUF]; /* NOTE: this buffer could be smaller if alocated dynamically based on the actual sampling rate and number of channels */ +#else float frm_in[APA_BUF]; /* TODO(mcjbm): this buffer could be smaller - always allocates space for 16 channels */ +#endif uint16_t l_frm_out; int16_t l_rem; int32_t dl_scaled, dl_copied, l_frm_out_target; diff --git a/lib_dec/jbm_pcmdsp_apa.h b/lib_dec/jbm_pcmdsp_apa.h index 26c380e38a..7933900625 100644 --- a/lib_dec/jbm_pcmdsp_apa.h +++ b/lib_dec/jbm_pcmdsp_apa.h @@ -50,9 +50,14 @@ */ /* size of IO buffers (a_in[], a_out[]) for apa_exec() */ +#ifdef JBM_MEMORY_OPT +#define APA_BUF_PER_CHANNEL ( 960 * 2 ) /* == MAX_JBM_L_FRAME48k */ +#define APA_MAX_NUM_CHANNELS ( 12 ) /* == MAX_TRANSPORT_CHANNELS */ +#else #define APA_BUF_PER_CHANNEL ( 960 * 3 ) #define APA_MAX_NUM_CHANNELS 16 -#define APA_BUF ( APA_BUF_PER_CHANNEL * APA_MAX_NUM_CHANNELS ) +#endif +#define APA_BUF ( APA_BUF_PER_CHANNEL * APA_MAX_NUM_CHANNELS ) /* min/max sampling rate [Hz] */ #define APA_MIN_RATE 1000 -- GitLab From ced6fc065b5df3ff7ae163fa02a7e2676eefcb9b Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 9 Apr 2025 21:06:19 +0200 Subject: [PATCH 02/29] second try to reduce stack --- lib_com/ivas_cnst.h | 5 +++++ lib_dec/lib_dec.c | 8 ++++++++ 2 files changed, 13 insertions(+) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 8a9e8dea19..0f26d572a3 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -172,8 +172,13 @@ typedef enum #define JBM_CLDFB_SLOTS_IN_SUBFRAME 4 #define MAX_JBM_CLDFB_TIMESLOTS 32 #define DEFAULT_JBM_CLDFB_TIMESLOTS 16 +#ifdef JBM_MEMORY_OPT +#define MAX_JBM_L_FRAME48k (1920 - 240) +#define MAX_JBM_L_FRAME_NS 35000000L +#else #define MAX_JBM_L_FRAME48k 1920 #define MAX_JBM_L_FRAME_NS 40000000L +#endif #define MAX_SPAR_INTERNAL_CHANNELS IVAS_SPAR_MAX_CH #define MAX_CLDFB_DIGEST_CHANNELS (FOA_CHANNELS + MAX_NUM_OBJECTS) diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index fc5bbc74d4..a4662e4980 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -4667,7 +4667,11 @@ static ivas_error IVAS_DEC_VoIP_reconfigure( float startQuality; startQuality = hIvasDec->tsm_quality; +#ifdef JBM_MEMORY_OPT + apa_buffer_size = MAX_JBM_L_FRAME48k; +#else apa_buffer_size = APA_BUF_PER_CHANNEL; +#endif /* get current renderer type*/ hDecoderConfig = hIvasDec->st_ivas->hDecoderConfig; @@ -4730,7 +4734,11 @@ static ivas_error IVAS_DEC_VoIP_reconfigure( { return IVAS_ERR_INIT_ERROR; } +#ifdef JBM_MEMORY_OPT + apa_buffer_size = MAX_JBM_L_FRAME48k; +#else apa_buffer_size = APA_BUF_PER_CHANNEL; +#endif free( hIvasDec->apaExecBuffer ); if ( ( hIvasDec->apaExecBuffer = malloc( sizeof( float ) * apa_buffer_size * nTransportChannels ) ) == NULL ) { -- GitLab From 8a9105d3da85292b5e60fa8c87f620dd68c9a180 Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 9 Apr 2025 21:21:58 +0200 Subject: [PATCH 03/29] revert part of previous commit --- lib_dec/lib_dec.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index a4662e4980..3cf66a296c 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -4667,7 +4667,7 @@ static ivas_error IVAS_DEC_VoIP_reconfigure( float startQuality; startQuality = hIvasDec->tsm_quality; -#ifdef JBM_MEMORY_OPT +#ifdef JBM_MEMORY_OPTaa apa_buffer_size = MAX_JBM_L_FRAME48k; #else apa_buffer_size = APA_BUF_PER_CHANNEL; @@ -4734,7 +4734,7 @@ static ivas_error IVAS_DEC_VoIP_reconfigure( { return IVAS_ERR_INIT_ERROR; } -#ifdef JBM_MEMORY_OPT +#ifdef JBM_MEMORY_OPTaa apa_buffer_size = MAX_JBM_L_FRAME48k; #else apa_buffer_size = APA_BUF_PER_CHANNEL; -- GitLab From c04ee29b5ecf45b5378def8ed9bd93f69037568e Mon Sep 17 00:00:00 2001 From: vaclav Date: Tue, 15 Apr 2025 18:30:33 +0200 Subject: [PATCH 04/29] OPT_TC, step 1 --- lib_com/ivas_cnst.h | 2 +- lib_com/options.h | 5 +++ lib_dec/ivas_jbm_dec.c | 77 +++++++++++++++++++++++++++++++++++++++++ lib_dec/ivas_stat_dec.h | 4 +++ lib_dec/lib_dec.c | 54 ++++++++++++++++++++++++++++- 5 files changed, 140 insertions(+), 2 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 0f26d572a3..16c11dee36 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -172,7 +172,7 @@ typedef enum #define JBM_CLDFB_SLOTS_IN_SUBFRAME 4 #define MAX_JBM_CLDFB_TIMESLOTS 32 #define DEFAULT_JBM_CLDFB_TIMESLOTS 16 -#ifdef JBM_MEMORY_OPT +#if (defined JBM_MEMORY_OPT && !defined REMOVE_APA_BUFFER) #define MAX_JBM_L_FRAME48k (1920 - 240) #define MAX_JBM_L_FRAME_NS 35000000L #else diff --git a/lib_com/options.h b/lib_com/options.h index cf712c0099..268d6494d4 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -161,8 +161,13 @@ /*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ #define TMP_FIX_1119_SPLIT_RENDERING_VOIP /* FhG: Add error check for unsupported config: split rendering with VoIP mode */ #define LIB_DEC_REVISION /* VA: cleaning and simplification of lib_dec.c */ +#if 1 #define JBM_MEMORY_OPT /* VA: issue 916: optimization of RAM in the JBM decoder */ +#define OPT_TC // separate heap memory from hTcBuffer->tcBuffer[] +//#define REMOVE_APA_BUFFER // remove hIvasDec->apaExecBuffer[] +#define MY_DEBUG +#endif /* #################### End BE switches ################################## */ diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 3f15f113a7..cdc83043b9 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -1423,6 +1423,22 @@ ivas_error ivas_jbm_dec_flush_renderer( { int16_t ch_idx; +#ifdef OPT_TC + /* render available full slots (with new lower granularity) */ + for ( ch_idx = 0; ch_idx < min( 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++ ) + { + mvr2r( hTcBuffer->tc_buffer_old[ch_idx], hTcBuffer->tc[ch_idx], n_samples_to_render ); + } + + for ( ; ch_idx < hTcBuffer->nchan_buffer_full; ch_idx++ ) + { + /* move it at the beginning of the TC buffer with zero padding */ + mvr2r( hTcBuffer->tc[ch_idx] + hTcBuffer->n_samples_rendered, hTcBuffer->tc[ch_idx], n_samples_to_render ); + set_zero( hTcBuffer->tc[ch_idx] + n_samples_to_render, hTcBuffer->n_samples_granularity - n_samples_to_render ); + mvr2r( hTcBuffer->tc[ch_idx] + hTcBuffer->n_samples_rendered + n_samples_to_render, hTcBuffer->tc[ch_idx] + hTcBuffer->n_samples_granularity, n_samples_still_available ); + } +#else /* render what is still there with zero padding */ for ( ch_idx = 0; ch_idx < hTcBuffer->nchan_buffer_full; ch_idx++ ) { @@ -1431,6 +1447,7 @@ ivas_error ivas_jbm_dec_flush_renderer( set_zero( hTcBuffer->tc[ch_idx] + n_samples_to_render, hTcBuffer->n_samples_granularity - n_samples_to_render ); mvr2r( hTcBuffer->tc[ch_idx] + hTcBuffer->n_samples_rendered + n_samples_to_render, hTcBuffer->tc[ch_idx] + hTcBuffer->n_samples_granularity, n_samples_still_available ); } +#endif /* simple change of the slot info */ hTcBuffer->num_slots = 1; @@ -2052,6 +2069,9 @@ static void ivas_jbm_dec_copy_tc( for ( ch = 0; ch < n_ch_full_copy; ch++ ) { +#ifdef OPT_TC + mvr2r( st_ivas->hTcBuffer->tc_buffer_old[ch], st_ivas->hTcBuffer->tc[ch] + st_ivas->hTcBuffer->n_samples_rendered, n_samples_still_available ); +#endif set_zero( hTcBuffer->tc[ch], hTcBuffer->n_samples_discard ); mvr2r( hTcBuffer->tc[ch] + hTcBuffer->n_samples_rendered, hTcBuffer->tc[ch] + hTcBuffer->n_samples_discard, n_samples_still_available ); for ( m = 0; m < nSamplesForRendering; m++ ) @@ -2064,6 +2084,9 @@ static void ivas_jbm_dec_copy_tc( { for ( ; ch < hTcBuffer->nchan_transport_jbm; ch++ ) { +#ifdef OPT_TC + mvr2r( st_ivas->hTcBuffer->tc_buffer_old[ch], tc_digest_f[ch], n_samples_still_available ); // VE: TBV!!! +#endif mvr2r( hTcBuffer->tc[ch], tc_digest_f[ch], n_samples_still_available ); for ( m = 0; m < nSamplesForRendering; m++ ) { @@ -2244,6 +2267,22 @@ ivas_error ivas_jbm_dec_tc_buffer_open( { hTcBuffer->tc[ch_idx] = NULL; } +#ifdef OPT_TC + + /* memory buffer for TC audio samples not rendered in the previous frame */ + for ( ch_idx = 0; ch_idx < max( hTcBuffer->nchan_transport_jbm, hTcBuffer->nchan_buffer_full ); ch_idx++ ) + { + if ( ( hTcBuffer->tc_buffer_old[ch_idx] = (float *) malloc( n_samp_residual * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for JBM TC Buffer\n" ) ); + } + set_zero( hTcBuffer->tc_buffer_old[ch_idx], n_samp_residual ); + } + for ( ; ch_idx < MAX_TRANSPORT_CHANNELS; ch_idx++ ) + { + hTcBuffer->tc_buffer_old[ch_idx] = NULL; + } +#endif } else { @@ -2329,6 +2368,17 @@ ivas_error ivas_jbm_dec_tc_buffer_reconfigure( { free( hTcBuffer->tc_buffer ); hTcBuffer->tc_buffer = NULL; +#ifdef OPT_TC + + for ( ch_idx = 0; ch_idx < MAX_TRANSPORT_CHANNELS; ch_idx++ ) + { + if ( hTcBuffer->tc_buffer_old[ch_idx] != NULL ) + { + free( hTcBuffer->tc_buffer_old[ch_idx] ); + hTcBuffer->tc_buffer_old[ch_idx] = NULL; + } + } +#endif } if ( st_ivas->hDecoderConfig->Opt_tsm ) @@ -2377,6 +2427,22 @@ ivas_error ivas_jbm_dec_tc_buffer_reconfigure( { hTcBuffer->tc[ch_idx] = NULL; } +#ifdef OPT_TC + + /* memory buffer for TC audio samples not rendered in the previous frame */ + for ( ch_idx = 0; ch_idx < max( hTcBuffer->nchan_transport_jbm, hTcBuffer->nchan_buffer_full ); ch_idx++ ) + { + if ( ( hTcBuffer->tc_buffer_old[ch_idx] = (float *) malloc( n_samp_residual * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for JBM TC Buffer\n" ) ); + } + set_zero( hTcBuffer->tc_buffer_old[ch_idx], n_samp_residual ); + } + for ( ; ch_idx < MAX_TRANSPORT_CHANNELS; ch_idx++ ) + { + hTcBuffer->tc_buffer_old[ch_idx] = NULL; + } +#endif } else { @@ -2456,6 +2522,17 @@ void ivas_jbm_dec_tc_buffer_close( ( *phTcBuffer )->tc_buffer = NULL; } +#ifdef OPT_TC + for ( i = 0; i < MAX_TRANSPORT_CHANNELS; i++ ) + { + if ( ( *phTcBuffer )->tc_buffer_old[i] != NULL ) + { + free( ( *phTcBuffer )->tc_buffer_old[i] ); + ( *phTcBuffer )->tc_buffer_old[i] = NULL; + } + } + +#endif free( *phTcBuffer ); *phTcBuffer = NULL; } diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index 8d5f167620..ed9e90e03b 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -944,6 +944,10 @@ typedef struct ivas_masa_ism_data_structure typedef struct decoder_tc_buffer_structure { +#ifdef OPT_TC + float *tc_buffer_old[MAX_TRANSPORT_CHANNELS]; /* TC audio samples not rendered in the previous frame */ + float *tc_residual_old[MAX_INTERN_CHANNELS]; /* residual channels audio samples not rendered in the previous frame */ +#endif float *tc_buffer; /* the buffer itself */ float *tc[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS]; /* pointers into the buffer to the beginning of each tc */ // VE2SB: TBV TC_BUFFER_MODE tc_buffer_mode; /* mode of the buffer (no buffering, render buffering, out buffering) */ diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 9cd5655f5d..84f4880617 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -1191,7 +1191,13 @@ ivas_error IVAS_DEC_ReadFormat( { return IVAS_ERR_UNEXPECTED_NULL_POINTER; } +#ifdef MY_DEBUG + for ( int16_t ch = 0; ch < min( hIvasDec->st_ivas->hTcBuffer->nchan_transport_jbm, hIvasDec->st_ivas->hTcBuffer->nchan_buffer_full ); ch++ ) + { + set_f( hIvasDec->st_ivas->hTcBuffer->tc[ch], 0, hIvasDec->nSamplesFrame + hIvasDec->nSamplesFrame / 2 + hIvasDec->st_ivas->hTcBuffer->n_samples_granularity ); // VE: debug + } +#endif /* when granularity goes down, render what still fits in the new granularity */ if ( tc_granularity_new < st_ivas->hTcBuffer->n_samples_granularity ) { @@ -1351,6 +1357,20 @@ ivas_error IVAS_DEC_GetSamplesDecoder( } #endif +#ifdef MY_DEBUG + for ( int16_t ch = 0; ch < min( hIvasDec->st_ivas->hTcBuffer->nchan_transport_jbm, hIvasDec->st_ivas->hTcBuffer->nchan_buffer_full ); ch++ ) + { + set_f( hIvasDec->st_ivas->hTcBuffer->tc[ch], 0, hIvasDec->nSamplesFrame + hIvasDec->nSamplesFrame / 2 + hIvasDec->st_ivas->hTcBuffer->n_samples_granularity ); // VE: debug + } + +#endif +#ifdef REMOVE_APA_BUFFER + for ( int16_t ch = 0; ch < hIvasDec->st_ivas->hTcBuffer->nchan_transport_jbm; ch++ ) + { + mvr2r( hIvasDec->st_ivas->p_output_f[ch], hIvasDec->st_ivas->hTcBuffer->tc[ch], hIvasDec->nSamplesFrame ); + } +#endif + /*-----------------------------------------------------------------* * JBM *-----------------------------------------------------------------*/ @@ -1372,11 +1392,19 @@ ivas_error IVAS_DEC_GetSamplesDecoder( return IVAS_ERR_UNKNOWN; } +#ifdef MY_DEBUG + set_f( hIvasDec->apaExecBuffer, 0, nTransportChannels * APA_BUF_PER_CHANNEL ); // VE: debug + +#endif #ifdef LIB_DEC_REVISION ivas_syn_output_f( hIvasDec->st_ivas->p_output_f, hIvasDec->nSamplesFrame, nTransportChannels, hIvasDec->apaExecBuffer ); #endif +#ifdef REMOVE_APA_BUFFER + if ( apa_exec( hIvasDec->hTimeScaler, hIvasDec->st_ivas->hTcBuffer->tc_buffer, hIvasDec->nSamplesFrame * nTransportChannels, (uint16_t) hIvasDec->tsm_max_scaling, hIvasDec->apaExecBuffer, &nTimeScalerOutSamples ) != 0 ) +#else if ( apa_exec( hIvasDec->hTimeScaler, hIvasDec->apaExecBuffer, hIvasDec->nSamplesFrame * nTransportChannels, (uint16_t) hIvasDec->tsm_max_scaling, hIvasDec->apaExecBuffer, &nTimeScalerOutSamples ) != 0 ) +#endif { return IVAS_ERR_UNKNOWN; } @@ -1403,7 +1431,11 @@ ivas_error IVAS_DEC_GetSamplesDecoder( } #endif - if ( st_ivas->hDecoderConfig->Opt_tsm ) +#ifdef MY_DEBUG + set_f( hIvasDec->apaExecBuffer, 0, nTransportChannels * APA_BUF_PER_CHANNEL ); // VE: debug + +#endif + if ( hIvasDec->st_ivas->hDecoderConfig->Opt_tsm ) { /* feed residual samples to TSM for the next call */ if ( apa_set_renderer_residual_samples( hIvasDec->hTimeScaler, (uint16_t) nResidualSamples ) != 0 ) @@ -2054,6 +2086,26 @@ ivas_error IVAS_DEC_GetSamplesRenderer( { *needNewFrame = false; } +#endif +#ifdef OPT_TC + + if ( st_ivas->hDecoderConfig->Opt_tsm ) + { + int16_t ch; + DECODER_TC_BUFFER_HANDLE hTcBuffer = st_ivas->hTcBuffer; + + if ( hTcBuffer->n_samples_buffered - hTcBuffer->n_samples_rendered < hTcBuffer->n_samples_granularity ) + { + for ( ch = 0; ch < min( hTcBuffer->nchan_transport_jbm, hTcBuffer->nchan_buffer_full ); ch++ ) + { + mvr2r( hTcBuffer->tc[ch] + hTcBuffer->n_samples_rendered, hTcBuffer->tc_buffer_old[ch], hTcBuffer->n_samples_buffered - hTcBuffer->n_samples_rendered ); + } + for ( ; ch < max( hTcBuffer->nchan_transport_jbm, hTcBuffer->nchan_buffer_full ); ch++ ) + { + mvr2r( hTcBuffer->tc[ch], hTcBuffer->tc_buffer_old[ch], hTcBuffer->n_samples_buffered - hTcBuffer->n_samples_rendered ); + } + } + } #endif } -- GitLab From 3565ea3347269a7e1f47846a490dea27186d8057 Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 16 Apr 2025 12:25:15 +0200 Subject: [PATCH 05/29] - fix FIX_OSBA_BR_SW_FLUSH - update --- lib_com/options.h | 1 + lib_dec/ivas_jbm_dec.c | 20 +++++++++++++------- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 268d6494d4..2d4141e844 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -164,6 +164,7 @@ #if 1 #define JBM_MEMORY_OPT /* VA: issue 916: optimization of RAM in the JBM decoder */ #define OPT_TC // separate heap memory from hTcBuffer->tcBuffer[] +//#define FIX_OSBA_BR_SW_FLUSH // this is non-BE bugfix //#define REMOVE_APA_BUFFER // remove hIvasDec->apaExecBuffer[] #define MY_DEBUG diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index cdc83043b9..ed0491e3fd 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -1425,12 +1425,15 @@ ivas_error ivas_jbm_dec_flush_renderer( #ifdef OPT_TC /* render available full slots (with new lower granularity) */ +#ifdef FIX_OSBA_BR_SW_FLUSH + for ( ch_idx = 0; ch_idx < max( hTcBuffer->nchan_transport_jbm, hTcBuffer->nchan_buffer_full ); ch_idx++ ) +#else for ( ch_idx = 0; ch_idx < min( 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++ ) +#endif { mvr2r( hTcBuffer->tc_buffer_old[ch_idx], hTcBuffer->tc[ch_idx], n_samples_to_render ); } - +#ifndef FIX_OSBA_BR_SW_FLUSH for ( ; ch_idx < hTcBuffer->nchan_buffer_full; ch_idx++ ) { /* move it at the beginning of the TC buffer with zero padding */ @@ -1438,6 +1441,7 @@ ivas_error ivas_jbm_dec_flush_renderer( set_zero( hTcBuffer->tc[ch_idx] + n_samples_to_render, hTcBuffer->n_samples_granularity - n_samples_to_render ); mvr2r( hTcBuffer->tc[ch_idx] + hTcBuffer->n_samples_rendered + n_samples_to_render, hTcBuffer->tc[ch_idx] + hTcBuffer->n_samples_granularity, n_samples_still_available ); } +#endif #else /* render what is still there with zero padding */ for ( ch_idx = 0; ch_idx < hTcBuffer->nchan_buffer_full; ch_idx++ ) @@ -2069,11 +2073,12 @@ static void ivas_jbm_dec_copy_tc( for ( ch = 0; ch < n_ch_full_copy; ch++ ) { -#ifdef OPT_TC - mvr2r( st_ivas->hTcBuffer->tc_buffer_old[ch], st_ivas->hTcBuffer->tc[ch] + st_ivas->hTcBuffer->n_samples_rendered, n_samples_still_available ); -#endif set_zero( hTcBuffer->tc[ch], hTcBuffer->n_samples_discard ); +#ifdef OPT_TC + mvr2r( st_ivas->hTcBuffer->tc_buffer_old[ch], st_ivas->hTcBuffer->tc[ch] + st_ivas->hTcBuffer->n_samples_discard, n_samples_still_available ); +#else mvr2r( hTcBuffer->tc[ch] + hTcBuffer->n_samples_rendered, hTcBuffer->tc[ch] + hTcBuffer->n_samples_discard, n_samples_still_available ); +#endif for ( m = 0; m < nSamplesForRendering; m++ ) { hTcBuffer->tc[ch][n_samples_still_available + hTcBuffer->n_samples_discard + m] = data[m * st_ivas->hTcBuffer->nchan_transport_jbm + ch]; @@ -2085,9 +2090,10 @@ static void ivas_jbm_dec_copy_tc( for ( ; ch < hTcBuffer->nchan_transport_jbm; ch++ ) { #ifdef OPT_TC - mvr2r( st_ivas->hTcBuffer->tc_buffer_old[ch], tc_digest_f[ch], n_samples_still_available ); // VE: TBV!!! -#endif + mvr2r( st_ivas->hTcBuffer->tc_buffer_old[ch], tc_digest_f[ch], n_samples_still_available ); +#else mvr2r( hTcBuffer->tc[ch], tc_digest_f[ch], n_samples_still_available ); +#endif for ( m = 0; m < nSamplesForRendering; m++ ) { tc_digest_f[ch][n_samples_still_available + m] = data[m * st_ivas->hTcBuffer->nchan_transport_jbm + ch]; -- GitLab From d0ce969d306321f8644e5f57f77453217f12d820 Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 16 Apr 2025 13:54:32 +0200 Subject: [PATCH 06/29] updates --- lib_com/options.h | 2 +- lib_dec/ivas_jbm_dec.c | 23 +++++++++++++++++++++++ lib_dec/lib_dec.c | 22 +++++++++++++++------- 3 files changed, 39 insertions(+), 8 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 2d4141e844..dda8580b92 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -165,7 +165,7 @@ #define JBM_MEMORY_OPT /* VA: issue 916: optimization of RAM in the JBM decoder */ #define OPT_TC // separate heap memory from hTcBuffer->tcBuffer[] //#define FIX_OSBA_BR_SW_FLUSH // this is non-BE bugfix -//#define REMOVE_APA_BUFFER // remove hIvasDec->apaExecBuffer[] +#define REMOVE_APA_BUFFER // remove hIvasDec->apaExecBuffer[] #define MY_DEBUG #endif diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index ed0491e3fd..7ee71aaae3 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -2098,7 +2098,11 @@ static void ivas_jbm_dec_copy_tc( { tc_digest_f[ch][n_samples_still_available + m] = data[m * st_ivas->hTcBuffer->nchan_transport_jbm + ch]; } +#ifdef OPT_TC + mvr2r( tc_digest_f[ch] + hTcBuffer->n_samples_available, hTcBuffer->tc_buffer_old[ch], *nSamplesResidual ); +#else mvr2r( tc_digest_f[ch] + hTcBuffer->n_samples_available, hTcBuffer->tc[ch], *nSamplesResidual ); +#endif } } @@ -2226,7 +2230,11 @@ ivas_error ivas_jbm_dec_tc_buffer_open( int32_t offset; if ( st_ivas->hDecoderConfig->Opt_tsm ) { +#ifdef REMOVE_APA_BUFFER + n_samp_full = ( NS2SA( st_ivas->hDecoderConfig->output_Fs, MAX_JBM_L_FRAME_NS ) ); +#else n_samp_full = ( NS2SA( st_ivas->hDecoderConfig->output_Fs, MAX_JBM_L_FRAME_NS ) + hTcBuffer->n_samples_granularity - 1 ); +#endif n_samp_residual = hTcBuffer->n_samples_granularity - 1; } else @@ -2236,9 +2244,14 @@ ivas_error ivas_jbm_dec_tc_buffer_open( } nsamp_to_allocate = hTcBuffer->nchan_buffer_full * n_samp_full; +#ifdef OPT_TC + + if ( nsamp_to_allocate == 0 && nchan_residual * n_samp_residual == 0 ) +#else nsamp_to_allocate += nchan_residual * n_samp_residual; if ( nsamp_to_allocate == 0 ) +#endif { hTcBuffer->tc_buffer = NULL; @@ -2389,7 +2402,11 @@ ivas_error ivas_jbm_dec_tc_buffer_reconfigure( if ( st_ivas->hDecoderConfig->Opt_tsm ) { +#ifdef REMOVE_APA_BUFFER + n_samp_full = ( NS2SA( st_ivas->hDecoderConfig->output_Fs, MAX_JBM_L_FRAME_NS ) ); +#else n_samp_full = ( NS2SA( st_ivas->hDecoderConfig->output_Fs, MAX_JBM_L_FRAME_NS ) + hTcBuffer->n_samples_granularity - 1 ); +#endif n_samp_residual = hTcBuffer->n_samples_granularity - 1; } else @@ -2397,10 +2414,16 @@ ivas_error ivas_jbm_dec_tc_buffer_reconfigure( n_samp_full = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); n_samp_residual = 0; } + nsamp_to_allocate = hTcBuffer->nchan_buffer_full * n_samp_full; +#ifdef OPT_TC + + if ( nsamp_to_allocate == 0 && nchan_residual * n_samp_residual == 0 ) +#else nsamp_to_allocate += nchan_residual * n_samp_residual; if ( nsamp_to_allocate == 0 ) +#endif { hTcBuffer->tc_buffer = NULL; for ( ch_idx = 0; ch_idx < MAX_TRANSPORT_CHANNELS + MAX_NUM_OBJECTS; ch_idx++ ) diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 84f4880617..6b1f800942 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -1194,7 +1194,7 @@ ivas_error IVAS_DEC_ReadFormat( #ifdef MY_DEBUG for ( int16_t ch = 0; ch < min( hIvasDec->st_ivas->hTcBuffer->nchan_transport_jbm, hIvasDec->st_ivas->hTcBuffer->nchan_buffer_full ); ch++ ) { - set_f( hIvasDec->st_ivas->hTcBuffer->tc[ch], 0, hIvasDec->nSamplesFrame + hIvasDec->nSamplesFrame / 2 + hIvasDec->st_ivas->hTcBuffer->n_samples_granularity ); // VE: debug + set_f( hIvasDec->st_ivas->hTcBuffer->tc[ch], 0, hIvasDec->nSamplesFrame + hIvasDec->nSamplesFrame / 2 ); } #endif @@ -1360,12 +1360,12 @@ ivas_error IVAS_DEC_GetSamplesDecoder( #ifdef MY_DEBUG for ( int16_t ch = 0; ch < min( hIvasDec->st_ivas->hTcBuffer->nchan_transport_jbm, hIvasDec->st_ivas->hTcBuffer->nchan_buffer_full ); ch++ ) { - set_f( hIvasDec->st_ivas->hTcBuffer->tc[ch], 0, hIvasDec->nSamplesFrame + hIvasDec->nSamplesFrame / 2 + hIvasDec->st_ivas->hTcBuffer->n_samples_granularity ); // VE: debug + set_f( hIvasDec->st_ivas->hTcBuffer->tc[ch], 0, hIvasDec->nSamplesFrame + hIvasDec->nSamplesFrame / 2 ); } #endif #ifdef REMOVE_APA_BUFFER - for ( int16_t ch = 0; ch < hIvasDec->st_ivas->hTcBuffer->nchan_transport_jbm; ch++ ) + for ( int16_t ch = 0; ch < min( hIvasDec->st_ivas->hTcBuffer->nchan_transport_jbm, hIvasDec->st_ivas->hTcBuffer->nchan_buffer_full ); ch++ ) { mvr2r( hIvasDec->st_ivas->p_output_f[ch], hIvasDec->st_ivas->hTcBuffer->tc[ch], hIvasDec->nSamplesFrame ); } @@ -1393,14 +1393,14 @@ ivas_error IVAS_DEC_GetSamplesDecoder( } #ifdef MY_DEBUG - set_f( hIvasDec->apaExecBuffer, 0, nTransportChannels * APA_BUF_PER_CHANNEL ); // VE: debug + set_f( hIvasDec->apaExecBuffer, 0, nTransportChannels * APA_BUF_PER_CHANNEL ); #endif #ifdef LIB_DEC_REVISION ivas_syn_output_f( hIvasDec->st_ivas->p_output_f, hIvasDec->nSamplesFrame, nTransportChannels, hIvasDec->apaExecBuffer ); #endif -#ifdef REMOVE_APA_BUFFER +#ifdef REMOVE_APA_BUFFERaa if ( apa_exec( hIvasDec->hTimeScaler, hIvasDec->st_ivas->hTcBuffer->tc_buffer, hIvasDec->nSamplesFrame * nTransportChannels, (uint16_t) hIvasDec->tsm_max_scaling, hIvasDec->apaExecBuffer, &nTimeScalerOutSamples ) != 0 ) #else if ( apa_exec( hIvasDec->hTimeScaler, hIvasDec->apaExecBuffer, hIvasDec->nSamplesFrame * nTransportChannels, (uint16_t) hIvasDec->tsm_max_scaling, hIvasDec->apaExecBuffer, &nTimeScalerOutSamples ) != 0 ) @@ -1422,6 +1422,13 @@ ivas_error IVAS_DEC_GetSamplesDecoder( * Feed decoded transport channels samples to the renderer *-----------------------------------------------------------------*/ +#ifdef MY_DEBUG + for ( int16_t ch = 0; ch < min( hIvasDec->st_ivas->hTcBuffer->nchan_transport_jbm, hIvasDec->st_ivas->hTcBuffer->nchan_buffer_full ); ch++ ) + { + set_f( hIvasDec->st_ivas->hTcBuffer->tc[ch], 0, hIvasDec->nSamplesFrame + hIvasDec->nSamplesFrame / 2 ); + } + +#endif #ifdef LIB_DEC_REVISION ivas_jbm_dec_feed_tc_to_renderer( st_ivas, nSamplesTcsScaled, &nResidualSamples, hIvasDec->apaExecBuffer ); #else @@ -1432,7 +1439,7 @@ ivas_error IVAS_DEC_GetSamplesDecoder( #endif #ifdef MY_DEBUG - set_f( hIvasDec->apaExecBuffer, 0, nTransportChannels * APA_BUF_PER_CHANNEL ); // VE: debug + set_f( hIvasDec->apaExecBuffer, 0, nTransportChannels * APA_BUF_PER_CHANNEL ); #endif if ( hIvasDec->st_ivas->hDecoderConfig->Opt_tsm ) @@ -2102,7 +2109,8 @@ ivas_error IVAS_DEC_GetSamplesRenderer( } for ( ; ch < max( hTcBuffer->nchan_transport_jbm, hTcBuffer->nchan_buffer_full ); ch++ ) { - mvr2r( hTcBuffer->tc[ch], hTcBuffer->tc_buffer_old[ch], hTcBuffer->n_samples_buffered - hTcBuffer->n_samples_rendered ); + /* note: residual channels were saved already in ivas_jbm_dec_copy_tc() */ + // mvr2r( hTcBuffer->tc[ch], hTcBuffer->tc_buffer_old[ch], hTcBuffer->n_samples_buffered - hTcBuffer->n_samples_rendered ); } } } -- GitLab From f3bd967112c94af98e656c0cef66d9de492366aa Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 16 Apr 2025 16:50:36 +0200 Subject: [PATCH 07/29] Call apa_exec() with 'hTcBuffer->tc_buffer' instead of 'apaExecBuffer' --- lib_dec/ivas_jbm_dec.c | 6 ++++-- lib_dec/lib_dec.c | 16 ++++++---------- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 7ee71aaae3..c08e5fc021 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -2243,11 +2243,12 @@ ivas_error ivas_jbm_dec_tc_buffer_open( n_samp_residual = 0; } - nsamp_to_allocate = hTcBuffer->nchan_buffer_full * n_samp_full; #ifdef OPT_TC + nsamp_to_allocate = max( hTcBuffer->nchan_transport_jbm, hTcBuffer->nchan_buffer_full ) * n_samp_full; if ( nsamp_to_allocate == 0 && nchan_residual * n_samp_residual == 0 ) #else + nsamp_to_allocate = hTcBuffer->nchan_buffer_full * n_samp_full; nsamp_to_allocate += nchan_residual * n_samp_residual; if ( nsamp_to_allocate == 0 ) @@ -2415,11 +2416,12 @@ ivas_error ivas_jbm_dec_tc_buffer_reconfigure( n_samp_residual = 0; } - nsamp_to_allocate = hTcBuffer->nchan_buffer_full * n_samp_full; #ifdef OPT_TC + nsamp_to_allocate = max( hTcBuffer->nchan_transport_jbm, hTcBuffer->nchan_buffer_full ) * n_samp_full; if ( nsamp_to_allocate == 0 && nchan_residual * n_samp_residual == 0 ) #else + nsamp_to_allocate = hTcBuffer->nchan_buffer_full * n_samp_full; nsamp_to_allocate += nchan_residual * n_samp_residual; if ( nsamp_to_allocate == 0 ) diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 6b1f800942..18b6a74b99 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -1364,13 +1364,6 @@ ivas_error IVAS_DEC_GetSamplesDecoder( } #endif -#ifdef REMOVE_APA_BUFFER - for ( int16_t ch = 0; ch < min( hIvasDec->st_ivas->hTcBuffer->nchan_transport_jbm, hIvasDec->st_ivas->hTcBuffer->nchan_buffer_full ); ch++ ) - { - mvr2r( hIvasDec->st_ivas->p_output_f[ch], hIvasDec->st_ivas->hTcBuffer->tc[ch], hIvasDec->nSamplesFrame ); - } -#endif - /*-----------------------------------------------------------------* * JBM *-----------------------------------------------------------------*/ @@ -1396,13 +1389,16 @@ ivas_error IVAS_DEC_GetSamplesDecoder( set_f( hIvasDec->apaExecBuffer, 0, nTransportChannels * APA_BUF_PER_CHANNEL ); #endif +#ifdef REMOVE_APA_BUFFER + /* move decoded audio buffers st_ivas->p_output_f[][] to a serial buffer hTcBuffer->tc_buffer[] */ + ivas_syn_output_f( hIvasDec->st_ivas->p_output_f, hIvasDec->nSamplesFrame, nTransportChannels, hIvasDec->st_ivas->hTcBuffer->tc_buffer ); + + if ( apa_exec( hIvasDec->hTimeScaler, hIvasDec->st_ivas->hTcBuffer->tc_buffer, hIvasDec->nSamplesFrame * nTransportChannels, (uint16_t) hIvasDec->tsm_max_scaling, hIvasDec->apaExecBuffer, &nTimeScalerOutSamples ) != 0 ) +#else #ifdef LIB_DEC_REVISION ivas_syn_output_f( hIvasDec->st_ivas->p_output_f, hIvasDec->nSamplesFrame, nTransportChannels, hIvasDec->apaExecBuffer ); #endif -#ifdef REMOVE_APA_BUFFERaa - if ( apa_exec( hIvasDec->hTimeScaler, hIvasDec->st_ivas->hTcBuffer->tc_buffer, hIvasDec->nSamplesFrame * nTransportChannels, (uint16_t) hIvasDec->tsm_max_scaling, hIvasDec->apaExecBuffer, &nTimeScalerOutSamples ) != 0 ) -#else if ( apa_exec( hIvasDec->hTimeScaler, hIvasDec->apaExecBuffer, hIvasDec->nSamplesFrame * nTransportChannels, (uint16_t) hIvasDec->tsm_max_scaling, hIvasDec->apaExecBuffer, &nTimeScalerOutSamples ) != 0 ) #endif { -- GitLab From 8f4678daba59ef0e0b58abf2eb8baedea4e601ec Mon Sep 17 00:00:00 2001 From: vaclav Date: Fri, 18 Apr 2025 11:05:31 +0200 Subject: [PATCH 08/29] - REMOVE_APA_BUFFER2 - ivas_jbm_dec_tc_buffer_allocate --- lib_com/ivas_prot.h | 2 +- lib_com/options.h | 1 + lib_dec/ivas_jbm_dec.c | 138 ++++++++++++++++++++++++++++++++++++++--- lib_dec/lib_dec.c | 18 ++++-- 4 files changed, 144 insertions(+), 15 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 518712193f..4a65ee74a9 100755 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -840,7 +840,7 @@ void ivas_jbm_dec_feed_tc_to_renderer( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const int16_t nSamplesForRendering, /* i : number of TC samples available for rendering */ int16_t *nSamplesResidual, /* o : number of samples not fitting into the renderer grid and buffer for the next call*/ - float *data /* i/o: transport channels/output synthesis signal */ + float *data /* i/o: time-scaled transport channels */ ); void ivas_dec_prepare_renderer( diff --git a/lib_com/options.h b/lib_com/options.h index dda8580b92..1d1e51e317 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -166,6 +166,7 @@ #define OPT_TC // separate heap memory from hTcBuffer->tcBuffer[] //#define FIX_OSBA_BR_SW_FLUSH // this is non-BE bugfix #define REMOVE_APA_BUFFER // remove hIvasDec->apaExecBuffer[] +#define REMOVE_APA_BUFFER2 #define MY_DEBUG #endif diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index c08e5fc021..23df43cc83 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -792,13 +792,24 @@ void ivas_jbm_dec_feed_tc_to_renderer( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const int16_t nSamplesForRendering, /* i : number of TC samples available for rendering */ int16_t *nSamplesResidual, /* o : number of samples not fitting into the renderer grid and buffer for the next call*/ - float *data /* i : transport channels */ + float *data /* i : time-scaled transport channels */ ) { +#ifdef REMOVE_APA_BUFFER2 + float apa_buff[12 * MAX_JBM_L_FRAME48k]; +#endif float data_f[MAX_CLDFB_DIGEST_CHANNELS][MAX_JBM_L_FRAME48k]; /* 'float' buffer for transport channels that will be directly converted with the CLDFB */ float *p_data_f[MAX_CLDFB_DIGEST_CHANNELS]; int16_t n, n_render_timeslots; +#ifdef REMOVE_APA_BUFFER2 + int16_t n_samp_full = ( NS2SA( st_ivas->hDecoderConfig->output_Fs, MAX_JBM_L_FRAME_NS ) ); + // mvr2r( data, apa_buff, min( st_ivas->hTcBuffer->nchan_transport_jbm, st_ivas->hTcBuffer->nchan_buffer_full ) * n_samp_full ); + mvr2r( data, apa_buff, st_ivas->hTcBuffer->nchan_transport_jbm * n_samp_full ); + // set_zero( data, st_ivas->hTcBuffer->nchan_transport_jbm * n_samp_full ); + data = apa_buff; + +#endif push_wmops( "ivas_jbm_dec_feed_tc_to_renderer" ); for ( n = 0; n < MAX_CLDFB_DIGEST_CHANNELS; n++ ) { @@ -2174,6 +2185,93 @@ int16_t ivas_jbm_dec_get_render_granularity( } #endif +#ifdef REMOVE_APA_BUFFER + +/*--------------------------------------------------------------------------* + * ivas_jbm_dec_tc_buffer_allocate() + * + * open and initialize JBM transport channel buffer + *--------------------------------------------------------------------------*/ + +static ivas_error ivas_jbm_dec_tc_buffer_allocate( + DECODER_TC_BUFFER_HANDLE hTcBuffer, /* i/o: JBM TSM buffer handle */ + const int32_t output_Fs, /* i : output sampling rate */ + const int16_t Opt_tsm /* i : TSM option flag */ +) +{ + int16_t nsamp_to_allocate; + int16_t ch_idx, n_samp_full, n_samp_residual, offset; + + if ( Opt_tsm ) + { +#ifdef REMOVE_APA_BUFFER + n_samp_full = ( NS2SA( output_Fs, MAX_JBM_L_FRAME_NS ) ); +#else + n_samp_full = ( NS2SA( output_Fs, MAX_JBM_L_FRAME_NS ) + hTcBuffer->n_samples_granularity - 1 ); +#endif + n_samp_residual = hTcBuffer->n_samples_granularity - 1; + } + else + { + n_samp_full = (int16_t) ( output_Fs / FRAMES_PER_SEC ); + n_samp_residual = 0; + } + + nsamp_to_allocate = max( hTcBuffer->nchan_transport_jbm, hTcBuffer->nchan_buffer_full ) * n_samp_full; + + if ( Opt_tsm ) + { + /* note: this is stack memory buffer for time-scale modified audio signals */ + if ( ( hTcBuffer->tc_buffer = (float *) malloc( nsamp_to_allocate * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for JBM TC Buffer\n" ) ); + } + set_zero( hTcBuffer->tc_buffer, nsamp_to_allocate ); + + offset = 0; + for ( ch_idx = 0; ch_idx < hTcBuffer->nchan_buffer_full; ch_idx++ ) + { + hTcBuffer->tc[ch_idx] = &hTcBuffer->tc_buffer[offset]; + offset += n_samp_full; + } + for ( ; ch_idx < hTcBuffer->nchan_transport_internal; ch_idx++ ) + { + hTcBuffer->tc[ch_idx] = &hTcBuffer->tc_buffer[offset]; + offset += n_samp_residual; + } + for ( ; ch_idx < MAX_TRANSPORT_CHANNELS + MAX_NUM_OBJECTS; ch_idx++ ) + { + hTcBuffer->tc[ch_idx] = NULL; + } + + /* memory buffer for TC audio samples not rendered in the previous frame */ + for ( ch_idx = 0; ch_idx < max( hTcBuffer->nchan_transport_jbm, hTcBuffer->nchan_buffer_full ); ch_idx++ ) + { + if ( ( hTcBuffer->tc_buffer_old[ch_idx] = (float *) malloc( n_samp_residual * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for JBM TC Buffer\n" ) ); + } + set_zero( hTcBuffer->tc_buffer_old[ch_idx], n_samp_residual ); + } + for ( ; ch_idx < MAX_TRANSPORT_CHANNELS; ch_idx++ ) + { + hTcBuffer->tc_buffer_old[ch_idx] = NULL; + } + } + else + { + hTcBuffer->tc_buffer = NULL; + + for ( ch_idx = 0; ch_idx < MAX_TRANSPORT_CHANNELS + MAX_NUM_OBJECTS; ch_idx++ ) // VE: number of channels could be lowered?? + { + hTcBuffer->tc[ch_idx] = NULL; + } + } + + return IVAS_ERR_OK; +} + +#endif /*--------------------------------------------------------------------------* * ivas_jbm_dec_tc_buffer_open() @@ -2193,8 +2291,12 @@ ivas_error ivas_jbm_dec_tc_buffer_open( int16_t nsamp_to_allocate; DECODER_TC_BUFFER_HANDLE hTcBuffer; int16_t nMaxSlotsPerSubframe; +#ifdef REMOVE_APA_BUFFER + ivas_error error; +#else int16_t nchan_residual; int16_t ch_idx; +#endif /*-----------------------------------------------------------------* * prepare library opening @@ -2209,7 +2311,9 @@ ivas_error ivas_jbm_dec_tc_buffer_open( hTcBuffer->nchan_transport_jbm = nchan_transport_jbm; hTcBuffer->nchan_transport_internal = nchan_transport_internal; hTcBuffer->nchan_buffer_full = nchan_full; +#ifndef REMOVE_APA_BUFFER nchan_residual = nchan_transport_internal - nchan_full; +#endif hTcBuffer->n_samples_granularity = n_samples_granularity; hTcBuffer->n_samples_available = 0; hTcBuffer->n_samples_buffered = 0; @@ -2225,6 +2329,12 @@ ivas_error ivas_jbm_dec_tc_buffer_open( set_s( hTcBuffer->subframe_nbslots, 0, MAX_JBM_SUBFRAMES_5MS ); set_s( hTcBuffer->subframe_nbslots, nMaxSlotsPerSubframe, MAX_PARAM_SPATIAL_SUBFRAMES ); +#ifdef REMOVE_APA_BUFFER + if ( ( error = ivas_jbm_dec_tc_buffer_allocate( hTcBuffer, st_ivas->hDecoderConfig->output_Fs, st_ivas->hDecoderConfig->Opt_tsm ) ) != IVAS_ERR_OK ) + { + return error; + } +#else { int16_t n_samp_full, n_samp_residual; int32_t offset; @@ -2245,14 +2355,12 @@ ivas_error ivas_jbm_dec_tc_buffer_open( #ifdef OPT_TC nsamp_to_allocate = max( hTcBuffer->nchan_transport_jbm, hTcBuffer->nchan_buffer_full ) * n_samp_full; - - if ( nsamp_to_allocate == 0 && nchan_residual * n_samp_residual == 0 ) #else nsamp_to_allocate = hTcBuffer->nchan_buffer_full * n_samp_full; nsamp_to_allocate += nchan_residual * n_samp_residual; +#endif if ( nsamp_to_allocate == 0 ) -#endif { hTcBuffer->tc_buffer = NULL; @@ -2310,6 +2418,7 @@ ivas_error ivas_jbm_dec_tc_buffer_open( } } } +#endif st_ivas->hTcBuffer = hTcBuffer; @@ -2332,13 +2441,17 @@ ivas_error ivas_jbm_dec_tc_buffer_reconfigure( const int16_t n_samples_granularity /* i : new granularity of the renderer/buffer */ ) { +#ifdef REMOVE_APA_BUFFER + int16_t ch_idx; + ivas_error error; +#else int16_t nsamp_to_allocate, n_samp_full, n_samp_residual, offset, nchan_residual; int16_t ch_idx; +#endif DECODER_TC_BUFFER_HANDLE hTcBuffer; hTcBuffer = st_ivas->hTcBuffer; - /* if granularity changes, adapt subframe_nb_slots */ if ( n_samples_granularity != hTcBuffer->n_samples_granularity ) { @@ -2349,7 +2462,7 @@ ivas_error ivas_jbm_dec_tc_buffer_reconfigure( nMaxSlotsPerSubframeNew = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / ( FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES ) ) / n_samples_granularity; #ifdef DEBUGGING - nMaxSlotsPerSubframeOld = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / ( FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES ) ) / st_ivas->hTcBuffer->n_samples_granularity; + int16_t nMaxSlotsPerSubframeOld = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / ( FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES ) ) / st_ivas->hTcBuffer->n_samples_granularity; assert( hTcBuffer->subframe_nbslots[hTcBuffer->subframes_rendered - 1] == nMaxSlotsPerSubframeOld ); if ( n_samples_granularity < hTcBuffer->n_samples_granularity ) { @@ -2376,7 +2489,9 @@ ivas_error ivas_jbm_dec_tc_buffer_reconfigure( hTcBuffer->nchan_transport_jbm = nchan_transport_jbm; hTcBuffer->nchan_transport_internal = nchan_transport_internal; hTcBuffer->nchan_buffer_full = nchan_full; +#ifndef REMOVE_APA_BUFFER nchan_residual = nchan_transport_internal - nchan_full; +#endif hTcBuffer->n_samples_granularity = n_samples_granularity; #ifdef DEBUGGING @@ -2401,6 +2516,12 @@ ivas_error ivas_jbm_dec_tc_buffer_reconfigure( #endif } +#ifdef REMOVE_APA_BUFFER + if ( ( error = ivas_jbm_dec_tc_buffer_allocate( hTcBuffer, st_ivas->hDecoderConfig->output_Fs, st_ivas->hDecoderConfig->Opt_tsm ) ) != IVAS_ERR_OK ) + { + return error; + } +#else if ( st_ivas->hDecoderConfig->Opt_tsm ) { #ifdef REMOVE_APA_BUFFER @@ -2418,14 +2539,12 @@ ivas_error ivas_jbm_dec_tc_buffer_reconfigure( #ifdef OPT_TC nsamp_to_allocate = max( hTcBuffer->nchan_transport_jbm, hTcBuffer->nchan_buffer_full ) * n_samp_full; - - if ( nsamp_to_allocate == 0 && nchan_residual * n_samp_residual == 0 ) #else nsamp_to_allocate = hTcBuffer->nchan_buffer_full * n_samp_full; nsamp_to_allocate += nchan_residual * n_samp_residual; +#endif if ( nsamp_to_allocate == 0 ) -#endif { hTcBuffer->tc_buffer = NULL; for ( ch_idx = 0; ch_idx < MAX_TRANSPORT_CHANNELS + MAX_NUM_OBJECTS; ch_idx++ ) @@ -2480,6 +2599,7 @@ ivas_error ivas_jbm_dec_tc_buffer_reconfigure( hTcBuffer->tc_buffer = NULL; } } +#endif return IVAS_ERR_OK; } diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 18b6a74b99..1814d33d14 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -1360,7 +1360,7 @@ ivas_error IVAS_DEC_GetSamplesDecoder( #ifdef MY_DEBUG for ( int16_t ch = 0; ch < min( hIvasDec->st_ivas->hTcBuffer->nchan_transport_jbm, hIvasDec->st_ivas->hTcBuffer->nchan_buffer_full ); ch++ ) { - set_f( hIvasDec->st_ivas->hTcBuffer->tc[ch], 0, hIvasDec->nSamplesFrame + hIvasDec->nSamplesFrame / 2 ); + set_f( st_ivas->hTcBuffer->tc[ch], 0, hIvasDec->nSamplesFrame + hIvasDec->nSamplesFrame / 2 ); } #endif @@ -1391,9 +1391,13 @@ ivas_error IVAS_DEC_GetSamplesDecoder( #endif #ifdef REMOVE_APA_BUFFER /* move decoded audio buffers st_ivas->p_output_f[][] to a serial buffer hTcBuffer->tc_buffer[] */ - ivas_syn_output_f( hIvasDec->st_ivas->p_output_f, hIvasDec->nSamplesFrame, nTransportChannels, hIvasDec->st_ivas->hTcBuffer->tc_buffer ); + ivas_syn_output_f( st_ivas->p_output_f, hIvasDec->nSamplesFrame, nTransportChannels, st_ivas->hTcBuffer->tc_buffer ); - if ( apa_exec( hIvasDec->hTimeScaler, hIvasDec->st_ivas->hTcBuffer->tc_buffer, hIvasDec->nSamplesFrame * nTransportChannels, (uint16_t) hIvasDec->tsm_max_scaling, hIvasDec->apaExecBuffer, &nTimeScalerOutSamples ) != 0 ) +#ifdef REMOVE_APA_BUFFER2aa + if ( apa_exec( hIvasDec->hTimeScaler, st_ivas->hTcBuffer->tc_buffer, hIvasDec->nSamplesFrame * nTransportChannels, (uint16_t) hIvasDec->tsm_max_scaling, st_ivas->hTcBuffer->tc_buffer, &nTimeScalerOutSamples ) != 0 ) +#else + if ( apa_exec( hIvasDec->hTimeScaler, st_ivas->hTcBuffer->tc_buffer, hIvasDec->nSamplesFrame * nTransportChannels, (uint16_t) hIvasDec->tsm_max_scaling, hIvasDec->apaExecBuffer, &nTimeScalerOutSamples ) != 0 ) +#endif #else #ifdef LIB_DEC_REVISION ivas_syn_output_f( hIvasDec->st_ivas->p_output_f, hIvasDec->nSamplesFrame, nTransportChannels, hIvasDec->apaExecBuffer ); @@ -1419,14 +1423,18 @@ ivas_error IVAS_DEC_GetSamplesDecoder( *-----------------------------------------------------------------*/ #ifdef MY_DEBUG - for ( int16_t ch = 0; ch < min( hIvasDec->st_ivas->hTcBuffer->nchan_transport_jbm, hIvasDec->st_ivas->hTcBuffer->nchan_buffer_full ); ch++ ) + for ( int16_t ch = 0; ch < min( st_ivas->hTcBuffer->nchan_transport_jbm, st_ivas->hTcBuffer->nchan_buffer_full ); ch++ ) { - set_f( hIvasDec->st_ivas->hTcBuffer->tc[ch], 0, hIvasDec->nSamplesFrame + hIvasDec->nSamplesFrame / 2 ); + set_f( st_ivas->hTcBuffer->tc[ch], 0, hIvasDec->nSamplesFrame + hIvasDec->nSamplesFrame / 2 ); } #endif #ifdef LIB_DEC_REVISION +#ifdef REMOVE_APA_BUFFER2aa + ivas_jbm_dec_feed_tc_to_renderer( st_ivas, nSamplesTcsScaled, &nResidualSamples, st_ivas->hTcBuffer->tc_buffer ); +#else ivas_jbm_dec_feed_tc_to_renderer( st_ivas, nSamplesTcsScaled, &nResidualSamples, hIvasDec->apaExecBuffer ); +#endif #else if ( ( error = IVAS_DEC_RendererFeedTcSamples( hIvasDec, nSamplesTcsScaled, &nResidualSamples, hIvasDec->apaExecBuffer ) ) != IVAS_ERR_OK ) { -- GitLab From e08c7c0b39b3cb3eeeb5712f427f407481f455f7 Mon Sep 17 00:00:00 2001 From: vaclav Date: Fri, 18 Apr 2025 11:31:30 +0200 Subject: [PATCH 09/29] remove hIvasDec->apaExecBuffer; under REMOVE_APA_BUFFER2 --- lib_dec/lib_dec.c | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 1814d33d14..0edd017ff2 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -88,7 +88,9 @@ struct IVAS_DEC int16_t tsm_max_scaling; int16_t timeScalingDone; /* have we done already one TSM in a 20ms frame? */ float tsm_quality; +#ifndef REMOVE_APA_BUFFER2 float *apaExecBuffer; /* Buffer for APA scaling */ +#endif PCMDSP_APA_HANDLE hTimeScaler; bool needNewFrame; bool hasBeenFedFrame; @@ -182,7 +184,9 @@ ivas_error IVAS_DEC_Open( } hIvasDec = *phIvasDec; hIvasDec->hVoIP = NULL; +#ifndef REMOVE_APA_BUFFER2 hIvasDec->apaExecBuffer = NULL; +#endif hIvasDec->hTimeScaler = NULL; hIvasDec->tsm_scale = 100; hIvasDec->tsm_max_scaling = 0; @@ -380,11 +384,12 @@ void IVAS_DEC_Close( apa_exit( &( *phIvasDec )->hTimeScaler ); +#ifndef REMOVE_APA_BUFFER2 if ( ( *phIvasDec )->apaExecBuffer != NULL ) { free( ( *phIvasDec )->apaExecBuffer ); } - +#endif if ( ( *phIvasDec )->flushbuffer != NULL ) { free( ( *phIvasDec )->flushbuffer ); @@ -1282,7 +1287,11 @@ ivas_error IVAS_DEC_GetSamplesDecoder( st_ivas = hIvasDec->st_ivas; #ifdef LIB_DEC_REVISION +#ifdef REMOVE_APA_BUFFER2 + isInitialized_voip = hIvasDec->hTimeScaler != NULL; +#else isInitialized_voip = hIvasDec->apaExecBuffer != NULL; +#endif #endif if ( !hIvasDec->isInitialized || hIvasDec->hasBeenFedFrame ) /* wait for the first good frame */ @@ -1385,15 +1394,17 @@ ivas_error IVAS_DEC_GetSamplesDecoder( return IVAS_ERR_UNKNOWN; } +#ifndef REMOVE_APA_BUFFER2 #ifdef MY_DEBUG set_f( hIvasDec->apaExecBuffer, 0, nTransportChannels * APA_BUF_PER_CHANNEL ); +#endif #endif #ifdef REMOVE_APA_BUFFER /* move decoded audio buffers st_ivas->p_output_f[][] to a serial buffer hTcBuffer->tc_buffer[] */ ivas_syn_output_f( st_ivas->p_output_f, hIvasDec->nSamplesFrame, nTransportChannels, st_ivas->hTcBuffer->tc_buffer ); -#ifdef REMOVE_APA_BUFFER2aa +#ifdef REMOVE_APA_BUFFER2 if ( apa_exec( hIvasDec->hTimeScaler, st_ivas->hTcBuffer->tc_buffer, hIvasDec->nSamplesFrame * nTransportChannels, (uint16_t) hIvasDec->tsm_max_scaling, st_ivas->hTcBuffer->tc_buffer, &nTimeScalerOutSamples ) != 0 ) #else if ( apa_exec( hIvasDec->hTimeScaler, st_ivas->hTcBuffer->tc_buffer, hIvasDec->nSamplesFrame * nTransportChannels, (uint16_t) hIvasDec->tsm_max_scaling, hIvasDec->apaExecBuffer, &nTimeScalerOutSamples ) != 0 ) @@ -1422,15 +1433,17 @@ ivas_error IVAS_DEC_GetSamplesDecoder( * Feed decoded transport channels samples to the renderer *-----------------------------------------------------------------*/ +#ifndef REMOVE_APA_BUFFER2 #ifdef MY_DEBUG for ( int16_t ch = 0; ch < min( st_ivas->hTcBuffer->nchan_transport_jbm, st_ivas->hTcBuffer->nchan_buffer_full ); ch++ ) { set_f( st_ivas->hTcBuffer->tc[ch], 0, hIvasDec->nSamplesFrame + hIvasDec->nSamplesFrame / 2 ); } +#endif #endif #ifdef LIB_DEC_REVISION -#ifdef REMOVE_APA_BUFFER2aa +#ifdef REMOVE_APA_BUFFER2 ivas_jbm_dec_feed_tc_to_renderer( st_ivas, nSamplesTcsScaled, &nResidualSamples, st_ivas->hTcBuffer->tc_buffer ); #else ivas_jbm_dec_feed_tc_to_renderer( st_ivas, nSamplesTcsScaled, &nResidualSamples, hIvasDec->apaExecBuffer ); @@ -1442,9 +1455,11 @@ ivas_error IVAS_DEC_GetSamplesDecoder( } #endif +#ifndef REMOVE_APA_BUFFER2 #ifdef MY_DEBUG set_f( hIvasDec->apaExecBuffer, 0, nTransportChannels * APA_BUF_PER_CHANNEL ); +#endif #endif if ( hIvasDec->st_ivas->hDecoderConfig->Opt_tsm ) { @@ -5151,12 +5166,14 @@ static ivas_error IVAS_DEC_VoIP_reconfigure( } } +#ifndef REMOVE_APA_BUFFER2 if ( ( hIvasDec->apaExecBuffer = malloc( sizeof( float ) * apa_buffer_size * nTransportChannels ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate VoIP handle" ); } set_zero( hIvasDec->apaExecBuffer, apa_buffer_size * nTransportChannels ); +#endif #ifndef LIB_DEC_REVISION } #endif @@ -5172,11 +5189,12 @@ static ivas_error IVAS_DEC_VoIP_reconfigure( return IVAS_ERR_INIT_ERROR; } +#ifndef REMOVE_APA_BUFFER2 /* realloc apa_exe_buffer */ #ifdef JBM_MEMORY_OPTaa apa_buffer_size = MAX_JBM_L_FRAME48k; #else - apa_buffer_size = APA_BUF_PER_CHANNEL; + apa_buffer_size = APA_BUF_PER_CHANNEL; #endif free( hIvasDec->apaExecBuffer ); if ( ( hIvasDec->apaExecBuffer = malloc( sizeof( float ) * apa_buffer_size * nTransportChannels ) ) == NULL ) @@ -5184,6 +5202,7 @@ static ivas_error IVAS_DEC_VoIP_reconfigure( return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate VoIP handle" ); } set_zero( hIvasDec->apaExecBuffer, apa_buffer_size * nTransportChannels ); +#endif #ifndef LIB_DEC_REVISION } /* realloc apa_exe_buffer */ -- GitLab From fda46f0daf675f4eb8d9f84ae934045c59307c8e Mon Sep 17 00:00:00 2001 From: vaclav Date: Fri, 18 Apr 2025 12:07:20 +0200 Subject: [PATCH 10/29] merge REMOVE_APA_BUFFER2 into REMOVE_APA_BUFFER --- lib_com/options.h | 1 - lib_dec/ivas_jbm_dec.c | 4 ++-- lib_dec/lib_dec.c | 53 +++++++++++++----------------------------- 3 files changed, 18 insertions(+), 40 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 1d1e51e317..dda8580b92 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -166,7 +166,6 @@ #define OPT_TC // separate heap memory from hTcBuffer->tcBuffer[] //#define FIX_OSBA_BR_SW_FLUSH // this is non-BE bugfix #define REMOVE_APA_BUFFER // remove hIvasDec->apaExecBuffer[] -#define REMOVE_APA_BUFFER2 #define MY_DEBUG #endif diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 23df43cc83..a5a1c16a0e 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -795,14 +795,14 @@ void ivas_jbm_dec_feed_tc_to_renderer( float *data /* i : time-scaled transport channels */ ) { -#ifdef REMOVE_APA_BUFFER2 +#ifdef REMOVE_APA_BUFFER float apa_buff[12 * MAX_JBM_L_FRAME48k]; #endif float data_f[MAX_CLDFB_DIGEST_CHANNELS][MAX_JBM_L_FRAME48k]; /* 'float' buffer for transport channels that will be directly converted with the CLDFB */ float *p_data_f[MAX_CLDFB_DIGEST_CHANNELS]; int16_t n, n_render_timeslots; -#ifdef REMOVE_APA_BUFFER2 +#ifdef REMOVE_APA_BUFFER int16_t n_samp_full = ( NS2SA( st_ivas->hDecoderConfig->output_Fs, MAX_JBM_L_FRAME_NS ) ); // mvr2r( data, apa_buff, min( st_ivas->hTcBuffer->nchan_transport_jbm, st_ivas->hTcBuffer->nchan_buffer_full ) * n_samp_full ); mvr2r( data, apa_buff, st_ivas->hTcBuffer->nchan_transport_jbm * n_samp_full ); diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 0edd017ff2..a3c7ef6513 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -88,7 +88,7 @@ struct IVAS_DEC int16_t tsm_max_scaling; int16_t timeScalingDone; /* have we done already one TSM in a 20ms frame? */ float tsm_quality; -#ifndef REMOVE_APA_BUFFER2 +#ifndef REMOVE_APA_BUFFER float *apaExecBuffer; /* Buffer for APA scaling */ #endif PCMDSP_APA_HANDLE hTimeScaler; @@ -184,7 +184,7 @@ ivas_error IVAS_DEC_Open( } hIvasDec = *phIvasDec; hIvasDec->hVoIP = NULL; -#ifndef REMOVE_APA_BUFFER2 +#ifndef REMOVE_APA_BUFFER hIvasDec->apaExecBuffer = NULL; #endif hIvasDec->hTimeScaler = NULL; @@ -384,7 +384,7 @@ void IVAS_DEC_Close( apa_exit( &( *phIvasDec )->hTimeScaler ); -#ifndef REMOVE_APA_BUFFER2 +#ifndef REMOVE_APA_BUFFER if ( ( *phIvasDec )->apaExecBuffer != NULL ) { free( ( *phIvasDec )->apaExecBuffer ); @@ -1287,7 +1287,7 @@ ivas_error IVAS_DEC_GetSamplesDecoder( st_ivas = hIvasDec->st_ivas; #ifdef LIB_DEC_REVISION -#ifdef REMOVE_APA_BUFFER2 +#ifdef REMOVE_APA_BUFFER isInitialized_voip = hIvasDec->hTimeScaler != NULL; #else isInitialized_voip = hIvasDec->apaExecBuffer != NULL; @@ -1394,21 +1394,11 @@ ivas_error IVAS_DEC_GetSamplesDecoder( return IVAS_ERR_UNKNOWN; } -#ifndef REMOVE_APA_BUFFER2 -#ifdef MY_DEBUG - set_f( hIvasDec->apaExecBuffer, 0, nTransportChannels * APA_BUF_PER_CHANNEL ); - -#endif -#endif #ifdef REMOVE_APA_BUFFER /* move decoded audio buffers st_ivas->p_output_f[][] to a serial buffer hTcBuffer->tc_buffer[] */ ivas_syn_output_f( st_ivas->p_output_f, hIvasDec->nSamplesFrame, nTransportChannels, st_ivas->hTcBuffer->tc_buffer ); -#ifdef REMOVE_APA_BUFFER2 if ( apa_exec( hIvasDec->hTimeScaler, st_ivas->hTcBuffer->tc_buffer, hIvasDec->nSamplesFrame * nTransportChannels, (uint16_t) hIvasDec->tsm_max_scaling, st_ivas->hTcBuffer->tc_buffer, &nTimeScalerOutSamples ) != 0 ) -#else - if ( apa_exec( hIvasDec->hTimeScaler, st_ivas->hTcBuffer->tc_buffer, hIvasDec->nSamplesFrame * nTransportChannels, (uint16_t) hIvasDec->tsm_max_scaling, hIvasDec->apaExecBuffer, &nTimeScalerOutSamples ) != 0 ) -#endif #else #ifdef LIB_DEC_REVISION ivas_syn_output_f( hIvasDec->st_ivas->p_output_f, hIvasDec->nSamplesFrame, nTransportChannels, hIvasDec->apaExecBuffer ); @@ -1433,17 +1423,8 @@ ivas_error IVAS_DEC_GetSamplesDecoder( * Feed decoded transport channels samples to the renderer *-----------------------------------------------------------------*/ -#ifndef REMOVE_APA_BUFFER2 -#ifdef MY_DEBUG - for ( int16_t ch = 0; ch < min( st_ivas->hTcBuffer->nchan_transport_jbm, st_ivas->hTcBuffer->nchan_buffer_full ); ch++ ) - { - set_f( st_ivas->hTcBuffer->tc[ch], 0, hIvasDec->nSamplesFrame + hIvasDec->nSamplesFrame / 2 ); - } - -#endif -#endif #ifdef LIB_DEC_REVISION -#ifdef REMOVE_APA_BUFFER2 +#ifdef REMOVE_APA_BUFFER ivas_jbm_dec_feed_tc_to_renderer( st_ivas, nSamplesTcsScaled, &nResidualSamples, st_ivas->hTcBuffer->tc_buffer ); #else ivas_jbm_dec_feed_tc_to_renderer( st_ivas, nSamplesTcsScaled, &nResidualSamples, hIvasDec->apaExecBuffer ); @@ -1455,12 +1436,6 @@ ivas_error IVAS_DEC_GetSamplesDecoder( } #endif -#ifndef REMOVE_APA_BUFFER2 -#ifdef MY_DEBUG - set_f( hIvasDec->apaExecBuffer, 0, nTransportChannels * APA_BUF_PER_CHANNEL ); - -#endif -#endif if ( hIvasDec->st_ivas->hDecoderConfig->Opt_tsm ) { /* feed residual samples to TSM for the next call */ @@ -5092,7 +5067,9 @@ static ivas_error IVAS_DEC_VoIP_reconfigure( const uint16_t l_ts ) #endif { +#ifndef REMOVE_APA_BUFFER int16_t apa_buffer_size; +#endif #ifdef LIB_DEC_REVISION uint16_t l_ts; @@ -5115,10 +5092,12 @@ static ivas_error IVAS_DEC_VoIP_reconfigure( float startQuality; startQuality = hIvasDec->tsm_quality; -#ifdef JBM_MEMORY_OPTaa - apa_buffer_size = MAX_JBM_L_FRAME48k; +#ifndef REMOVE_APA_BUFFER +#ifdef JBM_MEMORY_OPT + apa_buffer_size = ( NS2SA( hIvasDec->st_ivas->hDecoderConfig->output_Fs, MAX_JBM_L_FRAME_NS ) ); #else - apa_buffer_size = APA_BUF_PER_CHANNEL; + apa_buffer_size = APA_BUF_PER_CHANNEL; +#endif #endif /* get current renderer type*/ @@ -5166,7 +5145,7 @@ static ivas_error IVAS_DEC_VoIP_reconfigure( } } -#ifndef REMOVE_APA_BUFFER2 +#ifndef REMOVE_APA_BUFFER if ( ( hIvasDec->apaExecBuffer = malloc( sizeof( float ) * apa_buffer_size * nTransportChannels ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate VoIP handle" ); @@ -5189,10 +5168,10 @@ static ivas_error IVAS_DEC_VoIP_reconfigure( return IVAS_ERR_INIT_ERROR; } -#ifndef REMOVE_APA_BUFFER2 +#ifndef REMOVE_APA_BUFFER /* realloc apa_exe_buffer */ -#ifdef JBM_MEMORY_OPTaa - apa_buffer_size = MAX_JBM_L_FRAME48k; +#ifdef JBM_MEMORY_OPT + apa_buffer_size = ( NS2SA( st_ivas->hDecoderConfig->output_Fs, MAX_JBM_L_FRAME_NS ) ); #else apa_buffer_size = APA_BUF_PER_CHANNEL; #endif -- GitLab From 65a892484412c13e52c72bff3f7d51718422fd07 Mon Sep 17 00:00:00 2001 From: vaclav Date: Fri, 18 Apr 2025 18:55:38 +0200 Subject: [PATCH 11/29] cleaning --- lib_com/ivas_prot.h | 5 +- lib_dec/ivas_jbm_dec.c | 105 +++++++++++++++++++++++++++++++---------- lib_dec/lib_dec.c | 3 +- 3 files changed, 87 insertions(+), 26 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 4a65ee74a9..7f373b9745 100755 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -839,8 +839,11 @@ ivas_error ivas_jbm_dec_flush_renderer( void ivas_jbm_dec_feed_tc_to_renderer( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const int16_t nSamplesForRendering, /* i : number of TC samples available for rendering */ - int16_t *nSamplesResidual, /* o : number of samples not fitting into the renderer grid and buffer for the next call*/ + int16_t *nSamplesResidual /* o : number of samples not fitting into the renderer grid and buffer for the next call*/ +#ifndef REMOVE_APA_BUFFER + , float *data /* i/o: time-scaled transport channels */ +#endif ); void ivas_dec_prepare_renderer( diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index a5a1c16a0e..7dea074a50 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -50,8 +50,9 @@ * Local function prototypes *-----------------------------------------------------------------------*/ +#ifndef REMOVE_APA_BUFFER static void ivas_jbm_dec_copy_tc( Decoder_Struct *st_ivas, const int16_t nSamplesForRendering, int16_t *nSamplesResidual, float *data, float *tc_digest_f[] ); - +#endif static void ivas_jbm_dec_tc_buffer_playout( Decoder_Struct *st_ivas, const uint16_t nSamplesAsked, uint16_t *nSamplesRendered, float *output[] ); static void ivas_jbm_dec_copy_masa_meta_to_buffer( Decoder_Struct *st_ivas ); @@ -791,25 +792,17 @@ ivas_error ivas_jbm_dec_tc( void ivas_jbm_dec_feed_tc_to_renderer( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const int16_t nSamplesForRendering, /* i : number of TC samples available for rendering */ - int16_t *nSamplesResidual, /* o : number of samples not fitting into the renderer grid and buffer for the next call*/ - float *data /* i : time-scaled transport channels */ + int16_t *nSamplesResidual /* o : number of samples not fitting into the renderer grid and buffer for the next call*/ +#ifndef REMOVE_APA_BUFFER + , + float *data /* i : time-scaled transport channels */ +#endif ) { -#ifdef REMOVE_APA_BUFFER - float apa_buff[12 * MAX_JBM_L_FRAME48k]; -#endif float data_f[MAX_CLDFB_DIGEST_CHANNELS][MAX_JBM_L_FRAME48k]; /* 'float' buffer for transport channels that will be directly converted with the CLDFB */ float *p_data_f[MAX_CLDFB_DIGEST_CHANNELS]; int16_t n, n_render_timeslots; -#ifdef REMOVE_APA_BUFFER - int16_t n_samp_full = ( NS2SA( st_ivas->hDecoderConfig->output_Fs, MAX_JBM_L_FRAME_NS ) ); - // mvr2r( data, apa_buff, min( st_ivas->hTcBuffer->nchan_transport_jbm, st_ivas->hTcBuffer->nchan_buffer_full ) * n_samp_full ); - mvr2r( data, apa_buff, st_ivas->hTcBuffer->nchan_transport_jbm * n_samp_full ); - // set_zero( data, st_ivas->hTcBuffer->nchan_transport_jbm * n_samp_full ); - data = apa_buff; - -#endif push_wmops( "ivas_jbm_dec_feed_tc_to_renderer" ); for ( n = 0; n < MAX_CLDFB_DIGEST_CHANNELS; n++ ) { @@ -826,7 +819,75 @@ void ivas_jbm_dec_feed_tc_to_renderer( if ( st_ivas->hDecoderConfig->Opt_tsm ) { +#ifdef REMOVE_APA_BUFFER + int16_t n_samples_still_available, ch, m; + int16_t n_ch_full_copy, n_ch_res_copy, n_ch_cldfb; + DECODER_TC_BUFFER_HANDLE hTcBuffer; +#ifdef REMOVE_APA_BUFFER + float data[MAX_TRANSPORT_CHANNELS * MAX_JBM_L_FRAME48k]; + int16_t n_samp_full = ( NS2SA( st_ivas->hDecoderConfig->output_Fs, MAX_JBM_L_FRAME_NS ) ); + mvr2r( st_ivas->hTcBuffer->tc_buffer, data, st_ivas->hTcBuffer->nchan_transport_jbm * n_samp_full ); + +#endif + hTcBuffer = st_ivas->hTcBuffer; + n_ch_cldfb = hTcBuffer->nchan_transport_jbm - hTcBuffer->nchan_buffer_full; + + for ( n = 0; n < n_ch_cldfb; n++ ) + { + p_data_f[n] = &data_f[n][0]; + } + + n_samples_still_available = hTcBuffer->n_samples_buffered - hTcBuffer->n_samples_rendered; + hTcBuffer->n_samples_buffered = n_samples_still_available + nSamplesForRendering + hTcBuffer->n_samples_discard; + hTcBuffer->n_samples_available = hTcBuffer->n_samples_granularity * ( hTcBuffer->n_samples_buffered / hTcBuffer->n_samples_granularity ); + *nSamplesResidual = hTcBuffer->n_samples_buffered - hTcBuffer->n_samples_available; + n_ch_full_copy = min( hTcBuffer->nchan_transport_jbm, hTcBuffer->nchan_buffer_full ); + n_ch_res_copy = hTcBuffer->nchan_transport_jbm - hTcBuffer->nchan_buffer_full; + + for ( ch = 0; ch < n_ch_full_copy; ch++ ) + { + set_zero( hTcBuffer->tc[ch], hTcBuffer->n_samples_discard ); +#ifdef OPT_TC + mvr2r( st_ivas->hTcBuffer->tc_buffer_old[ch], st_ivas->hTcBuffer->tc[ch] + st_ivas->hTcBuffer->n_samples_discard, n_samples_still_available ); +#else + mvr2r( hTcBuffer->tc[ch] + hTcBuffer->n_samples_rendered, hTcBuffer->tc[ch] + hTcBuffer->n_samples_discard, n_samples_still_available ); +#endif + for ( m = 0; m < nSamplesForRendering; m++ ) + { + hTcBuffer->tc[ch][n_samples_still_available + hTcBuffer->n_samples_discard + m] = data[m * hTcBuffer->nchan_transport_jbm + ch]; + } +#ifdef OPT_TC + // mvr2r( p_data_f[ch] + hTcBuffer->n_samples_available, hTcBuffer->tc_buffer_old[ch], *nSamplesResidual ); +#endif + } + + if ( n_ch_res_copy > 0 ) + { + for ( ; ch < hTcBuffer->nchan_transport_jbm; ch++ ) + { +#ifdef OPT_TC + mvr2r( st_ivas->hTcBuffer->tc_buffer_old[ch], p_data_f[ch], n_samples_still_available ); +#else + mvr2r( hTcBuffer->tc[ch], p_data_f[ch], n_samples_still_available ); +#endif + for ( m = 0; m < nSamplesForRendering; m++ ) + { + p_data_f[ch][n_samples_still_available + m] = data[m * hTcBuffer->nchan_transport_jbm + ch]; + } +#ifdef OPT_TC + mvr2r( p_data_f[ch] + hTcBuffer->n_samples_available, hTcBuffer->tc_buffer_old[ch], *nSamplesResidual ); +#else + mvr2r( p_data_f[ch] + hTcBuffer->n_samples_available, hTcBuffer->tc[ch], *nSamplesResidual ); +#endif + } + } + + + hTcBuffer->n_samples_rendered = 0; + hTcBuffer->subframes_rendered = 0; +#else ivas_jbm_dec_copy_tc( st_ivas, nSamplesForRendering, nSamplesResidual, data, p_data_f ); +#endif } else { @@ -1438,8 +1499,9 @@ ivas_error ivas_jbm_dec_flush_renderer( /* render available full slots (with new lower granularity) */ #ifdef FIX_OSBA_BR_SW_FLUSH for ( ch_idx = 0; ch_idx < max( hTcBuffer->nchan_transport_jbm, hTcBuffer->nchan_buffer_full ); ch_idx++ ) + // for ( ch_idx = 0; ch_idx < hTcBuffer->nchan_transport_internal; ch_idx++ ) // VE: TBV #else - for ( ch_idx = 0; ch_idx < min( hTcBuffer->nchan_transport_jbm, hTcBuffer->nchan_buffer_full ); ch_idx++ ) + for ( ch_idx = 0; ch_idx < hTcBuffer->nchan_transport_jbm; ch_idx++ ) #endif { mvr2r( hTcBuffer->tc_buffer_old[ch_idx], hTcBuffer->tc[ch_idx], n_samples_to_render ); @@ -1821,7 +1883,7 @@ void ivas_jbm_dec_get_md_map( } /* changed part (first segment), interpolate index to parameters - (we do not want to interpolate and smooth acutal direction/diffuseness values even more) */ + (we do not want to interpolate and smooth acutal direction/diffuseness values even more) */ if ( src_idx >= 0 ) { dec = ( (float) ( src_idx + 1 ) ) / ( (float) jbm_segment_len ); @@ -2052,7 +2114,7 @@ int16_t ivas_jbm_dec_get_num_tc_channels( return num_tc; } - +#ifndef REMOVE_APA_BUFFER /*--------------------------------------------------------------------------* * ivas_jbm_dec_copy_tc() * @@ -2122,7 +2184,7 @@ static void ivas_jbm_dec_copy_tc( return; } - +#endif /*--------------------------------------------------------------------------* * ivas_jbm_dec_get_render_granularity() @@ -2234,18 +2296,13 @@ static ivas_error ivas_jbm_dec_tc_buffer_allocate( hTcBuffer->tc[ch_idx] = &hTcBuffer->tc_buffer[offset]; offset += n_samp_full; } - for ( ; ch_idx < hTcBuffer->nchan_transport_internal; ch_idx++ ) - { - hTcBuffer->tc[ch_idx] = &hTcBuffer->tc_buffer[offset]; - offset += n_samp_residual; - } for ( ; ch_idx < MAX_TRANSPORT_CHANNELS + MAX_NUM_OBJECTS; ch_idx++ ) { hTcBuffer->tc[ch_idx] = NULL; } /* memory buffer for TC audio samples not rendered in the previous frame */ - for ( ch_idx = 0; ch_idx < max( hTcBuffer->nchan_transport_jbm, hTcBuffer->nchan_buffer_full ); ch_idx++ ) + for ( ch_idx = 0; ch_idx < hTcBuffer->nchan_transport_internal; ch_idx++ ) { if ( ( hTcBuffer->tc_buffer_old[ch_idx] = (float *) malloc( n_samp_residual * sizeof( float ) ) ) == NULL ) { diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index a3c7ef6513..9a1edecf66 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -1425,7 +1425,7 @@ ivas_error IVAS_DEC_GetSamplesDecoder( #ifdef LIB_DEC_REVISION #ifdef REMOVE_APA_BUFFER - ivas_jbm_dec_feed_tc_to_renderer( st_ivas, nSamplesTcsScaled, &nResidualSamples, st_ivas->hTcBuffer->tc_buffer ); + ivas_jbm_dec_feed_tc_to_renderer( st_ivas, nSamplesTcsScaled, &nResidualSamples ); #else ivas_jbm_dec_feed_tc_to_renderer( st_ivas, nSamplesTcsScaled, &nResidualSamples, hIvasDec->apaExecBuffer ); #endif @@ -2098,6 +2098,7 @@ ivas_error IVAS_DEC_GetSamplesRenderer( if ( hTcBuffer->n_samples_buffered - hTcBuffer->n_samples_rendered < hTcBuffer->n_samples_granularity ) { for ( ch = 0; ch < min( hTcBuffer->nchan_transport_jbm, hTcBuffer->nchan_buffer_full ); ch++ ) + //for ( ch = 0; ch < hTcBuffer->nchan_transport_internal; ch++ ) { mvr2r( hTcBuffer->tc[ch] + hTcBuffer->n_samples_rendered, hTcBuffer->tc_buffer_old[ch], hTcBuffer->n_samples_buffered - hTcBuffer->n_samples_rendered ); } -- GitLab From 07c8f8e7ee7342e1ab3fa0e81e9083ca8f4b59a2 Mon Sep 17 00:00:00 2001 From: vaclav Date: Fri, 18 Apr 2025 19:46:25 +0200 Subject: [PATCH 12/29] update hTcBuffer->tc_buffer_old[] only in ivas_jbm_dec_feed_tc_to_renderer() --- lib_dec/ivas_jbm_dec.c | 31 ++++++++++--------------------- lib_dec/lib_dec.c | 22 ---------------------- 2 files changed, 10 insertions(+), 43 deletions(-) diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 7dea074a50..c8b26811a9 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -847,42 +847,27 @@ void ivas_jbm_dec_feed_tc_to_renderer( for ( ch = 0; ch < n_ch_full_copy; ch++ ) { set_zero( hTcBuffer->tc[ch], hTcBuffer->n_samples_discard ); -#ifdef OPT_TC mvr2r( st_ivas->hTcBuffer->tc_buffer_old[ch], st_ivas->hTcBuffer->tc[ch] + st_ivas->hTcBuffer->n_samples_discard, n_samples_still_available ); -#else - mvr2r( hTcBuffer->tc[ch] + hTcBuffer->n_samples_rendered, hTcBuffer->tc[ch] + hTcBuffer->n_samples_discard, n_samples_still_available ); -#endif for ( m = 0; m < nSamplesForRendering; m++ ) { hTcBuffer->tc[ch][n_samples_still_available + hTcBuffer->n_samples_discard + m] = data[m * hTcBuffer->nchan_transport_jbm + ch]; } -#ifdef OPT_TC - // mvr2r( p_data_f[ch] + hTcBuffer->n_samples_available, hTcBuffer->tc_buffer_old[ch], *nSamplesResidual ); -#endif + mvr2r( hTcBuffer->tc[ch] + hTcBuffer->n_samples_available, hTcBuffer->tc_buffer_old[ch], *nSamplesResidual ); } if ( n_ch_res_copy > 0 ) { for ( ; ch < hTcBuffer->nchan_transport_jbm; ch++ ) { -#ifdef OPT_TC mvr2r( st_ivas->hTcBuffer->tc_buffer_old[ch], p_data_f[ch], n_samples_still_available ); -#else - mvr2r( hTcBuffer->tc[ch], p_data_f[ch], n_samples_still_available ); -#endif for ( m = 0; m < nSamplesForRendering; m++ ) { p_data_f[ch][n_samples_still_available + m] = data[m * hTcBuffer->nchan_transport_jbm + ch]; } -#ifdef OPT_TC mvr2r( p_data_f[ch] + hTcBuffer->n_samples_available, hTcBuffer->tc_buffer_old[ch], *nSamplesResidual ); -#else - mvr2r( p_data_f[ch] + hTcBuffer->n_samples_available, hTcBuffer->tc[ch], *nSamplesResidual ); -#endif } } - hTcBuffer->n_samples_rendered = 0; hTcBuffer->subframes_rendered = 0; #else @@ -893,6 +878,7 @@ void ivas_jbm_dec_feed_tc_to_renderer( { *nSamplesResidual = 0; } + n_render_timeslots = st_ivas->hTcBuffer->n_samples_available / st_ivas->hTcBuffer->n_samples_granularity; if ( st_ivas->ivas_format == ISM_FORMAT ) @@ -2266,11 +2252,7 @@ static ivas_error ivas_jbm_dec_tc_buffer_allocate( if ( Opt_tsm ) { -#ifdef REMOVE_APA_BUFFER n_samp_full = ( NS2SA( output_Fs, MAX_JBM_L_FRAME_NS ) ); -#else - n_samp_full = ( NS2SA( output_Fs, MAX_JBM_L_FRAME_NS ) + hTcBuffer->n_samples_granularity - 1 ); -#endif n_samp_residual = hTcBuffer->n_samples_granularity - 1; } else @@ -2291,7 +2273,7 @@ static ivas_error ivas_jbm_dec_tc_buffer_allocate( set_zero( hTcBuffer->tc_buffer, nsamp_to_allocate ); offset = 0; - for ( ch_idx = 0; ch_idx < 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[ch_idx] = &hTcBuffer->tc_buffer[offset]; offset += n_samp_full; @@ -2558,6 +2540,13 @@ ivas_error ivas_jbm_dec_tc_buffer_reconfigure( /* realloc buffers */ if ( hTcBuffer->tc_buffer != NULL ) { +#ifdef OPT_TC + for ( ch_idx = 0; ch_idx < MAX_TRANSPORT_CHANNELS + MAX_NUM_OBJECTS; ch_idx++ ) + { + hTcBuffer->tc[ch_idx] = NULL; + } + +#endif free( hTcBuffer->tc_buffer ); hTcBuffer->tc_buffer = NULL; #ifdef OPT_TC diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 9a1edecf66..9324260196 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -2087,28 +2087,6 @@ ivas_error IVAS_DEC_GetSamplesRenderer( { *needNewFrame = false; } -#endif -#ifdef OPT_TC - - if ( st_ivas->hDecoderConfig->Opt_tsm ) - { - int16_t ch; - DECODER_TC_BUFFER_HANDLE hTcBuffer = st_ivas->hTcBuffer; - - if ( hTcBuffer->n_samples_buffered - hTcBuffer->n_samples_rendered < hTcBuffer->n_samples_granularity ) - { - for ( ch = 0; ch < min( hTcBuffer->nchan_transport_jbm, hTcBuffer->nchan_buffer_full ); ch++ ) - //for ( ch = 0; ch < hTcBuffer->nchan_transport_internal; ch++ ) - { - mvr2r( hTcBuffer->tc[ch] + hTcBuffer->n_samples_rendered, hTcBuffer->tc_buffer_old[ch], hTcBuffer->n_samples_buffered - hTcBuffer->n_samples_rendered ); - } - for ( ; ch < max( hTcBuffer->nchan_transport_jbm, hTcBuffer->nchan_buffer_full ); ch++ ) - { - /* note: residual channels were saved already in ivas_jbm_dec_copy_tc() */ - // mvr2r( hTcBuffer->tc[ch], hTcBuffer->tc_buffer_old[ch], hTcBuffer->n_samples_buffered - hTcBuffer->n_samples_rendered ); - } - } - } #endif } -- GitLab From ef2016879ab5ab58b1e38cdd01801c82aed22030 Mon Sep 17 00:00:00 2001 From: vaclav Date: Fri, 18 Apr 2025 20:13:33 +0200 Subject: [PATCH 13/29] - reduce size of hTcBuffer->tc[] - introduce ivas_jbm_dec_tc_audio_deallocate() --- lib_dec/ivas_jbm_dec.c | 136 ++++++++++++++++++---------------------- lib_dec/ivas_stat_dec.h | 23 ++++--- 2 files changed, 74 insertions(+), 85 deletions(-) diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index c8b26811a9..9e42839b45 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -2236,12 +2236,12 @@ int16_t ivas_jbm_dec_get_render_granularity( #ifdef REMOVE_APA_BUFFER /*--------------------------------------------------------------------------* - * ivas_jbm_dec_tc_buffer_allocate() + * ivas_jbm_dec_tc_audio_allocate() * - * open and initialize JBM transport channel buffer + * allocate and initialize TC audio buffer *--------------------------------------------------------------------------*/ -static ivas_error ivas_jbm_dec_tc_buffer_allocate( +static ivas_error ivas_jbm_dec_tc_audio_allocate( DECODER_TC_BUFFER_HANDLE hTcBuffer, /* i/o: JBM TSM buffer handle */ const int32_t output_Fs, /* i : output sampling rate */ const int16_t Opt_tsm /* i : TSM option flag */ @@ -2278,7 +2278,7 @@ static ivas_error ivas_jbm_dec_tc_buffer_allocate( hTcBuffer->tc[ch_idx] = &hTcBuffer->tc_buffer[offset]; offset += n_samp_full; } - for ( ; ch_idx < MAX_TRANSPORT_CHANNELS + MAX_NUM_OBJECTS; ch_idx++ ) + for ( ; ch_idx < MAX_TRANSPORT_CHANNELS; ch_idx++ ) { hTcBuffer->tc[ch_idx] = NULL; } @@ -2301,7 +2301,7 @@ static ivas_error ivas_jbm_dec_tc_buffer_allocate( { hTcBuffer->tc_buffer = NULL; - for ( ch_idx = 0; ch_idx < MAX_TRANSPORT_CHANNELS + MAX_NUM_OBJECTS; ch_idx++ ) // VE: number of channels could be lowered?? + for ( ch_idx = 0; ch_idx < MAX_TRANSPORT_CHANNELS; ch_idx++ ) { hTcBuffer->tc[ch_idx] = NULL; } @@ -2310,6 +2310,44 @@ static ivas_error ivas_jbm_dec_tc_buffer_allocate( return IVAS_ERR_OK; } + +/*--------------------------------------------------------------------------* + * ivas_jbm_dec_tc_audio_deallocate() + * + * deallocate TC audio buffer + *--------------------------------------------------------------------------*/ + +static void ivas_jbm_dec_tc_audio_deallocate( + DECODER_TC_BUFFER_HANDLE hTcBuffer /* i/o: JBM TSM buffer handle */ +) +{ + int16_t ch_idx; + + if ( hTcBuffer != NULL ) + { + if ( hTcBuffer->tc_buffer != NULL ) + { + for ( ch_idx = 0; ch_idx < MAX_TRANSPORT_CHANNELS; ch_idx++ ) + { + hTcBuffer->tc[ch_idx] = NULL; + } + + free( hTcBuffer->tc_buffer ); + hTcBuffer->tc_buffer = NULL; + } + + for ( ch_idx = 0; ch_idx < MAX_TRANSPORT_CHANNELS; ch_idx++ ) + { + if ( hTcBuffer->tc_buffer_old[ch_idx] != NULL ) + { + free( hTcBuffer->tc_buffer_old[ch_idx] ); + hTcBuffer->tc_buffer_old[ch_idx] = NULL; + } + } + } + + return; +} #endif /*--------------------------------------------------------------------------* @@ -2369,7 +2407,7 @@ ivas_error ivas_jbm_dec_tc_buffer_open( set_s( hTcBuffer->subframe_nbslots, nMaxSlotsPerSubframe, MAX_PARAM_SPATIAL_SUBFRAMES ); #ifdef REMOVE_APA_BUFFER - if ( ( error = ivas_jbm_dec_tc_buffer_allocate( hTcBuffer, st_ivas->hDecoderConfig->output_Fs, st_ivas->hDecoderConfig->Opt_tsm ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_jbm_dec_tc_audio_allocate( hTcBuffer, st_ivas->hDecoderConfig->output_Fs, st_ivas->hDecoderConfig->Opt_tsm ) ) != IVAS_ERR_OK ) { return error; } @@ -2379,11 +2417,7 @@ ivas_error ivas_jbm_dec_tc_buffer_open( int32_t offset; if ( st_ivas->hDecoderConfig->Opt_tsm ) { -#ifdef REMOVE_APA_BUFFER - n_samp_full = ( NS2SA( st_ivas->hDecoderConfig->output_Fs, MAX_JBM_L_FRAME_NS ) ); -#else n_samp_full = ( NS2SA( st_ivas->hDecoderConfig->output_Fs, MAX_JBM_L_FRAME_NS ) + hTcBuffer->n_samples_granularity - 1 ); -#endif n_samp_residual = hTcBuffer->n_samples_granularity - 1; } else @@ -2392,12 +2426,8 @@ ivas_error ivas_jbm_dec_tc_buffer_open( n_samp_residual = 0; } -#ifdef OPT_TC - nsamp_to_allocate = max( hTcBuffer->nchan_transport_jbm, hTcBuffer->nchan_buffer_full ) * n_samp_full; -#else nsamp_to_allocate = hTcBuffer->nchan_buffer_full * n_samp_full; nsamp_to_allocate += nchan_residual * n_samp_residual; -#endif if ( nsamp_to_allocate == 0 ) { @@ -2434,22 +2464,6 @@ ivas_error ivas_jbm_dec_tc_buffer_open( { hTcBuffer->tc[ch_idx] = NULL; } -#ifdef OPT_TC - - /* memory buffer for TC audio samples not rendered in the previous frame */ - for ( ch_idx = 0; ch_idx < max( hTcBuffer->nchan_transport_jbm, hTcBuffer->nchan_buffer_full ); ch_idx++ ) - { - if ( ( hTcBuffer->tc_buffer_old[ch_idx] = (float *) malloc( n_samp_residual * sizeof( float ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for JBM TC Buffer\n" ) ); - } - set_zero( hTcBuffer->tc_buffer_old[ch_idx], n_samp_residual ); - } - for ( ; ch_idx < MAX_TRANSPORT_CHANNELS; ch_idx++ ) - { - hTcBuffer->tc_buffer_old[ch_idx] = NULL; - } -#endif } else { @@ -2481,7 +2495,6 @@ ivas_error ivas_jbm_dec_tc_buffer_reconfigure( ) { #ifdef REMOVE_APA_BUFFER - int16_t ch_idx; ivas_error error; #else int16_t nsamp_to_allocate, n_samp_full, n_samp_residual, offset, nchan_residual; @@ -2537,44 +2550,27 @@ 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 ); #endif - /* realloc buffers */ - if ( hTcBuffer->tc_buffer != NULL ) - { -#ifdef OPT_TC - for ( ch_idx = 0; ch_idx < MAX_TRANSPORT_CHANNELS + MAX_NUM_OBJECTS; ch_idx++ ) - { - hTcBuffer->tc[ch_idx] = NULL; - } -#endif - free( hTcBuffer->tc_buffer ); - hTcBuffer->tc_buffer = NULL; -#ifdef OPT_TC +#ifdef REMOVE_APA_BUFFER + /* reallocate TC audio buffers */ - for ( ch_idx = 0; ch_idx < MAX_TRANSPORT_CHANNELS; ch_idx++ ) - { - if ( hTcBuffer->tc_buffer_old[ch_idx] != NULL ) - { - free( hTcBuffer->tc_buffer_old[ch_idx] ); - hTcBuffer->tc_buffer_old[ch_idx] = NULL; - } - } -#endif - } + ivas_jbm_dec_tc_audio_deallocate( hTcBuffer ); -#ifdef REMOVE_APA_BUFFER - if ( ( error = ivas_jbm_dec_tc_buffer_allocate( hTcBuffer, st_ivas->hDecoderConfig->output_Fs, st_ivas->hDecoderConfig->Opt_tsm ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_jbm_dec_tc_audio_allocate( hTcBuffer, st_ivas->hDecoderConfig->output_Fs, st_ivas->hDecoderConfig->Opt_tsm ) ) != IVAS_ERR_OK ) { return error; } #else + /* realloc buffers */ + if ( hTcBuffer->tc_buffer != NULL ) + { + free( hTcBuffer->tc_buffer ); + hTcBuffer->tc_buffer = NULL; + } + if ( st_ivas->hDecoderConfig->Opt_tsm ) { -#ifdef REMOVE_APA_BUFFER - n_samp_full = ( NS2SA( st_ivas->hDecoderConfig->output_Fs, MAX_JBM_L_FRAME_NS ) ); -#else n_samp_full = ( NS2SA( st_ivas->hDecoderConfig->output_Fs, MAX_JBM_L_FRAME_NS ) + hTcBuffer->n_samples_granularity - 1 ); -#endif n_samp_residual = hTcBuffer->n_samples_granularity - 1; } else @@ -2583,12 +2579,7 @@ ivas_error ivas_jbm_dec_tc_buffer_reconfigure( n_samp_residual = 0; } -#ifdef OPT_TC - nsamp_to_allocate = max( hTcBuffer->nchan_transport_jbm, hTcBuffer->nchan_buffer_full ) * n_samp_full; -#else nsamp_to_allocate = hTcBuffer->nchan_buffer_full * n_samp_full; - nsamp_to_allocate += nchan_residual * n_samp_residual; -#endif if ( nsamp_to_allocate == 0 ) { @@ -2704,10 +2695,15 @@ void ivas_jbm_dec_tc_buffer_close( DECODER_TC_BUFFER_HANDLE *phTcBuffer /* i/o: TC buffer handle */ ) { +#ifndef REMOVE_APA_BUFFER int16_t i; +#endif if ( *phTcBuffer != NULL ) { +#ifdef REMOVE_APA_BUFFER + ivas_jbm_dec_tc_audio_deallocate( *phTcBuffer ); +#else for ( i = 0; i < MAX_TRANSPORT_CHANNELS + MAX_NUM_OBJECTS; i++ ) { ( *phTcBuffer )->tc[i] = NULL; @@ -2718,18 +2714,8 @@ void ivas_jbm_dec_tc_buffer_close( free( ( *phTcBuffer )->tc_buffer ); ( *phTcBuffer )->tc_buffer = NULL; } - -#ifdef OPT_TC - for ( i = 0; i < MAX_TRANSPORT_CHANNELS; i++ ) - { - if ( ( *phTcBuffer )->tc_buffer_old[i] != NULL ) - { - free( ( *phTcBuffer )->tc_buffer_old[i] ); - ( *phTcBuffer )->tc_buffer_old[i] = NULL; - } - } - #endif + free( *phTcBuffer ); *phTcBuffer = NULL; } diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index ed9e90e03b..7e1beaf7d1 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -946,18 +946,21 @@ typedef struct decoder_tc_buffer_structure { #ifdef OPT_TC float *tc_buffer_old[MAX_TRANSPORT_CHANNELS]; /* TC audio samples not rendered in the previous frame */ - float *tc_residual_old[MAX_INTERN_CHANNELS]; /* residual channels audio samples not rendered in the previous frame */ #endif - float *tc_buffer; /* the buffer itself */ + float *tc_buffer; /* the buffer itself */ +#ifdef OPT_TC + float *tc[MAX_TRANSPORT_CHANNELS]; /* pointers into the buffer to the beginning of each tc */ +#else float *tc[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS]; /* pointers into the buffer to the beginning of each tc */ // VE2SB: TBV - TC_BUFFER_MODE tc_buffer_mode; /* mode of the buffer (no buffering, render buffering, out buffering) */ - int16_t nchan_transport_jbm; /* number of TCs after TC decoding */ - int16_t nchan_transport_internal; /* total number of TC buffer channels, can include e.g. TD decorr data */ - int16_t nchan_buffer_full; /* number of channels to be fully buffered */ - int16_t n_samples_available; /* samples still available for rendering in the current frame */ - int16_t n_samples_buffered; /* full number of samples in the buffer (including spill to next frame) */ - int16_t n_samples_rendered; /* samples already rendered in the current frame */ - int16_t n_samples_granularity; /* render granularity */ +#endif + TC_BUFFER_MODE tc_buffer_mode; /* mode of the buffer (no buffering, render buffering, out buffering) */ + int16_t nchan_transport_jbm; /* number of TCs after TC decoding */ + int16_t nchan_transport_internal; /* total number of TC buffer channels, can include e.g. TD decorr data */ + int16_t nchan_buffer_full; /* number of channels to be fully buffered */ + int16_t n_samples_available; /* samples still available for rendering in the current frame */ + int16_t n_samples_buffered; /* full number of samples in the buffer (including spill to next frame) */ + int16_t n_samples_rendered; /* samples already rendered in the current frame */ + int16_t n_samples_granularity; /* render granularity */ int16_t n_samples_flushed; int16_t subframe_nbslots[MAX_JBM_SUBFRAMES_5MS]; int16_t nb_subframes; -- GitLab From fb1a4375df2a1b99d2190e58842f4cd3ce499575 Mon Sep 17 00:00:00 2001 From: vaclav Date: Fri, 18 Apr 2025 20:21:08 +0200 Subject: [PATCH 14/29] remove OPT_TC and MY_DEBUG --- lib_com/options.h | 3 --- lib_dec/ivas_jbm_dec.c | 30 +----------------------------- lib_dec/ivas_stat_dec.h | 4 ++-- lib_dec/lib_dec.c | 13 ------------- 4 files changed, 3 insertions(+), 47 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index dda8580b92..005055fe01 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -163,11 +163,8 @@ #define LIB_DEC_REVISION /* VA: cleaning and simplification of lib_dec.c */ #if 1 #define JBM_MEMORY_OPT /* VA: issue 916: optimization of RAM in the JBM decoder */ -#define OPT_TC // separate heap memory from hTcBuffer->tcBuffer[] //#define FIX_OSBA_BR_SW_FLUSH // this is non-BE bugfix #define REMOVE_APA_BUFFER // remove hIvasDec->apaExecBuffer[] - -#define MY_DEBUG #endif /* #################### End BE switches ################################## */ diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 9e42839b45..2e142ddb76 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -1481,7 +1481,7 @@ ivas_error ivas_jbm_dec_flush_renderer( { int16_t ch_idx; -#ifdef OPT_TC +#ifdef REMOVE_APA_BUFFER /* render available full slots (with new lower granularity) */ #ifdef FIX_OSBA_BR_SW_FLUSH for ( ch_idx = 0; ch_idx < max( hTcBuffer->nchan_transport_jbm, hTcBuffer->nchan_buffer_full ); ch_idx++ ) @@ -2133,11 +2133,7 @@ static void ivas_jbm_dec_copy_tc( for ( ch = 0; ch < n_ch_full_copy; ch++ ) { set_zero( hTcBuffer->tc[ch], hTcBuffer->n_samples_discard ); -#ifdef OPT_TC - mvr2r( st_ivas->hTcBuffer->tc_buffer_old[ch], st_ivas->hTcBuffer->tc[ch] + st_ivas->hTcBuffer->n_samples_discard, n_samples_still_available ); -#else mvr2r( hTcBuffer->tc[ch] + hTcBuffer->n_samples_rendered, hTcBuffer->tc[ch] + hTcBuffer->n_samples_discard, n_samples_still_available ); -#endif for ( m = 0; m < nSamplesForRendering; m++ ) { hTcBuffer->tc[ch][n_samples_still_available + hTcBuffer->n_samples_discard + m] = data[m * st_ivas->hTcBuffer->nchan_transport_jbm + ch]; @@ -2148,20 +2144,12 @@ static void ivas_jbm_dec_copy_tc( { for ( ; ch < hTcBuffer->nchan_transport_jbm; ch++ ) { -#ifdef OPT_TC - mvr2r( st_ivas->hTcBuffer->tc_buffer_old[ch], tc_digest_f[ch], n_samples_still_available ); -#else mvr2r( hTcBuffer->tc[ch], tc_digest_f[ch], n_samples_still_available ); -#endif for ( m = 0; m < nSamplesForRendering; m++ ) { tc_digest_f[ch][n_samples_still_available + m] = data[m * st_ivas->hTcBuffer->nchan_transport_jbm + ch]; } -#ifdef OPT_TC - mvr2r( tc_digest_f[ch] + hTcBuffer->n_samples_available, hTcBuffer->tc_buffer_old[ch], *nSamplesResidual ); -#else mvr2r( tc_digest_f[ch] + hTcBuffer->n_samples_available, hTcBuffer->tc[ch], *nSamplesResidual ); -#endif } } @@ -2614,22 +2602,6 @@ ivas_error ivas_jbm_dec_tc_buffer_reconfigure( { hTcBuffer->tc[ch_idx] = NULL; } -#ifdef OPT_TC - - /* memory buffer for TC audio samples not rendered in the previous frame */ - for ( ch_idx = 0; ch_idx < max( hTcBuffer->nchan_transport_jbm, hTcBuffer->nchan_buffer_full ); ch_idx++ ) - { - if ( ( hTcBuffer->tc_buffer_old[ch_idx] = (float *) malloc( n_samp_residual * sizeof( float ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for JBM TC Buffer\n" ) ); - } - set_zero( hTcBuffer->tc_buffer_old[ch_idx], n_samp_residual ); - } - for ( ; ch_idx < MAX_TRANSPORT_CHANNELS; ch_idx++ ) - { - hTcBuffer->tc_buffer_old[ch_idx] = NULL; - } -#endif } else { diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index 7e1beaf7d1..930eb456f2 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -944,11 +944,11 @@ typedef struct ivas_masa_ism_data_structure typedef struct decoder_tc_buffer_structure { -#ifdef OPT_TC +#ifdef REMOVE_APA_BUFFER float *tc_buffer_old[MAX_TRANSPORT_CHANNELS]; /* TC audio samples not rendered in the previous frame */ #endif float *tc_buffer; /* the buffer itself */ -#ifdef OPT_TC +#ifdef REMOVE_APA_BUFFER float *tc[MAX_TRANSPORT_CHANNELS]; /* pointers into the buffer to the beginning of each tc */ #else float *tc[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS]; /* pointers into the buffer to the beginning of each tc */ // VE2SB: TBV diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 9324260196..e1b51814f3 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -1196,13 +1196,7 @@ ivas_error IVAS_DEC_ReadFormat( { return IVAS_ERR_UNEXPECTED_NULL_POINTER; } -#ifdef MY_DEBUG - for ( int16_t ch = 0; ch < min( hIvasDec->st_ivas->hTcBuffer->nchan_transport_jbm, hIvasDec->st_ivas->hTcBuffer->nchan_buffer_full ); ch++ ) - { - set_f( hIvasDec->st_ivas->hTcBuffer->tc[ch], 0, hIvasDec->nSamplesFrame + hIvasDec->nSamplesFrame / 2 ); - } -#endif /* when granularity goes down, render what still fits in the new granularity */ if ( tc_granularity_new < st_ivas->hTcBuffer->n_samples_granularity ) { @@ -1366,13 +1360,6 @@ ivas_error IVAS_DEC_GetSamplesDecoder( } #endif -#ifdef MY_DEBUG - for ( int16_t ch = 0; ch < min( hIvasDec->st_ivas->hTcBuffer->nchan_transport_jbm, hIvasDec->st_ivas->hTcBuffer->nchan_buffer_full ); ch++ ) - { - set_f( st_ivas->hTcBuffer->tc[ch], 0, hIvasDec->nSamplesFrame + hIvasDec->nSamplesFrame / 2 ); - } - -#endif /*-----------------------------------------------------------------* * JBM *-----------------------------------------------------------------*/ -- GitLab From 8d74dcff76ac4ff7b61939d72e2abd470cb79523 Mon Sep 17 00:00:00 2001 From: vaclav Date: Fri, 18 Apr 2025 20:30:05 +0200 Subject: [PATCH 15/29] fix build --- lib_dec/ivas_jbm_dec.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 624cf50651..3465178032 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -1869,7 +1869,7 @@ void ivas_jbm_dec_get_md_map( } /* changed part (first segment), interpolate index to parameters - (we do not want to interpolate and smooth acutal direction/diffuseness values even more) */ + (we do not want to interpolate and smooth acutal direction/diffuseness values even more) */ if ( src_idx >= 0 ) { dec = ( (float) ( src_idx + 1 ) ) / ( (float) jbm_segment_len ); @@ -2353,7 +2353,9 @@ ivas_error ivas_jbm_dec_tc_buffer_open( const int16_t n_samples_granularity /* i : granularity of the renderer/buffer */ ) { +#ifndef REMOVE_APA_BUFFER int16_t nsamp_to_allocate; +#endif DECODER_TC_BUFFER_HANDLE hTcBuffer; int16_t nMaxSlotsPerSubframe; #ifdef REMOVE_APA_BUFFER @@ -2388,7 +2390,9 @@ ivas_error ivas_jbm_dec_tc_buffer_open( hTcBuffer->n_samples_discard = 0; hTcBuffer->n_samples_flushed = 0; hTcBuffer->nb_subframes = MAX_PARAM_SPATIAL_SUBFRAMES; +#ifndef REMOVE_APA_BUFFER nsamp_to_allocate = 0; +#endif nMaxSlotsPerSubframe = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / ( FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES ) ) / hTcBuffer->n_samples_granularity; hTcBuffer->num_slots = nMaxSlotsPerSubframe * MAX_PARAM_SPATIAL_SUBFRAMES; set_s( hTcBuffer->subframe_nbslots, 0, MAX_JBM_SUBFRAMES_5MS ); @@ -2502,7 +2506,7 @@ ivas_error ivas_jbm_dec_tc_buffer_reconfigure( nMaxSlotsPerSubframeNew = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / ( FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES ) ) / n_samples_granularity; #ifdef DEBUGGING - int16_t nMaxSlotsPerSubframeOld = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / ( FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES ) ) / st_ivas->hTcBuffer->n_samples_granularity; + nMaxSlotsPerSubframeOld = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / ( FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES ) ) / st_ivas->hTcBuffer->n_samples_granularity; assert( hTcBuffer->subframe_nbslots[hTcBuffer->subframes_rendered - 1] == nMaxSlotsPerSubframeOld ); if ( n_samples_granularity < hTcBuffer->n_samples_granularity ) { @@ -2566,8 +2570,8 @@ ivas_error ivas_jbm_dec_tc_buffer_reconfigure( n_samp_full = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); n_samp_residual = 0; } - nsamp_to_allocate = hTcBuffer->nchan_buffer_full * n_samp_full; + nsamp_to_allocate += nchan_residual * n_samp_residual; if ( nsamp_to_allocate == 0 ) { -- GitLab From 5c933c90349443ffab2ceb54516adabf2bb181b4 Mon Sep 17 00:00:00 2001 From: vaclav Date: Fri, 18 Apr 2025 20:45:05 +0200 Subject: [PATCH 16/29] fix memory to NULL --- lib_dec/ivas_jbm_dec.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 3465178032..773d410687 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -2293,6 +2293,11 @@ static ivas_error ivas_jbm_dec_tc_audio_allocate( { hTcBuffer->tc[ch_idx] = NULL; } + + for ( ch_idx = 0; ch_idx < MAX_TRANSPORT_CHANNELS; ch_idx++ ) + { + hTcBuffer->tc_buffer_old[ch_idx] = NULL; + } } return IVAS_ERR_OK; -- GitLab From b1e3c82426cc07ff13ab9f2cccc4eb162e095b2a Mon Sep 17 00:00:00 2001 From: vaclav Date: Fri, 18 Apr 2025 21:27:51 +0200 Subject: [PATCH 17/29] fix init --- lib_dec/ivas_jbm_dec.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 773d410687..e2099edd3d 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -956,7 +956,11 @@ ivas_error ivas_jbm_dec_render( p_tc[n] = &p_output[n][st_ivas->hTcBuffer->n_samples_rendered]; } +#ifdef REMOVE_APA_BUFFER + for ( n = 0; n < MAX_TRANSPORT_CHANNELS; n++ ) +#else for ( n = 0; n < MAX_TRANSPORT_CHANNELS + MAX_NUM_OBJECTS; n++ ) +#endif { st_ivas->hTcBuffer->tc[n] = p_output[n]; } -- GitLab From a7e57fa6fb06403a6daf94af94c13b1a8e31486f Mon Sep 17 00:00:00 2001 From: vaclav Date: Fri, 18 Apr 2025 21:48:48 +0200 Subject: [PATCH 18/29] fix st_ivas->hTcBuffer->tc[] init --- lib_dec/ivas_jbm_dec.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index e2099edd3d..587194f3f8 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -811,7 +811,11 @@ void ivas_jbm_dec_feed_tc_to_renderer( if ( !st_ivas->hDecoderConfig->Opt_tsm ) { +#ifdef REMOVE_APA_BUFFER + for ( n = 0; n < max( st_ivas->hTcBuffer->nchan_transport_jbm, st_ivas->hTcBuffer->nchan_buffer_full ); n++ ) +#else for ( n = 0; n < ivas_get_nchan_buffers_dec( st_ivas, st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); n++ ) +#endif { st_ivas->hTcBuffer->tc[n] = st_ivas->p_output_f[n]; /* note: buffers needed in the TD decorellator */ } -- GitLab From 4dc42bc7fb1583cbcb2da1e114fa83e1344d3316 Mon Sep 17 00:00:00 2001 From: vaclav Date: Fri, 18 Apr 2025 22:42:12 +0200 Subject: [PATCH 19/29] fix max number of hTcBuffer->tc[] channels --- lib_dec/ivas_jbm_dec.c | 14 +++++++------- lib_dec/ivas_stat_dec.h | 4 ++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 587194f3f8..fcdf842ef8 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -961,7 +961,7 @@ ivas_error ivas_jbm_dec_render( } #ifdef REMOVE_APA_BUFFER - for ( n = 0; n < MAX_TRANSPORT_CHANNELS; n++ ) + for ( n = 0; n < MAX_INTERN_CHANNELS; n++ ) #else for ( n = 0; n < MAX_TRANSPORT_CHANNELS + MAX_NUM_OBJECTS; n++ ) #endif @@ -2274,7 +2274,7 @@ static ivas_error ivas_jbm_dec_tc_audio_allocate( hTcBuffer->tc[ch_idx] = &hTcBuffer->tc_buffer[offset]; offset += n_samp_full; } - for ( ; ch_idx < MAX_TRANSPORT_CHANNELS; ch_idx++ ) + for ( ; ch_idx < MAX_INTERN_CHANNELS; ch_idx++ ) { hTcBuffer->tc[ch_idx] = NULL; } @@ -2288,7 +2288,7 @@ static ivas_error ivas_jbm_dec_tc_audio_allocate( } set_zero( hTcBuffer->tc_buffer_old[ch_idx], n_samp_residual ); } - for ( ; ch_idx < MAX_TRANSPORT_CHANNELS; ch_idx++ ) + for ( ; ch_idx < MAX_INTERN_CHANNELS; ch_idx++ ) { hTcBuffer->tc_buffer_old[ch_idx] = NULL; } @@ -2297,12 +2297,12 @@ static ivas_error ivas_jbm_dec_tc_audio_allocate( { hTcBuffer->tc_buffer = NULL; - for ( ch_idx = 0; ch_idx < MAX_TRANSPORT_CHANNELS; ch_idx++ ) + for ( ch_idx = 0; ch_idx < MAX_INTERN_CHANNELS; ch_idx++ ) { hTcBuffer->tc[ch_idx] = NULL; } - for ( ch_idx = 0; ch_idx < MAX_TRANSPORT_CHANNELS; ch_idx++ ) + for ( ch_idx = 0; ch_idx < MAX_INTERN_CHANNELS; ch_idx++ ) { hTcBuffer->tc_buffer_old[ch_idx] = NULL; } @@ -2328,7 +2328,7 @@ static void ivas_jbm_dec_tc_audio_deallocate( { if ( hTcBuffer->tc_buffer != NULL ) { - for ( ch_idx = 0; ch_idx < MAX_TRANSPORT_CHANNELS; ch_idx++ ) + for ( ch_idx = 0; ch_idx < MAX_INTERN_CHANNELS; ch_idx++ ) { hTcBuffer->tc[ch_idx] = NULL; } @@ -2337,7 +2337,7 @@ static void ivas_jbm_dec_tc_audio_deallocate( hTcBuffer->tc_buffer = NULL; } - for ( ch_idx = 0; ch_idx < MAX_TRANSPORT_CHANNELS; ch_idx++ ) + for ( ch_idx = 0; ch_idx < MAX_INTERN_CHANNELS; ch_idx++ ) { if ( hTcBuffer->tc_buffer_old[ch_idx] != NULL ) { diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index 930eb456f2..423ad7fb9a 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -945,11 +945,11 @@ typedef struct ivas_masa_ism_data_structure typedef struct decoder_tc_buffer_structure { #ifdef REMOVE_APA_BUFFER - float *tc_buffer_old[MAX_TRANSPORT_CHANNELS]; /* TC audio samples not rendered in the previous frame */ + float *tc_buffer_old[MAX_INTERN_CHANNELS]; /* TC audio samples not rendered in the previous frame */ #endif float *tc_buffer; /* the buffer itself */ #ifdef REMOVE_APA_BUFFER - float *tc[MAX_TRANSPORT_CHANNELS]; /* pointers into the buffer to the beginning of each tc */ + float *tc[MAX_INTERN_CHANNELS]; /* pointers into the buffer to the beginning of each tc */ #else float *tc[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS]; /* pointers into the buffer to the beginning of each tc */ // VE2SB: TBV #endif -- GitLab From d7582a1f65be0d3b4c7efd7f97c5152d1b5c8a02 Mon Sep 17 00:00:00 2001 From: vaclav Date: Sat, 19 Apr 2025 08:47:46 +0200 Subject: [PATCH 20/29] fix + activate FIX_OSBA_BR_SW_FLUSH --- lib_com/options.h | 2 +- lib_dec/ivas_jbm_dec.c | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index ac09f62d7d..2655f55626 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -163,7 +163,7 @@ #define LIB_DEC_REVISION /* VA: cleaning and simplification of lib_dec.c */ #if 1 #define JBM_MEMORY_OPT /* VA: issue 916: optimization of RAM in the JBM decoder */ -//#define FIX_OSBA_BR_SW_FLUSH // this is non-BE bugfix +#define FIX_OSBA_BR_SW_FLUSH #define REMOVE_APA_BUFFER // remove hIvasDec->apaExecBuffer[] #endif diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index fcdf842ef8..87f707dab6 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -1498,7 +1498,9 @@ ivas_error ivas_jbm_dec_flush_renderer( for ( ch_idx = 0; ch_idx < hTcBuffer->nchan_transport_jbm; ch_idx++ ) #endif { + /* move it at the beginning of the TC buffer with zero padding */ mvr2r( hTcBuffer->tc_buffer_old[ch_idx], hTcBuffer->tc[ch_idx], n_samples_to_render ); + set_zero( hTcBuffer->tc[ch_idx] + n_samples_to_render, hTcBuffer->n_samples_granularity - n_samples_to_render ); } #ifndef FIX_OSBA_BR_SW_FLUSH for ( ; ch_idx < hTcBuffer->nchan_buffer_full; ch_idx++ ) -- GitLab From 238e16efcbf4623d493e9d0564d786512787c912 Mon Sep 17 00:00:00 2001 From: vaclav Date: Sat, 19 Apr 2025 13:32:31 +0200 Subject: [PATCH 21/29] serial to parallel conversion, under SER2PAR --- lib_com/ivas_prot.h | 9 +++++++++ lib_com/ivas_tools.c | 37 +++++++++++++++++++++++++++++++++++++ lib_com/options.h | 2 ++ lib_dec/ivas_jbm_dec.c | 36 ++++++++++++++++++++++++++++++++---- lib_dec/lib_dec.c | 36 +++++++++++++++++++++++++++++++++++- 5 files changed, 115 insertions(+), 5 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 752bc34b88..78393ca94d 100755 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -266,6 +266,15 @@ void ivas_syn_output_f( float *synth_out /* o : integer 16 bits synthesis signal */ ); +#ifdef SER2PAR +void ivas_buffer_serial_to_parallel( + float *audio, /* i/o: audio buffer */ + const int16_t n_channels, /* i : number of channels */ + const int16_t frame_length, /* i : frame length (one channel ) */ + const int16_t n_samp_full /* i : full frame length (one channel) */ +); + +#endif void ivas_initialize_handles_enc( Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ ); diff --git a/lib_com/ivas_tools.c b/lib_com/ivas_tools.c index 36c626daa7..c2dca34079 100644 --- a/lib_com/ivas_tools.c +++ b/lib_com/ivas_tools.c @@ -148,6 +148,43 @@ uint32_t ivas_syn_output( return noClipping; } +#ifdef SER2PAR + +/*-------------------------------------------------------------------* + * ivas_buffer_serial_to_parallel() + * + * reshuffle an interleaved serial buffer to one-by-one audio channels representation + *-------------------------------------------------------------------*/ + +void ivas_buffer_serial_to_parallel( + float *audio, /* i/o: audio buffer */ + const int16_t n_channels, /* i : number of channels */ + const int16_t frame_length, /* i : frame length (one channel ) */ + const int16_t n_samp_full /* i : full frame length (one channel) */ +) +{ + int16_t offset, ch, m; + float buffer[MAX_TRANSPORT_CHANNELS][MAX_JBM_L_FRAME48k]; + + for ( ch = 0; ch < n_channels; ch++ ) + { + for ( m = 0; m < frame_length; m++ ) + { + buffer[ch][m] = audio[m * n_channels + ch]; + } + } + + offset = 0; + for ( ch = 0; ch < n_channels; ch++ ) + { + mvr2r( buffer[ch], audio + offset, frame_length ); + offset += n_samp_full; + } + + return; +} + +#endif /*-------------------------------------------------------------------* * ivas_syn_output_f() diff --git a/lib_com/options.h b/lib_com/options.h index 2655f55626..04e1ed6179 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -165,6 +165,8 @@ #define JBM_MEMORY_OPT /* VA: issue 916: optimization of RAM in the JBM decoder */ #define FIX_OSBA_BR_SW_FLUSH #define REMOVE_APA_BUFFER // remove hIvasDec->apaExecBuffer[] + +#define SER2PAR #endif /* #################### End BE switches ################################## */ diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 87f707dab6..b140eb4709 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -799,16 +799,22 @@ void ivas_jbm_dec_feed_tc_to_renderer( #endif ) { +#ifdef SER2PAR + float tmp_buf[MAX_JBM_L_FRAME48k]; +#else float data_f[MAX_CLDFB_DIGEST_CHANNELS][MAX_JBM_L_FRAME48k]; /* 'float' buffer for transport channels that will be directly converted with the CLDFB */ +#endif float *p_data_f[MAX_CLDFB_DIGEST_CHANNELS]; int16_t n, n_render_timeslots; push_wmops( "ivas_jbm_dec_feed_tc_to_renderer" ); +#ifndef SER2PAR for ( n = 0; n < MAX_CLDFB_DIGEST_CHANNELS; n++ ) { p_data_f[n] = &data_f[n][0]; } +#endif if ( !st_ivas->hDecoderConfig->Opt_tsm ) { #ifdef REMOVE_APA_BUFFER @@ -824,23 +830,27 @@ void ivas_jbm_dec_feed_tc_to_renderer( if ( st_ivas->hDecoderConfig->Opt_tsm ) { #ifdef REMOVE_APA_BUFFER - int16_t n_samples_still_available, ch, m; + int16_t n_samples_still_available, ch; int16_t n_ch_full_copy, n_ch_res_copy, n_ch_cldfb; DECODER_TC_BUFFER_HANDLE hTcBuffer; +#ifndef SER2PAR #ifdef REMOVE_APA_BUFFER float data[MAX_TRANSPORT_CHANNELS * MAX_JBM_L_FRAME48k]; int16_t n_samp_full = ( NS2SA( st_ivas->hDecoderConfig->output_Fs, MAX_JBM_L_FRAME_NS ) ); mvr2r( st_ivas->hTcBuffer->tc_buffer, data, st_ivas->hTcBuffer->nchan_transport_jbm * n_samp_full ); +#endif + #endif hTcBuffer = st_ivas->hTcBuffer; n_ch_cldfb = hTcBuffer->nchan_transport_jbm - hTcBuffer->nchan_buffer_full; - +#ifndef SER2PAR for ( n = 0; n < n_ch_cldfb; n++ ) { p_data_f[n] = &data_f[n][0]; } +#endif n_samples_still_available = hTcBuffer->n_samples_buffered - hTcBuffer->n_samples_rendered; hTcBuffer->n_samples_buffered = n_samples_still_available + nSamplesForRendering + hTcBuffer->n_samples_discard; hTcBuffer->n_samples_available = hTcBuffer->n_samples_granularity * ( hTcBuffer->n_samples_buffered / hTcBuffer->n_samples_granularity ); @@ -850,25 +860,43 @@ void ivas_jbm_dec_feed_tc_to_renderer( for ( ch = 0; ch < n_ch_full_copy; ch++ ) { +#ifdef SER2PAR + mvr2r( hTcBuffer->tc[ch], tmp_buf, nSamplesForRendering ); +#endif set_zero( hTcBuffer->tc[ch], hTcBuffer->n_samples_discard ); mvr2r( st_ivas->hTcBuffer->tc_buffer_old[ch], st_ivas->hTcBuffer->tc[ch] + st_ivas->hTcBuffer->n_samples_discard, n_samples_still_available ); - for ( m = 0; m < nSamplesForRendering; m++ ) +#ifdef SER2PAR + mvr2r( tmp_buf, hTcBuffer->tc[ch] + n_samples_still_available + hTcBuffer->n_samples_discard, nSamplesForRendering - *nSamplesResidual ); + mvr2r( tmp_buf + nSamplesForRendering - *nSamplesResidual, hTcBuffer->tc_buffer_old[ch], *nSamplesResidual ); +#else + for ( int16_t m = 0; m < nSamplesForRendering; m++ ) { hTcBuffer->tc[ch][n_samples_still_available + hTcBuffer->n_samples_discard + m] = data[m * hTcBuffer->nchan_transport_jbm + ch]; } mvr2r( hTcBuffer->tc[ch] + hTcBuffer->n_samples_available, hTcBuffer->tc_buffer_old[ch], *nSamplesResidual ); +#endif } if ( n_ch_res_copy > 0 ) { for ( ; ch < hTcBuffer->nchan_transport_jbm; ch++ ) { +#ifdef SER2PAR + mvr2r( hTcBuffer->tc[ch], tmp_buf, nSamplesForRendering ); + p_data_f[ch - n_ch_full_copy] = hTcBuffer->tc[ch]; + +#endif mvr2r( st_ivas->hTcBuffer->tc_buffer_old[ch], p_data_f[ch], n_samples_still_available ); - for ( m = 0; m < nSamplesForRendering; m++ ) +#ifdef SER2PAR + mvr2r( tmp_buf, p_data_f[ch] + n_samples_still_available, nSamplesForRendering - *nSamplesResidual ); + mvr2r( tmp_buf + nSamplesForRendering - *nSamplesResidual, hTcBuffer->tc_buffer_old[ch], *nSamplesResidual ); +#else + for ( int16_t m = 0; m < nSamplesForRendering; m++ ) { p_data_f[ch][n_samples_still_available + m] = data[m * hTcBuffer->nchan_transport_jbm + ch]; } mvr2r( p_data_f[ch] + hTcBuffer->n_samples_available, hTcBuffer->tc_buffer_old[ch], *nSamplesResidual ); +#endif } } diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index abd914ff3c..576579bc57 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -1382,9 +1382,10 @@ ivas_error IVAS_DEC_GetSamplesDecoder( } #ifdef REMOVE_APA_BUFFER - /* move decoded audio buffers st_ivas->p_output_f[][] to a serial buffer hTcBuffer->tc_buffer[] */ + /* reshuffle one-by-one decoded TC audio channels to an interleaved serial buffer */ ivas_syn_output_f( st_ivas->p_output_f, hIvasDec->nSamplesFrame, nTransportChannels, st_ivas->hTcBuffer->tc_buffer ); + /* time scale modification */ if ( apa_exec( hIvasDec->hTimeScaler, st_ivas->hTcBuffer->tc_buffer, hIvasDec->nSamplesFrame * nTransportChannels, (uint16_t) hIvasDec->tsm_max_scaling, st_ivas->hTcBuffer->tc_buffer, &nTimeScalerOutSamples ) != 0 ) #else #ifdef LIB_DEC_REVISION @@ -1400,6 +1401,39 @@ ivas_error IVAS_DEC_GetSamplesDecoder( assert( nTimeScalerOutSamples <= APA_BUF ); nSamplesTcsScaled = nTimeScalerOutSamples / nTransportChannels; hIvasDec->timeScalingDone = 1; +#ifdef REMOVE_APA_BUFFER + + /* reshuffle interleaved serial buffer to one-by-one time-scaled TC audio channels */ +#ifdef SER2PAR +#if 1 + ivas_buffer_serial_to_parallel( st_ivas->hTcBuffer->tc_buffer, nTransportChannels, nSamplesTcsScaled, NS2SA( st_ivas->hDecoderConfig->output_Fs, MAX_JBM_L_FRAME_NS ) ); +#else + { + float buffer[MAX_TRANSPORT_CHANNELS][MAX_JBM_L_FRAME48k]; + DECODER_TC_BUFFER_HANDLE hTcBuffer; + hTcBuffer = st_ivas->hTcBuffer; + + int16_t n_samp_full = ( NS2SA( st_ivas->hDecoderConfig->output_Fs, MAX_JBM_L_FRAME_NS ) ); + + for ( int16_t ch = 0; ch < hTcBuffer->nchan_transport_jbm; ch++ ) + { + for ( int16_t m = 0; m < nSamplesTcsScaled; m++ ) + { + buffer[ch][m] = st_ivas->hTcBuffer->tc_buffer[m * hTcBuffer->nchan_transport_jbm + ch]; + } + } + + int16_t offset = 0; + for ( int16_t ch = 0; ch < hTcBuffer->nchan_transport_jbm; ch++ ) + { + mvr2r( buffer[ch], hTcBuffer->tc_buffer + offset, nSamplesTcsScaled ); + // mvr2r( buffer[ch], hTcBuffer->tc[ch], nSamplesTcsScaled ); + offset += n_samp_full; + } + } +#endif +#endif +#endif } else { -- GitLab From c1fb3a04c95927bf7c94e0a6f5716dfa41931994 Mon Sep 17 00:00:00 2001 From: vaclav Date: Sat, 19 Apr 2025 13:47:30 +0200 Subject: [PATCH 22/29] cleaning --- lib_com/ivas_cnst.h | 5 -- lib_com/ivas_prot.h | 4 +- lib_com/ivas_tools.c | 2 +- lib_com/options.h | 5 -- lib_dec/ivas_jbm_dec.c | 100 +++++++++------------------------------- lib_dec/ivas_stat_dec.h | 6 +-- lib_dec/lib_dec.c | 60 +++++------------------- 7 files changed, 38 insertions(+), 144 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 16c11dee36..8a9e8dea19 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -172,13 +172,8 @@ typedef enum #define JBM_CLDFB_SLOTS_IN_SUBFRAME 4 #define MAX_JBM_CLDFB_TIMESLOTS 32 #define DEFAULT_JBM_CLDFB_TIMESLOTS 16 -#if (defined JBM_MEMORY_OPT && !defined REMOVE_APA_BUFFER) -#define MAX_JBM_L_FRAME48k (1920 - 240) -#define MAX_JBM_L_FRAME_NS 35000000L -#else #define MAX_JBM_L_FRAME48k 1920 #define MAX_JBM_L_FRAME_NS 40000000L -#endif #define MAX_SPAR_INTERNAL_CHANNELS IVAS_SPAR_MAX_CH #define MAX_CLDFB_DIGEST_CHANNELS (FOA_CHANNELS + MAX_NUM_OBJECTS) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 78393ca94d..6dfe7b9312 100755 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -266,7 +266,7 @@ void ivas_syn_output_f( float *synth_out /* o : integer 16 bits synthesis signal */ ); -#ifdef SER2PAR +#ifdef JBM_MEMORY_OPT void ivas_buffer_serial_to_parallel( float *audio, /* i/o: audio buffer */ const int16_t n_channels, /* i : number of channels */ @@ -849,7 +849,7 @@ void ivas_jbm_dec_feed_tc_to_renderer( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const int16_t nSamplesForRendering, /* i : number of TC samples available for rendering */ int16_t *nSamplesResidual /* o : number of samples not fitting into the renderer grid and buffer for the next call*/ -#ifndef REMOVE_APA_BUFFER +#ifndef JBM_MEMORY_OPT , float *data /* i/o: time-scaled transport channels */ #endif diff --git a/lib_com/ivas_tools.c b/lib_com/ivas_tools.c index c2dca34079..452ca6ae69 100644 --- a/lib_com/ivas_tools.c +++ b/lib_com/ivas_tools.c @@ -148,7 +148,7 @@ uint32_t ivas_syn_output( return noClipping; } -#ifdef SER2PAR +#ifdef JBM_MEMORY_OPT /*-------------------------------------------------------------------* * ivas_buffer_serial_to_parallel() diff --git a/lib_com/options.h b/lib_com/options.h index 04e1ed6179..bd4e93e854 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -161,13 +161,8 @@ /*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ #define TMP_FIX_1119_SPLIT_RENDERING_VOIP /* FhG: Add error check for unsupported config: split rendering with VoIP mode */ #define LIB_DEC_REVISION /* VA: cleaning and simplification of lib_dec.c */ -#if 1 #define JBM_MEMORY_OPT /* VA: issue 916: optimization of RAM in the JBM decoder */ -#define FIX_OSBA_BR_SW_FLUSH -#define REMOVE_APA_BUFFER // remove hIvasDec->apaExecBuffer[] -#define SER2PAR -#endif /* #################### End BE switches ################################## */ diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index b140eb4709..4efdfa1eba 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -50,7 +50,7 @@ * Local function prototypes *-----------------------------------------------------------------------*/ -#ifndef REMOVE_APA_BUFFER +#ifndef JBM_MEMORY_OPT static void ivas_jbm_dec_copy_tc( Decoder_Struct *st_ivas, const int16_t nSamplesForRendering, int16_t *nSamplesResidual, float *data, float *tc_digest_f[] ); #endif static void ivas_jbm_dec_tc_buffer_playout( Decoder_Struct *st_ivas, const uint16_t nSamplesAsked, uint16_t *nSamplesRendered, float *output[] ); @@ -793,13 +793,13 @@ void ivas_jbm_dec_feed_tc_to_renderer( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const int16_t nSamplesForRendering, /* i : number of TC samples available for rendering */ int16_t *nSamplesResidual /* o : number of samples not fitting into the renderer grid and buffer for the next call*/ -#ifndef REMOVE_APA_BUFFER +#ifndef JBM_MEMORY_OPT , float *data /* i : time-scaled transport channels */ #endif ) { -#ifdef SER2PAR +#ifdef JBM_MEMORY_OPT float tmp_buf[MAX_JBM_L_FRAME48k]; #else float data_f[MAX_CLDFB_DIGEST_CHANNELS][MAX_JBM_L_FRAME48k]; /* 'float' buffer for transport channels that will be directly converted with the CLDFB */ @@ -808,16 +808,9 @@ void ivas_jbm_dec_feed_tc_to_renderer( int16_t n, n_render_timeslots; push_wmops( "ivas_jbm_dec_feed_tc_to_renderer" ); -#ifndef SER2PAR - for ( n = 0; n < MAX_CLDFB_DIGEST_CHANNELS; n++ ) - { - p_data_f[n] = &data_f[n][0]; - } - -#endif if ( !st_ivas->hDecoderConfig->Opt_tsm ) { -#ifdef REMOVE_APA_BUFFER +#ifdef JBM_MEMORY_OPT for ( n = 0; n < max( st_ivas->hTcBuffer->nchan_transport_jbm, st_ivas->hTcBuffer->nchan_buffer_full ); n++ ) #else for ( n = 0; n < ivas_get_nchan_buffers_dec( st_ivas, st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); n++ ) @@ -829,28 +822,12 @@ void ivas_jbm_dec_feed_tc_to_renderer( if ( st_ivas->hDecoderConfig->Opt_tsm ) { -#ifdef REMOVE_APA_BUFFER +#ifdef JBM_MEMORY_OPT int16_t n_samples_still_available, ch; - int16_t n_ch_full_copy, n_ch_res_copy, n_ch_cldfb; + int16_t n_ch_full_copy, n_ch_res_copy; DECODER_TC_BUFFER_HANDLE hTcBuffer; -#ifndef SER2PAR -#ifdef REMOVE_APA_BUFFER - float data[MAX_TRANSPORT_CHANNELS * MAX_JBM_L_FRAME48k]; - int16_t n_samp_full = ( NS2SA( st_ivas->hDecoderConfig->output_Fs, MAX_JBM_L_FRAME_NS ) ); - mvr2r( st_ivas->hTcBuffer->tc_buffer, data, st_ivas->hTcBuffer->nchan_transport_jbm * n_samp_full ); -#endif - -#endif hTcBuffer = st_ivas->hTcBuffer; - n_ch_cldfb = hTcBuffer->nchan_transport_jbm - hTcBuffer->nchan_buffer_full; -#ifndef SER2PAR - for ( n = 0; n < n_ch_cldfb; n++ ) - { - p_data_f[n] = &data_f[n][0]; - } - -#endif n_samples_still_available = hTcBuffer->n_samples_buffered - hTcBuffer->n_samples_rendered; hTcBuffer->n_samples_buffered = n_samples_still_available + nSamplesForRendering + hTcBuffer->n_samples_discard; hTcBuffer->n_samples_available = hTcBuffer->n_samples_granularity * ( hTcBuffer->n_samples_buffered / hTcBuffer->n_samples_granularity ); @@ -860,43 +837,22 @@ void ivas_jbm_dec_feed_tc_to_renderer( for ( ch = 0; ch < n_ch_full_copy; ch++ ) { -#ifdef SER2PAR mvr2r( hTcBuffer->tc[ch], tmp_buf, nSamplesForRendering ); -#endif set_zero( hTcBuffer->tc[ch], hTcBuffer->n_samples_discard ); mvr2r( st_ivas->hTcBuffer->tc_buffer_old[ch], st_ivas->hTcBuffer->tc[ch] + st_ivas->hTcBuffer->n_samples_discard, n_samples_still_available ); -#ifdef SER2PAR mvr2r( tmp_buf, hTcBuffer->tc[ch] + n_samples_still_available + hTcBuffer->n_samples_discard, nSamplesForRendering - *nSamplesResidual ); mvr2r( tmp_buf + nSamplesForRendering - *nSamplesResidual, hTcBuffer->tc_buffer_old[ch], *nSamplesResidual ); -#else - for ( int16_t m = 0; m < nSamplesForRendering; m++ ) - { - hTcBuffer->tc[ch][n_samples_still_available + hTcBuffer->n_samples_discard + m] = data[m * hTcBuffer->nchan_transport_jbm + ch]; - } - mvr2r( hTcBuffer->tc[ch] + hTcBuffer->n_samples_available, hTcBuffer->tc_buffer_old[ch], *nSamplesResidual ); -#endif } if ( n_ch_res_copy > 0 ) { for ( ; ch < hTcBuffer->nchan_transport_jbm; ch++ ) { -#ifdef SER2PAR - mvr2r( hTcBuffer->tc[ch], tmp_buf, nSamplesForRendering ); p_data_f[ch - n_ch_full_copy] = hTcBuffer->tc[ch]; - -#endif + mvr2r( hTcBuffer->tc[ch], tmp_buf, nSamplesForRendering ); mvr2r( st_ivas->hTcBuffer->tc_buffer_old[ch], p_data_f[ch], n_samples_still_available ); -#ifdef SER2PAR mvr2r( tmp_buf, p_data_f[ch] + n_samples_still_available, nSamplesForRendering - *nSamplesResidual ); mvr2r( tmp_buf + nSamplesForRendering - *nSamplesResidual, hTcBuffer->tc_buffer_old[ch], *nSamplesResidual ); -#else - for ( int16_t m = 0; m < nSamplesForRendering; m++ ) - { - p_data_f[ch][n_samples_still_available + m] = data[m * hTcBuffer->nchan_transport_jbm + ch]; - } - mvr2r( p_data_f[ch] + hTcBuffer->n_samples_available, hTcBuffer->tc_buffer_old[ch], *nSamplesResidual ); -#endif } } @@ -988,7 +944,7 @@ ivas_error ivas_jbm_dec_render( p_tc[n] = &p_output[n][st_ivas->hTcBuffer->n_samples_rendered]; } -#ifdef REMOVE_APA_BUFFER +#ifdef JBM_MEMORY_OPT for ( n = 0; n < MAX_INTERN_CHANNELS; n++ ) #else for ( n = 0; n < MAX_TRANSPORT_CHANNELS + MAX_NUM_OBJECTS; n++ ) @@ -1517,28 +1473,14 @@ ivas_error ivas_jbm_dec_flush_renderer( { int16_t ch_idx; -#ifdef REMOVE_APA_BUFFER +#ifdef JBM_MEMORY_OPT /* render available full slots (with new lower granularity) */ -#ifdef FIX_OSBA_BR_SW_FLUSH for ( ch_idx = 0; ch_idx < max( hTcBuffer->nchan_transport_jbm, hTcBuffer->nchan_buffer_full ); ch_idx++ ) - // for ( ch_idx = 0; ch_idx < hTcBuffer->nchan_transport_internal; ch_idx++ ) // VE: TBV -#else - for ( ch_idx = 0; ch_idx < hTcBuffer->nchan_transport_jbm; ch_idx++ ) -#endif { /* move it at the beginning of the TC buffer with zero padding */ mvr2r( hTcBuffer->tc_buffer_old[ch_idx], hTcBuffer->tc[ch_idx], n_samples_to_render ); set_zero( hTcBuffer->tc[ch_idx] + n_samples_to_render, hTcBuffer->n_samples_granularity - n_samples_to_render ); } -#ifndef FIX_OSBA_BR_SW_FLUSH - for ( ; ch_idx < hTcBuffer->nchan_buffer_full; ch_idx++ ) - { - /* move it at the beginning of the TC buffer with zero padding */ - mvr2r( hTcBuffer->tc[ch_idx] + hTcBuffer->n_samples_rendered, hTcBuffer->tc[ch_idx], n_samples_to_render ); - set_zero( hTcBuffer->tc[ch_idx] + n_samples_to_render, hTcBuffer->n_samples_granularity - n_samples_to_render ); - mvr2r( hTcBuffer->tc[ch_idx] + hTcBuffer->n_samples_rendered + n_samples_to_render, hTcBuffer->tc[ch_idx] + hTcBuffer->n_samples_granularity, n_samples_still_available ); - } -#endif #else /* render what is still there with zero padding */ for ( ch_idx = 0; ch_idx < hTcBuffer->nchan_buffer_full; ch_idx++ ) @@ -2138,7 +2080,7 @@ int16_t ivas_jbm_dec_get_num_tc_channels( return num_tc; } -#ifndef REMOVE_APA_BUFFER +#ifndef JBM_MEMORY_OPT /*--------------------------------------------------------------------------* * ivas_jbm_dec_copy_tc() * @@ -2259,7 +2201,7 @@ int16_t ivas_jbm_dec_get_render_granularity( } #endif -#ifdef REMOVE_APA_BUFFER +#ifdef JBM_MEMORY_OPT /*--------------------------------------------------------------------------* * ivas_jbm_dec_tc_audio_allocate() @@ -2396,12 +2338,12 @@ ivas_error ivas_jbm_dec_tc_buffer_open( const int16_t n_samples_granularity /* i : granularity of the renderer/buffer */ ) { -#ifndef REMOVE_APA_BUFFER +#ifndef JBM_MEMORY_OPT int16_t nsamp_to_allocate; #endif DECODER_TC_BUFFER_HANDLE hTcBuffer; int16_t nMaxSlotsPerSubframe; -#ifdef REMOVE_APA_BUFFER +#ifdef JBM_MEMORY_OPT ivas_error error; #else int16_t nchan_residual; @@ -2421,7 +2363,7 @@ ivas_error ivas_jbm_dec_tc_buffer_open( hTcBuffer->nchan_transport_jbm = nchan_transport_jbm; hTcBuffer->nchan_transport_internal = nchan_transport_internal; hTcBuffer->nchan_buffer_full = nchan_full; -#ifndef REMOVE_APA_BUFFER +#ifndef JBM_MEMORY_OPT nchan_residual = nchan_transport_internal - nchan_full; #endif hTcBuffer->n_samples_granularity = n_samples_granularity; @@ -2433,7 +2375,7 @@ ivas_error ivas_jbm_dec_tc_buffer_open( hTcBuffer->n_samples_discard = 0; hTcBuffer->n_samples_flushed = 0; hTcBuffer->nb_subframes = MAX_PARAM_SPATIAL_SUBFRAMES; -#ifndef REMOVE_APA_BUFFER +#ifndef JBM_MEMORY_OPT nsamp_to_allocate = 0; #endif nMaxSlotsPerSubframe = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / ( FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES ) ) / hTcBuffer->n_samples_granularity; @@ -2441,7 +2383,7 @@ ivas_error ivas_jbm_dec_tc_buffer_open( set_s( hTcBuffer->subframe_nbslots, 0, MAX_JBM_SUBFRAMES_5MS ); set_s( hTcBuffer->subframe_nbslots, nMaxSlotsPerSubframe, MAX_PARAM_SPATIAL_SUBFRAMES ); -#ifdef REMOVE_APA_BUFFER +#ifdef JBM_MEMORY_OPT if ( ( error = ivas_jbm_dec_tc_audio_allocate( hTcBuffer, st_ivas->hDecoderConfig->output_Fs, st_ivas->hDecoderConfig->Opt_tsm ) ) != IVAS_ERR_OK ) { return error; @@ -2529,7 +2471,7 @@ ivas_error ivas_jbm_dec_tc_buffer_reconfigure( const int16_t n_samples_granularity /* i : new granularity of the renderer/buffer */ ) { -#ifdef REMOVE_APA_BUFFER +#ifdef JBM_MEMORY_OPT ivas_error error; #else int16_t nsamp_to_allocate, n_samp_full, n_samp_residual, offset, nchan_residual; @@ -2576,7 +2518,7 @@ ivas_error ivas_jbm_dec_tc_buffer_reconfigure( hTcBuffer->nchan_transport_jbm = nchan_transport_jbm; hTcBuffer->nchan_transport_internal = nchan_transport_internal; hTcBuffer->nchan_buffer_full = nchan_full; -#ifndef REMOVE_APA_BUFFER +#ifndef JBM_MEMORY_OPT nchan_residual = nchan_transport_internal - nchan_full; #endif hTcBuffer->n_samples_granularity = n_samples_granularity; @@ -2586,7 +2528,7 @@ ivas_error ivas_jbm_dec_tc_buffer_reconfigure( assert( ( hTcBuffer->n_samples_buffered - hTcBuffer->n_samples_rendered ) < n_samples_granularity ); #endif -#ifdef REMOVE_APA_BUFFER +#ifdef JBM_MEMORY_OPT /* reallocate TC audio buffers */ ivas_jbm_dec_tc_audio_deallocate( hTcBuffer ); @@ -2714,13 +2656,13 @@ void ivas_jbm_dec_tc_buffer_close( DECODER_TC_BUFFER_HANDLE *phTcBuffer /* i/o: TC buffer handle */ ) { -#ifndef REMOVE_APA_BUFFER +#ifndef JBM_MEMORY_OPT int16_t i; #endif if ( *phTcBuffer != NULL ) { -#ifdef REMOVE_APA_BUFFER +#ifdef JBM_MEMORY_OPT ivas_jbm_dec_tc_audio_deallocate( *phTcBuffer ); #else for ( i = 0; i < MAX_TRANSPORT_CHANNELS + MAX_NUM_OBJECTS; i++ ) diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index 423ad7fb9a..28de5d7340 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -944,11 +944,11 @@ typedef struct ivas_masa_ism_data_structure typedef struct decoder_tc_buffer_structure { -#ifdef REMOVE_APA_BUFFER - float *tc_buffer_old[MAX_INTERN_CHANNELS]; /* TC audio samples not rendered in the previous frame */ +#ifdef JBM_MEMORY_OPT + float *tc_buffer_old[MAX_INTERN_CHANNELS]; /* TC audio samples not rendered in the previous frame */ #endif float *tc_buffer; /* the buffer itself */ -#ifdef REMOVE_APA_BUFFER +#ifdef JBM_MEMORY_OPT float *tc[MAX_INTERN_CHANNELS]; /* pointers into the buffer to the beginning of each tc */ #else float *tc[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS]; /* pointers into the buffer to the beginning of each tc */ // VE2SB: TBV diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 576579bc57..48ca370fd2 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -88,7 +88,7 @@ struct IVAS_DEC int16_t tsm_max_scaling; int16_t timeScalingDone; /* have we done already one TSM in a 20ms frame? */ float tsm_quality; -#ifndef REMOVE_APA_BUFFER +#ifndef JBM_MEMORY_OPT float *apaExecBuffer; /* Buffer for APA scaling */ #endif PCMDSP_APA_HANDLE hTimeScaler; @@ -184,7 +184,7 @@ ivas_error IVAS_DEC_Open( } hIvasDec = *phIvasDec; hIvasDec->hVoIP = NULL; -#ifndef REMOVE_APA_BUFFER +#ifndef JBM_MEMORY_OPT hIvasDec->apaExecBuffer = NULL; #endif hIvasDec->hTimeScaler = NULL; @@ -384,7 +384,7 @@ void IVAS_DEC_Close( apa_exit( &( *phIvasDec )->hTimeScaler ); -#ifndef REMOVE_APA_BUFFER +#ifndef JBM_MEMORY_OPT if ( ( *phIvasDec )->apaExecBuffer != NULL ) { free( ( *phIvasDec )->apaExecBuffer ); @@ -1281,7 +1281,7 @@ ivas_error IVAS_DEC_GetSamplesDecoder( st_ivas = hIvasDec->st_ivas; #ifdef LIB_DEC_REVISION -#ifdef REMOVE_APA_BUFFER +#ifdef JBM_MEMORY_OPT isInitialized_voip = hIvasDec->hTimeScaler != NULL; #else isInitialized_voip = hIvasDec->apaExecBuffer != NULL; @@ -1381,7 +1381,7 @@ ivas_error IVAS_DEC_GetSamplesDecoder( return IVAS_ERR_UNKNOWN; } -#ifdef REMOVE_APA_BUFFER +#ifdef JBM_MEMORY_OPT /* reshuffle one-by-one decoded TC audio channels to an interleaved serial buffer */ ivas_syn_output_f( st_ivas->p_output_f, hIvasDec->nSamplesFrame, nTransportChannels, st_ivas->hTcBuffer->tc_buffer ); @@ -1401,38 +1401,10 @@ ivas_error IVAS_DEC_GetSamplesDecoder( assert( nTimeScalerOutSamples <= APA_BUF ); nSamplesTcsScaled = nTimeScalerOutSamples / nTransportChannels; hIvasDec->timeScalingDone = 1; -#ifdef REMOVE_APA_BUFFER +#ifdef JBM_MEMORY_OPT /* reshuffle interleaved serial buffer to one-by-one time-scaled TC audio channels */ -#ifdef SER2PAR -#if 1 ivas_buffer_serial_to_parallel( st_ivas->hTcBuffer->tc_buffer, nTransportChannels, nSamplesTcsScaled, NS2SA( st_ivas->hDecoderConfig->output_Fs, MAX_JBM_L_FRAME_NS ) ); -#else - { - float buffer[MAX_TRANSPORT_CHANNELS][MAX_JBM_L_FRAME48k]; - DECODER_TC_BUFFER_HANDLE hTcBuffer; - hTcBuffer = st_ivas->hTcBuffer; - - int16_t n_samp_full = ( NS2SA( st_ivas->hDecoderConfig->output_Fs, MAX_JBM_L_FRAME_NS ) ); - - for ( int16_t ch = 0; ch < hTcBuffer->nchan_transport_jbm; ch++ ) - { - for ( int16_t m = 0; m < nSamplesTcsScaled; m++ ) - { - buffer[ch][m] = st_ivas->hTcBuffer->tc_buffer[m * hTcBuffer->nchan_transport_jbm + ch]; - } - } - - int16_t offset = 0; - for ( int16_t ch = 0; ch < hTcBuffer->nchan_transport_jbm; ch++ ) - { - mvr2r( buffer[ch], hTcBuffer->tc_buffer + offset, nSamplesTcsScaled ); - // mvr2r( buffer[ch], hTcBuffer->tc[ch], nSamplesTcsScaled ); - offset += n_samp_full; - } - } -#endif -#endif #endif } else @@ -1445,7 +1417,7 @@ ivas_error IVAS_DEC_GetSamplesDecoder( *-----------------------------------------------------------------*/ #ifdef LIB_DEC_REVISION -#ifdef REMOVE_APA_BUFFER +#ifdef JBM_MEMORY_OPT ivas_jbm_dec_feed_tc_to_renderer( st_ivas, nSamplesTcsScaled, &nResidualSamples ); #else ivas_jbm_dec_feed_tc_to_renderer( st_ivas, nSamplesTcsScaled, &nResidualSamples, hIvasDec->apaExecBuffer ); @@ -5078,7 +5050,7 @@ static ivas_error IVAS_DEC_VoIP_reconfigure( const uint16_t l_ts ) #endif { -#ifndef REMOVE_APA_BUFFER +#ifndef JBM_MEMORY_OPT int16_t apa_buffer_size; #endif #ifdef LIB_DEC_REVISION @@ -5103,12 +5075,8 @@ static ivas_error IVAS_DEC_VoIP_reconfigure( float startQuality; startQuality = hIvasDec->tsm_quality; -#ifndef REMOVE_APA_BUFFER -#ifdef JBM_MEMORY_OPT - apa_buffer_size = ( NS2SA( hIvasDec->st_ivas->hDecoderConfig->output_Fs, MAX_JBM_L_FRAME_NS ) ); -#else +#ifndef JBM_MEMORY_OPT apa_buffer_size = APA_BUF_PER_CHANNEL; -#endif #endif /* get current renderer type*/ @@ -5156,7 +5124,7 @@ static ivas_error IVAS_DEC_VoIP_reconfigure( } } -#ifndef REMOVE_APA_BUFFER +#ifndef JBM_MEMORY_OPT if ( ( hIvasDec->apaExecBuffer = malloc( sizeof( float ) * apa_buffer_size * nTransportChannels ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate VoIP handle" ); @@ -5178,14 +5146,8 @@ static ivas_error IVAS_DEC_VoIP_reconfigure( { return IVAS_ERR_INIT_ERROR; } - -#ifndef REMOVE_APA_BUFFER +#ifndef JBM_MEMORY_OPT /* realloc apa_exe_buffer */ -#ifdef JBM_MEMORY_OPT - apa_buffer_size = ( NS2SA( st_ivas->hDecoderConfig->output_Fs, MAX_JBM_L_FRAME_NS ) ); -#else - apa_buffer_size = APA_BUF_PER_CHANNEL; -#endif free( hIvasDec->apaExecBuffer ); if ( ( hIvasDec->apaExecBuffer = malloc( sizeof( float ) * apa_buffer_size * nTransportChannels ) ) == NULL ) { -- GitLab From 4b0d2cd2dafc1c762354e2c31f6d31d05798113f Mon Sep 17 00:00:00 2001 From: vaclav Date: Tue, 22 Apr 2025 11:07:59 +0200 Subject: [PATCH 23/29] tuning --- lib_com/ivas_cnst.h | 2 ++ lib_dec/ivas_jbm_dec.c | 3 ++- lib_dec/lib_dec.c | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 8a9e8dea19..6678660f4b 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -175,7 +175,9 @@ typedef enum #define MAX_JBM_L_FRAME48k 1920 #define MAX_JBM_L_FRAME_NS 40000000L #define MAX_SPAR_INTERNAL_CHANNELS IVAS_SPAR_MAX_CH +#ifndef JBM_MEMORY_OPT #define MAX_CLDFB_DIGEST_CHANNELS (FOA_CHANNELS + MAX_NUM_OBJECTS) +#endif typedef enum { diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 4efdfa1eba..0f1fee1e10 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -801,10 +801,11 @@ void ivas_jbm_dec_feed_tc_to_renderer( { #ifdef JBM_MEMORY_OPT float tmp_buf[MAX_JBM_L_FRAME48k]; + float *p_data_f[FOA_CHANNELS + MAX_NUM_OBJECTS]; #else float data_f[MAX_CLDFB_DIGEST_CHANNELS][MAX_JBM_L_FRAME48k]; /* 'float' buffer for transport channels that will be directly converted with the CLDFB */ -#endif float *p_data_f[MAX_CLDFB_DIGEST_CHANNELS]; +#endif int16_t n, n_render_timeslots; push_wmops( "ivas_jbm_dec_feed_tc_to_renderer" ); diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 48ca370fd2..2f64bdb295 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -5123,8 +5123,8 @@ static ivas_error IVAS_DEC_VoIP_reconfigure( return IVAS_ERR_INIT_ERROR; } } - #ifndef JBM_MEMORY_OPT + if ( ( hIvasDec->apaExecBuffer = malloc( sizeof( float ) * apa_buffer_size * nTransportChannels ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate VoIP handle" ); -- GitLab From 412a0695a4c9ff12a1ad2bad78065e836a835d85 Mon Sep 17 00:00:00 2001 From: vaclav Date: Sat, 26 Apr 2025 16:23:58 +0200 Subject: [PATCH 24/29] remove 'flushbuffer'; under JBM_MEMORY_OPT_FLUSH --- apps/decoder.c | 11 +++++++++++ lib_com/options.h | 2 +- lib_dec/ivas_jbm_dec.c | 16 +++++++++++++++- lib_dec/lib_dec.c | 42 ++++++++++++++++++++++++++++++++++++++---- lib_dec/lib_dec.h | 4 ++++ 5 files changed, 69 insertions(+), 6 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index c2d49eb68d..fc1a826bc7 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -2410,7 +2410,11 @@ static ivas_error decodeG192( /* Read main parameters from the bitstream to set-up the decoder */ hHrtfBinary->binaural_renderer_old = hHrtfBinary->binaural_renderer; hHrtfBinary->binaural_renderer_sec_old = hHrtfBinary->binaural_renderer_sec; +#ifdef JBM_MEMORY_OPT_FLUSH + if ( ( error = IVAS_DEC_ReadFormat( hIvasDec, NULL, 0, &hHrtfBinary->binaural_renderer, &hHrtfBinary->binaural_renderer_sec, &hHrtfBinary->hrtf_set_audio_cfg ) ) != IVAS_ERR_OK ) +#else if ( ( error = IVAS_DEC_ReadFormat( hIvasDec, &hHrtfBinary->binaural_renderer, &hHrtfBinary->binaural_renderer_sec, &hHrtfBinary->hrtf_set_audio_cfg ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -3334,9 +3338,16 @@ static ivas_error decodeVoIP( if ( bitstreamReadDone == true ) { /* Read main parameters from the bitstream to set-up the decoder */ +#ifdef JBM_MEMORY_OPT_FLUSH + /* + flush samples (compensate for renderer granularity change in JBM) */ +#endif hHrtf->binaural_renderer_old = hHrtf->binaural_renderer; hHrtf->binaural_renderer_sec_old = hHrtf->binaural_renderer_sec; +#ifdef JBM_MEMORY_OPT_FLUSH + if ( ( error = IVAS_DEC_ReadFormat( hIvasDec, pcmBuf, nSamplesRendered, &hHrtf->binaural_renderer, &hHrtf->binaural_renderer_sec, &hHrtf->hrtf_set_audio_cfg ) ) != IVAS_ERR_OK ) +#else if ( ( error = IVAS_DEC_ReadFormat( hIvasDec, &hHrtf->binaural_renderer, &hHrtf->binaural_renderer_sec, &hHrtf->hrtf_set_audio_cfg ) ) != IVAS_ERR_OK ) +#endif { return error; } diff --git a/lib_com/options.h b/lib_com/options.h index 3e27fbe974..338d1f47ce 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -161,7 +161,7 @@ /*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ #define TMP_FIX_1119_SPLIT_RENDERING_VOIP /* FhG: Add error check for unsupported config: split rendering with VoIP mode */ #define JBM_MEMORY_OPT /* VA: issue 916: optimization of RAM in the JBM decoder */ - +#define JBM_MEMORY_OPT_FLUSH /* #################### End BE switches ################################## */ diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 142907b30f..0982a1d4d2 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -1434,6 +1434,9 @@ ivas_error ivas_jbm_dec_flush_renderer( int16_t n_samples_still_available; int16_t n_slots_still_available; int16_t n_samples_to_render; +#ifdef JBM_MEMORY_OPT_FLUSH + uint16_t offset; +#endif DECODER_TC_BUFFER_HANDLE hTcBuffer; float *p_output[MAX_CICP_CHANNELS + MAX_NUM_OBJECTS]; @@ -1442,6 +1445,9 @@ ivas_error ivas_jbm_dec_flush_renderer( return IVAS_ERR_OK; } +#ifdef JBM_MEMORY_OPT_FLUSH + offset = *nSamplesRendered * st_ivas->hDecoderConfig->nchan_out; +#endif *nSamplesRendered = 0; hTcBuffer = st_ivas->hTcBuffer; @@ -1676,10 +1682,18 @@ ivas_error ivas_jbm_dec_flush_renderer( #ifdef DEBUGGING st_ivas->noClipping += #endif - ivas_syn_output( p_output, *nSamplesRendered, st_ivas->hDecoderConfig->nchan_out, (int16_t *) data ); +#ifdef JBM_MEMORY_OPT_FLUSH + ivas_syn_output( p_output, *nSamplesRendered, st_ivas->hDecoderConfig->nchan_out, (int16_t *) data + offset ); +#else + ivas_syn_output( p_output, *nSamplesRendered, st_ivas->hDecoderConfig->nchan_out, (int16_t *) data ); +#endif break; case PCM_FLOAT32: +#ifdef JBM_MEMORY_OPT_FLUSH + ivas_syn_output_f( p_output, *nSamplesRendered, st_ivas->hDecoderConfig->nchan_out, (float *) data + offset ); +#else ivas_syn_output_f( p_output, *nSamplesRendered, st_ivas->hDecoderConfig->nchan_out, (float *) data ); +#endif break; default: error = IVAS_ERR_UNKNOWN; diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 52be5f26b4..aa955e54ff 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -100,7 +100,9 @@ struct IVAS_DEC int16_t CNG; /* RXDTX handler: CNG=1, nonCNG=0 */ uint16_t nSamplesFlushed; +#ifndef JBM_MEMORY_OPT_FLUSH void *flushbuffer; +#endif IVAS_DEC_PCM_TYPE pcmType; bool hasBeenPreparedRendering; }; @@ -178,7 +180,9 @@ ivas_error IVAS_DEC_Open( hIvasDec->hasDecodedFirstGoodFrame = false; hIvasDec->isInitialized = false; hIvasDec->updateOrientation = false; +#ifndef JBM_MEMORY_OPT_FLUSH hIvasDec->flushbuffer = NULL; +#endif hIvasDec->pcmType = IVAS_DEC_PCM_INVALID; hIvasDec->nSamplesFlushed = 0; hIvasDec->hasBeenPreparedRendering = false; @@ -360,10 +364,12 @@ void IVAS_DEC_Close( free( ( *phIvasDec )->apaExecBuffer ); } #endif +#ifndef JBM_MEMORY_OPT_FLUSH if ( ( *phIvasDec )->flushbuffer != NULL ) { free( ( *phIvasDec )->flushbuffer ); } +#endif free( *phIvasDec ); *phIvasDec = NULL; @@ -407,7 +413,7 @@ static IVAS_DEC_BS_FORMAT mapIvasFormat( return IVAS_DEC_BS_UNKOWN; } - +#ifndef JBM_MEMORY_OPT_FLUSH /*---------------------------------------------------------------------* * create_flush_buffer() * @@ -429,7 +435,7 @@ static ivas_error create_flush_buffer( return IVAS_ERR_OK; } - +#endif /*---------------------------------------------------------------------* * IVAS_DEC_Configure( ) @@ -812,12 +818,16 @@ ivas_error IVAS_DEC_EnableVoIP( } #endif +#ifdef JBM_MEMORY_OPT_FLUSH + hIvasDec->pcmType = IVAS_DEC_PCM_INT16; +#else /* init flush buffer (needed for binaural outputs) */ if ( ( error = create_flush_buffer( hIvasDec ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nError in create_flush_buffer , code: %d\n", error ); return error; } +#endif return IVAS_ERR_OK; } @@ -958,12 +968,17 @@ static IVAS_BIN_RENDERER_TYPE renderer_type_to_mode( * IVAS_DEC_ReadFormat( ) * * Read main parameters from the bitstream to set-up the decoder: - * - IVAS fromat + * - IVAS format * - IVAS format specific signaling + * - compensate for renderer granularity change in JBM *---------------------------------------------------------------------*/ ivas_error IVAS_DEC_ReadFormat( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ +#ifdef JBM_MEMORY_OPT_FLUSH + void *pcmBuf, /* o : output synthesis signal */ + const uint16_t nSamplesRendered, /* i : number of samples rendered */ +#endif IVAS_BIN_RENDERER_TYPE *binaural_renderer, /* o : binaural renderer type */ IVAS_BIN_RENDERER_TYPE *binaural_renderer_sec, /* o : secondary binaural renderer type */ IVAS_AUDIO_CONFIG *hrtf_set_audio_cfg /* o : HRTF set audio config. */ @@ -1085,7 +1100,12 @@ ivas_error IVAS_DEC_ReadFormat( /* when granularity goes down, render what still fits in the new granularity */ if ( tc_granularity_new < st_ivas->hTcBuffer->n_samples_granularity ) { +#ifdef JBM_MEMORY_OPT_FLUSH + hIvasDec->nSamplesFlushed = nSamplesRendered; + if ( ( error = ivas_jbm_dec_flush_renderer( st_ivas, tc_granularity_new, renderer_type_old, intern_config_old, &st_ivas->hIntSetup, mc_mode_old, ism_mode_old, &hIvasDec->nSamplesFlushed, pcm_type_API_to_internal( hIvasDec->pcmType ), pcmBuf ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_jbm_dec_flush_renderer( st_ivas, tc_granularity_new, renderer_type_old, intern_config_old, &st_ivas->hIntSetup, mc_mode_old, ism_mode_old, &hIvasDec->nSamplesFlushed, pcm_type_API_to_internal( hIvasDec->pcmType ), hIvasDec->flushbuffer ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -1813,9 +1833,14 @@ ivas_error IVAS_DEC_GetSamplesRenderer( nOutChannels = (uint8_t) st_ivas->hDecoderConfig->nchan_out; hIvasDec->hasBeenFedFrame = false; +#ifdef JBM_MEMORY_OPT_FLUSH + /* JBM rate switching: take into account possibly flushed samples (samples were written to pcmBuf[] in ivas_jbm_dec_flush_renderer()) */ +#else /* check for possible flushed samples from a rate switch */ +#endif if ( hIvasDec->nSamplesFlushed > 0 ) { +#ifndef JBM_MEMORY_OPT_FLUSH #ifdef DEBUGGING assert( hIvasDec->pcmType == pcmType ); #endif @@ -1833,6 +1858,7 @@ ivas_error IVAS_DEC_GetSamplesRenderer( { assert( 0 && "wrong PCM type for the flush buffer!" ); } +#endif #endif nSamplesRendered = hIvasDec->nSamplesFlushed; hIvasDec->nSamplesFlushed = 0; @@ -1913,6 +1939,9 @@ ivas_error IVAS_DEC_GetSplitBinauralBitstream( numPoses = hSplitBinRend->splitrend.multiBinPoseData.num_poses; +#ifdef JBM_MEMORY_OPT_FLUSH + hIvasDec->pcmType = IVAS_DEC_PCM_FLOAT; +#else /* init flush buffer for rate switch if not already initizalized */ if ( hIvasDec->flushbuffer == NULL ) { @@ -1924,6 +1953,7 @@ ivas_error IVAS_DEC_GetSplitBinauralBitstream( hIvasDec->pcmType = IVAS_DEC_PCM_FLOAT; set_zero( (float *) hIvasDec->flushbuffer, numPoses * BINAURAL_CHANNELS * hIvasDec->nSamplesFrame / IVAS_MAX_PARAM_SPATIAL_SUBFRAMES ); } +#endif if ( st_ivas->hDecoderConfig->render_framesize != IVAS_RENDER_FRAMESIZE_20MS && ( st_ivas->hRenderConfig->split_rend_config.poseCorrectionMode == ISAR_SPLIT_REND_POSE_CORRECTION_MODE_NONE || @@ -3396,6 +3426,9 @@ ivas_error IVAS_DEC_EnableTsm( hIvasDec->st_ivas->hDecoderConfig->Opt_tsm = 1; +#ifdef JBM_MEMORY_OPT_FLUSH + hIvasDec->pcmType = IVAS_DEC_PCM_INT16; +#else /* init flush buffer if necessary (only needed for binaural) */ output_config = hIvasDec->st_ivas->hDecoderConfig->output_config; if ( hIvasDec->flushbuffer == NULL && ( output_config == IVAS_AUDIO_CONFIG_BINAURAL || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB || output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) @@ -3405,6 +3438,7 @@ ivas_error IVAS_DEC_EnableTsm( return error; } } +#endif return IVAS_ERR_OK; } diff --git a/lib_dec/lib_dec.h b/lib_dec/lib_dec.h index 588399ef2a..003d69beb4 100644 --- a/lib_dec/lib_dec.h +++ b/lib_dec/lib_dec.h @@ -154,6 +154,10 @@ ivas_error IVAS_DEC_FeedFrame_Serial( ivas_error IVAS_DEC_ReadFormat( IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ +#ifdef JBM_MEMORY_OPT_FLUSH + void *pcmBuf, /* o : output synthesis signal */ + const uint16_t nSamplesRendered, /* i : number of samples rendered */ +#endif IVAS_BIN_RENDERER_TYPE *binaural_renderer, /* o : binaural renderer type */ IVAS_BIN_RENDERER_TYPE *binaural_renderer_sec,/* o: secondary binaural renderer type */ IVAS_AUDIO_CONFIG *hrtf_set_audio_cfg /* o : HRTF set audio config. */ -- GitLab From e20ea87ae9d4cc1626d7961dacff0f27653dde6a Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 21 May 2025 10:55:09 +0200 Subject: [PATCH 25/29] remove JBM_MEMORY_OPT_FLUSH --- apps/decoder.c | 11 ----------- lib_com/options.h | 1 - lib_dec/ivas_jbm_dec.c | 16 +--------------- lib_dec/lib_dec.c | 39 +++------------------------------------ lib_dec/lib_dec.h | 4 ---- 5 files changed, 4 insertions(+), 67 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index 2f45d1a07d..6a1d823f76 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -2410,11 +2410,7 @@ static ivas_error decodeG192( /* Read main parameters from the bitstream to set-up the decoder */ hHrtfBinary->binaural_renderer_old = hHrtfBinary->binaural_renderer; hHrtfBinary->binaural_renderer_sec_old = hHrtfBinary->binaural_renderer_sec; -#ifdef JBM_MEMORY_OPT_FLUSH - if ( ( error = IVAS_DEC_ReadFormat( hIvasDec, NULL, 0, &hHrtfBinary->binaural_renderer, &hHrtfBinary->binaural_renderer_sec, &hHrtfBinary->hrtf_set_audio_cfg ) ) != IVAS_ERR_OK ) -#else if ( ( error = IVAS_DEC_ReadFormat( hIvasDec, &hHrtfBinary->binaural_renderer, &hHrtfBinary->binaural_renderer_sec, &hHrtfBinary->hrtf_set_audio_cfg ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -3338,16 +3334,9 @@ static ivas_error decodeVoIP( if ( bitstreamReadDone == true ) { /* Read main parameters from the bitstream to set-up the decoder */ -#ifdef JBM_MEMORY_OPT_FLUSH - /* + flush samples (compensate for renderer granularity change in JBM) */ -#endif hHrtf->binaural_renderer_old = hHrtf->binaural_renderer; hHrtf->binaural_renderer_sec_old = hHrtf->binaural_renderer_sec; -#ifdef JBM_MEMORY_OPT_FLUSH - if ( ( error = IVAS_DEC_ReadFormat( hIvasDec, pcmBuf, nSamplesRendered, &hHrtf->binaural_renderer, &hHrtf->binaural_renderer_sec, &hHrtf->hrtf_set_audio_cfg ) ) != IVAS_ERR_OK ) -#else if ( ( error = IVAS_DEC_ReadFormat( hIvasDec, &hHrtf->binaural_renderer, &hHrtf->binaural_renderer_sec, &hHrtf->hrtf_set_audio_cfg ) ) != IVAS_ERR_OK ) -#endif { return error; } diff --git a/lib_com/options.h b/lib_com/options.h index 13bf63574c..f528c20197 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -162,7 +162,6 @@ #define TMP_FIX_1119_SPLIT_RENDERING_VOIP /* FhG: Add error check for unsupported config: split rendering with VoIP mode */ #define FIX_1314_STEREO_TO_EXT /* VA: issue 1314: set RENDERER_DISABLE for stereo to EXT output */ #define JBM_MEMORY_OPT /* VA: issue 916: optimization of RAM in the JBM decoder */ -#define JBM_MEMORY_OPT_FLUSH /* #################### End BE switches ################################## */ diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 9d18654ee2..d8d25854e0 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -1434,9 +1434,6 @@ ivas_error ivas_jbm_dec_flush_renderer( int16_t n_samples_still_available; int16_t n_slots_still_available; int16_t n_samples_to_render; -#ifdef JBM_MEMORY_OPT_FLUSH - uint16_t offset; -#endif DECODER_TC_BUFFER_HANDLE hTcBuffer; float *p_output[MAX_CICP_CHANNELS + MAX_NUM_OBJECTS]; @@ -1445,9 +1442,6 @@ ivas_error ivas_jbm_dec_flush_renderer( return IVAS_ERR_OK; } -#ifdef JBM_MEMORY_OPT_FLUSH - offset = *nSamplesRendered * st_ivas->hDecoderConfig->nchan_out; -#endif *nSamplesRendered = 0; hTcBuffer = st_ivas->hTcBuffer; @@ -1682,18 +1676,10 @@ ivas_error ivas_jbm_dec_flush_renderer( #ifdef DEBUGGING st_ivas->noClipping += #endif -#ifdef JBM_MEMORY_OPT_FLUSH - ivas_syn_output( p_output, *nSamplesRendered, st_ivas->hDecoderConfig->nchan_out, (int16_t *) data + offset ); -#else - ivas_syn_output( p_output, *nSamplesRendered, st_ivas->hDecoderConfig->nchan_out, (int16_t *) data ); -#endif + ivas_syn_output( p_output, *nSamplesRendered, st_ivas->hDecoderConfig->nchan_out, (int16_t *) data ); break; case PCM_FLOAT32: -#ifdef JBM_MEMORY_OPT_FLUSH - ivas_syn_output_f( p_output, *nSamplesRendered, st_ivas->hDecoderConfig->nchan_out, (float *) data + offset ); -#else ivas_syn_output_f( p_output, *nSamplesRendered, st_ivas->hDecoderConfig->nchan_out, (float *) data ); -#endif break; default: error = IVAS_ERR_UNKNOWN; diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 94203f1e91..559d0c598c 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -100,9 +100,7 @@ struct IVAS_DEC int16_t CNG; /* RXDTX handler: CNG=1, nonCNG=0 */ uint16_t nSamplesFlushed; -#ifndef JBM_MEMORY_OPT_FLUSH void *flushbuffer; -#endif IVAS_DEC_PCM_TYPE pcmType; bool hasBeenPreparedRendering; }; @@ -180,9 +178,7 @@ ivas_error IVAS_DEC_Open( hIvasDec->hasDecodedFirstGoodFrame = false; hIvasDec->isInitialized = false; hIvasDec->updateOrientation = false; -#ifndef JBM_MEMORY_OPT_FLUSH hIvasDec->flushbuffer = NULL; -#endif hIvasDec->pcmType = IVAS_DEC_PCM_INVALID; hIvasDec->nSamplesFlushed = 0; hIvasDec->hasBeenPreparedRendering = false; @@ -364,12 +360,10 @@ void IVAS_DEC_Close( free( ( *phIvasDec )->apaExecBuffer ); } #endif -#ifndef JBM_MEMORY_OPT_FLUSH if ( ( *phIvasDec )->flushbuffer != NULL ) { free( ( *phIvasDec )->flushbuffer ); } -#endif free( *phIvasDec ); *phIvasDec = NULL; @@ -413,7 +407,7 @@ static IVAS_DEC_BS_FORMAT mapIvasFormat( return IVAS_DEC_BS_UNKOWN; } -#ifndef JBM_MEMORY_OPT_FLUSH + /*---------------------------------------------------------------------* * create_flush_buffer() * @@ -435,7 +429,7 @@ static ivas_error create_flush_buffer( return IVAS_ERR_OK; } -#endif + /*---------------------------------------------------------------------* * IVAS_DEC_Configure( ) @@ -818,16 +812,12 @@ ivas_error IVAS_DEC_EnableVoIP( } #endif -#ifdef JBM_MEMORY_OPT_FLUSH - hIvasDec->pcmType = IVAS_DEC_PCM_INT16; -#else /* init flush buffer (needed for binaural outputs) */ if ( ( error = create_flush_buffer( hIvasDec ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nError in create_flush_buffer , code: %d\n", error ); return error; } -#endif return IVAS_ERR_OK; } @@ -974,11 +964,7 @@ static IVAS_BIN_RENDERER_TYPE renderer_type_to_mode( *---------------------------------------------------------------------*/ ivas_error IVAS_DEC_ReadFormat( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ -#ifdef JBM_MEMORY_OPT_FLUSH - void *pcmBuf, /* o : output synthesis signal */ - const uint16_t nSamplesRendered, /* i : number of samples rendered */ -#endif + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ IVAS_BIN_RENDERER_TYPE *binaural_renderer, /* o : binaural renderer type */ IVAS_BIN_RENDERER_TYPE *binaural_renderer_sec, /* o : secondary binaural renderer type */ IVAS_AUDIO_CONFIG *hrtf_set_audio_cfg /* o : HRTF set audio config. */ @@ -1100,12 +1086,7 @@ ivas_error IVAS_DEC_ReadFormat( /* when granularity goes down, render what still fits in the new granularity */ if ( tc_granularity_new < st_ivas->hTcBuffer->n_samples_granularity ) { -#ifdef JBM_MEMORY_OPT_FLUSH - hIvasDec->nSamplesFlushed = nSamplesRendered; - if ( ( error = ivas_jbm_dec_flush_renderer( st_ivas, tc_granularity_new, renderer_type_old, intern_config_old, &st_ivas->hIntSetup, mc_mode_old, ism_mode_old, &hIvasDec->nSamplesFlushed, pcm_type_API_to_internal( hIvasDec->pcmType ), pcmBuf ) ) != IVAS_ERR_OK ) -#else if ( ( error = ivas_jbm_dec_flush_renderer( st_ivas, tc_granularity_new, renderer_type_old, intern_config_old, &st_ivas->hIntSetup, mc_mode_old, ism_mode_old, &hIvasDec->nSamplesFlushed, pcm_type_API_to_internal( hIvasDec->pcmType ), hIvasDec->flushbuffer ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -1833,14 +1814,9 @@ ivas_error IVAS_DEC_GetSamplesRenderer( nOutChannels = (uint8_t) st_ivas->hDecoderConfig->nchan_out; hIvasDec->hasBeenFedFrame = false; -#ifdef JBM_MEMORY_OPT_FLUSH - /* JBM rate switching: take into account possibly flushed samples (samples were written to pcmBuf[] in ivas_jbm_dec_flush_renderer()) */ -#else /* check for possible flushed samples from a rate switch */ -#endif if ( hIvasDec->nSamplesFlushed > 0 ) { -#ifndef JBM_MEMORY_OPT_FLUSH #ifdef DEBUGGING assert( hIvasDec->pcmType == pcmType ); #endif @@ -1858,7 +1834,6 @@ ivas_error IVAS_DEC_GetSamplesRenderer( { assert( 0 && "wrong PCM type for the flush buffer!" ); } -#endif #endif nSamplesRendered = hIvasDec->nSamplesFlushed; hIvasDec->nSamplesFlushed = 0; @@ -1939,9 +1914,6 @@ ivas_error IVAS_DEC_GetSplitBinauralBitstream( numPoses = hSplitBinRend->splitrend.multiBinPoseData.num_poses; -#ifdef JBM_MEMORY_OPT_FLUSH - hIvasDec->pcmType = IVAS_DEC_PCM_FLOAT; -#else /* init flush buffer for rate switch if not already initizalized */ if ( hIvasDec->flushbuffer == NULL ) { @@ -1953,7 +1925,6 @@ ivas_error IVAS_DEC_GetSplitBinauralBitstream( hIvasDec->pcmType = IVAS_DEC_PCM_FLOAT; set_zero( (float *) hIvasDec->flushbuffer, numPoses * BINAURAL_CHANNELS * hIvasDec->nSamplesFrame / IVAS_MAX_PARAM_SPATIAL_SUBFRAMES ); } -#endif if ( st_ivas->hDecoderConfig->render_framesize != IVAS_RENDER_FRAMESIZE_20MS && ( st_ivas->hRenderConfig->split_rend_config.poseCorrectionMode == ISAR_SPLIT_REND_POSE_CORRECTION_MODE_NONE || @@ -3426,9 +3397,6 @@ ivas_error IVAS_DEC_EnableTsm( hIvasDec->st_ivas->hDecoderConfig->Opt_tsm = 1; -#ifdef JBM_MEMORY_OPT_FLUSH - hIvasDec->pcmType = IVAS_DEC_PCM_INT16; -#else /* init flush buffer if necessary (only needed for binaural) */ output_config = hIvasDec->st_ivas->hDecoderConfig->output_config; if ( hIvasDec->flushbuffer == NULL && ( output_config == IVAS_AUDIO_CONFIG_BINAURAL || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR || output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB || output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) @@ -3438,7 +3406,6 @@ ivas_error IVAS_DEC_EnableTsm( return error; } } -#endif return IVAS_ERR_OK; } diff --git a/lib_dec/lib_dec.h b/lib_dec/lib_dec.h index 003d69beb4..588399ef2a 100644 --- a/lib_dec/lib_dec.h +++ b/lib_dec/lib_dec.h @@ -154,10 +154,6 @@ ivas_error IVAS_DEC_FeedFrame_Serial( ivas_error IVAS_DEC_ReadFormat( IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ -#ifdef JBM_MEMORY_OPT_FLUSH - void *pcmBuf, /* o : output synthesis signal */ - const uint16_t nSamplesRendered, /* i : number of samples rendered */ -#endif IVAS_BIN_RENDERER_TYPE *binaural_renderer, /* o : binaural renderer type */ IVAS_BIN_RENDERER_TYPE *binaural_renderer_sec,/* o: secondary binaural renderer type */ IVAS_AUDIO_CONFIG *hrtf_set_audio_cfg /* o : HRTF set audio config. */ -- GitLab From 62bcc1c5918c29bb4caa661b6af1a0ddce4d29eb Mon Sep 17 00:00:00 2001 From: vaclav Date: Mon, 26 May 2025 19:34:18 +0200 Subject: [PATCH 26/29] address reviewer's comments --- lib_com/ivas_prot.h | 23 +++++++++++++++-------- lib_com/ivas_tools.c | 36 ++++++++++++++++++++++++++++++++---- lib_dec/ivas_jbm_dec.c | 15 +++++++++++---- lib_dec/lib_dec.c | 12 ++++++------ 4 files changed, 64 insertions(+), 22 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index c107cb4340..ca4cbfe5ac 100755 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -259,22 +259,29 @@ uint32_t ivas_syn_output( int16_t *synth_out /* o : integer 16 bits synthesis signal */ ); -void ivas_syn_output_f( - float *synth[], /* i/o: float synthesis signal */ - const int16_t output_frame, /* i : output frame length (one channel) */ - const int16_t n_channels, /* i : number of output channels */ - float *synth_out /* o : integer 16 bits synthesis signal */ -); - #ifdef JBM_MEMORY_OPT -void ivas_buffer_serial_to_parallel( +void ivas_buffer_interleaved_to_deinterleaved( float *audio, /* i/o: audio buffer */ const int16_t n_channels, /* i : number of channels */ const int16_t frame_length, /* i : frame length (one channel ) */ const int16_t n_samp_full /* i : full frame length (one channel) */ ); +void ivas_buffer_deinterleaved_to_interleaved( + float *audio[], /* i : deinterleaved audio buffer */ + const int16_t n_channels, /* i : number of channels */ + const int16_t frame_length, /* i : frame length (one channel ) */ + float *audio_out /* o : interleaved audio buffer */ +); +#else +void ivas_syn_output_f( + float *synth[], /* i/o: float synthesis signal */ + const int16_t output_frame, /* i : output frame length (one channel) */ + const int16_t n_channels, /* i : number of output channels */ + float *synth_out /* o : integer 16 bits synthesis signal */ +); #endif + void ivas_initialize_handles_enc( Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ ); diff --git a/lib_com/ivas_tools.c b/lib_com/ivas_tools.c index 452ca6ae69..215706a871 100644 --- a/lib_com/ivas_tools.c +++ b/lib_com/ivas_tools.c @@ -151,12 +151,12 @@ uint32_t ivas_syn_output( #ifdef JBM_MEMORY_OPT /*-------------------------------------------------------------------* - * ivas_buffer_serial_to_parallel() + * ivas_buffer_interleaved_to_deinterleaved() * - * reshuffle an interleaved serial buffer to one-by-one audio channels representation + * Convert an interleaved buffer of audio channels to deinterleaved one *-------------------------------------------------------------------*/ -void ivas_buffer_serial_to_parallel( +void ivas_buffer_interleaved_to_deinterleaved( float *audio, /* i/o: audio buffer */ const int16_t n_channels, /* i : number of channels */ const int16_t frame_length, /* i : frame length (one channel ) */ @@ -184,7 +184,34 @@ void ivas_buffer_serial_to_parallel( return; } -#endif + +/*-------------------------------------------------------------------* + * ivas_buffer_deinterleaved_to_interleaved() + * + * Convert a deinterleaved buffer of audio channels to interleaved one + *-------------------------------------------------------------------*/ + +void ivas_buffer_deinterleaved_to_interleaved( + float *audio[], /* i/o: deinterleaved audio buffer */ + const int16_t n_channels, /* i : number of channels */ + const int16_t frame_length, /* i : frame length (one channel ) */ + float *audio_out /* o : interleaved audio buffer */ +) +{ + int16_t ch, m; + + for ( ch = 0; ch < n_channels; ch++ ) + { + for ( m = 0; m < frame_length; m++ ) + { + audio_out[m * n_channels + ch] = audio[ch][m]; + } + } + + return; +} + +#else /*-------------------------------------------------------------------* * ivas_syn_output_f() @@ -218,6 +245,7 @@ void ivas_syn_output_f( return; } +#endif /*-------------------------------------------------------------------* * mvr2r_inc() diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index d8d25854e0..76fcfaf81c 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -784,7 +784,6 @@ void ivas_jbm_dec_feed_tc_to_renderer( int16_t n_samples_still_available; int16_t n_ch_full_copy, n_ch_res_copy; - hTcBuffer = st_ivas->hTcBuffer; n_samples_still_available = hTcBuffer->n_samples_buffered - hTcBuffer->n_samples_rendered; hTcBuffer->n_samples_buffered = n_samples_still_available + nSamplesForRendering + hTcBuffer->n_samples_discard; hTcBuffer->n_samples_available = hTcBuffer->n_samples_granularity * ( hTcBuffer->n_samples_buffered / hTcBuffer->n_samples_granularity ); @@ -796,7 +795,7 @@ void ivas_jbm_dec_feed_tc_to_renderer( { mvr2r( hTcBuffer->tc[ch], tmp_buf, nSamplesForRendering ); set_zero( hTcBuffer->tc[ch], hTcBuffer->n_samples_discard ); - mvr2r( st_ivas->hTcBuffer->tc_buffer_old[ch], st_ivas->hTcBuffer->tc[ch] + st_ivas->hTcBuffer->n_samples_discard, n_samples_still_available ); + mvr2r( hTcBuffer->tc_buffer_old[ch], hTcBuffer->tc[ch] + hTcBuffer->n_samples_discard, n_samples_still_available ); mvr2r( tmp_buf, hTcBuffer->tc[ch] + n_samples_still_available + hTcBuffer->n_samples_discard, nSamplesForRendering - *nSamplesResidual ); mvr2r( tmp_buf + nSamplesForRendering - *nSamplesResidual, hTcBuffer->tc_buffer_old[ch], *nSamplesResidual ); } @@ -807,7 +806,7 @@ void ivas_jbm_dec_feed_tc_to_renderer( { p_data_f[ch - n_ch_full_copy] = hTcBuffer->tc[ch]; mvr2r( hTcBuffer->tc[ch], tmp_buf, nSamplesForRendering ); - mvr2r( st_ivas->hTcBuffer->tc_buffer_old[ch], p_data_f[ch], n_samples_still_available ); + mvr2r( hTcBuffer->tc_buffer_old[ch], p_data_f[ch], n_samples_still_available ); mvr2r( tmp_buf, p_data_f[ch] + n_samples_still_available, nSamplesForRendering - *nSamplesResidual ); mvr2r( tmp_buf + nSamplesForRendering - *nSamplesResidual, hTcBuffer->tc_buffer_old[ch], *nSamplesResidual ); } @@ -864,7 +863,7 @@ void ivas_jbm_dec_feed_tc_to_renderer( } #ifdef JBM_MEMORY_OPT - for ( n = 0; n < max( st_ivas->hTcBuffer->nchan_transport_jbm, st_ivas->hTcBuffer->nchan_buffer_full ); n++ ) + for ( n = 0; n < max( hTcBuffer->nchan_transport_jbm, hTcBuffer->nchan_buffer_full ); n++ ) #else for ( n = 0; n < ivas_get_nchan_buffers_dec( st_ivas, st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); n++ ) #endif @@ -1397,7 +1396,11 @@ ivas_error ivas_jbm_dec_render( break; case PCM_FLOAT32: +#ifdef JBM_MEMORY_OPT + ivas_buffer_deinterleaved_to_interleaved( p_output, nchan_out_syn_output, *nSamplesRendered, (float *) data ); +#else ivas_syn_output_f( p_output, *nSamplesRendered, nchan_out_syn_output, (float *) data ); +#endif break; default: error = IVAS_ERR_UNKNOWN; @@ -1679,7 +1682,11 @@ ivas_error ivas_jbm_dec_flush_renderer( ivas_syn_output( p_output, *nSamplesRendered, st_ivas->hDecoderConfig->nchan_out, (int16_t *) data ); break; case PCM_FLOAT32: +#ifdef JBM_MEMORY_OPT + ivas_buffer_deinterleaved_to_interleaved( p_output, st_ivas->hDecoderConfig->nchan_out, *nSamplesRendered, (float *) data ); +#else ivas_syn_output_f( p_output, *nSamplesRendered, st_ivas->hDecoderConfig->nchan_out, (float *) data ); +#endif break; default: error = IVAS_ERR_UNKNOWN; diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 559d0c598c..bbfebbf7d2 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -1206,13 +1206,13 @@ ivas_error IVAS_DEC_GetSamplesDecoder( } #ifdef JBM_MEMORY_OPT - /* reshuffle one-by-one decoded TC audio channels to an interleaved serial buffer */ - ivas_syn_output_f( st_ivas->p_output_f, hIvasDec->nSamplesFrame, nTransportChannels, st_ivas->hTcBuffer->tc_buffer ); + /* convert deinterleaved decoded TC audio channels buffer to an interleaved one */ + ivas_buffer_deinterleaved_to_interleaved( st_ivas->p_output_f, nTransportChannels, hIvasDec->nSamplesFrame, st_ivas->hTcBuffer->tc_buffer ); /* time scale modification */ if ( apa_exec( hIvasDec->hTimeScaler, st_ivas->hTcBuffer->tc_buffer, hIvasDec->nSamplesFrame * nTransportChannels, (uint16_t) hIvasDec->tsm_max_scaling, st_ivas->hTcBuffer->tc_buffer, &nTimeScalerOutSamples ) != 0 ) #else - ivas_syn_output_f( hIvasDec->st_ivas->p_output_f, hIvasDec->nSamplesFrame, nTransportChannels, hIvasDec->apaExecBuffer ); + ivas_syn_output_f( st_ivas->p_output_f, hIvasDec->nSamplesFrame, nTransportChannels, hIvasDec->apaExecBuffer ); if ( apa_exec( hIvasDec->hTimeScaler, hIvasDec->apaExecBuffer, hIvasDec->nSamplesFrame * nTransportChannels, (uint16_t) hIvasDec->tsm_max_scaling, hIvasDec->apaExecBuffer, &nTimeScalerOutSamples ) != 0 ) #endif @@ -1225,8 +1225,8 @@ ivas_error IVAS_DEC_GetSamplesDecoder( hIvasDec->timeScalingDone = 1; #ifdef JBM_MEMORY_OPT - /* reshuffle interleaved serial buffer to one-by-one time-scaled TC audio channels */ - ivas_buffer_serial_to_parallel( st_ivas->hTcBuffer->tc_buffer, nTransportChannels, nSamplesTcsScaled, NS2SA( st_ivas->hDecoderConfig->output_Fs, MAX_JBM_L_FRAME_NS ) ); + /* convert interleaved time-scaled TC audio channels buffer to deinterleaved one */ + ivas_buffer_interleaved_to_deinterleaved( st_ivas->hTcBuffer->tc_buffer, nTransportChannels, nSamplesTcsScaled, NS2SA( st_ivas->hDecoderConfig->output_Fs, MAX_JBM_L_FRAME_NS ) ); #endif } else @@ -1244,7 +1244,7 @@ ivas_error IVAS_DEC_GetSamplesDecoder( ivas_jbm_dec_feed_tc_to_renderer( st_ivas, nSamplesTcsScaled, &nResidualSamples, hIvasDec->apaExecBuffer ); #endif - if ( hIvasDec->st_ivas->hDecoderConfig->Opt_tsm ) + if ( st_ivas->hDecoderConfig->Opt_tsm ) { /* feed residual samples to TSM for the next call */ if ( apa_set_renderer_residual_samples( hIvasDec->hTimeScaler, (uint16_t) nResidualSamples ) != 0 ) -- GitLab From 55a835c77ca04acefd17eaef358b39d02bd31423 Mon Sep 17 00:00:00 2001 From: vaclav Date: Mon, 26 May 2025 19:40:15 +0200 Subject: [PATCH 27/29] clang-format --- lib_com/ivas_tools.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_com/ivas_tools.c b/lib_com/ivas_tools.c index 215706a871..47fc3f0153 100644 --- a/lib_com/ivas_tools.c +++ b/lib_com/ivas_tools.c @@ -153,7 +153,7 @@ uint32_t ivas_syn_output( /*-------------------------------------------------------------------* * ivas_buffer_interleaved_to_deinterleaved() * - * Convert an interleaved buffer of audio channels to deinterleaved one + * Convert an interleaved buffer of audio channels to deinterleaved one *-------------------------------------------------------------------*/ void ivas_buffer_interleaved_to_deinterleaved( @@ -188,7 +188,7 @@ void ivas_buffer_interleaved_to_deinterleaved( /*-------------------------------------------------------------------* * ivas_buffer_deinterleaved_to_interleaved() * - * Convert a deinterleaved buffer of audio channels to interleaved one + * Convert a deinterleaved buffer of audio channels to interleaved one *-------------------------------------------------------------------*/ void ivas_buffer_deinterleaved_to_interleaved( -- GitLab From 80f1cbf4642ce1401b4069e245b37146f98dce2a Mon Sep 17 00:00:00 2001 From: vaclav Date: Mon, 2 Jun 2025 11:31:14 +0200 Subject: [PATCH 28/29] address reviewer comments --- lib_com/common_api_types.h | 3 --- lib_com/ivas_cnst.h | 4 ++-- lib_dec/ivas_jbm_dec.c | 2 +- lib_dec/jbm_pcmdsp_apa.h | 4 ++-- 4 files changed, 5 insertions(+), 8 deletions(-) diff --git a/lib_com/common_api_types.h b/lib_com/common_api_types.h index eddd7815fd..dd1f707ffb 100644 --- a/lib_com/common_api_types.h +++ b/lib_com/common_api_types.h @@ -64,9 +64,6 @@ /* JBM constants for adaptive-playout */ #define IVAS_TIME_SCALE_MIN 50 /* min. time-scaling [%] */ #define IVAS_TIME_SCALE_MAX 150 /* max. time-scaling [%] */ -#ifdef JBM_MEMORY_OPT -#define IVAS_TIME_SCALE_MAX_FRAME_SIZE ( 2 * IVAS_MAX_FRAME_SIZE ) /* max. time-scaled frame buffer length (per channel) in samples */ -#endif /*----------------------------------------------------------------------------------* diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index af0566beb3..6efd67fd39 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -173,8 +173,8 @@ typedef enum #define MAX_JBM_CLDFB_TIMESLOTS 32 #define DEFAULT_JBM_CLDFB_TIMESLOTS 16 #ifdef JBM_MEMORY_OPT -#define MAX_JBM_L_FRAME48k IVAS_TIME_SCALE_MAX_FRAME_SIZE /* 1920: max. time-scaled frame buffer length (per channel) in samples */ -#define MAX_JBM_L_FRAME_NS 40000000L /* 40 ms: time-scaled frame size in ns, proportional to IVAS_TIME_SCALE_MAX_FRAME_SIZE */ +#define MAX_JBM_L_FRAME48k ( IVAS_MAX_FRAME_SIZE * 2 ) /* 1920: max. time-scaled frame buffer length (per channel) in samples */ +#define MAX_JBM_L_FRAME_NS 40000000L /* 40 ms: time-scaled frame size in ns, proportional to MAX_JBM_L_FRAME48k */ #else #define MAX_JBM_L_FRAME48k 1920 #define MAX_JBM_L_FRAME_NS 40000000L diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 467a68afa4..f9a51694f3 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -804,7 +804,7 @@ void ivas_jbm_dec_feed_tc_to_renderer( { for ( ; ch < hTcBuffer->nchan_transport_jbm; ch++ ) { - p_data_f[ch - n_ch_full_copy] = hTcBuffer->tc[ch]; + p_data_f[ch] = hTcBuffer->tc[ch]; mvr2r( hTcBuffer->tc[ch], tmp_buf, nSamplesForRendering ); mvr2r( hTcBuffer->tc_buffer_old[ch], p_data_f[ch], n_samples_still_available ); mvr2r( tmp_buf, p_data_f[ch] + n_samples_still_available, nSamplesForRendering - *nSamplesResidual ); diff --git a/lib_dec/jbm_pcmdsp_apa.h b/lib_dec/jbm_pcmdsp_apa.h index 46f623f468..6d35fa8b50 100644 --- a/lib_dec/jbm_pcmdsp_apa.h +++ b/lib_dec/jbm_pcmdsp_apa.h @@ -51,8 +51,8 @@ /* size of IO buffers (a_in[], a_out[]) for apa_exec() */ #ifdef JBM_MEMORY_OPT -#define APA_BUF_PER_CHANNEL IVAS_TIME_SCALE_MAX_FRAME_SIZE -#define APA_MAX_NUM_CHANNELS ( 12 ) /* == MAX_TRANSPORT_CHANNELS */ +#define APA_BUF_PER_CHANNEL ( IVAS_MAX_FRAME_SIZE * 2 ) /* == twice the max. frame length */ +#define APA_MAX_NUM_CHANNELS ( 12 ) /* == MAX_TRANSPORT_CHANNELS */ #else #define APA_BUF_PER_CHANNEL ( IVAS_MAX_FRAME_SIZE * 3 ) #define APA_MAX_NUM_CHANNELS 16 -- GitLab From 4f831ea585df5217769da24650b0059280ad7c28 Mon Sep 17 00:00:00 2001 From: vaclav Date: Mon, 2 Jun 2025 12:53:58 +0200 Subject: [PATCH 29/29] fix merge issue --- lib_dec/ivas_jbm_dec.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index f9a51694f3..31e6178c48 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -863,7 +863,11 @@ void ivas_jbm_dec_feed_tc_to_renderer( } #ifdef FIX_NCHAN_BUFFERS +#ifdef JBM_MEMORY_OPT + ch = max( hTcBuffer->nchan_transport_jbm, hTcBuffer->nchan_buffer_full ); +#else ch = ivas_get_nchan_buffers_dec( st_ivas, st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); +#endif for ( n = 0; n < ch; n++ ) #else for ( n = 0; n < ivas_get_nchan_buffers_dec( st_ivas, st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); n++ ) -- GitLab