Streaming kamera serentak

Android memungkinkan perangkat mendukung streaming perangkat kamera secara serentak. Sebagai contoh, hal ini memungkinkan perangkat memiliki kamera depan dan belakang yang beroperasi secara bersamaan. Dari Android 11, Camera2 API mencakup metode berikut yang dapat dipanggil aplikasi untuk menentukan apakah kamera mendukung streaming serentak dan untuk konfigurasi stream yang didukung.

  • getConcurrentCameraIds: Mendapatkan kumpulan kombinasi perangkat kamera yang saat ini terhubung yang mendukung konfigurasi sesi perangkat kamera secara serentak.
  • isConcurrentSessionConfigurationSupported: Memeriksa apakah set perangkat kamera yang disediakan dan perangkat yang konfigurasi sesi dapat dikonfigurasi secara serentak.

Kumpulan kombinasi streaming wajib yang harus didukung selama streaming serentak streaming disertakan melalui karakteristik kamera perangkat kamera di SCALER_MANDATORY_CONCURRENT_STREAM_COMBINATIONS saat ini.

Setiap perangkat kamera yang diiklankan hingga getConcurrentStreamingCameraIds() harus mendukung konfigurasi dijamin berikut untuk streaming serentak.

Target 1 Target 2
Jenis Ukuran maksimal Jenis Ukuran maksimal Contoh kasus penggunaan
YUV S1440p Pemrosesan video atau gambar dalam aplikasi
PRIV S1440p Analisis jendela bidik dalam aplikasi
JPEG S1440p Tidak ada pengambilan gambar diam jendela bidik
YUV / PRIV S720p JPEG S1440p Pembuatan image standar
YUV / PRIV S720p YUV / PRIV S1440p Video dalam aplikasi atau pemrosesan dengan pratinjau

Perangkat dengan kemampuan MONOCHROME (CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES) berisi CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME) pendukung Y8 harus mendukung penggantian streaming YUV dengan Y8 kombinasi aliran data.

s720p mengacu pada 720p (1280x720) atau resolusi maksimum yang didukung untuk format tertentu yang ditampilkan oleh StreamConfigurationMap.getOutputSizes(). s1440p mengacu pada 1440p (1920 x 1440) atau resolusi maksimum yang didukung untuk format tertentu yang ditampilkan oleh StreamConfigurationMap.getOutputSizes(). Perangkat yang kemampuannya tidak termasuk ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE harus mendukung setidaknya satu streaming Y16, Dataspace::DEPTH dengan sVGA selama operasi serentak, dengan sVGA yang lebih kecil. resolusi berikut:

  • resolusi output maksimum untuk format yang diberikan
  • 640 x 480

Implementasi

Untuk mengizinkan aplikasi mengkueri perangkat guna menentukan apakah perangkat kamera mendukung streaming serentak, mengimplementasikan ICameraProvider@2.6 Antarmuka HAL, yang meliputi metode berikut:

Untuk implementasi referensi antarmuka ICameraProvider@2.6HAL, lihat pustaka HAL kamera yang diemulasikan di EmulatedCameraProviderHWLImpl.cpp.

Validasi

Untuk menguji apakah penerapan fitur ini berfungsi sebagaimana mestinya, gunakan ConcurrentCameraTest.java Uji CTS. Selain itu, uji menggunakan aplikasi yang membuka beberapa kamera dan beroperasi secara serentak.

Masalah alokasi resource

Jika HAL kamera memberitahukan dukungan untuk operasi serentak perangkat kamera, mereka mungkin mengalami masalah alokasi sumber daya, terutama di jika tersedia cukup resource image signal processor (ISP) di untuk menstreaming kamera depan dan belakang (atau kamera lainnya) secara serentak, tetapi tidak kapasitas penuh mereka. Dalam hal ini, HAL kamera harus mengalokasikan ke setiap perangkat kamera.

Contoh skenario

Skenario berikut menunjukkan masalah ini.

Masalah

Perangkat memiliki konfigurasi berikut:

  • ID Kamera 0 adalah kamera logis yang didukung oleh lebar dan ultra-wide yang masing-masing mengambil satu sumber daya ISP.
  • ID Kamera 1 adalah kamera yang menggunakan satu resource ISP.

Perangkat (ponsel) memiliki dua ISP. Jika ID kamera 0 dibuka dan sesi dikonfigurasi, ada kemungkinan bahwa HAL kamera menyimpan dua ISP mengantisipasi penggunaan kamera ultrawide dan lebar.

Jika demikian, kamera depan (ID 1) tidak dapat mengonfigurasi {i>stream <i}karena kedua ISP sedang digunakan.

Solusi

Untuk mengatasi masalah ini, framework dapat membuka ID kamera 0 dan 1 sebelum mengkonfigurasi sesi untuk memberikan petunjuk ke HAL kamera tentang cara mengalokasikan sumber daya (karena sekarang mengharapkan operasi kamera serentak). Namun, hal ini dapat menyebabkan keterbatasan kemampuan, misalnya, zoom mungkin tidak mampu menangani rasio rentang zoom penuh (karena beralih kamera fisik ID mungkin bermasalah).

Untuk menerapkan solusi ini, lakukan perubahan berikut pada provider@2.6::ICameraProvider::getConcurrentCameraStreamingCameraIds.

  • Mengamankan bahwa untuk operasi kamera secara serentak, kamera framework harus membuka perangkat kamera (@3.2::ICameraDevice::open) sebelum mengonfigurasi sesi apa pun di perangkat kamera. Tindakan ini mengizinkan kamera penyedia layanan untuk mengalokasikan sumber daya yang sesuai.

  • Untuk mengatasi masalah tidak dapat menangani seluruh rasio rentang zoom yang diinginkan, pastikan bahwa aplikasi kamera, saat menggunakan kamera secara bersamaan, dijamin menggunakan setelan kontrol ZOOM_RATIO hanya antara 1x dan MAX_DIGITAL_ZOOM, bukan ZOOM_RATIO_RANGE lengkap (kode ini mencegah peralihan kamera fisik secara internal, yang berpotensi memerlukan lebih banyak ISP).

Masalah dengan testDualCameraPreview

Saat Anda melakukan pembaruan di atas, hal ini dapat menciptakan masalah dengan perilaku yang diizinkan oleh pengujian MultiViewTest.java#testDualCameraPreview.

Pengujian testDualCameraPreview tidak mengonfigurasi sesi hanya setelah dibuka semua kamera. Kode tersebut mengikuti urutan berikut:

for each camera  in cameraDevices :
  device = openCamera(camera)
     createCaptureSession(device);

Namun, cara ini menoleransi kegagalan terbuka kamera dengan ERROR_MAX_CAMERAS_IN_USE [1]. Aplikasi pihak ketiga mungkin bergantung pada perilaku ini.

Karena HAL kamera tidak akan mengetahui pengaturan lengkap ID kamera yang dibuka untuk operasi serentak sebelum mengkonfigurasi sesi, akan sulit untuk mengalokasikan sumber daya perangkat keras (dengan asumsi ada persaingan untuk mereka).

Untuk mengatasi masalah ini, mempertahankan kompatibilitas mundur selain mendukung streaming serentak, HAL kamera harus gagal panggilan openCamera dengan ERROR_MAX_CAMERAS_IN_USE jika tidak dapat mendukung konfigurasi streaming lengkap untuk semua kamera yang berjalan secara serentak.