Dukungan Multi-Kamera

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 satu CameraDevice/CaptureSession ke aplikasi yang memungkinkan interaksi dengan fitur multi-kamera terintegrasi HAL. Aplikasi secara opsional dapat mengakses dan mengontrol aliran, metadata, dan kontrol kamera fisik yang mendasarinya.

Dukungan multi-kamera

Gambar 1 . Dukungan multi-kamera

Dalam diagram ini, ID kamera yang berbeda diberi kode warna. Aplikasi ini dapat mengalirkan buffer mentah dari setiap kamera fisik secara bersamaan. Dimungkinkan juga untuk mengatur kontrol terpisah dan menerima metadata terpisah dari kamera fisik yang berbeda.

Contoh dan sumber

Perangkat multi-kamera harus diiklankan dengan kemampuan multi-kamera yang logis .

Klien kamera dapat menanyakan ID kamera dari perangkat fisik yang dibuat oleh kamera logis tertentu dengan memanggil getPhysicalCameraIds() . ID yang dikembalikan sebagai bagian dari hasil kemudian digunakan untuk mengontrol perangkat fisik satu per satu melalui setPhysicalCameraId() . Hasil dari permintaan individu tersebut dapat ditanyakan dari hasil lengkap dengan memanggil getPhysicalCameraResults() .

Permintaan kamera fisik individual mungkin hanya mendukung subset parameter yang terbatas. Untuk menerima daftar parameter yang didukung, pengembang dapat memanggil getAvailablePhysicalCameraRequestKeys() .

Aliran kamera fisik hanya didukung untuk permintaan non-pemrosesan ulang dan hanya untuk sensor monokrom dan bayer.

Penerapan

Daftar periksa dukungan

Untuk menambahkan perangkat multi-kamera logis di sisi HAL:

Untuk perangkat yang menjalankan Android 9, perangkat kamera harus mendukung penggantian satu aliran YUV/RAW logis dengan aliran fisik dengan ukuran yang sama (tidak berlaku untuk aliran RAW) dan format yang sama dari dua kamera fisik. Ini tidak berlaku untuk perangkat yang menjalankan Android 10.

Untuk perangkat yang menjalankan Android 10 dengan versi perangkat HAL kamera 3.5 atau lebih tinggi, perangkat kamera harus mendukung isStreamCombinationSupported agar aplikasi dapat menanyakan apakah kombinasi aliran tertentu yang berisi aliran fisik didukung.

Peta konfigurasi aliran

Untuk kamera logis, kombinasi aliran wajib untuk perangkat kamera dari tingkat perangkat keras tertentu sama dengan yang diperlukan di CameraDevice.createCaptureSession . Semua aliran di peta konfigurasi aliran harus aliran logis.

Untuk perangkat kamera logis yang mendukung kemampuan RAW dengan sub-kamera fisik dengan ukuran berbeda, jika aplikasi mengonfigurasi aliran RAW logis, perangkat kamera logis tidak boleh beralih ke sub-kamera fisik dengan ukuran sensor yang berbeda. Ini memastikan bahwa aplikasi pengambilan RAW yang ada tidak rusak.

Untuk memanfaatkan zoom optik yang diterapkan HAL dengan beralih di antara sub-kamera fisik selama pengambilan RAW, aplikasi harus mengonfigurasi aliran sub-kamera fisik alih-alih aliran RAW logis.

Kombinasi aliran dijamin

Baik kamera logis maupun kamera fisik yang mendasarinya harus menjamin kombinasi aliran wajib yang diperlukan untuk tingkat perangkat mereka.

Perangkat kamera logis harus beroperasi dengan cara yang sama seperti perangkat kamera fisik berdasarkan tingkat dan kemampuan perangkat kerasnya. Direkomendasikan bahwa set fiturnya adalah superset dari kamera fisik individu.

