Ánh xạ tông màu HDR Luminance thành một phạm vi tương thích với SDR

Android 13 giới thiệu một thư viện tĩnh do nhà cung cấp cấu hình có tên là libtonemap . Thư viện này xác định các hoạt động ánh xạ giai điệu và được chia sẻ với quy trình SurfaceFlinger và hoạt động triển khai Trình soạn thảo phần cứng (HWC). Tính năng này cho phép các OEM xác định và chia sẻ các thuật toán ánh xạ tông màu hiển thị của họ giữa khung và nhà cung cấp, giảm bớt sự không khớp trong ánh xạ tông màu.

Trước Android 13, các hoạt động ánh xạ tông màu dành riêng cho màn hình không được chia sẻ giữa HWC, SurfaceFlinger và các ứng dụng. Tùy thuộc vào đường dẫn hiển thị, đối với nội dung HDR, điều này dẫn đến chất lượng hình ảnh không khớp, trong đó nội dung HDR được ánh xạ tông màu tới không gian đầu ra theo nhiều cách khác nhau. Điều này có thể nhận thấy rõ trong các tình huống như xoay màn hình, trong đó chiến lược bố cục thay đổi giữa GPU và DPU cũng như trong sự khác biệt về hành vi hiển thị giữa TextView và SurfaceView.

Trang này mô tả chi tiết về giao diện, tùy chỉnh và xác thực của thư viện libtonemap .

Giao diện với thư viện ánh xạ giai điệu

Thư viện libtonemap chứa các triển khai được CPU hỗ trợ và trình tạo bóng SkSL, có thể được SurfaceFlinger cắm vào để tạo thành phần phụ trợ GPU và bởi HWC để tạo bảng tra cứu ánh xạ giai điệu (LUT). Điểm vào libtonemapandroid::tonemap::getToneMapper() , trả về một đối tượng triển khai giao diện ToneMapper .

Giao diện ToneMapper hỗ trợ các khả năng sau:

  • Tạo LUT ánh xạ giai điệu

    Giao diện ToneMapper::lookupTonemapGain là một triển khai CPU của trình đổ bóng được xác định trong libtonemap_LookupTonemapGain() . Điều này được sử dụng bởi các thử nghiệm đơn vị trong khung và có thể được các đối tác sử dụng để hỗ trợ tạo LUT ánh xạ tông màu bên trong đường dẫn màu của họ.

    libtonemap_LookupTonemapGain() nhận các giá trị màu trong không gian tuyến tính tuyệt đối, không chuẩn hóa, cả trong RGB tuyến tính và XYZ, đồng thời trả về một số float mô tả mức độ nhân các màu đầu vào trong không gian tuyến tính.

  • Tạo trình đổ bóng SkSL

    Giao diện ToneMapper::generateTonemapGainShaderSkSL() trả về chuỗi trình đổ bóng SkSL, được cung cấp không gian dữ liệu nguồn và đích. Trình tạo bóng SkSL được tích hợp vào quá trình triển khai Skia cho RenderEngine , thành phần tổng hợp được tăng tốc GPU cho SurfaceFlinger. Trình đổ bóng cũng được cắm vào libhwui để có thể thực hiện ánh xạ tông màu HDR sang SDR một cách hiệu quả cho TextureView . Vì chuỗi được tạo được xếp thẳng hàng vào các trình đổ bóng SkSL khác được Skia sử dụng nên trình đổ bóng phải tuân thủ các quy tắc sau:

    • Chuỗi trình đổ bóng phải có điểm vào có chữ ký float libtonemap_LookupTonemapGain(vec3 linearRGB, vec3 xyz) , trong đó linearRGB là giá trị nit tuyệt đối của các pixel RGB trong không gian tuyến tính và xyzlinearRGB được chuyển đổi thành XYZ.
    • Bất kỳ phương thức trợ giúp nào được chuỗi trình đổ bóng sử dụng đều phải có tiền tố là chuỗi libtonemap_ để các định nghĩa về trình đổ bóng khung không xung đột. Tương tự, đồng phục đầu vào phải có tiền tố in_libtonemap_ .
  • Tạo đồng phục SkSL

    Giao diện ToneMapper::generateShaderSkSLUniforms() trả về thông tin sau, dựa trên struct siêu dữ liệu mô tả siêu dữ liệu từ các tiêu chuẩn HDR và ​​​​điều kiện hiển thị khác nhau:

    • Danh sách đồng phục được ràng buộc bởi trình đổ bóng SkSL.

    • Các giá trị thống nhất in_libtonemap_displayMaxLuminancein_libtonemap_inputMaxLuminance . Các giá trị này được trình đổ bóng khung sử dụng khi chia tỷ lệ đầu vào thành libtonemap và chuẩn hóa đầu ra nếu có.

    Hiện tại, quá trình tạo đồng phục không phụ thuộc vào không gian dữ liệu đầu vào và đầu ra.

