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 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.

Dukungan multi-kamera

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:

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. Panggilan getPhysicalCameraCharacteristics 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:

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 gunakan ANDROID_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 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 memperlakukan kolom post-zoom field of view sebagai sensor active array. Untuk mengetahui informasi selengkapnya tentang cara kerja ANDROID_SCALER_CROP_REGION bersama 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, 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, dan ANDROID_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.
  • 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.