Camera Provider

android 8 以后,谷歌引入Treble,其原理基于接口与实现的分离的设计原则实现,自此谷歌加入了Camera Provider这一抽象层,该层作为一个独立进程存在于整个系统中。并且通过HIDL这一自定义语言成功地将Camera Hal Module从Camera Service中解耦出来,承担起了对Camera HAL的封装工作。纵观整个Android系统,对于Camera Provider而言,对上是通过HIDL接口负责与Camera Service的跨进程通信,对下通过标准的HAL3接口下发针对Camera的实际操作。

           Camera Provider通过提供标准的HIDL接口给Camera Service进行调用,保持与Service的正常通信,其中谷歌将HIDL接口的定义直接暴露给平台厂商进行自定义实现,其中为了极大地减轻并降低开发者的工作量和开发难度,谷歌很好地封装了其跨进程实现细节,同样地,Camera Provider通过标准的HAL3接口,向下控制着具体的Camera HAL Module,而这个接口依然交由平台厂商负责去实现,而进程内部则通过简单的函数调用,将HIDL接口与HAL3接口完美的衔接起来,由此构成了Provider整体架构。

由图中可以看出Camera Provider进程由两部分组成,一是运行在系统中的主程序通过提供了标准的HIDL接口保持了与Camera Service的跨进程通讯,二是为了进一步扩展其功能,通过dlopen方式加载了一系列So库,而其中就包括了实现了Camera HAL3接口的So库,而HAL3接口主要定义了主要用于实现图像控制的功能,其实现主要交由平台厂商或者开发者来完成,所以Camera HAL3 So库的实现各式各样,各个手机厂商都有不同,本文重点需要分析的RK 的hal3框架

 在开始梳理之前。先从上到下,以接口为主线简单梳理下Camera Provider的各个部分:

二、Camera HIDL 接口

首先需要明确一个概念,就是HIDL是一种自定义语言,其核心是接口的定义,而谷歌为了使开发者将注意力落在接口的定义上而不是机制的实现上,主动封装了HIDL机制的实现细节,开发者只需要通过*.hal文件定义接口,填充接口内部实际的实现即可,接下来来看下具体定义的几个主要接口:

因为HIDL机制本身是跨进程通讯的,所以Camera Service本身通过HIDL接口获取的对象都会有Bn端和Bp端,分别代表了Binder两端,接下来为了方便理解,我们都省略掉Bn/Bp说法,直接用具体接口类代表,忽略跨进程两端的区别。
hardware/interfaces/camera/provider/2.4/ICameraProvider.hal源码如下:

package android.hardware.camera.provider@2.4;

import ICameraProviderCallback;
import android.hardware.camera.common@1.0::types;
import android.hardware.camera.device@1.0::ICameraDevice;
import android.hardware.camera.device@3.2::ICameraDevice;


interface ICameraProvider {
    setCallback(ICameraProviderCallback callback) generates (Status status);
    getVendorTags() generates (Status status, vec<VendorTagSection> sections);
    getCameraIdList()
            generates (Status status, vec<string> cameraDeviceNames);
    isSetTorchModeSupported() generates (Status status, bool support);

    getCameraDeviceInterface_V1_x(string cameraDeviceName) generates
            (Status status,
             android.hardware.camera.device@1.0::ICameraDevice device);
    getCameraDeviceInterface_V3_x(string cameraDeviceName) generates
            (Status status,
             android.hardware.camera.device@3.2::ICameraDevice device);

};

该文件中定义了ICameraProvider接口类,由CameraProvider继承并实现,在Camera Provider启动的时候被实例化,主要接口如下:

    getCameraDeviceInterface_V3_x: 该方法主要用于Camera Service获取ICameraDevice,通过该对象可以控制Camera 设备的诸如配置数据流、下发request等具体行为。
    setCallback: 将Camera Service 实现的ICameraProviderCallback传入Camera Provider,一旦Provider有事件产生时便可以通过该对象通知Camera Service。

