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. 描述

要获取控件的当前值,应用程序需要初始化 struct v4l2_controlid 字段,并使用指向此结构的指针调用 VIDIOC_G_CTRL ioctl。要更改控件的值,应用程序需要初始化 struct 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

type v4l2_control
struct v4l2_control

__u32

id

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

__s32

value

新值或当前值。

7.25.5. 返回值

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

EINVAL

struct v4l2_control id 无效或 value 对于给定的控件不合适(即,如果根据 VIDIOC_QUERYMENU 选择的菜单项驱动程序不支持)。

ERANGE

struct v4l2_control value 超出范围。

EBUSY

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

EACCES

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

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