Pada perangkat yang menjalankan Android 9, untuk setiap kombinasi streaming yang dijamin, kamera logis harus mendukung:

  • Mengganti satu YUV_420_888 logis atau aliran 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 mentah, satu dari setiap kamera fisik, jika kamera logis tidak mengiklankan kemampuan RAW, tetapi kamera fisik yang mendasarinya melakukannya. Ini biasanya terjadi ketika kamera fisik memiliki ukuran sensor yang berbeda.

  • Menggunakan aliran fisik sebagai pengganti aliran logis dengan ukuran dan format yang sama. Ini tidak boleh memperlambat laju bingkai pengambilan ketika durasi bingkai minimum dari aliran fisik dan logis adalah sama.

Pertimbangan kinerja dan daya

  • Pertunjukan:

    • Mengonfigurasi dan mengalirkan aliran fisik dapat memperlambat kecepatan pengambilan kamera logis karena keterbatasan sumber daya.
    • Menerapkan pengaturan kamera fisik dapat memperlambat kecepatan pengambilan jika kamera yang mendasarinya dimasukkan ke dalam kecepatan bingkai yang berbeda.
  • Kekuasaan:

    • Optimalisasi daya HAL terus bekerja dalam kasus default.
    • Mengonfigurasi atau meminta aliran fisik dapat mengesampingkan pengoptimalan daya internal HAL dan menimbulkan lebih banyak penggunaan daya.

Kustomisasi

Anda dapat menyesuaikan implementasi perangkat Anda dengan cara berikut.

  • Output yang menyatu dari perangkat kamera logis bergantung sepenuhnya pada implementasi HAL. Keputusan tentang bagaimana aliran logis yang menyatu berasal dari kamera fisik transparan untuk aplikasi dan kerangka kerja kamera Android.
  • Permintaan fisik individu dan hasil dapat didukung secara opsional. Kumpulan parameter yang tersedia dalam permintaan tersebut juga sepenuhnya bergantung pada implementasi HAL tertentu.
  • Dari 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 . Memanggil getPhysicalCameraCharacteristics kemudian harus mengembalikan karakteristik kamera fisik.

Validasi

Perangkat multi-kamera logis harus lulus CTS kamera seperti kamera biasa lainnya. Kasus uji yang menargetkan jenis perangkat ini dapat ditemukan di modul LogicalCameraDeviceTest .

Ketiga pengujian ITS ini menargetkan sistem multi-kamera untuk memfasilitasi penggabungan gambar yang tepat:

Tes adegan 1 dan adegan 4 dijalankan dengan rig pengujian ITS-in-a-box . Tes test_multi_camera_match menegaskan bahwa kecerahan bagian tengah gambar cocok saat kedua kamera diaktifkan. Tes test_multi_camera_alignment menegaskan bahwa spasi kamera, orientasi, dan parameter distorsi dimuat dengan benar. Jika sistem multi-kamera menyertakan kamera Wide FoV (>90o), versi rev2 dari kotak ITS diperlukan.

Sensor_fusion adalah alat uji kedua yang memungkinkan gerakan telepon yang berulang dan ditentukan dan menegaskan bahwa stempel waktu giroskop dan sensor gambar cocok dan bahwa bingkai multi-kamera sinkron.

Semua kotak tersedia melalui AcuSpec, Inc. ( www.acuspecinc.com , fred@acuspecinc.com) dan MYWAY Manufacturing ( www.myway.tw , sales@myway.tw). Selain itu, kotak rev1 ITS dapat dibeli melalui West-Mark ( www.west-mark.com , dgoodman@west-mark.com).

Praktik terbaik