hardware/interfaces/camera/provider/2.4/ICameraProviderCallback.hal源码如下:

package android.hardware.camera.provider@2.4;

import android.hardware.camera.common@1.0::types;

interface ICameraProviderCallback {
    cameraDeviceStatusChange(string cameraDeviceName,
            CameraDeviceStatus newStatus);
    torchModeStatusChange(string cameraDeviceName,
            TorchModeStatus newStatus);

};

该文件中定义了ICameraProviderCallback回调接口类,该接口由Camera Service 中的CameraProviderManager::ProviderInfo继承并实现,在Camera Service 启动的时候被实例化,通过调用ICameraProvider::setCallback接口注册到Camera Provider中,其主要接口如下:

    cameraDeviceStatusChange: 将Camera 设备状态上传至Camera Service,状态由CameraDeviceStatus定义

hardware/interfaces/camera/device/3.2/ICameraDevice.hal源码如下: 

package android.hardware.camera.device@3.2;

import android.hardware.camera.common@1.0::types;
import ICameraDeviceSession;
import ICameraDeviceCallback;
interface ICameraDevice {
    getResourceCost() generates (Status status, CameraResourceCost resourceCost);
    getCameraCharacteristics() generates
            (Status status, CameraMetadata cameraCharacteristics);
    setTorchMode(TorchMode mode) generates (Status status);
    open(ICameraDeviceCallback callback) generates
            (Status status, ICameraDeviceSession session);
    dumpState(handle fd);

};

该文件中定义了ICameraDevice接口类,由CameraDevice::TrampolineDeviceInterface_3_2实现,其主要接口如下:

open: 用于创建一个Camera设备,并且将Camera Service中继承ICameraDeviceCallback并实现了相应接口的Camera3Device作为参数传入Provider中,供Provider上传事件或者图像数据。
getCameraCharacteristics:用于获取Camera设备的属性。

hardware/interfaces/camera/device/3.2/ICameraDeviceCallback.hal源码如下:

package android.hardware.camera.device@3.2;

import android.hardware.camera.common@1.0::types;
interface ICameraDeviceCallback {
    processCaptureResult(vec<CaptureResult> results);
    notify(vec<NotifyMsg> msgs);

};

该文件中定义了ICameraDeviceCallback接口类,由Camera Service中的Camera3Device继承并实现,通过调用ICameraDevice::open方法注册到Provider中,其主要接口如下:

  • processCaptureResult: 一旦有图像数据产生会通过调用该方法将数据以及meta data上传至Camera Service。
  • notify: 通过该方法上传事件至Camera Service中,比如shutter事件等.

hardware/interfaces/camera/device/3.2/ICameraDeviceSession.hal 源码如下:

package android.hardware.camera.device@3.2;

import android.hardware.camera.common@1.0::types;

interface ICameraDeviceSession {
    constructDefaultRequestSettings(RequestTemplate type) generates
            (Status status, CameraMetadata requestTemplate);
    configureStreams(StreamConfiguration requestedConfiguration)
            generates (Status status,
                    HalStreamConfiguration halConfiguration);
    processCaptureRequest(vec<CaptureRequest> requests,
            vec<BufferCache> cachesToRemove)
            generates (Status status, uint32_t numRequestProcessed);
    getCaptureResultMetadataQueue() generates (fmq_sync<uint8_t> queue);
    flush() generates (Status status);
    close();
};

该文件中定义了ICameraDeviceSession接口类,由CameraDeviceSession::TrampolineSessionInterface_3_2继承并实现,其主要接口如下:

    constructDefaultRequestSettings:用于创建默认的Request配置项。
    configureStreams_3_5:用于配置数据流,其中包括了output buffer/Surface/图像格式大小等属性。
    processCaptureRequest_3_4:下发request到Provider中,一个request对应着一次图像需求。
    close: 关闭当前会话。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值