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 变量。通用错误代码在 通用错误代码 章节中进行了描述。