2.5. RGB 格式

这些格式将每个像素编码为一组 RGB 三元组值。它们是打包格式,意味着一个像素的 RGB 值在内存中是连续存储的,并且每个像素占用整数个字节。当存储像素所需的比特数未按字节边界对齐时,数据会用额外的比特填充以补齐剩余的字节。

这些格式的不同之处在于每个 RGB 分量的比特数(通常但不总是所有分量都相同)、内存中分量的顺序,以及是否存在 alpha 分量或额外的填充比特。

在支持 alpha 位的格式中(命名为 ARGB 或其排列形式,统称为 alpha 格式),alpha 位的使用和值取决于设备类型和硬件操作。捕获设备(包括内存到内存设备的捕获队列)在内存中填充 alpha 分量。当设备捕获 alpha 通道时,alpha 分量将具有有意义的值。否则,当设备不捕获 alpha 通道但可以将 alpha 位设置为用户可配置的值时,使用 V4L2_CID_ALPHA_COMPONENT 控制来指定该 alpha 值,并且所有像素的 alpha 分量都将设置为该控制指定的值。否则,必须使用不带 alpha 分量(XRGB 或 XBGR)的相应格式,而不是 alpha 格式。

输出设备(包括内存到内存设备的输出队列和 视频输出叠加设备)从内存中读取 alpha 分量。当设备处理 alpha 通道时,应用程序必须用有意义的值填充 alpha 分量。否则,必须使用不带 alpha 分量(XRGB 或 XBGR)的相应格式,而不是 alpha 格式。

包含填充位的格式被命名为 XRGB(或其排列形式)。填充位包含未定义的值,并且应用程序、设备和驱动程序必须忽略它们,无论是对于 视频捕获接口 还是 视频输出接口 设备。

注意

  • 在所有随后的表格中,比特 7 是字节中的最高有效位。

  • ‘r’、‘g’ 和 ‘b’ 分别表示红色、绿色和蓝色分量的比特。‘a’ 表示 alpha 分量的比特(如果格式支持),‘x’ 表示填充比特。

2.5.1. 每个分量少于 8 比特

这些格式将一个 RGB 三元组存储在一个、两个或四个字节中。它们的命名基于 RGB 分量在 8 位、16 位或 32 位字中的顺序,然后以小端字节序存储在内存中(除非 4CC 值中存在比特 31 另有说明),以及每个分量的比特数。例如,RGB565 格式将像素存储在一个 16 位字 [15:0] 中,布局为 [R4 R3 R2 R1 R0 G5 G4 G3 G2 G1 G0 B4 B3 B2 B1 B0],并在内存中存储为两个字节,[R4 R3 R2 R1 R0 G5 G4 G3] 后面跟着 [G2 G1 G0 B4 B3 B2 B1 B0]。

每个分量少于 8 比特的 RGB 格式

标识符

代码

内存中字节 0

字节 1

字节 2

字节 3

7

6

5

4

3

2

1

0

7

6

5

4

3

2

1

0

7

6

5

4

3

2

1

0

7

6

5

4

3

2

1

0

V4L2_PIX_FMT_RGB332

‘RGB1’

r2

r1

r0

g2

g1

g0

b1

b0

V4L2_PIX_FMT_ARGB444

‘AR12’

g3

g2

g1

g0

b3

b2

b1

b0

a3

a2

a1

a0

r3

r2

r1

r0

V4L2_PIX_FMT_XRGB444

‘XR12’

g3

g2

g1

g0

b3

b2

b1

b0

x

x

x

x

r3

r2

r1

r0

V4L2_PIX_FMT_RGBA444

‘RA12’

b3

b2

b1

b0

a3

a2

a1

a0

r3

r2

r1

r0

g3

g2

g1

g0

V4L2_PIX_FMT_RGBX444

‘RX12’

b3

b2

b1

b0

x

x

x

x

r3

r2

r1

r0

g3

g2

g1

g0

V4L2_PIX_FMT_ABGR444

‘AB12’

g3

g2

g1

g0

r3

r2

r1

r0

a3

a2

a1

a0

b3

b2

b1

b0

V4L2_PIX_FMT_XBGR444

‘XB12’

g3

g2

g1

g0

r3

r2

r1

r0

x

x

x

x

b3

b2

b1

b0

V4L2_PIX_FMT_BGRA444

‘BA12’

r3

r2

r1

r0

a3

a2

a1

a0

b3

b2

b1

b0

g3

g2

g1

g0

V4L2_PIX_FMT_BGRX444

‘BX12’

r3

r2

r1

r0

x

x

x

x

b3

b2

b1

b0

g3

g2

g1

g0

V4L2_PIX_FMT_ARGB555

