Android 9 memperkenalkan dukungan API untuk perangkat multi-kamera melalui perangkat kamera logis baru yang terdiri dari dua atau lebih perangkat kamera fisik yang mengarah ke arah yang sama. Perangkat kamera logis diekspos sebagai CameraDevice/CaptureSession tunggal ke aplikasi yang memungkinkan interaksi dengan fitur multi-kamera terintegrasi HAL. Aplikasi dapat secara opsional mengakses dan mengontrol aliran, metadata, dan kontrol kamera fisik yang mendasarinya.
Gambar 1. Dukungan multi-kamera
Dalam diagram ini, ID kamera yang berbeda diberi kode warna. Aplikasi dapat melakukan streaming buffer mentah dari setiap kamera fisik secara bersamaan. Anda juga dapat menyetel 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 perangkat fisik yang membentuk 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()
.
Permintaan kamera fisik individual hanya dapat 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:
- Menambahkan kemampuan
ANDROID_REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA
untuk perangkat kamera logis yang didukung oleh dua atau lebih 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 mengorelasikan 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 rana/eksposur hardware.ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_CALIBRATED
: Untuk sensor dalam mode utama-sekunder, sinkronisasi rana/eksposur 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 permintaan individual.Jika permintaan individual didukung, proses dan terapkan
physicalCameraSettings
yang dapat tiba sebagai bagian dari permintaan pengambilan dan tambahkanphysicalCameraMetadata
yang sesuai.Untuk versi perangkat Camera HAL 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 dengan
tingkat hardware tertentu sama dengan yang diperlukan dalam
CameraDevice.createCaptureSession
.
Semua aliran dalam peta konfigurasi aliran harus berupa aliran logis.
Untuk perangkat kamera logis yang mendukung kemampuan RAW dengan sub-kamera fisik berbagai ukuran, 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 diimplementasikan HAL dengan beralih di antara sub-kamera fisik selama pengambilan gambar RAW, aplikasi harus mengonfigurasi aliran sub-kamera fisik, bukan aliran RAW logis.
Kombinasi streaming yang dijamin
Kamera logis dan kamera fisik yang mendasarinya harus menjamin kombinasi streaming wajib yang diperlukan untuk level perangkatnya.
Perangkat kamera logis harus beroperasi dengan cara yang sama seperti perangkat kamera fisik berdasarkan tingkat dan kemampuan hardware-nya. Sebaiknya set fiturnya merupakan superset dari set fitur kamera fisik individual.
Di perangkat yang menjalankan Android 9, untuk setiap kombinasi streaming yang dijamin, kamera logis harus mendukung:
Mengganti satu aliran YUV_420_888 atau mentah logis dengan dua aliran fisik berukuran dan berformat sama, masing-masing dari kamera fisik terpisah, dengan asumsi ukuran dan formatnya didukung oleh kamera fisik.
Menambahkan dua aliran data mentah, satu dari setiap kamera fisik, jika kamera logis tidak mengiklankan kemampuan RAW, tetapi kamera fisik yang mendasarinya mengiklankan kemampuan RAW. 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 saat durasi frame minimum aliran fisik dan logis sama.
Pertimbangan performa dan daya
Performa
- Mengonfigurasi dan melakukan streaming aliran fisik dapat memperlambat kecepatan pengambilan gambar kamera logis karena batasan resource.
- Menerapkan setelan kamera fisik dapat memperlambat kecepatan pengambilan gambar jika kamera yang mendasarinya disetel ke kecepatan frame yang berbeda.
Daya:
- Pengoptimalan daya HAL terus berfungsi dalam kasus default.
- Mengonfigurasi atau meminta aliran fisik dapat menggantikan pengoptimalan daya internal HAL dan menyebabkan penggunaan daya yang lebih besar.
Penyesuaian
Anda dapat menyesuaikan penerapan perangkat dengan cara berikut.
- Output gabungan perangkat kamera logis sepenuhnya bergantung pada penerapan HAL. Keputusan tentang cara menggabungkan aliran logis yang berasal dari kamera fisik bersifat transparan bagi 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
mengiklankan beberapa atau semua PHYSICAL_ID di
getCameraIdList
. PanggilangetPhysicalCameraCharacteristics
kemudian harus menampilkan karakteristik kamera fisik.
Validasi
Perangkat multi-kamera logis harus lulus CTS kamera seperti kamera reguler 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 adegan 1 dan adegan 4 dijalankan dengan platform pengujian
ITS-in-a-box. Pengujian test_multi_camera_match
menegaskan bahwa kecerahan
pusat gambar cocok saat kedua kamera diaktifkan. Pengujian
test_multi_camera_alignment
menegaskan bahwa jarak, orientasi, dan parameter distorsi kamera dimuat dengan benar. Jika sistem multi-kamera mencakup kamera FoV Lebar (>90o), diperlukan kotak ITS versi rev2.
Sensor_fusion
adalah platform pengujian kedua yang memungkinkan gerakan ponsel berulang dan yang ditentukan, serta memastikan bahwa stempel waktu giroskop dan sensor gambar cocok dan bahwa 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) Menyembunyikan sub-kamera fisik dari
getCameraIdList
. Tindakan ini mengurangi jumlah kamera yang dapat dibuka langsung oleh aplikasi, sehingga tidak perlu lagi memiliki logika pemilihan kamera yang rumit. - (Android 11 atau yang lebih tinggi) Untuk perangkat multi-kamera logis yang mendukung zoom optik, terapkan API
ANDROID_CONTROL_ZOOM_RATIO
, dan gunakanANDROID_SCALER_CROP_REGION
hanya untuk pemangkasan rasio aspek.ANDROID_CONTROL_ZOOM_RATIO
memungkinkan perangkat memperkecil tampilan 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 post-zoom field of view sebagai sensor active array. 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 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 melakukan zoom out ke lensa ultrawide, fakta bahwa kamera fisik yang mendasarinya adalah fokus tetap transparan bagi 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 tidak 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
mengalami masalah tidak dapat mencapai 4k @ 60 fps pada
ANDROID_CONTROL_ZOOM_RATIO
nilai 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 mencakup streaming fisik.
Jika HAL mendukung kombinasi dengan aliran fisik:
- (Android 11 atau yang lebih tinggi) Untuk menangani kasus penggunaan yang lebih baik seperti kedalaman dari stereo dan pelacakan gerakan, 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 kolom tampilan streaming fisik agar sama dengan streaming logis.
- Untuk mengatasi tekanan memori yang disebabkan oleh beberapa aliran fisik, pastikan aplikasi menggunakan
discardFreeBuffers
untuk membatalkan alokasi buffer kosong (buffer yang dilepaskan oleh konsumen, tetapi belum dikeluarkan dari antrean oleh produsen) jika aliran fisik diperkirakan akan tidak ada aktivitas selama jangka waktu tertentu. - Jika aliran 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 menghadap aplikasi, sehingga mengurangi penggunaan memori.