一、背景
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;