7.25. ioctl VIDIOC_G_CTRL, VIDIOC_S_CTRL

7.25.1. 名称

VIDIOC_G_CTRL - VIDIOC_S_CTRL - 获取或设置控件的值

7.25.2. 概要

VIDIOC_G_CTRL

int ioctl(int fd, VIDIOC_G_CTRL, struct v4l2_control *argp)

VIDIOC_S_CTRL

int ioctl(int fd, VIDIOC_S_CTRL, struct v4l2_control *argp)

7.25.3. 参数

fd

open() 返回的文件描述符。

argp

指向结构体 v4l2_control 的指针。

7.25.4. 描述

要获取控件的当前值,应用程序需要初始化结构体 v4l2_controlid 字段,并使用指向此结构的指针调用 VIDIOC_G_CTRL ioctl。要更改控件的值,应用程序需要初始化结构体 v4l2_controlidvalue 字段,并调用 VIDIOC_S_CTRL ioctl。

id 无效时,驱动程序会返回 EINVAL 错误代码。当 value 超出范围时,驱动程序可以选择采用最接近的有效值或返回 ERANGE 错误代码,以更合适的方式处理。但是,VIDIOC_S_CTRL 是一个只写的 ioctl,它不会返回实际的新值。如果 value 不适合该控件(例如,如果它引用菜单控件中不受支持的菜单索引),则也会返回 EINVAL 错误代码。

这些 ioctl 仅适用于用户控件。对于其他控件类,必须使用 VIDIOC_G_EXT_CTRLSVIDIOC_S_EXT_CTRLSVIDIOC_TRY_EXT_CTRLS

类型 v4l2_control
结构体 v4l2_control

__u32

id

标识控件,由应用程序设置。

__s32

value

新值或当前值。

7.25.5. 返回值

成功时返回 0,错误时返回 -1,并适当设置 errno 变量。通用错误代码在 通用错误代码 章节中描述。

EINVAL

结构体 v4l2_controlid 无效,或者 value 不适合给定的控件(即,如果选择了驱动程序根据 VIDIOC_QUERYMENU 不支持的菜单项)。

ERANGE

结构体 v4l2_controlvalue 超出范围。

EBUSY

控件暂时无法更改,可能是因为另一个应用程序接管了此控件所属的设备功能。

EACCES

尝试设置只读控件或获取只写控件。

或者如果尝试设置一个非活动控件,并且驱动程序无法缓存新值直到控件再次激活。