繁体   English   中英

在linux中使用v4l2驱动的视频流中mmap、userptr和dmabuf有什么用?

[英]What is the use of mmap , userptr and dmabuf in video streaming using v4l2 drivers in linux?

enum v4l2_memory {
    V4L2_MEMORY_MMAP             = 1,
    V4L2_MEMORY_USERPTR          = 2,
    V4L2_MEMORY_OVERLAY          = 3,
    V4L2_MEMORY_DMABUF           = 4,

};

这是没有任何帧丢失的视频流的最快和有效的方法之一。

Userptr、mmap 和 DMABUF 都是为了避免因复制 memory(零复制)而导致的 CPU 周期浪费的方法,但它们都有不同的用例。 尝试进行简单的比较:

  • 用户指针

    • 此处用户空间分配 memory,并将指针传递给内核空间(以在 output 上使用,甚至填写输入)。
    • 从理论上讲,即使在捕获视频并在另一台设备上再次发送的管道中,这也可以避免任何复制。
    • 实际上,这种用户分配的内存通常并不总是很容易被硬件访问。 硬件更喜欢用户空间无法分配的 DMA 内存区域。
  • MMAP

    • memory由驱动分配/在kernel空间,映射到用户memory空间,没有任何副本的方法。 这意味着 memory 可以指向 DMA 内存(分配在 kernel 空间中)

    • 这适用于接收帧或发送帧,但在应该通过多个硬件设备(例如捕获 + 编码器 + 输出)传递相同帧的管道中,只有一个驱动程序可以分配缓冲区。 让所有驱动程序分配自己的 memory 需要用户空间在它们之间进行复制。 将 MMAP 与 userpointer 组合适用于单个接收-发送管道,但如果需要链中的多个元素,这会进一步分解。

  • DMA缓冲器

    • 内核空间分配(显式)DMA memory,但与 MMAP 相比,有关 dma memory 空间的信息被显式保留。 这允许用户空间设置一个处理链,允许多个驱动程序有效地共享 DMA 缓冲区。

pengutronix 的人对此有一个很好的介绍,其中可视化了这些概念: https://elinux.org/images/b/b0/OSELAS.Presentation-DMABUF-migration.pdf

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM