Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Docs
提交
6463b1e0
D
Docs
项目概览
OpenHarmony
/
Docs
1 年多 前同步成功
通知
159
Star
292
Fork
28
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
Docs
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
6463b1e0
编写于
3月 24, 2022
作者:
黑马路
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
驱动子系统Camera模块开发指南标准化
Signed-off-by:
路建辉
<
1483564738@qq.com
>
上级
afdf62ce
变更
2
显示空白变更内容
内联
并排
Showing
2 changed file
with
680 addition
and
613 deletion
+680
-613
zh-cn/device-dev/driver/driver-peripherals-camera-des.md
zh-cn/device-dev/driver/driver-peripherals-camera-des.md
+680
-613
zh-cn/device-dev/driver/figures/Camera模块驱动模型.png
zh-cn/device-dev/driver/figures/Camera模块驱动模型.png
+0
-0
未找到文件。
zh-cn/device-dev/driver/driver-peripherals-camera-des.md
浏览文件 @
6463b1e0
# Camera
<a name="ZH-CN_TOPIC_0000001078436908"></a>
# Camera
-
[
Camera<a name="ZH-CN_TOPIC_0000001078436908"></a>
](
#camera
)
-
[
概述<a name="section11660541593"></a>
](
#概述
)
-
[
开发指导<a name="section161941989596"></a>
](
#开发指导
)
-
[
HDI接口说明<a name="section1551164914237"></a>
](
#hdi接口说明
)
-
[
开发步骤<a name="section19806524151819"></a>
](
#开发步骤
)
-
[
开发实例<a name="section1564411661810"></a>
](
#开发实例
)
## 概述<a name="1"></a>
### 功能简介<a name="2"></a>
OpenHarmony相机驱动框架模型对上实现相机HDI(Hardware Device Interface)接口,对下实现相机Pipeline模型,管理相机各个硬件设备。
该驱动框架模型内部分为三层,依次为HDI实现层、框架层和适配层,各层基本概念如下:
## 概述<a name="section11660541593"></a>
+
HDI实现层:对上实现OHOS(OpenHarmony Operation System)相机标准南向接口。
+
框架层:对接HDI实现层的控制、流的转发,实现数据通路的搭建,管理相机各个硬件设备等功能。
+
适配层:屏蔽底层芯片和OS(Operation System)差异,支持多平台适配。
OpenHarmony相机驱动框架模型对上实现相机HDI(Hardware Driver Interface)接口,对下实现相机Pipeline模型,管理相机各个硬件设备。
该驱动框架模型内部分为三层,依次为HDI实现层、框架层和适配层,各层基本概念如下:
+
**HDI实现层**
:对上实现OHOS(OpenHarmony Operation System)相机标准南向接口。
### 运作机制<a name="3"></a>
+
**框架层**
:对接HDI实现层的控制、流的转发,实现数据通路的搭建,管理相机各个硬件设备等功能。
Camera模块主要包含服务、设备的初始化,数据通路的搭建,流的配置、创建、下发、捕获等,具体运作机制参考以下图文解析:
+
**适配层**
:屏蔽底层芯片和OS(Operation System)差异,支持多平台适配。
**图 1**
基于HDF驱动框架的Camera驱动模型
**<a name="fig3672817152110"></a>**
**图 1**
基于HDF驱动框架的Camera驱动模型
![](
figures/logic-view-of-camera-hal-zh.png
)
!
[](
figures/Camera模块驱动模型.png
)
1.
系统启动时创建CameraDeviceHost进程。进程创建后,首先枚举底层设备,创建(也可以通过配置表创建)管理设备树的DeviceManager类及其内部各个底层设备的对象,创建对应的CameraHost类实例并且将其注册到UHDF服务中,方便上层通过UHDF服务获取底层CameraDeviceHost的服务,从而操作底层设备。
...
...
@@ -40,19 +36,92 @@ OpenHarmony相机驱动框架模型对上实现相机HDI(Hardware Driver Inter
9.
动态帧率控制。在StreamOperator中起一个CollectBuffer线程,CollectBuffer线程从每一路stream的BufferQueue中获取buffer,如果某一路流的帧率需要控制(为sensor出帧帧率的1/n),可以根据需求控制每一帧的buffer打包,并决定是否collect此路流的buffer(比如sensor出帧帧率为120fps,预览流的帧率为30fps,CollectBuffer线程collect预览流的buffer时,每隔4fps collect一次)。
## 开发指导<a name="section161941989596"></a>
### HDI接口说明<a name="section1551164914237"></a>
旨在了解HDI接口的作用及函数参数的传递规则,详情可见
[
Camera驱动子系统HDI使用说明
](
https://gitee.com/openharmony/drivers_peripheral/blob/master/camera/README_zh.md
)
。
## 开发指导<a name="4"></a>
### 开发步骤<a name="section19806524151819"></a>
下面分步骤描述了Camera驱动框架的主要接口,包括注册、检测;创建、捕获和销毁流;打开和关闭设备等接口(为了更清晰的展示和描述主要功能的实现部分,该章节删除了部分判错和LOG源码)。
1.
注册CameraHost
### 场景介绍<a name="5"></a>
定义Camera的HdfDriverEntry结构体,该结构体中定义了CameraHost初始化的方法。
Camera模块主要用以相机预览、拍照、视频流等场景下对相机操作封装,使开发者更易操作相机硬件,提高开发效率。
### 接口说明<a name="6"></a>
-
icamera_device.h
| 功能描述 | 接口名称 |
| ---------------------------- | ------------------------------------------------------------ |
| 获取流控制器 | CamRetCode GetStreamOperator(
<br/>
const OHOS::sptr
<IStreamOperatorCallback>
&callback,
<br/>
OHOS::sptr
<IStreamOperator>
&streamOperator) |
| 更新设备控制参数 | CamRetCode UpdateSettings(const std::shared_ptr
<CameraSetting>
&settingss) |
| 设置Result回调模式和回调函数 | CamRetCode SetResultMode(const ResultCallbackMode &mode) |
| 获取使能的ResultMeta | CamRetCode GetEnabledResults(std::vector
<MetaType>
&results) |
| 使能具体的ResultMeta | CamRetCode EnableResult(const std::vector
<MetaType>
&results) |
| 禁止具体的ResultMeta | CamRetCode DisableResult(const std::vector
<MetaType>
&results) |
| 关闭Camera设备 | void Close() |
-
icamera_device_callback.h
| 功能描述 | 接口名称 |
| ---------------------------------------------------------- | ------------------------------------------------------------ |
| 设备发生错误时调用,由调用者实现,用于返回错误信息给调用者 | void OnError(ErrorType type, int32_t errorCode) |
| 上报camera设备相关的metadata的回调 | void OnResult(uint64_t timestamp, const std::shared_ptr
<CameraMetadata>
&result) |
-
icamera_host.h
| 功能描述 | 接口名称 |
| ------------------------------ | ------------------------------------------------------------ |
| 设置ICameraHost回调接口 | CamRetCode SetCallback(const OHOS::sptr
<ICameraHostCallback>
&callback) |
| 获取当前可用的Camera设备ID列表 | CamRetCode GetCameraIds(std::vector
<std::string>
&cameraIds) |
| 获取Camera设备能力集合 | CamRetCode GetCameraAbility(const std::string &cameraId,
<br/>
std::shared_ptr
<CameraAbility>
&ability) |
| 打开Camera设备 | CamRetCode OpenCamera(const std::string &cameraId,
<br/>
const OHOS::sptr
<ICameraDeviceCallback>
&callback,
<br/>
OHOS::sptr
<ICameraDevice>
&device) |
| 打开或关闭闪光灯 | CamRetCode SetFlashlight(const std::string &cameraId, bool &isEnable) |
-
icamera_host_callback.h
| 功能描述 | 接口名称 |
| ---------------------- | ------------------------------------------------------------ |
| Camera设备状态变化上报 | void OnCameraStatus(const std::string &cameraId, CameraStatus status) |
| 闪光灯状态变化回调 | 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(
<br/>
OperationMode mode,
<br/>
const std::shared_ptr
<CameraStandard::CameraMetadata>
&modeSetting,
<br/>
const std::vector<std::shared_ptr<StreamInfo>> &info,
<br/>
StreamSupportType &type) |
| 创建流 | CamRetCode CreateStreams(const std::vector
<std::shared_ptr
<
StreamInfo
>
> &streamInfos) |
| 释放流 | CamRetCode ReleaseStreams(const std::vector
<int>
&streamIds) |
| 配置流 | CamRetCode CommitStreams(OperationMode mode,
<br/>
const std::shared_ptr
<CameraMetadata>
&modeSetting) |
| 获取流的属性 | CamRetCode GetStreamAttributes(
<br/>
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,
<br/>
const std::shared_ptr
<CaptureInfo>
&info, bool isStreaming) |
| 取消捕获 | CamRetCode CancelCapture(int captureId) |
| 将指定流转换成离线流 | CamRetCode ChangeToOfflineStream(const std::vector
<int>
&streamIds,
<br/>
OHOS::sptr
<IStreamOperatorCallback>
&callback,
<br/>
OHOS::sptr
<IOfflineStreamOperator>
&offlineOperator) |
-
istream_operator_callback.h
| 功能描述 | 接口名称 |
| ---------------------------------------- | ------------------------------------------------------------ |
| 捕获开始回调,在捕获开始时调用 | void OnCaptureStarted(int32_t captureId, const std::vector
<int32_t>
&streamIds) |
| 捕获结束回调,在捕获结束时调用 | void OnCaptureEnded(int32_t captureId,
<br/>
const std::vector
<std::shared_ptr
<
CaptureEndedInfo
>
> &infos) |
| 捕获错误回调,在捕获过程中发生错误时调用 | void OnCaptureError(int32_t captureId,
<br/>
const std::vector
<std::shared_ptr
<
CaptureErrorInfo
>
> &infos) |
| 帧捕获回调 | void OnFrameShutter(int32_t captureId,
<br/>
const std::vector
<int32_t>
&streamIds, uint64_t timestamp) |
### 开发步骤<a name="7"></a>
Camera驱动的开发过程主要包含以下步骤:
1.
**注册CameraHost**
定义Camera的HdfDriverEntry结构体,该结构体中定义了CameraHost初始化的方法。
```
struct HdfDriverEntry g_cameraHostDriverEntry = {
.moduleVersion = 1,
...
...
@@ -64,9 +133,9 @@ OpenHarmony相机驱动框架模型对上实现相机HDI(Hardware Driver Inter
HDF_INIT(g_cameraHostDriverEntry); // 将Camera的HdfDriverEntry结构体注册到HDF上
```
2.
CameraHost初始化
2.
**初始化Host服务**
步骤1中提到的HdfCameraHostDriverBind接口提供了CameraServiceDispatch和CameraHostStubInstance的注册。这两个接口一个是远端调用CameraHost的方法,如OpenCamera(),SetFlashlight()等,另外一个是Camera设备的初始化,在开机时被调用。
步骤1中提到的HdfCameraHostDriverBind接口提供了CameraServiceDispatch和CameraHostStubInstance的注册。这两个接口一个是远端调用CameraHost的方法,如OpenCamera(),SetFlashlight()等,另外一个是Camera设备的初始化,在开机时被调用。
```
int HdfCameraHostDriverBind(HdfDeviceObject
*
deviceObject)
...
...
@@ -123,7 +192,7 @@ OpenHarmony相机驱动框架模型对上实现相机HDI(Hardware Driver Inter
CameraHostStubInstance()接口最终调用CameraHostImpl::Init()方法,该方法会获取物理Camera,并对DeviceManager和PipelineCore进行初始化。
3.
获取CamerHost
3.
**获取Host服务**
调用Get()接口从远端CameraService中获取CameraHost对象。get()方法如下:
...
...
@@ -149,7 +218,7 @@ OpenHarmony相机驱动框架模型对上实现相机HDI(Hardware Driver Inter
}
```
4.
OpenCamera()接口
4.
**打开设备**
CameraHostProxy对象中有五个方法,分别是SetCallback、GetCameraIds、GetCameraAbility、OpenCamera和SetFlashlight。下面着重描述OpenCamera接口。
CameraHostProxy的OpenCamera()接口通过CMD_CAMERA_HOST_OPEN_CAMERA调用远端CameraHostStubOpenCamera()接口并获取ICameraDevice对象。
...
...
@@ -216,7 +285,7 @@ OpenHarmony相机驱动框架模型对上实现相机HDI(Hardware Driver Inter
}
```
5.
GetStreamOperator()接口
5.
**获取流**
CameraDeviceImpl定义了GetStreamOperator、UpdateSettings、SetResultMode和GetEnabledResult等方法,获取流操作方法如下:
...
...
@@ -246,7 +315,7 @@ OpenHarmony相机驱动框架模型对上实现相机HDI(Hardware Driver Inter
}
```
6.
创建流
6.
**创建流**
调用CreateStreams创建流前需要填充StreamInfo结构体,具体内容如下:
...
...
@@ -289,7 +358,7 @@ OpenHarmony相机驱动框架模型对上实现相机HDI(Hardware Driver Inter
}
```
7.
配置流
7.
**配置流**
CommitStreams()是配置流的接口,必须在创建流之后调用,其主要作用是初始化Pipeline和创建Pipeline。
...
...
@@ -328,7 +397,7 @@ OpenHarmony相机驱动框架模型对上实现相机HDI(Hardware Driver Inter
}
```
8.
捕获图像
8.
**捕获图像**
在调用Capture()接口前需要先填充CaptureInfo结构体,具体内容如下:
...
...
@@ -370,7 +439,7 @@ OpenHarmony相机驱动框架模型对上实现相机HDI(Hardware Driver Inter
}
```
9.
取消捕获和释放离线流
9.
**取消捕获和释放离线流**
StreamOperatorImpl类中的CancelCapture()接口的主要作用是根据captureId取消数据流的捕获。
...
...
@@ -397,16 +466,15 @@ OpenHarmony相机驱动框架模型对上实现相机HDI(Hardware Driver Inter
}
```
10.
关闭Camera设备
10.
**关闭Camera设备**
调用CameraDeviceImpl中的Close()来关闭CameraDevice,该接口调用deviceManager中的PowerDown()来给设备下电。
### 开发实例<a name = "8"></a>
## 开发实例<a name="section1564411661810"></a>
在/drivers/peripheral/camera/hal/init目录下有一个关于Camera的demo,开机后会在/system/bin下生成可执行文件ohos_camera_demo,该demo可以完成camera的预览,拍照等基础功能。下面我们就以此demo为例讲述怎样用HDI接口去编写预览PreviewOn()和拍照CaptureON()的用例。
在/drivers/peripheral/camera/hal/init目录下有一个关于Camera的demo,开机后会在/system/bin下生成可执行文件ohos_camera_demo,该demo可以完成Camera的预览,拍照等基础功能。下面我们就以此demo为例讲述怎样用HDI接口去编写预览PreviewOn()和拍照CaptureON()的用例,可参考[ohos_camera_demo](https://gitee.com/openharmony/drivers_peripheral/tree/master/camera/hal/init)。
1.
在main函数中构造一个Hos3516Demo对象,该对象中有对
c
amera初始化、启停流、释放等控制的方法。下面mainDemo->InitSensors()函数为初始化CameraHost,mainDemo->InitCameraDevice()函数为初始化CameraDevice。
1. 在main函数中构造一个Hos3516Demo对象,该对象中有对
C
amera初始化、启停流、释放等控制的方法。下面mainDemo->InitSensors()函数为初始化CameraHost,mainDemo->InitCameraDevice()函数为初始化CameraDevice。
```
int main(int argc, char
**
argv)
...
...
@@ -546,7 +614,7 @@ OpenHarmony相机驱动框架模型对上实现相机HDI(Hardware Driver Inter
}
```
CaptureON()接口调用streamOperator的Capture()方法获取c
amera数据并轮转buffer,拉起一个线程接收相应类型的数据。
CaptureON()接口调用streamOperator的Capture()方法获取C
amera数据并轮转buffer,拉起一个线程接收相应类型的数据。
```
RetCode Hos3516Demo::CaptureON(const int streamId, const int captureId, CaptureMode mode)
...
...
@@ -668,5 +736,4 @@ OpenHarmony相机驱动框架模型对上实现相机HDI(Hardware Driver Inter
"-q | --quit stop preview and quit this app
\n
");
```
demo中其他功能会调用不同的HDI接口去实现,与PreviewOn()接口类似,这里不再赘述,具体详情可以参见[ohos_camera_demo](https://gitee.com/openharmony/drivers_peripheral/tree/master/camera/hal/init)。
zh-cn/device-dev/driver/figures/Camera模块驱动模型.png
0 → 100644
浏览文件 @
6463b1e0
24.7 KB
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录