NVIDIA 平台中的V4L2架构分析

本文介绍了NVIDIA摄像头驱动中的V4L2架构,包括video_device和vb2_queue的细节。重点讨论了如何使用V4L2_MEMORY_DMABUF方式获取数据帧,以及DMA-BUF在跨模块内存共享中的作用。通过对video_device的ioctl操作和vb2_queue的初始化,展示了数据帧的获取流程,为后续的图像处理奠定了基础。
摘要由CSDN通过智能技术生成

系列文章目录

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 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

  ///
        /* Request camera v4l2 buffer */
        struct v4l2_requestbuffers rb; 
        memset(&rb, 0, sizeof(rb));
        rb.count = default_cam_buffers_;  // vb2_queue 队列的数量默认是使用5个帧
        rb.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; // 数据帧的类型
        rb.memory = V4L2_MEMORY_DMABUF; // 内存的分配的方式
        if (ioctl(camera_ctx_[i].fd_, VIDIOC_REQBUFS, &rb) < 0) // 调用video_device中的ioctl 设置vb2_queue 中的帧数量,帧的类型和 使用的内存
            perror("VIDIOC_REQBUFS");
        if (rb.count != default_cam_buffers_)

上面是直接使用vb2_queue,那么直接vb2_queue 是什么时候完成初始化的呢,当open /dev/videox

的时候完成队列的初始化。除了vb2_queue中的帧数据的数量。还有一点就是内存的分配的方式特别重要

这个是和nvidia 平台紧密结合的,我们的sdk除了拿到的数据帧,还需要对取得数据进行处理,如 图像的缩放

,色彩空间的拷贝。所以camera 帧存放的内存也是很重要的。

    我们的sdk中设置的memory 类型 设置的为V4L2_MEMORY_DMABUF,还有其它的方式。

  1. VB2_MMAP 这种方式是内核分配好数据帧的内存,然后用户态将内核中申请到的内存通过

mmap的方式映射到用户态的内存空间中方便用户访问。

  1. VB2_USERPTR 用户态申请好内存空间之后,在开始捕获的时候将内存地址放入vb2_queue这会队列中。
  2. 我们使用的DMA-BUF这种方式,下面是使用方法,DMA-BUF的机制比较负载,以后V4L2架构的详细的分析中

会介绍,现在我们可以简单的理解,DMA-BUF是文件描述符对一块内存的封装,这块内存使用文件描述符就可以找到

有了这个文件描述符,这块内存就可以被各个模块之间被传递,被处理。可以省去繁琐的内存copy的操作


总结

    只是简单的介绍一下,从用户态获取数据的防范,和内核实现,后续结合nvidia的代码实现

详细分析设备节点的生成,图像的获取等问题,第一次写文章。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值