高通 Camx 架构了解下(二),android实战开发视频

2.3.2 ConfigureStream

2.3.3 Request & Result

request:

result:


一旦底层有事件上传就会走到SyncManagerPollMethod中:

file: vendor/qcom/proprietary/camx/src/csl/hw/camxsyncmanager.cpp

--> VOID* SyncManager::SyncManagerPollMethod(VOID* pPollData)

   |--> rc = poll(fds, 2, -1)   //监听的syncFd有事件上传

   |   |--> VOID* pData[] = {pEv, NULL};    //这里的pEv是包含回调方法的,根据setRepeatingRequest中的分析,这里的回调就是Node::CSLFenceCallback

   |   |--> ioctl(pCtrl->syncFd, VIDIOC_DQEVENT, pEv);  //取出事件

   |   |--> result = pCtrl->pThreadManager->PostJob(pCtrl->hJob, SyncManager::StoppedCbDispatchJob, pData, FALSE, FALSE);   //这里就会调到之前注册的线程并回调SyncManager::CbDispatchJob方法

       file: vendor/qcom/proprietary/camx/src/csl/hw/camxsyncmanager.cpp

   |   |--> VOID* SyncManager::CbDispatchJob(VOID* pData)

   |   |   |--> Utils::Memcpy(&ev, reinterpret_cast<struct v4l2_event*> (pData), sizeof(ev)); 

   |   |   |--> pPayloadData = CAM_SYNC_GET_PAYLOAD_PTR(ev, uint64_t);

   |   |   |--> reinterpret_cast<CSLFenceHandler>(pPayloadData[0]))(reinterpret_cast<VOID* >(pPayloadData[1]), pEvHeader->sync_obj, fenceResult);   //回调Node::CSLFenceCallback

           file: vendor/qcom/proprietary/camx/src/core/camxnode.cpp

   |   |   |--> VOID Node::CSLFenceCallback(...)

   |   |   |   |--> result = pNode->GetThreadManager()->PostJob(pNode->GetJobFamilyHandle(), NULL, &pData[0], FALSE, FALSE) //将工作放到JobFamilyHandle线程去做,回调Node::NodeThreadJobFamilyCb方法

   |   |   |   |   |--> VOID* Node::NodeThreadJobFamilyCb(...)  //因为是另一个线程处理,所以这个以缩进代表异步关系

   |   |   |   |   |   |--> FenceCallbackData* pFenceCallbackData = static_cast<FenceCallbackData*>(pCbData);  

   |   |   |   |   |   |--> NodeFenceHandlerData* pNodeFenceHandlerData = static_cast<NodeFenceHandlerData*>(pFenceCallbackData->pNodePrivateData);

   |   |   |   |   |   |--> pFenceCallbackData->pNode->ProcessFenceCallback(pNodeFenceHandlerData);

   |   |   |   |   |   |   |--> OutputPort* pOutputPort    = pFenceHandlerData->pOutputPort;

   |   |   |   |   |   |   |--> UINT64      requestId      = pFenceHandlerData->requestId;

   |   |   |   |   |   |   |--> UINT        requestIdIndex = requestId % MaxRequestQueueDepth;

   |   |   |   |   |   |   |--> m_pPipeline->NonSinkPortFenceSignaled(&pFenceHandlerData->hFence, pFenceHandlerData->requestId);    //如果是no sink port

                           file: vendor/qcom/proprietary/camx/src/core/camxpipeline.cpp

   |   |   |   |   |   |   |--> VOID Pipeline::NonSinkPortFenceSignaled(...)

   |   |   |   |   |   |   |   |--> m_pDeferredRequestQueue->FenceSignaledCallback(phFence, requestId);

                               file: vendor/qcom/proprietary/camx/src/core/camxdeferredrequestqueue.cpp

   |   |   |   |   |   |   |   |--> VOID DeferredRequestQueue::FenceSignaledCallback(...)

   |   |   |   |   |   |   |   |   |--> UpdateDependency(PropertyIDInvalid, phFence, NULL, requestId, 0, TRUE);

   |   |   |   |   |   |   |   |   |--> DispatchReadyNodes();

   |   |   |   |   |   |   |   |   |   |--> CamxResult result = m_pThreadManager->PostJob(m_hDeferredWorker, NULL, &pData[0], FALSE, FALSE);    //针对所有ready Nodes 循环处理,m_hDefferredWorker 对应的回调是DeferredWorkerWrapper

   |   |   |   |   |   |   |   |   |   |   |--> VOID* DeferredRequestQueue::DeferredWorkerWrapper(VOID* pData)  //异步调用,以缩进表示

   |   |   |   |   |   |   |   |   |   |   |   |--> Dependency* pDependency = reinterpret_cast<Dependency*>(pData);

   |   |   |   |   |   |   |   |   
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值