# Camera驱动子系统HDI使用说明 ## 简介 该仓下主要包含相机驱动框架模型 HDI(Hardware Driver Interface)接口定义及其实现,对上实现相机HDI接口,对下实现相机Pipeline模型,管理相机各个硬件设备,HDI接口主要提供如下功能: * ICameraHost:设备管理接口,camera_host服务注册到系统的入口; * ICameraDevice:设备控制接口,设备参数的下发回传及使能等管理; * IStreamOperator:流控制管理器,管理流与捕获动作的关系,控制buffer轮转线程; * IOfflineStreamOperator:离线流管理器,控制离线流buffer正常回传; 图1 相关模块逻辑视图 ![](C:\Users\grj\Pictures\子系统架构图.png) ## 目录 该仓下源代码目录结构如下所示: drivers/peripheral/camera/interfaces . ├── include │ ├── callback #框架涉及的所有callback接口目录 │ ├── device #ICameraDeviceCallback接口Remote实现 │ │ │ ├── camera_device_callback.cpp #device回调响应在此处实现或参考自定义 │ │ │ ├── camera_device_callback.h │ │ │ ├── camera_device_callback_proxy.cpp #client端实现,编译在hdi_impl中 │ │ │ ├── camera_device_callback_proxy.h │ │ │ ├── camera_device_callback_stub.cpp #server端实现,编译在client/BUILD.gn中 │ │ │ └── camera_device_callback_stub.h │ │ ├── host │ │ │ ├── camera_host_callback.cpp #host回调响应在此处实现或参考自定义 │ │ │ ├── camera_host_callback.h │ │ │ ├── camera_host_callback_proxy.cpp #client端实现,编译在hdi_impl中 │ │ │ ├── camera_host_callback_proxy.h │ │ │ ├── camera_host_callback_stub.cpp #server端实现,编译在client/BUILD.gn中 │ │ │ └── camera_host_callback_stub.h │ │ └── operator │ │ ├── stream_operator_callback.cpp #StreamOperator回调响应在此处实现或参考自定义 │ │ ├── stream_operator_callback.h │ │ ├── stream_operator_callback_proxy.cpp #client端实现,编译在hdi_impl中 │ │ ├── stream_operator_callback_proxy.h │ │ ├── stream_operator_callback_stub.cpp #server端实现,编译在client/BUILD.gn中 │ │ └── stream_operator_callback_stub.h │ ├── client │ │ ├── BUILD.gn #编译为libcamera_client,作为远端调用库 │ │ ├── camera_device_proxy.cpp #ICameraDevice接口远端client代理实现 │ │ ├── camera_device_proxy.h │ │ ├── camera_host_proxy.cpp #ICameraHost接口远端client代理实现 │ │ ├── camera_host_proxy.h │ │ ├── offline_stream_operator_proxy.cpp #IOfflineStreamOperator接口远端client代理实现 │ │ ├── offline_stream_operator_proxy.h │ │ ├── stream_operator_proxy.cpp #IStreamOperator接口远端client代理实现 │ │ └── stream_operator_proxy.h │ ├── icamera_device_callback.h #IcameraDeviceCallback回调接口定义 │ ├── icamera_device.h #ICameraDevice接口定义 │ ├── icamera_host_callback.h #ICameraHostCallback回调接口定义 │ ├── icamera_host.h #ICameraHost接口定义 │ ├── ioffline_stream_operator.h #IOfflineSteamOperator接口定义 │ ├── istream_operator_callback.h #IStreamOperatorCallback回调接口定义 │ ├── istream_operator.h #IStreamOperator接口定义 │ ├── server │ │ ├── camera_device_service_stub.cpp #ICameraDevice服务端序列化实现 │ │ ├── camera_device_service_stub.h │ │ ├── camera_host_driver.cpp #camera_host服务注册到IServiceManager │ │ ├── camera_host_service_stub.cpp #ICameraHost服务端序列化实现 │ │ ├── camera_host_service_stub.h │ │ ├── offline_stream_operator_service_stub.cpp #IOfflineStreamOperator离线流服务端序列化实现 │ │ ├── offline_stream_operator_service_stub.h │ │ ├── stream_operator_service_stub.cpp #IStreamOperator服务端序列化实现 │ │ └── stream_operator_service_stub.h │ ├── types.h #整个框架对外类型定义 │ └── utils_data_stub.h #camera_metadata & StreamInfo序列化实现 └── README_zh.md ## 说明 ### 接口说明 相机驱动提供给上层层可直接调用的能力接口,提供的部分接口说明如表1 HDI接口列表所示: 表 1 HDI接口列表

