Camera2架构学习(三)——Camera HIDL

一、概览

       上篇文章中讲到,在CameraService启动的过程中,会进行Camera Provider的实例化操作。 与Camera HAL通信,通过hw_get_module调用动态链接库获取硬件的信息,并包装到CameraModule中。
       该层位于Camera Service与Camera Driver之间,作为一个独立的进程存在于Android系统中,同时在系统启动初期被运行,由两部分组成。一部分提供Camera HIDL跨进程接口供Camera Service进行调用,封装了该接口的实现细节,接收来自Service的图像请求,另一部分并且内部加载了Camera HAL Module,通过dlopen方式加载了一系列So库,该Module由OEM/ODM实现,遵循谷歌制定的标准Camera HAL3接口,进而通过该接口控制Camera HAL部分,最后等待Camera HAL的结果回传,紧接着Provider通过Camera HIDL接口将结果发送至Camera Service。

二、Camera HIDL 接口

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

2.1 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。

2.2 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定义

2.3 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设备的属性。

2.4 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_3_4: 一旦有图像数据产生会通过调用该方法将数据以及meta data上传至Camera Service。

  • notify: 通过该方法上传事件至Camera Service中,比如shutter事件等。

2.5 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);
  
    getCaptureRequestMetadataQueue() generates (fmq_sync<uint8_t> queue);
      
    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: 关闭当前会话。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值