Streaming kamera serentak

Android memungkinkan perangkat mendukung streaming serentak perangkat kamera. Misalnya, hal ini memungkinkan perangkat memiliki kamera depan dan belakang yang beroperasi secara bersamaan. Mulai Android 11, Camera2 API menyertakan 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 saat ini terhubung yang mendukung konfigurasi sesi perangkat kamera secara serentak.
  • isConcurrentSessionConfigurationSupported: Memeriksa apakah kumpulan perangkat kamera yang disediakan 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 dijamin berikut untuk streaming serentak.

Target 1 Target 2
Jenis Ukuran maksimum Jenis Ukuran maksimum 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 termasuk CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME) yang mendukung Y8 harus mendukung penggantian streaming YUV dengan Y8 di semua kombinasi streaming yang dijamin.

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 menyertakan ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE harus mendukung setidaknya satu streaming Y16, Dataspace::DEPTH dengan resolusi sVGA, selama operasi serentak, dengan sVGA yang lebih kecil dari dua resolusi berikut:

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

Implementasi

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

Untuk implementasi 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 uji CTS ConcurrentCameraTest.java. Selain itu, uji menggunakan aplikasi yang membuka beberapa kamera dan mengoperasikannya secara serentak.

Masalah alokasi resource

Jika HAL kamera mengiklankan dukungan untuk operasi serentak perangkat kamera, perangkat tersebut mungkin akan mengalami masalah alokasi resource, terutama jika terdapat resource pemroses sinyal gambar (ISP) yang cukup pada ponsel untuk menstreaming kamera depan dan belakang (atau lainnya) secara serentak, tetapi tidak hingga 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 ultra lebar, yang masing-masing mengambil 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, mungkin HAL kamera 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 mengallokasikan resource (karena sekarang mengharapkan operasi kamera serentak). Namun, hal ini dapat menyebabkan keterbatasan kemampuan, misalnya, zoom mungkin tidak dapat menangani rasio rentang zoom penuh (karena beralih ID kamera fisik mungkin akan menimbulkan masalah).

Untuk menerapkan solusi ini, lakukan update berikut ke provider@2.6::ICameraProvider::getConcurrentCameraStreamingCameraIds.

  • Mengamankan bahwa untuk pengoperasian kamera secara serentak, framework kamera harus membuka perangkat kamera (@3.2::ICameraDevice::open) sebelum mengonfigurasi sesi apa pun pada perangkat kamera. Hal ini memungkinkan penyedia kamera mengalokasikan resource yang sesuai.

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

Masalah dengan testDualCameraPreview

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

testDualCameraPreview pengujian tidak mengonfigurasi sesi hanya setelah membuka semua kamera. Urutan ini mengikuti urutan berikut:

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

Namun, metode 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 kumpulan lengkap ID kamera yang dibuka untuk operasi serentak sebelum mengonfigurasi sesi, HAL mungkin sulit mengallokasikan resource hardware (dengan asumsi ada beberapa persaingan untuknya).

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