fuchsia.images2

新增:12

枚举

ColorSpace 灵活

类型:uint32

在 fuchsia.images2/image_format.fidl 中定义

表示用于解读视频像素值的色彩空间。

此列表针对色彩空间标准的每个变体都有一个单独的条目。

因此,如果我们添加对 709 的 RGB 变体的支持,则会为此变体向此列表添加一个单独的条目。2020 或 2100 的 RGB 变体也是如此。2020 的 YcCbcCrc 变体也是如此。2100 的 ICtCp 变体也是如此。

如需了解 PixelFormat 和 ColorSpace 的组合是否可能受支持,请参阅 ImageFormatIsSupportedColorSpaceForPixelFormat()。

通常,如果 PixelFormat 的每样本位数与色彩空间的规范不兼容,或者 PixelFormat 在 RGB 与 YUV 方面不匹配,则不支持 ColorSpace。

以下注释中的“有限范围”是指黑白(以及色度)的定义范围,但不应被解释为保证不会出现超出名义“有限范围”的值。 换句话说,“有限范围”并不一定意味着不会有任何值低于黑色或高于白色,或者超出“有限”色度范围。对于“全范围”,黑色为 0,白色为最大可能/允许的数值(色度也类似)。

名称值说明
0

不是有效的色彩空间类型。

1

sRGB、伽玛转换函数和全范围(根据规范)

2

601 NTSC(“525 行”)YCbCr 基色,有限范围

3

601 NTSC(“525 行”)YCbCr 基色,全范围

4

601 PAL(“625 行”)YCbCr 基色,有限范围

5

601 PAL(“625 行”)YCbCr 基色,全范围

6

709 YCbCr(非 RGB),有限范围

7

2020 YCbCr(非 RGB,非 YcCbcCrc),根据 PixelFormat 采用 10 位或 12 位,具有原色、有限范围(非全范围)、传输函数(“伽玛”)等,均符合规范,广色域 SDR

8

2100 YCbCr(非 RGB,非 ICtCp),10 位或 12 位(根据 PixelFormat),BT.2020 原色(与 REC2020 相同的广色域),有限范围(非全范围),PQ(又称 SMPTE ST 2084)HDR 转换函数(非 HLG,非 REC2020 和 REC709 使用的 SDR“伽玛”),广色域 HDR

9

像素格式不表示颜色,或者像素格式位于应用专属色彩空间中,无法通过此枚举中的其他条目进行描述。

4294967294

客户端明确表示其不关心选择/使用哪种色彩空间。

PixelFormat flexible

类型:uint32

在 fuchsia.images2/image_format.fidl 中定义

表示视频像素的编码方式。

格式名称中声道的顺序反映了声道的实际布局。

这些值中的每一个都对其中应包含的色彩空间有明确的规定(与 Vulkan 相比)。

名称值说明
0
1

仅限 RGB,每个 R/G/B/A 样本 8 位

如果 A 实际上是 X(未设置为有意义的值),则可以通过将 ['fuchsia.sysmem2/ImageFormatConstraints.is_alpha_present'] 设置为 false 来指定。

如果已知 A 设置为有意义的值,则可以通过将 ['fuchsia.sysmem2/ImageFormatConstraints.is_alpha_present'] 设置为 true 来指定。

与 VK_FORMAT_R8G8B8A8_UNORM 兼容。

119

仅限 RGB,每个 R/G/B/X 样本 8 位

与 VK_FORMAT_R8G8B8A8_UNORM 兼容(当被视为不透明时)。

已弃用。请改用 R8G8B8A8,并将 ['fuchsia.sysmem2/ImageFormatConstraints.is_alpha_present'] 设置为 false。

已弃用:24 已添加:12
101

32bpp BGRA,1 个平面。仅限 RGB,每个 B/G/R/A 样本 8 位。

与 VK_FORMAT_B8G8R8A8_UNORM 兼容。

