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);
| | | | | | | |