1. 程式人生 > >v4l2功能列表大全【轉】

v4l2功能列表大全【轉】

文件中 標準 frequency 狀態信息 val rec 主機 算數 ctrl

一,功能參考
目錄
V4L2 close() - 關閉一個V4L2設備
V4L2 ioctl() - 創建的V4L2設備
ioctl VIDIOC_CROPCAP - 視頻裁剪和縮放功能信息
ioctl VIDIOC_DBG_G_REGISTER,VIDIOC_DBG_S_REGISTER - 讀或寫硬件註冊表
ioctl VIDIOC_ENCODER_CMD,VIDIOC_TRY_ENCODER_CMD - 執行編碼器命令
ioctl VIDIOC_ENUMAUDIO - 枚舉音頻輸入
ioctl VIDIOC_ENUMAUDOUT - 枚舉音頻輸出
ioctl VIDIOC_ENUM_FMT - 枚舉圖像格式

ioctl VIDIOC_ENUM_FRAMESIZES - 枚舉外形尺寸
ioctl VIDIOC_ENUM_FRAMEINTERVALS - 枚舉幀間隔
ioctl VIDIOC_ENUMINPUT - 枚舉視頻輸入
ioctl VIDIOC_ENUMOUTPUT - 枚舉視頻輸出
ioctl VIDIOC_ENUMSTD - 枚舉支持的視頻標準
ioctl VIDIOC_G_AUDIO,VIDIOC_S_AUDIO - 查詢或選擇當前的音頻輸入和它的屬性
ioctl VIDIOC_G_AUDOUT,VIDIOC_S_AUDOUT - 查詢或選擇當前的音頻輸出
ioctl VIDIOC_G_CHIP_IDENT –識別電視卡的芯片
ioctl VIDIOC_G_CROP,VIDIOC_S_CROP - 獲取或設置當前裁剪矩形
ioctl VIDIOC_G_CTRL,VIDIOC_S_CTRL - 獲取或設置控件的值
ioctl VIDIOC_G_ENC_INDEX - 獲取關於壓縮視頻流的元數據
ioctl VIDIOC_G_EXT_CTRLS,VIDIOC_S_EXT_CTRLS,VIDIOC_TRY_EXT_CTRLS - 獲取或設置控件的值數,盡量控制值
ioctl VIDIOC_G_FBUF,VIDIOC_S_FBUF - 獲取或設置參數幀緩沖區覆蓋
ioctl VIDIOC_G_FMT,VIDIOC_S_FMT,VIDIOC_TRY_FMT - 獲取或設置數據格式,試驗格式
ioctl VIDIOC_G_FREQUENCY,VIDIOC_S_FREQUENCY - 獲取或設置調諧器或射頻調制器
ioctl VIDIOC_G_INPUT,VIDIOC_S_INPUT - 查詢或選擇當前視頻輸入
ioctl VIDIOC_G_JPEGCOMP,VIDIOC_S_JPEGCOMP -
ioctl VIDIOC_G_MODULATOR,VIDIOC_S_MODULATOR - 調制器,獲取或設置屬性
ioctl VIDIOC_G_OUTPUT,VIDIOC_S_OUTPUT - 查詢或選擇當前視頻輸出
ioctl VIDIOC_G_PARM,VIDIOC_S_PARM - 獲取或設置流參數
ioctl VIDIOC_G_PRIORITY,VIDIOC_S_PRIORITY - 查詢或要求訪問的優先級與文件描述符關聯
ioctl VIDIOC_G_SLICED_VBI_CAP - 查詢切片的VBI功能
ioctl VIDIOC_G_STD,VIDIOC_S_STD - 查詢或選擇當前輸入視頻標準
ioctl VIDIOC_G_TUNER,VIDIOC_S_TUNER - 獲取或設置調諧器屬性
ioctl VIDIOC_LOG_STATUS - 記錄驅動程序的狀態信息
ioctl VIDIOC_OVERLAY - 啟動或停止視頻覆蓋
ioctl VIDIOC_QBUF,VIDIOC_DQBUF - 交流與驅動程序緩沖區
ioctl VIDIOC_QUERYBUF - 查詢一個緩沖區的狀態
ioctl VIDIOC_QUERYCAP - 查詢設備的功能
ioctl VIDIOC_QUERYCTRL,VIDIOC_QUERYMENU - 枚舉控制和菜單控制項目
ioctl VIDIOC_QUERYSTD – 識別由目前的輸入接收的視頻標準
ioctl VIDIOC_REQBUFS - 啟動用戶指針或內存映射的I / O
ioctl VIDIOC_STREAMON,VIDIOC_STREAMOFF - 啟動或停止流I / O
V4L2 mmap() - 映射設備內存到應用程序的地址空間
V4L2 munmap() - 取消映射設備內存
V4L2 open() - 打開的V4L2設備
V4L2調查() - 等待某些事件對一個文件描述符
V4L2閱讀() - 讀取V4L2設備
V4L2選擇() - 同步I / O復用
V4L2寫() - 寫入V4L2設備

