1.26. 单平面和多平面API¶
某些设备要求将每个输入或输出视频帧的数据放置在不连续的内存缓冲区中。在这种情况下,一个视频帧必须使用多个内存地址寻址,即每个“平面”一个指针。平面是当前帧的一个子缓冲区。有关此类格式的示例,请参见图像格式。
最初,V4L2 API 不支持多平面缓冲区,并引入了一组扩展来处理它们。这些扩展构成了所谓的“多平面API”。
一些 V4L2 API 调用和结构根据使用的是单平面还是多平面API 而有不同的解释。应用程序可以通过向其 ioctl 调用传递相应的缓冲区类型来选择使用其中一个。缓冲区类型的多平面版本带有 _MPLANE
字符串后缀。有关可用多平面缓冲区类型的列表,请参见枚举 v4l2_buf_type
。
1.26.1. 多平面格式¶
多平面API引入了新的多平面格式。这些格式使用一套独立的FourCC代码。区分多平面API和多平面格式是很重要的。多平面API调用也可以处理所有单平面格式(只要它们在多平面API结构中传递),而单平面API不能处理多平面格式。
1.26.2. 区分单平面和多平面API的调用¶
- VIDIOC_QUERYCAP
新增了两项多平面功能。对于同时支持单平面和多平面格式的设备,它们可以与非多平面功能一起设置。
- VIDIOC_G_FMT, VIDIOC_S_FMT, VIDIOC_TRY_FMT
新增了用于描述多平面格式的结构体:struct
v4l2_pix_format_mplane
和 structv4l2_plane_pix_format
。驱动程序可以定义新的多平面格式,这些格式具有与现有单平面格式不同的FourCC代码。- VIDIOC_QBUF, VIDIOC_DQBUF, VIDIOC_QUERYBUF
新增了用于描述平面的结构体
v4l2_plane
。此结构体的数组在结构体v4l2_buffer
的新m.planes
字段中传递。- VIDIOC_REQBUFS
将根据请求分配多平面缓冲区。