7.49. ioctls VIDIOC_QUERYCTRL, VIDIOC_QUERY_EXT_CTRL 和 VIDIOC_QUERYMENU¶
7.49.1. 名称¶
VIDIOC_QUERYCTRL - VIDIOC_QUERY_EXT_CTRL - VIDIOC_QUERYMENU - 枚举控件和菜单控件项
7.49.2. 概要¶
int ioctl(int fd, int VIDIOC_QUERYCTRL, struct v4l2_queryctrl *argp)
-
VIDIOC_QUERY_EXT_CTRL¶
int ioctl(int fd, VIDIOC_QUERY_EXT_CTRL, struct v4l2_query_ext_ctrl *argp)
-
VIDIOC_QUERYMENU¶
int ioctl(int fd, VIDIOC_QUERYMENU, struct v4l2_querymenu *argp)
7.49.3. 参数¶
fd
open()
返回的文件描述符。argp
指向 struct
v4l2_queryctrl
,v4l2_query_ext_ctrl
或v4l2_querymenu
的指针(取决于 ioctl)。
7.49.4. 描述¶
要查询控件的属性,应用程序应设置 struct v4l2_queryctrl 的 id
字段,并调用 VIDIOC_QUERYCTRL
ioctl,并将指向此结构的指针作为参数传递。驱动程序会填充该结构的其他字段,或者当 id
无效时返回 EINVAL
错误代码。
可以通过使用从 V4L2_CID_BASE
开始到不包括 V4L2_CID_LASTP1
的连续 id
值调用 VIDIOC_QUERYCTRL
来枚举控件。如果不支持此范围内的某个控件,驱动程序可能会返回 EINVAL
。此外,应用程序可以通过从 V4L2_CID_PRIVATE_BASE
开始并递增 id
直到驱动程序返回 EINVAL
来枚举此规范中未定义的私有控件。
在这两种情况下,当驱动程序在 flags
字段中设置 V4L2_CTRL_FLAG_DISABLED
标志时,此控件将永久禁用,应用程序应忽略它。[1]
当应用程序将 id
与 V4L2_CTRL_FLAG_NEXT_CTRL
进行或运算时,驱动程序将返回下一个受支持的非复合控件,如果没有则返回 EINVAL
。此外,可以指定 V4L2_CTRL_FLAG_NEXT_COMPOUND
标志来枚举所有复合控件(即类型 ≥ V4L2_CTRL_COMPOUND_TYPES
和/或数组控件,换句话说,包含多个值的控件)。指定 V4L2_CTRL_FLAG_NEXT_CTRL
和 V4L2_CTRL_FLAG_NEXT_COMPOUND
以便枚举所有控件,无论是否复合。尚不支持这些标志的驱动程序始终返回 EINVAL
。
引入 VIDIOC_QUERY_EXT_CTRL
ioctl 是为了更好地支持可以使用复合类型的控件,并公开无法在 struct v4l2_queryctrl 中返回的其他控件信息,因为该结构已满。
VIDIOC_QUERY_EXT_CTRL
的使用方式与 VIDIOC_QUERYCTRL
相同,只是 reserved
数组也必须清零。
菜单控件需要额外的信息:菜单项的名称。要查询它们,应用程序应设置 struct v4l2_querymenu 的 id
和 index
字段,并调用 VIDIOC_QUERYMENU
ioctl,并将指向此结构的指针作为参数传递。驱动程序会填充该结构的其他字段,或者当 id
或 index
无效时返回 EINVAL
错误代码。通过使用 struct v4l2_queryctrl minimum
到 maximum
(包括)的连续 index
值调用 VIDIOC_QUERYMENU
来枚举菜单项。
注意
在 minimum
和 maximum
之间的一些索引处,VIDIOC_QUERYMENU
可能会返回 EINVAL
错误代码。在这种情况下,此驱动程序不支持该特定菜单项。另请注意,minimum
值不一定是 0。
另请参阅 用户控件 中的示例。
__u32 |
|
标识控件,由应用程序设置。有关预定义的 ID,请参见控件 ID。当 ID 与 V4L2_CTRL_FLAG_NEXT_CTRL 进行或运算时,驱动程序会清除该标志并返回 ID 更高的第一个控件。尚不支持此标志的驱动程序始终返回 |
__u32 |
|
控件的类型,请参见 |
__u8 |
|
控件的名称,以 NUL 结尾的 ASCII 字符串。此信息供用户使用。 |
__s32 |
|
最小值,包括在内。此字段为控件提供了下限。请参阅枚举 |
__s32 |
|
最大值,包括在内。此字段为控件提供了上限。请参阅枚举 |
__s32 |
|
此字段为控件提供了步长。请参阅枚举 通常,驱动程序不应缩放硬件控件值。例如,当 此字段给出了实际影响硬件的整数控件的最小更改。当用户可以通过键盘或 GUI 按钮而不是滑块来更改控件时,通常需要此信息。例如,当硬件寄存器接受值 0-511,而驱动程序报告 0-65535 时,步长应为 128。 请注意,尽管有符号,但步长值应始终为正。 |
__s32 |
|
注意 驱动程序仅在首次加载驱动程序时将其控件重置为默认值,之后不会重置。 |
__u32 |
|
控制标志,请参阅控制标志。 |
__u32 |
|
为未来扩展保留。驱动程序必须将数组设置为零。 |
__u32 |
|
标识由应用程序设置的控件。有关预定义的 ID,请参阅控制 ID。当 ID 与 |
__u32 |
|
控件的类型,请参见 |
char |
|
控件的名称,以 NUL 结尾的 ASCII 字符串。此信息供用户使用。 |
__s64 |
|
最小值,包含。此字段给出控件的下限。请参阅枚举 |
__s64 |
|
最大值,包含。此字段给出控件的上限。请参阅枚举 |
__u64 |
|
此字段给出控件的步长。请参阅枚举 通常,驱动程序不应缩放硬件控件值。例如,当 此字段给出了实际影响硬件的整数控件的最小更改。当用户可以通过键盘或 GUI 按钮而不是滑块来更改控件时,通常需要此信息。例如,当硬件寄存器接受值 0-511,而驱动程序报告 0-65535 时,步长应为 128。 |
__s64 |
|
注意 驱动程序仅在首次加载驱动程序时将其控件重置为默认值,之后不会重置。 |
__u32 |
|
控制标志,请参阅控制标志。 |
__u32 |
|
数组中单个元素的大小(以字节为单位)。给定指向三维数组的字符指针 |
__u32 |
|
N 维数组中的元素数量。如果此控件不是数组,则 |
__u32 |
|
N 维数组中的维度数。如果此控件不是数组,则此字段为 0。 |
__u32 |
|
每个维度的大小。此数组的前 |
__u32 |
|
为未来扩展保留。应用程序和驱动程序必须将数组设置为零。 |
__u32 |
|
标识控件,由应用程序从相应的 struct v4l2_queryctrl |
__u32 |
|
菜单项的索引,从零开始,由应用程序设置。 |
union { |
(匿名) |
|
__u8 |
|
菜单项的名称,以 NUL 结尾的 ASCII 字符串。此信息供用户使用。此字段对于 |
__s64 |
|
整数菜单项的值。此字段对于 |
} |
||
__u32 |
|
为未来扩展保留。驱动程序必须将数组设置为零。 |
-
type v4l2_ctrl_type¶
类型 |
|
|
|
描述 |
---|---|---|---|---|
|
任意 |
任意 |
任意 |
一个整数值控件,范围从最小值到最大值(含)。步长值表示值之间的增量。 |
|
0 |
1 |
1 |
一个布尔值控件。零对应于“禁用”,一表示“启用”。 |
|
≥ 0 |
1 |
N-1 |
该控件有 N 个选项的菜单。可以使用 |
|
≥ 0 |
1 |
N-1 |
该控件有 N 个选项的菜单。可以使用 |
|
0 |
n/a |
任意 |
一个位掩码字段。最大值是可以使用的位集合,所有其他位都必须为 0。最大值被解释为 __u32,允许在位掩码中使用位 31。 |
|
0 |
0 |
0 |
一个在设置时执行操作的控件。驱动程序必须忽略 |
|
任意 |
任意 |
任意 |
一个 64 位整数值控件。无法使用 |
|
≥ 0 |
≥ 1 |
≥ 0 |
最小和最大字符串长度。步长表示字符串的长度必须为(最小 + N * 步长)个字符,其中 N ≥ 0。这些长度不包括终止零,因此为了将长度为 8 的字符串传递给 VIDIOC_S_EXT_CTRLS,您需要将 struct |
|
n/a |
n/a |
n/a |
这不是一个控件。当使用等于控制类代码(请参阅控制类)+ 1 的控制 ID 调用 |
|
任意 |
任意 |
任意 |
一个无符号的 8 位值控件,范围从最小值到最大值(含)。步长值表示值之间的增量。 |
|
任意 |
任意 |
任意 |
一个无符号的 16 位值控件,范围从最小值到最大值(含)。步长值表示值之间的增量。 |
|
任意 |
任意 |
任意 |
一个无符号的 32 位值控件,范围从最小值到最大值(含)。步长值表示值之间的增量。 |
|
n/a |
n/a |
n/a |
一个 struct |
|
n/a |
n/a |
n/a |
一个 struct |
|
n/a |
n/a |
n/a |
一个 struct |
|
n/a |
n/a |
n/a |
一个 struct |
|
n/a |
n/a |
n/a |
一个 struct |
|
n/a |
n/a |
n/a |
一个 struct |
|
n/a |
n/a |
n/a |
一个 struct |
|
n/a |
n/a |
n/a |
一个 struct |
|
n/a |
n/a |
n/a |
一个 struct |
|
n/a |
n/a |
n/a |
一个 struct |
|
n/a |
n/a |
n/a |
一个 struct |
|
n/a |
n/a |
n/a |
一个 struct |
|
n/a |
n/a |
n/a |
一个结构体 |
|
n/a |
n/a |
n/a |
一个结构体 |
|
n/a |
n/a |
n/a |
一个结构体 |
|
n/a |
n/a |
n/a |
一个结构体 |
|
n/a |
n/a |
n/a |
一个结构体 |
|
n/a |
n/a |
n/a |
一个结构体 |
|
n/a |
n/a |
n/a |
一个结构体 |
|
n/a |
n/a |
n/a |
一个结构体 |
|
n/a |
n/a |
n/a |
一个结构体 |
|
n/a |
n/a |
n/a |
一个结构体 |
|
0x0001 |
此控件被永久禁用,应用程序应忽略它。任何尝试更改控件的操作都将导致 |
|
0x0002 |
此控件暂时不可更改,例如,因为另一个应用程序接管了相应资源的控制权。此类控件可能会在用户界面中特殊显示。尝试更改控件可能会导致 |
|
0x0004 |
此控件是永久只读的。任何尝试更改控件的操作都将导致 |
|
0x0008 |
提示更改此控件可能会影响同一控制类中其他控件的值。应用程序应相应地更新其用户界面。 |
|
0x0010 |
此控件不适用于当前配置,应在用户界面中相应地显示。例如,当使用另一个控件选择 MPEG 音频编码级别 1 时,可能会在 MPEG 音频级别 2 比特率控件上设置此标志。 |
|
0x0020 |
提示此控件最好在用户界面中表示为滑块状元素。 |
|
0x0040 |
此控件是永久只写的。任何尝试读取控件的操作都将导致 |
|
0x0080 |
此控件是易失的,这意味着控件的值会持续变化。一个典型的例子是设备处于自动增益模式时的当前增益值。在这种情况下,硬件会根据光照条件计算增益值,而光照条件会随时间变化。 注意 除非还设置了 V4L2_CTRL_FLAG_EXECUTE_ON_WRITE,否则将忽略为易失控件设置的新值。为易失控件设置新值永远不会触发 V4L2_EVENT_CTRL_CH_VALUE 事件。 |
|
0x0100 |
此控件具有指针类型,因此必须使用结构体 |
|
0x0200 |
即使提供给控件的值保持不变,该值也会传播到驱动程序。当控件表示硬件上的操作时,这是必需的。例如:清除错误标志或触发闪光灯。所有类型为 |
|
0x0400 |
更改此控件的值可能会修改缓冲区(对于视频设备)或媒体总线格式(对于子设备)的布局。 一个典型的例子是 请注意,通常带有此标志的控件也会在分配缓冲区或流式传输正在进行时设置 |
|
0x0800 |
此控件是动态大小的一维数组。它的行为与常规数组相同,只是 |
7.49.5. 返回值¶
成功时返回 0,发生错误时返回 -1,并设置 errno
变量。通用错误代码在 通用错误代码 章节中描述。
- EINVAL
结构体 v4l2_queryctrl
id
无效。结构体 v4l2_querymenuid
无效,或者index
超出范围(小于minimum
或大于maximum
),或者驱动程序不支持此特定菜单项。- EACCES
尝试读取只写控件。