系列文章目录
提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 Python 机器学习入门之pandas的使用
前言
提示:这里可以添加本文要记录的大概内容:
随着客户对图像延时需求的要求越来越高,希望借着这个拆分nvidia中的v4l2 中架构实现
提示:以下是本篇文章正文内容,下面案例可供参考
一、nvidia中的camera satck
二、介绍V4l2 架构
1.video_device
video_device 用来和VFS进行交互,并且维护数据队列,如果子设备需要与用户态交互,则需要实现相应的video_device 并注册到。
对一个实例来说(其实就是对应与videox),有一个v4l2_device 结构体用来表示。如果这个结构体需要与用户交互,那么就需要video_device来注册节点。当然如果其它的子设备如果想要注册子节点,也可以申请video_device用以注册节点。从用户的角度看,其直接操作设备节点,设备对应video_device 。
节点对用的video_device 指向了这个这个示例对用的v4l2_device.
那么video_device 结构体中重要的结构有
v4l2_file_operations 用来使用open read等操作这个都比较正常
v4l2_ioctl_ops 实现对用的ioctl操作
vb2_queue 维护camera 数据 下一节会介绍
2.vb2_queue
|
上面是直接使用vb2_queue,那么直接vb2_queue 是什么时候完成初始化的呢,当open /dev/videox
的时候完成队列的初始化。除了vb2_queue中的帧数据的数量。还有一点就是内存的分配的方式特别重要
这个是和nvidia 平台紧密结合的,我们的sdk除了拿到的数据帧,还需要对取得数据进行处理,如 图像的缩放
,色彩空间的拷贝。所以camera 帧存放的内存也是很重要的。
我们的sdk中设置的memory 类型 设置的为V4L2_MEMORY_DMABUF,还有其它的方式。
- VB2_MMAP 这种方式是内核分配好数据帧的内存,然后用户态将内核中申请到的内存通过
mmap的方式映射到用户态的内存空间中方便用户访问。
- VB2_USERPTR 用户态申请好内存空间之后,在开始捕获的时候将内存地址放入vb2_queue这会队列中。
- 我们使用的DMA-BUF这种方式,下面是使用方法,DMA-BUF的机制比较负载,以后V4L2架构的详细的分析中
会介绍,现在我们可以简单的理解,DMA-BUF是文件描述符对一块内存的封装,这块内存使用文件描述符就可以找到
有了这个文件描述符,这块内存就可以被各个模块之间被传递,被处理。可以省去繁琐的内存copy的操作
总结
只是简单的介绍一下,从用户态获取数据的防范,和内核实现,后续结合nvidia的代码实现
详细分析设备节点的生成,图像的获取等问题,第一次写文章。