虽然我们已经基本看完了视频帧数据的持续采集流程,也不能忽略后续的关流和buffer释放操作,我们继续看最后的几个v4l2接口调用:

在ExternalCameraDeviceSession::v4l2StreamOffLocked中,我们可以看到streamOff的调用:

\vendor\mediatek\tv\hardware\interfaces\camera\device\3.4\default\MtkExternalCameraDeviceSession.cpp

很直接的通过ioctl向设备下达STREAMOFF调用来告诉设备停止视频流的采集。

但是为什么在STREAMOFF后又调用了REQBUFS呢,这个接口不是用来向内核申请缓冲区的吗?

回到系列总结第二篇,buffer管理的REQBUF部分我们就可以看出区别:

STREAMOFF后面的这个REQBUFS的count成员赋值为0,也就是说和注释说的一致,起到一个清理buffer的作用。

值得注意的是,酷图中提到的unmap过程我们好像并没有见到,也就是说我们从内核mmap出来的buffer好像并没有归还回内核。这是怎么回事呢?往回看一下,其实这个unmap过程是在enqueueV4l2Frame中完成的

为什么这个munmap过程并没有在酷图所说的STREAMOFF调用完成之后再进行呢?还记得mmap过程吗,是在DQBUF之后,相当于我们这里的flow是:

DQ取出一块buffer–>mmap到用户空间–>在用户空间对buffer的内容解码、显示等等–>buffer还给内核空间–>最后把内核空间已经使用过的buffer重新入队

至此我们V4L2接口在HAL中的调用流程就终于看完了!也许之后再找一些其他的HAL再看看能对比出更多的知识吧!

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注