V4L2 close()


名稱
V4L2 的關閉 - 關閉一個V4L2設備
概要
#include <unistd.h>int close(int fd);
fd

打開()返回的文件描述符。

說明
關閉設備。即程序中所有I / O被終止和文件描述符相關的資源被釋放。但是數據格式參數,電流輸入或輸出,控制值或其他屬性保持不變。

返回值
該函數成功返回0,失敗返回-1並設置適當的errno。即可能的錯誤代碼:
EBADF
fd不是一個有效的打開文件描述符。

V4L2 ioctl()

名稱
V4L2 -ioctl – 創建一個V4L2設備
概要
#include <sys/ioctl.h>int ioctl(int fd, int request, void *argp);
參數
fd
打開()返回的文件描述符。
要求
V4L2 IOCTL要求代碼與videodev.h頭文件中定義的一致,例如VIDIOC_QUERYCAP。
argp
指針指向一個函數的參數,通常是一個結構。
說明
ioctl()函數用於創建V4L2設備。fd參數必須是一個開放的文件描述符。IOCTL要求把所有參數編碼進去,無論參數是一個輸入,輸出或讀/寫參數,而且參數argp要以字節為單位。宏和定義明確的V4L2 ioctl要求都位於videodev.h頭文件中。應用程序應該使用他們自己的副本,不包括在他們的系統上編譯的內核源代碼的版本。所有的V4L2 ioctl要求,即它們各自的功能和參數,都規定在Reference I, Function Reference.中

返回值
成功的ioctl()函數將返回0,不會重置errno變量。如果失敗返回-1,當IOCTL將輸出或讀/寫參數,它保持不變,並相應地設置errno變量。請參閱下面的可能的錯誤代碼。像EBADF EFAULT一般錯誤不單獨列在討論ioctl要求部分。

註意ioctl可能會返回未定義錯誤代碼。由於有這樣的錯誤可能使一個驅動重起申請意外終止。
EBADF
fd不是一個有效的打開文件描述符。

EBUSY
該屬性不能立即改變。通常當I / O正在進行或者驅動程序多重打開,而另一個進程鎖定了它的所有權時返回這個錯誤代碼。

EFAULT
argp引用一個不可存取的內存區域。

ENOTTY
fd不與字符特殊設備關聯。

EINVAL
請求或數據argp指向的是無效的。這是一個非常常見的錯誤代碼,請參閱Reference I中特殊ioctl要求,原因借鑒Function Reference。

ENOMEM
沒有足夠的物理或虛擬內存可用來完成請求。

ERANGE的
應用程序試圖建立一個超出控制VIDIOC_S_CTRL ioctl範圍的值。

ioctl VIDIOC_CROPCAP

名稱
VIDIOC_CROPCAP - 視頻裁剪和縮放功能信息
概要

int ioctl(int fd, int request, struct v4l2_cropcap *argp);
參數
fd
打開()返回的文件描述符。
請求
VIDIOC_CROPCAP
argp
說明
應用程序使用此功能來查詢裁剪限制,圖像的像素方面及計算數值範圍的信息。他們建立了一個以各自的緩沖(stresm)型的v4l2_cropcap結構的類型字段,並用這個結構的指針調用VIDIOC_CROPCAP ioctl。驅動補充結構的其余部分。結果是不變的,除非切換視頻標準。請記住當切換視頻輸入或輸出時,這個開關會隱藏。

