Równoczesne przesyłanie strumieniowe z kamery

Android umożliwia urządzeniom obsługę jednoczesnego przesyłania strumieniowego urządzeń z kamerami. Dzięki temu na urządzeniu może na przykład działać jednocześnie kamera przednia i tylna. Począwszy od systemu Android 11, interfejs API Camera2 zawiera następujące metody, które aplikacje mogą wywoływać w celu ustalenia, czy kamery obsługują współbieżne przesyłanie strumieniowe i obsługiwane konfiguracje strumieni.

  • getConcurrentCameraIds : Pobiera zestaw kombinacji aktualnie podłączonych identyfikatorów urządzeń z kamerą, które obsługują jednoczesne konfigurowanie sesji urządzenia z kamerą.
  • isConcurrentSessionConfigurationSupported : sprawdza, czy dostarczony zestaw kamer i odpowiadające im konfiguracje sesji mogą być konfigurowane jednocześnie.

Zestaw obowiązkowych kombinacji strumieni, które muszą być obsługiwane podczas jednoczesnego przesyłania strumieniowego, jest zawarty w charakterystyce kamery urządzenia we właściwości SCALER_MANDATORY_CONCURRENT_STREAM_COMBINATIONS .

Każde urządzenie z kamerą reklamowane za pomocą getConcurrentStreamingCameraIds() musi obsługiwać następujące gwarantowane konfiguracje dla równoczesnych strumieni.

Cel 1 Cel 2
Typ największy rozmiar Typ największy rozmiar Przykładowe przypadki użycia
YUV s1440p Przetwarzanie wideo lub obrazu w aplikacji
PRYW s1440p Analiza wizjera w aplikacji
JPG s1440p Brak przechwytywania obrazu w wizjerze
YUV/PRIV s720p JPG s1440p Standardowe fotografowanie
YUV/PRIV s720p YUV/PRIV s1440p Wideo lub przetwarzanie w aplikacji z podglądem

Urządzenia z funkcją MONOCHROME ( CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES obejmują CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME ) obsługujące Y8 muszą obsługiwać zastępowanie strumieni YUV przez Y8 we wszystkich gwarantowanych kombinacjach strumieni.

s720p odnosi się do 720p (1280 x 720) lub maksymalnej obsługiwanej rozdzielczości dla konkretnego formatu zwracanej przez StreamConfigurationMap.getOutputSizes() . s1440p odnosi się do 1440p (1920 x 1440) lub maksymalnej obsługiwanej rozdzielczości dla konkretnego formatu zwracanej przez StreamConfigurationMap.getOutputSizes() . Urządzenia, których możliwości nie obejmują ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE , muszą obsługiwać co najmniej jeden strumień Y16, Dataspace::DEPTH z rozdzielczością sVGA, podczas jednoczesnej pracy, gdzie sVGA jest mniejszą z dwóch następujących rozdzielczości:

  • maksymalna rozdzielczość wyjściowa dla danego formatu
  • 640 x 480

Realizacja

Aby umożliwić aplikacjom wysyłanie zapytań do urządzenia w celu ustalenia, czy jego kamery obsługują współbieżne przesyłanie strumieniowe, zaimplementuj interfejs HAL ICameraProvider@2.6 , który obejmuje następujące metody:

Referencyjną implementację interfejsu HAL ICameraProvider@2.6 można znaleźć w bibliotece HAL emulowanej kamery w EmulatedCameraProviderHWLImpl.cpp .

Walidacja

Aby sprawdzić, czy implementacja tej funkcji działa zgodnie z oczekiwaniami, użyj testu CTS ConcurrentCameraTest.java . Przetestuj także aplikację, która otwiera wiele kamer i obsługuje je jednocześnie.

Problemy z alokacją zasobów

