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

指向 struct v4l2_streamparm 的指针。

7.37.4. 描述

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

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

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

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

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

type v4l2_streamparm
struct v4l2_streamparm

__u32

type

缓冲区(流)类型,与 struct 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]

未来扩展的占位符。

}

type 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]

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

type 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 变量。通用错误代码在 通用错误代码 章节中描述。