v4l2中的多流機制

2021-09-14 00:34:30 字數 1077 閱讀 8579

come from : 

一直在搞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 然後銷毀流

V4L2程式設計

include include include include include include include include include include typedef struct buftype buftype user buf int n buffer 0 開啟攝像頭裝置 int ope...

V4L2 程式設計

v4l2程式設計 1.定義 2.工作流程 開啟裝置 檢查和設定裝置屬性 設定幀格式 設定一種輸入輸出方法 緩衝區管理 迴圈獲取資料 關閉裝置。3.裝置的開啟和關閉 include int open const char device name,int flags include int close ...

uvc和v4l2簡介uvc和v4l2簡介

對這塊不是特別理解,看了幾篇部落格,還是一知半解,先記錄下,以後有機會深入後,再來更新 首先介紹兩個概念 uvc 最新的uvc版本為uvc 1.5,由usb if usb implementers forum 定義包括基本協議及負載格式 1 2 這是wikipedia的解釋。v4l2 從兩個的介紹也...