Jeśli warstwy HAL kamer ogłaszają obsługę jednoczesnej pracy kamer, mogą wystąpić problemy z alokacją zasobów, szczególnie w przypadku, gdy w telefonie jest wystarczająca ilość zasobów procesora sygnału obrazu (ISP), aby przesyłać strumieniowo jednocześnie z kamer przednich i tylnych (lub innych) , ale nie w pełnym zakresie. W takim przypadku warstwa HAL kamery musi przydzielić ograniczone zasoby sprzętowe każdemu urządzeniu z kamerą.

Przykładowy scenariusz

Poniższy scenariusz ilustruje ten problem.

Problem

Urządzenie ma następującą konfigurację:

  • Camera ID 0 to kamera logiczna wspierana przez kamerę szeroką i ultraszerokokątną, z których każda korzysta z jednego zasobu ISP.
  • Identyfikator kamery 1 to kamera, która pobiera jeden zasób ISP.

Urządzenie (telefon) ma dwóch dostawców usług internetowych. Jeśli zostanie otwarty identyfikator kamery 0 i skonfigurowana zostanie sesja, możliwe jest, że warstwa HAL kamery zarezerwuje dwóch dostawców usług internetowych, przewidując użycie kamery zarówno ultraszerokokątnej, jak i szerokokątnej.

W takim przypadku kamera przednia (ID 1 ) nie może skonfigurować żadnego strumienia, ponieważ obaj dostawcy usług internetowych są w użyciu.

Rozwiązanie

Aby rozwiązać ten problem, środowisko może otworzyć oba identyfikatory kamer 0 i 1 przed skonfigurowaniem sesji, aby zapewnić kamerze HAL wskazówkę dotyczącą sposobu alokacji zasobów (ponieważ oczekuje ona teraz jednoczesnego działania kamer). Może to jednak prowadzić do ograniczonych możliwości, na przykład zoom może nie obsłużyć pełnego zakresu zoomu (ponieważ przełączanie identyfikatorów kamer fizycznych może być problematyczne).

Aby zaimplementować to rozwiązanie, wprowadź następujące aktualizacje provider@2.6::ICameraProvider::getConcurrentCameraStreamingCameraIds .

  • Nakaż, aby w celu jednoczesnego działania kamer środowisko kamer musiało otwierać urządzenia kamer ( @3.2::ICameraDevice::open ) przed skonfigurowaniem jakichkolwiek sesji na urządzeniach kamer. Dzięki temu dostawcy kamer mogą odpowiednio przydzielać zasoby.

  • Aby rozwiązać problem niemożności obsługi pełnego zakresu zoomu, upewnij się, że aplikacje aparatu, podczas jednoczesnego korzystania z aparatów, korzystają z ustawienia sterowania ZOOM_RATIO w zakresie tylko od 1x do MAX_DIGITAL_ZOOM zamiast pełnego ZOOM_RATIO_RANGE (zapobiega to przełączaniu kamery fizyczne wewnętrznie, co potencjalnie wymaga większej liczby dostawców usług internetowych).

Problem z testemDualCameraPreview

Dokonanie powyższych aktualizacji może spowodować problem z zachowaniem dozwolonym w teście MultiViewTest.java#testDualCameraPreview .

Test testDualCameraPreview nie konfiguruje sesji dopiero po otwarciu wszystkich kamer. Jest to następująca sekwencja:

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

Toleruje jednak awarie otwarcia kamery z ERROR_MAX_CAMERAS_IN_USE [1] . Aplikacje innych firm mogą zależeć od tego zachowania.

Ponieważ warstwa HAL kamery nie będzie znać pełnego zestawu identyfikatorów kamer otwieranych do jednoczesnej pracy przed skonfigurowaniem sesji, przydzielenie zasobów sprzętowych może być dla niej trudne (zakładając, że istnieje dla nich konkurencja).

Aby rozwiązać ten problem, zachowując kompatybilność wsteczną oraz obsługując współbieżne przesyłanie strumieniowe, warstwy HAL kamer powinny kończyć się niepowodzeniem wywołania openCamera z komunikatem ERROR_MAX_CAMERAS_IN_USE , jeśli nie obsługują pełnej konfiguracji strumienia dla wszystkich kamer działających jednocześnie.