7.48. ioctl VIDIOC_QUERYCAP

7.48.1. 名稱

VIDIOC_QUERYCAP - 查詢裝置功能

7.48.2. 概要

VIDIOC_QUERYCAP

int ioctl(int fd, VIDIOC_QUERYCAP, struct v4l2_capability *argp)

7.48.3. 引數

fd

open() 返回的檔案描述符。

argp

指向 struct v4l2_capability 的指標。

7.48.4. 描述

所有 V4L2 裝置都支援 VIDIOC_QUERYCAP ioctl。它用於識別與此規範相容的核心裝置,並獲取有關驅動程式和硬體功能的資訊。ioctl 接收一個指向 struct v4l2_capability 的指標,該結構由驅動程式填充。當驅動程式與此規範不相容時,ioctl 返回 EINVAL 錯誤程式碼。

type v4l2_capability
struct v4l2_capability

__u8

driver[16]

驅動程式的名稱,一個唯一的 NUL 終止的 ASCII 字串。例如:“bttv”。驅動程式特定的應用程式可以使用此資訊來驗證驅動程式身份。它也有助於解決已知錯誤或在錯誤報告中識別驅動程式。

在固定大小的陣列中儲存字串是不好的做法,但在這裡是不可避免的。驅動程式和應用程式應採取預防措施,永遠不要讀取或寫入超出陣列末尾的內容,並確保字串已正確 NUL 終止。

__u8

card[32]

裝置的名稱,一個 NUL 終止的 UTF-8 字串。例如:“Yoyodyne TV/FM”。一個驅動程式可能支援不同品牌或型號的影片硬體。此資訊供使用者使用,例如在可用裝置的選單中。由於可以安裝由同一驅動程式支援的同一品牌的多個電視卡,因此應將此名稱與字元裝置檔名(例如 /dev/video2)或 bus_info 字串結合使用,以避免歧義。

__u8

bus_info[32]

裝置在系統中的位置,一個 NUL 終止的 ASCII 字串。例如:“PCI:0000:05:06.0”。此資訊供使用者使用,以區分多個相同裝置。如果沒有此類資訊可用,則該欄位必須簡單地計算驅動程式控制的裝置數量(“platform:vivid-000”)。bus_info 必須以 “PCI:” 開頭表示 PCI 板,“PCIe:” 表示 PCI Express 板,“usb-” 表示 USB 裝置,“I2C:” 表示 i2c 裝置,“ISA:” 表示 ISA 裝置,“parport” 表示並行埠裝置,“platform:” 表示平臺裝置。

__u32

version

驅動程式的版本號。

從核心 3.1 開始,報告的版本由 V4L2 子系統按照核心編號方案提供。但是,如果穩定版或發行版修改的核心使用了來自較新核心的 V4L2 堆疊,則它可能並不總是返回與核心相同的版本。

版本號使用 KERNEL_VERSION() 宏格式化。例如,如果媒體堆疊對應於隨核心 4.14 提供的 V4L2 版本,則它將等效於

#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))

__u32 version = KERNEL_VERSION(4, 14, 0);

printf ("Version: %u.%u.%u\\n",

(version >> 16) & 0xFF, (version >> 8) & 0xFF, version & 0xFF);

__u32

capabilities

物理裝置的整體可用功能,請參閱 裝置功能標誌。同一物理裝置可以在 /dev 中匯出多個裝置(例如 /dev/videoX、/dev/vbiY 和 /dev/radioZ)。capabilities 欄位應包含圍繞匯出到使用者空間的多個 V4L2 裝置的所有可用功能的並集。對於所有這些裝置,capabilities 欄位返回相同的功能集。這允許應用程式僅開啟其中一個裝置(通常是影片裝置)並發現是否也支援影片、vbi 和/或無線電。

__u32

device_caps

已開啟裝置的裝置功能,請參閱 裝置功能標誌。應包含該特定裝置節點的可用功能。因此,例如,無線電裝置的 device_caps 將僅包含與無線電相關的功能,而不包含影片或 vbi 功能。僅當 capabilities 欄位包含 V4L2_CAP_DEVICE_CAPS 功能時,才會設定此欄位。只有 capabilities 欄位可以具有 V4L2_CAP_DEVICE_CAPS 功能,device_caps 永遠不會設定 V4L2_CAP_DEVICE_CAPS

__u32

reserved[3]

保留供將來擴充套件使用。驅動程式必須將此陣列設定為零。

裝置功能標誌

V4L2_CAP_VIDEO_CAPTURE

0x00000001

該裝置透過 影片捕獲 介面支援單平面 API。

V4L2_CAP_VIDEO_CAPTURE_MPLANE

0x00001000

該裝置透過 影片捕獲 介面支援 多平面 API

V4L2_CAP_VIDEO_OUTPUT

0x00000002

該裝置透過 影片輸出 介面支援單平面 API。

V4L2_CAP_VIDEO_OUTPUT_MPLANE

