MT6765平台 ISP40 VSDOF功能流程梳理--未完待续

一、初始化部分:

VSDOF init流程
功能的初始化入口:StreamingFeaturePipeline::init
initNodes中会检查各功能支持标志位,如果支持,则把对应Node添加到List中。
接下来通过两个模板类的,实现调用不同Node的onInit方法,VSDOF功能对应DepthNode,这里以后都是为VSDOF功能定制的初始化流程。

有几个重点函数:

  1. initializeBufferPool:
    依次调用所需的各个Node对应的initxxxBuffPool
    完成每个Node 需要的BufferPool创建,并完成allocate动作。
    每种数据缓冲池中buffer的数量就是在这里allocate时完成配置

  2. buildImageBufferPoolMap:
    构建bufferPoolMap,将第一步中创建的BufferPool与特定的key值绑定,存储到map中。方便后续根据使用场景取用

  3. TEST_AND_CREATE_NODE:
    检查各Node支持情况,如果支持,则创建对应类的实例。并将前面流程中定义的mpNodeSignal, mpDepthStorage, mpBufferPoolMgr传入各个node中,用于共享。
    各Node的构造函数中,主要完成:根据需要的数据,添加对应数量的addWaitQueue。

  4. buildPipeGraph:
    连接各个节点的数据流,完成图的构建。如下所示:
    pipeGraph

  5. mCamGraph.start:
    为各个Node起单独的线程,并执行onThreadLoop里面的流程

二、各个Node onThreadLoop的部分流程走向:

Node间的联系都是基于buildPipeGraph中创建的数据流走向。
在这里插入图片描述

三、缓冲池(buffer pool)中每个buffer的轮转流程

以N3DMaskBufPool_Main1为例:

  1. 创建buffer pool:
    CREATE_IMGBUF_POOL(mN3DMaskBufPool_Main1, "N3DMaskBufPool_Main1", rN3DSize.mWARP_MASK_SIZE,
                        eImgFmt_Y8, usage, MTRUE);
  1. 分配空间
ALLOCATE_BUFFER_POOL(mN3DMaskBufPool_Main1, VSDOF_WORKING_BUF_SET);
  1. 添加到mBIDtoImgBufPoolMap_Scenario中,方便后续根据实际场景需求取用
       MASKImgBufMap.add(eBUFFER_POOL_SCENARIO_PREVIEW, mN3DMaskBufPool_Main1);
       mBIDtoImgBufPoolMap_Scenario.add(BID_N3D_OUT_MASK_M, MASKImgBufMap);
  1. Node的流程中通过bufferID(BID_N3D_OUT_MASK_M)定位需要获取的具体buffer
IImageBuffer* pImgBuf_MASK_M = pBufferHandler->requestBuffer(getNodeId(), BID_N3D_OUT_MASK_M);

requestbuffer方法中通过bufferID与使用场景获取到buffer pool——对应第3步中构建的map
并从buffer pool中取出一个buffer。

SmartImageBuffer smImgBuf = mpBufferPoolMgr->request(bufferID, mReqAttr.bufferScenario);

SmartImageBuffer NodeBufferPoolMgr_VSDOF::request(DepthMapBufferID id, BufferPoolScenario scen)
{
        ……
        ssize_t index_2 = mBIDtoImgBufPoolMap_Scenario.indexOfKey(id);
        if(index_2 >= 0)
        {
            ScenarioToImgBufPoolMap ScenarioBufMap = mBIDtoImgBufPoolMap_Scenario.valueAt(index_2);
            if((index=ScenarioBufMap.indexOfKey(scen))>=0)
            {
                sp<ImageBufferPool> pBufferPool = ScenarioBufMap.valueAt(index);
                return pBufferPool->request(); //出栈
            }
        }
        ……
}
  1. addEnquedBuffer方法构建BID buffer map:
    将分配好的buffer添加到当前node对应的bidBufMap中
BIDToSmartBufferMap& bidBufMap = mEnqueBufferMap.editValueFor(srcNodeID);
bidBufMap.add(bufferID, smImgBuf);
  1. 针对申请到到buffer做Node对应的处理:
rN3dParam.maskMain1 = pImgBuf_MASK_M;
bRet = mpN3DHAL_VRPV->N3DHALRun(n3dParams, n3dOutput);
  1. 处理完成的数据传递给下一个目标Node
pBufferHandler->configOutBuffer(getNodeId(), BID_N3D_OUT_MASK_M, eDPETHMAP_PIPE_NODEID_DPE);

此方法主要完成从源Node的buffer Map(第五步中构建)中取出需要传递的buffer,并添加到目标Node的buffer Map中

queuedBufferMap = mEnqueBufferMap.valueFor(srcNodeID);
smBuf = queuedBufferMap.valueAt(bufIndex); //获取到对应buffer
this->addOutputBuffer(outNodeID, outBufferID, smBuf);
  1. 通知目标节点数据已就位
this->handleDataAndDump(N3D_TO_DPE_MVSV_MASK, pRequest);

调用目标节点的onDate,将对应的request添加到waitQueue中,然后在Node的onThreadLoop中从waitQueue中dequeue出来使用。
此处用到初始化流程第4步中buildPipeGraph方法构建的数据流向图

  1. 目标节点获取数据:
bRet &= pBufferHandler->getEnqueBuffer(getNodeId(), BID_N3D_OUT_MASK_M, pImgBuf_MASK_M);

从第7步中构建的buffer Map中去除对应的buffer,并传送到需要的位置做处理

 rDPEConfigVec.push_back(dpeConfig);
  1. 完成处理流程后清理buffer并返还到buffer pool
pBufferHandler->onProcessDone(getNodeId());

遗留部分:

四、DPEStream部分的流程

五、每个Node 输入/输出的具体数据是什么

六、每个Node具体使用拿到的数据做了什么处理

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值