V4L2視訊採集裝置應用程式程式設計總結(原)
Linux2.x核心中,一部分視訊裝置(特別是視訊輸入和採集裝置)採用了V4L2模型進行驅動程式設計。同時提供V4L2的API函式及相關資料結構以供應用程式使用.這裡對V4L2視訊採集裝置的應用程式程式設計進行總結.
1.使用的標頭檔案:V4L2模型使用統一的標頭檔案來包含相關的資料結構和巨集,它存在於”Linux原始碼目錄/include/linux/videodev.h”以及”Linux原始碼目錄/include/linux/videodev2.h”.通常一個視訊裝置的驅動程式標頭檔案會包含它.因此,程式設計時只需要包含視訊驅動對應的標頭檔案就可以了.在這裡是“/media/davinci_vpfe.h”
2.由於在應用程式程式設計中涉及到V4L2資料結構。而該檔案包含於Linux原始碼中,因此在makefile檔案中要包含原始碼標頭檔案的路徑“-I XXX/include”.
3.程式設計流程如下:
動作 |
函式 |
變數及引數 |
備註 |
|
1 |
開啟視訊裝置(阻塞或非阻塞) |
Open |
裝置對應路徑和名稱 |
一般為“/dev/videoX”X=0,1,2… |
2 |
詢問裝置的能力和性質 |
Ioctl |
|
對於輸入裝置,必然要支援記憶體對映或使用者指標 |
3 |
驗證視訊標準的有效性,並設定裝置視訊標準 |
Ioctl |
驗證標準為裝置支援的標準並進行設定後要稍微延時並查詢,檢查裝置是否已設定為相應的標準 |
|
4 |
設定採集裝置採集格式 |
Ioctl |
|
通過配置該結構體,驅動會根據硬體調整畫素實際寬,高,每行的位元組個數,一幅影象位元組數四個引數。程式應根據實際情況修改返回的結果,重新賦值。 |
5 |
請求緩衝區,並通過mmap函式對映到使用者程序記憶體空間 |
Ioctl |
|
1.申請緩衝可能不成功。因此通過v4l2_requestbuffers.count返回值判斷是否申請到足夠的快取.一般設定2—3個buffers.在DaVinci的vpfe驅動中預設就設定了3個buffers.多餘3個申請失敗,少於三個依然使用三個. 2.對映記憶體出現失敗的情況後一定要將已經對映的區域取消對映後再關閉裝置 |
6 |
將申請到的buffers加入到緩衝隊列當中,開始採集 |
Ioctl |
|
進行採集時先通過VIDIOC_DQBUF將一個buffer從佇列中取出來,然後得到它對應對映後的起始地址。進行必要的處理。完畢後一定要將該buffer重新放入佇列中,否則程式到最後將無buffer可用。
PS:由於無論是數字視訊還是模擬視訊,都會有一個i2c配置的過程。從vpfe的驅動程式碼來看,當設定視訊標準時,驅動程式將會呼叫i2c驅動配置視訊源的輸出格式。(對於模擬訊號通常是TVP5150之類的解碼晶片,通過I2C配置,而對於MT9T001之類的晶片則通過I2C直接對其進行配置.)