Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.

Streaming Kamera Bersamaan

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

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
Tipe Ukuran maksimal Tipe Ukuran maksimal Contoh kasus penggunaan
YUV s1440p Video dalam aplikasi atau pemrosesan gambar
PRIV s1440p Analisis jendela bidik dalam aplikasi
JPEG s1440p Tidak ada pengambilan gambar diam 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 menyertakan CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME ) yang mendukung Y8 harus mendukung penggantian aliran YUV dengan Y8 di semua kombinasi aliran terjamin.

s720p mengacu pada 720p (1280 x 720) atau resolusi maksimum yang didukung untuk format tertentu yang dikembalikan oleh StreamConfigurationMap.getOutputSizes() . s1440p mengacu pada 1440p (1920 x 1440) atau resolusi maksimum yang didukung untuk format tertentu yang dikembalikan oleh StreamConfigurationMap.getOutputSizes() . Perangkat yang kemampuannya tidak menyertakan ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE harus mendukung setidaknya satu aliran Dataspace::DEPTH , Dataspace::DEPTH dengan resolusi sVGA, selama operasi bersamaan, dengan sVGA lebih kecil dari dua resolusi berikut:

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

Penerapan

Untuk mengizinkan aplikasi meminta perangkat guna menentukan apakah kameranya mendukung streaming serentak, implementasikan antarmuka ICameraProvider@2.6 HAL, yang menyertakan metode berikut:

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

Validasi

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

Masalah alokasi sumber daya

Jika HAL kamera mengiklankan dukungan untuk pengoperasian perangkat kamera secara bersamaan, perangkat tersebut mungkin mengalami masalah alokasi sumber daya, terutama dalam kasus di mana terdapat cukup sumber daya prosesor sinyal gambar (ISP) di ponsel untuk mengalirkan kamera depan dan belakang (atau lainnya) secara bersamaan , tetapi tidak dengan kapasitas penuh mereka. Dalam hal ini, HAL kamera harus mengalokasikan sumber daya perangkat keras terbatas ke setiap perangkat kamera.

Contoh skenario

Skenario berikut menunjukkan masalah ini.

Masalah

Perangkat memiliki konfigurasi berikut:

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

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

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

Larutan

Untuk mengatasi masalah ini, framework dapat membuka ID kamera 0 dan 1 sebelum mengonfigurasi sesi untuk memberikan petunjuk ke kamera HAL tentang cara mengalokasikan sumber daya (karena sekarang mengharapkan pengoperasian kamera secara bersamaan). Namun, hal ini dapat menyebabkan kemampuan terbatas, misalnya, zoom mungkin tidak dapat menangani rasio rentang zoom penuh (karena mengalihkan ID kamera fisik mungkin bermasalah).

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

  • Mengamanatkan bahwa untuk pengoperasian kamera secara bersamaan, framework kamera harus membuka perangkat kamera ( @3.2::ICameraDevice::open ) sebelum mengonfigurasi sesi apa pun pada perangkat kamera. Ini memungkinkan penyedia kamera untuk mengalokasikan sumber daya yang sesuai.

  • Untuk mengatasi masalah tidak dapat menangani rasio rentang zoom penuh, pastikan bahwa aplikasi kamera, saat menggunakan kamera secara bersamaan, dijamin untuk menggunakan pengaturan kontrol ZOOM_RATIO hanya antara 1x dan MAX_DIGITAL_ZOOM alih-alih ZOOM_RATIO_RANGE lengkap (ini mencegah peralihan kamera fisik secara internal, yang berpotensi membutuhkan lebih banyak ISP).

Masalah dengan testDualCameraPreview

Jika Anda melakukan pembaruan di atas, tindakan ini bisa menimbulkan masalah dengan perilaku yang diizinkan oleh pengujian MultiViewTest.java#testDualCameraPreview .

testDualCameraPreview test tidak mengonfigurasi sesi hanya setelah membuka semua kamera. Ini mengikuti urutan ini:

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

Namun, ia mentolerir kegagalan buka kamera dengan ERROR_MAX_CAMERAS_IN_USE [1] . Aplikasi pihak ketiga mungkin bergantung pada perilaku ini.

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

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