Camera Request 流程源碼分析

和你一起終身學習,這里是程序員Android
經典好文推薦,通過閱讀本文,您將收獲以下知識點:
Camera 起預覽時候回調用CameraCaptureSession類的setRepeatingRequest方法,該方法的實現是由CameraCaptureSessionImpl來完成的。
CameraCaptureSession.java (frameworks\base\core\java\android\hardware\camera2)
// 主要功能實現是通過CameraCaptureSessionImpl 實現
public abstract int setRepeatingRequest();
CameraCaptureSessionImpl.java (frameworks\base\core\java\android\hardware\camera2\impl)
public int setRepeatingRequest(CaptureRequest request,......){
... ...
// 調用 CameraDeviceImpl中的 setRepeatingRequest方法
return addPendingSequence(mDeviceImpl.setRepeatingRequest());
... ...
}
第一個參數CaptureRequest只有一個Request,而在后面會將它包裝成List.
CameraDeviceImpl.java (frameworks\base\core\java\android\hardware\camera2\impl)
public int setRepeatingRequest(){
List<CaptureRequest> requestList = new ArrayList<CaptureRequest>();
requestList.add(request)
return submitCaptureRequest(requestList, callback, handler, /*streaming*/true);
}
private int submitCaptureRequest() {
... ...
// 通過Binder 調用 CameraDeviceClient 方法
requestInfo = mRemoteDevice.submitRequestList(requestArray, repeating);
... ...
}
mRemoteDevice 是CameraServer進程當中執(zhí)行openCamera成功后返回給Client端Binder對象的代理,它和CameraServer進程當中的CameraDeviceClient對象是對應的,只不過這里的mRemoteDevice還經過了Framework一點包裝處理而已。
CameraDeviceClient.cpp (frameworks\av\services\camera\libcameraservice\api2)
binder::Status CameraDeviceClient::submitRequestList(){
if(streaming){
//預覽
mDevice->setStreamingRequestList();
}else{
//拍照
mDevice->captureList();
}
}
Camera3Device.cpp (frameworks\av\services\camera\libcameraservice\device3)
//預覽
status_t Camera3Device::setStreamingRequestList(){
//預覽和拍照都會調用到 submitRequestsHelper 方法
submitRequestsHelper();
}
//拍照
status_t Camera3Device::captureList(){
//預覽和拍照都會調用到 submitRequestsHelper 方法
submitRequestsHelper();
}
// submitRequestsHelper 方法實現
status_t Camera3Device::submitRequestsHelper(){
if (repeating) {
//預覽流程 setRepeatingRequests處理
res = mRequestThread->setRepeatingRequests(requestList, lastFrameNumber);
} else {
// 拍照流程處理 queueRequestList
res = mRequestThread->queueRequestList(requestList, lastFrameNumber);
}
}
//預覽
status_t Camera3Device::RequestThread::setRepeatingRequests(){
... ...
}
//拍照
status_t Camera3Device::RequestThread::queueRequestList(){
... ...
}
//mRequestThread 流程分析
status_t Camera3Device::initializeCommonLocked() {
mRequestThread = new RequestThread();
res=mRequestThread->run();
}
//Camera3Device.h (frameworks\av\services\camera\libcameraservice\device3)
class RequestThread : public Thread {
... ...
}
bool Camera3Device::RequestThread::threadLoop(){
// Handle paused state. 如果沒有Request請求時,將會等待50ms,再進行下一次判斷
if (waitIfPaused()) {
return true;
}
// 最重要的三個方法 1.Wait for the next batch of requests.拍照請求的優(yōu)先級肯定是高于預覽請求
waitForNextRequestBatch();
... ...
// 最重要的三個方法 2.Prepare a batch of HAL requests and output buffers.
res = prepareHalRequests();
... ...
//最重要的三個方法 3.如果該值為true,那么繼續(xù)循環(huán)
submitRequestSuccess = sendRequestsBatch();
}
bool Camera3Device::RequestThread::sendRequestsBatch() {
res = mInterface->processBatchCaptureRequests(requests, &numRequestProcessed);
}
status_t Camera3Device::HalInterface::processBatchCaptureRequests(){
if (hidlSession_3_4 != nullptr) {
// 調用 CameraDeviceSession.cpp 中的方法
err = hidlSession_3_4->processCaptureRequest_3_4( );
} else {
err = mHidlSession->processCaptureRequest( );
}
}
CameraDeviceSession.cpp (hardware\interfaces\camera\device\3.4\default)
Return<void> CameraDeviceSession::processCaptureRequest_3_4(){
s = processOneCaptureRequest_3_4(requests[i])
}
Status CameraDeviceSession::processOneCaptureRequest_3_4(){
// 這個會跳轉到 Camxhal3entry.cpp 中的process_capture_request 方法, 需要繼續(xù)厘清跳轉地方
ATRACE_BEGIN("camera3->process_capture_request");
status_t ret = mDevice->ops->process_capture_request(mDevice, &halRequest);
ATRACE_END();
}
Camxhal3entry.cpp (vendor\qcom\proprietary\camx\src\core\hal)
int process_capture_request(){
// 會跳轉到Camxhal3.cpp process_capture_request 方法
pHAL3->process_capture_request(pCamera3DeviceAPI, pCaptureRequestAPI);
}
Camxhal3.cpp (vendor\qcom\proprietary\camx\src\core\hal)
static int process_capture_request(){
result = pHALDevice->ProcessCaptureRequest(pRequest);
}
Camxhaldevice.cpp (vendor\qcom\proprietary\camx\src\core\hal)
CamxResult HALDevice::ProcessCaptureRequest(){
//調用 Chxextensioninterface.cpp chi_override_process_request 方法
result = GetCHIAppCallbacks()->chi_override_process_request()
}
Chxextensioninterface.cpp (vendor\qcom\proprietary\chi-cdk\core\chiframework)
static CDKResult chi_override_process_request(){
// 調用 Chxextensionmodule.cpp OverrideProcessRequest方法
return pExtensionModule->OverrideProcessRequest();
}
Chxextensionmodule.cpp (vendor\qcom\proprietary\chi-cdk\core\chiframework)
CDKResult ExtensionModule::OverrideProcessRequest(){
//選取 Usecase 去做ProcessCaptureRequest操作
result = m_pSelectedUsecase[logicalCameraId]->ProcessCaptureRequest(pCaptureRequest);
}
Chxusecase.cpp (vendor\qcom\proprietary\chi-cdk\core\chiframework)
CDKResult Usecase::ProcessCaptureRequest(){
// 調用指定的UseCase
result = ExecuteCaptureRequest(pRequest);
}
Chxadvancedcamerausecase.cpp (vendor\qcom\proprietary\chi-cdk\core\chiusecase)
CDKResult AdvancedCameraUsecase::ExecuteCaptureRequest(){
if(TRUE == AdvancedFeatureEnabled()){
// AdvancedFeatureEnabled HDR MFNR
result = pFeature->ExecuteProcessRequest(pRequest);
}else{
// 沒有任何Feature 執(zhí)行的流程,拍照
result = CameraUsecaseBase::ExecuteCaptureRequest(pRequest);
}
}
CDKResult CameraUsecaseBase::ExecuteCaptureRequest(){
// 沒有任何Feature 執(zhí)行的流程
CheckAndActivatePipeline(m_sessions[session].pSession);
... ...
result = SubmitRequest(&submitRequest);
}
Chxusecase.h (vendor\qcom\proprietary\chi-cdk\core\chiframework)
CHX_INLINE CDKResult CheckAndActivatePipeline(){
//ActivatePipeline一般一個Feature 一個Pipeline,MFNR 有多個Pipeline
result = ExtensionModule::GetInstance()->ActivatePipeline();
}
Chxextensionmodule.cpp (vendor\qcom\proprietary\chi-cdk\core\chiframework)
CDKResult ExtensionModule::ActivatePipeline()
{
return g_chiContextOps.pActivatePipeline();
}
Camxchi.cpp (vendor\qcom\proprietary\camx\src\core\chi)
static CDKResult ChiActivatePipeline(){
result = pChiContext->ActivatePipeline();
}
Camxchicontext.cpp (vendor\qcom\proprietary\camx\src\core\chi)
CamxResult ChiContext::ActivatePipeline(){
result = pChiSession->StreamOn();
}
Camxsession.cpp (vendor\qcom\proprietary\camx\src\core)
CamxResult Session::StreamOn(){
result = pPipeline->StreamOn();
}
Camxpipeline.cpp (vendor\qcom\proprietary\camx\src\core)
CamxResult Pipeline::StreamOn(){
result = m_pChiContext->GetHwContext()->StreamOn();
}
Camxhwcontext.cpp (vendor\qcom\proprietary\camx\src\core)
CamxResult HwContext::StreamOn(){
result = CSLStreamOn();
}
Camxcsl.cpp (vendor\qcom\proprietary\camx\src\csl)
CamxResult CSLStreamOn(){
pJumpTable->CSLStreamOn();
}
Camxcslhw.cpp (vendor\qcom\proprietary\camx\src\csl\hw)
CamxResult CSLStreamOnHW(){
result = CSLHwStreamOnKMDHardwares();
}
Camxcslhwinternal.cpp (vendor\qcom\proprietary\camx\src\csl\hw)
CamxResult CSLHwStreamOnKMDHardwares(){
result = pHWDevice->deviceOp.StreamOn();
}
然后返回執(zhí)行 Chxadvancedcamerausecase.cpp 的CameraUsecaseBase::ExecuteCaptureRequest方法
CDKResult AdvancedCameraUsecase::ExecuteCaptureRequest(){
if(TRUE == AdvancedFeatureEnabled()){
result = pFeature->ExecuteProcessRequest(pRequest);
}else{
// 沒有任何Feature 執(zhí)行的流程
result = CameraUsecaseBase::ExecuteCaptureRequest(pRequest);
}
}
CDKResult CameraUsecaseBase::ExecuteCaptureRequest(){
// 沒有任何Feature 執(zhí)行的流程
CheckAndActivatePipeline(m_sessions[session].pSession);
//Chxusecase .cpp
result = SubmitRequest(&submitRequest);
}
Chxusecase.cpp (vendor\qcom\proprietary\chi-cdk\core\chiframework)
CDKResult Usecase::SubmitRequest(){
//
result = ExtensionModule::GetInstance()->SubmitRequest
}
Chxextensionmodule.cpp (vendor\qcom\proprietary\chi-cdk\core\chiframework)
CDKResult ExtensionModule::SubmitRequest(){
result = g_chiContextOps.pSubmitPipelineRequest();
}
Camxchi.cpp (vendor\qcom\proprietary\camx\src\core\chi)
static CDKResult ChiSubmitPipelineRequest(){
result = pChiContext->SubmitRequest();
}
Camxchicontext.cpp (vendor\qcom\proprietary\camx\src\core\chi)
CamxResult ChiContext::SubmitRequest(){
result = pSession->ProcessCaptureRequest();
}
Camxsession.cpp (vendor\qcom\proprietary\camx\src\core)
CamxResult Session::ProcessCaptureRequest(){
// 暫未找到跳轉到ProcessRequest 的地方
}
CamxResult Session::ProcessRequest(){
result = m_pipelineData[rRequest.pipelineIndex].pPipeline->OpenRequest();
//
result = m_pipelineData[rRequest.pipelineIndex].pPipeline->ProcessRequest();
}
Camxpipeline.cpp (vendor\qcom\proprietary\camx\src\core)
CamxResult Pipeline::ProcessRequest(){
m_ppOrderedNodes[nodeIndex]->SetupRequest();
result = m_pDeferredRequestQueue->AddDeferredNode();
// Consider any nodes now ready
m_pDeferredRequestQueue->DispatchReadyNodes();
}
Camxdeferredrequestqueue.cpp (vendor\qcom\proprietary\camx\src\core)
VOID DeferredRequestQueue::DispatchReadyNodes(){
... ...
}

CamxRequest流程
參考文章
1.https://blog.csdn.net/sinat_22657459/article/details/92380466
2.https://blog.csdn.net/TaylorPotter/article/details/105630341
至此,本篇已結束。轉載網絡的文章,小編覺得很優(yōu)秀,歡迎點擊閱讀原文,支持原創(chuàng)作者,如有侵權,懇請聯系小編刪除。同時感謝您的閱讀,期待您的關注。
點個在看,方便您使用時快速查找!
