API pengelolaan buffer Kamera HAL3

Android 10 memperkenalkan fitur Buffer kamera HAL3 API yang memungkinkan Anda untuk mengimplementasikan logika manajemen buffer guna mencapai memori dan pengambilan yang berbeda konsekuensi latensi dalam implementasi HAL kamera.

HAL kamera memerlukan permintaan N (dengan N sama dengan kedalaman pipeline) dalam antrean di pipelinenya, tetapi seringkali tidak memerlukan semua N set buffer output secara bersamaan.

Misalnya, HAL mungkin memiliki delapan permintaan yang diantrekan di pipeline, tetapi hanya memerlukan buffer output untuk dua permintaan pada tahap terakhir {i>pipelines<i} yang sama. Pada perangkat yang menjalankan Android 9 dan yang lebih lama, framework kamera mengalokasikan {i>buffer<i} ketika permintaan diantrekan di HAL sehingga bisa ada enam set {i>buffer<i} di HAL yang tidak digunakan. Di Android 10, API pengelolaan buffer HAL3 kamera memungkinkan pemisahan output {i>buffer<i} untuk mengosongkan enam set {i>buffer<i}. Hal ini dapat menyebabkan ratusan penghematan memori megabita pada perangkat kelas atas dan juga bermanfaat untuk perangkat dengan memori rendah.

Gambar 1 menunjukkan diagram antarmuka HAL kamera untuk perangkat yang menjalankan Android 9 dan yang lebih lama. Gambar 2 menunjukkan antarmuka HAL kamera di Android 10 dengan API pengelolaan buffer HAL3 kamera yang diimplementasikan.

Pengelolaan buffer dalam 9 atau lebih rendah

Gambar 1. Antarmuka Camera HAL di Android 9 dan yang lebih lama

Pengelolaan buffer di Android 10

Gambar 2. Antarmuka Camera HAL di Android 10 menggunakan API pengelolaan buffer

Mengimplementasikan API pengelolaan buffer

Untuk mengimplementasikan API pengelolaan buffer, HAL kamera harus:

HAL kamera menggunakan requestStreamBuffers dan returnStreamBuffers metode dalam ICameraDeviceCallback.hal untuk meminta dan menampilkan buffer. HAL juga harus menerapkan signalStreamFlush metode di ICameraDeviceSession.hal untuk memberi sinyal ke HAL kamera untuk mengembalikan buffer.

requestStreamBuffers

Gunakan requestStreamBuffers untuk meminta buffer dari framework kamera. Saat menggunakan HAL3 kamera API pengelolaan buffer, permintaan perekaman dari framework kamera tidak berisi buffer output, yaitu, kolom bufferId di StreamBuffer adalah 0. Oleh karena itu, HAL kamera harus menggunakan requestStreamBuffers untuk meminta {i>buffer<i} dari kerangka kerja kamera.

Metode requestStreamBuffers memungkinkan pemanggil meminta beberapa buffer dari beberapa streaming output dalam satu panggilan, memungkinkan lebih sedikit HIDL IPC panggilan telepon. Akan tetapi, panggilan membutuhkan lebih banyak waktu bila lebih banyak buffer diminta di waktu yang sama dan hal ini dapat berdampak negatif terhadap total latensi permintaan ke hasil. Selain itu, karena panggilan ke requestStreamBuffers diserialisasi di kamera disarankan agar HAL kamera menggunakan layanan untuk meminta buffer.

Jika permintaan buffer gagal, HAL kamera harus dapat menangani yang tidak fatal. Daftar berikut ini menjelaskan alasan umum terjadinya {i>buffer<i} gagal dan bagaimana permintaan itu harus ditangani oleh HAL kamera.

  • Aplikasi terputus dari aliran data output: Ini adalah error non-fatal. HAL kamera harus mengirim ERROR_REQUEST untuk setiap permintaan pengambilan menargetkan streaming yang terputus dan siap memproses permintaan berikutnya seperti biasanya.
  • Waktu tunggu: Ini dapat terjadi saat aplikasi sedang sibuk bekerja pemrosesan intensif sambil mempertahankan beberapa {i>buffer<i}. HAL kamera harus kirim ERROR_REQUEST untuk permintaan pengambilan gambar yang tidak dapat dipenuhi karena terjadi error waktu tunggu habis dan siap memproses permintaan berikutnya secara normal.
  • Framework kamera sedang menyiapkan konfigurasi streaming baru: HAL kamera harus menunggu hingga configureStreams selesai sebelum memanggil requestStreamBuffers lagi.
  • HAL kamera telah mencapai batas buffer (kolom maxBuffers): HAL kamera harus menunggu hingga menghasilkan setidaknya satu buffer streaming sebelum memanggil requestStreamBuffers lagi.