Untuk memanfaatkan sepenuhnya fitur yang diaktifkan oleh multi-kamera sambil mempertahankan kompatibilitas aplikasi, ikuti praktik terbaik berikut saat menerapkan perangkat multi-kamera logis:

  • (Android 10 atau lebih tinggi) Sembunyikan sub-kamera fisik dari getCameraIdList . Ini mengurangi jumlah kamera yang dapat langsung dibuka oleh aplikasi, menghilangkan kebutuhan aplikasi untuk memiliki logika pemilihan kamera yang rumit.
  • (Android 11 atau lebih tinggi) Untuk perangkat multi-kamera logis yang mendukung zoom optik, terapkan ANDROID_CONTROL_ZOOM_RATIO API, dan gunakan ANDROID_SCALER_CROP_REGION untuk pemangkasan rasio aspek saja. ANDROID_CONTROL_ZOOM_RATIO memungkinkan perangkat untuk memperkecil dan mempertahankan presisi yang lebih baik. Dalam hal ini, HAL harus menyesuaikan sistem koordinat ANDROID_SCALER_CROP_REGION , ANDROID_CONTROL_AE_REGIONS , ANDROID_CONTROL_AWB_REGIONS , ANDROID_CONTROL_AF_REGIONS , ANDROID_STATISTICS_FACE_RECTANGLES , dan ANDROID_STATISTICS_FACE_LANDMARKS Untuk informasi selengkapnya tentang cara ANDROID_SCALER_CROP_REGION bekerja sama dengan ANDROID_CONTROL_ZOOM_RATIO , lihat camera3_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, wide, dan telefoto, lakukan hal berikut:
    • Jika ukuran larik aktif kamera fisik berbeda, HAL kamera harus melakukan pemetaan dari larik aktif kamera fisik ke larik aktif kamera logis untuk ANDROID_SCALER_CROP_REGION , ANDROID_CONTROL_AE_REGIONS , ANDROID_CONTROL_AWB_REGIONS , ANDROID_CONTROL_AF_REGIONS ANDROID_STATISTICS_FACE_LANDMARKS ANDROID_STATISTICS_FACE_RECTANGLES perspektif, sistem koordinat adalah ukuran array aktif kamera logis.
    • Jika kamera lebar dan telefoto mendukung fokus otomatis, tetapi kamera ultralebar adalah fokus tetap, pastikan kamera logis mengiklankan dukungan fokus otomatis. HAL harus mensimulasikan mesin status fokus otomatis untuk kamera ultrawide sehingga saat aplikasi memperbesar 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 bekerja seperti yang diharapkan.
    • Jika kamera lebar dan telefoto mendukung 4K @ 60 fps, dan kamera ultrawide hanya mendukung 4K @ 30 fps, atau 1080p @ 60 fps, tetapi tidak 4K @ 60 fps, pastikan kamera logis tidak mengiklankan 4k @ 60 fps di konfigurasi aliran yang didukungnya. Ini menjamin integritas kemampuan kamera logis, memastikan bahwa aplikasi tidak akan mengalami masalah tidak mencapai 4k @ 60 fps pada nilai ANDROID_CONTROL_ZOOM_RATIO kurang dari 1.
  • Mulai dari Android 10, multi-kamera logis tidak diperlukan untuk mendukung kombinasi aliran yang menyertakan aliran fisik. Jika HAL mendukung kombinasi dengan aliran fisik:
    • (Android 11 atau lebih tinggi) Untuk menangani kasus penggunaan dengan lebih baik seperti kedalaman dari stereo dan pelacakan gerak, buat bidang pandang output aliran fisik sebesar yang dapat dicapai oleh perangkat keras. Namun, jika aliran fisik dan aliran logis berasal dari kamera fisik yang sama, keterbatasan perangkat keras mungkin memaksa bidang pandang aliran fisik menjadi sama dengan aliran logis.
    • Untuk mengatasi tekanan memori yang disebabkan oleh beberapa aliran fisik, pastikan aplikasi menggunakan discardFreeBuffers untuk membatalkan alokasi buffer gratis (buffer yang dirilis oleh konsumen, tetapi belum dihapus oleh produsen) jika aliran fisik diharapkan tidak digunakan selama beberapa waktu waktu.
    • 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, sehingga mengurangi konsumsi memori.