如果 A 实际上是 X(未设置为有意义的值),则可以通过将 ['fuchsia.sysmem2/ImageFormatConstraints.is_alpha_present'] 设置为 false 来指定。

如果已知 A 设置为有意义的值,则可以通过将 ['fuchsia.sysmem2/ImageFormatConstraints.is_alpha_present'] 设置为 true 来指定。

在 sysmem(1) 中,此格式为 BGRA32。

120

32bpp BGRA,1 个平面。仅限 RGB,每个 B/G/R/X 样本 8 位。

与 VK_FORMAT_B8G8R8A8_UNORM 兼容(当被视为不透明时)。

已弃用。请改用 B8G8R8A8,并将 fuchsia.sysmem2/ImageFormatConstraints.is_alpha_present 设置为 false。

已弃用:24 已添加:12
102

仅限 YUV,每个 Y 样本 8 位

与 VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM 兼容。

103

仅限 YUV,每个 Y 样本 8 位

与任何 Vulkan 格式都不兼容。

104

仅限 YUV,每个 Y 样本 8 位

与 VK_FORMAT_G8_B8R8_2PLANE_420_UNORM 兼容。

105

仅限 YUV,每个 Y 样本 8 位

与 VK_FORMAT_G8B8G8R8_422_UNORM 兼容。

106

此值已预留,目前未使用。

107

仅限 YUV,每个 Y 样本 8 位

与 VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM 兼容。U 平面可能位于图片的 B 或 R 平面中(V 平面也是如此);可以通过查看 VkBufferCollectionPropertiesFUCHSIA.samplerYcbcrConversionComponents 的成员来确定顺序。

108

24bpp BGR,1 个平面。仅限 RGB,每个 B/G/R 样本 8 位

与 VK_FORMAT_B8G8R8_UNORM 兼容。

在 sysmem(1) 中,此格式为 BGR24。

109

16bpp RGB,1 个平面。5 位 R、6 位 G、5 位 B

与 VK_FORMAT_R5G6B5_UNORM_PACK16 兼容。

在 sysmem(1) 中,此格式为 RGB565。

110

8bpp RGB,1 个平面。3 位 R、3 位 G、2 位 B

与任何 Vulkan 格式都不兼容。

在 sysmem(1) 中,此格式为 RGB332。

111

8bpp RGB,1 个平面。2 位 R、2 位 G、2 位 B

与任何 Vulkan 格式都不兼容。

如果 X 实际上是 X(未设置为有意义的值),则可以通过将 ['fuchsia.sysmem2/ImageFormatConstraints.is_alpha_present'] 设置为 false 来指定。

如果已知 X 设置为有意义的值,则可以通过将 ['fuchsia.sysmem2/ImageFormatConstraints.is_alpha_present'] 设置为 true 来指定。

在 sysmem(1) 中,此格式为 RGB2220。

112

8bpp,仅亮度(红色、绿色和蓝色具有相同的值)。

与 VK_FORMAT_R8_UNORM 兼容。

大多数客户端更愿意改用 R8。

113

8bpp,仅红色(绿色和蓝色应解读为 0)。

与 VK_FORMAT_R8_UNORM 兼容。

114

16bpp RG,1 个平面。8 位 R,8 位 G。

与 VK_FORMAT_R8G8_UNORM 兼容。

115

32bpp RGBA,1 个平面。2 位 A,10 位 R/G/B。

如果 A 实际上是 X(未设置为有意义的值),则可以通过将 ['fuchsia.sysmem2/ImageFormatConstraints.is_alpha_present'] 设置为 false 来指定。

如果已知 A 设置为有意义的值,则可以通过将 ['fuchsia.sysmem2/ImageFormatConstraints.is_alpha_present'] 设置为 true 来指定。

与 VK_FORMAT_A2R10G10B10_UNORM_PACK32 兼容。

116

32bpp BGRA,1 个平面。2 位 A,10 位 R/G/B。

