Dukungan multi-kamera

Android 9 memperkenalkan dukungan API untuk perangkat multi-kamera melalui perangkat kamera logis baru yang terdiri dari dua atau beberapa perangkat kamera fisik 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.

Dukungan multi-kamera

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 mengkueri ID kamera perangkat fisik yang membuat 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 masing-masing 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:

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 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 dengan ukuran berbeda, jika aplikasi mengonfigurasi streaming RAW logis, perangkat kamera logis tidak boleh beralih ke sub-kamera fisik dengan ukuran sensor berbeda. 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 RAW, aplikasi harus mengonfigurasi streaming sub-kamera fisik, bukan streaming RAW logis.

Kombinasi streaming terjamin

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 set fiturnya adalah superset dari setiap kamera fisik.

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

  • Mengganti satu YUV_420_888 logis atau streaming 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 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 yang digabungkan 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 implementasi 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. Memanggil getPhysicalCameraCharacteristics kemudian 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.

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

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 gunakan ANDROID_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 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 tampilan pasca-zoom sebagai array aktif sensor. 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 tersebut 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 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.
  • 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 buffer digunakan untuk mendukung dua platform yang ditampilkan ke aplikasi, sehingga mengurangi konsumsi memori.