2.3. 标准图像格式

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

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

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

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

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

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