咱们熟知的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优化的重点。架构
就像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
具体的注册过程你们能够根据我上面图提示的代码路径去看一下,这儿不赘述了。
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> ¬ification) 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的桥接了。
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顺利运行。
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硬件就是经过这个接口调用的。