Android 9 memperkenalkan dukungan API untuk perangkat multi-kamera melalui perangkat kamera logis baru yang terdiri dari dua atau beberapa perangkat kamera fisik yang mengarah ke arah yang sama. Perangkat kamera logis ditampilkan sebagai satu CameraDevice/CaptureSession ke aplikasi yang memungkinkan interaksi dengan fitur multi-kamera yang terintegrasi dengan HAL. Aplikasi dapat secara opsional mengakses dan mengontrol streaming, metadata, dan kontrol kamera fisik yang mendasarinya.
Gambar 1. Dukungan multi-kamera
Dalam diagram ini, ID kamera yang berbeda diberi kode warna. Aplikasi dapat menstreaming buffering mentah dari setiap kamera fisik secara bersamaan. Anda juga dapat menetapkan kontrol terpisah dan menerima metadata terpisah dari kamera fisik yang berbeda.
Contoh dan sumber
Perangkat multi-kamera harus diiklankan dengan kemampuan multi-kamera logis.
Klien kamera dapat mengkueri ID kamera perangkat fisik yang
membuat kamera logis tertentu dengan memanggil
getPhysicalCameraIds()
.
ID yang ditampilkan sebagai bagian dari hasil kemudian digunakan untuk mengontrol perangkat fisik
secara terpisah melalui
setPhysicalCameraId()
.
Hasil dari masing-masing permintaan tersebut dapat dikueri dari hasil
lengkap dengan memanggil
getPhysicalCameraResults()
.
Setiap permintaan kamera fisik mungkin hanya mendukung subset parameter
yang terbatas. Untuk menerima daftar parameter yang didukung, developer dapat memanggil
getAvailablePhysicalCameraRequestKeys()
.
Streaming kamera fisik hanya didukung untuk permintaan non-pemrosesan ulang dan hanya untuk sensor monokrom dan bayer.
Implementasi
Checklist dukungan
Untuk menambahkan perangkat multi-kamera logis di sisi HAL:
- Tambahkan
kemampuan
ANDROID_REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA
untuk perangkat kamera logis apa pun yang didukung oleh dua atau beberapa kamera fisik yang juga diekspos ke aplikasi. - Isi kolom metadata
ANDROID_LOGICAL_MULTI_CAMERA_PHYSICAL_IDS
statis dengan daftar ID kamera fisik. - Isi metadata statis terkait kedalaman yang diperlukan untuk berkorelasi antara
piksel aliran kamera fisik:
ANDROID_LENS_POSE_ROTATION
,ANDROID_LENS_POSE_TRANSLATION
,ANDROID_LENS_INTRINSIC_CALIBRATION
,ANDROID_LENS_DISTORTION
,ANDROID_LENS_POSE_REFERENCE
. Tetapkan kolom metadata
ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE
statis ke:ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_APPROXIMATE
: Untuk sensor dalam mode utama utama, tidak ada sinkronisasi shutter/eksposur hardware.ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_CALIBRATED
: Untuk sensor dalam mode utama-sekunder, sinkronisasi eksposur/rana hardware.
Isi
ANDROID_REQUEST_AVAILABLE_PHYSICAL_CAMERA_REQUEST_KEYS
dengan daftar parameter yang didukung untuk setiap kamera fisik. Daftar dapat kosong jika perangkat logis tidak mendukung setiap permintaan.Jika setiap permintaan didukung, proses dan terapkan setiap
physicalCameraSettings
yang dapat diterima sebagai bagian dari permintaan pengambilan dan tambahkan setiapphysicalCameraMetadata
sesuai kebutuhan.Untuk perangkat Camera HAL versi 3.5 (diperkenalkan di Android 10) atau yang lebih tinggi, isi kunci hasil
ANDROID_LOGICAL_MULTI_CAMERA_ACTIVE_PHYSICAL_ID
menggunakan ID kamera fisik aktif saat ini yang mendukung kamera logis.
Untuk perangkat yang menjalankan Android 9, perangkat kamera harus mendukung penggantian satu aliran YUV/RAW logis dengan aliran fisik berukuran sama (tidak berlaku untuk aliran RAW) dan format yang sama dari dua kamera fisik. Hal ini tidak berlaku untuk perangkat yang menjalankan Android 10.
Untuk perangkat yang menjalankan Android 10 dengan
versi perangkat HAL kamera
3.5
atau yang lebih tinggi, perangkat kamera harus mendukung
isStreamCombinationSupported
agar aplikasi dapat membuat kueri apakah kombinasi streaming tertentu yang berisi
streaming fisik didukung.
Peta konfigurasi streaming
Untuk kamera logis, kombinasi streaming wajib untuk perangkat kamera
tingkat hardware tertentu sama dengan yang diperlukan di
CameraDevice.createCaptureSession
.
Semua aliran data dalam peta konfigurasi aliran data harus berupa aliran data logis.
Untuk perangkat kamera logis yang mendukung kemampuan RAW dengan sub-kamera fisik dengan ukuran berbeda, jika aplikasi mengonfigurasi streaming RAW logis, perangkat kamera logis tidak boleh beralih ke sub-kamera fisik dengan ukuran sensor berbeda. Hal ini memastikan bahwa aplikasi penangkapan RAW yang ada tidak rusak.
Untuk memanfaatkan zoom optik yang diterapkan HAL dengan beralih antara sub-kamera fisik selama pengambilan RAW, aplikasi harus mengonfigurasi streaming sub-kamera fisik, bukan streaming RAW logis.
Kombinasi streaming terjamin
Kamera logis dan kamera fisik yang mendasarinya harus menjamin kombinasi streaming wajib yang diperlukan untuk tingkat perangkatnya.
Perangkat kamera logis harus beroperasi dengan cara yang sama seperti perangkat kamera fisik berdasarkan kemampuan dan level hardware-nya. Sebaiknya set fiturnya adalah superset dari setiap kamera fisik.
Pada perangkat yang menjalankan Android 9, untuk setiap kombinasi streaming yang dijamin, kamera logis harus mendukung:
Mengganti satu YUV_420_888 logis atau streaming mentah dengan dua aliran fisik dengan ukuran dan format yang sama, masing-masing dari kamera fisik terpisah, mengingat ukuran dan format didukung oleh kamera fisik.
Menambahkan dua aliran raw, satu dari setiap kamera fisik, jika kamera logis tidak mengiklankan kemampuan RAW, tetapi kamera fisik yang mendasarinya melakukannya. Hal ini biasanya terjadi saat kamera fisik memiliki ukuran sensor yang berbeda.
Menggunakan aliran fisik sebagai pengganti aliran logis dengan ukuran dan format yang sama. Hal ini tidak boleh memperlambat kecepatan frame pengambilan jika durasi frame minimum dari aliran fisik dan logis sama.
Pertimbangan performa dan daya
Performa
- Mengonfigurasi dan melakukan streaming streaming fisik dapat memperlambat rasio pengambilan kamera logis karena batasan resource.
- Menerapkan setelan kamera fisik dapat memperlambat kecepatan pengambilan jika kamera yang mendasarinya dimasukkan ke dalam kecepatan frame yang berbeda.
Daya:
- Pengoptimalan daya HAL terus berfungsi dalam kasus default.
- Mengonfigurasi atau meminta aliran fisik dapat mengganti pengoptimalan daya internal HAL dan menyebabkan lebih banyak penggunaan daya.
Penyesuaian
Anda dapat menyesuaikan penerapan perangkat dengan cara berikut.
- Output gabungan perangkat kamera logis sepenuhnya bergantung pada penerapan HAL. Keputusan tentang cara aliran logis yang digabungkan berasal dari kamera fisik bersifat transparan untuk aplikasi dan framework kamera Android.
- Permintaan dan hasil fisik individual dapat didukung secara opsional. Kumpulan parameter yang tersedia dalam permintaan tersebut juga sepenuhnya bergantung pada implementasi HAL tertentu.
- Mulai Android 10, HAL dapat mengurangi jumlah
kamera yang dapat dibuka langsung oleh aplikasi dengan memilih untuk tidak
mengiklankan beberapa atau semua PHYSICAL_ID di
getCameraIdList
. MemanggilgetPhysicalCameraCharacteristics
kemudian harus menampilkan karakteristik kamera fisik.
Validasi
Perangkat multi-kamera logis harus lulus CTS kamera seperti kamera biasa lainnya.
Kasus pengujian yang menargetkan jenis perangkat ini dapat ditemukan di
modul
LogicalCameraDeviceTest
.
Ketiga pengujian ITS ini menargetkan sistem multi-kamera untuk memfasilitasi penggabungan gambar yang tepat:
scene1/test_multi_camera_match.py
scene4/test_multi_camera_alignment.py
sensor_fusion/test_multi_camera_frame_sync.py
Pengujian scene 1 dan scene 4 dijalankan dengan rig pengujian ITS-in-a-box. Pengujian test_multi_camera_match
menyatakan bahwa kecerahan
bagian tengah gambar cocok saat kedua kamera diaktifkan. Uji
test_multi_camera_alignment
menyatakan bahwa parameter jarak, orientasi,
dan distorsi kamera dimuat dengan benar. Jika sistem multi-kamera
menyertakan kamera FoV Lebar (>90o), kotak ITS versi rev2 diperlukan.
Sensor_fusion
adalah rig pengujian kedua yang memungkinkan gerakan ponsel berulang
yang ditentukan dan menyatakan bahwa stempel waktu giroskop dan sensor gambar cocok dan
frame multi-kamera disinkronkan.
Semua kotak tersedia melalui AcuSpec, Inc. (www.acuspecinc.com, fred@acuspecinc.com) dan MYWAY Manufacturing (www.myway.tw, sales@myway.tw). Selain itu, kotak ITS rev1 dapat dibeli melalui West-Mark (www.west-mark.com, dgoodman@west-mark.com).
Praktik terbaik
Untuk memanfaatkan sepenuhnya fitur yang diaktifkan oleh multi-kamera sekaligus mempertahankan kompatibilitas aplikasi, ikuti praktik terbaik berikut saat menerapkan perangkat multi-kamera logis:
- (Android 10 atau yang lebih tinggi) Sembunyikan sub-kamera fisik dari
getCameraIdList
. Hal ini mengurangi jumlah kamera yang dapat dibuka langsung oleh aplikasi, sehingga aplikasi tidak perlu memiliki logika pemilihan kamera yang kompleks. - (Android 11 atau yang lebih tinggi) Untuk perangkat multi-kamera
logis yang mendukung zoom optik, terapkan
ANDROID_CONTROL_ZOOM_RATIO
API, dan gunakanANDROID_SCALER_CROP_REGION
hanya untuk pemangkasan rasio lebar tinggi.ANDROID_CONTROL_ZOOM_RATIO
memungkinkan perangkat memperkecil dan mempertahankan presisi yang lebih baik. Dalam hal ini, HAL harus menyesuaikan sistem koordinatANDROID_SCALER_CROP_REGION
,ANDROID_CONTROL_AE_REGIONS
,ANDROID_CONTROL_AWB_REGIONS
,ANDROID_CONTROL_AF_REGIONS
,ANDROID_STATISTICS_FACE_RECTANGLES
, danANDROID_STATISTICS_FACE_LANDMARKS
untuk memperlakukan kolom tampilan pasca-zoom sebagai array aktif sensor. Untuk mengetahui informasi selengkapnya tentang cara kerjaANDROID_SCALER_CROP_REGION
bersama denganANDROID_CONTROL_ZOOM_RATIO
, lihatcamera3_crop_reprocess#cropping
. - Untuk perangkat multi-kamera dengan kamera fisik yang memiliki kemampuan
berbeda, pastikan perangkat tersebut mengiklankan dukungan untuk nilai
atau rentang tertentu untuk kontrol hanya jika seluruh rentang zoom mendukung nilai
atau rentang tersebut. Misalnya, jika kamera logis terdiri dari kamera ultrawide,
lebar, dan telefoto, lakukan hal berikut:
- Jika ukuran array aktif kamera fisik berbeda, HAL kamera harus melakukan pemetaan dari array aktif kamera fisik ke
array aktif kamera logis untuk
ANDROID_SCALER_CROP_REGION
,ANDROID_CONTROL_AE_REGIONS
,ANDROID_CONTROL_AWB_REGIONS
,ANDROID_CONTROL_AF_REGIONS
,ANDROID_STATISTICS_FACE_RECTANGLES
, danANDROID_STATISTICS_FACE_LANDMARKS
sehingga dari perspektif aplikasi, sistem koordinat adalah ukuran array aktif kamera logis. - Jika kamera lebar dan telefoto mendukung fokus otomatis, tetapi kamera ultrawide memiliki fokus tetap, pastikan kamera logis mengiklankan dukungan fokus otomatis. HAL harus menyimulasikan mesin status fokus otomatis untuk kamera ultrawide sehingga saat aplikasi memperkecil lensa ultrawide, fakta bahwa kamera fisik yang mendasarinya adalah fokus tetap akan transparan untuk aplikasi, dan mesin status fokus otomatis untuk mode AF yang didukung berfungsi seperti yang diharapkan.
- Jika kamera lebar dan telefoto mendukung 4K @ 60 fps, dan
kamera ultra lebar hanya mendukung 4K @ 30 fps, atau 1080p @ 60 fps, tetapi
bukan 4K @ 60 fps, pastikan kamera logis tidak mengiklankan 4k @
60 fps dalam konfigurasi streaming yang didukungnya. Hal ini menjamin integritas kemampuan kamera logis, sehingga memastikan aplikasi tidak akan mengalami masalah karena tidak mencapai 4k @ 60 fps dengan nilai
ANDROID_CONTROL_ZOOM_RATIO
kurang dari 1.
- Jika ukuran array aktif kamera fisik berbeda, HAL kamera harus melakukan pemetaan dari array aktif kamera fisik ke
array aktif kamera logis untuk
- Mulai dari Android 10, multi-kamera logis
tidak diperlukan untuk mendukung kombinasi streaming yang menyertakan streaming fisik.
Jika HAL mendukung kombinasi dengan streaming fisik:
- (Android 11 atau yang lebih tinggi) Untuk menangani kasus penggunaan seperti kedalaman dari stereo dan pelacakan gerakan dengan lebih baik, buat bidang pandang output streaming fisik sebesar yang dapat dicapai oleh hardware. Namun, jika streaming fisik dan streaming logis berasal dari kamera fisik yang sama, batasan hardware dapat memaksa bidang pandang streaming fisik sama dengan streaming logis.
- Untuk mengatasi tekanan memori yang disebabkan oleh beberapa aliran fisik,
pastikan aplikasi menggunakan
discardFreeBuffers
untuk mengalokasikan ulang buffering gratis (buffer yang dirilis oleh konsumen, tetapi belum dihapus dari antrean oleh produsen) jika aliran fisik diperkirakan akan tidak ada aktivitas selama jangka waktu tertentu. - Jika streaming fisik dari kamera fisik yang berbeda biasanya
tidak dilampirkan ke permintaan yang sama, pastikan aplikasi menggunakan
surface group
sehingga satu antrean buffer digunakan untuk mendukung dua platform yang ditampilkan ke aplikasi, sehingga mengurangi konsumsi memori.