Android 13, ton eşleme işlemlerini tanımlayan ve SurfaceFlinger işlemi 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 çerçeve ile satıcılar arasında ekran ton eşleme algoritmalarını 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ığı, CPU destekli uygulamalar ve SkSL gölgelendiriciler içerir. Bunlar, GPU arka uçlu birleştirme için SurfaceFlinger tarafından ve ton eşleme arama tablosu (LUT) oluşturmak için HWC tarafından eklenebilir. libtonemap
giriş noktası, ToneMapper
arayüzünü uygulayan bir nesne döndüren android::tonemap::getToneMapper()
'dir.
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 işlem hattında 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, kaynak ve hedef veri alanı verildiğinde bir SkSL gölgelendirici dizesi
ToneMapper::generateTonemapGainShaderSkSL()
döndürür. SkSL gölgelendiricisi, SurfaceFlinger'ın GPU ile hızlandırılmış birleştirme bileşeni olanRenderEngine
için Skia uygulamasına bağlanır. Ayrıca,libhwui
'ye de bağlanan gölgelendirici sayesindeTextureView
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 yerleştirildiğinden gölgelendirici aşağıdaki kurallara uymalıdır:- Shader dizesi,
float libtonemap_LookupTonemapGain(vec3 linearRGB, vec3 xyz)
imzalı bir giriş noktasına sahip olmalıdır. BuradalinearRGB
, doğrusal alandaki RGB piksellerinin mutlak nit değeridir vexyz
,linearRGB
değerinin XYZ'ye dönüştürülmüş halidir. - Ç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ınain_libtonemap_
ön eki eklenmelidir.
- Shader dizesi,
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 veristruct
verildiğinde aşağıdakileri döndürür:Bir SkSL gölgelendiricisiyle bağlı olan üniformaların listesi.
Tekdüzen değerler
in_libtonemap_displayMaxLuminance
vein_libtonemap_inputMaxLuminance
. Bu değerler, girişinlibtonemap
olarak ölçeklendirilmesi ve çıkışın uygun şekilde normalleştirilmesi sırasında çerçeve gölgelendiricileri tarafından kullanılır.
Şu anda forma oluşturma işlemi, 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 titremeye 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.
Satıcıların herhangi bir çekirdek kodunu değiştirmesi gerekmez ancak uygun uygulama için birden fazla satıcının DPU ton eşleme algoritmalarıyla ilgili ayrıntıları paylaşması gerekir.
Doğrulama
Uygulamanızı doğrulamak için aşağıdaki adımları uygulayın:
Ekran sisteminizin desteklediği tüm HDR standartlarındaki (ör. HLG, HDR10, HDR10+ veya Dolby Vision) HDR videoları ekranda oynatın.
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, HWC uygulaması, RGBA1010102 veya P010 gibi HDR için opak 10 bit biçimleri desteklediğinde ancak GPU kompozisyonunun alfa desteği için RGBA8888 gibi 8 bit biçimde 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. Tipik bir geçici çözüm, daha düşük hassasiyetli yollarda titreme adımının olmasını sağlamaktır. Bu sayede hassasiyet farklılıkları insanlar tarafından daha az fark edilir.