diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index e997bf36a425d2a7f4152fbe518fc6c44e05cedb..10573daf8a533f5884818c1bfaa42d1fac92bb37 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -259,19 +259,37 @@ uint32_t ivas_syn_output( int16_t *synth_out /* o : integer 16 bits synthesis signal */ ); +#ifdef FIX_BASOP_2396_CONSTANT_STRIDE_IN_TC_BUFFER +void ivas_buffer_interleaved_to_deinterleaved( + float *audio_in, /* i : interleaved audio buffer */ + float *audio_out[], /* o : pointers to each channel of deinterleaved audio buffer */ + const int16_t n_channels, /* i : number of channels */ + const int16_t frame_length /* i : frame length (one channel) */ +); +#else 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) */ ); +#endif +#ifdef FIX_BASOP_2396_CONSTANT_STRIDE_IN_TC_BUFFER +void ivas_buffer_deinterleaved_to_interleaved( + float *audio_in[], /* i : pointers to each channel of deinterleaved audio buffer */ + float *audio_out, /* o : interleaved audio buffer */ + const int16_t n_channels, /* i : number of channels */ + const int16_t frame_length /* i : frame length (one channel) */ +); +#else 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 */ ); +#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 4d1165bb64ad5379469e59f0f5a72c380ceb2565..484503defa9e77a3d267e63e7f5ea8265bc2f1d0 100644 --- a/lib_com/ivas_tools.c +++ b/lib_com/ivas_tools.c @@ -155,6 +155,36 @@ uint32_t ivas_syn_output( * Convert an interleaved buffer of audio channels to deinterleaved one *-------------------------------------------------------------------*/ +#ifdef FIX_BASOP_2396_CONSTANT_STRIDE_IN_TC_BUFFER +void ivas_buffer_interleaved_to_deinterleaved( + float *audio_in, /* i : interleaved audio buffer */ + float *audio_out[], /* o : pointers to each channel of deinterleaved audio buffer */ + const int16_t n_channels, /* i : number of channels */ + const int16_t frame_length /* i : frame length (one channel) */ +) +{ + int16_t ch, s; + float 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]; + } + } + + for ( ch = 0; ch < n_channels; ch++ ) + { + for ( s = 0; s < frame_length; s++ ) + { + audio_out[ch][s] = buffer[ch][s]; + } + } + + return; +} +#else void ivas_buffer_interleaved_to_deinterleaved( float *audio, /* i/o: audio buffer */ const int16_t n_channels, /* i : number of channels */ @@ -182,7 +212,7 @@ void ivas_buffer_interleaved_to_deinterleaved( return; } - +#endif /*-------------------------------------------------------------------* * ivas_buffer_deinterleaved_to_interleaved() @@ -190,6 +220,36 @@ void ivas_buffer_interleaved_to_deinterleaved( * Convert a deinterleaved buffer of audio channels to interleaved one *-------------------------------------------------------------------*/ +#ifdef FIX_BASOP_2396_CONSTANT_STRIDE_IN_TC_BUFFER +void ivas_buffer_deinterleaved_to_interleaved( + float *audio_in[], /* i : pointers to each channel of deinterleaved audio buffer */ + float *audio_out, /* o : interleaved audio buffer */ + const int16_t n_channels, /* i : number of channels */ + const int16_t frame_length /* i : frame length (one channel) */ +) +{ + int16_t ch, s; + float buffer[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS][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[ch][s]; + } + } + + for ( ch = 0; ch < n_channels; ch++ ) + { + for ( s = 0; s < frame_length; s++ ) + { + audio_out[s * n_channels + ch] = buffer[ch][s]; + } + } + + return; +} +#else void ivas_buffer_deinterleaved_to_interleaved( float *audio[], /* i/o: deinterleaved audio buffer */ const int16_t n_channels, /* i : number of channels */ @@ -215,6 +275,7 @@ void ivas_buffer_deinterleaved_to_interleaved( return; } +#endif /*-------------------------------------------------------------------* diff --git a/lib_com/options.h b/lib_com/options.h index e327b58ecb701576b5da7f421851a372016c3b65..cc9730b97e4439b30a6a9ff2d67ad08aadd2e697 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -171,6 +171,7 @@ #define FIX_1465_SWB_TBE_RANDOM_VECTOR_CREATION /* Dolby: issue 1465: Fix constant in create_random_vector() to allow more reliable fixed point port */ #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: issue 1283: fix for critical issue with DFT stereo core coder */ +#define FIX_BASOP_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 ########################### */ /* ################## End MAINTENANCE switches ######################### */ diff --git a/lib_dec/ivas_dec_render.c b/lib_dec/ivas_dec_render.c index 6806700255b60cfcecb539bc0788058d39bfb8ac..a5cbed9fab629331d725809ad393fb59c06fa848 100644 --- a/lib_dec/ivas_dec_render.c +++ b/lib_dec/ivas_dec_render.c @@ -73,8 +73,12 @@ void ivas_dec_feed_tc_to_renderer( { float tmp_buf[MAX_JBM_L_FRAME48k]; float *p_data_f[FOA_CHANNELS + MAX_NUM_OBJECTS]; +#ifdef FIX_BASOP_2396_CONSTANT_STRIDE_IN_TC_BUFFER + int16_t n, n_render_timeslots, n_ch_cldfb, ch; +#else int16_t n, n_render_timeslots, n_ch_cldfb; int16_t ch, offset, len_offset; +#endif DECODER_TC_BUFFER_HANDLE hTcBuffer; hTcBuffer = st_ivas->hTcBuffer; @@ -92,6 +96,7 @@ void ivas_dec_feed_tc_to_renderer( n_ch_full_copy = min( hTcBuffer->nchan_transport_rend, hTcBuffer->nchan_buffer_full ); n_ch_res_copy = hTcBuffer->nchan_transport_rend - hTcBuffer->nchan_buffer_full; +#ifndef FIX_BASOP_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() */ @@ -107,6 +112,7 @@ void ivas_dec_feed_tc_to_renderer( } } +#endif for ( ch = 0; ch < n_ch_full_copy; ch++ ) { mvr2r( hTcBuffer->tc[ch], tmp_buf, nSamplesForRendering ); @@ -676,7 +682,11 @@ ivas_error ivas_dec_render( break; case PCM_FLOAT32: +#ifdef FIX_BASOP_2396_CONSTANT_STRIDE_IN_TC_BUFFER + ivas_buffer_deinterleaved_to_interleaved( p_output, (float *) data, nchan_out_syn_output, *nSamplesRendered ); +#else ivas_buffer_deinterleaved_to_interleaved( p_output, nchan_out_syn_output, *nSamplesRendered, (float *) data ); +#endif break; default: error = IVAS_ERR_UNKNOWN; @@ -978,7 +988,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 FIX_BASOP_2396_CONSTANT_STRIDE_IN_TC_BUFFER + ivas_buffer_deinterleaved_to_interleaved( p_output, (float *) data, st_ivas->hDecoderConfig->nchan_out, *nSamplesRendered ); +#else ivas_buffer_deinterleaved_to_interleaved( p_output, st_ivas->hDecoderConfig->nchan_out, *nSamplesRendered, (float *) data ); +#endif break; default: error = IVAS_ERR_UNKNOWN; diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 44527212d9de06f9400d4fc93e48061a790e2ee7..ab00e2d5d17af877cd5ea26bf40634de7cf51ad5 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -1203,7 +1203,11 @@ ivas_error IVAS_DEC_GetSamplesDecoder( } /* convert deinterleaved decoded TC audio channels buffer to an interleaved one */ +#ifdef FIX_BASOP_2396_CONSTANT_STRIDE_IN_TC_BUFFER + ivas_buffer_deinterleaved_to_interleaved( st_ivas->p_output_f, st_ivas->hTcBuffer->tc_buffer, nTransportChannels, hIvasDec->nSamplesFrame ); +#else ivas_buffer_deinterleaved_to_interleaved( st_ivas->p_output_f, nTransportChannels, hIvasDec->nSamplesFrame, st_ivas->hTcBuffer->tc_buffer ); +#endif /* 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 ) @@ -1216,7 +1220,11 @@ ivas_error IVAS_DEC_GetSamplesDecoder( hIvasDec->timeScalingDone = 1; /* convert interleaved time-scaled TC audio channels buffer to deinterleaved one */ +#ifdef FIX_BASOP_2396_CONSTANT_STRIDE_IN_TC_BUFFER + ivas_buffer_interleaved_to_deinterleaved( st_ivas->hTcBuffer->tc_buffer, st_ivas->p_output_f, nTransportChannels, nSamplesTcsScaled ); +#else 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 {