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 - 获取或设置子设备 pad 上的帧间隔

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

指向 struct v4l2_subdev_frame_interval 的指针。

7.61.4. 描述

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

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

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

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

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

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

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

type v4l2_subdev_frame_interval
struct v4l2_subdev_frame_interval

__u32

pad

媒体控制器 API 报告的 Pad 编号。

struct v4l2_fract

interval

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

__u32

stream

流标识符。

__u32

which

从 enum v4l2_subdev_format_whence 中获取的活动或尝试帧间隔。

__u32

reserved[7]

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

7.61.5. 返回值

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

EBUSY

由于 pad 当前正忙,无法更改帧间隔。例如,这可能是由 pad 上的活动视频流引起的。在执行另一个操作来解决问题之前,不得重试 ioctl。仅由 VIDIOC_SUBDEV_S_FRAME_INTERVAL 返回

EINVAL

struct v4l2_subdev_frame_interval pad 引用了一个不存在的 pad,which 字段具有不支持的值,或者 pad 不支持帧间隔。

EPERM

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