v4l2中的多流机制

一直在搞camera,对v4l2也比较熟悉了,今天写文章说点自己的看法

对于v4l2,对多流的支持是比较弱的,只是一个流。但现在的camera 硬件,能支持多个流同事工作,所以又必要对v4l2的api进行扩展,加入多流的支持。

v4l2的团队们考虑了一种做法,可参考linuxtv的网页。

这里谈一下我自己的考虑。

1 先来考虑一个camera设备的构成

1  一个camera 用一个v4l2 设备来代表,然后导出一个vidoe节点来访问这个设备。

2  一个camera 有很多相关的模块组成,把这些模块组织成subdev,并导出video节点访问这些subdev

3  一个camera 应有若干流供用户空间访问,于是抽象出流,然后导出video 节点访问流,这些流是动态创建的,节点也是动态生成的

扩展几个v4l2 api, V4L2_CREAT_STREAM, V4L2_DESTRY_STREAM, get/set_STREAM_INFO

于是用户可以如下访问一个camera设备。

1 open camera v4L2 设备,得到fd。

2 用这个fd, 调用V4L2_CREAT_STREAM,得到stream 的设备节点,这时我们可以传递一个流的描述符来创建流,比如流的类型,预览,video snapshot等

一个流的描述符应该包括以下几点内容

1 流的类型

2 流的格式

3 流的维数w*h

4 流的帧数率范围

5 流数据在内存中的布局情况,

1 面板数

2 data offset

3 width, height

4 stride_width, scan_height

5 panel length

对每一个panel都做如上的描述,内存布局情况可以从驱动中获取。这些信息更加有效的和vb2_buffer 互补, 获取到的流buffer 任然用v4l2_buffer 代表。

3 打开这个节点 得到stream fd

4 配置这个fd,以使用这个stream。

5 用完后关闭fd

6 然后销毁流

这样的做法有连个好处,

1 保留了原来的操作方式,向下兼容

2 添加了多流操作,而且流的操作就是以前的操作方式。

上一篇:careercup-递归和动态规划 9.5


下一篇:Linux新加磁盘挂载和重启自动挂载