[Android]Camera2——(1) camera模块初始化

本文深入分析了Android Camera2框架的初始化过程,包括CameraService的启动、CameraProviderManager的管理、hal层的交互,以及CameraProvider和ExternalCameraProvider的角色。通过源码解析,展示了从获取设备信息到初始化CameraDevice的详细步骤,帮助理解Android应用打开摄像头的流程。
摘要由CSDN通过智能技术生成

本系列文章旨在分析android应用打开摄像头并显示预览的流程。
文章将通过源码分析,总结和时序图的方式,帮助理解Camera2框架。
本篇文章将分析framework层camera相关模块的初始化,为后续分析打下基础。

1 相关源码分析

frameworks\av\camera\cameraserver\main_cameraserver.cpp

int main(int argc __unused, char** argv __unused)
{
    hardware::configureRpcThreadpool(3, /*willjoin*/ false);
    sp<ProcessState> proc(ProcessState::self());
    sp<IServiceManager> sm = defaultServiceManager();
    ALOGI("ServiceManager: %p", sm.get());
    // 通过service manager注册CameraService
    CameraService::instantiate();
    ProcessState::self()->startThreadPool();
    IPCThreadState::self()->joinThreadPool();
} 

调用了CameraService::instantiate(), 其最终调用service maneger的addService;

1.1 CameraService初始化

frameworks/av/services/camera/libcameraservice/CameraService.cpp
当CameraService派生自RefBase,当其第一次被引用时,有如下的调用:

void CameraService::onFirstRef() {
    ALOGI("CameraService process starting");
    BnCameraService::onFirstRef();
    ................
    // 从hal层的CameraProvider/ExternalCameraProvider获得摄像头设备
    res = enumerateProviders();
    ................
} 

enumerateProviders将通过hal服务CameraProvider/ExternalCameraProvider获取摄像头设备信息;

status_t CameraService::enumerateProviders() {
    status_t res;
    std::vector<std::string> deviceIds;
    {
        Mutex::Autolock l(mServiceLock);
        if (nullptr == mCameraProviderManager.get()) {
            // 初始化CameraProviderManager
            mCameraProviderManager = new CameraProviderManager();
            res = mCameraProviderManager->initialize(this);
        }
        ................
        ................
        deviceIds = mCameraProviderManager->getCameraDeviceIds();
    }
    
    for (auto& cameraId : deviceIds) {
        String8 id8 = String8(cameraId.c_str());
        onDeviceStatusChanged(id8, CameraDeviceStatus::PRESENT);
    }
    return OK;
} 

enumerateProvider将初始化CameraProviderManager,CameraProviderManager将通过hal服务来获取摄像头的信息。

1.2 CameraProviderManager

1.2.1 类结构

frameworks/av/services/camera/libcameraservice/common/CameraProviderManager.h
CameraProviderManager用于管理android设备上的camera provider,它会枚举出camera provider以及这些provider提供的摄像头设备,并提供方法去访问它们。

class CameraProviderManager : virtual public hidl::manager::V1_0::IServiceNotification {
public:
    ................
    ................
    struct HardwareServiceInteractionProxy : public ServiceInteractionProxy {
        virtual bool registerForNotifications(const std::string &serviceName, const sp<hidl::manager::V1_0::IServiceNotification> &notification) override {
            return hardware::camera::provider::V2_4::ICameraProvider::registerForNotifications(serviceName, notification);
        }
        virtual sp<hardware::camera::provider::V2_4::ICameraProvider> getService(const std::string &serviceName) override {
            return hardware::camera::provider::V2_4::ICameraProvider::getService(serviceName);
        }
    };
    ................
    status_t initialize(wp<StatusListener> listener, 
            ServiceInteractionProxy *proxy = &sHardwareServiceInteractionProxy);
    ................
private:
    ................
    static HardwareServiceInteractionProxy sHardwareServiceInteractionProxy;
    ................
} 

initialize方法的第二个参数是一个默认值,它是内部的静态对象,它能从获取对应的hal层服务。

1.2.2 CameraProviderManager::initialize

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值