Camera Request 流程源码分析

最后

还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书+2021年最新大厂面试题。
在这里插入图片描述

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取




mRemoteDevice 是CameraServer进程当中执行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.拍照请求的优先级肯定是高于预览请求

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

写在最后

还有一份JAVA核心知识点整理(PDF):JVM,JAVA集合,JAVA多线程并发,JAVA基础,Spring原理,微服务,Netty与RPC,网络,日志,Zookeeper,Kafka,RabbitMQ,Hbase,MongoDB,Cassandra,设计模式,负载均衡,数据库,一致性哈希,JAVA算法,数据结构,加密算法,分布式缓存,Hadoop,Spark,Storm,YARN,机器学习,云计算…

image

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

没有任何Feature 执行的流程

     result = CameraUsecaseBase::ExecuteCaptureRequest(pRequest);

    }

}





CDKResult CameraUsecaseBase::ExecuteCaptureRequest(){

    // 没有任何Feature 执行的流程

    CheckAndActivatePipeline(m_sessions[session].pSession);

写在最后

还有一份JAVA核心知识点整理(PDF):JVM,JAVA集合,JAVA多线程并发,JAVA基础,Spring原理,微服务,Netty与RPC,网络,日志,Zookeeper,Kafka,RabbitMQ,Hbase,MongoDB,Cassandra,设计模式,负载均衡,数据库,一致性哈希,JAVA算法,数据结构,加密算法,分布式缓存,Hadoop,Spark,Storm,YARN,机器学习,云计算…

[外链图片转存中…(img-gwQqh4tg-1715818000798)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值