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 亞取樣)