Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Docs
提交
2691b3b1
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看板
体验新版 GitCode,发现更多精彩内容 >>
提交
2691b3b1
编写于
12月 28, 2021
作者:
W
wu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
modified: zh-cn/device-dev/driver/driver-peripherals-camera-des.md
Signed-off-by:
N
wu
<
wuzhimin8@huawei.com
>
上级
3a26582c
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
44 addition
and
45 deletion
+44
-45
zh-cn/device-dev/driver/driver-peripherals-camera-des.md
zh-cn/device-dev/driver/driver-peripherals-camera-des.md
+44
-45
未找到文件。
zh-cn/device-dev/driver/driver-peripherals-camera-des.md
浏览文件 @
2691b3b1
...
...
@@ -42,15 +42,15 @@ OpenHarmony相机驱动框架模型对上实现相机HDI(Hardware Driver Inter
## 开发指导<a name="section161941989596"></a>
### HDI接口说明<a name="section1551164914237"></a>
旨在了解HDI接口的作用及函数参数的传递规则,详情可见
[
Camera驱动子系统HDI使用说明
](
https://gitee.com/openharmony/drivers_peripheral/blob/master/camera/README_zh.md
)
旨在了解HDI接口的作用及函数参数的传递规则,详情可见
[
Camera驱动子系统HDI使用说明
](
https://gitee.com/openharmony/drivers_peripheral/blob/master/camera/README_zh.md
)
。
### 开发步骤<a name="section19806524151819"></a>
下面分步骤描述了Camera驱动框架的主要接口,包括注册、检测
到如何创建、捕获、销毁流、
打开和关闭设备等接口(为了更清晰的展示和描述主要功能的实现部分,该章节删除了部分判错和LOG源码)。
####
步骤1
注册CameraHost
下面分步骤描述了Camera驱动框架的主要接口,包括注册、检测
;创建、捕获和销毁流;
打开和关闭设备等接口(为了更清晰的展示和描述主要功能的实现部分,该章节删除了部分判错和LOG源码)。
####
1.
注册CameraHost
定义Camera的HdfDriverEntry结构体,该结构体中定义了CameraHost初始化的方法。
定义Camera的HdfDriverEntry结构体,该结构体中定义了CameraHost初始化的方法。
struct HdfDriverEntry g_cameraHostDriverEntry = {
.moduleVersion = 1,
...
...
@@ -62,8 +62,8 @@ OpenHarmony相机驱动框架模型对上实现相机HDI(Hardware Driver Inter
HDF_INIT(g_cameraHostDriverEntry); // 将Camera的HdfDriverEntry结构体注册到HDF上
####
步骤2
CameraHost初始化
步骤1中提到的HdfCameraHostDriverBind接口提供了CameraServiceDispatch和CameraHostStubInstance的注册。这两个接口一个是远端调用CameraHost的方法,如OpenCamera(),SetFlashlight()等,另外一个是Camera设备的初始化,在开机时被调用。
####
2.
CameraHost初始化
步骤1中提到的HdfCameraHostDriverBind接口提供了CameraServiceDispatch和CameraHostStubInstance的注册。这两个接口一个是远端调用CameraHost的方法,如OpenCamera(),SetFlashlight()等,另外一个是Camera设备的初始化,在开机时被调用。
int HdfCameraHostDriverBind(HdfDeviceObject *deviceObject)
{
...
...
@@ -85,7 +85,7 @@ OpenHarmony相机驱动框架模型对上实现相机HDI(Hardware Driver Inter
return HDF_SUCCESS;
}
下面的函数是远端CameraHost调用的方法:
下面的函数是远端CameraHost调用的方法:
int32_t CameraHostStub::CameraHostServiceStubOnRemoteRequest(int cmdId, MessageParcel &data,
MessageParcel &reply, MessageOption &option)
...
...
@@ -114,10 +114,10 @@ OpenHarmony相机驱动框架模型对上实现相机HDI(Hardware Driver Inter
return HDF_SUCCESS;
}
CameraHostStubInstance()接口最终调用CameraHostImpl::Init()方法,该方法会获取物理Camera,并对DeviceManager和PipelineCore进行初始化。
CameraHostStubInstance()接口最终调用CameraHostImpl::Init()方法,该方法会获取物理Camera,并对DeviceManager和PipelineCore进行初始化。
####
步骤3
获取CamerHost
调用Get()接口从远端CameraService中获取CameraHost对象。get()方法如下:
####
3.
获取CamerHost
调用Get()接口从远端CameraService中获取CameraHost对象。get()方法如下:
sptr<ICameraHost> ICameraHost::Get(const char *serviceName)
{
...
...
@@ -139,9 +139,9 @@ CameraHostStubInstance()接口最终调用CameraHostImpl::Init()方法,该方
return nullptr;
}
####
步骤4
OpenCamera()接口
获取CameraHost对象,该对象中有五个方法,分别是SetCallback、GetCameraIds、GetCameraAbility、OpenCamera和SetFlashlight。下面着重描述OpenCamera接口。
CameraHostProxy的OpenCamera()接口通过CMD_CAMERA_HOST_OPEN_CAMERA调用远端CameraHostStubOpenCamera()接口并获取ICameraDevice对象。
####
4.
OpenCamera()接口
获取CameraHost对象,该对象中有五个方法,分别是SetCallback、GetCameraIds、GetCameraAbility、OpenCamera和SetFlashlight。下面着重描述OpenCamera接口。
CameraHostProxy的OpenCamera()接口通过CMD_CAMERA_HOST_OPEN_CAMERA调用远端CameraHostStubOpenCamera()接口并获取ICameraDevice对象。
CamRetCode CameraHostProxy::OpenCamera(const std::string &cameraId, const OHOS::sptr<ICameraDeviceCallback> &callback, OHOS::sptr<ICameraDevice> &pDevice)
{
...
...
@@ -162,8 +162,8 @@ CameraHostProxy的OpenCamera()接口通过CMD_CAMERA_HOST_OPEN_CAMERA调用远
return retCode;
}
Remote()->SendRequest调用上文提到的CameraHostServiceStubOnRemoteRequest(),根据cmdId进入CameraHostStubOpenCamera()接口,最终调用CameraHostImpl::OpenCamera(),该接口获取了
CameraDevice并对硬件进行上电等操作。
Remote()->SendRequest调用上文提到的CameraHostServiceStubOnRemoteRequest(),根据cmdId进入CameraHostStubOpenCamera()接口,最终调用CameraHostImpl::OpenCamera(),该接口获取了
CameraDevice并对硬件进行上电等操作。
CamRetCode CameraHostImpl::OpenCamera(const std::string &cameraId, const OHOS::sptr<ICameraDeviceCallback> &callback, OHOS::sptr<ICameraDevice> &device)
{
...
...
@@ -202,8 +202,8 @@ CameraDevice并对硬件进行上电等操作。
return NO_ERROR;
}
####
步骤5
获取GetStreamOperator对象
IStreamOperator定义了一系列对流控制和操作的接口,主要有CreateStreams、CommitStreams、Capture、CancelCapture等。
####
5.
获取GetStreamOperator对象
IStreamOperator定义了一系列对流控制和操作的接口,主要有CreateStreams、CommitStreams、Capture、CancelCapture等。
CamRetCode CameraDeviceImpl::GetStreamOperator(const OHOS::sptr<IStreamOperatorCallback> &callback,
OHOS::sptr<IStreamOperator> &streamOperator)
...
...
@@ -229,8 +229,8 @@ IStreamOperator定义了一系列对流控制和操作的接口,主要有Creat
});
}
####
步骤6
创建流
调用CreateStreams创建流前需要填充StreamInfo结构体,具体内容如下:
####
6.
创建流
调用CreateStreams创建流前需要填充StreamInfo结构体,具体内容如下:
using StreamInfo = struct _StreamInfo {
int streamId_;
...
...
@@ -245,7 +245,7 @@ IStreamOperator定义了一系列对流控制和操作的接口,主要有Creat
EncodeType encodeType_;
};
CreateStreams()接口是StreamOperatorImpl类中的方法,该接口的主要作用是创建一个StreamBase对象,通过StreamBase的Init方法初始化CreateBufferPool等操作。
CreateStreams()接口是StreamOperatorImpl类中的方法,该接口的主要作用是创建一个StreamBase对象,通过StreamBase的Init方法初始化CreateBufferPool等操作。
RetCode StreamOperatorImpl::CreateStream(const std::shared_ptr<StreamInfo>& streamInfo)
{
...
...
@@ -267,8 +267,8 @@ CreateStreams()接口是StreamOperatorImpl类中的方法,该接口的主要
return RC_OK;
}
####
步骤7
配置流
CommitStreams()是配置流的接口,必须在创建流之后调用,其主要作用是初始化Pipeline和创建Pipeline。
####
7.
配置流
CommitStreams()是配置流的接口,必须在创建流之后调用,其主要作用是初始化Pipeline和创建Pipeline。
CamRetCode StreamOperatorImpl::CommitStreams(OperationMode mode, const std::shared_ptr<CameraStandard::CameraMetadata>& modeSetting)
{
...
...
@@ -303,8 +303,8 @@ CommitStreams()是配置流的接口,必须在创建流之后调用,其主
return NO_ERROR;
}
####
步骤8
捕获图像
在调用Capture()接口前需要先填充CaptureInfo结构体,具体内容如下:
####
8.
捕获图像
在调用Capture()接口前需要先填充CaptureInfo结构体,具体内容如下:
using CaptureInfo = struct _CaptureInfo {
std::vector<int> streamIds_; //需要Capture的streamIds
...
...
@@ -312,7 +312,7 @@ CommitStreams()是配置流的接口,必须在创建流之后调用,其主
bool enableShutterCallback_;
};
StreamOperatorImpl中的Capture方法主要调用CreateCapture()接口去捕获数据流:
StreamOperatorImpl中的Capture方法主要调用CreateCapture()接口去捕获数据流:
CamRetCode StreamOperatorImpl::Capture(int captureId, const std::shared_ptr<CaptureInfo>& captureInfo, bool isStreaming)
{
...
...
@@ -340,8 +340,8 @@ StreamOperatorImpl中的Capture方法主要调用CreateCapture()接口去捕获
return NO_ERROR;
}
####
步骤9
取消捕获和释放离线流
StreamOperatorImpl类中的CancelCapture()接口的主要作用是根据captureId取消数据流的捕获。
####
9.
取消捕获和释放离线流
StreamOperatorImpl类中的CancelCapture()接口的主要作用是根据captureId取消数据流的捕获。
CamRetCode StreamOperatorImpl::CancelCapture(int captureId)
{
...
...
@@ -352,7 +352,7 @@ StreamOperatorImpl类中的CancelCapture()接口的主要作用是根据captureI
return NO_ERROR;
}
StreamOperatorImpl类中的ReleaseStreams接口的主要作用是释放之前通过CreateStream()和CommitStreams()接口创建的流,并销毁Pipeline。
StreamOperatorImpl类中的ReleaseStreams接口的主要作用是释放之前通过CreateStream()和CommitStreams()接口创建的流,并销毁Pipeline。
CamRetCode StreamOperatorImpl::ReleaseStreams(const std::vector<int>& streamIds)
{
...
...
@@ -362,27 +362,27 @@ StreamOperatorImpl类中的ReleaseStreams接口的主要作用是释放之前通
return NO_ERROR;
}
####
步骤10
关闭Camera设备
调用CameraDeviceImpl中的Close()来关闭CameraDevice,该接口调用deviceManager中的PowerDown()来给设备下电。
####
10.
关闭Camera设备
调用CameraDeviceImpl中的Close()来关闭CameraDevice,该接口调用deviceManager中的PowerDown()来给设备下电。
## 开发实例<a name="section1564411661810"></a>
在/drivers/peripheral/camera/hal/init目录下有一个关于Camera的demo,开机后会在/system/bin下生成可执行文件ohos_camera_demo,该demo可以完成camera的预览,拍照等基础功能。下面我们就以此demo为例讲述怎样用HDI接口去编写预览
和拍照
的用例。
在/drivers/peripheral/camera/hal/init目录下有一个关于Camera的demo,开机后会在/system/bin下生成可执行文件ohos_camera_demo,该demo可以完成camera的预览,拍照等基础功能。下面我们就以此demo为例讲述怎样用HDI接口去编写预览
PreviewOn()和拍照CaptureON()
的用例。
1.
在main函数中构造一个Hos3516Demo对象,该对象中有对camera初始化、启停流、释放等控制的方法。下面mainDemo->InitSensors()函数为初始化CameraHost,mainDemo->InitCameraDevice()函数为初始化CameraDevice。
1.在main函数中构造一个Hos3516Demo对象,该对象中有对camera初始化、启停流、释放等控制的方法。下面mainDemo->InitSensors()函数为初始化CameraHost,mainDemo->InitCameraDevice()函数为初始化CameraDevice。
int main(int argc, char** argv)
{
RetCode rc = RC_OK;
auto mainDemo = std::make_shared<Hos3516Demo>();
rc = mainDemo->InitSensors(); // 初始化C
ma
eraHost
rc = mainDemo->InitSensors(); // 初始化C
am
eraHost
if (rc == RC_ERROR) {
CAMERA_LOGE("main test: mainDemo->InitSensors() error\n");
return -1;
}
rc = mainDemo->InitCameraDevice(); //初始化CameraDevice
rc = mainDemo->InitCameraDevice(); //
初始化CameraDevice
if (rc == RC_ERROR) {
CAMERA_LOGE("main test: mainDemo->InitCameraDevice() error\n");
return -1;
...
...
@@ -399,7 +399,7 @@ StreamOperatorImpl类中的ReleaseStreams接口的主要作用是释放之前通
return RC_OK;
}
初始化CameraHost函数实现如下,这里调用了HDI接口ICameraHost::Get()去获取demoCameraHost
。
初始化CameraHost函数实现如下,这里调用了HDI接口ICameraHost::Get()去获取demoCameraHost,并对其设置回调函数
。
RetCode Hos3516Demo::InitSensors()
{
...
...
@@ -414,7 +414,7 @@ StreamOperatorImpl类中的ReleaseStreams接口的主要作用是释放之前通
return RC_OK;
}
初始化CameraDevice函数实现如下,这里调用了GetCameraIds(cameraIds_),GetCameraAbility(cameraId, ability_),OpenCamera(cameraIds_.front(), callback, demoCameraDevice_)等接口实现了demoCameraHost的获取。
初始化CameraDevice函数实现如下,这里调用了GetCameraIds(cameraIds_),GetCameraAbility(cameraId, ability_),OpenCamera(cameraIds_.front(), callback, demoCameraDevice_)等接口实现了demoCameraHost的获取。
RetCode Hos3516Demo::InitCameraDevice()
{
...
...
@@ -427,7 +427,7 @@ StreamOperatorImpl类中的ReleaseStreams接口的主要作用是释放之前通
return RC_OK;
}
2.
PreviewOn()接口包含配置流、开启预览流和启动Capture动作。该接口执行完成后Camera预览通路已经开始运转并开启了两路流,一路流是preview,另外一路流是capture或者video,两路流中仅对preview流进行capture动作。
2.PreviewOn()接口包含配置流、开启预览流和启动Capture动作。该接口执行完成后Camera预览通路已经开始运转并开启了两路流,一路流是preview,另外一路流是capture或者video,两路流中仅对preview流进行capture动作。
static RetCode PreviewOn(int mode, const std::shared_ptr<Hos3516Demo>& mainDemo)
{
...
...
@@ -442,8 +442,7 @@ StreamOperatorImpl类中的ReleaseStreams接口的主要作用是释放之前通
return RC_OK;
}
StartCaptureStream()、StartVideoStream()和StartPreviewStream()接口都会调用CreatStream()接口,只是传入的参数不同。
StartCaptureStream()、StartVideoStream()和StartPreviewStream()接口都会调用CreatStream()接口,只是传入的参数不同。
RetCode Hos3516Demo::StartVideoStream()
{
...
...
@@ -455,7 +454,7 @@ StartCaptureStream()、StartVideoStream()和StartPreviewStream()接口都会调
return RC_OK;
}
CreatStream()方法调用HDI接口去配置和创建流,首先调用HDI接口去获取StreamOperation对象,然后创建一个StreamInfo。调用CreateStreams()和CommitStreams()实际创建流并配置流。
CreatStream()方法调用HDI接口去配置和创建流,首先调用HDI接口去获取StreamOperation对象,然后创建一个StreamInfo。调用CreateStreams()和CommitStreams()实际创建流并配置流。
RetCode Hos3516Demo::CreatStreams(const int streamIdSecond, StreamIntent intent)
{
...
...
@@ -499,7 +498,7 @@ CreatStream()方法调用HDI接口去配置和创建流,首先调用HDI接口
return RC_OK;
}
CaptureON()接口调用streamOperator的Capture()方法获取camera数据并轮转buffer,拉起一个线程接收相应类型的数据。
CaptureON()接口调用streamOperator的Capture()方法获取camera数据并轮转buffer,拉起一个线程接收相应类型的数据。
RetCode Hos3516Demo::CaptureON(const int streamId, const int captureId, CaptureMode mode)
{
...
...
@@ -524,7 +523,7 @@ CaptureON()接口调用streamOperator的Capture()方法获取camera数据并轮
return RC_OK;
}
3.
ManuList()函数从控制台通过fgets()接口获取字符,不同字符所对应demo支持的功能不同,并打印出该demo所支持功能的菜单。
3.ManuList()函数从控制台通过fgets()接口获取字符,不同字符所对应demo支持的功能不同,并打印出该demo所支持功能的菜单。
static void ManuList(const std::shared_ptr<Hos3516Demo>& mainDemo,
const int argc, char** argv)
...
...
@@ -581,7 +580,7 @@ CaptureON()接口调用streamOperator的Capture()方法获取camera数据并轮
}
}
PutMenuAndGetChr()接口打印了demo程序的菜单,并调用fgets()等待从控制台输入命令,内容如下:
PutMenuAndGetChr()接口打印了demo程序的菜单,并调用fgets()等待从控制台输入命令,内容如下:
static int PutMenuAndGetChr(void)
{
...
...
@@ -601,7 +600,7 @@ PutMenuAndGetChr()接口打印了demo程序的菜单,并调用fgets()等待从
return c;
}
控制台输出菜单详情如下:
控制台输出菜单详情如下:
"Options:\n"
"-h | --help Print this message\n"
...
...
@@ -614,5 +613,5 @@ PutMenuAndGetChr()接口打印了demo程序的菜单,并调用fgets()等待从
"-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
)
。
demo中其他功能会调用不同的HDI接口去实现,与PreviewOn()接口类似,这里不再赘述,具体详情可以参见[ohos_camera_demo](https://gitee.com/openharmony/drivers_peripheral/tree/master/camera/hal/init)。
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录