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

Commit db085f3f authored by Saketh Sathuvalli's avatar Saketh Sathuvalli Committed by Andy Hung
Browse files

libeffects: Corrected scratch memory size calculations

Corrected the scratch memory size calculations of bundle scratch for
floating point and multichannel builds.
Added comments detailing the usage and size calculation of
memories of various memories LVM.

Test: local native test (lvmtest)
Bug: 120874654
Change-Id: I69bb7faa106be5b82b4e579718afe0d1d3bb798d
parent 875cec7a
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,