2.1. 单平面格式结构

type v4l2_pix_format
struct v4l2_pix_format

__u32

width

图像宽度,以像素为单位。

__u32

height

图像高度,以像素为单位。如果 fieldV4L2_FIELD_TOPV4L2_FIELD_BOTTOMV4L2_FIELD_ALTERNATE 之一,则高度指的是场中的行数,否则指的是帧中的行数(对于隔行扫描格式,帧中的行数是场高度的两倍)。

应用程序设置这些字段来请求图像大小,驱动程序返回最接近的可能值。对于平面格式,widthheight 应用于最大的平面。为了避免歧义,驱动程序必须返回四舍五入为任何较小平面缩放因子的倍数的值。例如,当图像格式为 YUV 4:2:0 时,widthheight 必须是 2 的倍数。

对于在流中包含分辨率信息编码的压缩格式,当馈送到有状态 mem2mem 解码器时,这些字段可能为零,以依赖解码器来检测正确的值。有关更多详细信息,请参见内存到内存有状态视频解码器接口和格式描述。

对于有状态 mem2mem 编码器的 CAPTURE 侧的压缩格式,这些字段必须为零,因为编码大小预计将由编码器本身根据 OUTPUT 侧在内部计算。有关更多详细信息,请参见内存到内存有状态视频编码器接口和格式描述。

__u32

pixelformat

像素格式或压缩类型,由应用程序设置。这是一个小端 四字符代码。V4L2 在 RGB 格式中定义标准 RGB 格式,在 YUV 格式中定义 YUV 格式,并在 保留图像格式中定义保留代码

__u32

field

场序,来自枚举 v4l2_field。视频图像通常是隔行扫描的。应用程序可以请求仅捕获或输出顶部或底部场,或者以交错方式或顺序存储在一个缓冲区中,或在单独的缓冲区中交替存储的两个场。驱动程序返回实际选择的场序。有关场的更多详细信息,请参见场序

__u32

bytesperline

两个相邻行中最左侧像素之间的距离,以字节为单位。

应用程序和驱动程序都可以设置此字段以请求在每行末尾添加填充字节。但是,驱动程序可能会忽略应用程序请求的值,返回 width 乘以每个像素的字节数或硬件所需的更大值。这意味着应用程序只需将此字段设置为零即可获得合理的默认值。

视频硬件可能会访问填充字节,因此它们必须位于可访问的内存中。考虑图像的最后一行之后的填充字节跨越系统页面边界的情况。输入设备可能会写入填充字节,该值未定义。输出设备忽略填充字节的内容。

当图像格式为平面时,bytesperline 值应用于第一个平面,并按与其他平面的 width 字段相同的因子进行划分。例如,YUV 4:2:0 图像的 Cb 和 Cr 平面在每行之后具有的填充字节数是 Y 平面的一半。为了避免歧义,驱动程序必须返回四舍五入为缩放因子的倍数的 bytesperline 值。

对于压缩格式,bytesperline 值没有意义。在这种情况下,应用程序和驱动程序必须将其设置为 0。

__u32

sizeimage

用于保存完整图像的缓冲区大小,以字节为单位,由驱动程序设置。通常这是 bytesperline 乘以 height。当图像由可变长度的压缩数据组成时,这是编解码器支持最坏情况压缩场景所需的字节数。

驱动程序将设置未压缩图像的值。

允许客户端为标记有 V4L2_FMT_FLAG_COMPRESSED 的可变长度压缩数据在 ioctl VIDIOC_ENUM_FMT 设置 sizeimage 字段,但驱动程序可能会忽略它并自行设置该值,或者可能会根据对齐要求或最小/最大大小要求修改提供的值。如果客户端想将其留给驱动程序,则应将 sizeimage 设置为 0。

__u32

colorspace

图像颜色空间,来自枚举 v4l2_colorspace。此信息补充了 pixelformat,并且必须由驱动程序为捕获流设置,并由应用程序为输出流设置,请参见颜色空间。如果应用程序设置了标志 V4L2_PIX_FMT_FLAG_SET_CSC,则应用程序可以为捕获流设置此字段,以请求捕获的图像数据的特定颜色空间。如果驱动程序无法处理请求的转换,它将返回另一个支持的颜色空间。驱动程序通过在枚举期间在相应的结构 v4l2_fmtdesc 中设置标志 V4L2_FMT_FLAG_CSC_COLORSPACE 来指示支持颜色空间转换。请参见图像格式描述标志

__u32

priv

此字段指示结构 v4l2_pix_format 的其余字段(也称为扩展字段)是否有效。当设置为 V4L2_PIX_FMT_PRIV_MAGIC 时,它指示扩展字段已正确初始化。当设置为任何其他值时,它指示扩展字段包含未定义的值。

