Penanganan hotplug

Kemampuan layar (seperti mode tampilan dan jenis HDR yang didukung) dapat berubah secara dinamis di perangkat yang memiliki layar yang terhubung secara eksternal (dengan HDMI atau DisplayPort), seperti set-top-box (STB) Android TV dan perangkat over-the-top (OTT). Perubahan ini dapat terjadi sebagai akibat dari sinyal hotplug HDMI, seperti saat pengguna beralih dari satu layar ke layar lainnya atau mem-booting perangkat tanpa layar yang terhubung. Android 12 dan yang lebih tinggi menyertakan perubahan dalam framework untuk menangani hotplugging dan kemampuan tampilan dinamis.

Halaman ini menjelaskan penanganan hotplug tampilan dan perubahan pada kemampuan tampilan dalam implementasi HAL Composer. Selain itu, artikel ini membahas cara mengelola framebuffer terkait dan mencegah kondisi race dalam situasi ini.

Memperbarui kemampuan tampilan

Bagian ini menjelaskan cara framework Android menangani perubahan kemampuan layar yang dimulai oleh Composer HAL.

Sebelum Android dapat menangani perubahan kemampuan tampilan dengan benar, OEM harus menerapkan HAL Composer sehingga menggunakan onHotplug(display, connection=CONNECTED) untuk memberi tahu framework tentang perubahan apa pun pada kemampuan tampilan. Setelah diimplementasikan, Android akan menangani perubahan pada kemampuan tampilan sebagai berikut:

  1. Saat mendeteksi perubahan kemampuan tampilan, framework akan menerima notifikasi onHotplug(display, connection=CONNECTED).
  2. Saat menerima notifikasi, framework akan menghapus status tampilannya dan membuat ulang dengan kemampuan baru dari HAL menggunakan metode getActiveConfig, getDisplayConfigs, getDisplayAttribute, getColorModes, getHdrCapabilities, dan getDisplayCapabilities.
  3. Setelah membuat ulang status tampilan baru, framework akan mengirimkan callback onDisplayChanged ke aplikasi yang memproses peristiwa tersebut.

Framework mengalokasikan ulang framebuffer pada peristiwa onHotplug(display, connection=CONNECTED) berikutnya. Lihat Pengelolaan framebuffer klien untuk mengetahui informasi selengkapnya tentang cara mengelola memori framebuffer dengan benar untuk menghindari kegagalan selama alokasi framebuffer baru.

Menangani skenario koneksi umum

Bagian ini membahas cara menangani berbagai skenario koneksi dengan benar dalam penerapan Anda saat layar utama terhubung dan terputus.

Setelah dibangun untuk perangkat seluler, framework Android tidak memiliki dukungan bawaan untuk tampilan utama yang terputus. Sebagai gantinya, HAL harus mengganti layar utama dengan layar placeholder dalam interaksinya dengan framework jika layar utama secara fisik terputus.

Skenario berikut dapat terjadi di STB dan dongle TV yang memiliki layar yang terhubung secara eksternal dan dapat terputus. Untuk menerapkan dukungan untuk skenario ini, gunakan informasi dalam tabel di bawah:

Skenario Penanganan
Tidak ada layar yang terhubung saat booting
  • Kirim sinyal onHotplug(display, connection=CONNECTED) dari Composer HAL ke framework.
  • Ganti status tampilan fisik di dalam HAL Composer dengan status tampilan placeholder.
Layar utama terhubung secara fisik
Layar utama terputus secara fisik
  • Kirim peristiwa onHotplug(display, connection=CONNECTED) lain dari HAL Composer ke framework.
  • Ganti status tampilan fisik di dalam HAL Composer dengan status tampilan placeholder. Tampilan placeholder harus memiliki satu mode tampilan, sehingga framework mengirim callback onDisplayChanged ke aplikasi (karena kumpulan mode yang didukung telah berubah). Mode tampilan tunggal ini harus cocok dengan mode tampilan fisik yang aktif terakhir sebelum pemutusan koneksi, sehingga aplikasi tidak menerima peristiwa perubahan konfigurasi.

Pertimbangan koneksi non-HDMI

Android TV hanya mendukung resolusi berikut:

  • 720x1280
  • 1080x1920
  • 2160x3840
  • 4320x7680

Saat STB atau dongle TV mencoba menampilkan resolusi yang tidak didukung, seperti 480i melalui koneksi CVBS, pesan error akan ditampilkan kepada pengguna.

Jika STB atau dongle TV memiliki koneksi HDMI dan non-HDMI, koneksi HDMI adalah layar utama dan koneksi non-HDMI tidak aktif. Akibatnya, jika koneksi HDMI terputus saat koneksi non-HDMI masih terhubung, peristiwa akan dikirim ke SurfaceFlinger dan kemampuan layar non-HDMI harus tercermin melalui getDisplayAttribute dan API iComposerClient lainnya (seperti getHdrCapabilities).

