7.37. ioctl VIDIOC_G_PARM, VIDIOC_S_PARM

7.37.1. 名称

VIDIOC_G_PARM - VIDIOC_S_PARM - 获取或设置流参数

7.37.2. 概要

VIDIOC_G_PARM

int ioctl(int fd, VIDIOC_G_PARM, v4l2_streamparm *argp)

VIDIOC_S_PARM

int ioctl(int fd, VIDIOC_S_PARM, v4l2_streamparm *argp)

7.37.3. 参数

fd

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

argp

指向结构体 v4l2_streamparm 的指针。

7.37.4. 描述

应用程序可以请求不同的帧间隔。如果可能,捕获或输出设备将被重新配置以支持请求的帧间隔。可选地,驱动程序可以选择跳过或重复帧以实现请求的帧间隔。

对于有状态编码器(参见 内存到内存的有状态视频编码器接口),这表示通常嵌入在编码视频流中的帧间隔。

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

此外,这些ioctl可用于确定驱动程序在读取/写入模式下内部使用的缓冲区数量。有关影响,请参阅讨论 read() 函数的部分。

要获取和设置流参数,应用程序分别调用 VIDIOC_G_PARMVIDIOC_S_PARM ioctl。它们采用指向结构体 v4l2_streamparm 的指针,该结构体包含一个联合,其中包含输入和输出设备的单独参数。

类型 v4l2_streamparm
struct v4l2_streamparm

__u32

type

缓冲区(流)类型,与结构体 v4l2_format type 相同,由应用程序设置。请参阅 v4l2_buf_type

union {

parm

struct v4l2_captureparm

capture

捕获设备的参数,当 typeV4L2_BUF_TYPE_VIDEO_CAPTUREV4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE 时使用。

struct v4l2_outputparm

output

输出设备的参数,当 typeV4L2_BUF_TYPE_VIDEO_OUTPUTV4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE 时使用。

__u8

raw_data[200]

用于未来扩展的占位符。

}

类型 v4l2_captureparm
struct v4l2_captureparm

__u32

capability

请参阅 流参数能力

__u32

capturemode

由驱动程序和应用程序设置,请参阅 捕获参数标志

struct v4l2_fract

timeperframe

这是驱动程序捕获的连续帧之间的期望周期,以秒为单位。

这将配置视频源(例如传感器)生成视频帧的速度。如果速度是固定的,则驱动程序可以选择跳过或重复帧以实现请求的帧率。

对于有状态编码器(参见 内存到内存的有状态视频编码器接口),这表示通常嵌入在编码视频流中的帧间隔。

应用程序在此处存储期望的帧周期,驱动程序返回实际的帧周期。

更改视频标准(也隐式地通过切换视频输入)可能会将此参数重置为标称帧周期。要手动重置,应用程序只需将此字段设置为零。

仅当驱动程序在 capability 字段中设置 V4L2_CAP_TIMEPERFRAME 标志时,驱动程序才支持此功能。

__u32

extendedmode

自定义(驱动程序特定的)流参数。当不使用时,应用程序和驱动程序必须将此字段设置为零。使用此字段的应用程序应检查驱动程序名称和版本,请参阅 查询能力

__u32

readbuffers

应用程序将此字段设置为驱动程序在 read() 模式下内部使用的期望缓冲区数量。驱动程序返回实际的缓冲区数量。当应用程序请求零个缓冲区时,驱动程序应仅返回当前设置,而不是最小值或错误代码。有关详细信息,请参阅 读取/写入

__u32

reserved[4]

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

类型 v4l2_outputparm
struct v4l2_outputparm

__u32

capability

请参阅 流参数能力

__u32

outputmode

由驱动程序和应用程序设置,请参阅 捕获参数标志

struct v4l2_fract

timeperframe

这是驱动程序输出的连续帧之间的期望周期,以秒为单位。

该字段旨在在 write() 模式下在驱动程序端重复帧(在流模式下,可以使用时间戳来限制输出),从而节省 I/O 带宽。

对于有状态编码器(参见 内存到内存的有状态视频编码器接口),这表示通常嵌入在编码视频流中的帧间隔,并且它为编码器提供了一个提示,表明原始帧以多快的速度排队到编码器。

应用程序在此处存储期望的帧周期,驱动程序返回实际的帧周期。

更改视频标准(也隐式地通过切换视频输出)可能会将此参数重置为标称帧周期。要手动重置,应用程序只需将此字段设置为零。

仅当驱动程序在 capability 字段中设置 V4L2_CAP_TIMEPERFRAME 标志时,驱动程序才支持此功能。

__u32

extendedmode

自定义(驱动程序特定的)流参数。当不使用时,应用程序和驱动程序必须将此字段设置为零。使用此字段的应用程序应检查驱动程序名称和版本,请参阅 查询能力

__u32

writebuffers

应用程序将此字段设置为驱动程序在 write() 模式下内部使用的期望缓冲区数量。驱动程序返回实际的缓冲区数量。当应用程序请求零个缓冲区时,驱动程序应仅返回当前设置,而不是最小值或错误代码。有关详细信息,请参阅 读取/写入

__u32

reserved[4]

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

流参数能力

V4L2_CAP_TIMEPERFRAME

0x1000

可以通过设置 timeperframe 字段来修改帧周期。

捕获参数标志

V4L2_MODE_HIGHQUALITY

0x0001

高质量成像模式。高质量模式适用于静态成像应用程序。其目的是获得硬件可以提供的最佳图像质量。未定义驱动程序编写者如何实现该目的;这将取决于硬件和驱动程序编写者的聪明才智。高质量模式与常规的运动视频捕获模式不同。在高质量模式下

  • 驱动程序可能能够捕获比运动捕获更高的分辨率。

  • 驱动程序可能支持比运动捕获更少的像素格式(例如;真彩色)。

  • 驱动程序可以捕获并算术组合多个连续的场或帧,以消除色彩边缘伪影并减少视频数据中的噪声。

  • 驱动程序可以像扫描仪一样以切片方式捕获图像,以便处理比其他方式可能更大的格式图像。

  • 图像捕获操作可能比运动捕获慢得多。

  • 图像中移动的物体可能会有过度运动模糊。

  • 捕获可能仅通过 read() 调用工作。

7.37.5. 返回值

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