如果 A 实际上是 X(未设置为有意义的值),则可以通过将 ['fuchsia.sysmem2/ImageFormatConstraints.is_alpha_present'] 设置为 false 来指定。

如果已知 A 设置为有意义的值,则可以通过将 ['fuchsia.sysmem2/ImageFormatConstraints.is_alpha_present'] 设置为 true 来指定。

与 VK_FORMAT_A2B10G10R10_UNORM_PACK32 兼容。

117

仅限 YUV,每个 Y 样本 16 位

这类似于 NV12,但具有 16 位样本,每个样本的底部 6 位设置为零和/或被忽略。每个 16 位样本的字节序为主机字节序(LE 系统上为 LE,BE 系统上为 BE)。CbCr 平面首先具有 16 位 Cb,然后是 16 位 Cr,交错 Cb Cr Cb Cr 等。

与 VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16 兼容。

118

24bpp RGB,1 个平面。仅限 RGB,每个 R/G/B 样本 8 位

与 VK_FORMAT_R8G8B8_UNORM 兼容。

4294967294

客户端明确表示其不关心选择/使用哪种像素格式。设置此值时,客户端不得设置 pixel_format_modifier。

PixelFormatModifier flexible

类型:uint64

在 fuchsia.images2/format_modifier.fidl 中定义

高 8 位是供应商代码。低 56 位由供应商定义。

定义的 PixelFormatModifier 值是具体、完整且有效的值(INVALID 和 DO_NOT_CARE 除外,它们有自己的含义)。

一些其他有效或可能有效的 pixel_format_modifier 值未定义为 PixelFormatModifier 值,这通常是因为该值在实践中未使用(或者可能是新使用的,但尚未在 PixelFormatModifier 中定义)。尽管缺少相应的已定义 PixelFormatModifier 值,但允许在 pixel_format_modifier 字段中将此类值指定为 PixelFormatModifier 值。如果此类值在测试代码之外使用,请考虑将其作为已定义的值添加到 PixelFormatModifier 中。所有此类值都必须符合高 8 位供应商代码(请勿定义/使用适当供应商代码之外的值)。

单独定义的 FORMATMODIFIER* uint64 值是供应商专属的位字段值,其本身并非完整的有效值。这些 uint64 值可用于根据供应商专用位字段创建或解释 PixelFormatModifier 值。

当 pixel_format_modifier 设置为受支持的值(不包括 DO_NOT_CARE、INVALID、LINEAR)时,pixel_format 字段指定的像素数据排列方式会被“修改”,通常是为了允许进行平铺、压缩(通常是无损压缩,通常是为了减少内存带宽,而不是减少帧缓冲区大小)、事务消除、脏跟踪等操作,但通常不会修改 pixel_format 的位深度。在某些情况下,会涉及每个图片或每个图块的标头或类似内容。pixel_format 字段通常仍需要设置为与 pixel_format_modifier 结合使用的有效支持的值,并且该 pixel_format 值也可以对 ImageFormat 的整体含义做出贡献。换句话说,名称中的“修饰符”部分比“替换”更准确。

名称值说明
72057594037927934
72057594037927935
0
72057594037927937
72057594037927938
72057594037927939
72057594054705154
72057594054705155
576460752303423489
576460752303423490
576460752303427584
576460752303427585
576460752303427586
576460752303431697
576460752303423601
576460752303427697
576460752303431793
576460752303435889
7421932185906577409
10520408729537478690

PowerVR 帧缓冲区压缩 (FBCDC / PVRIC) 8x8 图块,V14 (FBCDC v4/v5)。

添加:33
10520408729537478695

PowerVR 帧缓冲区压缩 (FBCDC / PVRIC) 16x4 图块,V14 (FBCDC v4/v5)。

添加:33

TABLES

ImageFormat

在 fuchsia.images2/image_format.fidl 中定义

描述图片格式。

序数字段类型说明
pixel_format PixelFormat

描述像素的编码方式。