希望使用像素格式扩展字段的应用程序必须首先通过查询设备的 V4L2_CAP_EXT_PIX_FORMAT 功能来确保支持该功能。如果未设置该功能,则不支持像素格式扩展字段,并且使用扩展字段将导致未定义的结果。

要使用扩展字段,应用程序必须将 priv 字段设置为 V4L2_PIX_FMT_PRIV_MAGIC,初始化所有扩展字段,并将结构 v4l2_format raw_data 字段的未使用字节归零。

priv 字段未设置为 V4L2_PIX_FMT_PRIV_MAGIC 时,驱动程序必须表现得好像所有扩展字段都设置为零。返回时,驱动程序必须将 priv 字段设置为 V4L2_PIX_FMT_PRIV_MAGIC,并将所有扩展字段设置为适用的值。

__u32

flags

由应用程序或驱动程序设置的标志,请参见格式标志

union {

(anonymous)

__u32

ycbcr_enc

Y’CbCr 编码,来自枚举 v4l2_ycbcr_encoding。此信息补充了 colorspace,并且必须由驱动程序为捕获流设置,并由应用程序为输出流设置,请参见颜色空间。如果应用程序设置了标志 V4L2_PIX_FMT_FLAG_SET_CSC,则应用程序可以为捕获流设置此字段,以请求捕获的图像数据的特定 Y’CbCr 编码。如果驱动程序无法处理请求的转换,它将返回另一个支持的编码。对于 HSV 像素格式,此字段将被忽略。驱动程序通过在枚举期间在相应的结构 v4l2_fmtdesc 中设置标志 V4L2_FMT_FLAG_CSC_YCBCR_ENC 来指示支持 ycbcr_enc 转换。请参见图像格式描述标志

__u32

hsv_enc

HSV 编码,来自枚举 v4l2_hsv_encoding。此信息补充了 colorspace,并且必须由驱动程序为捕获流设置,并由应用程序为输出流设置,请参见颜色空间。如果应用程序设置了标志 V4L2_PIX_FMT_FLAG_SET_CSC,则应用程序可以为捕获流设置此字段,以请求捕获的图像数据的特定 HSV 编码。如果驱动程序无法处理请求的转换,它将返回另一个支持的编码。对于非 HSV 像素格式,此字段将被忽略。驱动程序通过在枚举期间在相应的结构 v4l2_fmtdesc 中设置标志 V4L2_FMT_FLAG_CSC_HSV_ENC 来指示支持 hsv_enc 转换。请参见图像格式描述标志

}

__u32

quantization

量化范围,来自枚举 v4l2_quantization。此信息补充了 colorspace,并且必须由驱动程序为捕获流设置,并由应用程序为输出流设置,请参见颜色空间。如果应用程序设置了标志 V4L2_PIX_FMT_FLAG_SET_CSC,则应用程序可以为捕获流设置此字段,以请求捕获的图像数据的特定量化范围。如果驱动程序无法处理请求的转换,它将返回另一个支持的量化。驱动程序通过在枚举期间在相应的结构 v4l2_fmtdesc 中设置标志 V4L2_FMT_FLAG_CSC_QUANTIZATION 来指示支持量化转换。请参见图像格式描述标志

__u32

xfer_func

传递函数,来自枚举 v4l2_xfer_func。此信息补充了 colorspace,并且必须由驱动程序为捕获流设置,并由应用程序为输出流设置,请参见颜色空间。如果应用程序设置了标志 V4L2_PIX_FMT_FLAG_SET_CSC,则应用程序可以为捕获流设置此字段,以请求捕获的图像数据的特定传递函数。如果驱动程序无法处理请求的转换,它将返回另一个支持的传递函数。驱动程序通过在枚举期间在相应的结构 v4l2_fmtdesc 中设置标志 V4L2_FMT_FLAG_CSC_XFER_FUNC 来指示支持 xfer_func 转换。请参见图像格式描述标志

格式标志

V4L2_PIX_FMT_FLAG_PREMUL_ALPHA

0x00000001

颜色值已预乘 alpha 通道值。例如,如果具有 50% 透明度的浅蓝色像素由 RGBA 值 (128, 192, 255, 128) 描述,则用预乘颜色描述的相同像素将由 RGBA 值 (64, 96, 128, 128) 描述

V4L2_PIX_FMT_FLAG_SET_CSC

0x00000002

由应用程序设置。它仅用于捕获,而对于输出流则被忽略。如果设置,则请求设备执行颜色空间转换,从接收到的颜色空间转换为请求的颜色空间值。如果色度字段(colorspacexfer_funcycbcr_enchsv_encquantization)设置为 *_DEFAULT,则该色度设置将与接收到的内容保持不变。因此,为了更改量化,只有 quantization 字段应设置为非默认值(V4L2_QUANTIZATION_FULL_RANGEV4L2_QUANTIZATION_LIM_RANGE),并且所有其他色度字段应设置为 *_DEFAULT

要检查硬件对当前像素格式支持哪些转换,请参见图像格式描述标志