1.26. 单平面和多平面 API

一些设备要求每个输入或输出视频帧的数据放置在不连续的内存缓冲区中。在这种情况下,一个视频帧必须使用多个内存地址来寻址,即每个“平面”一个指针。平面是当前帧的子缓冲区。有关此类格式的示例,请参阅 图像格式

最初,V4L2 API 不支持多平面缓冲区,并且引入了一组扩展来处理它们。这些扩展构成了所谓的“多平面 API”。

一些 V4L2 API 调用和结构的解释方式有所不同,具体取决于使用的是单平面 API 还是多平面 API。应用程序可以通过将相应的缓冲区类型传递给其 ioctl 调用来选择使用哪种 API。缓冲区类型的多平面版本带有 _MPLANE 字符串后缀。有关可用的多平面缓冲区类型的列表,请参阅枚举 v4l2_buf_type

1.26.1. 多平面格式

多平面 API 引入了新的多平面格式。这些格式使用单独的一组 FourCC 代码。区分多平面 API 和多平面格式非常重要。多平面 API 调用可以处理所有单平面格式(只要它们在多平面 API 结构中传递),而单平面 API 不能处理多平面格式。

1.26.2. 区分单平面和多平面 API 的调用

VIDIOC_QUERYCAP

添加了两个额外的多平面功能。对于同时处理单平面和多平面格式的设备,可以将它们与非多平面功能一起设置。

VIDIOC_G_FMTVIDIOC_S_FMTVIDIOC_TRY_FMT

添加了用于描述多平面格式的新结构:struct v4l2_pix_format_mplane 和 struct v4l2_plane_pix_format。驱动程序可以定义新的多平面格式,这些格式具有与现有单平面格式不同的 FourCC 代码。

VIDIOC_QBUFVIDIOC_DQBUFVIDIOC_QUERYBUF

添加了一个新的 struct v4l2_plane 结构来描述平面。此结构的数组在 struct v4l2_buffer 的新 m.planes 字段中传递。

VIDIOC_REQBUFS

将根据请求分配多平面缓冲区。