Camera Open 流程源码分析

connectDevice 会调用到 connectHelper 方法




Status CameraService::connectHelper(){



        // 闪光灯进入预准备阶段

        mFlashlight->prepareDeviceOpen(cameraId);



        //获取当前设备的Version

        int deviceVersion = getDeviceVersion(cameraId, /*out*/&facing);

        

        

        // 初始化CameraproviderManager

        err = client->initialize(mCameraProviderManager, mMonitorTags);

        

        }





4.CameraProviderManager.cpp

(frameworks\av\services\camera\libcameraservice\common)




status_t CameraProviderManager::initialize(wp<CameraProviderManager::StatusListener> listener,

        ServiceInteractionProxy* proxy) {

        // 调用 addProviderLocked 方法

        for (const auto& instance : mServiceProxy->listServices()) {

            this->addProviderLocked(instance);

        }

        

        }

        

status_t CameraProviderManager::addProviderLocked(const std::string& newProvider) {

         

        sp<ProviderInfo> providerInfo = new ProviderInfo(newProvider, this);

        status_t res = providerInfo->initialize(interface, mDeviceState);



}



//ProviderInfo::initialize 初始化方法

status_t CameraProviderManager::ProviderInfo::initialize(){





     status_t res = addDevice(device, common::V1_0::CameraDeviceStatus::PRESENT, &id);



}       





status_t CameraProviderManager::ProviderInfo::addDevice(const std::string& name,

        CameraDeviceStatus initialStatus, /*out*/ std::string* parsedId) {

        

        //

        deviceInfo = initializeDeviceInfo<DeviceInfo3>(name, mProviderTagid,

                    id, minor);

        

        }

        

        

std::unique_ptr<CameraProviderManager::ProviderInfo::DeviceInfo>

    CameraProviderManager::ProviderInfo::initializeDeviceInfo(){

        // 后续调用待完善 如何 跳转到 Camera3device.cpp 的initialize 方法

        return std::unique_ptr<DeviceInfo>(

        new DeviceInfoT(name, tagId, id, minorVersion, resourceCost, this,

                mProviderPublicCameraIds, cameraInterface));

    }

    

 



5.Camera3Device.cpp

(frameworks\av\services\camera\libcameraservice\device3)


status_t Camera3Device::initialize(sp<CameraProviderManager> manager, const String8& monitorTags) {



        // 调用 CameraProviderManager openSession

        ATRACE_BEGIN("CameraHal::openSession");

        status_t res = manager->openSession(mId.string(), this,

                /*out*/ &session);

        ATRACE_END();



        return initializeCommonLocked();

}





6.CameraProviderManager.cpp

(frameworks\av\services\camera\libcameraservice\common)


status_t CameraProviderManager::openSession(const std::string &id,

        const sp<device::V3_2::ICameraDeviceCallback>& callback,

        /*out*/

        sp<device::V3_2::ICameraDeviceSession> *session) {

        

            auto interface = deviceInfo3->startDeviceInterface<

            CameraProviderManager::ProviderInfo::DeviceInfo3::InterfaceT>();

            

            ret = interface->open(callback, [&status, &session]

            (Status s, const sp<device::V3_2::ICameraDeviceSession>& cameraSession) {

                status = s;

                if (status == Status::OK) {

                    *session = cameraSession;

                }

            });

        

        

        }





7.ICameraDevice.hal

(hardware\interfaces\camera\device\3.2)


//Power on and initialize this camera device for active use, returning a

//session handle for active operations.

 open(ICameraDeviceCallback callback) generates

            (Status status, ICameraDeviceSession session);

            



8.CameraDevice.cpp

(hardware\interfaces\camera\device\3.2\default)


Return<void> CameraDevice::open(const sp<ICameraDeviceCallback>& callback,

        ICameraDevice::open_cb _hidl_cb)  {

        

        

        /** Open HAL device */

        status_t res;

        camera3_device_t *device;

        // 1. 开始 open Hal Device 

        ATRACE_BEGIN("camera3->open");

        res = mModule->open(mCameraId.c_str(),

                reinterpret_cast<hw_device_t**>(&device));

        ATRACE_END();

        

        // 2. 获取Camera 信息

        res = mModule->getCameraInfo(mCameraIdInt, &info);

        

        // 3. 创建 CameraDeviceSession

        session = createSession(device, info.static_camera_characteristics, callback);

        }



  1. CameraModule.cpp

    (hardware\interfaces\camera\common\1.0\default)


int CameraModule::open(const char* id, struct hw_device_t** device) {

    int res;

    ATRACE_BEGIN("camera_module->open");

    res = filterOpenErrorCode(mModule->common.methods->open(&mModule->common, id, device));

    ATRACE_END();

    return res;

}



10.Camxhal3entry.cpp

(vendor\qcom\proprietary\camx\src\core\hal)


int open(

    const struct hw_module_t*   pHwModuleAPI,

    const char*                 pCameraIdAPI,

    struct hw_device_t**        ppHwDeviceAPI)

{

    /// @todo (CAMX-43) - Reload Jumptable from settings

    JumpTableHAL3* pHAL3 = static_cast<JumpTableHAL3*>(g_dispatchHAL3.GetJumpTable());

    

    return pHAL3->open(pHwModuleAPI, pCameraIdAPI, ppHwDeviceAPI);

}



11.Camxhal3.cpp

(vendor\qcom\proprietary\camx\src\core\hal)


