4.3. 视频输出接口

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

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

注意

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

4.3.1. 查询功能

支持视频输出接口的设备在 v4l2_capability 结构体的 capabilities 字段中设置 V4L2_CAP_VIDEO_OUTPUTV4L2_CAP_VIDEO_OUTPUT_MPLANE 标志,该结构体由 ioctl VIDIOC_QUERYCAP ioctl 返回。作为辅助设备功能,它们也可能支持 原始 VBI 输出 (V4L2_CAP_VBI_OUTPUT) 接口。至少必须支持一种读取/写入或流式 I/O 方法。调制器和音频输出是可选的。

4.3.2. 补充功能

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

4.3.3. 图像格式协商

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

像往常一样,这些参数在 open()会被重置,以允许 Unix 工具链,在编程设备后像对待普通文件一样写入它。编写良好的 V4L2 应用程序会确保它们确实获得了它们想要的东西,包括裁剪和缩放。

裁剪初始化至少需要将参数重置为默认值。示例在 图像裁剪、插入和缩放 -- CROP API 中给出。

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

要请求不同的参数,应用程序将 v4l2_format 结构体的 type 字段设置为如上所述,并初始化 fmt 联合的 v4l2_pix_format vbi 结构体的所有字段,或者最好只是修改 VIDIOC_G_FMT 的结果,并使用指向该结构的指针调用 VIDIOC_S_FMT ioctl。驱动程序可以调整参数,并最终返回实际参数,就像 VIDIOC_G_FMT 所做的那样。

VIDIOC_S_FMT 一样,VIDIOC_TRY_FMT ioctl 可用于了解硬件限制,而无需禁用 I/O 或可能耗时的硬件准备。

v4l2_pix_format 结构体和 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。有关详细信息,请参见 输入/输出