Loading lib_com/ivas_prot.h +4 −1 Original line number Diff line number Diff line Loading @@ -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( Loading lib_dec/ivas_jbm_dec.c +81 −24 Original line number Diff line number Diff line Loading @@ -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 ); Loading Loading @@ -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*/ 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++ ) { Loading @@ -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 { Loading Loading @@ -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 ); Loading Loading @@ -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() * Loading Loading @@ -2122,7 +2184,7 @@ static void ivas_jbm_dec_copy_tc( return; } #endif /*--------------------------------------------------------------------------* * ivas_jbm_dec_get_render_granularity() Loading Loading @@ -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 ) { Loading lib_dec/lib_dec.c +2 −1 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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 ); } Loading Loading
lib_com/ivas_prot.h +4 −1 Original line number Diff line number Diff line Loading @@ -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( Loading
lib_dec/ivas_jbm_dec.c +81 −24 Original line number Diff line number Diff line Loading @@ -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 ); Loading Loading @@ -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*/ 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++ ) { Loading @@ -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 { Loading Loading @@ -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 ); Loading Loading @@ -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() * Loading Loading @@ -2122,7 +2184,7 @@ static void ivas_jbm_dec_copy_tc( return; } #endif /*--------------------------------------------------------------------------* * ivas_jbm_dec_get_render_granularity() Loading Loading @@ -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 ) { Loading
lib_dec/lib_dec.c +2 −1 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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 ); } Loading