Android 13, ton eşleme işlemlerini tanımlayan ve SurfaceFlinger süreci ile Donanım Oluşturucu (HWC) uygulamalarıyla paylaşılan libtonemap adlı, satıcı tarafından yapılandırılabilen bir statik 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ık olasılığını azaltır.
Android 12 ve önceki sürümlerde, 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ışları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ı
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
Arayüz
ToneMapper::lookupTonemapGainlibtonemap_LookupTonemapGainiç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şleme LUT'si oluşturma konusunda yardım almak için kullanılabilir.libtonemap_LookupTonemapGain, hem doğrusal RGB hem de XYZ'de mutlak, normalleştirilmemiş doğrusal uzaydaki renk değerlerini 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 döndürür.
ToneMapper::generateTonemapGainShaderSkSLSkSL gölgelendiricisi, SurfaceFlinger'ın GPU ile hızlandırılmış birleştirme bileşeni olanRenderEngineiçin Skia uygulamasına bağlanır. Ayrıca, gölgelendiricilibhwui'ye de bağlanır. Böylece,TextureViewiç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:- Shader dizesinde,
float libtonemap_LookupTonemapGain(vec3 linearRGB, vec3 xyz)imzalı bir giriş noktası olmalıdır. BuradalinearRGB, doğrusal uzaydaki RGB piksellerinin mutlak nit değeridir vexyz,linearRGBdeğ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ş tekdüzenleriin_libtonemap_ön ekini almalıdır.
- Shader dizesinde,
SkSL üniformaları oluşturma
Arayüz, farklı HDR standartlarındaki ve ekran koşullarındaki meta verileri açıklayan bir meta veri
structverildiğinde aşağıdakileri döndürür:ToneMapper::generateShaderSkSLUniformsBir SkSL gölgelendiricisiyle bağlı olan üniformaların listesi.
Tekdüze değerler
in_libtonemap_displayMaxLuminancevein_libtonemap_inputMaxLuminance. Bu değerler, girişlibtonemapolarak ölçeklendirilirken ve çıkış uygun şekilde normalleştirilirken çerçeve gölgelendiricileri tarafından kullanılır.Üniforma 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 bileşimi tarafından kullanılan ton eşleme algoritması, DPU bileşimi 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 görüntü 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:
libtonemapuygulamasını doğrudan değiştirin.- Kendi statik kitaplıklarını tanımlayabilir, kitaplığı bağımsız olarak derleyebilir ve
libtonemapkitaplığının.adosyasını kendi özel kitaplıklarından oluşturulanla 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 HLG, HDR10, HDR10+ veya Dolby Vision gibi HDR standartlarındaki 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
adbkomutunu kullanın:adb shell service call SurfaceFlinger 1008 i32 <0 to enable HWC composition, 1 to force GPU composition>
Genel sorunlar
Bu uygulama ile ilgili olarak aşağıdaki sorunlar ortaya çıkabilir:
Bantlanma, GPU kompozisyonu 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ı 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 bant oluşumu meydana gelebilir.
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.