pixel_format_modifier PixelFormatModifier

供应商专用像素格式修饰符。请参阅 format_modifier.fidl。

color_space ColorSpace

表示用于解读像素值的色彩空间。

size fuchsia.math/SizeU

图片的尺寸(以像素为单位)。

另请参阅 bytes_per_row,它也是查找每个像素的数据在缓冲区中的位置所必需的(与 size 一起)。

缓冲区中并非所有可寻址像素位置都必须填充有效的像素数据。请参阅 valid_size,了解可能较小的有效像素矩形。

图片的右侧和底部可能有一些不应显示的有效像素。请参阅 display_rect。

bytes_per_row uint32

每行的字节数。对于多平面 YUV 格式,这是 Y 平面中每行的字节数。

如果未设置此字段,则每行像素的末尾不会有任何填充。换句话说,如果未设置,则步幅等于“每个宽度像素的步幅字节数”乘以 size.width。

设置后,此字段中的值必须大于或等于“每个宽度像素的跨距字节数”乘以 size.width。如果相等,则每行像素的末尾没有内边距。如果大于,则差值即为每行像素末尾的内边距大小(以字节为单位)。

当“pixel_format_modifier”不是“PixelFormatModifier::Linear”时,此字段没有指定含义。相反,参与者应隐式知道,平铺(非线性)格式将包含 size 像素,方法是向上舍入到大于或等于宽度的最接近平铺边界,并分别对高度执行相同操作,在任一方向上都没有任何“额外”平铺。平铺(非线性)格式无法在任一方向上指定比 size 隐含的块更多的块。当相关使用方支持 display_rect 时,size 可以暗示比 display_rect 接触的图块更多的图块。

这不是“以像素为单位的行跨度”,也不是“每像素跨度”(它们本身是两个不同的概念,都不同于 bytes_per_row)。

此字段中的数字也称为“以字节为单位的行跨度”“以字节为单位的行到行偏移量”“以字节为单位的行到行偏移量”以及这些名称的其他变体,有时简称为“跨度”,但仅在理解为以字节为单位时。

关于“行跨距(以像素为单位)”与 bytes_per_row,举例来说,BGR24(每个像素 3 个字节)在每行末尾有一些内边距,以便每行像素都从距离图片开头 4 字节对齐的偏移量开始,这种情况并不少见。该内边距的大小不一定能被像素的字节大小(“每个宽度像素的跨距字节数”)整除,因此我们使用此字段来指示内边距,而不是尝试将内边距合并为更大的“虚假”size.width。

当 pixel_format_modifier == PixelFormatModifier.Linear 时,此值为平面 0 的第 1 行第 0 个字节的偏移量(以字节为单位)减去平面 0 的第 0 行第 0 个字节的偏移量(以字节为单位)。

display_rect fuchsia.math/RectU

帧内用于显示的矩形。这是在界面显示意义上显示“整个图片”时,应显示的像素矩形的位置和大小(以像素为单位)。

x + width 必须 <= size.width,y + height 必须 <= size.height。

对于视频解码器的输出,display_rect 之外的像素绝不会显示(测试程序之外),但必须保留,以确保解码器正常运行。如果设置了 valid_size,display_rect 将始终位于从 (0, 0) 开始且大小为 valid_size 的矩形内。换句话说,display_rect 是 valid_size 的子集(不一定是真子集),而 valid_size 是 size 的子集(不一定是真子集)。

下游纹理过滤操作应避免让 display_rect 之外的任何像素影响任何显示像素的视觉外观,以避免右边缘或下边缘可能泄露由解码过程定义但并非用于显示的任意像素。

未设置此字段时的行为取决于协议。在某些协议中,可能会实现回退到 valid_size,然后回退到 size。在其他情况下,可能会直接回退到 size。在其他情况下,必须设置此字段,否则通道将关闭。