‘AR15’

g2

g1

g0

b4

b3

b2

b1

b0

a

r4

r3

r2

r1

r0

g4

g3

V4L2_PIX_FMT_XRGB555

‘XR15’

g2

g1

g0

b4

b3

b2

b1

b0

x

r4

r3

r2

r1

r0

g4

g3

V4L2_PIX_FMT_RGBA555

‘RA15’

g1

g0

b4

b3

b2

b1

b0

a

r4

r3

r2

r1

r0

g4

g3

g2

V4L2_PIX_FMT_RGBX555

‘RX15’

g1

g0

b4

b3

b2

b1

b0

x

r4

r3

r2

r1

r0

g4

g3

g2

V4L2_PIX_FMT_ABGR555

‘AB15’

g2

g1

g0

r4

r3

r2

r1

r0

a

b4

b3

b2

b1

b0

g4

g3

V4L2_PIX_FMT_XBGR555

‘XB15’

g2

g1

g0

r4

r3

r2

r1

r0

x

b4

b3

b2

b1

b0

g4

g3

V4L2_PIX_FMT_BGRA555

‘BA15’

g1

g0

r4

r3

r2

r1

r0

a

b4

b3

b2

b1

b0

g4

g3

g2

V4L2_PIX_FMT_BGRX555

‘BX15’

g1

g0

r4

r3

r2

r1

r0

x

b4

b3

b2

b1

b0

g4

g3

g2

V4L2_PIX_FMT_RGB565

‘RGBP’

g2

g1

g0

b4

b3

b2

b1

b0

r4

r3

r2

r1

r0

g5

g4

g3

V4L2_PIX_FMT_ARGB555X

‘AR15’ | (1 << 31)

a

r4

r3

r2

r1

r0

g4

g3

g2

g1

g0

b4

b3

b2

b1

b0

V4L2_PIX_FMT_XRGB555X

‘XR15’ | (1 << 31)

x

r4

r3

r2

r1

r0

g4

g3

g2

g1

g0

b4

b3

b2

b1

b0

V4L2_PIX_FMT_RGB565X

‘RGBR’

r4

r3

r2

r1

r0

g5

g4

g3

g2

g1

g0

b4

b3

b2

b1

b0

V4L2_PIX_FMT_BGR666

‘BGRH’

b5

b4

b3

b2

b1

b0

g5

g4

g3

g2

g1

g0

r5

r4

r3

r2

r1

r0

x

x

x

x

x

x

x

x

x

x

x

x

x

x

2.5.2. 每个分量 8 比特

这些格式将一个 RGB 三元组存储在三个或四个字节中。它们的命名基于 RGB 分量在内存中的存储顺序,以及每个像素的总比特数。例如,RGB24 格式将像素存储在第一个字节中的 [R7 R6 R5 R4 R3 R2 R1 R0]、第二个字节中的 [G7 G6 G5 G4 G3 G2 G1 G0] 和第三个字节中的 [B7 B6 B5 B4 B3 B2 B1 B0]。这与 DRM 格式命名法不同,后者使用在 24 位或 32 位小端字中看到的分量顺序。

每个分量 8 比特的 RGB 格式

标识符

代码

内存中字节 0

字节 1

字节 2

字节 3

V4L2_PIX_FMT_BGR24

‘BGR3’

B7-0

G7-0

R7-0

V4L2_PIX_FMT_RGB24

‘RGB3’

R7-0

G7-0

B7-0

V4L2_PIX_FMT_ABGR32

‘AR24’

B7-0

G7-0

R7-0

A7-0

V4L2_PIX_FMT_XBGR32

‘XR24’

B7-0

G7-0

R7-0

X7-0

V4L2_PIX_FMT_BGRA32

‘RA24’

A7-0

B7-0

G7-0

R7-0

V4L2_PIX_FMT_BGRX32

‘RX24’

X7-0

B7-0

G7-0

R7-0

V4L2_PIX_FMT_RGBA32

‘AB24’

R7-0

G7-0

B7-0

A7-0

V4L2_PIX_FMT_RGBX32

‘XB24’

R7-0

G7-0

B7-0

X7-0

V4L2_PIX_FMT_ARGB32

‘BA24’

A7-0

R7-0

G7-0

B7-0

V4L2_PIX_FMT_XRGB32

‘BX24’

X7-0

R7-0

G7-0

B7-0

2.5.3. 每个分量 10 比特

这些格式在一个可选的 2 位 alpha 分量的基础上,将一个 30 位 RGB 三元组存储在四个字节中。它们的命名基于 RGB 分量在 32 位字中的顺序,然后以小端字节序存储在内存中(除非 4CC 值中存在比特 31 另有说明),以及每个分量的比特数。