头文件

接口名称

功能描述

icamera_host.h

CamRetCode SetCallback(const OHOS::sptr<ICameraHostCallback> &callback);

设置ICameraHostCallback回调接口

CamRetCode GetCameraIds(std::vector<std::string> &cameraIds);

获取当前可用的Camera设备列表,数据来源于camera_host_config.hcs配置文件,由开发者配置

CamRetCode GetCameraAbility(const std::string &cameraId,
std::shared_ptr<CameraAbility> &ability);

获取相应camera的能力集,CameraAbility定义为CameraMetadata

CamRetCode OpenCamera(const std::string &cameraId,
const OHOS::sptr<ICameraDeviceCallback> &callback,
OHOS::sptr<ICameraDevice> &pDevice);

camera设备上电,cameraId由GetCameraIds接口获取,返回相应的CameraDevice指针

CamRetCode SetFlashlight(const std::string &cameraId, bool &isEnable);

打开或关闭手电筒,isEnable = true打开手电筒;isEnable = false关闭手电筒

icamera_device.h

CamRetCode GetStreamOperator(
const OHOS::sptr<IStreamOperatorCallback> &callback,
OHOS::sptr<IStreamOperator> &streamOperator);

获取流控制器,同步设置流控制回调接口给服务

CamRetCode UpdateSettings(const std::shared_ptr<CameraSetting> &settings);

设置设备控制参数,CameraSetting定义为CameraMetadata

CamRetCode SetResultMode(const ResultCallbackMode &mode);

设置Result回调模式和回调函数,详细参照types.h文件注释

CamRetCode GetEnabledResults(std::vector<MetaType> &results);

获取sensor使能上报项,即,camera_metadata的tags

CamRetCode EnableResult(const std::vector<MetaType> &results);

使能具体的tags上报

CamRetCode DisableResult(const std::vector<MetaType> &results);

禁止具体的tags上报

void Close();

关闭camera设备

istream_operator.h

CamRetCode IsStreamsSupported(
OperationMode mode,
const std::shared_ptr<CameraStandard::CameraMetadata> &modeSetting,
const std::shared_ptr<StreamInfo> &pInfo,
StreamSupportType &pType);

查询模式和流的配置组合是否支持OperationMode操作模式,现阶段只支持普通模式
modeSetting定义为CameraMetadata,判断硬件是否支持对应的tag,pInfo携带需求流属性,判断硬件是否支持,pType出参返回支持方式.
详见types.h注释

CamRetCode CreateStreams(const std::vector<std::shared_ptr<StreamInfo>> &streamInfos);

批量创建流,streamInfo指定流的各项参数

CamRetCode ReleaseStreams(const std::vector<int> &streamIds);

通过streamId批量释放流资源

CamRetCode CommitStreams(OperationMode mode,
const std::shared_ptr<CameraStandard::CameraMetadata> &modeSetting);

使能相机流的配置,并配置工作模式

CamRetCode GetStreamAttributes(
std::vector<std::shared_ptr<StreamAttribute>> &attributes);

获取所有流属性

CamRetCode AttachBufferQueue(int streamId,
const OHOS::sptr<OHOS::IBufferProducer> &producer);

绑定BufferQueue到streamId对应的流,通过BufferQueue上传图像数据

CamRetCode DetachBufferQueue(int streamId);

解绑streamId对应流的BufferQueue

CamRetCode Capture(int captureId,
const std::shared_ptr<CaptureInfo> &pInfo, bool isStreaming);

图像捕获,captureId 标志此次捕获请求的id,info 捕获图像的参数信息,如果数组中的info存在多个, 则表明是batch模式,连续捕获多帧,isStreaming 是否连续捕获

CamRetCode CancelCapture(int captureId);

取消图像捕获,针对连续捕获,单帧捕获框架自动结束

CamRetCode ChangeToOfflineStream(const std::vector<int> &streamIds,
OHOS::sptr<IStreamOperatorCallback> &callback,
OHOS::sptr<IOfflineStreamOperator> &offlineOperator);

将普通流转换成离线流,截取pipeline一段作为离线流控制器,保证后续buffer顺利回传

istream_operator_callback.h

void OnCaptureStarted(int32_t captureId, const std::vector<int32_t> &streamId);

开始捕获图像状态回调

