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.
Gambar 1. Antarmuka Camera HAL di Android 9 dan yang lebih lama
Gambar 2. Antarmuka Camera HAL di Android 10 menggunakan API pengelolaan buffer
Mengimplementasikan API pengelolaan buffer
Untuk mengimplementasikan API pengelolaan buffer, HAL kamera harus:
- Mengimplementasikan HIDL
ICameraDevice@3.5
- Tetapkan tombol karakteristik kamera
android.info.supportedBufferManagementVersion
keHIDL_DEVICE_3_5
.
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 memanggilrequestStreamBuffers
lagi. - HAL kamera telah mencapai
batas buffer
(kolom
maxBuffers
): HAL kamera harus menunggu hingga menghasilkan setidaknya satu buffer streaming sebelum memanggilrequestStreamBuffers
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.
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 ditampilkanconfigureStreams
panggilan). Dengan API pengelolaan buffer, perilaku throttling ini tidak lagi ada dan implementasi HAL kamera tidak bolehprocessCaptureRequest
memanggil saat HAL memiliki terlalu banyak permintaan pengambilan gambar dalam antrean.Latensi panggilan
requestStreamBuffers
sangat bervariasi: Ada berbagai alasan panggilanrequestStreamBuffers
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++.