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

API Manajemen Buffer Kamera HAL3

Android 10 memperkenalkan opsional kamera HAL3 API manajemen buffer yang memungkinkan Anda untuk menerapkan logika manajemen buffer untuk mencapai memori dan menangkap latency yang berbeda pengorbanan dalam implementasi kamera HAL.

Kamera HAL membutuhkan permintaan N (di mana N adalah sama dengan kedalaman pipa ) antri di pipa, tetapi sering tidak memerlukan semua N set output buffer 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 API manajemen buffer HAL3 kamera yang diimplementasikan.

Manajemen buffer di 9 atau lebih rendah

Gambar antarmuka HAL 1. Kamera di Android 9 dan bawah

Manajemen buffer di Android 10

Gambar antarmuka HAL 2. Kamera di Android 10 menggunakan API manajemen buffer

Menerapkan API manajemen buffer

Untuk mengimplementasikan API manajemen buffer, kamera HAL harus:

Kamera HAL menggunakan requestStreamBuffers dan returnStreamBuffers metode dalam ICameraDeviceCallback.hal permintaan dan kembali buffer. HAL juga harus menerapkan signalStreamFlush metode dalam ICameraDeviceSession.hal untuk sinyal HAL kamera untuk buffer kembali.

requestStreamBuffers

Gunakan requestStreamBuffers metode untuk meminta buffer dari kerangka kamera. Bila menggunakan kamera HAL3 API manajemen buffer, permintaan menangkap dari kerangka kamera tidak mengandung buffer output, yaitu, bufferId lapangan di StreamBuffer adalah 0 . Oleh karena itu, HAL kamera harus menggunakan requestStreamBuffers untuk meminta buffer dari kerangka kamera.

The requestStreamBuffers metode memungkinkan penelepon untuk meminta beberapa buffer dari beberapa aliran output dalam satu panggilan, memungkinkan untuk lebih sedikit HIDL IPC panggilan. Namun, panggilan membutuhkan lebih banyak waktu saat lebih banyak buffer diminta pada saat yang sama dan ini dapat berdampak negatif pada total latensi permintaan-ke-hasil. Juga, karena panggilan menjadi requestStreamBuffers yang serial di layanan kamera, itu disarankan agar kamera HAL menggunakan high-prioritas thread didedikasikan untuk buffer permintaan.

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.

  • App terputus dari output stream: Ini adalah kesalahan fatal. Kamera HAL harus mengirim ERROR_REQUEST untuk setiap permintaan penangkapan menargetkan aliran terputus dan siap untuk memproses permintaan berikutnya normal.
  • Timeout: ini dapat terjadi ketika sebuah aplikasi sibuk melakukan pengolahan intensif sambil memegang beberapa buffer. Kamera HAL harus mengirim ERROR_REQUEST untuk permintaan penangkapan yang tidak dapat dipenuhi karena kesalahan batas waktu dan siap untuk memproses permintaan berikutnya normal.
  • Kerangka kamera sedang mempersiapkan konfigurasi aliran baru: Kamera HAL harus menunggu sampai berikutnya configureStreams panggilan selesai sebelum memanggil requestStreamBuffers lagi.
  • Kamera HAL telah mencapai nya batas penyangga (yang maxBuffers lapangan): kamera HAL harus menunggu sampai kembali setidaknya satu penyangga sungai sebelum memanggil requestStreamBuffers lagi.

kembaliStreamBuffers

Gunakan returnStreamBuffers metode untuk kembali buffer ekstra untuk kerangka kamera. Kamera HAL biasanya mengembalikan buffer untuk kerangka kamera melalui processCaptureResult metode, tetapi hanya dapat menjelaskan permintaan capture yang telah dikirim ke kamera HAL. Dengan requestStreamBuffers metode, hal itu mungkin bagi pelaksanaan HAL kamera untuk mempertahankan lebih banyak buffer dari apa yang telah diminta oleh kerangka kamera. Ini adalah saat returnStreamBuffers metode harus digunakan. Jika pelaksanaan HAL tidak pernah memegang lebih buffer dari yang diminta, pelaksanaan kamera HAL tidak perlu memanggil returnStreamBuffers metode.

sinyalStreamFlush

The signalStreamFlush metode ini disebut oleh kerangka kamera untuk memberitahu HAL kamera untuk mengembalikan semua buffer di tangan. Hal ini biasanya disebut ketika kerangka kamera adalah untuk panggilan configureStreams dan harus menguras pipa kamera menangkap. Serupa dengan returnStreamBuffers metode, jika implementasi kamera HAL tidak memegang lebih buffer dari yang diminta, itu mungkin untuk memiliki implementasi kosong dari metode ini.