void OnCaptureEnded(int32_t captureId,
const std::vector<std::shared_ptr<CaptureEndedInfo>> &info);

结束捕获状态回调

void OnCaptureError(int32_t captureId,
const std::vector<std::shared_ptr<CaptureErrorInfo>> &info);

捕获错误回调

void OnFrameShutter(int32_t captureId,
const std::vector<int32_t> &streamId, uint64_t timestamp);

单帧捕获完成回调,与CaptureInfo中enableShutterCallback_配合使用

ioffline_stream_operator.h

CamRetCode CancelCapture(int captureId);

取消离线流的连续捕获动作

CamRetCode ReleaseStreams(const std::vector<int> &streamIds);

释放streamId对应流资源

CamRetCode Release();

释放IOfflineStreamOperator句柄

icamera_host_callback.h

void OnCameraStatus(const std::string &cameraId, CameraStatus status);

上报camera状态,针对UVC设备,状态定义详见types.h

void OnFlashlightStatus(const std::string &cameraId, FlashlightStatus status);

上报手电筒状态

icamera_device_callback.h

void OnError(ErrorType type, int32_t errorMsg);

Camera设备错误回调

void OnResult(uint64_t timestamp, const std::shared_ptr<CameraStandard::CameraMetadata> &result);

Camera设备Meta回调

### 使用说明 该仓核心功能是提供相机驱动能力接口供上层系统服务调用,提供的驱动能力接口统一归属为HDI接口层。

接口名称

使用说明

CamRetCode SetCallback(const OHOS::sptr<ICameraHostCallback> &callback);

获取camera_host服务
constexpr const char *TEST_SERVICE_NAME = "camera_service";
sptr<ICameraHost> cameraHost = ICameraHost::Get(TEST_SERVICE_NAME);
判断cameraHost服务指针对象不为空继续以下调用
OHOS::sptr<CameraHostCallback> callback = new CameraHostCallback();
sampleObj->SetCallback(callback);
判断返回值

CamRetCode GetCameraIds(std::vector<std::string> &cameraIds) ;

获取camera_host服务
判断cameraHost服务指针对象不为空
获取cameraIds
std::vector<std::string> cameraIds;
sampleObj->GetCameraIds(cameraIds);
判断返回值

CamRetCode GetCameraAbility(const std::string &cameraId,
std::shared_ptr<CameraAbility> &ability);

获取camera_host服务
判断cameraHost服务指针对象不为空
获取cameraIds
cameraId中选取一个获取其对应的属性
std::string cameraId = cameraIds.front();
sampleObj->GetCameraAbility(cameraId, ability);
判断返回值

CamRetCode OpenCamera(const std::string &cameraId,
const OHOS::sptr<ICameraDeviceCallback> &callback,
OHOS::sptr<ICameraDevice> &pDevice);

获取camera_host服务
判断cameraHost服务指针对象不为空
打开cameraId对应设备
OHOS::sptr<CameraDeviceCallback> deviceCallback = new CameraDeviceCallback();
OHOS::sptr<ICameraDevice> cameraDevice = nullptr;
sampleObj->OpenCamera(cameraId, deviceCallback, cameraDevice);
判断返回值

CamRetCode SetFlashlight(const std::string &cameraId, bool &isEnable);

获取camera_host服务
判断cameraHost服务指针对象不为空
打开手电筒
bool isEnable = true;
sampleObj->SetFlashlight(cameraIds.front(), isEnable);
判断返回值

CamRetCode GetStreamOperator(
const OHOS::sptr<IStreamOperatorCallback> &callback,
OHOS::sptr<IStreamOperator> &streamOperator);

获取camera_host服务,调用OpenCamera接口获取cameraDevice后做以下调用
OHOS::sptr<StreamOperatorCallback> streamOperatorCallback = new StreamOperatorCallback();
OHOS::sptr<IStreamOperator> streamOperator = nullptr;
cameraDevice->GetStreamOperator(streamOperatorCallback, streamOperator);
判断返回值,并判断streamOperator是否为空

CamRetCode UpdateSettings(const std::shared_ptr<CameraSetting> &settings);

获取camera_host服务,调用OpenCamera接口获取cameraDevice后做以下调用
std::shared_ptr<CameraSetting> cameraSetting = new CameraSetting(entryCapacity, dataCapacity);
entryCapacity: 需要设置的tag数量,dataCapacity: 所有tag对应的数据项数量
cameraDevice-> UpdateSettings(cameraSetting);
判断返回值