returnStreamBuffers

Gunakan returnStreamBuffers untuk mengembalikan buffer tambahan ke framework kamera. HAL kamera biasanya mengembalikan buffer ke framework kamera melalui processCaptureResult , tetapi hanya dapat memperhitungkan permintaan pengambilan yang telah dikirim ke HAL kamera Dengan metode requestStreamBuffers, metode tersebut memungkinkan Implementasi HAL kamera untuk mempertahankan lebih banyak buffer daripada yang diminta oleh framework kamera. Pada saat inilah metode returnStreamBuffers seharusnya data Jika implementasi HAL tidak pernah memiliki {i>buffer<i} yang lebih besar dari yang diminta, Implementasi HAL kamera tidak perlu memanggil returnStreamBuffers .

sinyalStreamFlush

Tujuan signalStreamFlush dipanggil oleh kerangka kerja kamera untuk memberi tahu kamera HAL agar mengembalikan semua {i>buffer<i} (penyangga) yang ada. Ini biasanya dipanggil ketika {i>framework<i} kamera akan panggilan telepon configureStreams dan harus menguras pipeline pengambilan kamera. Serupa dengan returnStreamBuffers , jika implementasi HAL kamera tidak berisi lebih banyak buffer daripada permintaan, mungkin saja ada implementasi kosong dari metode ini.

Setelah framework kamera memanggil signalStreamFlush, framework berhenti mengirim permintaan pengambilan gambar baru ke HAL kamera sampai buffer telah dikembalikan ke framework kamera. Ketika semua buffer ditampilkan, panggilan metode requestStreamBuffers akan gagal, dan kamera dapat melanjutkan pekerjaannya dalam keadaan bersih. Framework kamera kemudian memanggil configureStreams atau processCaptureRequest . Jika framework kamera memanggil metode configureStreams, kamera HAL dapat mulai meminta buffer lagi setelah panggilan configureStreams ditampilkan memulai proyek. Jika framework kamera memanggil metode processCaptureRequest, HAL kamera dapat mulai meminta buffer selama processCaptureRequest panggilan telepon.

Semantik untuk metode signalStreamFlush berbeda dan flush . Saat metode flush dipanggil, HAL dapat membatalkan penangkapan yang tertunda permintaan dengan ERROR_REQUEST untuk menghabiskan pipeline sesegera mungkin. Kapan metode signalStreamFlush dipanggil, HAL harus menyelesaikan semua proses menangkap permintaan secara normal dan menampilkan semua buffer ke framework kamera.

Perbedaan lain antara metode signalStreamFlush dan metode lainnya adalah bahwa signalStreamFlush adalah metode HIDL satu arah, yang berarti kamera mungkin memanggil API pemblokir lain sebelum HAL menerima Panggilan signalStreamFlush. Hal ini berarti bahwa metode signalStreamFlush dan metode lainnya (khususnya configureStreams) mungkin sampai di HAL kamera dalam urutan yang berbeda dari urutan ketika mereka dipanggil dalam {i>framework<i} kamera. Untuk mengatasi hal ini masalah asinkron, kolom streamConfigCounter telah ditambahkan ke StreamConfiguration dan ditambahkan sebagai argumen ke signalStreamFlush . Implementasi HAL kamera harus menggunakan streamConfigCounter untuk menentukan apakah panggilan signalStreamFlush akan diterima lebih lama dari panggilan configureStreams yang sesuai. Lihat Gambar 3 sebagai contoh.

Menangani panggilan yang terlambat

