Arm 帧缓冲压缩 (AFBC)

AFBC 是一种专有的无损图像压缩协议和格式。它提供细粒度的随机访问,并最大限度地减少 IP 块之间传输的数据量。

可以通过使用 drm_fourcc.h 中定义的 AFBC 格式修饰符,在支持它的驱动程序上启用 AFBC。请参阅 DRM_FORMAT_MOD_ARM_AFBC(*)。

所有 AFBC 修饰符的用户都必须遵循本文档中列出的使用指南,以确保不同 AFBC 生产者和消费者之间的兼容性。

组件和顺序

AFBC 流可以包含多个组件,其中组件对应于颜色通道(即 R、G、B、X、A、Y、Cb、Cr)。输入/输出颜色通道的分配在编码器和解码器之间必须一致才能正确操作,否则消费者会错误地解释解码后的数据。

此外,当使用无损色彩空间转换(AFBC_FORMAT_MOD_YTR,对于 RGB 缓冲区,应启用它以获得最大的压缩效率)时,组件顺序必须是

  • 组件 0:R

  • 组件 1:G

  • 组件 2:B

组件顺序通过 fourcc:modifier 对中的 fourcc 代码进行通信。一般来说,组件“0”被认为位于相应线性格式的最低有效位。例如,COMP(bits)

  • DRM_FORMAT_ABGR8888

    • 组件 0:R(8)

    • 组件 1:G(8)

    • 组件 2:B(8)

    • 组件 3:A(8)

  • DRM_FORMAT_BGR888

    • 组件 0:R(8)

    • 组件 1:G(8)

    • 组件 2:B(8)

  • DRM_FORMAT_YUYV

    • 组件 0:Y(8)

    • 组件 1:Cb(8, 2x1 子采样)

    • 组件 2:Cr(8, 2x1 子采样)

在 AFBC 中,“X”组件的处理方式与任何其他组件没有任何不同。因此,具有 fourcc DRM_FORMAT_XBGR8888 的 AFBC 缓冲区以 4 个组件进行编码,如下所示

  • DRM_FORMAT_XBGR8888

    • 组件 0:R(8)

    • 组件 1:G(8)

    • 组件 2:B(8)

    • 组件 3:X(8)

但是请注意,包含“浪费”的“X”通道不利于压缩效率,因此建议避免使用包含“X”位的格式。如果编码器/解码器需要/期望第四个组件,则建议改为使用具有 alpha 的等效格式,将所有 alpha 位设置为“1”。如果没有对第四个组件的要求,则可以使用不包含 alpha 的格式,例如 DRM_FORMAT_BGR888。

平面数量

通常在线性布局中为多平面的格式(例如 YUV 420)可以编码为单个或多个 AFBC 平面。与组件顺序一样,编码器和解码器必须就平面数量达成一致,才能正确解码缓冲区。fourcc 代码用于确定 AFBC 缓冲区中的编码平面数量,使其与线性(未修改)格式的平面数量相匹配。在每个平面内,组件顺序也遵循 fourcc 代码

例如

  • DRM_FORMAT_YUYV:nplanes = 1

    • 平面 0

      • 组件 0:Y(8)

      • 组件 1:Cb(8, 2x1 子采样)

      • 组件 2:Cr(8, 2x1 子采样)

  • DRM_FORMAT_NV12:nplanes = 2

    • 平面 0

      • 组件 0:Y(8)

    • 平面 1

      • 组件 0:Cb(8, 2x1 子采样)

      • 组件 1:Cr(8, 2x1 子采样)

跨设备互操作性

为了在设备之间获得最大的兼容性,下表定义了 AFBC 使能设备之间使用的规范格式。使用 AFBC 修饰符时,此处列出的格式必须完全按照指定使用。应避免使用未列出的格式。

AFBC 格式

Fourcc 代码

描述

平面/组件

DRM_FORMAT_ABGR2101010

