Android 13, ton eşleme işlemlerini tanımlayan ve SurfaceFlinger işlemi ile Donanım Bestecisi (HWC) uygulamalarıyla paylaşılan, tedarikçi firma tarafından yapılandırılabilir libtonemap
adlı statik bir kitaplık sunar.
Bu özellik, OEM'lerin ekran ton eşleme algoritmalarını çerçeve ve tedarikçiler arasında tanımlayıp paylaşmasını sağlayarak ton eşlemede uyuşmazlığı azaltır.
Android 13'ten önce, ekrana özgü ton eşleme işlemleri HWC, SurfaceFlinger ve uygulamalar arasında paylaşılmazdı. Oluşturma yoluna bağlı olarak HDR içerikte bu durum, HDR içeriğin farklı şekillerde bir çıkış alanıyla ton eşlenmesiyle görüntü kalitesinde uyuşmazlıklara yol açıyordu. Bu durum, GPU ile DPU arasında kompozisyon stratejisinin değiştiği ekran döndürme gibi senaryolarda ve TextureView ile SurfaceView arasındaki oluşturma davranışındaki farklılıklarda fark edilebilir.
Bu sayfada, libtonemap
kitaplığının arayüzü, özelleştirmesi ve doğrulama ayrıntıları açıklanmaktadır.
Ton eşleme kitaplığı 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ölgelendiricileri içerir. libtonemap
giriş noktası android::tonemap::getToneMapper()
'dir. Bu giriş noktası, ToneMapper
arayüzünü uygulayan bir nesne döndürür.
ToneMapper
arayüzü aşağıdaki özellikleri destekler:
Ton eşleme LUT'u oluşturma
ToneMapper::lookupTonemapGain
arayüzü,libtonemap_LookupTonemapGain()
içinde tanımlanan gölgelendiricinin CPU uygulamasıdır. Bu sınıf, çerçevedeki birim testleri tarafından kullanılır ve iş ortakları tarafından renk ardışık düzeninde ton eşleme LUT oluşturma konusunda yardım almak için kullanılabilir.libtonemap_LookupTonemapGain()
, renk değerlerini hem doğrusal RGB hem de XYZ'de mutlak, normalleştirilmemiş doğrusal alanda alır ve giriş renklerinin doğrusal alanda ne kadar çarpılacağını açıklayan bir kayan nokta döndürür.SkSL gölgelendirici oluşturma
ToneMapper::generateTonemapGainShaderSkSL()
arayüzü, bir kaynak ve hedef veri alanı verildiğinde SkSL gölgelendirici dizesi döndürür. SkSL gölgelendirici, SurfaceFlinger için GPU ile hızlandırılmış birleştirme bileşeni olanRenderEngine
için Skia uygulamasına takılır. Gölgelendirici, HDR'den SDR'ye ton eşlemeninTextureView
için verimli bir şekilde gerçekleştirilebilmesi amacıylalibhwui
'e de takılır. Oluşturulan dize, Skia tarafından kullanılan diğer SkSL gölgelendiricilere satır içi olarak eklendiğinden gölgelendirici aşağıdaki kurallara uymalıdır:- Gölgelendirici dizesinde
float libtonemap_LookupTonemapGain(vec3 linearRGB, vec3 xyz)
imzalı bir giriş noktası olmalıdır. Bu imzadakilinearRGB
, doğrusal alandaki RGB piksellerinin mutlak nit değerini,xyz
iselinearRGB
değerinin XYZ'ye dönüştürülmüş halini ifade eder. - Ç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ının önünein_libtonemap_
eklenmelidir.
- Gölgelendirici dizesinde
SkSL üniformaları oluşturma
ToneMapper::generateShaderSkSLUniforms()
arayüzü, farklı HDR standartlarından ve görüntüleme koşullarından gelen meta verileri açıklayan bir meta veristruct
verildiğinde aşağıdakileri döndürür:SkSL gölgelendiricisine bağlı üniformaların listesi.
in_libtonemap_displayMaxLuminance
vein_libtonemap_inputMaxLuminance
tekdüze değerleri. Bu değerler, girişilibtonemap
olarak ölçeklendirirken ve çıkışı uygun şekilde normalleştirirken çerçeve gölgelendiricileri tarafından kullanılır.
Şu anda üniforma oluşturma işlemi, giriş ve çıkış veri alanına göre değişmiyor.
Özelleştirme
libtonemap
kitaplığının referans uygulaması kabul edilebilir sonuçlar verir. Ancak GPU kompozisyonu tarafından kullanılan ton eşleme algoritması, DPU kompozisyonu tarafından kullanılandan farklı olabileceğinden, referans uygulamanın kullanılması, dönme animasyonu gibi bazı senaryolarda titreşime neden olabilir. Özelleştirme, tedarikçiye özgü bu tür resim kalitesi sorunlarını çözebilir.
OEM'lerin, getToneMapper()
tarafından döndürülen kendi ToneMapper
alt sınıfını tanımlamak için libtonemap
uygulamasını geçersiz kılmalarının önemle tavsiye edilir.
İş ortaklarının uygulamayı özelleştirirken aşağıdakilerden birini yapması beklenir:
libtonemap
öğesinin uygulanması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.
Tedarikçi firmaların herhangi bir çekirdek kodunu değiştirmesi gerekmez ancak düzgün bir şekilde uygulanması için birden fazla tedarikçi firmanı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 HDR standartlarında (ör. HLG, HDR10, HDR10+ veya DolbyVision) HDR videoları oynatın.
Kullanıcı tarafından algılanabilir titreme olmaması için GPU kompozisyonunu açın veya kapatın.
GPU bileşimini 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>
Genel sorunlar
Bu uygulamada aşağıdaki sorunlar ortaya çıkabilir:
Bantlar, GPU kompozisyonu tarafından kullanılan oluşturma hedefinin HDR içeriği için tipik değerden daha düşük hassasiyete sahip olmasından kaynaklanır. Örneğin, bir HWC uygulaması HDR için RGBA1010102 veya P010 gibi opak 10 bit biçimleri desteklediğinde ancak alfayı desteklemek için GPU kompozisyonunun RGBA8888 gibi 8 bitlik bir biçime yazmasını gerektirdiğinde şeritlenme oluşabilir.
DPU, GPU'dan farklı bir hassasiyetle çalışıyorsa küçük bir renk kayması, kesme farklılıklarından kaynaklanır.
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 bir dithering adımı olmasını sağlamaktır. Bu sayede, hassasiyet farklılıkları insan tarafından daha az algılanabilir hale gelir.