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,这里是重点
            resu
<think>好的,我现在需要回答用户关于高通StreamOn和StreamOff函数的作用及用法的问题。用户已经提供了一些站内引用,我需要仔细分析这些引用并结合之前的对话内容来组织答案。首先,回顾用户的问题,用户想知道这两个函数的具体作用和用法。根据之前的对话,用户提到的camxcsl.cpp可能与相机系统的硬件抽象层有关,而现在的StreamOn和StreamOff可能涉及到数据流的启动和停止。接下来看用户提供的引用: 引用[1]中提到MSM_CAMERA_PRIV_STREAM_ON的处理流程,涉及发送事件到stream,并通过pipeline的send_event函数指针调用stream的send_event方法。这说明StreamOn可能触发硬件配置和数据流启动。引用[2]和引用[3]详细描述了Pipeline的StreamOn方法,包括通知CSL开启数据流,调用Node的OnNodeStreamOn方法,激活ImageBufferManager分配buffer,以及调用用户自定义的CHI方法。这里的关键点是StreamOn不仅启动数据流,还涉及资源准备和硬件配置。 引用[4]提到Pipeline管理硬件资源和数据流转,包含Node和Link,说明StreamOn/Off可能影响整个pipeline中的组件。 引用[5]列出VPU驱动中的ioctl命令,包括STREAMON和STREAMOFF,这通常用于控制视频流的开始和停止,可能与高通的实现类似。结合这些信息,可以推断StreamOn用于启动相机数据流,初始化硬件(如传感器寄存器配置),分配缓冲区,并通知各个节点准备处理数据。StreamOff则用于停止数据流,释放资源,关闭硬件输出。 需要将作用分为StreamOn和StreamOff两部分,分别说明其功能、调用流程和涉及的组件。同时,用法部分需要说明调用时机和相关API的层级结构,可能涉及CSL、Pipeline、Node等模块。还要注意用户之前的提问涉及camxcsl.cpp,可能CSL(Configuration SettingsLayer)在这里扮演重要角色,如引用[2]中的通知CSL开启数据流。因此,在回答中需要提到CSL层的作用。 最后,生成相关问题时要围绕StreamOn/Off的应用场景、调试方法、资源管理等方面。</think>### 高通 StreamOn 和 StreamOff 函数的作用及用法 #### 一、核心作用 1. **StreamOn 函数** - **硬件激活**: 启动相机传感器数据输出,配置寄存器使传感器开始生成图像数据[^3] - **资源分配**: 激活 `ImageBufferManager` 分配图像缓冲区,为数据流提供存储空间[^2] - **节点通知**: 调用 `OnNodeStreamOn` 方法通知流水线中的节点(如 Sensor/IFE)进入就绪状态,执行硬件参数配置(如曝光设置)[^3] - **用户自定义扩展**: 通过 CHI 层触发开发者定义的 `pOnStreamOn` 回调函数[^2] 2. **StreamOff 函数** - **硬件关闭**: 停止传感器数据输出,重置寄存器状态[^5] - **资源释放**: 释放 `ImageBufferManager` 分配的缓冲区,避免内存泄漏[^2] - **流水线清理**: 通知所有节点停止处理并重置内部状态,确保流水线可安全重启[^4] #### 二、调用流程示例 以相机启动流程为例,代码逻辑如下: ```cpp // 流启动核心路径 void Session::StreamOn() { pipeline->FinalizeDeferPipeline(); // 完成流水线初始化 pipeline->StreamOn(); // 触发 StreamOn 事件链 } // Pipeline 层的 StreamOn 实现 void Pipeline::StreamOn() { CSL_StreamOn(cslHandle); // 通过 CSL 层启动硬件数据流 for (auto node : nodes) { node->OnNodeStreamOn(); // 激活节点并分配缓冲区 } } ``` #### 三、关键技术点 1. **硬件交互层** - 通过 `CSL_StreamOn/CSL_StreamOff` 与芯片级硬件驱动通信,例如使用 `ioctl` 命令 `VIDIOC_STREAMON/VIDIOC_STREAMOFF`[^5] - 寄存器配置示例:设置传感器分辨率模式 $$ \text{WriteRegister}(0x301A, 0x10C2) \quad //\ 设置 1920\times1080 \text{ 模式} $$ 2. **资源管理机制** - `ImageBufferManager` 在 `Activate()` 时通过内存池预分配缓冲区: ```cpp void ImageBufferManager::Activate() { for (int i=0; i<BUFFER_COUNT; i++) { buffers[i] = AllocDMABuffer(1920, 1080); // 分配 DMA 缓冲区 } } ``` #### 四、典型应用场景 - **相机预览启动**: 调用 `StreamOn` 触发传感器出图并填充预览缓冲区 - **录像停止**: 执行 `StreamOff` 释放编码器占用的内存资源 - **异常恢复**: 在硬件超时错误时调用 `StreamOff` 重置流水线
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值