4.3. 视频输出接口

视频输出设备将静态图像或图像序列编码为模拟视频信号。通过此接口,应用程序可以控制编码过程并将图像从用户空间传输到驱动程序。

通常,V4L2 视频输出设备通过字符设备特殊文件访问,这些文件名为 /dev/video 以及从 /dev/video0/dev/video63 的文件,主设备号为 81,次设备号为 0 到 63。/dev/video 通常是指向首选视频设备的符号链接。

注意

相同的设备文件名也用于视频捕获设备。

4.3.1. 查询功能

支持视频输出接口的设备会在 ioctl VIDIOC_QUERYCAP ioctl 返回的 struct v4l2_capabilitycapabilities 字段中设置 V4L2_CAP_VIDEO_OUTPUTV4L2_CAP_VIDEO_OUTPUT_MPLANE 标志。作为次要设备功能,它们也可能支持 原始 VBI 输出 (V4L2_CAP_VBI_OUTPUT) 接口。必须至少支持读/写或流式 I/O 方法中的一种。调制器和音频输出是可选的。

4.3.2. 辅助功能

视频输出设备应根据需要支持 音频输出调制器控制裁剪和缩放 以及 流参数 ioctl。所有视频输出设备都必须支持 视频输出 ioctl。

4.3.3. 图像格式协商

输出由裁剪和图像格式参数决定。前者选择视频图像中图像将出现的区域,后者决定图像在内存中的存储方式,即 RGB 或 YUV 格式、每像素位数或宽度和高度。它们共同还定义了图像在此过程中的缩放方式。

通常,这些参数在 open()不会重置,以允许 Unix 工具链像操作普通文件一样对设备进行编程和写入。编写良好的 V4L2 应用程序会确保它们真正获得所需结果,包括裁剪和缩放。

裁剪初始化至少需要将参数重置为默认值。示例请参见图像裁剪、插入和缩放——CROP API

要查询当前图像格式,应用程序将 struct v4l2_formattype 字段设置为 V4L2_BUF_TYPE_VIDEO_OUTPUTV4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE,并调用 VIDIOC_G_FMT ioctl,传入指向此结构的指针。驱动程序会填充 fmt 联合体中的 struct v4l2_pix_format pix 或 struct v4l2_pix_format_mplane pix_mp 成员。

要请求不同的参数,应用程序将 struct v4l2_formattype 字段如上所述设置,并初始化 fmt 联合体中 struct v4l2_pix_formatpix 成员的所有字段,或者更好地是直接修改 VIDIOC_G_FMT 的结果,然后调用 VIDIOC_S_FMT ioctl,传入指向此结构的指针。驱动程序可能会调整参数,并最终像 VIDIOC_G_FMT 那样返回实际参数。

VIDIOC_S_FMT 类似,可以使用 VIDIOC_TRY_FMT ioctl 来了解硬件限制,而无需禁用 I/O 或可能耗时的硬件准备。

struct v4l2_pix_format 和 struct v4l2_pix_format_mplane 的内容在 图像格式 中讨论。详情另请参阅 VIDIOC_G_FMTVIDIOC_S_FMTVIDIOC_TRY_FMT ioctl 的规范。视频输出设备必须实现 VIDIOC_G_FMTVIDIOC_S_FMT ioctl,即使 VIDIOC_S_FMT 忽略所有请求并始终返回默认参数,就像 VIDIOC_G_FMT 所做的那样。VIDIOC_TRY_FMT 是可选的。

4.3.4. 写入图像

视频输出设备可能支持 write() 函数 和/或流式 (内存映射用户指针) I/O。详情请参见 输入/输出