作者:润和软件 郭新星
相机作为智能手机上少有的成长空间不错的,能够做出差异化的功能,每年都能成为各大Android手机厂商争相宣传的亮点。众所周知Android采用Linux 作为其内核,而Linux采用的开源协议具有传染性[1],导致Android HAL[2]成为了手机厂商们竞争的重要战场。随着OpenHarmony 3.1[3]的发布,相机模块也逐渐完善起来,目前提供了基础预览和拍照的能力。OpenHarmony中,相机用户态驱动框架承担了和Android Camera HAL一样的角色,这部分位于OpenHarmony的HDF[4]中,对上实现相机HDI[5]接口,对下实现相机Pipeline模型,管理相机各个硬件设备。
相机用户态驱动框架(下图的CameraHost 部分)总体可以分为三层,HDI实现层,实现相机标准南向接口;框架层,对接HDI实现层的控制、流的转发,实现数据通路的搭建、管理相机各个硬件设备等功能;适配层,屏蔽底层芯片和OS差异,支持多平台适配。
模块介绍
HDI Implementation:对上实现HDI接口,向下调用框架层的接口,完成HDI接口任务的转发。
Buffer Manager : 屏蔽不同内存管理的差异,为子系统提供统一的操作接口,同时提供buffer轮转的功能。
Pipeline Core :解析HCS配置完成pipeline的搭建,调度pipeline中的各个node完成流的处理
Device Manager:通过调用底层硬件适配层接口,实现查询控制底层设备、枚举监听底层设备的功能
Platform Adaption :屏蔽硬件差异,为Device Manager提供统一的操作底层硬件的能力
•目录结构
Shell
drivers/peripheral/camera
|-- README_zh.md
|-- bundle.json
|-- figures
| `-- logic-view-of-modules-related-to-this-repository_zh.png
|-- hal
| |-- BUILD.gn
| |-- adapter
| |-- buffer_manager
| |-- camera.gni
| |-- device_manager
| |-- hdi_impl
| |-- include
| |-- init
| |-- pipeline_core
| |-- test
| `-- utils
|-- hal_c
| |-- BUILD.gn
| |-- camera.gni
| |-- hdi_cif
| `-- include
`-- interfaces
|-- hdi_ipc
|-- hdi_passthrough
`-- include
•HDI Implementation中的预览流程
接下来我们通过已经发布的OpenHarmony 3.1开源代码,来看看预览是怎么完成的吧
drivers/peripheral/camera/hal/test/v4l2/src /preview_test.cpp存放了针对v4l2的预览测试代码,入口如下
C++
TEST_F(UtestPreviewTest, camera_preview_0001)
{
std::cout << "==========[test log] Preview stream, expected success." << std::endl;
// Get the stream manager
display_->AchieveStreamOperator(); // 获取stream operator
// start stream
display_->intents = {Camera::PREVIEW}; // 预览流
display_->StartStream(display_->intents); // 起流
// Get preview
display_->StartCapture(display_->streamId_preview, display_->captureId_preview, false, true);
// release stream
di