1.25. 数据格式

1.25.1. 数据格式协商

不同的设备与应用程序交换不同类型的数据,例如视频图像、原始或切片的 VBI 数据、RDS 数据报。即使在同一种类型中,也可能存在许多不同的格式,特别是图像格式非常丰富。尽管驱动程序必须提供默认值,并且选择会在关闭和重新打开设备时保持不变,但应用程序应始终在进行数据交换之前协商数据格式。协商意味着应用程序请求特定的格式,而驱动程序选择并报告硬件能够满足请求的最佳格式。当然,应用程序也可以只查询当前的选择。

存在一个单一的机制来协商所有数据格式,使用聚合结构 v4l2_formatVIDIOC_G_FMTVIDIOC_S_FMT ioctl。此外,VIDIOC_TRY_FMT ioctl 可用于检查硬件可能执行的操作,而无需实际选择新的数据格式。V4L2 API 支持的数据格式在 接口中相应的设备部分中介绍。要更详细地了解图像格式,请参阅 图像格式

VIDIOC_S_FMT ioctl 是初始化序列中的一个主要转折点。在此之前,多个面板应用程序可以同时访问同一设备,以选择当前输入、更改控件或修改其他属性。第一个 VIDIOC_S_FMT 将逻辑流(视频数据、VBI 数据等)独占分配给一个文件描述符。

独占意味着没有其他应用程序,更准确地说,没有其他文件描述符,可以抓取此流或更改与协商参数不一致的设备属性。例如,当新标准使用不同数量的扫描线时,视频标准更改可能会使所选的图像格式无效。因此,只有拥有该流的文件描述符才能进行使无效的更改。因此,抓取不同逻辑流的多个文件描述符会阻止彼此干扰其设置。例如,当视频叠加即将开始或已经在进行中时,同时进行视频捕获可能会被限制为相同的裁剪和图像大小。

当应用程序省略 VIDIOC_S_FMT ioctl 时,其锁定副作用由下一步暗示,即使用 ioctl VIDIOC_REQBUFS ioctl 选择 I/O 方法,或者通过第一次 read()write() 调用隐式暗示。

通常,只有一个逻辑流可以分配给一个文件描述符,例外情况是允许同时进行视频捕获和叠加的驱动程序,它们使用同一文件描述符以兼容 V4L 和早期版本的 V4L2。通过关闭并重新打开设备,可以切换逻辑流或返回到“面板模式”。驱动程序可以支持使用 VIDIOC_S_FMT 进行切换。

所有与应用程序交换数据的驱动程序都必须支持 VIDIOC_G_FMTVIDIOC_S_FMT ioctl。强烈建议但不是强制要求实现 VIDIOC_TRY_FMT

1.25.2. 图像格式枚举

除了通用的格式协商功能外,还有一个特殊的 ioctl 可用于枚举视频捕获、叠加或输出设备支持的所有图像格式。[1]

所有与应用程序交换图像数据的驱动程序都必须支持 ioctl VIDIOC_ENUM_FMT ioctl。

重要

驱动程序不应在内核空间中转换图像格式。它们必须仅枚举硬件直接支持的格式。如有必要,驱动程序编写者应发布示例转换例程或库,以便集成到应用程序中。