2.3. 标准图像格式

为了在驱动程序和应用程序之间交换图像,需要有双方都能以相同方式解释的标准图像数据格式。V4L2 包含了几种此类格式,本节旨在明确指定 V4L2 中的标准图像数据格式。

然而,V4L2 驱动程序不限于这些格式。驱动程序特定的格式是可能的。在这种情况下,应用程序可能依赖编解码器在需要时将图像转换为标准格式之一。但数据仍然可以以专有格式存储和检索。例如,设备可能支持专有的压缩格式。应用程序仍然可以以压缩格式捕获和保存数据,节省大量磁盘空间,并在稍后当视频需要显示时,使用编解码器将图像转换为 X Windows 屏幕格式。

即便如此,最终仍然需要一些标准格式,因此如果没有明确定义的标准格式,V4L2 规范将不完整。

V4L2 标准格式主要是未压缩格式。像素始终在内存中从左到右、从上到下排列。图像缓冲区中的第一个数据字节始终用于最顶行最左侧的像素。紧随其后的是其右侧的像素,依此类推,直到顶行像素的末尾。在行的最右侧像素之后,可能有一个或多个填充字节,以保证每行像素数据具有一定的对齐方式。在填充字节(如果有)之后,是第二行最左侧像素的数据,依此类推。最后一行与其它行具有相同数量的填充字节。

在 V4L2 中,每种格式都有一个类似于 PIX_FMT_XXX 的标识符,定义在 videodev2.h 头文件中。这些标识符代表 四字符 (FourCC) 代码,这些代码也列在下面,但它们与 Windows 世界中使用的不同。

对于某些格式,数据存储在单独的、不连续的内存缓冲区中。这些格式由一组单独的 FourCC 代码标识,并被称为“多平面格式”。例如,一个 YUV422 帧通常存储在一个内存缓冲区中,但它也可以放置在两个或三个单独的缓冲区中,其中 Y 分量在一个缓冲区中,CbCr 分量在另一个缓冲区中(在2平面版本中),或者每个分量在自己的缓冲区中(在3平面情况下)。这些子缓冲区被称为“平面”。