Menggunakan ID konfigurasi berurutan untuk mencegah kondisi race

Kondisi perlombaan dapat terjadi jika HAL Composer mengupdate konfigurasi tampilan yang didukung secara serentak dengan framework yang memanggil setActiveConfig atau setActiveConfigWithConstraints. Solusinya adalah menerapkan HAL Composer untuk menggunakan ID berurutan dan mencegah masalah ini.

Bagian ini menjelaskan bagaimana kondisi race dapat terjadi, diikuti dengan detail tentang cara menerapkan HAL Composer agar menggunakan ID berurutan untuk mencegah kondisi tersebut.

Pertimbangkan urutan peristiwa berikut, jika ID berurutan yang baru TIDAK ditetapkan ke konfigurasi tampilan baru, sehingga menyebabkan kondisi race:

  1. ID konfigurasi tampilan yang didukung adalah:

    • id=1, 1080x1920 60 Hz
    • id=2, 1080x1920 50 Hz
  2. Framework ini memanggil setActiveConfig(display, config=1).

  3. Secara bersamaan, HAL Composer memproses perubahan konfigurasi tampilan dan memperbarui status internalnya ke kumpulan konfigurasi tampilan baru, yang ditampilkan sebagai berikut:

    • id=1, 2160x3840 60 Hz
    • id=2, 2160x3840 50 Hz
    • id=3, 1080x1920 60 Hz
    • id=4, 1080x1920 50 Hz
  4. Composer HAL mengirim peristiwa onHotplug ke framework, untuk memberi tahu bahwa kumpulan mode yang didukung telah berubah.

  5. HAL Composer menerima setActiveConfig(display, config=1) (dari langkah 2).

  6. HAL menafsirkan bahwa framework telah meminta perubahan konfigurasi ke 2160x3840 60 Hz, meskipun pada kenyataannya 1080x1920 60 Hz yang diinginkan.

Proses yang menggunakan penetapan ID non-berurutan berakhir di sini dengan salah tafsir perubahan konfigurasi yang diinginkan.

Mengonfigurasi HAL Composer untuk menggunakan ID berurutan

Untuk menghindari kondisi perlombaan tersebut, OEM harus mengimplementasikan HAL Composer sebagai berikut:

  • Saat Composer HAL memperbarui konfigurasi tampilan yang didukung, HAL akan menetapkan ID baru yang berurutan ke konfigurasi tampilan baru.
  • Jika framework memanggil setActiveConfig atau setActiveConfigWithConstraints dengan ID konfigurasi yang tidak valid, HAL Composer akan mengabaikan panggilan tersebut.

Langkah-langkah ini berfungsi untuk mencegah kondisi race seperti yang ditunjukkan dalam diskusi berikut.

Pertimbangkan urutan peristiwa berikut, saat ID berurutan baru ditetapkan ke konfigurasi tampilan baru:

  1. ID konfigurasi tampilan yang didukung adalah:

    • id=1, 1080x1920 60 Hz
    • id=2, 1080x1920 50 Hz
  2. Framework memanggil setActiveConfig(display, config=1).

  3. Saat perubahan konfigurasi tampilan diproses, kumpulan ID konfigurasi berikutnya akan ditetapkan mulai dari bilangan bulat berikutnya yang tidak digunakan, yang ditunjukkan sebagai berikut:

    • id=3, 2160x3840 60 Hz

    • id=4, 2160x3840 50 Hz

    • id=5, 1080x1920 60 Hz

    • id=6, 1080x1920 50 Hz

  4. HAL Composer mengirim peristiwa onHotplug ke framework, untuk memberi tahu bahwa kumpulan mode yang didukung telah berubah.

  5. HAL Composer menerima setActiveConfig(display, config=1) (dari langkah 2).

  6. HAL Composer mengabaikan panggilan karena ID tidak lagi valid.

  7. Framework menerima dan memproses peristiwa onHotplug dari langkah 4. Panggilan ini memanggil HAL Composer menggunakan fungsi getDisplayConfigs dan getDisplayAttribute. Dengan fungsi-fungsi ini, framework mengidentifikasi ID baru (5) untuk resolusi dan kecepatan refresh yang diinginkan, yaitu 1080x1920 dan 60 Hz.

  8. Framework mengirimkan peristiwa setActiveConfig lain dengan ID yang diperbarui menjadi 5.

  9. HAL Composer menerima setActiveConfig(display, config=5) dari langkah 5.

  10. HAL dengan benar menafsirkan bahwa framework telah meminta perubahan konfigurasi ke 1080x1920 60 Hz.

Seperti ditunjukkan pada contoh di atas, proses yang menggunakan penetapan ID berurutan memastikan bahwa kondisi race dicegah dan perubahan konfigurasi tampilan yang benar diperbarui.