Android Camera原理之cameraserver与cameraprovider是怎样联系的

咱们熟知的camera架构是下面这张图:android

底层是camera driver,和硬件强相关;camera driver上层是操做驱动的camera HAL层,这也是各家厂商camera的核心代码,厂商封装好本身的代码,没必要遵照开源条件,camera HAL层也是修改优化的重点,这一块是跑在camera provider进程中的,下面会详细分析一下。camera service是camera provider和上层通讯的桥梁,只是做为一个中间层。camera framework是开发者熟知的调用接口。c++

camera架构 (1).jpgcookie

 

camera framework和camera service层你们可能都比较熟悉,可是camera provider,就是咱们熟知的Camera HAL层,这一块咱们还不是很清楚。咱们本文主要就是想帮助你们理解清楚camera service与camera provider之间的联系。数据结构

前面已经讲了不少camera framework与camera service之间的调用联系和相互关系,这儿不展开描述了,camera HAL层一直比较神秘,由于google真是为了保证各家厂商能够完整保护本身的硬件源码,才在camera driver基础上搞了一个camera HAL,便于各家厂商封装本身的接口,因此各家厂商的camera HAL层实际上是不开源的,这也是各家厂商camera优化的重点。架构

1.camera provider是什么时候注册的?

就像aidl是framework和service之间IPC的通讯方式,实际上经过Binder IPC,camera provider与camera service之间的通讯也会借助一个载体hal ----> hardware abstract layer(硬件抽象层)。ide

下面看下具体的hal代码例子。函数

image.png优化

 

编译的时候会自动生成 .h 文件,这个里面包含的接口能够保证camera provider与 camera service直接通讯调用。ui

./out/soong/.intermediates/hardware/interfaces/camera/provider/2.4/android.hardware.camera.provider@2.4_genc++_headers/gen/android/hardware/camera/provider/2.4/ICameraProvider.h
./out/soong/.intermediates/hardware/interfaces/camera/provider/2.4/android.hardware.camera.provider@2.4_genc++_headers/gen/android/hardware/camera/provider/2.4/ICameraProviderCallback.hthis

言归正传,咱们知道camera provider主要处理 camera HAL的功能,camera service要和camera provider通讯,也是跨进程调用,原理和aidl相似的,也是须要注册service的。具体的注册过程以下:

下图反映了cameraprovider启动的时候,共注册了两个provider,一个名为 legacy/0 ,另外一个是 external/0

camera provider注册流程.jpg

 

具体的注册过程你们能够根据我上面图提示的代码路径去看一下,这儿不赘述了。

2.camera service如何调用camera provider?

camera provider注册的地方已经知道,有注册确定有调用,调用的地方就在camera service,为了方便你们的理解,直接贴上一张时序图,你们能够对照代码本身看看。

camera provider调用流程.jpg

 

从上面的调用流程来看,cameraservice初始化的时候,也会创建camera service和camera provider之间的联系,将创建的providerInfo放在内存中,以后直接取内存中的providerInfo,能够从camera service调用到camera provider了。

可是这儿我仍是要讲一讲具体的联系过程:

status_t CameraProviderManager::initialize(wp<CameraProviderManager::StatusListener> listener,
        ServiceInteractionProxy* proxy) {
    std::lock_guard<std::mutex> lock(mInterfaceMutex);
    if (proxy == nullptr) {
        ALOGE("%s: No valid service interaction proxy provided", __FUNCTION__);
        return BAD_VALUE;
    }
    mListener = listener;
    mServiceProxy = proxy;
 
    // Registering will trigger notifications for all already-known providers
    bool success = mServiceProxy->registerForNotifications(
        /* instance name, empty means no filter */ "",
        this);
    if (!success) {
        ALOGE("%s: Unable to register with hardware service manager for notifications "
                "about camera providers", __FUNCTION__);
        return INVALID_OPERATION;
    }
 
    // See if there's a passthrough HAL, but let's not complain if there's not
    addProviderLocked(kLegacyProviderName, /*expected*/ false);
    addProviderLocked(kExternalProviderName, /*expected*/ false);
 
    return OK;
}

上面是CameraProviderManager的初始化过程,CameraProviderManager就是管理camera Service与camera provider之间通讯的工程管理类,两个参数,其中第二个参数就是远程代理类。这个参数已是默认赋值了。不信能够看下CameraProviderManager::initialize的定义。

status_t initialize(wp<StatusListener> listener,
            ServiceInteractionProxy *proxy = &sHardwareServiceInteractionProxy);

这是定义,默认值就是 ----> sHardwareServiceInteractionProxy,这个sHardwareServiceInteractionProxy是 ----> HardwareServiceInteractionProxy 的实例,能够看出在HardwareServiceInteractionProxy定义中,已经直接调用了ICameraProvider--->getService(...)了。

// Standard use case - call into the normal generated static methods which invoke
// the real hardware service manager
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);
    }
};

