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 亚采样)