CamRetCode SetResultMode(const ResultCallbackMode &mode);

获取camera_host服务,调用OpenCamera接口获取cameraDevice后做以下调用
ResultCallbackMode resultCallbackMode = ON_CHANGED;
cameraDevice->SetResultMode(resultCallbackMode);
判断返回值

CamRetCode GetEnabledResults(std::vector<MetaType> &results);

获取camera_host服务,调用OpenCamera接口获取cameraDevice后做以下调用
std::vector<MetaType> results;
cameraDevice->GetEnabledResults(results);
判断返回值

CamRetCode EnableResult(const std::vector<MetaType> &results);

获取camera_host服务,调用OpenCamera接口获取cameraDevice,调用GetEnabledResults接口获取支持的使能后,调用使能接口
std::vector<MetaType> results;
cameraDevice->EnableResult(results);;
判断返回值

CamRetCode DisableResult(const std::vector<MetaType> &results);

获取camera_host服务,调用OpenCamera接口获取cameraDevice,调用GetEnabledResults接口获取支持的使能后,调用取消使能接口
std::vector<MetaType> results;
cameraDevice->EnableResult(results);;
判断返回值

void Close();

获取camera_host服务,调用OpenCamera接口获取cameraDevice,调用Close关闭当前设备

CamRetCode IsStreamsSupported(
OperationMode mode,
const std::shared_ptr<CameraStandard::CameraMetadata> &modeSetting,
const std::shared_ptr<StreamInfo> &pInfo,
StreamSupportType &pType);

获取camera_host服务,调用OpenCamera接口获取cameraDevice,调用ICameraDevice的GetStreamOperator接口获取流控制器代理对象
判断流控制器对象streamOperator不为空
OperationMode operationMode = NORMAL;
StreamSupportType supportType;
std::shared_ptr<StreamInfo> streamInfo = std::make_shared<StreamInfo>();
streamInfo->streamId_ = 1001;
streamInfo->width_ = 720;
streamInfo->height_ = 480;
streamInfo->format_ = PIXEL_FMT_YCRCB_420_SP;
streamInfo->datasapce_ = 8;
streamInfo->intent_ = PREVIEW;
StreamConsumer previewConsumer;
streamInfo->bufferQueue_ = previewConsumer.CreateProducer(
[](void* addr, uint32_t size) { }); // StreamConsumer参见UT,或详细了解BufferProducer的使用
streamInfo->tunneledMode_ = 5;
streamOperator->IsStreamsSupported(NORMAL, ability, streamInfo, supportType);
判断返回值

CamRetCode CreateStreams(const std::vector<std::shared_ptr<StreamInfo>> &streamInfos);

获取camera_host服务,调用OpenCamera接口获取cameraDevice,调用ICameraDevice的GetStreamOperator接口获取流控制器代理对象
判断流控制器对象streamOperator不为空
按照IsStreamsSupported步骤的StreamInfo定义方式,创建一个或多个对象放入std::vector<std::shared_ptr<Camera::StreamInfo>> streamInfos;容器中做如下调用
streamOperator->CreateStreams(streamInfos);
判断返回值

CamRetCode ReleaseStreams(const std::vector<int> &streamIds);

获取camera_host服务,调用OpenCamera接口获取cameraDevice,调用ICameraDevice的GetStreamOperator接口获取流控制器代理对象
判断流控制器对象streamOperator不为空
std::vector<int> streamIds; // 一个货多个需要释放掉的流id
streamOperator->ReleaseStreams(streamIds);
判断返回值

CamRetCode CommitStreams(OperationMode mode,
const std::shared_ptr<CameraStandard::CameraMetadata> &modeSetting);

获取camera_host服务,调用OpenCamera接口获取cameraDevice,调用ICameraDevice的GetStreamOperator接口获取流控制器代理对象
判断流控制器对象streamOperator不为空
与CreateStreams联合使用,先做CreateStreams调用 std::shared_ptr<CameraStandard::CameraMetadata> modeSetting = new CameraSetting(entryCapacity, dataCapacity);
streamOperator->CommitStreams(NORMAL, modeSetting);
判断返回值

CamRetCode GetStreamAttributes(
std::vector<std::shared_ptr<StreamAttribute>> &attributes);

获取camera_host服务,调用OpenCamera接口获取cameraDevice,调用ICameraDevice的GetStreamOperator接口获取流控制器代理对象
判断流控制器对象streamOperator不为空
std::vector<std::shared_ptr<StreamAttribute>> attributes;
streamOperator->GetStreamAttributes(attributes);
判断返回值