Table 1. struct v4l2_cropcap

enum v4l2_buf_type type

應用程序設置數據流的類型。這些類型是有效的,只有在這裏:V4L2_BUF_TYPE_VIDEO_CAPTURE, V4L2_BUF_TYPE_VIDEO_OUTPUT, V4L2_BUF_TYPE_VIDEO_OVERLAY,和自定義(驅動程序定義)類型時用代碼V4L2_BUF_TYPE_PRIVATE或者更高級的代碼。
struct v4l2_rect bounds
定義了窗口內捕捉或輸出是可能的,這可能排除例如,水平和垂直消隱區。裁剪矩形不能超過這些限制。寬度和高度以像素為單位定義,在模擬域中驅動程序編寫者可以自由選擇原點和坐標系的單位。
struct v4l2_rect defrect
默認裁剪矩形,它應當包括“全貌”。假設像素寬高比為1 / 1,這可能是比如一個在活動圖像區域中心用於NTSC 的640 × 480的矩形,或者用於PAL和SECAM的768 × 576的矩形。同樣的坐標系用於邊界的定義。
struct v4l2_fract pixelaspect
在像素方面(y / x),當沒有縮放應用時,實際采樣頻率比和頻率需要得到方形像素頻率。
當裁剪坐標指的是方形像素時,驅動設置pixelaspect為1 / 1。其他常見的值是NTSC制式為PAL和SECAM,11/10 54/59采樣按[國際電聯BT.601]。


Table 2. struct v4l2_rect
__s32 left 頂部左邊的矩形角橫向偏移,以像素為單位。
__s32 top 頂部左邊的矩形角垂直偏移,以像素為單位。
__s32 width 矩形的寬度,以像素為單位。
__s32 height 矩形的高度,以像素為單位。寬度和高度不能為負數,否則該字段將被標示為異常的原因。

返回值
成功返回0,錯誤返回-1,errno變量設置正確:
EINVAL
該結構v4l2_cropcap類型是無效或不支持ioctl。這時視頻捕捉,輸出和覆蓋設備是不允許的,他們必須支持VIDIOC_CROPCAP.。

ioctl VIDIOC_DBG_G_REGISTER, VIDIOC_DBG_S_REGISTER

名稱
VIDIOC_DBG_G_REGISTER,VIDIOC_DBG_S_REGISTER - 讀或寫硬件註冊表
概要

int ioctl(int fd, int request, struct v4l2_register *argp);

int ioctl(int fd, int request, const struct v4l2_register *argp);
參數

fd
打開()返回的文件描述符。
請求
VIDIOC_DBG_G_REGISTER,VIDIOC_DBG_S_REGISTER
argp
說明
實驗性:這是一個實驗接口,並在未來可能改變。
為了調試驅動程序,這些IOCTL允許測試應用程序直接訪問硬件註冊表。普通應用程序不能使用它們。

由於寫或讀註冊表可能危及系統的安全性,穩定性和損壞硬件,所有的ioctl需要超級用戶權限。此外,Linux內核必須編譯CONFIG_VIDEO_ADV_DEBUG選項以啟用這些IOCTL。

要編寫一個註冊表應用程序必須初始化一個結構 v4l2_register所有字段,並用這個結構的指針調用VIDIOC_DBG_S_REGISTER。 match_type和match_chip字段選擇電視卡上的一個芯片,這個註冊表字段指定一個註冊表數目,Val字段值被寫入到註冊表。
要讀取註冊表的應用程序必須初始化match_type,match_chip和REG字段,並該結構的指針調用VIDIOC_DBG_G_REGISTER。成功的話,驅動程序會把註冊表中的值存儲在Val字段中。失敗的話,該結構保持不變。

當match_type為V4L2_CHIP_MATCH_HOST時,match_chip選擇電視卡上的第n個nonI2C芯片。驅動也許會理解為一個隨機ID match_chip,但是我們不這麽理解。數字零始終選擇主芯片,例如芯片連接到PCI總線。你可以找出哪些芯片提供VIDIOC_G_CHIP_IDENT ioctl。

