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

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

Trước Android 13, các thao tác á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. Tuỳ thuộc vào đường dẫn kết xuất, đối với nội dung HDR, điều này dẫn đến sự không khớp về chất lượng hình ảnh, trong đó nội dung HDR được ánh xạ tông màu đến không gian đầu ra theo nhiều cách. Bạn có thể nhận biết điều này trong các trường hợp như xoay màn hình, khi chiến lược thành phần thay đổi giữa GPU và DPU, cũng như trong sự khác biệt về hành vi kết xuất giữa TextureView và SurfaceView.

Trang này mô tả giao diện, cách tuỳ chỉnh và thông tin xác thực của thư viện libtonemap.

Giao diện đến thư viện ánh xạ âm báo

Thư viện libtonemap chứa các phương thức triển khai được hỗ trợ bởi CPU và chương trình đổ bóng SkSL. Các phương thức này có thể được SurfaceFlinger cắm vào để kết hợp phần phụ trợ GPU và HWC để tạo bảng tra cứu ánh xạ tông màu (LUT). Điểm truy cập đến 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 chức năng sau:

  • Tạo một LUT ánh xạ âm điệu

    Giao diện ToneMapper::lookupTonemapGain là quá trình triển khai CPU của chương trình đổ bóng được xác định trong libtonemap_LookupTonemapGain(). Phương thức này được các bài kiểm thử đơn vị trong khung sử dụng và các đối tác có thể sử dụng để hỗ trợ việc tạo LUT ánh xạ tông màu bên trong quy trình xử lý màu.

    libtonemap_LookupTonemapGain() lấy các giá trị màu trong không gian tuyến tính tuyệt đối, không chuẩn hoá, cả trong RGB tuyến tính và XYZ, đồng thời trả về một số thực độ chính xác đơn mô tả số lượng màu cần nhân cho màu đầu vào trong không gian tuyến tính.

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

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

    • Chuỗi chương trình đổ bóng phải có một điểm truy cập có chữ ký float libtonemap_LookupTonemapGain(vec3 linearRGB, vec3 xyz), trong đó linearRGB là giá trị của nits 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.
    • Mọi phương thức trợ giúp mà chuỗi chương trình đổ bóng sử dụng phải có tiền tố là chuỗi libtonemap_ để các định nghĩa chương trình đổ bóng khung không xung đột. Tương tự, dữ liệu đồng nhất đầu vào phải có tiền tố là in_libtonemap_.
  • Tạo đồng phục SkSL

    Giao diện ToneMapper::generateShaderSkSLUniforms() trả về nội dung sau, với siêu dữ liệu struct mô tả siêu dữ liệu từ nhiều tiêu chuẩn HDR và điều kiện hiển thị:

    • Danh sách các loại đồng phục chịu sự ràng buộc của chương trình đổ bóng SkSL.

    • Các giá trị đồng nhất in_libtonemap_displayMaxLuminancein_libtonemap_inputMaxLuminance. Các giá trị này được chương trình đổ bóng khung sử dụng khi điều chỉnh tỷ lệ đầu vào thành libtonemap và chuẩn hoá đầu ra nếu có thể.

    Hiện tại, quy 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.

Tuỳ chỉnh

Việc triển khai tham chiếu của thư viện libtonemap tạo ra kết quả chấp nhận được. Tuy nhiên, vì thuật toán ánh xạ tông màu mà thành phần GPU sử dụng có thể khác với thuật toán mà thành phần DPU sử dụng, nên việc 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ư ảnh động xoay. Tính năng tuỳ chỉnh có thể giải quyết các vấn đề về chất lượng hình ảnh dành riêng cho nhà cung cấp.

Các nhà sản xuất thiết bị gốc (OEM) nên ghi đè quá trình triển khai libtonemap để xác định lớp con ToneMapper của riêng họ. Lớp con này do getToneMapper() trả về. Khi tuỳ chỉnh việc triển khai, đối tác cần làm một trong những việc sau:

  • Trực tiếp sửa đổi phương thứ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 tuỳ chỉnh của họ.

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

Xác nhận kết quả

Hãy làm theo các bước sau để xác thực quá trình triển khai:

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

  2. Bật/tắt thành phần GPU để đảm bảo người dùng không nhận biết được tình trạng nhấp nháy.

    Sử dụng lệnh adb sau để bật/tắt 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 đề thường gặp

Việc triển khai này có thể gặp phải các vấn đề sau:

  • Băng tần 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ụ: hiện tượng banding có thể xảy ra khi quá trình 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 tinh tế là do sự khác biệt về lượng tử hoá nếu DPU hoạt động ở độ chính xác khác với GPU.

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