0x00002000

該裝置透過 影片輸出 介面支援 多平面 API

V4L2_CAP_VIDEO_M2M

0x00008000

該裝置透過影片記憶體到記憶體介面支援單平面 API。

V4L2_CAP_VIDEO_M2M_MPLANE

0x00004000

該裝置透過影片記憶體到記憶體介面支援 多平面 API

V4L2_CAP_VIDEO_OVERLAY

0x00000004

該裝置支援 影片覆蓋 介面。影片覆蓋裝置通常將捕獲的影像直接儲存在圖形卡的影片記憶體中,並進行硬體剪裁和縮放。

V4L2_CAP_VBI_CAPTURE

0x00000010

該裝置支援 原始 VBI 捕獲 介面,提供圖文電視和隱藏字幕資料。

V4L2_CAP_VBI_OUTPUT

0x00000020

該裝置支援 原始 VBI 輸出 介面。

V4L2_CAP_SLICED_VBI_CAPTURE

0x00000040

該裝置支援 切片 VBI 捕獲 介面。

V4L2_CAP_SLICED_VBI_OUTPUT

0x00000080

該裝置支援 切片 VBI 輸出 介面。

V4L2_CAP_RDS_CAPTURE

0x00000100

該裝置支援 RDS 捕獲介面。

V4L2_CAP_VIDEO_OUTPUT_OVERLAY

0x00000200

該裝置支援 影片輸出覆蓋 (OSD) 介面。與 *影片覆蓋* 介面不同,這是影片輸出裝置的輔助功能,並將影像覆蓋到傳出的影片訊號上。當驅動程式設定此標誌時,它必須清除 V4L2_CAP_VIDEO_OVERLAY 標誌,反之亦然。[1]

V4L2_CAP_HW_FREQ_SEEK

0x00000400

該裝置支援 ioctl VIDIOC_S_HW_FREQ_SEEK ioctl 用於硬體頻率搜尋。

V4L2_CAP_RDS_OUTPUT

0x00000800

該裝置支援 RDS 輸出介面。

V4L2_CAP_TUNER

0x00010000

該裝置具有某種調諧器來接收 RF 調製影片訊號。有關調諧器程式設計的更多資訊,請參見 調諧器和調製器

V4L2_CAP_AUDIO

0x00020000

該裝置具有音訊輸入或輸出。它可以或可能不支援以 PCM 或壓縮格式進行音訊錄製或播放。PCM 音訊支援必須作為 ALSA 或 OSS 介面實現。有關音訊輸入和輸出的更多資訊,請參見 音訊輸入和輸出

V4L2_CAP_RADIO

0x00040000

這是一個無線電接收器。

V4L2_CAP_MODULATOR

0x00080000

該裝置具有某種調製器來發射 RF 調製影片/音訊訊號。有關調製器程式設計的更多資訊,請參見 調諧器和調製器

V4L2_CAP_SDR_CAPTURE

0x00100000

該裝置支援 SDR 捕獲 介面。

V4L2_CAP_EXT_PIX_FORMAT

0x00200000

該裝置支援 struct v4l2_pix_format 擴充套件欄位。

V4L2_CAP_SDR_OUTPUT

0x00400000

該裝置支援 SDR 輸出 介面。

V4L2_CAP_META_CAPTURE

0x00800000

該裝置支援 元資料介面 捕獲介面。

V4L2_CAP_READWRITE

0x01000000

該裝置支援 read() 和/或 write() I/O 方法。

V4L2_CAP_EDID

0x02000000

該裝置儲存影片輸入的 EDID,或檢索影片輸出的 EDID。它是一個獨立的 EDID 裝置,因此不會進行影片流傳輸等。

對於影片輸入,這通常是一個 eeprom,它支援 VESA 增強型顯示資料通道標準。它也可以是其他東西,例如微控制器。

對於影片輸出,這通常是從外部裝置讀取的,例如透過序列埠訪問的 HDMI 分配器。

V4L2_CAP_STREAMING

0x04000000

該裝置支援 流式傳輸 I/O 方法。

V4L2_CAP_META_OUTPUT

0x08000000

該裝置支援 元資料介面 輸出介面。

V4L2_CAP_TOUCH

0x10000000

這是一個觸控裝置。

V4L2_CAP_IO_MC

0x20000000

從使用者空間只能看到一個輸入和/或輸出。包括哪個 I/O 實體路由到輸入/輸出在內的整個影片拓撲配置由使用者空間透過媒體控制器配置。請參見 第四部分 - 媒體控制器 API

V4L2_CAP_DEVICE_CAPS

0x80000000

驅動程式填充 device_caps 欄位。此功能只能出現在 capabilities 欄位中,而不能出現在 device_caps 欄位中。

7.48.5. 返回值

成功時返回 0,錯誤時返回 -1,並適當設定 errno 變數。通用錯誤程式碼在 通用錯誤程式碼 章節中進行了描述。