7.61. ioctl VIDIOC_SUBDEV_G_FRAME_INTERVAL, VIDIOC_SUBDEV_S_FRAME_INTERVAL

7.61.1. 名称

VIDIOC_SUBDEV_G_FRAME_INTERVAL - VIDIOC_SUBDEV_S_FRAME_INTERVAL - 获取或设置子设备焊盘上的帧间隔

7.61.2. 概要

VIDIOC_SUBDEV_G_FRAME_INTERVAL

int ioctl(int fd, VIDIOC_SUBDEV_G_FRAME_INTERVAL, struct v4l2_subdev_frame_interval *argp)

VIDIOC_SUBDEV_S_FRAME_INTERVAL

int ioctl(int fd, VIDIOC_SUBDEV_S_FRAME_INTERVAL, struct v4l2_subdev_frame_interval *argp)

7.61.3. 参数

fd

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

argp

指向结构体 v4l2_subdev_frame_interval 的指针。

7.61.4. 描述

这些 ioctl 用于获取和设置图像管道中特定子设备焊盘上的帧间隔。帧间隔仅对可以自行控制帧周期的子设备有意义。这包括例如图像传感器和电视调谐器。不支持帧间隔的子设备不得实现这些 ioctl。

要检索当前帧间隔,应用程序将结构体 v4l2_subdev_frame_intervalpad 字段设置为媒体控制器 API 报告的所需焊盘号。当它们使用指向此结构的指针调用 VIDIOC_SUBDEV_G_FRAME_INTERVAL ioctl 时,驱动程序会填充 interval 字段的成员。

要更改当前帧间隔,应用程序需要设置 pad 字段和 interval 字段的所有成员。当它们使用指向此结构的指针调用 VIDIOC_SUBDEV_S_FRAME_INTERVAL ioctl 时,驱动程序会验证请求的间隔,根据硬件功能对其进行调整,并配置设备。返回时,结构体 v4l2_subdev_frame_interval 包含当前帧间隔,就像 VIDIOC_SUBDEV_G_FRAME_INTERVAL 调用返回的那样。

如果子设备节点以只读模式注册,则只有在 which 字段设置为 V4L2_SUBDEV_FORMAT_TRY 时,对 VIDIOC_SUBDEV_S_FRAME_INTERVAL 的调用才有效,否则将返回错误,并将 errno 变量设置为 -EPERM

驱动程序不得仅因为请求的间隔与设备功能不匹配而返回错误。它们必须改为修改间隔以匹配硬件可以提供的间隔。修改后的间隔应尽可能接近原始请求。

更改帧间隔绝不应更改格式。另一方面,更改格式可能会更改帧间隔。

支持帧间隔 ioctl 的子设备应仅在单个焊盘上实现它们。当在同一子设备的多个焊盘上支持它们时,它们的行为未定义。

类型 v4l2_subdev_frame_interval
结构体 v4l2_subdev_frame_interval

__u32

pad

媒体控制器 API 报告的焊盘号。

结构体 v4l2_fract

interval

连续视频帧之间的周期(以秒为单位)。

__u32

stream

流标识符。

__u32

which

来自枚举 v4l2_subdev_format_whence 的活动或尝试帧间隔。

__u32

reserved[7]

保留供将来扩展。应用程序和驱动程序必须将数组设置为零。

7.61.5. 返回值

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

EBUSY

由于焊盘当前正忙,因此无法更改帧间隔。例如,这可能是由于焊盘上存在活动的视频流造成的。在执行其他操作以首先解决问题之前,不得重试 ioctl。仅由 VIDIOC_SUBDEV_S_FRAME_INTERVAL 返回

EINVAL

结构体 v4l2_subdev_frame_interval pad 引用了不存在的焊盘,which 字段具有不支持的值,或者焊盘不支持帧间隔。

EPERM

VIDIOC_SUBDEV_S_FRAME_INTERVAL ioctl 已在只读子设备上调用,并且 which 字段设置为 V4L2_SUBDEV_FORMAT_ACTIVE