Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 076b6e71 authored by Andy Hung's avatar Andy Hung Committed by Android (Google) Code Review
Browse files

Merge "libeffects: Corrected scratch memory size calculations"

parents 967537b2 db085f3f
Loading
Loading
Loading
Loading
+85 −1
Original line number Diff line number Diff line
@@ -61,6 +61,72 @@
/*                                                                                      */
/****************************************************************************************/

/*
 * 4 Types of Memory Regions of LVM
 * TODO: Allocate on the fly.
 * i)   LVM_MEMREGION_PERSISTENT_SLOW_DATA - For Instance Handles
 * ii)  LVM_MEMREGION_PERSISTENT_FAST_DATA - Persistent Buffers
 * iii) LVM_MEMREGION_PERSISTENT_FAST_COEF - For Holding Structure values
 * iv)  LVM_MEMREGION_TEMPORARY_FAST       - For Holding Structure values
 *
 * LVM_MEMREGION_PERSISTENT_SLOW_DATA:
 *   Total Memory size:
 *     sizeof(LVM_Instance_t) + \
 *     sizeof(LVM_Buffer_t) + \
 *     sizeof(LVPSA_InstancePr_t) + \
 *     sizeof(LVM_Buffer_t) - needed if buffer mode is LVM_MANAGED_BUFFER
 *
 * LVM_MEMREGION_PERSISTENT_FAST_DATA:
 *   Total Memory size:
 *     sizeof(LVM_TE_Data_t) + \
 *     2 * pInstParams->EQNB_NumBands * sizeof(LVM_EQNB_BandDef_t) + \
 *     sizeof(LVCS_Data_t) + \
 *     sizeof(LVDBE_Data_FLOAT_t) + \
 *     sizeof(Biquad_2I_Order2_FLOAT_Taps_t) + \
 *     sizeof(Biquad_2I_Order2_FLOAT_Taps_t) + \
 *     pInstParams->EQNB_NumBands * sizeof(Biquad_2I_Order2_FLOAT_Taps_t) + \
 *     pInstParams->EQNB_NumBands * sizeof(LVEQNB_BandDef_t) + \
 *     pInstParams->EQNB_NumBands * sizeof(LVEQNB_BiquadType_en) + \
 *     2 * LVM_HEADROOM_MAX_NBANDS * sizeof(LVM_HeadroomBandDef_t) + \
 *     PSA_InitParams.nBands * sizeof(Biquad_1I_Order2_Taps_t) + \
 *     PSA_InitParams.nBands * sizeof(QPD_Taps_t)
 *
 * LVM_MEMREGION_PERSISTENT_FAST_COEF:
 *   Total Memory size:
 *     sizeof(LVM_TE_Coefs_t) + \
 *     sizeof(LVCS_Coefficient_t) + \
 *     sizeof(LVDBE_Coef_FLOAT_t) + \
 *     sizeof(Biquad_FLOAT_Instance_t) + \
 *     sizeof(Biquad_FLOAT_Instance_t) + \
 *     pInstParams->EQNB_NumBands * sizeof(Biquad_FLOAT_Instance_t) + \
 *     PSA_InitParams.nBands * sizeof(Biquad_Instance_t) + \
 *     PSA_InitParams.nBands * sizeof(QPD_State_t)
 *
 * LVM_MEMREGION_TEMPORARY_FAST (Scratch):
 *   Total Memory Size:
 *     BundleScratchSize + \
 *     MAX_INTERNAL_BLOCKSIZE * sizeof(LVM_FLOAT) + \
 *     MaxScratchOf (CS, EQNB, DBE, PSA)
 *
 *     a)BundleScratchSize:
 *         3 * LVM_MAX_CHANNELS \
 *         * (MIN_INTERNAL_BLOCKSIZE + InternalBlockSize) * sizeof(LVM_FLOAT)
 *       This Memory is allocated only when Buffer mode is LVM_MANAGED_BUFFER.
 *     b)MaxScratchOf (CS, EQNB, DBE, PSA)
 *       This Memory is needed for scratch usage for CS, EQNB, DBE, PSA.
 *       CS   = (LVCS_SCRATCHBUFFERS * sizeof(LVM_FLOAT)
 *               * pCapabilities->MaxBlockSize)
 *       EQNB = (LVEQNB_SCRATCHBUFFERS * sizeof(LVM_FLOAT)
 *               * pCapabilities->MaxBlockSize)
 *       DBE  = (LVDBE_SCRATCHBUFFERS_INPLACE*sizeof(LVM_FLOAT)
 *               * pCapabilities->MaxBlockSize)
 *       PSA  = (2 * pInitParams->MaxInputBlockSize * sizeof(LVM_FLOAT))
 *              one MaxInputBlockSize for input and another for filter output
 *     c)MAX_INTERNAL_BLOCKSIZE
 *       This Memory is needed for PSAInput - Temp memory to store output
 *       from McToMono block and given as input to PSA block
 */

