2.5. RGB 格式¶
这些格式将每个像素编码为 RGB 值的三个一组。它们是紧凑格式,这意味着一个像素的 RGB 值在内存中连续存储,并且每个像素占用整数个字节。当存储一个像素所需的位数未与字节边界对齐时,数据会用额外的位进行填充,以填充剩余的字节。
这些格式的不同之处在于每个 RGB 分量的位数(通常但不总是所有分量相同),内存中分量的顺序,以及是否存在 alpha 分量或其他填充位。
在支持 alpha 位的格式(命名为 ARGB 或其排列,统称为 alpha 格式)中,alpha 位的使用和值取决于设备类型和硬件操作。采集设备(包括 mem-to-mem 设备的采集队列)在内存中填充 alpha 分量。当设备捕获 alpha 通道时,alpha 分量将具有有意义的值。否则,当设备不捕获 alpha 通道但可以将 alpha 位设置为用户可配置的值时,将使用 V4L2_CID_ALPHA_COMPONENT 控制来指定 alpha 值,并且所有像素的 alpha 分量都将设置为该控制指定的值。否则,必须使用不带 alpha 分量的相应格式(XRGB 或 XBGR)来代替 alpha 格式。
输出设备(包括 mem-to-mem 设备的输出队列和 视频输出覆盖设备)从内存中读取 alpha 分量。当设备处理 alpha 通道时,应用程序必须用有意义的值填充 alpha 分量。否则,必须使用不带 alpha 分量的相应格式(XRGB 或 XBGR)来代替 alpha 格式。
包含填充位的格式被命名为 XRGB(或其排列)。填充位包含未定义的值,必须被应用程序、设备和驱动程序忽略,无论是用于视频采集接口 还是 视频输出接口 设备。
注意
在下面的所有表中,位 7 是字节中最重要的位。
‘r’、‘g’ 和 ‘b’ 分别表示红色、绿色和蓝色分量的位。‘a’ 表示 alpha 分量的位(如果格式支持),‘x’ 表示填充位。
2.5.1. 每个分量少于 8 位¶
这些格式在一个、两个或四个字节中存储 RGB 三元组。它们根据在 8 位、16 位或 32 位字中看到的 RGB 分量的顺序命名,然后在内存中以小端字节顺序存储(除非 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 格式命名法不同,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 位¶
这些格式在四个字节中存储一个 30 位 RGB 三元组,带有一个可选的 2 位 alpha。它们根据在 32 位字中看到的 RGB 分量的顺序命名,然后在内存中以小端字节顺序存储(除非 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 在字节 0 和 1 中分别存储 R7:0 和 R15:8。这与 DRM 格式命名法不同,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/ 获取访问说明。