Streaming kamera serentak

Android memungkinkan perangkat mendukung streaming serentak dari perangkat kamera. Misalnya, hal ini memungkinkan perangkat mengoperasikan kamera depan dan belakang secara bersamaan. Mulai dari Android 11, Camera2 API mencakup metode berikut yang dapat dipanggil aplikasi untuk menentukan apakah kamera mendukung streaming serentak dan konfigurasi streaming yang didukung.

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

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

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

Target 1 Target 2
Jenis Ukuran maks Jenis Ukuran maks Kasus penggunaan sampel
YUV s1440p Pemrosesan video atau gambar dalam aplikasi
PRIV s1440p Analisis jendela bidik dalam aplikasi
JPEG s1440p Tidak ada pengambilan gambar statis jendela bidik
YUV / PRIV s720p JPEG s1440p Gambar diam standar
YUV / PRIV s720p YUV / PRIV s1440p Video dalam aplikasi atau pemrosesan dengan pratinjau

Perangkat dengan kemampuan MONOCHROME (CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES mencakup CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME) yang mendukung Y8 harus mendukung penggantian streaming YUV dengan Y8 dalam semua kombinasi streaming yang dijamin.

s720p mengacu pada 720p (1280 x 720) 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 mencakup ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE harus mendukung setidaknya satu aliran Y16, Dataspace::DEPTH dengan resolusi sVGA, selama operasi serentak, dengan sVGA adalah resolusi yang lebih kecil dari dua resolusi berikut:

  • resolusi output maksimum untuk format tertentu
  • 640 x 480

Penerapan

Untuk mengizinkan aplikasi mengkueri perangkat guna menentukan apakah kameranya mendukung streaming serentak, terapkan antarmuka HAL ICameraProvider@2.6, yang mencakup metode berikut:

Untuk penerapan referensi antarmuka HAL ICameraProvider@2.6, lihat library HAL kamera yang diemulasi di EmulatedCameraProviderHWLImpl.cpp.

Validasi

Untuk menguji apakah penerapan fitur ini berfungsi sebagaimana mestinya, gunakan ConcurrentCameraTest.java uji CTS. Selain itu, lakukan pengujian menggunakan aplikasi yang membuka beberapa kamera dan mengoperasikannya secara bersamaan.

Masalah alokasi resource

Jika HAL kamera mengiklankan dukungan untuk operasi serentak perangkat kamera, HAL tersebut mungkin mengalami masalah alokasi resource, terutama jika ada cukup resource prosesor sinyal gambar (ISP) di ponsel untuk melakukan streaming kamera depan dan belakang (atau kamera lain) secara serentak, tetapi tidak dengan kapasitas penuhnya. Dalam hal ini, HAL kamera harus mengalokasikan resource hardware yang terbatas 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 kamera lebar dan ultrawide, yang masing-masing menggunakan satu resource ISP.
  • ID Kamera 1 adalah kamera yang menggunakan satu resource ISP.

Perangkat (ponsel) memiliki dua ISP. Jika ID kamera 0 dibuka dan sesi dikonfigurasi, HAL kamera mungkin mencadangkan dua ISP untuk mengantisipasi penggunaan kamera ultrawide dan lebar.

Jika demikian, kamera depan (ID 1) tidak dapat mengonfigurasi streaming apa pun karena kedua ISP sedang digunakan.

Solusi

Untuk mengatasi masalah ini, framework dapat membuka ID kamera 0 dan 1 sebelum mengonfigurasi sesi untuk memberikan petunjuk ke HAL kamera tentang cara mengalokasikan resource (karena kini mengharapkan operasi kamera serentak). Namun, hal ini dapat menyebabkan kemampuan terbatas, misalnya, zoom mungkin tidak dapat menangani rasio rentang zoom penuh (karena mengganti ID kamera fisik mungkin bermasalah).

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

  • Mewajibkan bahwa untuk pengoperasian kamera secara serentak, framework kamera harus membuka perangkat kamera (@3.2::ICameraDevice::open) sebelum mengonfigurasi sesi apa pun di perangkat kamera. Dengan demikian, penyedia kamera dapat mengalokasikan resource yang sesuai.

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

Masalah dengan testDualCameraPreview

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

testDualCameraPreview pengujian tidak mengonfigurasi sesi hanya setelah membuka semua kamera. Urutannya adalah sebagai berikut:

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

Namun, aplikasi ini mentoleransi kegagalan pembukaan kamera dengan ERROR_MAX_CAMERAS_IN_USE [1]. Aplikasi pihak ketiga mungkin bergantung pada perilaku ini.

Karena HAL kamera tidak akan mengetahui kumpulan lengkap ID kamera yang dibuka untuk operasi serentak sebelum mengonfigurasi sesi, HAL kamera mungkin sulit mengalokasikan resource hardware (dengan asumsi ada persaingan untuk resource tersebut).

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