OH-v3.0-LTS Camera相机驱动框架(L2)解析5_图像采集 原创 精华
OpenHarmory-v3.0-LTS Camera相机驱动框架(L2)解析5_图像采集
新大陆自动识别:郑曦
应用层代码
1. StreamOperator::Capture
创建一个CaptureRequest请求,调用AddRequest将request添加到对应的Stream里
StreamBase::AddRequest() 在第一次请求时先调用StartStream()来启动“流”
1、pipeline_->Prepare 和 Start 会分别调用前面创建好的流节点列表中每个Node的init和Start接口
2、创建线程处理HandleRequest()
StartSteam()在完成了必要的启动流程后会通过HandleRequest()的线程,继续处理当前Request的Process()函数。
CaptureRequest的Process启动的是下面的StramBase的Capture()
1、pipeline_->Config 和 Capture 会分别调用前面创建好的流节点列表中每个Node的Config和Capture接口
2、SendMessage负责向应用层上送start的message
3、最后启动buffer分发函数DeliverBuffer() 开始图像数据的传递。
到此Capture的请求就处理完成,剩下就是Stream负责让数据流在Node中轮转并通过Surface图形缓冲区接口将数据传递到应用层。
整个的数据轮转涉及到多个线程,下面会把关键的代码整理出来。细节的部分 有兴趣的同学可以自己深入去看。
2. Buffer的申请和下送 StreamBase::DeliverBuffer()
tunnel_->GetBuffer() 会向生产型Surface 要一个Buffer,同时创建一个CameraBuffer(IBuffer类型)和SurfaceBuffer 对应。
取到的IBuffer添加到bufferPool缓冲池来管理。
bufferPool里有有效的buffer后,会将IBuffer转换成frameSpec格式,下送给SDKnode->ProvideBuffers(frameSpec)
同样是在Vpss这个Node上实现!
3. 两个重要的Node回调接口
3.1 VpssNode::SetBufferCallback()
在前面pipeline_->Start()
中重要的一个节点是VpssNode (VpssNode is-a SourceNode)
这里分别启动了另外两个线程 负责收集Buffer和分发Buffer
另外要看下SetBufferCallback() 给到Hi3516底层的SDK设置重要的回调接口。接口的最终调用是SourceNode::PortHandler::OnBuffer函数。
3.2 SinkNode::SetCallBack()
另外一个重要的Node是ViNode(ViNode is-a SinkNode)
这个回调的设置要追溯下前几章的代码
从下面的代码片段可以看到SinkNode的CallBack() 调用的是HandleResult() 这个函数。
4. camera图像上送
当camera采集到一帧数据,SDK会通过VpssNode的回调通知Camera HDI层。这个时候就来到了上面VpssNode::SetBufferCallback()设置的
SourceNode::PortHandler::OnBuffer()函数。
OnBuffer通知分发线程将接收到的buffers数据分发给实现了DeliverBuffer()接口的Node。本示例代码中SinkNode的DeliverBuffer()
SinkNode的回调StreamBase::HandleResult()最终会来到StreamBase::OnFrame()调用StreamBase::ReceiveBuffer()这个函数;
ReceiveBuffer先把这个buffer归还给bufferPool缓冲池
然后调用StreamTunnel::PutBuffer
StreamTunnel会调用Surface的FlushBuffer接口归还一个生产好的SurfaceBuffer对象并携带一些信息。
到此处上层应用的消费型Surface就可以得到这个图像的数据。
5.小结
- 整个取图上送的代码 涉及到很多个线程之间的协同,代码阅读难度相对较大,需要多点耐心
- 抓住几个重要的Node来梳理代码。
- 一个有效的pipeLine 应该必须包含一个SourceNode(VpssNode)和一个SinkNode(VoNode)
- 本章结束后cameraHDI层的总体框架和工作流程介绍完毕。感谢耐心看完系列章节的同学。个人理解有误的地方还请评论指出。
赶快结合大佬之前的文章一起跑一遍