From f45b1a13b8b5bea501939a0652bc05958b2a98c6 Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Fri, 30 Jan 2026 14:51:57 +0100 Subject: [PATCH 1/8] Keep TC channel pointers in one constant place during decoding and rendering --- lib_com/ivas_prot_fx.h | 13 ++++++++++++ lib_com/ivas_tools_fx.c | 41 ++++++++++++++++++++++++++++++++++++ lib_com/options.h | 1 + lib_dec/ivas_dec_fx.c | 3 +++ lib_dec/ivas_dec_render_fx.c | 2 ++ lib_dec/ivas_stat_dec.h | 3 +++ lib_dec/lib_dec_fx.c | 8 +++++++ 7 files changed, 71 insertions(+) diff --git a/lib_com/ivas_prot_fx.h b/lib_com/ivas_prot_fx.h index 4e380b17c..c970406f4 100644 --- a/lib_com/ivas_prot_fx.h +++ b/lib_com/ivas_prot_fx.h @@ -2064,15 +2064,28 @@ void ivas_buffer_interleaved_to_deinterleaved_fx( Word32 *audio, /* i/o: audio buffer */ const Word16 n_channels, /* i : number of channels */ const Word16 frame_length, /* i : frame length (one channel) */ +#ifdef FIX_2396_CONSTANT_STRIDE_IN_TC_BUFFER + const Word16 deinterleaved_stride /* i : offset between subsequent channels in deinterleaved layout */ +#else const Word16 n_samp_full /* i : full frame length (one channel) */ +#endif ); +#ifdef FIX_2396_CONSTANT_STRIDE_IN_TC_BUFFER +void ivas_buffer_deinterleaved_to_interleaved_fx( + Word32 *audio, /* i/o: audio buffer */ + const Word16 n_channels, /* i : number of channels */ + const Word16 frame_length, /* i : frame length (one channel) */ + const Word16 deinterleaved_stride /* i : offset between subsequent channels in deinterleaved layout */ +); +#else void ivas_buffer_deinterleaved_to_interleaved_fx( Word32 *audio[], /* i : deinterleaved audio buffer */ const Word16 n_channels, /* i : number of channels */ const Word16 frame_length, /* i : frame length (one channel) */ Word32 *audio_out /* o : interleaved audio buffer */ ); +#endif void stereo_tcx_core_dec_fx( Decoder_State *st, /* i/o: decoder state structure */ diff --git a/lib_com/ivas_tools_fx.c b/lib_com/ivas_tools_fx.c index 52a84a92d..05d950b43 100644 --- a/lib_com/ivas_tools_fx.c +++ b/lib_com/ivas_tools_fx.c @@ -164,7 +164,11 @@ void ivas_buffer_interleaved_to_deinterleaved_fx( Word32 *audio, /* i/o: audio buffer */ const Word16 n_channels, /* i : number of channels */ const Word16 frame_length, /* i : frame length (one channel) */ +#ifdef FIX_2396_CONSTANT_STRIDE_IN_TC_BUFFER + const Word16 deinterleaved_stride /* i : offset between subsequent channels in deinterleaved layout */ +#else const Word16 n_samp_full /* i : full frame length (one channel) */ +#endif ) { Word16 offset, ch, m; @@ -184,7 +188,11 @@ void ivas_buffer_interleaved_to_deinterleaved_fx( FOR( ch = 0; ch < n_channels; ch++ ) { Copy32( buffer[ch], audio + offset, frame_length ); +#ifdef FIX_2396_CONSTANT_STRIDE_IN_TC_BUFFER + offset = add( offset, deinterleaved_stride ); +#else offset = add( offset, n_samp_full ); +#endif } return; @@ -197,6 +205,38 @@ void ivas_buffer_interleaved_to_deinterleaved_fx( * Convert a deinterleaved buffer of audio channels to interleaved one *-------------------------------------------------------------------*/ +#ifdef FIX_2396_CONSTANT_STRIDE_IN_TC_BUFFER +void ivas_buffer_deinterleaved_to_interleaved_fx( + Word32 *audio, /* i/o: audio buffer */ + const Word16 n_channels, /* i : number of channels */ + const Word16 frame_length, /* i : frame length (one channel) */ + const Word16 deinterleaved_stride /* i : offset between subsequent channels in deinterleaved layout */ +) +{ + Word16 offset, ch, m; + Word32 buffer[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS][L_FRAME48k]; + + offset = 0; + move16(); + FOR( ch = 0; ch < n_channels; ch++ ) + { + Copy32( audio + offset, buffer[ch], frame_length ); + offset = add( offset, deinterleaved_stride ); + } + + + FOR( ch = 0; ch < n_channels; ch++ ) + { + FOR( m = 0; m < frame_length; m++ ) + { + audio[m * n_channels + ch] = buffer[ch][m]; + move32(); + } + } + + return; +} +#else void ivas_buffer_deinterleaved_to_interleaved_fx( Word32 *audio[], /* i/o: deinterleaved audio buffer */ const Word16 n_channels, /* i : number of channels */ @@ -224,6 +264,7 @@ void ivas_buffer_deinterleaved_to_interleaved_fx( return; } +#endif /*-------------------------------------------------------------------* diff --git a/lib_com/options.h b/lib_com/options.h index b584b6931..83bac531a 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -107,6 +107,7 @@ #define FIX_2383_INIT_Q_A_ITF /* FhG: Initialize Q_A_itf, to avoid reading of uninitialized memory in case ITF is not triggered */ #define FIX_2382_COPY_AQ_IN_MCT /* FhG: basop issue 2382: 2nd instance of prevent copying uninitialized values from Aq_fx[][] to Aq_fx_32[][] in TCX */ #define FIX_2391_INIT_HQ_GENERIC_OFFSET /* FhG/Eri: basop issue 2391: make sure hq_generic_offset is initialized inside hq_hr_dec_fx() */ +#define FIX_2396_CONSTANT_STRIDE_IN_TC_BUFFER /* FhG/VA: basop issue 2396: keep TC channel pointers in one constant place during decoding and rendering */ /* #################### End BE switches ################################## */ diff --git a/lib_dec/ivas_dec_fx.c b/lib_dec/ivas_dec_fx.c index bd3eab3e4..a9fab7a06 100644 --- a/lib_dec/ivas_dec_fx.c +++ b/lib_dec/ivas_dec_fx.c @@ -1262,6 +1262,9 @@ static ivas_error ivas_dec_tc_audio_allocate_fx( move16(); } +#ifdef FIX_2396_CONSTANT_STRIDE_IN_TC_BUFFER + hTcBuffer->tc_stride = n_samp_full; +#endif nsamp_to_allocate = imult1616( s_max( hTcBuffer->nchan_transport_rend, hTcBuffer->nchan_buffer_full ), n_samp_full ); IF( Opt_tsm ) diff --git a/lib_dec/ivas_dec_render_fx.c b/lib_dec/ivas_dec_render_fx.c index 5b685edd4..1dc05fddd 100644 --- a/lib_dec/ivas_dec_render_fx.c +++ b/lib_dec/ivas_dec_render_fx.c @@ -109,6 +109,7 @@ void ivas_dec_feed_tc_to_renderer_fx( n_ch_full_copy = s_min( hTcBuffer->nchan_transport_rend, hTcBuffer->nchan_buffer_full ); n_ch_res_copy = sub( hTcBuffer->nchan_transport_rend, hTcBuffer->nchan_buffer_full ); +#ifndef FIX_2396_CONSTANT_STRIDE_IN_TC_BUFFER /* buffers are shared between 'hTcBuffer->tc[]' and 'p_output_f[]': in case of 'length(hTcBuffer->tc[]) < length(p_output_f[])', reset of TC buffer pointers is needed after ivas_buffer_interleaved_to_deinterleaved() */ @@ -125,6 +126,7 @@ void ivas_dec_feed_tc_to_renderer_fx( } } +#endif FOR( ch = 0; ch < n_ch_full_copy; ch++ ) { Copy32( hTcBuffer->tc_fx[ch], tmp_buf_fx, nSamplesForRendering ); diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index 1f406c338..56a111357 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -1001,6 +1001,9 @@ typedef struct decoder_tc_buffer_structure Word32 *tc_buffer_old_fx[MAX_INTERN_CHANNELS]; /* TC audio samples not rendered in the previous frame */ Word32 *tc_buffer_fx; /* the buffer itself */ Word32 *tc_fx[MAX_INTERN_CHANNELS]; /* pointers into the buffer to the beginning of each tc */ +#ifdef FIX_2396_CONSTANT_STRIDE_IN_TC_BUFFER + Word16 tc_stride; /* Stride (offset) between subsequent channel pointers in tc_fx */ +#endif Word16 q_tc_fx; /* TC channels Q-factor */ TC_BUFFER_MODE tc_buffer_mode; /* mode of the buffer (no buffering, render buffering, out buffering) */ Word16 nchan_transport_rend; /* number of TCs provided to the renderer */ diff --git a/lib_dec/lib_dec_fx.c b/lib_dec/lib_dec_fx.c index d1e5fc209..1c447a905 100644 --- a/lib_dec/lib_dec_fx.c +++ b/lib_dec/lib_dec_fx.c @@ -3934,7 +3934,11 @@ ivas_error IVAS_DEC_GetSamplesDecoder( } /* convert deinterleaved decoded TC audio channels buffer to an interleaved one */ +#ifdef FIX_2396_CONSTANT_STRIDE_IN_TC_BUFFER + ivas_buffer_deinterleaved_to_interleaved_fx( st_ivas->hTcBuffer->tc_buffer_fx, nTransportChannels, hIvasDec->nSamplesFrame, st_ivas->hTcBuffer->tc_stride ); +#else ivas_buffer_deinterleaved_to_interleaved_fx( st_ivas->p_output_fx, nTransportChannels, hIvasDec->nSamplesFrame, st_ivas->hTcBuffer->tc_buffer_fx ); +#endif IF( EQ_16( (Word16) hIvasDec->mode, IVAS_DEC_MODE_EVS ) ) { @@ -3954,7 +3958,11 @@ ivas_error IVAS_DEC_GetSamplesDecoder( move16(); /* convert interleaved time-scaled TC audio channels buffer to deinterleaved one */ +#ifdef FIX_2396_CONSTANT_STRIDE_IN_TC_BUFFER + ivas_buffer_interleaved_to_deinterleaved_fx( st_ivas->hTcBuffer->tc_buffer_fx, nTransportChannels, nSamplesTcsScaled, st_ivas->hTcBuffer->tc_stride ); +#else ivas_buffer_interleaved_to_deinterleaved_fx( st_ivas->hTcBuffer->tc_buffer_fx, nTransportChannels, nSamplesTcsScaled, NS2SA( st_ivas->hDecoderConfig->output_Fs, MAX_JBM_L_FRAME_NS ) ); +#endif } else { -- GitLab From 508be0e23f5f33dfc09739b95d63bc0a11fdd08b Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Fri, 30 Jan 2026 14:59:28 +0100 Subject: [PATCH 2/8] Fix formatting --- lib_com/ivas_tools_fx.c | 12 ++++++------ lib_dec/ivas_stat_dec.h | 20 ++++++++++---------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/lib_com/ivas_tools_fx.c b/lib_com/ivas_tools_fx.c index 05d950b43..48543975e 100644 --- a/lib_com/ivas_tools_fx.c +++ b/lib_com/ivas_tools_fx.c @@ -165,9 +165,9 @@ void ivas_buffer_interleaved_to_deinterleaved_fx( const Word16 n_channels, /* i : number of channels */ const Word16 frame_length, /* i : frame length (one channel) */ #ifdef FIX_2396_CONSTANT_STRIDE_IN_TC_BUFFER - const Word16 deinterleaved_stride /* i : offset between subsequent channels in deinterleaved layout */ + const Word16 deinterleaved_stride /* i : offset between subsequent channels in deinterleaved layout */ #else - const Word16 n_samp_full /* i : full frame length (one channel) */ + const Word16 n_samp_full /* i : full frame length (one channel) */ #endif ) { @@ -207,10 +207,10 @@ void ivas_buffer_interleaved_to_deinterleaved_fx( #ifdef FIX_2396_CONSTANT_STRIDE_IN_TC_BUFFER void ivas_buffer_deinterleaved_to_interleaved_fx( - Word32 *audio, /* i/o: audio buffer */ - const Word16 n_channels, /* i : number of channels */ - const Word16 frame_length, /* i : frame length (one channel) */ - const Word16 deinterleaved_stride /* i : offset between subsequent channels in deinterleaved layout */ + Word32 *audio, /* i/o: audio buffer */ + const Word16 n_channels, /* i : number of channels */ + const Word16 frame_length, /* i : frame length (one channel) */ + const Word16 deinterleaved_stride /* i : offset between subsequent channels in deinterleaved layout */ ) { Word16 offset, ch, m; diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index 56a111357..cfa5b41bf 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -1002,17 +1002,17 @@ typedef struct decoder_tc_buffer_structure Word32 *tc_buffer_fx; /* the buffer itself */ Word32 *tc_fx[MAX_INTERN_CHANNELS]; /* pointers into the buffer to the beginning of each tc */ #ifdef FIX_2396_CONSTANT_STRIDE_IN_TC_BUFFER - Word16 tc_stride; /* Stride (offset) between subsequent channel pointers in tc_fx */ + Word16 tc_stride; /* Stride (offset) between subsequent channel pointers in tc_fx */ #endif - Word16 q_tc_fx; /* TC channels Q-factor */ - TC_BUFFER_MODE tc_buffer_mode; /* mode of the buffer (no buffering, render buffering, out buffering) */ - Word16 nchan_transport_rend; /* number of TCs provided to the renderer */ - Word16 nchan_transport_internal; /* total number of TC buffer channels, can include e.g. TD decorr data */ - Word16 nchan_buffer_full; /* number of channels to be fully buffered */ - Word16 n_samples_available; /* samples still available for rendering in the current frame */ - Word16 n_samples_buffered; /* full number of samples in the buffer (including spill to next frame) */ - Word16 n_samples_rendered; /* samples already rendered in the current frame */ - Word16 n_samples_granularity; /* render granularity */ + Word16 q_tc_fx; /* TC channels Q-factor */ + TC_BUFFER_MODE tc_buffer_mode; /* mode of the buffer (no buffering, render buffering, out buffering) */ + Word16 nchan_transport_rend; /* number of TCs provided to the renderer */ + Word16 nchan_transport_internal; /* total number of TC buffer channels, can include e.g. TD decorr data */ + Word16 nchan_buffer_full; /* number of channels to be fully buffered */ + Word16 n_samples_available; /* samples still available for rendering in the current frame */ + Word16 n_samples_buffered; /* full number of samples in the buffer (including spill to next frame) */ + Word16 n_samples_rendered; /* samples already rendered in the current frame */ + Word16 n_samples_granularity; /* render granularity */ Word16 n_samples_flushed; Word16 subframe_nbslots[MAX_JBM_SUBFRAMES_5MS]; Word16 nb_subframes; -- GitLab From 559fd9f2ff44d65c83eb5e10c28c97d21922f7da Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Fri, 30 Jan 2026 15:03:15 +0100 Subject: [PATCH 3/8] Remove unused variables --- lib_dec/ivas_dec_render_fx.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib_dec/ivas_dec_render_fx.c b/lib_dec/ivas_dec_render_fx.c index 1dc05fddd..93e30218b 100644 --- a/lib_dec/ivas_dec_render_fx.c +++ b/lib_dec/ivas_dec_render_fx.c @@ -83,8 +83,12 @@ void ivas_dec_feed_tc_to_renderer_fx( { Word32 tmp_buf_fx[MAX_JBM_L_FRAME48k]; Word32 *p_data_fx[FOA_CHANNELS + MAX_NUM_OBJECTS]; +#ifdef FIX_2396_CONSTANT_STRIDE_IN_TC_BUFFER + Word16 n, n_render_timeslots, n_ch_cldfb, ch; +#else Word16 n, n_render_timeslots, n_ch_cldfb; Word16 ch, offset, len_offset; +#endif DECODER_TC_BUFFER_HANDLE hTcBuffer; hTcBuffer = st_ivas->hTcBuffer; -- GitLab From a8c09bd05266af40fe944bcdaca6d61cb75d2074 Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Fri, 30 Jan 2026 15:33:43 +0100 Subject: [PATCH 4/8] Move switch to non-BE section: FIX_2396_CONSTANT_STRIDE_IN_TC_BUFFER --- lib_com/options.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 83bac531a..59700e19c 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -107,7 +107,6 @@ #define FIX_2383_INIT_Q_A_ITF /* FhG: Initialize Q_A_itf, to avoid reading of uninitialized memory in case ITF is not triggered */ #define FIX_2382_COPY_AQ_IN_MCT /* FhG: basop issue 2382: 2nd instance of prevent copying uninitialized values from Aq_fx[][] to Aq_fx_32[][] in TCX */ #define FIX_2391_INIT_HQ_GENERIC_OFFSET /* FhG/Eri: basop issue 2391: make sure hq_generic_offset is initialized inside hq_hr_dec_fx() */ -#define FIX_2396_CONSTANT_STRIDE_IN_TC_BUFFER /* FhG/VA: basop issue 2396: keep TC channel pointers in one constant place during decoding and rendering */ /* #################### End BE switches ################################## */ @@ -119,6 +118,7 @@ #define FIX_BASOP_2317_UNINIT_VALUE_IN_STEREO_CNG /* Eri: Basop issue 2317: Uninitialized value read in case of DTX and BW switching */ #define FIX_1283_STEREO_DFT_COLLAPSE /* FhG: float issue 1283: fix for critical issue with DFT stereo core coder */ #define FIX_2379_REMOVE_previoussynth_fx_32 /* VA: basop issue 2379: remove duplicated buffer st->previoussynth_fx_32[] */ +#define FIX_2396_CONSTANT_STRIDE_IN_TC_BUFFER /* FhG/VA: basop issue 2396: keep TC channel pointers in one constant place during decoding and rendering */ /* ##################### End NON-BE switches ########################### */ -- GitLab From 112f7d6ee3e6ccfb122b7b691a690889c1128cbb Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Fri, 30 Jan 2026 15:43:58 +0100 Subject: [PATCH 5/8] Add missing move16() --- lib_dec/ivas_dec_fx.c | 1 + 1 file changed, 1 insertion(+) diff --git a/lib_dec/ivas_dec_fx.c b/lib_dec/ivas_dec_fx.c index a9fab7a06..959b4bb45 100644 --- a/lib_dec/ivas_dec_fx.c +++ b/lib_dec/ivas_dec_fx.c @@ -1264,6 +1264,7 @@ static ivas_error ivas_dec_tc_audio_allocate_fx( #ifdef FIX_2396_CONSTANT_STRIDE_IN_TC_BUFFER hTcBuffer->tc_stride = n_samp_full; + move16(); #endif nsamp_to_allocate = imult1616( s_max( hTcBuffer->nchan_transport_rend, hTcBuffer->nchan_buffer_full ), n_samp_full ); -- GitLab From 6941a77d7ec8afcdade175d94adb0b2ddfa22926 Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Fri, 30 Jan 2026 15:44:40 +0100 Subject: [PATCH 6/8] Whitespace changes --- lib_com/ivas_tools_fx.c | 1 - 1 file changed, 1 deletion(-) diff --git a/lib_com/ivas_tools_fx.c b/lib_com/ivas_tools_fx.c index 48543975e..90f538739 100644 --- a/lib_com/ivas_tools_fx.c +++ b/lib_com/ivas_tools_fx.c @@ -224,7 +224,6 @@ void ivas_buffer_deinterleaved_to_interleaved_fx( offset = add( offset, deinterleaved_stride ); } - FOR( ch = 0; ch < n_channels; ch++ ) { FOR( m = 0; m < frame_length; m++ ) -- GitLab From cad35b811d2fd528d1236f73ba00d95bbd7762d2 Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Fri, 30 Jan 2026 16:34:45 +0100 Subject: [PATCH 7/8] Align fix with float repo --- lib_com/ivas_prot_fx.h | 21 ++++++++----- lib_com/ivas_tools_fx.c | 68 ++++++++++++++++++++++++++++------------- lib_dec/ivas_dec_fx.c | 4 --- lib_dec/ivas_stat_dec.h | 21 ++++++------- lib_dec/lib_dec_fx.c | 4 +-- 5 files changed, 71 insertions(+), 47 deletions(-) diff --git a/lib_com/ivas_prot_fx.h b/lib_com/ivas_prot_fx.h index c970406f4..2d66e6c17 100644 --- a/lib_com/ivas_prot_fx.h +++ b/lib_com/ivas_prot_fx.h @@ -2060,23 +2060,28 @@ UWord32 ivas_syn_output_fx( Word16 *synth_out /* o : integer 16 bits synthesis signal */ ); +#ifdef FIX_2396_CONSTANT_STRIDE_IN_TC_BUFFER +void ivas_buffer_interleaved_to_deinterleaved_fx( + Word32 *audio_in, /* i : interleaved audio buffer */ + Word32 *audio_out[], /* o : pointers to each channel of deinterleaved audio buffer */ + const Word16 n_channels, /* i : number of channels */ + const Word16 frame_length /* i : frame length (one channel) */ +); +#else void ivas_buffer_interleaved_to_deinterleaved_fx( Word32 *audio, /* i/o: audio buffer */ const Word16 n_channels, /* i : number of channels */ const Word16 frame_length, /* i : frame length (one channel) */ -#ifdef FIX_2396_CONSTANT_STRIDE_IN_TC_BUFFER - const Word16 deinterleaved_stride /* i : offset between subsequent channels in deinterleaved layout */ -#else const Word16 n_samp_full /* i : full frame length (one channel) */ -#endif ); +#endif #ifdef FIX_2396_CONSTANT_STRIDE_IN_TC_BUFFER void ivas_buffer_deinterleaved_to_interleaved_fx( - Word32 *audio, /* i/o: audio buffer */ - const Word16 n_channels, /* i : number of channels */ - const Word16 frame_length, /* i : frame length (one channel) */ - const Word16 deinterleaved_stride /* i : offset between subsequent channels in deinterleaved layout */ + Word32 *audio_in[], /* i : pointers to each channel of deinterleaved audio buffer */ + Word32 *audio_out, /* o : interleaved audio buffer */ + const Word16 n_channels, /* i : number of channels */ + const Word16 frame_length /* i : frame length (one channel) */ ); #else void ivas_buffer_deinterleaved_to_interleaved_fx( diff --git a/lib_com/ivas_tools_fx.c b/lib_com/ivas_tools_fx.c index 90f538739..14a9cc955 100644 --- a/lib_com/ivas_tools_fx.c +++ b/lib_com/ivas_tools_fx.c @@ -160,15 +160,43 @@ UWord32 ivas_syn_output_fx( * Convert an interleaved buffer of audio channels to deinterleaved one *-------------------------------------------------------------------*/ +#ifdef FIX_2396_CONSTANT_STRIDE_IN_TC_BUFFER +void ivas_buffer_interleaved_to_deinterleaved_fx( + Word32 *audio_in, /* i : interleaved audio buffer */ + Word32 *audio_out[], /* o : pointers to each channel of deinterleaved audio buffer */ + const Word16 n_channels, /* i : number of channels */ + const Word16 frame_length /* i : frame length (one channel) */ +) +{ + Word16 ch, s; + Word32 buffer[MAX_TRANSPORT_CHANNELS][MAX_JBM_L_FRAME48k]; /* temp buffer needed when "*audio_in" and "*audio_out[]" point to the same memory */ + + FOR( ch = 0; ch < n_channels; ch++ ) + { + FOR( s = 0; s < frame_length; s++ ) + { + buffer[ch][s] = audio_in[s * n_channels + ch]; + move32(); + } + } + + FOR( ch = 0; ch < n_channels; ch++ ) + { + FOR( s = 0; s < frame_length; s++ ) + { + audio_out[ch][s] = buffer[ch][s]; + move32(); + } + } + + return; +} +#else void ivas_buffer_interleaved_to_deinterleaved_fx( Word32 *audio, /* i/o: audio buffer */ const Word16 n_channels, /* i : number of channels */ const Word16 frame_length, /* i : frame length (one channel) */ -#ifdef FIX_2396_CONSTANT_STRIDE_IN_TC_BUFFER - const Word16 deinterleaved_stride /* i : offset between subsequent channels in deinterleaved layout */ -#else - const Word16 n_samp_full /* i : full frame length (one channel) */ -#endif + const Word16 n_samp_full /* i : full frame length (one channel) */ ) { Word16 offset, ch, m; @@ -188,15 +216,12 @@ void ivas_buffer_interleaved_to_deinterleaved_fx( FOR( ch = 0; ch < n_channels; ch++ ) { Copy32( buffer[ch], audio + offset, frame_length ); -#ifdef FIX_2396_CONSTANT_STRIDE_IN_TC_BUFFER - offset = add( offset, deinterleaved_stride ); -#else offset = add( offset, n_samp_full ); -#endif } return; } +#endif /*-------------------------------------------------------------------* @@ -207,28 +232,29 @@ void ivas_buffer_interleaved_to_deinterleaved_fx( #ifdef FIX_2396_CONSTANT_STRIDE_IN_TC_BUFFER void ivas_buffer_deinterleaved_to_interleaved_fx( - Word32 *audio, /* i/o: audio buffer */ - const Word16 n_channels, /* i : number of channels */ - const Word16 frame_length, /* i : frame length (one channel) */ - const Word16 deinterleaved_stride /* i : offset between subsequent channels in deinterleaved layout */ + Word32 *audio_in[], /* i : pointers to each channel of deinterleaved audio buffer */ + Word32 *audio_out, /* o : interleaved audio buffer */ + const Word16 n_channels, /* i : number of channels */ + const Word16 frame_length /* i : frame length (one channel) */ ) { - Word16 offset, ch, m; - Word32 buffer[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS][L_FRAME48k]; + Word16 ch, s; + Word32 buffer[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS][L_FRAME48k]; /* temp buffer needed when "*audio_in[]" and "*audio_out" point to the same memory */ - offset = 0; - move16(); FOR( ch = 0; ch < n_channels; ch++ ) { - Copy32( audio + offset, buffer[ch], frame_length ); - offset = add( offset, deinterleaved_stride ); + FOR( s = 0; s < frame_length; s++ ) + { + buffer[ch][s] = audio_in[ch][s]; + move32(); + } } FOR( ch = 0; ch < n_channels; ch++ ) { - FOR( m = 0; m < frame_length; m++ ) + FOR( s = 0; s < frame_length; s++ ) { - audio[m * n_channels + ch] = buffer[ch][m]; + audio_out[s * n_channels + ch] = buffer[ch][s]; move32(); } } diff --git a/lib_dec/ivas_dec_fx.c b/lib_dec/ivas_dec_fx.c index 959b4bb45..bd3eab3e4 100644 --- a/lib_dec/ivas_dec_fx.c +++ b/lib_dec/ivas_dec_fx.c @@ -1262,10 +1262,6 @@ static ivas_error ivas_dec_tc_audio_allocate_fx( move16(); } -#ifdef FIX_2396_CONSTANT_STRIDE_IN_TC_BUFFER - hTcBuffer->tc_stride = n_samp_full; - move16(); -#endif nsamp_to_allocate = imult1616( s_max( hTcBuffer->nchan_transport_rend, hTcBuffer->nchan_buffer_full ), n_samp_full ); IF( Opt_tsm ) diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index cfa5b41bf..1f406c338 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -1001,18 +1001,15 @@ typedef struct decoder_tc_buffer_structure Word32 *tc_buffer_old_fx[MAX_INTERN_CHANNELS]; /* TC audio samples not rendered in the previous frame */ Word32 *tc_buffer_fx; /* the buffer itself */ Word32 *tc_fx[MAX_INTERN_CHANNELS]; /* pointers into the buffer to the beginning of each tc */ -#ifdef FIX_2396_CONSTANT_STRIDE_IN_TC_BUFFER - Word16 tc_stride; /* Stride (offset) between subsequent channel pointers in tc_fx */ -#endif - Word16 q_tc_fx; /* TC channels Q-factor */ - TC_BUFFER_MODE tc_buffer_mode; /* mode of the buffer (no buffering, render buffering, out buffering) */ - Word16 nchan_transport_rend; /* number of TCs provided to the renderer */ - Word16 nchan_transport_internal; /* total number of TC buffer channels, can include e.g. TD decorr data */ - Word16 nchan_buffer_full; /* number of channels to be fully buffered */ - Word16 n_samples_available; /* samples still available for rendering in the current frame */ - Word16 n_samples_buffered; /* full number of samples in the buffer (including spill to next frame) */ - Word16 n_samples_rendered; /* samples already rendered in the current frame */ - Word16 n_samples_granularity; /* render granularity */ + Word16 q_tc_fx; /* TC channels Q-factor */ + TC_BUFFER_MODE tc_buffer_mode; /* mode of the buffer (no buffering, render buffering, out buffering) */ + Word16 nchan_transport_rend; /* number of TCs provided to the renderer */ + Word16 nchan_transport_internal; /* total number of TC buffer channels, can include e.g. TD decorr data */ + Word16 nchan_buffer_full; /* number of channels to be fully buffered */ + Word16 n_samples_available; /* samples still available for rendering in the current frame */ + Word16 n_samples_buffered; /* full number of samples in the buffer (including spill to next frame) */ + Word16 n_samples_rendered; /* samples already rendered in the current frame */ + Word16 n_samples_granularity; /* render granularity */ Word16 n_samples_flushed; Word16 subframe_nbslots[MAX_JBM_SUBFRAMES_5MS]; Word16 nb_subframes; diff --git a/lib_dec/lib_dec_fx.c b/lib_dec/lib_dec_fx.c index 1c447a905..fbd748b84 100644 --- a/lib_dec/lib_dec_fx.c +++ b/lib_dec/lib_dec_fx.c @@ -3935,7 +3935,7 @@ ivas_error IVAS_DEC_GetSamplesDecoder( /* convert deinterleaved decoded TC audio channels buffer to an interleaved one */ #ifdef FIX_2396_CONSTANT_STRIDE_IN_TC_BUFFER - ivas_buffer_deinterleaved_to_interleaved_fx( st_ivas->hTcBuffer->tc_buffer_fx, nTransportChannels, hIvasDec->nSamplesFrame, st_ivas->hTcBuffer->tc_stride ); + ivas_buffer_deinterleaved_to_interleaved_fx( st_ivas->p_output_fx, st_ivas->hTcBuffer->tc_buffer_fx, nTransportChannels, hIvasDec->nSamplesFrame ); #else ivas_buffer_deinterleaved_to_interleaved_fx( st_ivas->p_output_fx, nTransportChannels, hIvasDec->nSamplesFrame, st_ivas->hTcBuffer->tc_buffer_fx ); #endif @@ -3959,7 +3959,7 @@ ivas_error IVAS_DEC_GetSamplesDecoder( /* convert interleaved time-scaled TC audio channels buffer to deinterleaved one */ #ifdef FIX_2396_CONSTANT_STRIDE_IN_TC_BUFFER - ivas_buffer_interleaved_to_deinterleaved_fx( st_ivas->hTcBuffer->tc_buffer_fx, nTransportChannels, nSamplesTcsScaled, st_ivas->hTcBuffer->tc_stride ); + ivas_buffer_interleaved_to_deinterleaved_fx( st_ivas->hTcBuffer->tc_buffer_fx, st_ivas->p_output_fx, nTransportChannels, nSamplesTcsScaled ); #else ivas_buffer_interleaved_to_deinterleaved_fx( st_ivas->hTcBuffer->tc_buffer_fx, nTransportChannels, nSamplesTcsScaled, NS2SA( st_ivas->hDecoderConfig->output_Fs, MAX_JBM_L_FRAME_NS ) ); #endif -- GitLab From 1c09f8b6b9cad840a8478bde3ad56bf884cb388c Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Fri, 30 Jan 2026 16:36:51 +0100 Subject: [PATCH 8/8] Fix formatting --- lib_com/ivas_tools_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/ivas_tools_fx.c b/lib_com/ivas_tools_fx.c index 14a9cc955..fae273974 100644 --- a/lib_com/ivas_tools_fx.c +++ b/lib_com/ivas_tools_fx.c @@ -183,7 +183,7 @@ void ivas_buffer_interleaved_to_deinterleaved_fx( FOR( ch = 0; ch < n_channels; ch++ ) { FOR( s = 0; s < frame_length; s++ ) - { + { audio_out[ch][s] = buffer[ch][s]; move32(); } -- GitLab