Permintaan
Kerangka aplikasi mengeluarkan permintaan hasil pengambilan ke subsistem kamera. Satu permintaan sesuai dengan satu set hasil. Permintaan merangkum semua informasi konfigurasi tentang pengambilan dan pemrosesan hasil tersebut. Ini mencakup hal-hal seperti resolusi dan format piksel; sensor manual, lensa, dan kontrol lampu kilat; mode operasi 3A; Kontrol pemrosesan RAW ke YUV; dan pembuatan statistik. Hal ini memungkinkan kontrol yang lebih besar terhadap keluaran dan pemrosesan hasil. Beberapa permintaan dapat diajukan sekaligus, dan pengajuan permintaan tidak bersifat pemblokiran. Dan permintaan selalu diproses sesuai urutan penerimaannya.
Subsistem HAL dan kamera
Subsistem kamera mencakup implementasi untuk komponen dalam saluran kamera seperti algoritma 3A dan kontrol pemrosesan. Kamera HAL menyediakan antarmuka bagi Anda untuk mengimplementasikan versi komponen ini. Untuk menjaga kompatibilitas lintas platform antara beberapa produsen perangkat dan vendor Image Signal Processor (ISP, atau sensor kamera), model saluran kamera bersifat virtual dan tidak berhubungan langsung dengan ISP sebenarnya. Namun, ini cukup mirip dengan pipeline pemrosesan sebenarnya sehingga Anda dapat memetakannya ke perangkat keras Anda secara efisien. Selain itu, ini cukup abstrak untuk memungkinkan beberapa algoritma dan urutan operasi yang berbeda tanpa mengurangi kualitas, efisiensi, atau kompatibilitas lintas perangkat.
Pipeline kamera juga mendukung pemicu yang dapat dimulai oleh framework aplikasi untuk mengaktifkan hal-hal seperti fokus otomatis. Ini juga mengirimkan pemberitahuan kembali ke kerangka aplikasi, memberi tahu aplikasi tentang kejadian seperti kunci fokus otomatis atau kesalahan.
Harap diperhatikan, beberapa blok pemrosesan gambar yang ditunjukkan pada diagram di atas tidak terdefinisi dengan baik pada rilis awal. Pipeline kamera membuat asumsi berikut:
- Output RAW Bayer tidak diproses di dalam ISP.
- Statistik dihasilkan berdasarkan data sensor mentah.
- Berbagai blok pemrosesan yang mengubah data sensor mentah menjadi YUV berada dalam urutan yang berubah-ubah.
- Meskipun beberapa unit skala dan pangkas ditampilkan, semua unit penskala berbagi kontrol wilayah keluaran (zoom digital). Namun, setiap unit mungkin memiliki resolusi keluaran dan format piksel yang berbeda.
Ringkasan penggunaan API
Ini adalah ringkasan singkat langkah-langkah menggunakan API kamera Android. Lihat bagian Startup dan urutan operasi yang diharapkan untuk rincian langkah-langkah ini, termasuk panggilan API.
- Dengarkan dan perhitungkan perangkat kamera.
- Buka perangkat dan sambungkan pendengar.
- Konfigurasikan output untuk kasus penggunaan target (seperti pengambilan gambar diam, perekaman, dll.).
- Buat permintaan untuk kasus penggunaan target.
- Tangkap/ulangi permintaan dan burst.
- Menerima metadata hasil dan data gambar.
- Saat berpindah kasus penggunaan, kembali ke langkah 3.
Ringkasan operasi HAL
- Permintaan pengambilan yang tidak sinkron berasal dari kerangka kerja.
- Perangkat HAL harus memproses permintaan secara berurutan. Dan untuk setiap permintaan, menghasilkan metadata hasil keluaran, dan satu atau lebih buffer gambar keluaran.
- Masuk pertama, keluar pertama untuk permintaan dan hasil, dan untuk aliran yang direferensikan oleh permintaan berikutnya.
- Stempel waktu harus sama untuk semua keluaran dari permintaan tertentu, sehingga kerangka kerja dapat mencocokkannya jika diperlukan.
- Semua konfigurasi dan status pengambilan (kecuali untuk rutinitas 3A) dirangkum dalam permintaan dan hasil.
Startup dan urutan operasi yang diharapkan
Bagian ini berisi penjelasan mendetail tentang langkah-langkah yang diharapkan saat menggunakan API kamera. Silakan lihat platform/hardware/interfaces/camera/ untuk definisi antarmuka HIDL.
Menghitung, membuka perangkat kamera dan membuat sesi aktif
- Setelah inisialisasi, kerangka kerja mulai mendengarkan penyedia kamera mana pun yang mengimplementasikan antarmuka
ICameraProvider
. Jika penyedia atau penyedia tersebut ada, kerangka kerja akan mencoba membuat koneksi. - Kerangka kerja ini menghitung perangkat kamera melalui
ICameraProvider::getCameraIdList()
. - Kerangka kerja ini membuat instance
ICameraDevice
baru dengan memanggilICameraProvider::getCameraDeviceInterface_VX_X()
masing-masing. - Kerangka kerja ini memanggil
ICameraDevice::open()
untuk membuat sesi pengambilan aktif baru ICameraDeviceSession.
Menggunakan sesi kamera aktif
- Kerangka kerja ini memanggil
ICameraDeviceSession::configureStreams()
dengan daftar aliran input/output ke perangkat HAL. - Kerangka kerja ini meminta pengaturan default untuk beberapa kasus penggunaan dengan panggilan ke
ICameraDeviceSession::constructDefaultRequestSettings()
. Hal ini dapat terjadi kapan saja setelahICameraDeviceSession
dibuat olehICameraDevice::open
. - Kerangka kerja membangun dan mengirimkan permintaan penangkapan pertama ke HAL dengan pengaturan berdasarkan salah satu set pengaturan default, dan dengan setidaknya satu aliran keluaran yang telah didaftarkan sebelumnya oleh kerangka kerja. Ini dikirim ke HAL dengan
ICameraDeviceSession::processCaptureRequest()
. HAL harus memblokir kembalinya panggilan ini sampai siap untuk mengirimkan permintaan berikutnya. - Kerangka kerja ini terus mengirimkan permintaan dan memanggil
ICameraDeviceSession::constructDefaultRequestSettings()
untuk mendapatkan buffer pengaturan default untuk kasus penggunaan lain jika diperlukan. - Saat pengambilan permintaan dimulai (sensor mulai mengekspos untuk pengambilan), HAL memanggil
ICameraDeviceCallback::notify()
dengan pesan SHUTTER, termasuk nomor frame dan stempel waktu untuk memulai eksposur. Callback notifikasi ini tidak harus terjadi sebelum panggilanprocessCaptureResult()
pertama untuk suatu permintaan, namun tidak ada hasil yang dikirim ke aplikasi untuk pengambilan hingganotify()
untuk pengambilan tersebut dipanggil. - Setelah beberapa penundaan alur, HAL mulai mengembalikan tangkapan yang telah selesai ke kerangka kerja dengan
ICameraDeviceCallback::processCaptureResult()
. Ini dikembalikan dalam urutan yang sama dengan permintaan yang diajukan. Beberapa permintaan dapat dilakukan sekaligus, bergantung pada kedalaman saluran pipa perangkat HAL kamera.
Setelah beberapa waktu, salah satu hal berikut akan terjadi:
- Kerangka kerja mungkin berhenti mengirimkan permintaan baru, menunggu hingga pengambilan yang ada selesai (semua buffer terisi, semua hasil dikembalikan), lalu memanggil
ICameraDeviceSession::configureStreams()
lagi. Tindakan ini akan menyetel ulang perangkat keras dan saluran kamera untuk serangkaian aliran input/output baru. Beberapa aliran mungkin digunakan kembali dari konfigurasi sebelumnya. Kerangka kerja kemudian melanjutkan dari permintaan penangkapan pertama ke HAL, jika setidaknya ada satu aliran keluaran yang terdaftar. (Jika tidak,ICameraDeviceSession::configureStreams()
diperlukan terlebih dahulu.) - Framework ini dapat memanggil
ICameraDeviceSession::close()
untuk mengakhiri sesi kamera. Ini dapat dipanggil kapan saja ketika tidak ada panggilan lain dari kerangka kerja yang aktif, meskipun panggilan tersebut dapat diblokir hingga semua pengambilan dalam penerbangan selesai (semua hasil dikembalikan, semua buffer terisi). Setelah panggilanclose()
kembali, tidak ada lagi panggilan keICameraDeviceCallback
yang diizinkan dari HAL. Setelah panggilanclose()
berlangsung, framework tidak boleh memanggil fungsi perangkat HAL lainnya. - Jika terjadi kesalahan atau kejadian asinkron lainnya, HAL harus memanggil
ICameraDeviceCallback::notify()
dengan pesan kesalahan/peristiwa yang sesuai. Setelah kembali dari pemberitahuan kesalahan fatal di seluruh perangkat, HAL harus bertindak seolah-olahclose()
telah dipanggil. Namun, HAL harus membatalkan atau menyelesaikan semua pengambilan yang belum dilakukan sebelum memanggilnotify()
, sehingga setelahnotify()
dipanggil dengan kesalahan fatal, framework tidak akan menerima callback lebih lanjut dari perangkat. Metode selainclose()
harus mengembalikan -ENODEV atau NULL setelah metodenotify()
kembali dari pesan kesalahan fatal.
Tingkat perangkat keras
Perangkat kamera dapat mengimplementasikan beberapa level perangkat keras tergantung pada kemampuannya. Untuk informasi lebih lanjut, lihat tingkat perangkat keras yang didukung .
Interaksi antara permintaan penangkapan aplikasi, kontrol 3A, dan alur pemrosesan
Bergantung pada pengaturan di blok kontrol 3A, alur kamera mengabaikan beberapa parameter dalam permintaan pengambilan aplikasi dan sebagai gantinya menggunakan nilai yang disediakan oleh rutinitas kontrol 3A. Misalnya, saat eksposur otomatis aktif, waktu eksposur, durasi bingkai, dan parameter sensitivitas sensor dikontrol oleh algoritme platform 3A, dan nilai apa pun yang ditentukan aplikasi akan diabaikan. Nilai yang dipilih untuk frame oleh rutinitas 3A harus dilaporkan dalam metadata keluaran. Tabel berikut menjelaskan berbagai mode blok kontrol 3A dan properti yang dikontrol oleh mode ini. Lihat file platform/system/media/camera/docs/docs.html untuk mengetahui definisi properti ini.
Parameter | Negara | Properti dikontrol |
---|---|---|
android.kontrol.aeMode | MATI | Tidak ada |
PADA | android.sensor.exposureTime android.sensor.frameDuration android.sensor.sensitivity android.lens.aperture (jika didukung) android.lens.filterDensity (jika didukung) | |
ON_AUTO_FLASH | Semuanya AKTIF, ditambah android.flash.firingPower, android.flash.firingTime, dan android.flash.mode | |
ON_ALWAYS_FLASH | Sama seperti ON_AUTO_FLASH | |
ON_AUTO_FLASH_RED_EYE | Sama seperti ON_AUTO_FLASH | |
android.control.awbMode | MATI | Tidak ada |
PUTIH_BALANCE_* | android.colorCorrection.transform. Penyesuaian khusus platform jika android.colorCorrection.mode adalah FAST atau HIGH_QUALITY. | |
android.kontrol.afMode | MATI | Tidak ada |
MODE FOKUS_* | android.lens.focusDistance | |
android.control.videoStabilisasi | MATI | Tidak ada |
PADA | Dapat menyesuaikan Android.scaler.cropRegion untuk mengimplementasikan stabilisasi video | |
android.kontrol.mode | MATI | AE, AWB, dan AF dinonaktifkan |
MOBIL | Pengaturan AE, AWB, dan AF individual digunakan | |
ADEGAN_MODE_* | Dapat mengesampingkan semua parameter yang tercantum di atas. Kontrol 3A individual dinonaktifkan. |
Kontrol di blok Pemrosesan Gambar pada Gambar 2 semuanya beroperasi dengan prinsip yang sama, dan umumnya setiap blok memiliki tiga mode:
- MATI: Blok pemrosesan ini dinonaktifkan. Blok demosaik, koreksi warna, dan penyesuaian kurva nada tidak dapat dinonaktifkan.
- CEPAT: Dalam mode ini, blok pemrosesan tidak boleh memperlambat kecepatan bingkai keluaran dibandingkan dengan mode OFF, namun sebaliknya harus menghasilkan keluaran dengan kualitas terbaik mengingat batasan tersebut. Biasanya, ini akan digunakan untuk mode pratinjau atau perekaman video, atau pengambilan burst untuk gambar diam. Pada beberapa perangkat, ini mungkin setara dengan mode OFF (tidak ada pemrosesan yang dapat dilakukan tanpa memperlambat kecepatan bingkai), dan pada beberapa perangkat, ini mungkin setara dengan mode HIGH_QUALITY (kualitas terbaik tetap tidak memperlambat kecepatan bingkai).
- HIGH_QUALITY: Dalam mode ini, blok pemrosesan harus menghasilkan hasil dengan kualitas terbaik, memperlambat kecepatan bingkai keluaran sesuai kebutuhan. Biasanya, ini akan digunakan untuk pengambilan gambar diam berkualitas tinggi. Beberapa blok menyertakan kontrol manual yang dapat dipilih secara opsional, bukan FAST atau HIGH_QUALITY. Misalnya, blok koreksi warna mendukung matriks transformasi warna, sedangkan penyesuaian kurva nada mendukung kurva pemetaan nada global yang berubah-ubah.
Kecepatan frame maksimum yang dapat didukung oleh subsistem kamera merupakan fungsi dari banyak faktor:
- Resolusi aliran gambar keluaran yang diminta
- Ketersediaan mode binning/skipping pada imager
- Bandwidth antarmuka imager
- Bandwidth dari berbagai blok pemrosesan ISP
Karena faktor-faktor ini dapat sangat bervariasi antara ISP dan sensor yang berbeda, antarmuka HAL kamera mencoba mengabstraksi batasan bandwidth ke dalam model yang sesederhana mungkin. Model yang disajikan memiliki ciri-ciri sebagai berikut:
- Sensor gambar selalu dikonfigurasi untuk mengeluarkan resolusi sekecil mungkin berdasarkan ukuran aliran keluaran yang diminta aplikasi. Resolusi terkecil didefinisikan sebagai setidaknya sama besar dengan ukuran aliran keluaran terbesar yang diminta.
- Karena permintaan apa pun dapat menggunakan salah satu atau semua aliran keluaran yang dikonfigurasi saat ini, sensor dan ISP harus dikonfigurasi untuk mendukung penskalaan satu tangkapan ke semua aliran secara bersamaan.
- Aliran JPEG bertindak seperti aliran YUV yang diproses untuk permintaan yang tidak disertakan; dalam permintaan yang direferensikan secara langsung, mereka bertindak sebagai aliran JPEG.
- Prosesor JPEG dapat berjalan secara bersamaan ke seluruh saluran kamera tetapi tidak dapat memproses lebih dari satu pengambilan dalam satu waktu.