警告:fuchsia.sysmem.Images2 (V1) 不会处理非零 x、y,因此此处 (V2) 的任何非零 x、y 都会阻止转换为 V1。由于在实践中很少出现非零 x、y,因此即使已迁移到 V2 的组件在某些情况下也可能仍会假设 x 和 y 均为 0,直到有实际理由实现和测试非零 x、y 的处理。如果将非零 x、y 发送到假定为 0、0 的下游渲染和/或显示流水线,则会导致显示不正确,但不会导致崩溃,因为假定 x、y 为 0、0 不会导致读取超出缓冲区边界。

新增:18
valid_size fuchsia.math/SizeU

帧的大小,以在视频解码方面具有有效像素数据的像素数表示,而不是以用于显示的像素数表示。

如需将 valid_size 转换为可直接与 display_rect 进行比较的矩形,可以创建一个矩形,其属性为 (x: 0, y: 0, width: valid_size.width, height: valid_size.height)。

对于视频解码器,valid_size 可以包含 display_rect 之外的一些像素。这些额外的像素不用于显示,可能包含也可能不包含任何实际图像数据。通常,这些区域中任何看起来像真实图片数据的内容都只是视频压缩的伪影,以及宏块其余部分的存在,这些内容可以被后续帧引用,尽管不在显示区域内,但实际上并不是来自源的任何额外“真实”像素。此区域中的像素值由编解码器解码过程定义,必须保留这些值才能使解码器正常运行。通常,valid_size 内部但 display_rect 外部的像素最多为宏块大小减 1。valid_size 可用于测试视频解码器和某些转码场景。

pixel_aspect_ratio fuchsia.math/SizeU

视频预期显示时单个像素的宽高比。

对于 YUV 格式,这是亮度(也称为 Y)样本的像素宽高比(也称为样本宽高比,即 SAR)。

生产者应确保宽度和高度值互质,必要时可化简分数(分子和分母同时除以最大公约数)。

使用方应将此字段未设置解读为像素宽高比未知。在某些情况下,默认值 1:1 可能比较合适,但使用方可以通过 OOB 方式确定实际像素宽高比。

常量

名称值类型说明
FORMAT_MODIFIER_ARM_BCH_BIT 2048 uint64
FORMAT_MODIFIER_ARM_SPARSE_BIT 64 uint64
FORMAT_MODIFIER_ARM_SPLIT_BLOCK_BIT 32 uint64
FORMAT_MODIFIER_ARM_TE_BIT 4096 uint64
FORMAT_MODIFIER_ARM_TILED_HEADER_BIT 8192 uint64
FORMAT_MODIFIER_ARM_YUV_BIT 16 uint64
FORMAT_MODIFIER_INTEL_CCS_BIT 16777216 uint64

格式在图块数据后有一个颜色控制界面

FORMAT_MODIFIER_VENDOR_ALLWINNER 648518346341351424 uint64
新增:19
FORMAT_MODIFIER_VENDOR_AMD 144115188075855872 uint64
新增:19
FORMAT_MODIFIER_VENDOR_AMLOGIC 720575940379279360 uint64
新增:19
FORMAT_MODIFIER_VENDOR_ARM 576460752303423488 uint64
新增:19
FORMAT_MODIFIER_VENDOR_BROADCOM 504403158265495552 uint64
新增:19
FORMAT_MODIFIER_VENDOR_GOOGLE 7421932185906577408 uint64
新增:19
FORMAT_MODIFIER_VENDOR_INTEL 72057594037927936 uint64
新增:19
FORMAT_MODIFIER_VENDOR_NVIDIA 216172782113783808 uint64
新增:19
FORMAT_MODIFIER_VENDOR_PVR 10520408729537478656 uint64
添加:33
FORMAT_MODIFIER_VENDOR_QCOM 360287970189639680 uint64
新增:19
FORMAT_MODIFIER_VENDOR_SAMSUNG 288230376151711744 uint64
新增:19
FORMAT_MODIFIER_VENDOR_VIVANTE 432345564227567616 uint64
新增:19