OH-v3.0-LTS Camera相机驱动框架(L2)解析3_创建流的准备 原创 精华
OpenHarmory-v3.0-LTS Camera相机驱动框架(L2)解析3_创建流的准备
新大陆自动识别 郑曦
1. 简单回顾
先简单回顾总结下前面两章的内容要点
- Camera HDI框架是通过绑定到HDF框架后在系统启动的时候完成初始化 Camera Host 实例。
- 应用层通过获取Camera Host 实例来得到设备支持的Camera的能力属性,并Open相应的设备。
- 应用层通过IPC通讯来调用HDI接口
补充说明
在前面
CameraHostImpl::Init()
创建CameraDevice
实例对象的时候会实例化PipelineCore
的各个子模块包括HostStreamMgr
、StreamPipelineCore
对应的功能会在下面的文章逐一说明。
本章开始略去IPC通讯相关的代码(包括流程图),读者可以参考第一章中
SetCallback
流程自行梳理代码。
2. 回到代码
应用层完成CameraDevice初始化后 开始创建流 相关的上层调用代码相对简单,这里简单画个图,大家可以对着代码梳理下。我们从CreatStrem开始继续往下看。
先丢一个本章代码涉及到的流程图
2.1 Hos3516Demo::GetStreamOpt()
先为 流操作 接口创建一个上层回调,然后通过IPC调用到CameraDeviceImpl
的GetStreamOperator
接口获取流操作的实例。
CameraDeviceImpl
负责实例化StreamOperator
对象,并调用StreamOperator::Init()
完成初始化。
StreamOperator::Init()
会从前面实例化的CameraDevice
对象中取出已经实例化好的StreamPipelineCore
对象调用对应的Init
初始化,同时创建一个进程接收特定的消息。
StreamPipelineCore::Init()
继续实例化StreamPipelineStrategy、StreamPipelineBuilder、StreamPipelineDispatcher 这3个类。它们是负责pipeNode的创建和控制的,现在我们只要记得代码已经把它们实例化完成并放在了StreamPipelineCore里。
到这里StremOperator(下面红框的部分)就创建好了,然后通过IPC回传给上层应用。
整个的StremOperator创建涉及到比较多的类 对应的关系可以看下下面的类图(个人理解,非官方)
2.2 Hos3516Demo::SetStreamInfo()
创建一个流信息 StreamInfo
这里的代码相对简单,设置这个流的分辨率、编码模式、流ID等等。
这里要注意的是bufferQueue_
这个成员。下面会先简单讲一下,算是挖个坑。
然后tunneledMode = 5
这个地方感觉是个BUG 因为在后续的HDI代码部分 实际是个bool
类型。
StreamCustomer::CreateProducer()
这里的OHOS::Surface 涉及到了Graphic子系统中的Surface。Surface 是图形缓冲区管理接口,负责管理图形缓冲区和高效便捷的轮转缓冲区。
详细的说明可以看下源码中的Readme路径在:foundation/graphic/standard/README_zh.md
。
是这里按照我个人的理解先简单的说一下:
Surface分成了一个“生产者” 一个 “消费者”。应用端作为“消费者”向Surface模块申请一个Surface。当对应的“生产者”产生了数据就会通知“消费者” 对数据进行处理。
StreamCustomer::CreateProducer()
做了两件事情
- 为上层应用获取了一个“消费型”surface
- 从获取到的surface中取出对应的“生产者”对象放在了StremInfo的信息里 丢给
StreamOperator
3. 小结
代码到这边 上层应用已经获取到了HDI层的StreamOperator
对象实例。同时为图像数据准备了一个Surface!
同样挖了两个小坑,留待后面的代码进一步讲解
- StreamPipelineStrategy、StreamPipelineBuilder、StreamPipelineDispatcher 这些类是怎么工作的?
- Surface的“生产者”在哪里?
流程图非常详细
好文章,很有用,学习了