Android 9 memperkenalkan dukungan API untuk perangkat multi-kamera melalui perangkat kamera logis baru yang terdiri dari dua perangkat kamera fisik atau lebih 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 membuat kueri ID kamera dari perangkat fisik yang digunakan
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 setiap 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 kamera fisik atau lebih 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 eksposur/rana 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 permintaan individual 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
dari 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 berukuran berbeda, jika aplikasi mengonfigurasi aliran RAW logis, perangkat kamera logis tidak boleh beralih ke sub-kamera fisik dengan ukuran sensor yang berbeda. Hal ini memastikan bahwa aplikasi pengambilan 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 yang dijamin
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 kumpulan fiturnya merupakan superset dari kumpulan fitur setiap kamera fisik.
Pada perangkat yang menjalankan Android 9, untuk setiap kombinasi streaming yang dijamin, kamera logis harus mendukung:
Mengganti satu aliran raw atau YUV_420_888 logis 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 gabungan 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 penerapan HAL tertentu.
- Mulai Android 10, HAL dapat mengurangi jumlah
kamera yang dapat dibuka langsung oleh aplikasi dengan memilih untuk tidak
mengumumkan beberapa atau semua PHYSICAL_ID di
getCameraIdList
. MemanggilgetPhysicalCameraCharacteristics
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
.
Tiga 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 bidang pandang pasca-zoom sebagai array aktif sensor. Untuk informasi selengkapnya tentang cara kerjaANDROID_SCALER_CROP_REGION
bersamaANDROID_CONTROL_ZOOM_RATIO
, lihatcamera3_crop_reprocess#cropping
. - Untuk perangkat multi-kamera dengan kamera fisik yang memiliki kemampuan
yang berbeda, pastikan perangkat 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 buffering digunakan untuk mendukung dua platform yang menghadap aplikasi, sehingga mengurangi konsumsi memori.