HDR Parlaklığını SDR Uyumlu Bir Aralıkla Ton Eşleme

Android 13, ton eşleme işlemlerini tanımlayan ve SurfaceFlinger süreci ile Hardware Composer (HWC) uygulamalarıyla paylaşılan libtonemap adlı, satıcı tarafından yapılandırılabilen statik bir kitaplık sunar. Bu özellik, OEM'lerin ekran ton eşleme algoritmalarını çerçeve ve satıcılar arasında tanımlayıp paylaşmasına olanak tanıyarak ton eşlemede uyuşmazlıkları azaltır.

Android 13'ten önce, ekrana özel ton eşleme işlemleri HWC, SurfaceFlinger ve uygulamalar arasında paylaşılmıyordu. Render yoluna bağlı olarak, HDR içeriklerde görüntü kalitesinde uyuşmazlıklar oluşuyordu. Bu durumda, HDR içerik farklı şekillerde bir çıkış alanına ton eşleniyordu. Bu durum, kompozisyon stratejisinin GPU ile DPU arasında değiştiği ekran döndürme gibi senaryolarda ve TextureView ile SurfaceView arasındaki oluşturma davranışındaki farklılıklarda fark ediliyordu.

Bu sayfada, libtonemap kitaplığının arayüzü, özelleştirme ve doğrulama ayrıntıları açıklanmaktadır.

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

libtonemap kitaplığı, SurfaceFlinger tarafından GPU arka uç bileşimi için ve HWC tarafından ton eşleme arama tablosu (LUT) oluşturmak için eklenebilen CPU destekli uygulamalar ve SkSL gölgelendiriciler içerir. libtonemap giriş noktası, android::tonemap::getToneMapper()'dir. Bu, ToneMapper arayüzünü uygulayan bir nesne döndürür.

ToneMapper arayüzü aşağıdaki özellikleri destekler:

  • Ton eşleme LUT'si oluşturma

    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üzeninde ton eşleme LUT'si oluşturma konusunda yardımcı olmak için kullanılabilir.

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

  • SkSL gölgelendirici oluşturma

    Arayüz, ToneMapper::generateTonemapGainShaderSkSL() kaynak ve hedef veri alanı verildiğinde bir SkSL gölgelendirici dizesi döndürür. SkSL gölgelendiricisi, SurfaceFlinger'ın GPU ile hızlandırılmış birleştirme bileşeni olan RenderEngine için Skia uygulamasına bağlanır. Ayrıca, libhwui'ye de bağlanan gölgelendirici sayesinde TextureView için HDR-SDR ton eşleme işlemi verimli bir şekilde gerçekleştirilebilir. Oluşturulan dize, Skia tarafından kullanılan diğer SkSL gölgelendiricilerine satır içi olarak yerleştirildiğinden gölgelendirici aşağıdaki kurallara uymalıdır:

    • Gölgelendirici dizesi, float libtonemap_LookupTonemapGain(vec3 linearRGB, vec3 xyz) imzalı bir giriş noktasına sahip olmalıdır. Burada float libtonemap_LookupTonemapGain(vec3 linearRGB, vec3 xyz), doğrusal alandaki RGB piksellerinin mutlak nit değeridir ve xyz, linearRGB değerinin XYZ'ye dönüştürülmüş halidir.linearRGB
    • Çerçeve gölgelendirici tanımlarının çakışmaması için gölgelendirici dizesi tarafından kullanılan tüm yardımcı yöntemlerin başına libtonemap_ dizesi eklenmelidir. Benzer şekilde, giriş üniformaları in_libtonemap_ ile başlamalıdır.
  • SkSL üniformaları oluşturma

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

    • Bir SkSL gölgelendiricisiyle bağlı olan üniformaların listesi.

    • Tekdüze değerler in_libtonemap_displayMaxLuminance ve in_libtonemap_inputMaxLuminance. Bu değerler, girişin libtonemap olarak ölçeklendirilmesi ve çıkışın uygun şekilde normalleştirilmesi sırasında ç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 kitaplığının referans uygulaması kabul edilebilir sonuçlar üretiyor. Ancak, GPU kompozisyonu tarafından kullanılan ton eşleme algoritması, DPU kompozisyonu tarafından kullanılan algoritmadan farklı olabileceğinden referans uygulamanın kullanılması, döndürme animasyonu gibi bazı senaryolarda titreşime neden olabilir. Özelleştirme, satıcıya özel bu tür resim kalitesi sorunlarını çözebilir.

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

  • libtonemap uygulamasını doğrudan değiştirebilirsiniz.
  • Kendi statik kitaplıklarını tanımlayabilir, kitaplığı bağımsız olarak derleyebilir ve libtonemap kitaplığının .a dosyasını, özel kitaplıklarından oluşturulan dosyayla değiştirebilirler.

Sağlayıcıların herhangi bir çekirdek kodunu değiştirmesi gerekmez ancak doğru uygulama için birden fazla sağlayıcının DPU ton eşleme algoritmalarıyla ilgili ayrıntıları iletmesi gerekir.

Doğrulama

Uygulamanızı doğrulamak için aşağıdaki adımları uygulayın:

  1. Ekran sisteminizin desteklediği HLG, HDR10, HDR10+ veya Dolby Vision gibi HDR standartlarındaki HDR videoları ekranda oynatın.

  2. Kullanıcı tarafından fark edilebilecek bir titreme olmaması için GPU bileşimini etkinleştirin.

    GPU bileşimini etkinleştirmek veya devre dışı bırakmak 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>
    
    

Genel sorunlar

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

  • Bantlanma, GPU bileşimi tarafından kullanılan oluşturma hedefi, HDR içerik için tipik değerden daha düşük hassasiyette olduğunda meydana gelir. Örneğin, bir HWC uygulaması HDR için opak 10 bit biçimleri (RGBA1010102 veya P010 gibi) desteklediğinde ancak alfa desteği için GPU kompozisyonunun RGBA8888 gibi 8 bit biçiminde yazmasını gerektirdiğinde bantlanma oluşabilir.

  • DPU, GPU'dan farklı bir hassasiyette çalışıyorsa nicemleme farklılıkları nedeniyle hafif bir renk kayması oluşur.

Bu sorunların her biri, temel donanımın göreceli hassasiyet farklılıklarıyla ilgilidir. Genellikle, daha düşük hassasiyetli yollarda titretme adımı olduğundan emin olunarak hassasiyet farklılıklarının insanlar tarafından daha az fark edilmesi sağlanır.