4.3. 视频输出接口¶
视频输出设备将静态图像或图像序列编码为模拟视频信号。通过此接口,应用程序可以控制编码过程并将图像从用户空间传输到驱动程序。
通常,V4L2 视频输出设备通过字符设备特殊文件访问,这些文件名为 /dev/video
以及从 /dev/video0
到 /dev/video63
的文件,主设备号为 81,次设备号为 0 到 63。/dev/video
通常是指向首选视频设备的符号链接。
注意
相同的设备文件名也用于视频捕获设备。
4.3.1. 查询功能¶
支持视频输出接口的设备会在 ioctl VIDIOC_QUERYCAP ioctl 返回的 struct v4l2_capability
的 capabilities
字段中设置 V4L2_CAP_VIDEO_OUTPUT
或 V4L2_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_format
的 type
字段设置为 V4L2_BUF_TYPE_VIDEO_OUTPUT
或 V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE
,并调用 VIDIOC_G_FMT ioctl,传入指向此结构的指针。驱动程序会填充 fmt
联合体中的 struct v4l2_pix_format
pix
或 struct v4l2_pix_format_mplane
pix_mp
成员。
要请求不同的参数,应用程序将 struct v4l2_format
的 type
字段如上所述设置,并初始化 fmt
联合体中 struct v4l2_pix_format
的 pix
成员的所有字段,或者更好地是直接修改 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_FMT、VIDIOC_S_FMT 和 VIDIOC_TRY_FMT ioctl 的规范。视频输出设备必须实现 VIDIOC_G_FMT 和 VIDIOC_S_FMT ioctl,即使 VIDIOC_S_FMT 忽略所有请求并始终返回默认参数,就像 VIDIOC_G_FMT 所做的那样。VIDIOC_TRY_FMT 是可选的。
4.3.4. 写入图像¶
视频输出设备可能支持 write() 函数 和/或流式 (内存映射 或 用户指针) I/O。详情请参见 输入/输出。