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。当图像由可变长度的压缩数据组成时,这是编解码器为支持最坏情况的压缩方案所需的字节数。

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

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

__u32

colorspace

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

__u32

priv

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

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

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

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

__u32

flags

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

union {

(匿名)

__u32

ycbcr_enc

Y’CbCr 编码,来自枚举 v4l2_ycbcr_encoding。此信息补充了 colorspace,必须由捕获流的驱动程序和输出流的应用程序设置,请参阅 色彩空间。如果应用程序设置了标志 V4L2_PIX_FMT_FLAG_SET_CSC,则应用程序可以为捕获流设置此字段,以请求捕获的图像数据的特定 Y’CbCr 编码。如果驱动程序无法处理请求的转换,它将返回另一个受支持的编码。对于 HSV 像素格式,此字段将被忽略。驱动程序通过在枚举期间设置相应的 struct 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

量化

量化范围,来自枚举 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

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