ImageBufferManager介绍

一、背景

        imageBuffer在pipeline中扮演着非常重要的决策,负责图像数据在node之间的流转。在pipeline中node之间的连接是靠port来链接的,而port的连接正是通过共享内存(一组imageBuffer)来实现的。ImageBufferManager顾名思义就是管理这些ImageBuffer。

代码路径:vendor\qcom\proprietary\camx\src\core\camximagebuffermanager.cpp

                  vendor\qcom\proprietary\camx\src\core\camximagebuffer.cpp

ImageBufferManager通过两条单向链表来管理ImageBuffer,如下所示:

二、ImageBufferManager结构

LightweightDoublyLinkedList  m_freeBufferList;           ///< Free list of buffers which are available for use at any time.
LightweightDoublyLinkedList  m_busyBufferList;           ///< List of buffers given to the client.
LightweightDoublyLinkedList  m_cachedBufferList;         ///< List of all mapped gralloc buffers
BufferManagerCreateData      m_createData;               ///< Buffer Manager CreateData.
ImageFormat                  m_currentFormat;            ///< current using buffer format

其中,free_list用于用于存放能立刻拿到的buffer,busy_list用于存放已经被使用的buffer。m_createData用于保存需要额外创建的buffer信息(在ImageBuffer::Initialize中被赋值)。

看下ImageBufferManager创建buffer的规则:

struct BufferManagerCreateData
 {
    BOOL  allocateBufferMemory;              ///< 也就是初始化时创建的buffer所占用的内存
    UINT  immediateAllocBufferCount;         ///< 也就是初始化时创建的buffer个数,会添加到free-list的链表
    UINT  maxBufferCount;                    ///< 该manager中最多能分配多少个buffer
}

 其中的buffer信息是在pipelineline里面设置好的,如:

<BufferProperties>
     <BufferFormat>ChiFormatUBWCTP10 ChiFormatYUV420NV12</BufferFormat>
     <BufferImmediateAllocCount>8</BufferImmediateAllocCount>
     <BufferQueueDepth>8</BufferQueueDepth>
     <BufferHeap>Ion</BufferHeap>
     <BufferFlags>BufferMemFlagHw</BufferFlags>
</BufferProperties>

三、ImageBufferManager相关函数解析

1.ImageBufferManager::Create函数实现:

CamxResult ImageBufferManager::Create(
    const CHAR*              pBufferManagerName,
    BufferManagerCreateData* pCreateData,
    ImageBufferManager**     ppImageBufferManager)
 {
    CamxResult          result              = CamxResultSuccess;
    ImageBufferManager* pImageBufferManager = NULL;
    if (CamxResultSuccess == result)
    {
        *ppImageBufferManager = NULL;
        pImageBufferManager = CAMX_NEW ImageBufferManager();
    }

    if (CamxResultSuccess == result)
    {
        // 从内存池中为ImageBufferManager分配内存
        result = pImageBufferManager->Initialize(pBufferManagerName, pCreateData);
        if (CamxResultSuccess == result)
        {
            CAMX_LOG_INFO(CamxLogGroupMemMgr, "[%s] : allocRequired=%d, immediateAllocBufferCount=%d, maxBufferCount=%d", pBufferManagerName, pCreateData->allocateBufferMemory, pCreateData->immediateAllocBufferCount, pCreateData->maxBufferCount);
            // 初始化ImageBufferManager中的buffers,这里是重点
            result = pImageBufferManager->InitializeBuffers(pCreateData);
        }
    }
    if (CamxResultSuccess == result)
    {
        *ppImageBufferManager = pImageBufferManager;
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值