CameraProviderManager::initialize 中加入了两个ProviderName,就是咱们camera provider的两个service name -----> (legacy/0 extrenal/0)
addProviderLocked(kLegacyProviderName, /expected/ false);
addProviderLocked(kExternalProviderName, /expected/ false);
这儿就实现了camera service与camera provider的桥接了。

3.CameraProviderManager→ProviderInfo数据结构

CameraProviderManager中提供了一个ProviderInfo来保存Camera provider信息,方便管理camera service调用 camera provider,下面分析一下ProviderInfo是怎么样的?方便咱们接下来从这个为切入掉分析camera provider里面代码。

struct ProviderInfo :
        virtual public hardware::camera::provider::V2_4::ICameraProviderCallback,
        virtual public hardware::hidl_death_recipient
{
    const std::string mProviderName;
    const sp<hardware::camera::provider::V2_4::ICameraProvider> mInterface;
 
    ProviderInfo(const std::string &providerName,
            sp<hardware::camera::provider::V2_4::ICameraProvider>& interface,
            CameraProviderManager *manager);
 
 
    status_t initialize();
    status_t addDevice(const std::string& name,
            hardware::camera::common::V1_0::CameraDeviceStatus initialStatus =
            hardware::camera::common::V1_0::CameraDeviceStatus::PRESENT,
            /*out*/ std::string *parsedId = nullptr);
 
 
    // ICameraProviderCallbacks interface - these lock the parent mInterfaceMutex
    virtual hardware::Return<void> cameraDeviceStatusChange(
            const hardware::hidl_string& cameraDeviceName,
            hardware::camera::common::V1_0::CameraDeviceStatus newStatus) override;
    virtual hardware::Return<void> torchModeStatusChange(
            const hardware::hidl_string& cameraDeviceName,
            hardware::camera::common::V1_0::TorchModeStatus newStatus) override;
 
 
    // hidl_death_recipient interface - this locks the parent mInterfaceMutex
    virtual void serviceDied(uint64_t cookie, const wp<hidl::base::V1_0::IBase>& who) override;
 
 
    //......
};

ProviderInfo继承了 hardware::camera::provider::V2_4::ICameraProviderCallback 与 hardware::hidl_death_recipient,其中ProviderInfo 第 2个参数就是camera service与cameraprovider通讯的IPC接口,保证两层能够顺利通讯。

ICameraProviderCallback 是 camera provider的 回调接口,也是能够IPC间通讯的,hardware::hidl_death_recipient 是hal层的死亡回调接口,方便在底层死亡的时候通知上层。

initialize() ----> initialize 函数的主要做用是初始化camera provider,而且IPC调用到camera provider 获取camera device信息,而后调用 addDevice接口将获取的camera device保存在内存中。

addDevice ----> 将底层获取的camera device信息保存在camera service中,防止屡次跨进程调用。

cameraDeviceStatusChange 与 torchModeStatusChange 都是 ICameraProviderCallback 的回调函数,当camera provider发生变化的时候须要通知上层这些变化。

serviceDied 是 hardware::hidl_death_recipient 的回调函数,当底层发生问题的时候会通知上层变化。

咱们在camera service中就是使用 ProviderInfo 来和底层的camera provider通讯,保存camera device顺利运行。

4.ProviderInfo ----> DeviceInfo3数据结构

ProviderInfo中还有几个DeviceInfo类型的数据结构,可是最新的都是采用了DeviceInfo3数据结构,因此这里只关注DeviceInfo3

// HALv3-specific camera fields, including the actual device interface
struct DeviceInfo3 : public DeviceInfo {
    typedef hardware::camera::device::V3_2::ICameraDevice InterfaceT;
    const sp<InterfaceT> mInterface;
 
    virtual status_t setTorchMode(bool enabled) override;
    virtual status_t getCameraInfo(hardware::CameraInfo *info) const override;
    virtual bool isAPI1Compatible() const override;
    virtual status_t dumpState(int fd) const override;
    virtual status_t getCameraCharacteristics(
            CameraMetadata *characteristics) const override;
 
    DeviceInfo3(const std::string& name, const metadata_vendor_id_t tagId,
            const std::string &id, uint16_t minorVersion,
            const hardware::camera::common::V1_0::CameraResourceCost& resourceCost,
            sp<InterfaceT> interface);
    virtual ~DeviceInfo3();
private:
    CameraMetadata mCameraCharacteristics;
};

DeviceInfo3中定义的InterfaceT 是 hardware::camera::device::V3_2::ICameraDevice 类型。

./hardware/interfaces/camera/device/3.2/ICameraDevice.hal ----> ./out/soong/.intermediates/hardware/interfaces/camera/device/3.2/android.hardware.camera.device@3.2_genc++_headers/gen/android/hardware/camera/device/3.2/ICameraDevice.h

操做底层camera device硬件就是经过这个接口调用的。

相关文章
相关标签/搜索