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]。
标识符 |
代码 |
内存中字节 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 |
||
|
‘RGB1’ |
r2 |
r1 |
r0 |
g2 |
g1 |
g0 |
b1 |
b0 |
||||||||||||||||||||||||
|
‘AR12’ |
g3 |
g2 |
g1 |
g0 |
b3 |
b2 |
b1 |
b0 |
a3 |
a2 |
a1 |
a0 |
r3 |
r2 |
r1 |
r0 |
||||||||||||||||
|
‘XR12’ |
g3 |
g2 |
g1 |
g0 |
b3 |
b2 |
b1 |
b0 |
x |
x |
x |
x |
r3 |
r2 |
r1 |
r0 |
||||||||||||||||
|
‘RA12’ |
b3 |
b2 |
b1 |
b0 |
a3 |
a2 |
a1 |
a0 |
r3 |
r2 |
r1 |
r0 |
g3 |
g2 |
g1 |
g0 |
||||||||||||||||
|
‘RX12’ |
b3 |
b2 |
b1 |
b0 |
x |
x |
x |
x |
r3 |
r2 |
r1 |
r0 |
g3 |
g2 |
g1 |
g0 |
||||||||||||||||
|
‘AB12’ |
g3 |
g2 |
g1 |
g0 |
r3 |
r2 |
r1 |
r0 |
a3 |
a2 |
a1 |
a0 |
b3 |
b2 |
b1 |
b0 |
||||||||||||||||
|
‘XB12’ |
g3 |
g2 |
g1 |
g0 |
r3 |
r2 |
r1 |
r0 |
x |
x |
x |
x |
b3 |
b2 |
b1 |
b0 |
||||||||||||||||
|
‘BA12’ |
r3 |
r2 |
r1 |
r0 |
a3 |
a2 |
a1 |
a0 |
b3 |
b2 |
b1 |
b0 |
g3 |
g2 |
g1 |
g0 |
||||||||||||||||
|
‘BX12’ |
r3 |
r2 |
r1 |
r0 |
x |
x |
x |
x |
b3 |
b2 |
b1 |
b0 |
g3 |
g2 |
g1 |
g0 |
||||||||||||||||
|
‘AR15’ |
g2 |
g1 |
g0 |
b4 |
b3 |
b2 |
b1 |
b0 |
a |
r4 |
r3 |
r2 |
r1 |
r0 |
g4 |
g3 |
||||||||||||||||
|
‘XR15’ |
g2 |
g1 |
g0 |
b4 |
b3 |
b2 |
b1 |
b0 |
x |
r4 |
r3 |
r2 |
r1 |
r0 |
g4 |
g3 |
||||||||||||||||
|
‘RA15’ |
g1 |
g0 |
b4 |
b3 |
b2 |
b1 |
b0 |
a |
r4 |
r3 |
r2 |
r1 |
r0 |
g4 |
g3 |
g2 |
||||||||||||||||
|
‘RX15’ |
g1 |
g0 |
b4 |
b3 |
b2 |
b1 |
b0 |
x |
r4 |
r3 |
r2 |
r1 |
r0 |
g4 |
g3 |
g2 |
||||||||||||||||
|
‘AB15’ |
g2 |
g1 |
g0 |
r4 |
r3 |
r2 |
r1 |
r0 |
a |
b4 |
b3 |
b2 |
b1 |
b0 |
g4 |
g3 |
||||||||||||||||
|
‘XB15’ |
g2 |
g1 |
g0 |
r4 |
r3 |
r2 |
r1 |
r0 |
x |
b4 |
b3 |
b2 |
b1 |
b0 |
g4 |
g3 |
||||||||||||||||
|
‘BA15’ |
g1 |
g0 |
r4 |
r3 |
r2 |
r1 |
r0 |
a |
b4 |
b3 |
b2 |
b1 |
b0 |
g4 |
g3 |
g2 |
||||||||||||||||
|
‘BX15’ |
g1 |
g0 |
r4 |
r3 |
r2 |
r1 |
r0 |
x |
b4 |
b3 |
b2 |
b1 |
b0 |
g4 |
g3 |
g2 |
||||||||||||||||
|
‘RGBP’ |
g2 |
g1 |
g0 |
b4 |
b3 |
b2 |
b1 |
b0 |
r4 |
r3 |
r2 |
r1 |
r0 |
g5 |
g4 |
g3 |
||||||||||||||||
|
‘AR15’ | (1 << 31) |
a |
r4 |
r3 |
r2 |
r1 |
r0 |
g4 |
g3 |
g2 |
g1 |
g0 |
b4 |
b3 |
b2 |
b1 |
b0 |
||||||||||||||||
|
‘XR15’ | (1 << 31) |
x |
r4 |
r3 |
r2 |
r1 |
r0 |
g4 |
g3 |
g2 |
g1 |
g0 |
b4 |
b3 |
b2 |
b1 |
b0 |
||||||||||||||||
|
‘RGBR’ |
r4 |
r3 |
r2 |
r1 |
r0 |
g5 |
g4 |
g3 |
g2 |
g1 |
g0 |
b4 |
b3 |
b2 |
b1 |
b0 |
||||||||||||||||
|
‘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 位小端字中看到的分量顺序。
标识符 |
代码 |
内存中字节 0 |
字节 1 |
字节 2 |
字节 3 |
---|---|---|---|---|---|
|
‘BGR3’ |
B7-0 |
G7-0 |
R7-0 |
|
|
‘RGB3’ |
R7-0 |
G7-0 |
B7-0 |
|
|
‘AR24’ |
B7-0 |
G7-0 |
R7-0 |
A7-0 |
|
‘XR24’ |
B7-0 |
G7-0 |
R7-0 |
X7-0 |
|
‘RA24’ |
A7-0 |
B7-0 |
G7-0 |
R7-0 |
|
‘RX24’ |
X7-0 |
B7-0 |
G7-0 |
R7-0 |
|
‘AB24’ |
R7-0 |
G7-0 |
B7-0 |
A7-0 |
|
‘XB24’ |
R7-0 |
G7-0 |
B7-0 |
X7-0 |
|
‘BA24’ |
A7-0 |
R7-0 |
G7-0 |
B7-0 |
|
‘BX24’ |
X7-0 |
R7-0 |
G7-0 |
B7-0 |
2.5.3. 每个分量 10 比特¶
这些格式在一个可选的 2 位 alpha 分量的基础上,将一个 30 位 RGB 三元组存储在四个字节中。它们的命名基于 RGB 分量在 32 位字中的顺序,然后以小端字节序存储在内存中(除非 4CC 值中存在比特 31 另有说明),以及每个分量的比特数。
标识符 |
代码 |
内存中字节 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 |
||
|
‘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 |
|
‘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 |
|
‘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 位,数据在高位,低位为零,按小端序排列。
标识符 |
代码 |
字节 1-0 |
字节 3-2 |
字节 5-4 |
字节 7-6 |
---|---|---|---|---|---|
|
‘B312’ |
B15-4 |
G15-4 |
R15-4 |
|
|
‘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 位小端字中看到的分量顺序。
标识符 |
代码 |
字节 0 |
字节 1 |
字节 2 |
字节 3 |
字节 4 |
字节 5 |
---|---|---|---|---|---|---|---|
|
‘BGR6’ |
B7-0 |
B15-8 |
G7-0 |
G15-8 |
R7-0 |
R15-8 |
|
‘RGB6’ |
R7-0 |
R15-8 |
G7-0 |
G15-8 |
B7-0 |
B15-8 |
2.5.6. 已弃用的 RGB 格式¶
在 已弃用的打包 RGB 图像格式 中定义的格式已弃用,新驱动程序不得使用。此处记录它们以供参考。其 alpha 位 (a)
的含义不明确,根据驱动程序的类型,它们被解释为对应的 ARGB 或 XRGB 格式。
标识符 |
代码 |
内存中字节 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 |
||
|
‘R444’ |
g3 |
g2 |
g1 |
g0 |
b3 |
b2 |
b1 |
b0 |
a3 |
a2 |
a1 |
a0 |
r3 |
r2 |
r1 |
r0 |
||||||||||||||||
|
‘RGBO’ |
g2 |
g1 |
g0 |
b4 |
b3 |
b2 |
b1 |
b0 |
a |
r4 |
r3 |
r2 |
r1 |
r0 |
g4 |
g3 |
||||||||||||||||
|
‘RGBQ’ |
a |
r4 |
r3 |
r2 |
r1 |
r0 |
g4 |
g3 |
g2 |
g1 |
g0 |
b4 |
b3 |
b2 |
b1 |
b0 |
||||||||||||||||
|
‘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 |
|
‘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/ 获取访问说明。