Camera Request 流程源码分析

Camera 起预览时候回调用CameraCaptureSession类的setRepeatingRequest方法,该方法的实现是由CameraCaptureSessionImpl来完成的。

Android Camera原理之camera service与camera provider session会话与capture request轮转_转载和创作优秀的博客-CSDN博客

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进程当中执行openCamera成功后返回给Client端Binder对象的代理,它和CameraServer进程当中的CameraDeviceClient对象是对应的,只不过这里的mRemoteDevice还经过了Framework一点包装处理而已。

android8 Open Camera2_转载和创作优秀的博客-CSDN博客

这篇博客会分析mRemoteDevice 实际上就是CameraDeviceClient 对象实例

CameraDeviceClient.cpp (frameworks\av\services\camera\libcameraservice\api2)

binder::Status CameraDeviceClient::submitRequestList(){
        if(streaming){
            //预览
            mDevice->setStreamingRequestList();
        }else{
            //拍照  
             mDevice->captureList();
        }
    }

 

看下mDevice变量在哪儿定义的,见下面代码第26行


err = mDevice->captureList(metadataRequestList, surfaceMapList,
                &(submitInfo->mLastFrameNumber));
				
				
				template <typename TClientBase>
Camera2ClientBase<TClientBase>::Camera2ClientBase(
        const sp<CameraService>& cameraService,
        const sp<TCamCallbacks>& remoteCallback,
        const String16& clientPackageName,
        const String8& cameraId,
        int cameraFacing,
        int clientPid,
        uid_t clientUid,
        int servicePid):
        TClientBase(cameraService, remoteCallback, clientPackageName,
                cameraId, cameraFacing, clientPid, clientUid, servicePid),
        mSharedCameraCallbacks(remoteCallback),
        mDeviceVersion(cameraService->getDeviceVersion(TClientBase::mCameraIdStr)),
        mDeviceActive(false)
{
    ALOGI("Camera %s: Opened. Client: %s (PID %d, UID %d)", cameraId.string(),
            String8(clientPackageName).string(), clientPid, clientUid);

    mInitialClientPid = clientPid;
    mDevice = new Camera3Device(cameraId);
    LOG_ALWAYS_FATAL_IF(mDevice == 0, "Device should never be NULL here.");
}

   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.拍照请求的优先级肯定是高于预览请求
        waitForNextRequestBatch();
        
        ... ...
        // 最重要的三个方法 2.Prepare a batch of HAL requests and output buffers. 
        res = prepareHalRequests();
        
        ... ...
        //最重要的三个方法 3.如果该值为true,那么继续循环 
        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 方法, 需要继续厘清跳转地方     
        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 执行的流程,拍照
         result = CameraUsecaseBase::ExecuteCaptureRequest(pRequest);
        }
    }
    
    
    CDKResult CameraUsecaseBase::ExecuteCaptureRequest(){
        // 没有任何Feature 执行的流程
        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();
    }
 
然后返回执行 Chxadvancedcamerausecase.cpp 的CameraUsecaseBase::ExecuteCaptureRequest方法

    CDKResult AdvancedCameraUsecase::ExecuteCaptureRequest(){
    
    
        if(TRUE == AdvancedFeatureEnabled()){
         result = pFeature->ExecuteProcessRequest(pRequest);
        }else{
        
        // 没有任何Feature 执行的流程
         result = CameraUsecaseBase::ExecuteCaptureRequest(pRequest);
        }
    }
    
    
    CDKResult CameraUsecaseBase::ExecuteCaptureRequest(){
        // 没有任何Feature 执行的流程
        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流程

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值