當match_type為V4L2_CHIP_MATCH_I2C_DRIVER時,像linux/i2c-id.h頭文件中定義的那樣, match_chip包含一個驅動ID,例如I2C_DRIVERID_SAA7127將匹配任何saa7127驅動支持的芯片,不管其I2C總線地址。當由相同的驅動程序支持的多種芯片正在運行時,這些IOCTL影響是不確定的。此外用VIDIOC_G_CHIP_IDENTioctl可以找出正在運行的I2C芯片。

當match_type為V4L2_CHIP_MATCH_I2C_ADDR時,match_chip用7位I2C總線地址選擇了一個芯片。

成功沒有保證:由於在Linux I2C總線驅動程序中的一個缺陷,這些IOCTL可能會成功返回而不用實際讀取或寫入一個註冊表。要找到最有可能失敗的地方,我們建議一個VIDIOC_G_CHIP_IDENT命令確認正在運行的所選的I2C芯片。

這些IOCTL具有選擇性,不是所有的驅動程序支持它們。然而,當一個驅動程序支持這些IOCTL時也必須支持VIDIOC_G_CHIP_IDENT。相反它可能支持VIDIOC_G_CHIP_IDENT但不支持這些IOCTL。

在Linux 2.6.21將介紹VIDIOC_DBG_G_REGISTER和VIDIOC_DBG_S_REGISTER。

我們建議用V4L2 - dbg實用工具直接結束調用這些IOCTL。這可從LinuxTV v41 -DVB庫中看到;訪問指令http://linuxtv.org/repo/。

Table 1. struct v4l2_register

__u32 match_type 見表2的可能類型表。
__u32 match_chip 由這個代碼匹配芯片,根據match_type字段解釋執行。
__u64 reg 一個註冊代碼。
__u64 val 這個值從註冊表中讀出,或寫入到註冊表。

Table 2. Chip Match Types
V4L2_CHIP_MATCH_HOST 0 匹配的卡上的 n個芯片,0為主機芯片。不匹配I2C芯片。
V4L2_CHIP_MATCH_I2C_DRIVER 1 用linux/i2c-id.h頭文件中的驅動程序的ID匹配I2C芯片。
V4L2_CHIP_MATCH_I2C_ADDR 2 匹配7位I2C總線地址芯片。

返回值
成功返回0,錯誤返回-1,errno變量相應地設置:

EINVAL
該驅動程序不支持該IOCTL,或內核不是CONFIG_VIDEO_ADV_DEBUG選項編譯,或match_type為無效,或選定的芯片或註冊表不存在。

返回EPERM
沒有足夠的權限。Root權限才能執行這些IOCTL。

ioctl VIDIOC_ENCODER_CMD, VIDIOC_TRY_ENCODER_CMD

名稱
VIDIOC_ENCODER_CMD,VIDIOC_TRY_ENCODER_CMD - 執行編碼器命令
簡介
int ioctl(int fd, int request, struct v4l2_encoder_cmd *argp);
參數
fd
打開()返回的文件描述符。
請求
VIDIOC_ENCODER_CMD,VIDIOC_TRY_ENCODER_CMD
argp

說明
實驗性:這是一個實驗接口,並在未來可能改變。

這些IOCTL控制音頻/視頻(通常的MPEG -)編碼器。 VIDIOC_ENCODER_CMD向編碼器發送一個命令,VIDIOC_TRY_ENCODER_CMD可以用來嘗試一個命令而不用實際執行這個命令。
要發送一個命令程序必須初始化一個struct v4l2_encoder_cmd的所有字段和用該結構的指針調用VIDIOC_ENCODER_CMD或VIDIOC_TRY_ENCODER_CMD。
在cmd字段必須包含命令代碼。這些標誌字段一般只用於停機命令,並包含一個字節:如果V4L2_ENC_CMD_STOP_AT_GOP_END標誌設定,編碼將持續到當前組的圖片結束,否則會立即停止。

如果編碼器尚未開始,一個read()調用將向它發送一個開始命令。執行STOP命令後,read()調用將讀取由驅動程序緩沖的剩余數據。當緩沖區是空的,read()將返回零,下一個read()調用將重新啟動編碼器。
一個close()調用將停止命令發送到編碼器,所有緩沖的數據將被清除。

