Commit c04ee29b authored by vaclav's avatar vaclav
Browse files

OPT_TC, step 1

parent 88e2b78e
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -172,7 +172,7 @@ typedef enum
#define JBM_CLDFB_SLOTS_IN_SUBFRAME             4
#define MAX_JBM_CLDFB_TIMESLOTS                 32
#define DEFAULT_JBM_CLDFB_TIMESLOTS             16
#ifdef JBM_MEMORY_OPT
#if (defined JBM_MEMORY_OPT && !defined REMOVE_APA_BUFFER)
#define MAX_JBM_L_FRAME48k                      (1920 - 240)
#define MAX_JBM_L_FRAME_NS                      35000000L
#else
+5 −0
Original line number Diff line number Diff line
@@ -161,8 +161,13 @@
/*#define FIX_I4_OL_PITCH*/                             /* fix open-loop pitch used for EVS core switching */
#define TMP_FIX_1119_SPLIT_RENDERING_VOIP               /* FhG: Add error check for unsupported config: split rendering with VoIP mode */
#define LIB_DEC_REVISION                                /* VA: cleaning and simplification of lib_dec.c */
#if 1
#define JBM_MEMORY_OPT                                  /* VA: issue 916: optimization of RAM in the JBM decoder */
#define OPT_TC  // separate heap memory from hTcBuffer->tcBuffer[]
//#define REMOVE_APA_BUFFER   // remove hIvasDec->apaExecBuffer[]

#define MY_DEBUG
#endif

/* #################### End BE switches ################################## */

