From 2691b3b15a9f766a4ca8d89733064da8338fadb5 Mon Sep 17 00:00:00 2001 From: wu Date: Tue, 28 Dec 2021 22:54:59 -0800 Subject: [PATCH] modified: zh-cn/device-dev/driver/driver-peripherals-camera-des.md Signed-off-by: wu --- .../driver/driver-peripherals-camera-des.md | 89 +++++++++---------- 1 file changed, 44 insertions(+), 45 deletions(-) diff --git a/zh-cn/device-dev/driver/driver-peripherals-camera-des.md b/zh-cn/device-dev/driver/driver-peripherals-camera-des.md index e4f722b3c3..8068ad9314 100755 --- a/zh-cn/device-dev/driver/driver-peripherals-camera-des.md +++ b/zh-cn/device-dev/driver/driver-peripherals-camera-des.md @@ -42,15 +42,15 @@ OpenHarmony相机驱动框架模型对上实现相机HDI(Hardware Driver Inter ## 开发指导 ### HDI接口说明 -旨在了解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)。 ### 开发步骤 -下面分步骤描述了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::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 &callback, OHOS::sptr &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 &callback, OHOS::sptr &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 &callback, OHOS::sptr &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) { @@ -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& modeSetting) { @@ -303,8 +303,8 @@ CommitStreams()是配置流的接口,必须在创建流之后调用,其主 return NO_ERROR; } -#### 步骤8 捕获图像 -在调用Capture()接口前需要先填充CaptureInfo结构体,具体内容如下: +#### 8. 捕获图像 + 在调用Capture()接口前需要先填充CaptureInfo结构体,具体内容如下: using CaptureInfo = struct _CaptureInfo { std::vector 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, 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& streamIds) { @@ -362,27 +362,27 @@ StreamOperatorImpl类中的ReleaseStreams接口的主要作用是释放之前通 return NO_ERROR; } -#### 步骤10 关闭Camera设备 -调用CameraDeviceImpl中的Close()来关闭CameraDevice,该接口调用deviceManager中的PowerDown()来给设备下电。 +#### 10. 关闭Camera设备 + 调用CameraDeviceImpl中的Close()来关闭CameraDevice,该接口调用deviceManager中的PowerDown()来给设备下电。 ## 开发实例 -在/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(); - rc = mainDemo->InitSensors(); // 初始化CmaeraHost + rc = mainDemo->InitSensors(); // 初始化CameraHost 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& 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& 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)。 -- GitLab