# Camera - [简介](#section11660541593) - [目录](#section161941989596) - [接口说明](#section1564411661810) - [使用说明](#section19806524151819) - [相关仓](#section1371113476307) ## 简介 OHOS相机驱动框架模型对上实现相机HDI接口,对下实现相机Pipeline模型,管理相机各个硬件设备。 各层的基本概念如下: 1. HDI实现层,对上实现OHOS相机标准南向接口。 2. 框架层,对接HDI实现层的控制、流的转发,实现数据通路的搭建、管理相机各个硬件设备等功能。 3. 适配层,屏蔽底层芯片和OS差异,支持多平台适配。 **图 1** Camera驱动模块架构图  ## 目录 ``` /drivers/peripheral/input ├── hal # camera模块的hal层代码 │ ├── adapter # camera hal平台适配层的实现 │ ├── buffer_manager # camera hal统一的Buffer管理 │ ├── device_manager # 提供camera hal层设备管理能力,包括设备枚举、设备能力查询等 │ ├── hdi_impl # camera hal HDI的具体实现 │ ├── include # camera hal层内部的头文件 │ ├── init # camera hal层HDI接口使用样例实现 │ ├── pipeline_core # camera hal层pipeline核心代码 │ ├── test # camera hal层测试代码实现 │ └── utils # camera hal层工具类代码,目前提供的是watchdog ├── hal_c # 提供C实现的HAL接口 │ ├── hdi_cif # C实现的HDI接口适配代码 │ └── include # C形式的HDI接口 └── interfaces # camera hal对上层服务提供的驱动能力接口 ├── hdi_ipc # IPC模式的HDI实现 ├── hdi_passthrough # 直通模式的HDI实现 └── include # camera hal对外提供的HDI定义 ``` ## 接口说明
头文件 | 接口名称 | 功能描述 | |
icamera_device.h | CamRetCode
IsStreamsSupported( OperationMode mode, const std::shared_ptr<CameraMetadata>& modeSetting, const std::vector<std::shared_ptr<StreamInfo>> &info, StreamSupportType &type) |
查询是否支持添加参数对应的流 | |
CamRetCode CreateStreams(const std::vector<std::shared_ptr<StreamInfo>> &streamInfo | 创建流 此函数接口依据输入的流信息创建流,调用该接口之前需先通过 {@link IsStreamsSupported} 查询HAL是否支持要创建的流 |
||
CamRetCode ReleaseStreams(const std::vector<int> &streamIds) | 释放流 | ||
CamRetCode
CommitStreams(OperationMode mode, const std::shared_ptr<CameraMetadata> &modeSetting) |
配置流 本接口需在调用{@link CreateStreams}创建流之后调用 |
||
CamRetCode
GetStreamAttributes( std::vector<std::shared_ptr<StreamAttribute>> &attributes) |
获取流的属性 | ||
CamRetCode AttachBufferQueue(int streamId, const OHOS::sptr<OHOS::IBufferProducer> &producer) | 绑定生产者句柄和指定流 如果在{@link CreateStreams}创建流时已经指定了生产者句柄,则不需要调用该接口。如果需要重新绑定, 对于一些IOT设备,可能不需要或者不支持预览流的图像数据缓存流转,那么不需要绑定生产者句柄, 此时在创建流时{@link CreateStreams} 的 {@link StreamInfo} 参数的生产者句柄bufferQueue_为空,而 tunneledMode_需设置为false。 |
||
CamRetCode DetachBufferQueue(int streamId) | 解除生产者句柄和指定流的绑定关系 | ||
CamRetCode
Capture(int captureId, const std::shared_ptr<CaptureInfo> &info, bool isStreaming) |
捕获图像 本接口必须在调用 {@link CommitStreams} 配置流之后调用。 图像捕获有两种模式,分别是连续捕获和单次捕获。连续捕获即触发之后模块内部进行连续的捕获, 消费者可以连续收到图像数据,不需要多次调用本接口,若再次调用了本接口, 则停止当前捕获,更新捕获信息,再进行一次新的捕获,多用于预览、录像或者连拍场景。 单次捕获即触发之后只捕获一帧图像数据,用于单次拍照场景 |
||
CamRetCode CancelCapture(int captureId) | 取消捕获 | ||
CamRetCode
ChangeToOfflineStream(const std::vector<int> &streamIds, OHOS::sptr<IStreamOperatorCallback> &callback, OHOS::sptr<IOfflineStreamOperator> &offlineOperator) |
将指定流转换成离线流 | ||
icamera_device_callback.h | void OnError(ErrorType type, int32_t errorCode) | 设备发生错误时调用,由调用者实现,用于返回错误信息给调用者 | |
void OnResult(uint64_t timestamp, const std::shared_ptr<CameraMetadata> &result) | 上报camera设备相关的metadata的回调 | ||
icamera_host.h | CamRetCode SetCallback(const OHOS::sptr<ICameraHostCallback> &callback) | 设置ICameraHost回调接口 | |
CamRetCode GetCameraIds(std::vector<std::string> &cameraIds) | 获取当前可用的Camera设备ID列表 | ||
CamRetCode
GetCameraAbility(const std::string &cameraId, std::shared_ptr<CameraAbility> &ability) |
获取Camera设备能力集合 | ||
CamRetCode
OpenCamera(const std::string &cameraId, const OHOS::sptr<ICameraDeviceCallback> &callback, OHOS::sptr<ICameraDevice> &device) |
打开Camera设备 | ||
CamRetCode SetFlashlight(const std::string &cameraId, bool &isEnable) | 打开或关闭闪光灯 | ||
icamera_host_callback.h | void OnCameraStatus(const std::string &cameraId, CameraStatus status) | Camera设备状态变化上报 | |
void OnFlashlightStatus(const std::string &cameraId, FlashlightStatus status) | 闪光灯状态变化回调 | ||
ioffline_stream_operator.h | CamRetCode CancelCapture(int captureId) | 取消捕获请求 | |
CamRetCode ReleaseStreams(const std::vector<int> &streamIds) | 释放流 | ||
CamRetCode Release() | 释放所有离线流 | ||
istream_operator.h | CamRetCode
IsStreamsSupported( OperationMode mode, const std::shared_ptr<CameraMetadata> &modeSetting, const std::vector<std::shared_ptr<StreamInfo>> &info, StreamSupportType &type) |
查询是否支持添加参数对应的流 | |
CamRetCode CreateStreams(const std::vector<std::shared_ptr<StreamInfo>> &streamInfos) | 创建流 | ||
CamRetCode ReleaseStreams(const std::vector<int> &streamIds) | 释放流 | ||
CamRetCode
CommitStreams(OperationMode mode, const std::shared_ptr<CameraMetadata> &modeSetting) |
配置流 |
||
CamRetCode
GetStreamAttributes( std::vector<std::shared_ptr<StreamAttribute>> &attributes) |
获取流的属性 | ||
CamRetCode AttachBufferQueue(int streamId, const OHOS::sptr<OHOS::IBufferProducer> &producer) | 绑定生产者句柄和指定流 | ||
CamRetCode DetachBufferQueue(int streamId) | 解除生产者句柄和指定流的绑定关系 | ||
CamRetCode
Capture(int captureId, const std::shared_ptr<CaptureInfo> &info, bool isStreaming) |
捕获图像 * * 本接口必须在调用 {@link CommitStreams} 配置流之后调用。 * 图像捕获有两种模式,分别是连续捕获和单次捕获。连续捕获即触发之后模块内部进行连续的捕获, * 消费者可以连续收到图像数据,不需要多次调用本接口,若再次调用了本接口, * 则停止当前捕获,更新捕获信息,再进行一次新的捕获,多用于预览、录像或者连拍场景。 * 单次捕获即触发之后只捕获一帧图像数据,用于单次拍照场景。 * 捕获启动时,会调用 {@link OnCaptureStarted}来通知调用者捕获已经启动。 * 连续捕获需调用 {@link CancelCapture} 来停止捕获。 * 捕获结束时,会调用 {@link OnCaptureEnded}来通知调用者捕获的帧计数等信息。 * {@link CaptureInfo} 的 enableShutterCallback_ 使能 {@link OnFrameShutter},使能后每次捕获触发 {@link OnFrameShutter} * 对于多个流同时捕获的场景,本模块内部保证同时上报多路流捕获数据。 |
||
CamRetCode CancelCapture(int captureId) | 取消捕获 | ||
CamRetCode
ChangeToOfflineStream(const std::vector<int> &streamIds, OHOS::sptr<IStreamOperatorCallback> &callback, OHOS::sptr<IOfflineStreamOperator> &offlineOperator) |
将指定流转换成离线流 | ||
istream_operator_callback.h | void OnCaptureStarted(int32_t captureId, const std::vector<int32_t> &streamIds) | 捕获开始回调,在捕获开始时调用 | |
void
OnCaptureEnded(int32_t captureId, const std::vector<std::shared_ptr<CaptureEndedInfo>> &infos) |
捕获结束回调,在捕获结束时调用 | ||
void
OnCaptureError(int32_t captureId, const std::vector<std::shared_ptr<CaptureErrorInfo>> &infos) |
捕获错误回调,在捕获过程中发生错误时调用 | ||
void
OnFrameShutter(int32_t captureId, const std::vector<int32_t> &streamIds, uint64_t timestamp) |
帧捕获回调 |