4.3. 视频输出接口¶
视频输出设备将静态图像或图像序列编码为模拟视频信号。通过此接口,应用程序可以控制编码过程并将图像从用户空间移动到驱动程序。
按照惯例,V4L2 视频输出设备通过名为 /dev/video
和 /dev/video0
到 /dev/video63
的字符设备特殊文件访问,主设备号为 81,次设备号为 0 到 63。/dev/video
通常是指向首选视频设备的符号链接。
注意
相同的设备文件名也用于视频捕获设备。
4.3.1. 查询功能¶
支持视频输出接口的设备在 v4l2_capability
结构体的 capabilities
字段中设置 V4L2_CAP_VIDEO_OUTPUT
或 V4L2_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_OUTPUT
或 V4L2_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_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。有关详细信息,请参见 输入/输出。