Streaming kamera serentak

Android memungkinkan perangkat mendukung streaming serentak perangkat kamera. Misalnya, hal ini memungkinkan perangkat mengoperasikan kamera depan dan belakang secara bersamaan. Mulai 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 set perangkat kamera yang diberikan dan konfigurasi sesi yang sesuai dapat dikonfigurasi secara serentak.

Serangkaian 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 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 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 minimal 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

Implementasi

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

Untuk mengetahui 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 tes CTS ConcurrentCameraTest.java. 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 dapat mencadangkan dua ISP untuk mengantisipasi penggunaan kamera ultrawide dan wide.

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

Solusi

Untuk mengatasi masalah ini, framework dapat membuka ID kamera 0 dan 1 sebelum mengonfigurasi sesi untuk memberikan petunjuk kepada 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 dengan tepat.

  • 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 pada 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 beberapa 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.