Commit ecd7c788 authored by TYAGIRIS's avatar TYAGIRIS
Browse files

renderer static memory optimization

parent 27af0e05
Loading
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -201,6 +201,9 @@
#define OPTIMIZE_DPCM_QUANT
#define SPLIT_REND_PLC
/*CLDFB CODEC SWITCHES -- END*/

#define REND_STATIC_MEM_OPT

#endif

/* ################## End DEVELOPMENT switches ######################### */
+209 −18
Original line number Diff line number Diff line
@@ -115,7 +115,9 @@ typedef struct
    IVAS_REND_AudioConfig inConfig;
    IVAS_REND_InputId id;
    IVAS_REND_AudioBuffer inputBuffer;
#ifndef REND_STATIC_MEM_OPT
    float bufferData[MAX_BUFFER_LENGTH];
#endif
    float gain; /* Linear, not in dB */
    rendering_context ctx;
    int32_t numNewSamplesPerChannel; /* Used to keep track how much new audio was fed before rendering current frame */
@@ -130,6 +132,9 @@ typedef struct
    CREND_WRAPPER_HANDLE crendWrapper;
    REVERB_HANDLE hReverb;
    rotation_matrix rot_mat_prev;
#ifdef REND_STATIC_MEM_OPT
    float *bufferData;
#endif
} input_ism;

typedef struct
@@ -157,6 +162,9 @@ typedef struct
    REVERB_HANDLE hReverb;
    rotation_gains rot_gains_prev;
    lfe_routing lfeRouting;
#ifdef REND_STATIC_MEM_OPT
    float *bufferData;
#endif
} input_mc;

typedef struct
@@ -173,6 +181,10 @@ typedef struct
#else
    rotation_gains rot_gains_prev;
#endif

#ifdef REND_STATIC_MEM_OPT
    float *bufferData;
#endif
} input_sba;

#ifdef SPLIT_REND_WITH_HEAD_ROT
@@ -180,6 +192,9 @@ typedef struct
{
    input_base base;
    SPLIT_POST_REND_WRAPPER splitPostRendWrapper;
#ifdef REND_STATIC_MEM_OPT
    float *bufferData;
#endif
} input_split_post_rend;
#endif

@@ -193,6 +208,9 @@ typedef struct
    DecoderDummy *decDummy;
    MASA_METADATA_FRAME masaMetadata;
    bool metadataHasBeenFed;
#ifdef REND_STATIC_MEM_OPT
    float *bufferData;
#endif
} input_masa;

struct IVAS_REND
@@ -231,6 +249,30 @@ struct IVAS_REND
 * Local functions
 *-------------------------------------------------------------------*/

#ifdef REND_STATIC_MEM_OPT
static ivas_error allocateInputBaseBufferData( float **data, const int16_t data_size )
{
    *data = (float *) malloc( data_size * sizeof( float ) );
    if ( *data == NULL )
    {
        return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for input base buffer data" );
    }

    return IVAS_ERR_OK;
}

static void freeInputBaseBufferData( float **data )
{
    if ( *data != NULL )
    {
        free( *data );
        *data = NULL;
    }

    return;
}
#endif

