<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Camera Request 流程源碼分析

          共 11556字,需瀏覽 24分鐘

           ·

          2020-11-27 14:52

          和你一起終身學習,這里是程序員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)作者,如有侵權,懇請聯系小編刪除。同時感謝您的閱讀,期待您的關注。

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

          瀏覽 122
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

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

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日本一级红色片 | 日韩字幕| 免费看操逼片 | 青青青草在线视频 | 大香蕉女视频 |