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

指向 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”)。对于 PCI 板,bus_info 必须以 “PCI:” 开头,对于 PCI Express 板,以 “PCIe:” 开头,对于 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

该设备具有某种调谐器,用于接收射频调制的视频信号。有关调谐器编程的更多信息,请参阅 调谐器和调制器

V4L2_CAP_AUDIO

0x00020000

该设备具有音频输入或输出。它可能支持也可能不支持以 PCM 或压缩格式进行音频录制或播放。 PCM 音频支持必须实现为 ALSA 或 OSS 接口。有关音频输入和输出的更多信息,请参阅 音频输入和输出

V4L2_CAP_RADIO

0x00040000

这是一个无线电接收器。

V4L2_CAP_MODULATOR

0x00080000

该设备具有某种调制器,用于发射射频调制的视频/音频信号。有关调制器编程的更多信息,请参阅 调谐器和调制器

V4L2_CAP_SDR_CAPTURE

0x00100000

该设备支持 SDR 捕获 接口。

V4L2_CAP_EXT_PIX_FORMAT

0x00200000

该设备支持结构体 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 设备,因此不会发生视频流等操作。

对于视频输入,这通常是一个支持 VESA 增强显示数据通道标准 的 eeprom。它也可以是其他东西,例如微控制器。

对于视频输出,这通常是从外部设备(例如通过串行端口访问的 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 变量。通用错误代码在 通用错误代码 章节中描述。