Loading lib_com/ivas_prot.h +9 −0 Original line number Diff line number Diff line Loading @@ -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 */ ); Loading lib_com/ivas_tools.c +37 −0 Original line number Diff line number Diff line Loading @@ -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() Loading lib_com/options.h +2 −0 Original line number Diff line number Diff line Loading @@ -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 ################################## */ Loading lib_dec/ivas_jbm_dec.c +32 −4 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 ); Loading @@ -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 } } Loading lib_dec/lib_dec.c +35 −1 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 { Loading Loading
lib_com/ivas_prot.h +9 −0 Original line number Diff line number Diff line Loading @@ -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 */ ); Loading
lib_com/ivas_tools.c +37 −0 Original line number Diff line number Diff line Loading @@ -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() Loading
lib_com/options.h +2 −0 Original line number Diff line number Diff line Loading @@ -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 ################################## */ Loading
lib_dec/ivas_jbm_dec.c +32 −4 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 ); Loading @@ -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 } } Loading
lib_dec/lib_dec.c +35 −1 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 { Loading