SDR uyumlu Aralığa Ton Eşleme HDR Parlaklığı

Android 13, ton eşleme işlemlerini tanımlayan ve SurfaceFlinger işlemi ve Hardware Composer (HWC) uygulamalarıyla paylaşılan, libtonemap adı verilen satıcı tarafından yapılandırılabilir bir statik kitaplık sunar. Bu özellik, OEM'lerin çerçeve ve satıcılar arasında ekran tonu eşleme algoritmalarını tanımlamasına ve paylaşmasına olanak tanıyarak ton eşlemedeki uyumsuzluğu azaltır.

Android 13'ten önce ekrana özel ton eşleme işlemleri HWC, SurfaceFlinger ve uygulamalar arasında paylaşılmıyordu. HDR içeriği için işleme yoluna bağlı olarak bu durum, HDR içeriğinin bir çıkış alanına farklı şekillerde ton eşlemesi yaptığı görüntü kalitesinde uyumsuzluklara yol açtı. Bu, kompozisyon stratejisinin GPU ile DPU arasında değiştiği ekran döndürme gibi senaryolarda ve TextureView ile SurfaceView arasındaki işleme davranışındaki farklılıklarda farkedildi.

Bu sayfada libtonemap kütüphanesinin arayüzü, özelleştirmesi ve doğrulama ayrıntıları açıklanmaktadır.

Ton eşleme kitaplığına arayüz

libtonemap kitaplığı, GPU arka uç kompozisyonu için SurfaceFlinger tarafından ve ton eşleme arama tablosu (LUT) oluşturmak için HWC tarafından takılabilen CPU destekli uygulamaları ve SkSL gölgelendiricilerini içerir. libtonemap giriş noktası, ToneMapper arayüzünü uygulayan bir nesneyi döndüren android::tonemap::getToneMapper() dır.

ToneMapper arayüzü aşağıdaki yetenekleri destekler:

  • Ton eşlemeli LUT oluşturun

    ToneMapper::lookupTonemapGain arayüzü, libtonemap_LookupTonemapGain() içinde tanımlanan gölgelendiricinin CPU uygulamasıdır. Bu, çerçevedeki birim testleri tarafından kullanılır ve iş ortakları tarafından, renk ardışık düzenlerinde ton eşlemeli bir LUT oluşturmaya yardımcı olmak için kullanılabilir.

    libtonemap_LookupTonemapGain() hem doğrusal RGB hem de XYZ'de mutlak, normalleştirilmemiş doğrusal alanda renk değerlerini alır ve giriş renklerinin doğrusal alanda ne kadar çarpılacağını açıklayan bir kayan nokta döndürür.

  • Bir SkSL gölgelendiricisi oluşturun

    ToneMapper::generateTonemapGainShaderSkSL() arayüzü, kaynak ve hedef veri alanı verildiğinde bir SkSL gölgelendirici dizesi döndürür. SkSL gölgelendiricisi, SurfaceFlinger'ın GPU hızlandırmalı birleştirme bileşeni olan RenderEngine için Skia uygulamasına takılıdır. Gölgelendirici ayrıca libhwui takılı olduğundan HDR'den SDR'ye ton eşlemesi TextureView için verimli bir şekilde gerçekleştirilebilir. Oluşturulan dize Skia tarafından kullanılan diğer SkSL gölgelendiricilerle aynı hizada olduğundan, gölgelendiricinin aşağıdaki kurallara uyması gerekir:

    • Gölgelendirici dizesinin float libtonemap_LookupTonemapGain(vec3 linearRGB, vec3 xyz) imzasına sahip bir giriş noktası olması gerekir; burada linearRGB doğrusal uzaydaki RGB piksellerinin mutlak nitlerinin değeridir ve xyz , XYZ'ye dönüştürülmüş linearRGB .
    • Çerçeve gölgelendirici tanımlarının çakışmaması için, gölgelendirici dizesi tarafından kullanılan herhangi bir yardımcı yöntemin önüne libtonemap_ eklenmelidir. Benzer şekilde, giriş üniformalarının önüne in_libtonemap_ eklenmelidir.
  • SkSL üniformaları oluşturun

    ToneMapper::generateShaderSkSLUniforms() arayüzü, farklı HDR standartlarından ve görüntüleme koşullarından meta verileri açıklayan bir meta veri struct verildiğinde aşağıdakileri döndürür:

    • Bir SkSL gölgelendiricisi tarafından bağlanan üniformaların listesi.

    • in_libtonemap_displayMaxLuminance ve in_libtonemap_inputMaxLuminance tek tip değerler. Bu değerler, girdiyi libtonemap olarak ölçeklendirirken ve çıktıyı uygun şekilde normalleştirirken çerçeve gölgelendiricileri tarafından kullanılır.

    Şu anda üniforma oluşturma süreci giriş ve çıkış veri alanından bağımsızdır.

