映射 HDR 亮度與 SDR 相容範圍

Android 13 導入了供應商可設定的靜態值 名為 libtonemap 的程式庫,用於定義色調對應作業,而且會共用 執行 SurfaceFlinger 程序 並實作 Hardware Composer (HWC) 的過程 這項功能可讓原始設備製造商 (OEM) 定義及分享螢幕色調對應 將架構和供應商之間的演算法納入考量,進而減少語意不一致的問題 對應。

在 Android 13 以下版本中,螢幕專屬色調對應 HWC、SurfaceFlinger 和應用程式之間就無法共用作業。視情況而定 導致圖像品質不一致的問題 HDR 內容會以不同方式對應至輸出空間。這個 可清楚辨識的情境,例如螢幕旋轉、組成 GPU 和 DPU 之間的策略差異,以及轉譯方式差異 TextureView 和 SurfaceView 之間的行為

本頁將說明 libtonemap 程式庫。

色調對應程式庫的介面

libtonemap 程式庫包含受 CPU 支援的實作項目和 SkSL 著色器,可 由 SurfaceFlinger 插入以用於 GPU 後端組合,而是由 HWC 插入 產生色調對應查詢表 (LUT)。libtonemap 的進入點 是 android::tonemap::getToneMapper(),只會傳回 實作 ToneMapper 介面。

ToneMapper 介面支援下列功能:

  • 產生色調對應 LUT

    ToneMapper::lookupTonemapGain 介面是 CPU libtonemap_LookupTonemapGain() 中定義的著色器實作。這個 提供給架構中的單元測試使用,可由合作夥伴用於 協助在其色彩管道中產生色調對應 LUT。

    libtonemap_LookupTonemapGain() 會採用絕對顏色值 並透過線性 RGB 和 XYZ 進行非正規化線性空間,然後傳回浮點值 描述在線性空間中,輸入色彩的乘數。

  • 產生 SkSL 著色器

    ToneMapper::generateTonemapGainShaderSkSL() 介面會傳回 為來源和目的地資料空間給定的 SkSL 著色器字串。SkSL 著色器是 插入 RenderEngine 的 Skia 實作項目。 適用於 SurfaceFlinger 的 GPU 加速合成元件著色器 已插入libhwui, 以便有效率地為 TextureView 執行 HDR 轉 SDR 色調對應作業。 由於產生的字串會內嵌到 Skia 使用的其他 SkSL 著色器中, 著色器必須遵循下列規則:

    • 著色器字串必須包含進入點,並加上 float libtonemap_LookupTonemapGain(vec3 linearRGB, vec3 xyz)簽名,其中 linearRGB 是線性空間中 RGB 像素的絕對 nit 值 和 xyzlinearRGB轉換成 XYZ。
    • 著色器字串使用的所有輔助方法都必須前面加上 字串 libtonemap_,這樣架構著色器定義就不會衝突。 同樣地,輸入統一編號的開頭必須加上 in_libtonemap_
  • 產生 SkSL 制服

    ToneMapper::generateShaderSkSLUniforms() 介面會傳回 擷取自一個中繼資料 struct,用來說明來自不同 HDR 的中繼資料 標準和顯示條件

    • 受 SkSL 著色器繫結的製服清單。

    • 統一值 in_libtonemap_displayMaxLuminancein_libtonemap_inputMaxLuminance。這些值會供架構著色器使用 將輸入縮放為 libtonemap 的情況,並將輸出內容正規化為

    目前產生統一表單的程序並不侷限於輸入內容, 輸出資料空間

自訂

libtonemap 程式庫的參照實作會產生可接受的結果。不過 因為 GPU 組合使用的色調對應演算法 DPU 組成組合,使用參照實作可能會導致 在某些情況下 (例如旋轉動畫) 會出現閃爍情形。自訂可以 解決這類供應商特有的圖片品質問題

強烈建議原始設備製造商 (OEM) 覆寫 libtonemap 的實作,以便 定義自己的 ToneMapper 子類別,這個子類別由 getToneMapper() 傳回。 自訂實作方式時,合作夥伴應採取下列其中一種做法: 包括:

  • 直接修改 libtonemap 的實作方式。
  • 定義自己的靜態程式庫,將程式庫編譯成獨立程式庫,並且 將 libtonemap 程式庫的 .a 檔案替換為根據自訂內容產生的檔案 資源庫。

供應商不需要修改任何核心程式碼,但多個供應商必須 提供詳細的 DPU 色調對應演算法資訊 。

驗證

請按照下列步驟驗證導入狀態:

  1. 螢幕只要符合螢幕系統支援的任何 HDR 標準,即可播放 HDR 影片。 例如 HLG、HDR10、HDR10+ 或 DolbyVision。

  2. 切換 GPU 組合,確保使用者不會察覺發生閃爍情形。

    使用下列 adb 指令切換 GPU 組合:

    adb shell service call SurfaceFlinger 1008 i32 <0 to enable HWC composition,
    1 to force GPU composition>
    
    

常見問題

這種導入方式可能發生下列問題:

  • 當 GPU 組合使用的轉譯目標低於 比 HDR 內容的一般值更精確例如,帶狀網路 當 HWC 實作支援不透明 10 位元的 HDR 格式時, RGBA1010102 或 P010,但要求 GPU 組合寫入 8 位元格式 以便支援 alphaA8888

  • 如果 DPU 則因量化差異而產生細微的色彩轉變, 作業的精確度與 GPU 不同。

這些問題都與 基礎硬體典型的解決方法就是確保 步驟,將任何精確度差異都降低至人為模型 一般認為。