Tùy chỉnh

Việc triển khai tham chiếu thư viện libtonemap tạo ra kết quả có thể chấp nhận được. Tuy nhiên, do thuật toán ánh xạ giai điệu được sử dụng bởi thành phần GPU có thể khác với thuật toán được sử dụng bởi thành phần DPU, nên việc sử dụng triển khai tham chiếu có thể gây ra hiện tượng nhấp nháy trong một số trường hợp, chẳng hạn như hoạt ảnh xoay. Việc tùy chỉnh có thể giải quyết các vấn đề về chất lượng hình ảnh cụ thể của nhà cung cấp.

Các OEM được khuyến khích ghi đè việc triển khai libtonemap để xác định lớp con ToneMapper của riêng họ, được trả về bởi getToneMapper() . Khi tùy chỉnh việc triển khai, các đối tác phải thực hiện một trong những thao tác sau:

  • Sửa đổi trực tiếp việc triển khai libtonemap .
  • Xác định thư viện tĩnh của riêng họ, biên dịch thư viện dưới dạng độc lập và thay thế tệp .a của thư viện libtonemap bằng tệp được tạo từ thư viện tùy chỉnh của họ.

Các nhà cung cấp không cần sửa đổi bất kỳ mã hạt nhân nào, nhưng nhiều nhà cung cấp phải truyền đạt thông tin chi tiết về các thuật toán ánh xạ giai điệu DPU để triển khai đúng cách.

Thẩm định

Hãy làm theo các bước sau để xác thực việc triển khai của bạn:

  1. Phát video HDR trên màn hình theo bất kỳ tiêu chuẩn HDR nào mà hệ thống hiển thị của bạn hỗ trợ , chẳng hạn như HLG, HDR10, HDR10+ hoặc DolbyVision.

  2. Chuyển đổi thành phần GPU để đảm bảo rằng người dùng không nhận thấy hiện tượng nhấp nháy.

    Sử dụng lệnh adb sau để chuyển đổi thành phần GPU:

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

Các vấn đề chung

Các vấn đề sau có thể xảy ra với việc triển khai này:

  • Dải xảy ra khi mục tiêu kết xuất mà thành phần GPU sử dụng có độ chính xác thấp hơn giá trị thông thường cho nội dung HDR. Ví dụ: việc tạo dải có thể xảy ra khi triển khai HWC hỗ trợ các định dạng 10 bit mờ cho HDR như RGBA1010102 hoặc P010, nhưng yêu cầu thành phần GPU đó ghi vào định dạng 8 bit như RGBA8888 để hỗ trợ alpha.

  • Sự thay đổi màu sắc khó nhận thấy là do sự khác biệt về lượng tử hóa nếu DPU hoạt động ở độ chính xác khác với GPU.

Mỗi vấn đề này đều liên quan đến sự khác biệt về độ chính xác tương đối của phần cứng cơ bản. Một cách giải quyết điển hình là đảm bảo rằng có một bước phối màu trong các đường dẫn có độ chính xác thấp hơn, khiến mọi khác biệt về độ chính xác mà con người khó nhận ra hơn.