static int open(){

    // 检查CameraId 是否有效

    cameraId = OsUtils::StrToUL(pCameraIdAPI, &pNameEnd, 10);

    

    // 检查闪光灯状态,如果 on 状态,需要off 

    HAL3Module::GetInstance()->ReserveTorchForCamera(

                GetCHIAppCallbacks()->chi_remap_camera_id(cameraId, IdRemapTorch), cameraId);

    

    // 调用 Camxhal3module ProcessCameraOpen 方法

    result = HAL3Module::GetInstance()->ProcessCameraOpen(logicalCameraId, &extend);

    

    // 创建HalDevice 实例并初始化

    pHALDevice = HALDevice::Create(pHwModule, logicalCameraId, cameraId);

}



12.Camxhal3module.cpp

(vendor\qcom\proprietary\camx\src\core\hal)


CamxResult HAL3Module::ProcessCameraOpen(){



    result = m_ChiAppCallbacks.chi_extend_open(logicalCameraId, pPriv);

}



13.Chxextensioninterface.cpp

(vendor\qcom\proprietary\chi-cdk\core\chiframework)


static CDKResult chi_extend_open(){



    ExtensionModule* pExtensionModule = ExtensionModule::GetInstance();

    CHX_LOG_DEBUG("[OP_EXT] OPEN_CAMERA E cameraId %d", cameraId);

    CDKResult result = pExtensionModule->ExtendOpen(cameraId, priv);

    CHX_LOG_DEBUG("[OP_EXT] OPEN_CAMERA X");

}



14.Chxextensionmodule.cpp

(vendor\qcom\proprietary\chi-cdk\core\chiframework)


CDKResult ExtensionModule::ExtendOpen(){



    // 调用 Perflock 提高 opencamera  性能

    m_pPerfLockManager[logicalCameraId] = PerfLockManager::Create();

    

    if (PERF_LOCK_OPEN_CAMERA != m_previousPowerHint)

    { 



         m_pPerfLockManager[logicalCameraId]->ReleasePerfLock(m_previousPowerHint);

         m_pPerfLockManager[logicalCameraId]->AcquirePerfLock(PERF_LOCK_OPEN_CAMERA, 10000);

         m_previousPowerHint = PERF_LOCK_OPEN_CAMERA;

    }

    // open 结束返回到 camxhal3.cpp

}



15.Camxhal3.cpp

(vendor\qcom\proprietary\camx\src\core\hal)


static int open(){

    // 检查CameraId 是否有效

    cameraId = OsUtils::StrToUL(pCameraIdAPI, &pNameEnd, 10);

    

    // 检查闪光灯状态,如果 on 状态,需要off 

    HAL3Module::GetInstance()->ReserveTorchForCamera(

                GetCHIAppCallbacks()->chi_remap_camera_id(cameraId, IdRemapTorch), cameraId);

    

    // 调用 Camxhal3module ProcessCameraOpen 方法

    result = HAL3Module::GetInstance()->ProcessCameraOpen(logicalCameraId, &extend);

    

    // 创建HalDevice 实例并初始化

    pHALDevice = HALDevice::Create(pHwModule, logicalCameraId, cameraId);

}



16.Camxhaldevice.cpp

(vendor\qcom\proprietary\camx\src\core\hal)




HALDevice* HALDevice::Create(){



    result = pHALDevice->Initialize(pHwModule, cameraId);



}



CamxResult HALDevice::Initialize(){

  ... ...

  

  // 初始化完成后,需要返回 CameraDevice.cpp 中继续执行 open 中的方法

}



17.CameraDevice.cpp

(hardware\interfaces\camera\device\3.2\default)


Return<void> CameraDevice::open(const sp<ICameraDeviceCallback>& callback,

        ICameraDevice::open_cb _hidl_cb)  {

        

        

        /** Open HAL device */

        status_t res;

        camera3_device_t *device;

        // 1. 开始 open Hal Device 

        ATRACE_BEGIN("camera3->open");

        res = mModule->open(mCameraId.c_str(),

                reinterpret_cast<hw_device_t**>(&device));

        ATRACE_END();

        

        // 2. 获取Camera 信息

        res = mModule->getCameraInfo(mCameraIdInt, &info);

        



### 最后

我见过很多技术leader在面试的时候,遇到处于迷茫期的大龄程序员,比面试官年龄都大。这些人有一些共同特征:可能工作了5、6年,还是每天重复给业务部门写代码,工作内容的重复性比较高,没有什么技术含量的工作。问到这些人的职业规划时,他们也没有太多想法。

其实30岁到40岁是一个人职业发展的黄金阶段,一定要在业务范围内的扩张,技术广度和深度提升上有自己的计划,才有助于在职业发展上有持续的发展路径,而不至于停滞不前。

不断奔跑,你就知道学习的意义所在!

![](https://img-blog.csdnimg.cn/img_convert/8ca12bf15665e216c2a094ca89288192.webp?x-oss-process=image/format,png)



![](https://img-blog.csdnimg.cn/img_convert/606647e473aae2fed0498af97080e9f2.webp?x-oss-process=image/format,png)




**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化学习资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618156601)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

 res = mModule->getCameraInfo(mCameraIdInt, &info);

        



### 最后

我见过很多技术leader在面试的时候,遇到处于迷茫期的大龄程序员,比面试官年龄都大。这些人有一些共同特征:可能工作了5、6年,还是每天重复给业务部门写代码,工作内容的重复性比较高,没有什么技术含量的工作。问到这些人的职业规划时,他们也没有太多想法。

其实30岁到40岁是一个人职业发展的黄金阶段,一定要在业务范围内的扩张,技术广度和深度提升上有自己的计划,才有助于在职业发展上有持续的发展路径,而不至于停滞不前。

不断奔跑,你就知道学习的意义所在!

[外链图片转存中...(img-Kba3cKWQ-1714482689907)]



[外链图片转存中...(img-S1MVNHr4-1714482689907)]




**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化学习资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618156601)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值