static IVAS_QUATERNION quaternionInit(
    void )
{
@@ -1134,7 +1176,13 @@ static void initRendInputBase(
    input_base *inputBase,
    const IVAS_REND_AudioConfig inConfig,
    const IVAS_REND_InputId id,
    const rendering_context rendCtx )
    const rendering_context rendCtx
#ifdef REND_STATIC_MEM_OPT
    ,
    float *dataBuf,
    const int16_t dataBufSize
#endif
)
{
    inputBase->inConfig = inConfig;
    inputBase->id = id;
@@ -1144,10 +1192,17 @@ static void initRendInputBase(

    inputBase->inputBuffer.config.numSamplesPerChannel = 0;
    inputBase->inputBuffer.config.numChannels = 0;
#ifndef REND_STATIC_MEM_OPT
    inputBase->inputBuffer.data = inputBase->bufferData;

    set_zero( inputBase->bufferData, MAX_BUFFER_LENGTH );

#else
    inputBase->inputBuffer.data = dataBuf;
    if ( inputBase->inputBuffer.data != NULL )
    {
        set_zero( inputBase->inputBuffer.data, dataBufSize );
    }
#endif
    return;
}

@@ -1255,7 +1310,18 @@ static ivas_error setRendInputActiveIsm(
        return IVAS_ERR_IO_CONFIG_PAIR_NOT_SUPPORTED;
    }

    initRendInputBase( &inputIsm->base, inConfig, id, rendCtx );
#ifdef REND_STATIC_MEM_OPT
    if ( ( error = allocateInputBaseBufferData( &inputIsm->bufferData, MAX_BUFFER_LENGTH ) ) != IVAS_ERR_OK )
    {
        return error;
    }
#endif
    initRendInputBase( &inputIsm->base, inConfig, id, rendCtx
#ifdef REND_STATIC_MEM_OPT
                       ,
                       inputIsm->bufferData, MAX_BUFFER_LENGTH
#endif
    );

    inputIsm->currentPos = defaultObjectPosition();
    inputIsm->previousPos = defaultObjectPosition();
@@ -1311,7 +1377,15 @@ static void clearInputIsm(

    rendCtx = inputIsm->base.ctx;

    initRendInputBase( &inputIsm->base, IVAS_REND_AUDIO_CONFIG_UNKNOWN, 0, rendCtx );
#ifdef REND_STATIC_MEM_OPT
    freeInputBaseBufferData( &inputIsm->base.inputBuffer.data );
#endif
    initRendInputBase( &inputIsm->base, IVAS_REND_AUDIO_CONFIG_UNKNOWN, 0, rendCtx
#ifdef REND_STATIC_MEM_OPT
                       ,
                       NULL, 0
#endif
    );

    /* Free input's internal handles */

@@ -2114,7 +2188,18 @@ static ivas_error setRendInputActiveMc(
        return IVAS_ERR_IO_CONFIG_PAIR_NOT_SUPPORTED;
    }

    initRendInputBase( &inputMc->base, inConfig, id, rendCtx );
#ifdef REND_STATIC_MEM_OPT
    if ( ( error = allocateInputBaseBufferData( &inputMc->bufferData, MAX_BUFFER_LENGTH ) ) != IVAS_ERR_OK )
    {
        return error;
    }
#endif
    initRendInputBase( &inputMc->base, inConfig, id, rendCtx
#ifdef REND_STATIC_MEM_OPT
                       ,
                       inputMc->bufferData, MAX_BUFFER_LENGTH
#endif
    );
    setZeroPanMatrix( inputMc->panGains );
    inputMc->customLsInput = defaultCustomLs();
    inputMc->tdRendWrapper = defaultTdRendWrapper();
@@ -2146,7 +2231,15 @@ static void clearInputMc(

    rendCtx = inputMc->base.ctx;

    initRendInputBase( &inputMc->base, IVAS_REND_AUDIO_CONFIG_UNKNOWN, 0, rendCtx );
#ifdef REND_STATIC_MEM_OPT
    freeInputBaseBufferData( &inputMc->bufferData );
#endif
    initRendInputBase( &inputMc->base, IVAS_REND_AUDIO_CONFIG_UNKNOWN, 0, rendCtx
#ifdef REND_STATIC_MEM_OPT
                       ,
                       NULL, 0
#endif
    );

    /* Free input's internal handles */
    if ( inputMc->efapInWrapper.hEfap != NULL )
@@ -2445,7 +2538,18 @@ static ivas_error setRendInputActiveSplitPostRend(
    rendCtx = inputSplitPostRend->base.ctx;
    outConfig = *rendCtx.pOutConfig;

    initRendInputBase( &inputSplitPostRend->base, inConfig, id, rendCtx );
#ifdef REND_STATIC_MEM_OPT
    if ( ( error = allocateInputBaseBufferData( &inputSplitPostRend->bufferData, MAX_BUFFER_LENGTH ) ) != IVAS_ERR_OK )
    {
        return error;
    }
#endif
    initRendInputBase( &inputSplitPostRend->base, inConfig, id, rendCtx
#ifdef REND_STATIC_MEM_OPT
                       ,
                       inputSplitPostRend->bufferData, MAX_BUFFER_LENGTH
#endif
    );

    if ( ( error = updateSplitPostRendPanGains( inputSplitPostRend, outConfig, hRendCfg ) ) != IVAS_ERR_OK )
    {
@@ -2479,7 +2583,18 @@ static ivas_error setRendInputActiveSba(
        return IVAS_ERR_IO_CONFIG_PAIR_NOT_SUPPORTED;
    }

    initRendInputBase( &inputSba->base, inConfig, id, rendCtx );
#ifdef REND_STATIC_MEM_OPT
    if ( ( error = allocateInputBaseBufferData( &inputSba->bufferData, MAX_BUFFER_LENGTH ) ) != IVAS_ERR_OK )
    {
        return error;
    }
#endif
    initRendInputBase( &inputSba->base, inConfig, id, rendCtx
#ifdef REND_STATIC_MEM_OPT
                       ,
                       inputSba->bufferData, MAX_BUFFER_LENGTH
#endif
    );
    setZeroPanMatrix( inputSba->hoaDecMtx );
#ifdef SPLIT_REND_WITH_HEAD_ROT
    inputSba->crendWrapper = NULL;
@@ -2504,10 +2619,19 @@ static ivas_error setRendInputActiveSba(
static void clearInputSplitRend(
    input_split_post_rend *inputSplitRend )
{
    // rendering_context rendCtx;
    rendering_context rendCtx;

    // rendCtx = inputSplitRend->base.ctx;
    rendCtx = inputSplitRend->base.ctx;

#ifdef REND_STATIC_MEM_OPT
    freeInputBaseBufferData( &inputSplitRend->bufferData );
#endif
    initRendInputBase( &inputSplitRend->base, IVAS_REND_AUDIO_CONFIG_UNKNOWN, 0, rendCtx
#ifdef REND_STATIC_MEM_OPT
                       ,
                       NULL, 0
#endif
    );
    if ( inputSplitRend->splitPostRendWrapper.hBinHrSplitPostRend != NULL )
    {
        ivas_splitBinPostRendClose( &inputSplitRend->splitPostRendWrapper.hBinHrSplitPostRend );
@@ -2528,7 +2652,15 @@ static void clearInputSba(

    rendCtx = inputSba->base.ctx;

    initRendInputBase( &inputSba->base, IVAS_REND_AUDIO_CONFIG_UNKNOWN, 0, rendCtx );
#ifdef REND_STATIC_MEM_OPT
    freeInputBaseBufferData( &inputSba->bufferData );
#endif
    initRendInputBase( &inputSba->base, IVAS_REND_AUDIO_CONFIG_UNKNOWN, 0, rendCtx
#ifdef REND_STATIC_MEM_OPT
                       ,
                       NULL, 0
#endif
    );

    /* Free input's internal handles */
#ifdef SPLIT_REND_WITH_HEAD_ROT
@@ -2895,7 +3027,18 @@ static ivas_error setRendInputActiveMasa(
        return IVAS_ERR_IO_CONFIG_PAIR_NOT_SUPPORTED;
    }

    initRendInputBase( &inputMasa->base, inConfig, id, rendCtx );
#ifdef REND_STATIC_MEM_OPT
    if ( ( error = allocateInputBaseBufferData( &inputMasa->bufferData, MAX_BUFFER_LENGTH ) ) != IVAS_ERR_OK )
    {
        return error;
    }
#endif
    initRendInputBase( &inputMasa->base, inConfig, id, rendCtx
#ifdef REND_STATIC_MEM_OPT
                       ,
                       inputMasa->bufferData, MAX_BUFFER_LENGTH
#endif
    );

    if ( ( error = getAudioConfigNumChannels( inConfig, &numInChannels ) ) != IVAS_ERR_OK )
    {
@@ -2988,7 +3131,15 @@ static void clearInputMasa(

    rendCtx = inputMasa->base.ctx;

    initRendInputBase( &inputMasa->base, IVAS_REND_AUDIO_CONFIG_UNKNOWN, 0, rendCtx );
#ifdef REND_STATIC_MEM_OPT
    freeInputBaseBufferData( &inputMasa->bufferData );
#endif
    initRendInputBase( &inputMasa->base, IVAS_REND_AUDIO_CONFIG_UNKNOWN, 0, rendCtx
#ifdef REND_STATIC_MEM_OPT
                       ,
                       NULL, 0
#endif
    );
    freeDecoderDummy( &inputMasa->decDummy );

    return;
@@ -3063,37 +3214,69 @@ ivas_error IVAS_REND_Open(
    /* Initialize inputs */
    for ( i = 0; i < RENDERER_MAX_ISM_INPUTS; ++i )
    {
        initRendInputBase( &hIvasRend->inputsIsm[i].base, IVAS_REND_AUDIO_CONFIG_UNKNOWN, 0, getRendCtx( hIvasRend ) );
        initRendInputBase( &hIvasRend->inputsIsm[i].base, IVAS_REND_AUDIO_CONFIG_UNKNOWN, 0, getRendCtx( hIvasRend )
#ifdef REND_STATIC_MEM_OPT
                                                                                                 ,
                           NULL, 0
#endif
        );
        hIvasRend->inputsIsm[i].crendWrapper = NULL;
        hIvasRend->inputsIsm[i].hReverb = NULL;
        hIvasRend->inputsIsm[i].tdRendWrapper.hBinRendererTd = NULL;
#ifdef REND_STATIC_MEM_OPT
        hIvasRend->inputsIsm[i].bufferData = NULL;
#endif
    }

    for ( i = 0; i < RENDERER_MAX_MC_INPUTS; ++i )
    {
        initRendInputBase( &hIvasRend->inputsMc[i].base, IVAS_REND_AUDIO_CONFIG_UNKNOWN, 0, getRendCtx( hIvasRend ) );
        initRendInputBase( &hIvasRend->inputsMc[i].base, IVAS_REND_AUDIO_CONFIG_UNKNOWN, 0, getRendCtx( hIvasRend )
#ifdef REND_STATIC_MEM_OPT
                                                                                                ,
                           NULL, 0
#endif
        );
        hIvasRend->inputsMc[i].efapInWrapper.hEfap = NULL;
        hIvasRend->inputsMc[i].crendWrapper = NULL;
        hIvasRend->inputsMc[i].hReverb = NULL;
        hIvasRend->inputsMc[i].tdRendWrapper.hBinRendererTd = NULL;
#ifdef REND_STATIC_MEM_OPT
        hIvasRend->inputsMc[i].bufferData = NULL;
#endif
    }

    for ( i = 0; i < RENDERER_MAX_SBA_INPUTS; ++i )
    {
        initRendInputBase( &hIvasRend->inputsSba[i].base, IVAS_REND_AUDIO_CONFIG_UNKNOWN, 0, getRendCtx( hIvasRend ) );
        initRendInputBase( &hIvasRend->inputsSba[i].base, IVAS_REND_AUDIO_CONFIG_UNKNOWN, 0, getRendCtx( hIvasRend )
#ifdef REND_STATIC_MEM_OPT
                                                                                                 ,
                           NULL, 0
#endif
        );
        hIvasRend->inputsSba[i].crendWrapper = NULL;
#ifdef SPLIT_REND_WITH_HEAD_ROT
        hIvasRend->inputsSba[i].cldfbRendWrapper.hCldfbRend = NULL;
        hIvasRend->inputsSba[i].cldfbRendWrapper.hHrtfFastConv = NULL;
        ivas_init_split_rend_handles( &hIvasRend->inputsSba[i].splitRendWrapper );
#endif
#ifdef REND_STATIC_MEM_OPT
        hIvasRend->inputsSba[i].bufferData = NULL;
#endif
    }

    for ( i = 0; i < RENDERER_MAX_MASA_INPUTS; ++i )
    {
        initRendInputBase( &hIvasRend->inputsMasa[i].base, IVAS_REND_AUDIO_CONFIG_UNKNOWN, 0, getRendCtx( hIvasRend ) );
        initRendInputBase( &hIvasRend->inputsMasa[i].base, IVAS_REND_AUDIO_CONFIG_UNKNOWN, 0, getRendCtx( hIvasRend )
#ifdef REND_STATIC_MEM_OPT
                                                                                                  ,
                           NULL, 0
#endif
        );
        hIvasRend->inputsMasa[i].decDummy = NULL;
        hIvasRend->inputsMasa[i].metadataHasBeenFed = false;
#ifdef REND_STATIC_MEM_OPT
        hIvasRend->inputsMasa[i].bufferData = NULL;
#endif
    }
#ifdef SPLIT_REND_WITH_HEAD_ROT
    for ( i = 0; i < RENDERER_MAX_BIN_INPUTS; ++i )
@@ -3101,10 +3284,18 @@ ivas_error IVAS_REND_Open(
        initRendInputBase( &hIvasRend->inputsSplitPost[i].base,
                           IVAS_REND_AUDIO_CONFIG_UNKNOWN,
                           0,
                           getRendCtx( hIvasRend ) );
                           getRendCtx( hIvasRend )
#ifdef REND_STATIC_MEM_OPT
                               ,
                           NULL, 0
#endif
        );
        ivas_init_split_post_rend_handles( &hIvasRend->inputsSplitPost[i].splitPostRendWrapper );
#ifdef SPLIT_REND_PLC
        hIvasRend->splitRendBFI = 0;
#endif
#ifdef REND_STATIC_MEM_OPT
        hIvasRend->inputsSplitPost[i].bufferData = NULL;
#endif
    }
#endif