Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.

Tone Mapping HDR Luminance ke Rentang yang kompatibel dengan SDR

Android 13 memperkenalkan pustaka statis yang dapat dikonfigurasi vendor yang disebut libtonemap , yang mendefinisikan operasi pemetaan nada dan dibagikan dengan proses SurfaceFlinger dan implementasi Hardware Composer (HWC). Fitur ini memungkinkan OEM untuk menentukan dan membagikan algoritme pemetaan nada tampilan mereka antara kerangka kerja dan vendor, mengurangi ketidakcocokan dalam pemetaan nada.

Sebelum Android 13, operasi pemetaan nada khusus tampilan tidak dibagikan antara HWC, SurfaceFlinger, dan aplikasi. Bergantung pada jalur rendering, untuk konten HDR, ini menyebabkan ketidakcocokan dalam kualitas gambar, di mana konten HDR dipetakan nada ke ruang output dengan cara yang berbeda. Ini terlihat dalam skenario seperti rotasi layar, di mana strategi komposisi berubah antara GPU dan DPU, dan dalam perbedaan perilaku rendering antara TextureView dan SurfaceView.

Halaman ini menjelaskan antarmuka, kustomisasi, dan detail validasi pustaka libtonemap .

Antarmuka ke perpustakaan pemetaan nada

Pustaka libtonemap berisi implementasi yang didukung CPU dan shader SkSL, yang dapat dipasang oleh SurfaceFlinger untuk komposisi backend GPU dan oleh HWC untuk menghasilkan tabel pencarian pemetaan nada (LUT). Titik masuk ke libtonemap adalah android::tonemap::getToneMapper() , yang mengembalikan objek yang mengimplementasikan antarmuka ToneMapper .

Antarmuka ToneMapper mendukung kemampuan berikut:

  • Hasilkan LUT pemetaan nada

    Antarmuka ToneMapper::lookupTonemapGain adalah implementasi CPU dari shader yang didefinisikan dalam libtonemap_LookupTonemapGain() . Ini digunakan oleh pengujian unit dalam kerangka kerja, dan dapat digunakan oleh mitra untuk bantuan dalam menghasilkan LUT pemetaan nada di dalam pipa warna mereka.

    libtonemap_LookupTonemapGain() mengambil nilai warna dalam ruang linier absolut yang tidak dinormalisasi, baik dalam RGB linier maupun dalam XYZ, dan mengembalikan float yang menjelaskan berapa banyak warna input yang dikalikan dalam ruang linier.

  • Hasilkan shader SkSL

    Antarmuka ToneMapper::generateTonemapGainShaderSkSL() mengembalikan string shader SkSL, diberikan ruang data sumber dan tujuan. Shader SkSL dicolokkan ke implementasi Skia untuk RenderEngine , komponen pengomposisian yang dipercepat GPU untuk SurfaceFlinger. Shader juga dicolokkan ke libhwui , sehingga pemetaan nada HDR-ke-SDR dapat dilakukan secara efisien untuk TextureView . Karena string yang dihasilkan dimasukkan ke dalam shader SkSL lain yang digunakan oleh Skia, shader harus mematuhi aturan berikut:

    • String shader harus memiliki titik masuk dengan tanda tangan float libtonemap_LookupTonemapGain(vec3 linearRGB, vec3 xyz) , di mana linearRGB adalah nilai nit absolut dari piksel RGB dalam ruang linier dan xyz adalah linearRGB yang diubah menjadi XYZ.
    • Setiap metode pembantu yang digunakan oleh string shader harus diawali dengan string libtonemap_ sehingga definisi framework shader tidak bertentangan. Demikian pula, seragam input harus diawali dengan in_libtonemap_ .
  • Buat seragam SkSL

    Antarmuka ToneMapper::generateShaderSkSLUniforms() mengembalikan berikut ini, mengingat struct metadata yang menjelaskan metadata dari standar HDR dan kondisi tampilan yang berbeda:

    • Daftar seragam yang diikat oleh shader SkSL.

    • Nilai seragam in_libtonemap_displayMaxLuminance dan in_libtonemap_inputMaxLuminance . Nilai-nilai ini digunakan oleh framework shader saat menskalakan input ke libtonemap , dan menormalkan output sebagaimana berlaku.

    Saat ini proses menghasilkan uniform tidak sesuai dengan input dan output dataspace.

Kustomisasi

Implementasi referensi pustaka libtonemap menghasilkan hasil yang dapat diterima. Namun, karena algoritma pemetaan nada yang digunakan oleh komposisi GPU dapat berbeda dari yang digunakan oleh komposisi DPU, penerapan referensi dapat menyebabkan kedipan dalam beberapa skenario seperti animasi rotasi. Kustomisasi dapat menyelesaikan masalah kualitas gambar khusus vendor tersebut.

OEM sangat dianjurkan untuk mengganti implementasi libtonemap untuk mendefinisikan subkelas ToneMapper mereka sendiri, yang dikembalikan oleh getToneMapper() . Saat menyesuaikan implementasi, mitra diharapkan melakukan salah satu hal berikut:

  • Ubah implementasi libtonemap secara langsung.
  • Tentukan perpustakaan statis mereka sendiri, kompilasi perpustakaan sebagai mandiri, dan ganti file .a perpustakaan libtonemap dengan yang dihasilkan dari perpustakaan kustom mereka.

Vendor tidak perlu memodifikasi kode kernel apa pun, tetapi beberapa vendor harus mengomunikasikan detail tentang algoritme pemetaan nada DPU untuk implementasi yang tepat.

Validasi

Ikuti langkah-langkah berikut untuk memvalidasi penerapan Anda:

  1. Putar video HDR di layar dengan standar HDR apa pun yang didukung oleh sistem tampilan Anda , seperti HLG, HDR10, HDR10+, atau DolbyVision.

  2. Alihkan komposisi GPU untuk memastikan tidak ada kedipan yang terlihat oleh pengguna.

    Gunakan perintah adb berikut untuk mengaktifkan komposisi GPU:

    adb shell service call SurfaceFlinger 1008 i32 <0 to enable HWC composition,
    1 to force GPU composition>
    
    

Masalah umum

Masalah berikut dapat terjadi dengan implementasi ini:

  • Banding disebabkan ketika target render yang digunakan oleh komposisi GPU memiliki presisi yang lebih rendah daripada nilai tipikal untuk konten HDR. Misalnya, pita dapat terjadi ketika implementasi HWC mendukung format 10-bit buram untuk HDR seperti RGBA1010102 atau P010, tetapi mengharuskan komposisi GPU menulis ke format 8-bit seperti RGBA8888 untuk mendukung alfa.

  • Pergeseran warna yang halus disebabkan oleh perbedaan kuantisasi jika DPU beroperasi pada presisi yang berbeda dari GPU.

Masing-masing masalah ini terkait dengan perbedaan presisi relatif dari perangkat keras yang mendasarinya. Solusi tipikal adalah memastikan bahwa ada langkah yang membingungkan di jalur presisi yang lebih rendah, membuat perbedaan presisi apa pun tidak terlalu terlihat oleh manusia.