每个组件 10 位 RGB,带 2 位 alpha

平面 0:4 个组件
  • 组件 0:R(10)

  • 组件 1:G(10)

  • 组件 2:B(10)

  • 组件 3:A(2)

DRM_FORMAT_ABGR8888

每个组件 8 位 RGB,带 8 位 alpha

平面 0:4 个组件
  • 组件 0:R(8)

  • 组件 1:G(8)

  • 组件 2:B(8)

  • 组件 3:A(8)

DRM_FORMAT_BGR888

每个组件 8 位 RGB

平面 0:3 个组件
  • 组件 0:R(8)

  • 组件 1:G(8)

  • 组件 2:B(8)

DRM_FORMAT_BGR565

每个组件 5/6 位 RGB

平面 0:3 个组件
  • 组件 0:R(5)

  • 组件 1:G(6)

  • 组件 2:B(5)

DRM_FORMAT_ABGR1555

每个组件 5 位 RGB,带 1 位 alpha

平面 0:4 个组件
  • 组件 0:R(5)

  • 组件 1:G(5)

  • 组件 2:B(5)

  • 组件 3:A(1)

DRM_FORMAT_VUY888

每个组件 8 位 YCbCr 444,单平面

平面 0:3 个组件
  • 组件 0:Y(8)

  • 组件 1:Cb(8)

  • 组件 2:Cr(8)

DRM_FORMAT_VUY101010

每个组件 10 位 YCbCr 444,单平面

平面 0:3 个组件
  • 组件 0:Y(10)

  • 组件 1:Cb(10)

  • 组件 2:Cr(10)

DRM_FORMAT_YUYV

每个组件 8 位 YCbCr 422,单平面

平面 0:3 个组件
  • 组件 0:Y(8)

  • 组件 1:Cb(8, 2x1 子采样)

  • 组件 2:Cr(8, 2x1 子采样)

DRM_FORMAT_NV16

每个组件 8 位 YCbCr 422,双平面

平面 0:1 个组件
  • 组件 0:Y(8)

平面 1:2 个组件
  • 组件 0:Cb(8, 2x1 子采样)

  • 组件 1:Cr(8, 2x1 子采样)

DRM_FORMAT_Y210

每个组件 10 位 YCbCr 422,单平面

平面 0:3 个组件
  • 组件 0:Y(10)

  • 组件 1:Cb(10, 2x1 子采样)

  • 组件 2:Cr(10, 2x1 子采样)

DRM_FORMAT_P210

每个组件 10 位 YCbCr 422,双平面

平面 0:1 个组件
  • 组件 0:Y(10)

平面 1:2 个组件
  • 组件 0:Cb(10, 2x1 子采样)

  • 组件 1:Cr(10, 2x1 子采样)

DRM_FORMAT_YUV420_8BIT

每个组件 8 位 YCbCr 420,单平面

平面 0:3 个组件
  • 组件 0:Y(8)

  • 组件 1:Cb(8, 2x2 子采样)

  • 组件 2:Cr(8, 2x2 子采样)

DRM_FORMAT_YUV420_10BIT

每个组件 10 位 YCbCr 420,单平面

平面 0:3 个组件
  • 组件 0:Y(10)

  • 组件 1:Cb(10, 2x2 子采样)

  • 组件 2:Cr(10, 2x2 子采样)

DRM_FORMAT_NV12

每个组件 8 位 YCbCr 420,双平面

平面 0:1 个组件
  • 组件 0:Y(8)

平面 1:2 个组件
  • 组件 0:Cb(8, 2x2 子采样)

  • 组件 1:Cr(8, 2x2 子采样)

DRM_FORMAT_P010

每个组件 10 位 YCbCr 420,双平面

平面 0:1 个组件
  • 组件 0:Y(10)

平面 1:2 个组件
  • 组件 0:Cb(10, 2x2 子采样)

  • 组件 1:Cr(10, 2x2 子采样)