CamRetCode AttachBufferQueue(int streamId,
const OHOS::sptr<OHOS::IBufferProducer> &producer);

获取camera_host服务,调用OpenCamera接口获取cameraDevice,调用ICameraDevice的GetStreamOperator接口获取流控制器代理对象
判断流控制器对象streamOperator不为空
注意:如果CreateStreams时,streamInfo里面bufferQueue_不为空,则这个不用设置,否则视为替换
OHOS::sptr<OHOS::IBufferProducer> producer; // 创建方式见CreateStreams
streamOperator->AttachBufferQueue(producer);
判断返回值

CamRetCode DetachBufferQueue(int streamId);

获取camera_host服务,调用OpenCamera接口获取cameraDevice,调用ICameraDevice的GetStreamOperator接口获取流控制器代理对象
判断流控制器对象streamOperator不为空
注意:如果需要调用AttachBufferQueue,最好调用DetachBufferQueue先解绑
OHOS::sptr<OHOS::IBufferProducer> producer; // 创建方式见CreateStreams
streamOperator->AttachBufferQueue( DetachBufferQueue);
判断返回值

CamRetCode Capture(int captureId,
const std::shared_ptr<CaptureInfo> &pInfo, bool isStreaming);

获取camera_host服务,调用OpenCamera接口获取cameraDevice,调用ICameraDevice的GetStreamOperator接口获取流控制器代理对象
判断流控制器对象streamOperator不为空
调用CreateStreams创建流,调用CommitStreams配置流
int captureId = 2001; // 调用端提供捕获动作的唯一标识
std::shared_ptr<CaptureInfo> captureInfo = std::make_shared<:CaptureInfo>();
captureInfo->streamIds_ = {streamInfo->streamId_};
captureInfo->captureSetting_ = new CameraMetadata(entryCapacity, dataCapacity); // 需要做数据填充
captureInfo->enableShutterCallback_ = false;
streamOperator->Capture(captureId, captureInfo, true);
判断返回值

CamRetCode CancelCapture(int captureId);

获取camera_host服务,调用OpenCamera接口获取cameraDevice,调用ICameraDevice的GetStreamOperator接口获取流控制器代理对象
判断流控制器对象streamOperator不为空
与Capture捕获动作配套使用,并且本次捕获为连续捕获,否则无需调用
int captureId = 2001; // 调用端提供捕获动作的唯一标识
streamOperator->CancelCapture(captureId, captureInfo, true);

CamRetCode ChangeToOfflineStream(const std::vector<int> &streamIds,
OHOS::sptr<IStreamOperatorCallback> &callback,
OHOS::sptr<IOfflineStreamOperator> &offlineOperator);

获取camera_host服务,调用OpenCamera接口获取cameraDevice,调用ICameraDevice的GetStreamOperator接口获取流控制器代理对象
判断流控制器对象streamOperator不为空
与Capture捕获动作配套使用,如果不希望捕获中断,则调用此接口使得未完成的buffer顺利回传
std::vector<int> streamIds = {1001};
OHOS::sptr<IStreamOperatorCallback> offlineStreamOperatorCallback = new StreamOperatorCallback();
OHOS::sptr<IOfflineStreamOperator> offlineOperator;
streamOperator->ChangeToOfflineStream(streamIds, offlineStreamOperatorCallback, offlineOperator);
判断返回值

CamRetCode CancelCapture(int captureId);

调用完ChangeToOfflineStream后,会获取到离线流代理对象offlineStreamOperator
int captureId = 2001; // 调用端提供捕获动作的唯一标识,切换到离线流的捕获动作标识
offlineStreamOperator->CancelCapture(captureId);

CamRetCode ReleaseStreams(const std::vector<int> &streamIds);

调用完ChangeToOfflineStream后,会获取到离线流代理对象offlineStreamOperator
int captureId = 2001; // 调用端提供捕获动作的唯一标识,切换到离线流的捕获动作标识
std::vector<int> streamIds = {captureId};
offlineStreamOperator->ReleaseStreams(streamIds);
释放离线流资源后判断返回值

CamRetCode Release();

调用完ChangeToOfflineStream后,会获取到离线流代理对象offlineStreamOperator
offlineStreamOperator->Release();
释放IOfflineStreamOperator控制的流资源,并且释放IOfflineStreamOprator句柄