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

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 bir libtonemap statik kitaplığı kullanıma 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 görüntü kalitesinde uyumsuzluklara yol açıyordu. HDR içeriğin ton, çıkış alanına farklı şekillerde eşleniyordu. 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ığı için arayüz

libtonemap kitaplığı, CPU destekli uygulamalar ve SkSL gölgelendiricileri içerir. Bunlar, GPU arka uç kompozisyonu için SurfaceFlinger ve ton eşleme arama tablosu (LUT) oluşturmak için HWC tarafından takılabilir. 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(), hem doğrusal RGB hem de XYZ'de mutlak, normalleştirilmemiş doğrusal alanda renk değerlerini alır ve doğrusal uzayda giriş renklerinin ne kadar çarpılacağını belirten bir kayan noktalı değer döndürür.

  • SkSL gölgelendirici oluştur

    ToneMapper::generateTonemapGainShaderSkSL() arayüzü, bir kaynak ve hedef veri alanı verildiğinde SkSL gölgelendirici dizesi döndürür. SkSL gölgelendirici, SurfaceFlinger'ın GPU ile hızlandırılmış birleştirme bileşeni olan RenderEngine için Skia uygulamasına bağlıdır. Gölgelendirici, HDR'den SDR'ye ton eşlemenin TextureView için verimli bir şekilde gerçekleştirilebilmesi amacıyla libhwui'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. Burada linearRGB, doğrusal alandaki RGB piksellerinin mutlak nit değerini, xyz ise linearRGB 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üne in_libtonemap_ eklenmelidir.
  • SkSL üniformaları oluşturma

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

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

    • Tek tip değerler in_libtonemap_displayMaxLuminance ve in_libtonemap_inputMaxLuminance. Bu değerler, girişi libtonemap olarak ölçeklendirirken ve çıkışı uygun şekilde normalleştirirken çerçeve gölgelendiricileri tarafından kullanılır.

    Şu anda forma üretme süreci, giriş ve çıkış veri alanından bağımsızdır.

Özelleştirme

libtonemap kitaplığının referans uygulaması kabul edilebilir sonuçlar üretir. Bununla birlikte, GPU bileşimi tarafından kullanılan ton eşleme algoritması, DPU bileşimi tarafından kullanılandan farklı olabileceği için referans uygulamanın kullanılması, döndürme animasyonu gibi bazı senaryolarda titremeye 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. 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ı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 birden fazla tedarikçinin, doğru şekilde uygulanması için 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:

  1. Ekran sisteminizin desteklediği HDR standartlarında (ör. HLG, HDR10, HDR10+ veya DolbyVision) HDR videoları oynatın.

  2. Kullanıcı tarafından algılanabilir titreme olmaması için GPU bileşimini açın/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 uygulama sonucunda aşağıdaki sorunlar ortaya çıkabilir:

  • Bantlama, GPU bileşimi tarafından kullanılan oluşturma hedefinin, HDR içeriğin genel değerinden daha düşük kesinliğe sahip olması nedeniyle ortaya çıkar. Ö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.