1. Camera Request 流程源碼分析

        共 11556字,需瀏覽 24分鐘

         ·

        2020-11-27 14:52

        和你一起終身學(xué)習(xí),這里是程序員Android

        經(jīng)典好文推薦,通過閱讀本文,您將收獲以下知識點:

        Camera 起預(yù)覽時候回調(diào)用CameraCaptureSession類的setRepeatingRequest方法,該方法的實現(xiàn)是由CameraCaptureSessionImpl來完成的。

        CameraCaptureSession.java (frameworks\base\core\java\android\hardware\camera2)

            // 主要功能實現(xiàn)是通過CameraCaptureSessionImpl 實現(xiàn)
        public abstract int setRepeatingRequest();

        CameraCaptureSessionImpl.java (frameworks\base\core\java\android\hardware\camera2\impl)

            public int setRepeatingRequest(CaptureRequest request,......){
        ... ...
        // 調(diào)用 CameraDeviceImpl中的 setRepeatingRequest方法
        return addPendingSequence(mDeviceImpl.setRepeatingRequest());
        ... ...
        }

        第一個參數(shù)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 調(diào)用 CameraDeviceClient 方法
        requestInfo = mRemoteDevice.submitRequestList(requestArray, repeating);
        ... ...
        }

        mRemoteDevice 是CameraServer進(jìn)程當(dāng)中執(zhí)行openCamera成功后返回給Client端Binder對象的代理,它和CameraServer進(jìn)程當(dāng)中的CameraDeviceClient對象是對應(yīng)的,只不過這里的mRemoteDevice還經(jīng)過了Framework一點包裝處理而已。

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

            binder::Status CameraDeviceClient::submitRequestList(){
        if(streaming){
        //預(yù)覽
        mDevice->setStreamingRequestList();
        }else{
        //拍照
        mDevice->captureList();
        }
        }

        Camera3Device.cpp (frameworks\av\services\camera\libcameraservice\device3)

            //預(yù)覽
        status_t Camera3Device::setStreamingRequestList(){
        //預(yù)覽和拍照都會調(diào)用到 submitRequestsHelper 方法
        submitRequestsHelper();
        }


        //拍照
        status_t Camera3Device::captureList(){
        //預(yù)覽和拍照都會調(diào)用到 submitRequestsHelper 方法
        submitRequestsHelper();
        }

        // submitRequestsHelper 方法實現(xiàn)
        status_t Camera3Device::submitRequestsHelper(){

        if (repeating) {
        //預(yù)覽流程 setRepeatingRequests處理
        res = mRequestThread->setRepeatingRequests(requestList, lastFrameNumber);
        } else {
        // 拍照流程處理 queueRequestList
        res = mRequestThread->queueRequestList(requestList, lastFrameNumber);
        }
        }
        //預(yù)覽
        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,再進(jìn)行下一次判斷
        if (waitIfPaused()) {
        return true;
        }
        // 最重要的三個方法 1.Wait for the next batch of requests.拍照請求的優(yōu)先級肯定是高于預(yù)覽請求
        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) {
        // 調(diào)用 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(){

        // 這個會跳轉(zhuǎn)到 Camxhal3entry.cpp 中的process_capture_request 方法, 需要繼續(xù)厘清跳轉(zhuǎn)地方
        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(){
        // 會跳轉(zhuǎn)到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(){
        //調(diào)用 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(){
        // 調(diào)用 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(){
        // 調(diào)用指定的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(){

        // 暫未找到跳轉(zhuǎn)到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

        至此,本篇已結(jié)束。轉(zhuǎn)載網(wǎng)絡(luò)的文章,小編覺得很優(yōu)秀,歡迎點擊閱讀原文,支持原創(chuàng)作者,如有侵權(quán),懇請聯(lián)系小編刪除。同時感謝您的閱讀,期待您的關(guān)注。

        點個在看,方便您使用時快速查找!

        瀏覽 122
        點贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
          
          

            1. 大香蕉久久伊人网 | 豆花av在线 | 在线无码免费 | 337p人体粉嫩久久久红粉影视 | 国产男女乱淫视频高清免费 |