Commit 238e16ef authored by vaclav's avatar vaclav
Browse files

serial to parallel conversion, under SER2PAR

parent d7582a1f
Loading
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -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                  */
);
+37 −0
Original line number Diff line number Diff line
@@ -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()
+2 −0
Original line number Diff line number Diff line
@@ -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 ################################## */
+32 −4
Original line number Diff line number Diff line
@@ -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
            }
        }

+35 −1
Original line number Diff line number Diff line
@@ -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
        {