+77 −0
Original line number Diff line number Diff line
@@ -1423,6 +1423,22 @@ ivas_error ivas_jbm_dec_flush_renderer(
    {
        int16_t ch_idx;

#ifdef OPT_TC
        /* render available full slots (with new lower granularity) */
        for ( ch_idx = 0; ch_idx < min( hTcBuffer->nchan_transport_jbm, hTcBuffer->nchan_buffer_full ); ch_idx++ )
        //for ( ch_idx = 0; ch_idx < max( hTcBuffer->nchan_transport_jbm, hTcBuffer->nchan_buffer_full ); ch_idx++ )
        {
            mvr2r( hTcBuffer->tc_buffer_old[ch_idx], hTcBuffer->tc[ch_idx], n_samples_to_render );
        }

        for ( ; ch_idx < hTcBuffer->nchan_buffer_full; ch_idx++ )
        {
            /* move it at the beginning of the TC buffer with zero padding */
            mvr2r( hTcBuffer->tc[ch_idx] + hTcBuffer->n_samples_rendered, hTcBuffer->tc[ch_idx], n_samples_to_render );
            set_zero( hTcBuffer->tc[ch_idx] + n_samples_to_render, hTcBuffer->n_samples_granularity - n_samples_to_render );
            mvr2r( hTcBuffer->tc[ch_idx] + hTcBuffer->n_samples_rendered + n_samples_to_render, hTcBuffer->tc[ch_idx] + hTcBuffer->n_samples_granularity, n_samples_still_available );
        }
#else
        /* render what is still there with zero padding */
        for ( ch_idx = 0; ch_idx < hTcBuffer->nchan_buffer_full; ch_idx++ )
        {
@@ -1431,6 +1447,7 @@ ivas_error ivas_jbm_dec_flush_renderer(
            set_zero( hTcBuffer->tc[ch_idx] + n_samples_to_render, hTcBuffer->n_samples_granularity - n_samples_to_render );
            mvr2r( hTcBuffer->tc[ch_idx] + hTcBuffer->n_samples_rendered + n_samples_to_render, hTcBuffer->tc[ch_idx] + hTcBuffer->n_samples_granularity, n_samples_still_available );
        }
#endif

        /* simple change of the slot info */
        hTcBuffer->num_slots = 1;
@@ -2052,6 +2069,9 @@ static void ivas_jbm_dec_copy_tc(

    for ( ch = 0; ch < n_ch_full_copy; ch++ )
    {
#ifdef OPT_TC
        mvr2r( st_ivas->hTcBuffer->tc_buffer_old[ch], st_ivas->hTcBuffer->tc[ch] + st_ivas->hTcBuffer->n_samples_rendered, n_samples_still_available );
#endif
        set_zero( hTcBuffer->tc[ch], hTcBuffer->n_samples_discard );
        mvr2r( hTcBuffer->tc[ch] + hTcBuffer->n_samples_rendered, hTcBuffer->tc[ch] + hTcBuffer->n_samples_discard, n_samples_still_available );
        for ( m = 0; m < nSamplesForRendering; m++ )
@@ -2064,6 +2084,9 @@ static void ivas_jbm_dec_copy_tc(
    {
        for ( ; ch < hTcBuffer->nchan_transport_jbm; ch++ )
        {
#ifdef OPT_TC
            mvr2r( st_ivas->hTcBuffer->tc_buffer_old[ch], tc_digest_f[ch], n_samples_still_available ); // VE: TBV!!!
#endif
            mvr2r( hTcBuffer->tc[ch], tc_digest_f[ch], n_samples_still_available );
            for ( m = 0; m < nSamplesForRendering; m++ )
            {
@@ -2244,6 +2267,22 @@ ivas_error ivas_jbm_dec_tc_buffer_open(
                {
                    hTcBuffer->tc[ch_idx] = NULL;
                }
#ifdef OPT_TC

                /* 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++ )
                {
                    if ( ( hTcBuffer->tc_buffer_old[ch_idx] = (float *) malloc( n_samp_residual * sizeof( float ) ) ) == NULL )
                    {
                        return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for JBM TC Buffer\n" ) );
                    }
                    set_zero( hTcBuffer->tc_buffer_old[ch_idx], n_samp_residual );
                }
                for ( ; ch_idx < MAX_TRANSPORT_CHANNELS; ch_idx++ )
                {
                    hTcBuffer->tc_buffer_old[ch_idx] = NULL;
                }
#endif
            }
            else
            {
@@ -2329,6 +2368,17 @@ ivas_error ivas_jbm_dec_tc_buffer_reconfigure(
    {
        free( hTcBuffer->tc_buffer );
        hTcBuffer->tc_buffer = NULL;
#ifdef OPT_TC

        for ( ch_idx = 0; ch_idx < MAX_TRANSPORT_CHANNELS; ch_idx++ )
        {
            if ( hTcBuffer->tc_buffer_old[ch_idx] != NULL )
            {
                free( hTcBuffer->tc_buffer_old[ch_idx] );
                hTcBuffer->tc_buffer_old[ch_idx] = NULL;
            }
        }
#endif
    }

    if ( st_ivas->hDecoderConfig->Opt_tsm )
@@ -2377,6 +2427,22 @@ ivas_error ivas_jbm_dec_tc_buffer_reconfigure(
            {
                hTcBuffer->tc[ch_idx] = NULL;
            }
#ifdef OPT_TC

            /* 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++ )
            {
                if ( ( hTcBuffer->tc_buffer_old[ch_idx] = (float *) malloc( n_samp_residual * sizeof( float ) ) ) == NULL )
                {
                    return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for JBM TC Buffer\n" ) );
                }
                set_zero( hTcBuffer->tc_buffer_old[ch_idx], n_samp_residual );
            }
            for ( ; ch_idx < MAX_TRANSPORT_CHANNELS; ch_idx++ )
            {
                hTcBuffer->tc_buffer_old[ch_idx] = NULL;
            }
#endif
        }
        else
        {
@@ -2456,6 +2522,17 @@ void ivas_jbm_dec_tc_buffer_close(
            ( *phTcBuffer )->tc_buffer = NULL;
        }

#ifdef OPT_TC
        for ( i = 0; i < MAX_TRANSPORT_CHANNELS; i++ )
        {
            if ( ( *phTcBuffer )->tc_buffer_old[i] != NULL )
            {
                free( ( *phTcBuffer )->tc_buffer_old[i] );
                ( *phTcBuffer )->tc_buffer_old[i] = NULL;
            }
        }

#endif
        free( *phTcBuffer );
        *phTcBuffer = NULL;
    }
+4 −0
Original line number Diff line number Diff line
@@ -944,6 +944,10 @@ typedef struct ivas_masa_ism_data_structure

typedef struct decoder_tc_buffer_structure
{
#ifdef OPT_TC
    float *tc_buffer_old[MAX_TRANSPORT_CHANNELS]; /* TC audio samples not rendered in the previous frame */
    float *tc_residual_old[MAX_INTERN_CHANNELS];  /* residual channels audio samples not rendered in the previous frame */
#endif
    float *tc_buffer;                                                                                                                /* the buffer itself                                                        */
    float *tc[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS]; /* pointers into the buffer to the beginning of each tc                     */ // VE2SB: TBV
    TC_BUFFER_MODE tc_buffer_mode;                                                                                                   /* mode of the buffer (no buffering, render buffering, out buffering)       */
+53 −1
Original line number Diff line number Diff line
@@ -1191,7 +1191,13 @@ ivas_error IVAS_DEC_ReadFormat(
            {
                return IVAS_ERR_UNEXPECTED_NULL_POINTER;
            }
#ifdef MY_DEBUG
            for ( int16_t ch = 0; ch < min( hIvasDec->st_ivas->hTcBuffer->nchan_transport_jbm, hIvasDec->st_ivas->hTcBuffer->nchan_buffer_full ); ch++ )
            {
                set_f( hIvasDec->st_ivas->hTcBuffer->tc[ch], 0, hIvasDec->nSamplesFrame + hIvasDec->nSamplesFrame / 2 + hIvasDec->st_ivas->hTcBuffer->n_samples_granularity ); // VE: debug
            }

#endif
            /* when granularity goes down, render what still fits in the new granularity */
            if ( tc_granularity_new < st_ivas->hTcBuffer->n_samples_granularity )
            {
@@ -1351,6 +1357,20 @@ ivas_error IVAS_DEC_GetSamplesDecoder(
        }
#endif

#ifdef MY_DEBUG
        for ( int16_t ch = 0; ch < min( hIvasDec->st_ivas->hTcBuffer->nchan_transport_jbm, hIvasDec->st_ivas->hTcBuffer->nchan_buffer_full ); ch++ )
        {
            set_f( hIvasDec->st_ivas->hTcBuffer->tc[ch], 0, hIvasDec->nSamplesFrame + hIvasDec->nSamplesFrame / 2 + hIvasDec->st_ivas->hTcBuffer->n_samples_granularity ); // VE: debug
        }

#endif
#ifdef REMOVE_APA_BUFFER
        for ( int16_t ch = 0; ch < hIvasDec->st_ivas->hTcBuffer->nchan_transport_jbm; ch++ )
        {
            mvr2r( hIvasDec->st_ivas->p_output_f[ch], hIvasDec->st_ivas->hTcBuffer->tc[ch], hIvasDec->nSamplesFrame );
        }
#endif

        /*-----------------------------------------------------------------*
         * JBM
         *-----------------------------------------------------------------*/
@@ -1372,11 +1392,19 @@ ivas_error IVAS_DEC_GetSamplesDecoder(
                return IVAS_ERR_UNKNOWN;
            }

#ifdef MY_DEBUG
            set_f( hIvasDec->apaExecBuffer, 0, nTransportChannels * APA_BUF_PER_CHANNEL ); // VE: debug

#endif
#ifdef LIB_DEC_REVISION
            ivas_syn_output_f( hIvasDec->st_ivas->p_output_f, hIvasDec->nSamplesFrame, nTransportChannels, hIvasDec->apaExecBuffer );

#endif
#ifdef REMOVE_APA_BUFFER
            if ( apa_exec( hIvasDec->hTimeScaler, hIvasDec->st_ivas->hTcBuffer->tc_buffer, hIvasDec->nSamplesFrame * nTransportChannels, (uint16_t) hIvasDec->tsm_max_scaling, hIvasDec->apaExecBuffer, &nTimeScalerOutSamples ) != 0 )
#else
            if ( apa_exec( hIvasDec->hTimeScaler, hIvasDec->apaExecBuffer, hIvasDec->nSamplesFrame * nTransportChannels, (uint16_t) hIvasDec->tsm_max_scaling, hIvasDec->apaExecBuffer, &nTimeScalerOutSamples ) != 0 )
#endif
            {
                return IVAS_ERR_UNKNOWN;
            }
@@ -1403,7 +1431,11 @@ ivas_error IVAS_DEC_GetSamplesDecoder(
        }
#endif

        if ( st_ivas->hDecoderConfig->Opt_tsm )
#ifdef MY_DEBUG
        set_f( hIvasDec->apaExecBuffer, 0, nTransportChannels * APA_BUF_PER_CHANNEL ); // VE: debug

#endif
        if ( hIvasDec->st_ivas->hDecoderConfig->Opt_tsm )
        {
            /* feed residual samples to TSM for the next call */
            if ( apa_set_renderer_residual_samples( hIvasDec->hTimeScaler, (uint16_t) nResidualSamples ) != 0 )
@@ -2054,6 +2086,26 @@ ivas_error IVAS_DEC_GetSamplesRenderer(
        {
            *needNewFrame = false;
        }
#endif
#ifdef OPT_TC

        if ( st_ivas->hDecoderConfig->Opt_tsm )
        {
            int16_t ch;
            DECODER_TC_BUFFER_HANDLE hTcBuffer = st_ivas->hTcBuffer;

            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++ )
                {
                    mvr2r( hTcBuffer->tc[ch] + hTcBuffer->n_samples_rendered, hTcBuffer->tc_buffer_old[ch], hTcBuffer->n_samples_buffered - hTcBuffer->n_samples_rendered );
                }
                for ( ; ch < max( hTcBuffer->nchan_transport_jbm, hTcBuffer->nchan_buffer_full ); ch++ )
                {
                    mvr2r( hTcBuffer->tc[ch], hTcBuffer->tc_buffer_old[ch], hTcBuffer->n_samples_buffered - hTcBuffer->n_samples_rendered );
                }
            }
        }
#endif
    }