每个颜色分量 10 比特的 RGB 格式

标识符

代码

内存中字节 0

字节 1

字节 2

字节 3

7

6

5

4

3

2

1

0

7

6

5

4

3

2

1

0

7

6

5

4

3

2

1

0

7

6

5

4

3

2

1

0

V4L2_PIX_FMT_RGBX1010102

‘RX30’

b5

b4

b3

b2

b1

b0

x

x

g3

g2

g1

g0

b9

b8

b7

b6

r1

r0

g9

g8

g7

g6

g5

g4

r9

r8

r7

r6

r5

r4

r3

r2

V4L2_PIX_FMT_RGBA1010102

‘RA30’

b5

b4

b3

b2

b1

b0

a1

a0

g3

g2

g1

g0

b9

b8

b7

b6

r1

r0

g9

g8

g7

g6

g5

g4

r9

r8

r7

r6

r5

r4

r3

r2

V4L2_PIX_FMT_ARGB2101010

‘AR30’

b7

b6

b5

b4

b3

b2

b1

b0

g5

g4

g3

g2

g1

g0

b9

b8

r3

r2

r1

r0

g9

g8

g7

g6

a1

a0

r9

r8

r7

r6

r5

r4

2.5.4. 每个分量 12 比特

这些格式将一个 RGB 三元组存储在六个或八个字节中,每个分量 12 位。将每个分量的比特扩展到 16 位,数据在高位,低位为零,按小端序排列。

每个分量 12 比特的 RGB 格式

标识符

代码

字节 1-0

字节 3-2

字节 5-4

字节 7-6

V4L2_PIX_FMT_BGR48_12

‘B312’

B15-4

G15-4

R15-4

V4L2_PIX_FMT_ABGR64_12

‘B412’

B15-4

G15-4

R15-4

A15-4

2.5.5. 每个分量 16 比特

这些格式将一个 RGB 三元组存储在六个字节中,每个分量 16 位,以小端字节序存储在内存中。它们的命名基于 RGB 分量在内存中的存储顺序。例如,RGB48 分别将 R7:0 和 R15:8 存储在字节 0 和字节 1 中。这与 DRM 格式命名法不同,后者使用在 48 位小端字中看到的分量顺序。

每个分量 16 比特的 RGB 格式

标识符

代码

字节 0

字节 1

字节 2

字节 3

字节 4

字节 5

V4L2_PIX_FMT_BGR48

‘BGR6’

B7-0

B15-8

G7-0

G15-8

R7-0

R15-8

V4L2_PIX_FMT_RGB48

‘RGB6’

R7-0

R15-8

G7-0

G15-8

B7-0

B15-8

2.5.6. 已弃用的 RGB 格式

已弃用的打包 RGB 图像格式 中定义的格式已弃用,新驱动程序不得使用。此处记录它们以供参考。其 alpha 位 (a) 的含义不明确,根据驱动程序的类型,它们被解释为对应的 ARGB 或 XRGB 格式。

已弃用的打包 RGB 图像格式

标识符

代码

内存中字节 0

字节 1

字节 2

字节 3

7

6

5

4

3

2

1

0

7

6

5

4

3

2

1

0

7

6

5

4

3

2

1

0

7

6

5

4

3

2

1

0

V4L2_PIX_FMT_RGB444

‘R444’

g3

g2

g1

g0

b3

b2

b1

b0

a3

a2

a1

a0

r3

r2

r1

r0

V4L2_PIX_FMT_RGB555

‘RGBO’

g2

g1

g0

b4

b3

b2

b1

b0

a

r4

r3

r2

r1

r0

g4

g3

V4L2_PIX_FMT_RGB555X

‘RGBQ’

a

r4

r3

r2

r1

r0

g4

g3

g2

g1

g0

b4

b3

b2

b1

b0

V4L2_PIX_FMT_BGR32

‘BGR4’

b7

b6

b5

b4

b3

b2

b1

b0

g7

g6

g5

g4

g3

g2

g1

g0

r7

r6

r5

r4

r3

r2

r1

r0

a7

a6

a5

a4

a3

a2

a1

a0

V4L2_PIX_FMT_RGB32

‘RGB4’

a7

a6

a5

a4

a3

a2

a1

a0

r7

r6

r5

r4

r3

r2

r1

r0

g7

g6

g5

g4

g3

g2

g1

g0

b7

b6

b5

b4

b3

b2

b1

b0

一个用于确定驱动程序实际支持哪些 RGB 格式的测试工具可在 LinuxTV v4l-dvb 仓库中找到。请参阅 https://linuxtv.org/repo/ 获取访问说明。