Gambar 3. Cara HAL kamera harus mendeteksi dan menangani panggilan signalStreamFlush yang datang terlambat

Perubahan perilaku saat menerapkan API pengelolaan buffer

Ketika menggunakan API pengelolaan buffer untuk menerapkan logika pengelolaan buffer, pertimbangkan kemungkinan perubahan perilaku berikut pada kamera dan implementasi HAL kamera:

  • Permintaan pengambilan gambar tiba di HAL kamera lebih cepat dan lainnya sering: Tanpa API pengelolaan buffer, framework kamera akan meminta buffer output untuk setiap permintaan penangkapan sebelum mengirim permintaan penangkapan HAL kamera. Saat menggunakan API pengelolaan buffer, framework kamera tidak perlu lagi menunggu buffer dan karenanya dapat mengirimkan permintaan pengambilan ke HAL kamera sebelumnya.

    Selain itu, tanpa API pengelolaan buffer, framework kamera akan berhenti mengirimkan permintaan penangkapan jika salah satu aliran output telah mencapai jumlah {i>buffer<i} maksimum yang dapat ditampung HAL pada satu kali (nilai ini ditentukan oleh HAL kamera dalam Kolom HalStream::maxBuffers di nilai yang ditampilkan configureStreams panggilan). Dengan API pengelolaan buffer, perilaku throttling ini tidak lagi ada dan implementasi HAL kamera tidak boleh processCaptureRequest memanggil saat HAL memiliki terlalu banyak permintaan pengambilan gambar dalam antrean.

  • Latensi panggilan requestStreamBuffers sangat bervariasi: Ada berbagai alasan panggilan requestStreamBuffers mungkin butuh waktu lebih lama daripada rata-rata. Contoh:

    • Untuk beberapa buffer pertama dari streaming yang baru dibuat, memanggil bisa memakan waktu lebih lama karena perangkat perlu mengalokasikan memori.
    • Latensi yang diharapkan meningkat sesuai dengan jumlah {i>buffer<i} yang diminta dalam setiap panggilan.
    • Aplikasi menahan buffer dan sibuk memproses. Ini dapat menyebabkan permintaan buffer melambat atau mencapai waktu tunggu karena kekurangan {i>buffer<i} atau CPU yang sibuk.

Strategi pengelolaan buffer

API pengelolaan buffer memungkinkan berbagai jenis pengelolaan buffer strategi yang akan diimplementasikan. Contohnya antara lain:

  • Kompatibel dengan versi lama: HAL meminta buffer untuk permintaan pengambilan gambar selama panggilan processCaptureRequest. Strategi ini tidak memberikan penghematan memori, namun dapat berfungsi sebagai implementasi pertama buffer API ini, memerlukan sangat sedikit perubahan kode pada HAL kamera yang ada.
  • Penghematan memori maksimal: HAL kamera hanya meminta buffer output sebelum salah satunya perlu diisi. Strategi ini memungkinkan memaksimalkan penghematan memori. Kelemahannya adalah lebih banyak pipeline kamera jank saat permintaan buffer memerlukan waktu penyelesaian yang lebih lama.
  • Di-cache: HAL kamera men-cache beberapa buffer sehingga kecil kemungkinannya dipengaruhi oleh permintaan {i>buffer <i}yang lambat.

HAL kamera bisa mengadopsi strategi yang berbeda untuk kasus penggunaan tertentu, untuk Misalnya, strategi penghematan memori dimaksimalkan untuk kasus penggunaan memori dan menggunakan strategi yang kompatibel dengan versi sebelumnya untuk kasus penggunaan lainnya.

Contoh implementasi di HAL kamera eksternal

HAL kamera eksternal diperkenalkan di Android 9 dan dapat ditemukan di hierarki sumber di hardware/interfaces/camera/device/3.5/ Di Android 10, telah diupdate untuk menyertakan ExternalCameraDeviceSession.cpp, implementasi API pengelolaan buffer. HAL kamera eksternal ini mengimplementasikan strategi penghematan memori maksimal yang disebutkan dalam Pengelolaan buffer strategi dalam beberapa ratus baris kode C++.