Setelah kerangka kamera panggilan signalStreamFlush , kerangka berhenti mengirim permintaan capture baru untuk kamera HAL sampai semua buffer telah kembali ke kerangka kamera. Ketika semua buffer kembali, requestStreamBuffers metode panggilan gagal, dan kerangka kamera dapat melanjutkan pekerjaan dalam keadaan bersih. Kerangka kamera kemudian memanggil baik configureStreams atau processCaptureRequest metode. Jika kerangka kamera panggilan configureStreams metode, HAL kamera dapat mulai meminta buffer lagi setelah configureStreams memanggil kembali berhasil. Jika kerangka kamera panggilan processCaptureRequest metode, HAL kamera dapat mulai meminta buffer selama processCaptureRequest panggilan.

Semantik yang berbeda untuk signalStreamFlush metode dan flush metode. Ketika flush metode ini disebut, HAL dapat menggugurkan tertunda permintaan capture dengan ERROR_REQUEST untuk mengalirkan pipa sesegera mungkin. Ketika signalStreamFlush metode ini disebut, HAL harus menyelesaikan semua yang tertunda permintaan capture normal dan mengembalikan semua buffer untuk kerangka kamera.

Perbedaan lain antara signalStreamFlush metode dan metode lain adalah bahwa signalStreamFlush adalah metode HIDL satu arah, yang berarti bahwa kerangka kamera sebut menjadi API pemblokiran lain sebelum HAL menerima signalStreamFlush panggilan. Ini berarti bahwa signalStreamFlush metode dan metode lain (khususnya configureStreams metode) mungkin tiba di kamera HAL dalam urutan yang berbeda dari urutan mereka disebut dalam kerangka kamera. Untuk mengatasi masalah asynchrony ini, streamConfigCounter bidang ditambahkan ke StreamConfiguration dan ditambahkan sebagai argumen ke signalStreamFlush metode. Pelaksanaan kamera HAL harus menggunakan streamConfigCounter argumen untuk menentukan apakah signalStreamFlush panggilan tiba lambat yang sesuai configureStreams menelepon. Lihat Gambar 3 untuk contoh.

Menangani panggilan yang datang terlambat

Gambar 3. Bagaimana HAL kamera harus mendeteksi dan menangani signalStreamFlush panggilan 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 penangkapan tiba di kamera HAL lebih cepat dan lebih sering: Tanpa API manajemen buffer, permintaan kerangka kamera keluaran buffer untuk setiap permintaan capture sebelum mengirim permintaan capture untuk kamera HAL. 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 output dari permintaan pengambilan telah mencapai jumlah maksimum buffer yang dapat ditahan HAL pada satu waktu (nilai ini ditetapkan oleh kamera HAL di HalStream::maxBuffers lapangan di nilai kembali dari configureStreams panggilan). Dengan API manajemen buffer, perilaku throttling ini tidak ada lagi dan pelaksanaan kamera HAL tidak harus menerima processCaptureRequest panggilan ketika HAL memiliki terlalu banyak permintaan capture antri.

  • requestStreamBuffers sebut latency bervariasi secara signifikan: Ada banyak alasan yang requestStreamBuffers sebut mungkin memerlukan waktu lebih lama dari rata-rata. Sebagai contoh:

    • Untuk beberapa buffer pertama dari aliran yang baru dibuat, panggilan bisa memakan waktu lebih lama karena perangkat perlu mengalokasikan memori.
    • Latensi yang diharapkan meningkat sebanding 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: The HAL meminta buffer untuk permintaan penangkapan selama processCaptureRequest panggilan. Strategi ini tidak memberikan penghematan memori apa pun, tetapi dapat berfungsi sebagai implementasi pertama dari API manajemen buffer, yang memerlukan sedikit perubahan kode pada HAL kamera yang ada.
  • Penghematan memori dimaksimalkan: Kamera HAL hanya meminta output buffer segera sebelum salah satu 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.
  • Cache: Kamera HAL cache beberapa buffer sehingga kurang kemungkinan akan terpengaruh oleh permintaan penyangga 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 manajemen buffer. HAL kamera eksternal ini alat yang dimaksimalkan tabungan memori strategi yang disebutkan dalam strategi manajemen Buffer dalam beberapa ratus baris kode C ++.