Android 10 memperkenalkan API manajemen buffer HAL3 kamera opsional yang memungkinkan Anda menerapkan logika manajemen buffer untuk mencapai memori yang berbeda dan menangkap tradeoff latensi dalam implementasi HAL kamera.
Kamera HAL memerlukan N permintaan (di mana N sama dengan kedalaman pipa ) yang diantrekan dalam pipanya, tetapi sering kali tidak memerlukan semua N set buffer output pada saat yang sama.
Misalnya, HAL mungkin memiliki delapan permintaan yang diantrekan di pipa, tetapi hanya membutuhkan buffer output untuk dua permintaan di tahap terakhir pipa. Pada perangkat yang menjalankan Android 9 dan yang lebih rendah, kerangka kerja kamera mengalokasikan buffer saat permintaan diantrekan di HAL sehingga mungkin ada enam set buffer di HAL yang tidak digunakan. Di Android 10, API pengelolaan buffer HAL3 kamera memungkinkan pemisahan buffer output untuk mengosongkan enam set buffer. Hal ini dapat menghasilkan penghematan memori ratusan megabita pada perangkat kelas atas dan juga dapat bermanfaat untuk perangkat dengan memori rendah.
Gambar 1 menunjukkan diagram antarmuka HAL kamera untuk perangkat yang menjalankan Android 9 dan yang lebih rendah. Gambar 2 menunjukkan antarmuka HAL kamera di Android 10 dengan penerapan API pengelolaan buffer HAL3 kamera.
Gambar 1. Antarmuka Kamera HAL di Android 9 dan yang lebih rendah
Gambar 2. Antarmuka Kamera HAL di Android 10 menggunakan API manajemen buffer
Menerapkan API manajemen buffer
Untuk mengimplementasikan API manajemen buffer, kamera HAL harus:
- Terapkan HIDL
ICameraDevice@3.5
. - Setel kunci karakteristik kamera
android.info.supportedBufferManagementVersion
keHIDL_DEVICE_3_5
.
Kamera HAL menggunakan metode requestStreamBuffers
dan returnStreamBuffers
di ICameraDeviceCallback.hal
untuk meminta dan mengembalikan buffer. HAL juga harus mengimplementasikan metode signalStreamFlush
di ICameraDeviceSession.hal
untuk memberi sinyal pada kamera HAL untuk mengembalikan buffer.
requestStreamBuffers
Gunakan metode requestStreamBuffers
untuk meminta buffer dari kerangka kerja kamera. Saat menggunakan API manajemen buffer kamera HAL3, permintaan pengambilan dari kerangka kerja kamera tidak berisi buffer output, yaitu, bidang bufferId
di StreamBuffer
adalah 0
. Oleh karena itu, kamera HAL harus menggunakan requestStreamBuffers
untuk meminta buffer dari kerangka kerja kamera.
Metode requestStreamBuffers
memungkinkan pemanggil untuk meminta beberapa buffer dari beberapa aliran output dalam satu panggilan, memungkinkan panggilan HIDL IPC yang lebih sedikit. Namun, panggilan membutuhkan lebih banyak waktu saat lebih banyak buffer diminta pada saat yang sama dan ini dapat berdampak negatif terhadap total latensi permintaan-ke-hasil. Juga, karena panggilan ke requestStreamBuffers
diserialkan dalam layanan kamera, disarankan agar kamera HAL menggunakan utas prioritas tinggi khusus untuk meminta buffer.
Jika permintaan buffer gagal, kamera HAL harus mampu menangani kesalahan nonfatal dengan benar. Daftar berikut menjelaskan alasan umum bahwa permintaan buffer gagal dan bagaimana mereka harus ditangani oleh kamera HAL.
- Aplikasi terputus dari aliran keluaran: Ini adalah kesalahan yang tidak fatal. Kamera HAL harus mengirimkan
ERROR_REQUEST
untuk setiap permintaan pengambilan yang menargetkan aliran yang terputus dan siap untuk memproses permintaan berikutnya secara normal. - Timeout: Ini dapat terjadi saat aplikasi sibuk melakukan pemrosesan intensif sambil menahan beberapa buffer. Kamera HAL harus mengirim
ERROR_REQUEST
untuk permintaan pengambilan yang tidak dapat dipenuhi karena kesalahan waktu habis dan siap untuk memproses permintaan berikutnya secara normal. - Kerangka kerja kamera sedang mempersiapkan konfigurasi aliran baru: HAL kamera harus menunggu hingga panggilan
configureStreams
berikutnya selesai sebelum memanggilrequestStreamBuffers
lagi. - HAL kamera telah mencapai batas buffernya (bidang
maxBuffers
): HAL kamera harus menunggu hingga mengembalikan setidaknya satu buffer streaming sebelum memanggilrequestStreamBuffers
lagi.
kembaliStreamBuffers
Gunakan metode returnStreamBuffers
untuk mengembalikan buffer tambahan ke kerangka kerja kamera. Kamera HAL biasanya mengembalikan buffer ke kerangka kamera melalui metode processCaptureResult
, tetapi hanya dapat menjelaskan permintaan pengambilan yang telah dikirim ke HAL kamera. Dengan metode requestStreamBuffers
, implementasi HAL kamera dapat mempertahankan lebih banyak buffer daripada yang diminta oleh framework kamera. Inilah saatnya metode returnStreamBuffers
harus digunakan. Jika implementasi HAL tidak pernah menampung lebih banyak buffer daripada yang diminta, implementasi HAL kamera tidak perlu memanggil metode returnStreamBuffers
.
sinyalStreamFlush
Metode signalStreamFlush
dipanggil oleh kerangka kerja kamera untuk memberi tahu kamera HAL untuk mengembalikan semua buffer yang ada. Ini biasanya dipanggil ketika kerangka kerja kamera akan memanggil configureStreams
dan harus menguras saluran pengambilan kamera. Mirip dengan metode returnStreamBuffers
, jika implementasi HAL kamera tidak menampung lebih banyak buffer daripada yang diminta, implementasi metode ini mungkin saja kosong.
Setelah kerangka kerja kamera memanggil signalStreamFlush
, kerangka kerja berhenti mengirimkan permintaan pengambilan baru ke kamera HAL hingga semua buffer dikembalikan ke kerangka kerja kamera. Ketika semua buffer dikembalikan, pemanggilan metode requestStreamBuffers
gagal, dan kerangka kerja kamera dapat melanjutkan pekerjaannya dalam keadaan bersih. Kerangka kerja kamera kemudian memanggil metode configureStreams
atau processCaptureRequest
. Jika kerangka kerja kamera memanggil metode configureStreams
, HAL kamera dapat mulai meminta buffer lagi setelah panggilan configureStreams
berhasil kembali. Jika kerangka kerja kamera memanggil metode processCaptureRequest
, HAL kamera dapat mulai meminta buffer selama panggilan processCaptureRequest
.
Semantiknya berbeda untuk metode signalStreamFlush
dan metode flush
. Saat metode flush
dipanggil, HAL dapat membatalkan permintaan penangkapan yang tertunda dengan ERROR_REQUEST
untuk mengeringkan pipa sesegera mungkin. Ketika metode signalStreamFlush
dipanggil, HAL harus menyelesaikan semua permintaan penangkapan yang tertunda secara normal dan mengembalikan semua buffer ke kerangka kamera.
Perbedaan lain antara metode signalStreamFlush
dan metode lainnya adalah bahwa signalStreamFlush
adalah metode HIDL satu arah , yang berarti bahwa kerangka kamera mungkin memanggil API pemblokiran lain sebelum HAL menerima panggilan signalStreamFlush
. Ini berarti bahwa metode signalStreamFlush
dan metode lain (khususnya metode configureStreams
) mungkin tiba di HAL kamera dalam urutan yang berbeda dari urutan yang dipanggil dalam kerangka kerja kamera. Untuk mengatasi masalah asinkron ini, bidang streamConfigCounter
ditambahkan ke StreamConfiguration
dan ditambahkan sebagai argumen ke metode signalStreamFlush
. Implementasi HAL kamera harus menggunakan argumen streamConfigCounter
untuk menentukan apakah panggilan signalStreamFlush
tiba lebih lambat dari panggilan configureStreams
yang sesuai. Lihat Gambar 3 untuk contoh.
Gambar 3. Bagaimana kamera HAL seharusnya mendeteksi dan menangani panggilan signalStreamFlush yang datang terlambat
Perubahan perilaku saat menerapkan API manajemen buffer
Saat menggunakan API manajemen buffer untuk mengimplementasikan logika manajemen buffer, pertimbangkan kemungkinan perubahan perilaku berikut pada implementasi HAL kamera dan kamera:
Permintaan pengambilan tiba di kamera HAL lebih cepat dan lebih sering: Tanpa API manajemen buffer, kerangka kerja kamera meminta buffer keluaran untuk setiap permintaan pengambilan sebelum mengirim permintaan pengambilan ke HAL kamera. Saat menggunakan API manajemen buffer, framework kamera tidak perlu lagi menunggu buffer dan oleh karena itu dapat mengirim permintaan pengambilan ke kamera HAL lebih awal.
Selain itu, tanpa API manajemen buffer, kerangka kerja kamera berhenti mengirim permintaan pengambilan jika salah satu aliran keluaran dari permintaan pengambilan telah mencapai jumlah maksimum buffer yang dapat ditahan HAL pada satu waktu (nilai ini ditetapkan oleh kamera HAL di
HalStream::maxBuffers
dalam nilai kembalian panggilanconfigureStreams
). Dengan API manajemen buffer, perilaku pelambatan ini tidak ada lagi dan implementasi HAL kamera tidak boleh menerima panggilanprocessCaptureRequest
saat HAL memiliki terlalu banyak permintaan pengambilan yang diantrekan.latensi panggilan
requestStreamBuffers
sangat bervariasi: Ada banyak alasan mengapa panggilanrequestStreamBuffers
membutuhkan waktu lebih lama daripada rata-rata. Sebagai contoh:- Untuk beberapa buffer pertama dari aliran yang baru dibuat, panggilan dapat memakan waktu lebih lama karena perangkat perlu mengalokasikan memori.
- Latensi yang diharapkan meningkat secara proporsional dengan jumlah buffer yang diminta dalam setiap panggilan.
- Aplikasi menahan buffer dan sibuk memproses. Ini dapat menyebabkan permintaan buffer melambat atau mencapai batas waktu karena kurangnya buffer atau CPU yang sibuk.
Strategi manajemen penyangga
API manajemen buffer memungkinkan berbagai jenis strategi manajemen buffer untuk diterapkan. Beberapa contohnya adalah:
- Kompatibel ke belakang: HAL meminta buffer untuk permintaan pengambilan selama panggilan
processCaptureRequest
. Strategi ini tidak memberikan penghematan memori, tetapi dapat berfungsi sebagai implementasi pertama dari API manajemen buffer, yang memerlukan sedikit perubahan kode pada HAL kamera yang ada. - Penghematan memori yang dimaksimalkan: Kamera HAL hanya meminta buffer keluaran segera sebelum diperlukan untuk diisi. Strategi ini memungkinkan penghematan memori yang maksimal. Kelemahan potensial adalah lebih banyak jank pipa kamera ketika permintaan buffer membutuhkan waktu yang sangat lama untuk diselesaikan.
- Cached: Kamera HAL menyimpan beberapa buffer sehingga kecil kemungkinannya terpengaruh oleh permintaan buffer lambat sesekali.
Kamera HAL dapat mengadopsi strategi yang berbeda untuk kasus penggunaan tertentu, misalnya, menggunakan strategi penghematan memori yang dimaksimalkan untuk kasus penggunaan yang menggunakan banyak memori dan menggunakan strategi yang kompatibel ke belakang untuk kasus penggunaan lainnya.
Contoh implementasi di kamera eksternal HAL
Kamera eksternal HAL diperkenalkan di Android 9 dan dapat ditemukan di pohon sumber di hardware/interfaces/camera/device/3.5/
. Di Android 10, telah diperbarui untuk menyertakan ExternalCameraDeviceSession.cpp
, sebuah implementasi dari API pengelolaan buffer. Kamera eksternal HAL ini mengimplementasikan strategi penghematan memori maksimal yang disebutkan dalam strategi manajemen Buffer dalam beberapa ratus baris kode C++.