LVM_ReturnStatus_en LVM_GetMemoryTable(LVM_Handle_t         hInstance,
                                       LVM_MemTab_t         *pMemoryTable,
                                       LVM_InstParams_t     *pInstParams)
@@ -168,7 +234,13 @@ LVM_ReturnStatus_en LVM_GetMemoryTable(LVM_Handle_t hInstance,
    AlgScratchSize    = 0;
    if (pInstParams->BufferMode == LVM_MANAGED_BUFFERS)
    {
#ifdef BUILD_FLOAT
        BundleScratchSize = 3 * LVM_MAX_CHANNELS \
                            * (MIN_INTERNAL_BLOCKSIZE + InternalBlockSize) \
                            * sizeof(LVM_FLOAT);
#else
        BundleScratchSize = 6 * (MIN_INTERNAL_BLOCKSIZE + InternalBlockSize) * sizeof(LVM_INT16);
#endif
        InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_TEMPORARY_FAST],        /* Scratch buffer */
                            BundleScratchSize);
        InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_SLOW_DATA],
@@ -369,8 +441,13 @@ LVM_ReturnStatus_en LVM_GetMemoryTable(LVM_Handle_t hInstance,
                PSA_MemTab.Region[LVM_PERSISTENT_FAST_COEF].Size);

            /* Fast Temporary */
#ifdef BUILD_FLOAT
            InstAlloc_AddMember(&AllocMem[LVM_TEMPORARY_FAST],
                                MAX_INTERNAL_BLOCKSIZE * sizeof(LVM_FLOAT));
#else
            InstAlloc_AddMember(&AllocMem[LVM_TEMPORARY_FAST],
                                MAX_INTERNAL_BLOCKSIZE * sizeof(LVM_INT16));
#endif

            if (PSA_MemTab.Region[LVM_TEMPORARY_FAST].Size > AlgScratchSize)
            {
@@ -559,13 +636,20 @@ LVM_ReturnStatus_en LVM_GetInstanceHandle(LVM_Handle_t *phInstance,
         */
        pInstance->pBufferManagement = InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_SLOW_DATA],
                                                           sizeof(LVM_Buffer_t));
#ifdef BUILD_FLOAT
        BundleScratchSize = (LVM_INT32)
                            (3 * LVM_MAX_CHANNELS \
                             * (MIN_INTERNAL_BLOCKSIZE + InternalBlockSize) \
                             * sizeof(LVM_FLOAT));
#else
        BundleScratchSize = (LVM_INT32)(6 * (MIN_INTERNAL_BLOCKSIZE + InternalBlockSize) * sizeof(LVM_INT16));
#endif
        pInstance->pBufferManagement->pScratch = InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_TEMPORARY_FAST],   /* Scratch 1 buffer */
                                                                     (LVM_UINT32)BundleScratchSize);
#ifdef BUILD_FLOAT
        LoadConst_Float(0,                                   /* Clear the input delay buffer */
                        (LVM_FLOAT *)&pInstance->pBufferManagement->InDelayBuffer,
                        (LVM_INT16)(2 * MIN_INTERNAL_BLOCKSIZE));
                        (LVM_INT16)(LVM_MAX_CHANNELS * MIN_INTERNAL_BLOCKSIZE));
#else
        LoadConst_16(0,                                                        /* Clear the input delay buffer */
                     (LVM_INT16 *)&pInstance->pBufferManagement->InDelayBuffer,