1 Star 0 Fork 1K

wanchengzhen / drivers_peripheral

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
README_zh.md 20.31 KB
一键复制 编辑 原始数据 按行查看 历史
bigA2021 提交于 2021-12-28 14:47 . 删除HarmonyOS关键字

Camera

简介

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<CameraStandard::CameraMetadata>& modeSetting,
        const std::vector<std::shared_ptr&ltStreamInfo>&gt &info,
        StreamSupportType &type)
查询是否支持添加参数对应的流
CamRetCode CreateStreams(const std::vector<std::shared_ptr<StreamInfo>> &streamInfos) 创建流
 此函数接口依据输入的流信息创建流,调用该接口之前需先通过 {@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<CameraStandard::CameraMetadata> &modeSetting,
        const std::vector&ltstd::shared_ptr&ltStreamInfo&gt> &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)
帧捕获回调

使用方法

获取CameraHost

std::shared_ptr<Camera::CameraHost> cameraHost = Camera::CameraHost::CreateCameraHost();

获取配置的cameraId

std::vector<std::string> cameraIds;

cameraHost->GetCameraIds(cameraIds); #

打开camera设备并获取到device

const std::shared_ptr<Camera::ICameraDeviceCallback> callback = std::make_shared<Camera::ICameraDeviceCallback>();

std::shared_ptr<Camera::CameraDevice> device;

std::cout << "cameraIds.front() = " << cameraIds.front() << std::endl;

Camera::CamRetCode rc = cameraHost->OpenCamera(cameraIds.front(), callback, device);

调用device的GetStreamOperator函数获取streamOperator

std::make_shared<Camera::IStreamOperatorCallback>();
std::shared_ptr<Camera::StreamOperator> streamOperator = nullptr;
rc = device->GetStreamOperator(streamOperatorCallback, streamOperator);`

批量创建数据流

std::vector<std::shared_ptr<Camera::StreamInfo>> streamInfos;
std::shared_ptr<Camera::StreamInfo> streamInfo = std::make_shared<Camera::StreamInfo>();
streamInfo->streamId_ = 1001;
streamInfo->width_ = 1280;
streamInfo->height_ = 720;
streamInfo->format_ = 2;
streamInfo->datasapce_ = 10;
streamInfo->intent_ = Camera::PREVIEW;
streamInfo->tunneledMode_ = 5;
streamInfos.push_back(streamInfo);
rc = streamOperator->CreateStreams(streamInfos);

配流起流

rc = streamOperator->CommitStreams(Camera::NORMAL, nullptr);

相关仓

驱动子系统

vendor_hisilicon/tree/master/Hi3516DV300/hdf_config

drivers_peripheral

1
https://gitee.com/wanchengzhen/drivers_peripheral.git
git@gitee.com:wanchengzhen/drivers_peripheral.git
wanchengzhen
drivers_peripheral
drivers_peripheral
master

搜索帮助