簡體   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