這些IOCTL是可選的,不是所有的驅動程序都支持它們。他們將在Linux 2.6.21介紹。

Table 1. struct v4l2_encoder_cmd

__u32 cmd 編碼器命令,見表2。
__u32 flags 標誌命令,見表3。如果沒有這個標誌定義命令,驅動程序和應用程序必須設置此字段為零。
__u32 data[8] 為未來的擴展保留。驅動程序和應用程序必須設置數組為零。

Table 2. Encoder Commands

V4L2_ENC_CMD_START 0 開始運行編碼器。當編碼器已在運行或暫停,這個命令不執行任何操作。這個命令不定義任何標誌。V4L2_ENC_CMD_STOP 1 停止編碼器。當V4L2_ENC_CMD_STOP_AT_GOP_END標誌設定,編碼將持續到當前組的圖片結束,否則,編碼將立即停止。當編碼器已經停止,該命令不執行任何操作。
V4L2_ENC_CMD_PAUSE 2 暫停編碼器。當編碼器還沒有開始,驅動程序將返回一個返回EPERM錯誤代碼。當編碼器已經暫停,這個命令不執行任何操作。這個命令不定義任何標誌。

V4L2_ENC_CMD_RESUME 3 暫停後恢復編碼命令。當編碼器還沒有開始,驅動程序將返回一個返回EPERM錯誤代碼。當編碼器已在運行,這個命令不執行任何操作。這個命令不定義任何標誌。

Table 3. Encoder Command Flags

V4L2_ENC_CMD_STOP_AT_GOP_END 0x0001 停止編碼當前圖像組而不是立刻結束。

返回值
成功返回0,錯誤返回-1,errno變量設置正確:

EINVAL
該驅動程序不支持該IOCTL,或在cmd字段是無效的。

EPERM
當編碼器沒有運行時,應用程序發送一個暫停或恢復命令。

ioctl VIDIOC_ENUMAUDIO

名稱
VIDIOC_ENUMAUDIO - 枚舉音頻輸入
簡介
int ioctl(int fd, int request, struct v4l2_audio *argp);
參數
fd
打開()返回的文件描述符。
請求
VIDIOC_ENUMAUDIO
argp

說明
要查詢音頻輸入應用程序的屬性要初始化了一個結構v4l2_audio保留數組的索引字段和零,並呼籲以這種結構指針VIDIOC_ENUMAUDIO的ioctl。司機填寫的結構休息或返回EINVAL錯誤代碼時,索引超出範圍。枚舉所有的音頻輸入申請須在索引零開始,由司機返回EINVAL,直到一個遞增。

參見描述的結構v4l2_audio的ioctl VIDIOC_G_AUDIO,VIDIOC_S_AUDIO(2)。

返回值
成功返回0,錯誤-1,errno變量設置正確:


EINVAL
將音頻輸入的號碼是出界,或者有完全沒有音頻輸入,該IOCTL不支持音頻輸入。

ioctl VIDIOC_ENUMAUDOUT

名稱
VIDIOC_ENUMAUDOUT - 枚舉音頻輸出
簡介

int ioctl(int fd, int request, struct v4l2_audioout *argp);


參數

fd
打開()返回的文件描述符。

要求
VIDIOC_ENUMAUDOUT

argp

說明
要查詢的音頻輸出應用的屬性初始化了索引字段和歸零一個v4l2_audioout結構的保留數組,並用指針調用這種結構VIDIOC_G_AUDOUT ioctl。當索引超出範圍時,驅動程序將停止該結構或返回EINVAL錯誤代碼。枚舉所有的音頻輸出,申請須在索引由零開始,然後遞增直到驅動程序返回EINVAL。

註意 電視卡上的連接器回送收到的音頻信號,在這個意義上聲卡沒有音頻輸出。

參見描述的結構v4l2_audioout的ioctl VIDIOC_G_AUDOUT,VIDIOC_S_AUDOUT(2)。

返回值
成功返回0,錯誤-1,errno變量設置正確:


EINVAL
音頻輸出數超出範圍,或者完全沒有音頻輸出和該IOCTL不支持音頻輸出。

v4l2功能列表大全【轉】