Özelleştirme

libtonemap kütüphanesinin referans uygulaması kabul edilebilir sonuçlar üretir. Ancak GPU kompozisyonu tarafından kullanılan ton eşleme algoritması DPU kompozisyonu tarafından kullanılandan farklı olabileceğinden referans uygulamasının kullanılması, döndürme animasyonu gibi bazı senaryolarda titremeye neden olabilir. Özelleştirme, satıcıya özgü bu tür görüntü kalitesi sorunlarını çözebilir.

OEM'lerin getToneMapper() tarafından döndürülen kendi ToneMapper alt sınıflarını tanımlamak için libtonemap uygulamasını geçersiz kılmaları şiddetle tavsiye edilir. Uygulamayı özelleştirirken iş ortaklarının aşağıdakilerden birini yapması beklenir:

  • libtonemap uygulamasını doğrudan değiştirin.
  • Kendi statik kitaplıklarını tanımlayın, kitaplığı bağımsız olarak derleyin ve libtonemap kitaplığının .a dosyasını kendi özel kitaplığından oluşturulan dosyayla değiştirin.

Satıcıların herhangi bir çekirdek kodunu değiştirmesine gerek yoktur, ancak birden fazla satıcının, doğru uygulama için DPU ton eşleme algoritmaları hakkındaki ayrıntıları iletmesi gerekir.

Doğrulama

Uygulamanızı doğrulamak için şu adımları izleyin:

  1. HDR videolarını , görüntüleme sisteminizin desteklediği HLG, HDR10, HDR10+ veya DolbyVision gibi herhangi bir HDR standardındaki ekranda oynatın.

  2. Kullanıcının algılayabileceği bir titreme olmadığından emin olmak için GPU kompozisyonunu değiştirin.

    GPU kompozisyonunu değiştirmek için aşağıdaki adb komutunu kullanın:

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

Ortak sorunlar

Bu uygulamada aşağıdaki sorunlar ortaya çıkabilir:

  • Bantlanma, GPU kompozisyonu tarafından kullanılan oluşturma hedefinin HDR içeriğinin tipik değerinden daha düşük hassasiyette olması nedeniyle ortaya çıkar. Örneğin, bir HWC uygulaması HDR için RGBA1010102 veya P010 gibi opak 10 bitlik formatları desteklediğinde, ancak alfayı desteklemek için GPU kompozisyonunun RGBA8888 gibi 8 bitlik bir formata yazmasını gerektirdiğinde bantlama meydana gelebilir.

  • DPU'nun GPU'dan farklı bir hassasiyette çalışması durumunda nicemleme farkları nedeniyle hafif bir renk kayması meydana gelir.

Bu sorunların her biri, temeldeki donanımın göreceli hassasiyet farklılıklarıyla ilgilidir. Tipik bir geçici çözüm, daha düşük hassasiyetli yollarda bir titreme adımının olmasını sağlamak ve böylece hassasiyet farklılıklarını insanlar tarafından daha az algılanabilir hale getirmektir.