Android 9 memperkenalkan dukungan API untuk multi-kamera melalui perangkat kamera logis baru yang terdiri dari dua atau lebih perangkat kamera yang menunjuk ke arah yang sama. Perangkat kamera logis adalah diekspos sebagai satu CameraDevice/CaptureSession ke aplikasi yang memungkinkan 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 tersebut dapat melakukan streaming buffer mentah dari setiap kamera fisik secara bersamaan. Ini juga memungkinkan untuk mengatur kontrol terpisah dan menerima metadata yang terpisah dari kamera fisik.
Contoh dan sumber
Perangkat multi-kamera harus diiklankan dengan kemampuan multi-kamera logis.
Klien kamera dapat melakukan kueri ID kamera dari perangkat fisik
kamera logis dengan memanggil
getPhysicalCameraIds()
ID yang ditampilkan sebagai bagian dari hasil kemudian digunakan untuk mengontrol perangkat fisik
satu per satu melalui
setPhysicalCameraId()
Hasil dari permintaan individual tersebut dapat dikueri dari
hasil dengan memanggil
getPhysicalCameraResults()
Masing-masing permintaan kamera fisik mungkin hanya mendukung subset terbatas dari
parameter. 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
ANDROID_REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA
untuk perangkat kamera logis apa pun yang ditunjang oleh dua atau lebih kamera yang juga terekspos ke aplikasi. - Isi kolom statis
ANDROID_LOGICAL_MULTI_CAMERA_PHYSICAL_IDS
kolom metadata dengan daftar ID kamera fisik. - Isi metadata statis terkait kedalaman yang diperlukan untuk berkorelasi antara
streaming kamera fisik {i>pixel<i}:
ANDROID_LENS_POSE_ROTATION
,ANDROID_LENS_POSE_TRANSLATION
,ANDROID_LENS_INTRINSIC_CALIBRATION
,ANDROID_LENS_DISTORTION
,ANDROID_LENS_POSE_REFERENCE
. Setel statis
ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE
kolom metadata 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 shutter/eksposur hardware.
Isi
ANDROID_REQUEST_AVAILABLE_PHYSICAL_CAMERA_REQUEST_KEYS
dengan daftar parameter yang didukung untuk setiap kamera fisik. Tujuan daftar ini bisa kosong jika perangkat logis tidak mendukung permintaan individual.Jika setiap permintaan didukung, proses dan terapkan permintaan tersebut
physicalCameraSettings
yang bisa muncul sebagai bagian dari permintaan penangkapan dan menambahkanphysicalCameraMetadata
sebagaimana mestinya.Untuk perangkat Camera HAL versi 3.5 (diperkenalkan di Android 10) atau yang lebih tinggi, isi
ANDROID_LOGICAL_MULTI_CAMERA_ACTIVE_PHYSICAL_ID
menggunakan ID kamera fisik yang 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 streaming RAW) dan format yang sama dari dua kamera. Hal ini tidak berlaku untuk perangkat yang menjalankan Android 10.
Untuk perangkat yang menjalankan Android 10 dengan
versi perangkat HAL kamera adalah
3,5
atau lebih tinggi, perangkat kamera harus mendukung
isStreamCombinationSupported
aplikasi untuk mengkueri apakah kombinasi streaming tertentu yang berisi
mendukung streaming fisik.
Peta konfigurasi streaming
Untuk kamera logis, kombinasi streaming wajib untuk perangkat kamera
tingkat perangkat keras tertentu sama dengan
yang dibutuhkan dalam
CameraDevice.createCaptureSession
Semua aliran data di peta konfigurasi aliran data harus berupa aliran yang logis.
Untuk perangkat kamera logis yang mendukung kemampuan RAW dengan sub-kamera fisik dengan ukuran yang berbeda, jika aplikasi mengonfigurasi aliran RAW yang logis, perangkat kamera logis tidak boleh beralih ke sub-kamera fisik dengan ukuran sensor. 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 gambar RAW, aplikasi harus mengonfigurasi streaming sub-kamera fisik, bukan streaming RAW yang logis.
Kombinasi streaming terjamin
Baik kamera logis dan kamera fisik yang mendasarinya harus menjamin kombinasi streaming wajib yang diperlukan untuk tingkat perangkat mereka.
Perangkat kamera logis harus beroperasi dengan cara yang sama seperti kamera fisik perangkat keras berdasarkan tingkat dan kemampuan perangkat kerasnya. Disarankan bahwa set fitur adalah superset dari setiap kamera fisik.
Di perangkat yang menjalankan Android 9, untuk setiap perangkat yang dijamin kombinasi streaming, kamera logis harus mendukung:
Mengganti satu YUV_420_888 logis atau streaming mentah dengan dua aliran fisik ukuran dan format yang sama, masing-masing dari kamera fisik yang terpisah, mengingat ukuran dan format yang didukung oleh kamera fisik.
Menambahkan dua streaming mentah, satu dari setiap kamera fisik, jika kamera logis tidak mengiklankan kemampuan RAW, tetapi kamera fisik yang mendasarinya melakukannya. Hal ini biasanya terjadi ketika kamera fisik memiliki ukuran sensor yang berbeda.
Menggunakan aliran fisik sebagai pengganti aliran logis dengan ukuran dan format font. Tindakan ini tidak boleh memperlambat kecepatan frame penangkapan durasi {i>frame<i} minimum dari aliran fisik dan logis adalah sama.
Pertimbangan performa dan daya
Performa
- Mengonfigurasi dan melakukan streaming aliran fisik dapat memperlambat kecepatan pengambilan gambar kamera logis karena batasan sumber daya.
- Menerapkan setelan kamera fisik dapat memperlambat laju tangkapan jika kamera yang mendasarinya ditempatkan ke dalam kecepatan {i>frame<i} yang berbeda.
Daya:
- Pengoptimalan daya HAL terus berfungsi dalam kasus default.
- Mengonfigurasi atau meminta streaming fisik dapat menggantikan peran internal HAL pengoptimalan daya dan meningkatkan penggunaan daya.
Penyesuaian
Anda dapat menyesuaikan implementasi perangkat dengan cara berikut.
- Output gabungan dari perangkat kamera logis bergantung sepenuhnya pada HAL terlepas dari implementasi layanan. Keputusan tentang bagaimana aliran logika yang menyatu berasal dari kamera fisik transparan ke aplikasi dan kamera Android Google Workspace for Education.
- Setiap permintaan dan hasil fisik dapat didukung secara opsional. Tujuan kumpulan parameter yang tersedia dalam permintaan tersebut juga sepenuhnya bergantung pada implementasi HAL spesifik.
- Mulai Android 10, HAL dapat mengurangi jumlah
kamera yang dapat langsung dibuka oleh
aplikasi dengan memilih untuk tidak
mengiklankan beberapa atau semua PHYSICAL_ID di
getCameraIdList
MenelepongetPhysicalCameraCharacteristics
kemudian harus menampilkan karakteristik kamera fisik.
Validasi
Perangkat multi-kamera logis harus lulus CTS seperti kamera biasa lainnya.
Kasus pengujian yang menargetkan jenis perangkat ini dapat ditemukan di
LogicalCameraDeviceTest
ruang lingkup modul ini.
Ketiga tes ITS ini menargetkan sistem multi-kamera untuk memfasilitasi penggabungan gambar:
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
Pengujian ITS-in-a-box
perangkat. Pengujian test_multi_camera_match
menegaskan bahwa kecerahan
bagian tengah gambar akan cocok
ketika kedua kamera diaktifkan. Tujuan
Pengujian test_multi_camera_alignment
menegaskan bahwa jarak kamera, orientasi,
dan parameter distorsi dimuat dengan benar. Jika sistem multi-kamera
termasuk kamera FoV Lebar (>90o), versi rev2 dari kotak ITS diperlukan.
Sensor_fusion
adalah rig pengujian kedua yang memungkinkan ponsel berulang yang diberi resep
dan menyatakan bahwa stempel waktu giroskop dan sensor gambar cocok dan bahwa
frame multi-kamera sinkron.
Semua kotak tersedia melalui AcuSpec, Inc. (www.acuspecinc.com, fred@acuspecinc.com) dan MYWAY Manufaktur (www.myway.tw, sales@myway.tw). Selain itu, boks 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 ini saat mengimplementasikan perangkat multi-kamera:
- (Android 10 atau yang lebih tinggi) Sembunyikan sub-kamera fisik dari
getCameraIdList
Hal ini mengurangi jumlah kamera yang dapat langsung dibuka oleh aplikasi, sehingga aplikasi tidak perlu memiliki logika pemilihan kamera yang kompleks. - (Android 11 atau yang lebih tinggi) Untuk multi-kamera yang logis
perangkat yang mendukung zoom optik, implementasikan
ANDROID_CONTROL_ZOOM_RATIO
API, dan gunakanANDROID_SCALER_CROP_REGION
hanya untuk pemangkasan rasio aspek.ANDROID_CONTROL_ZOOM_RATIO
memungkinkan perangkat untuk memperkecil dan mempertahankan presisi yang lebih baik. Dalam kasus 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 mengubah ukuran pasca-zoom ruang pandang sebagai array aktif sensor. Untuk informasi selengkapnya tentang caraANDROID_SCALER_CROP_REGION
berfungsi bersama denganANDROID_CONTROL_ZOOM_RATIO
, lihatcamera3_crop_reprocess#cropping
. - Untuk perangkat multi-kamera dengan kamera fisik yang memiliki
kemampuannya, pastikan perangkat memberitahukan dukungan untuk nilai tertentu
atau rentang untuk kontrol hanya jika seluruh rentang zoom mendukung nilai
atau rentang sel. Misalnya, jika kamera logis
terdiri dari ultrawide,
kamera lebar, dan kamera telefoto, lakukan hal berikut:
- Jika ukuran array aktif dari kamera fisik berbeda,
HAL kamera harus melakukan pemetaan dari
array aktif kamera fisik untuk
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 ini adalah ukuran array aktif kamera logis. - Jika kamera lebar dan telefoto mendukung fokus otomatis, tetapi kamera ultrawide kamera memiliki fokus tetap, pastikan kamera logis mengiklankan fokus otomatis dukungan teknis IT. HAL harus menyimulasikan mesin status fokus otomatis untuk ultrawide kamera sehingga ketika aplikasi diperkecil ke lensa ultrawide, fakta bahwa kamera fisik yang mendasarinya adalah fokus tetap transparan untuk aplikasi, dan mesin status fokus otomatis untuk mode AF yang didukung berfungsi yang diharapkan.
- Jika kamera lebar dan telefoto mendukung 4K @ 60 fps, dan
kamera ultrawide hanya mendukung 4K @ 30 fps, atau 1080p @ 60 fps, tetapi
bukan 4K @ 60 fps, pastikan kamera yang logis tidak memperlihatkan 4k @
60 fps dalam konfigurasi streaming yang didukung. Hal ini menjamin
integritas kemampuan kamera logis, memastikan bahwa aplikasi tidak akan
mengalami masalah tidak mencapai 4K @ 60 fps pada
ANDROID_CONTROL_ZOOM_RATIO
nilai kurang dari 1.
- Jika ukuran array aktif dari kamera fisik berbeda,
HAL kamera harus melakukan pemetaan dari
array aktif kamera fisik untuk
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 stream fisik:
- (Android 11 atau yang lebih baru) Untuk menangani penggunaan dengan lebih baik kasus seperti kedalaman dari pelacakan stereo dan gerakan, menjadikan ruang pandang output aliran fisik sebesar yang dapat dicapai oleh perangkat keras. Namun, jika streaming fisik dan streaming logis berasal dari kamera fisik, keterbatasan perangkat keras mungkin memaksa ruang pandang perangkat aliran fisik sama dengan aliran logis.
- Untuk mengatasi tekanan memori yang
disebabkan oleh beberapa aliran fisik,
memastikan aplikasi menggunakan
discardFreeBuffers
untuk menghapus alokasi buffer gratis (buffering yang dilepaskan oleh konsumen, tetapi belum dikeluarkan oleh produser) jika aliran fisik diharapkan tidak ada aktivitas selama periode 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 permukaan yang menghadap aplikasi, mengurangi konsumsi memori.