Jednoczesna transmisja z kamery

Android umożliwia urządzeniom obsługę jednoczesnego przesyłania strumieniowego z kamer. Dzięki temu urządzenie może korzystać jednocześnie z przedniego i tylnego aparatu. Od Androida 11 interfejs Camera2 API zawiera te metody, które aplikacje mogą wywoływać, aby określić, czy kamery obsługują jednoczesne przesyłanie strumieniowe i jakie konfiguracje strumieni są obsługiwane.

  • getConcurrentCameraIds: zwraca zestaw kombinacji identyfikatorów aktualnie podłączonych urządzeń z kamerą, które obsługują jednoczesne konfigurowanie sesji urządzenia z kamerą.
  • isConcurrentSessionConfigurationSupported: sprawdza, czy podany zestaw urządzeń z kamerą i odpowiadające im konfiguracje sesji można skonfigurować jednocześnie.

Zestaw obowiązkowych kombinacji strumieni, które muszą być obsługiwane podczas jednoczesnego przesyłania strumieniowego, jest uwzględniony w charakterystyce kamery urządzenia w SCALER_MANDATORY_CONCURRENT_STREAM_COMBINATIONS.

Każda kamera reklamowana w ramach programu getConcurrentStreamingCameraIds() musi obsługiwać te gwarantowane konfiguracje strumieni równoległych:

Cel 1 Cel 2
Typ Wielkość maksymalna Typ Wielkość maksymalna Przykładowe przypadki użycia
YUV s1440p Przetwarzanie filmów lub obrazów w aplikacji
PRIV s1440p Analiza wizjera w aplikacji
JPEG, s1440p Brak możliwości robienia zdjęć w wizjerze
YUV / PRIV s720p JPEG, s1440p Standardowe zdjęcia
YUV / PRIV s720p YUV / PRIV s1440p Film w aplikacji lub przetwarzanie z podglądem

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

s720p oznacza rozdzielczość 720p (1280 x 720) lub maksymalną rozdzielczość obsługiwaną w przypadku danego formatu zwracanego przez StreamConfigurationMap.getOutputSizes(). s1440p oznacza rozdzielczość 1440p (1920 x 1440) lub maksymalną obsługiwaną rozdzielczość w przypadku danego formatu zwracanego przez StreamConfigurationMap.getOutputSizes(). Urządzenia, których możliwości nie obejmują ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE, muszą obsługiwać co najmniej 1 strumień Y16, Dataspace::DEPTH o rozdzielczości sVGA, podczas jednoczesnej pracy, gdzie sVGA to mniejsza z 2 rozdzielczości:

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

Implementacja

Aby umożliwić aplikacjom wysyłanie zapytań do urządzenia w celu sprawdzenia, czy jego aparaty obsługują jednoczesne przesyłanie strumieniowe, zaimplementuj interfejs HAL ICameraProvider@2.6, który zawiera te metody:

Przykładową implementację ICameraProvider@2.6interfejsu HAL znajdziesz w bibliotece emulowanego HAL-u aparatu pod adresem EmulatedCameraProviderHWLImpl.cpp.

Weryfikacja

Aby sprawdzić, czy implementacja tej funkcji działa zgodnie z oczekiwaniami, użyj testu ConcurrentCameraTest.java CTS. Sprawdź też, czy aplikacja, która otwiera wiele kamer i obsługuje je jednocześnie, działa prawidłowo.

Problemy z przydziałem zasobów

Jeśli interfejsy HAL aparatu deklarują obsługę jednoczesnego działania urządzeń, mogą wystąpić problemy z przydzielaniem zasobów, zwłaszcza w przypadku, gdy na telefonie jest wystarczająco dużo zasobów procesora sygnału obrazu (ISP), aby jednocześnie przesyłać strumieniowo obraz z przedniego i tylnego (lub innych) aparatu, ale nie z pełną wydajnością. W takim przypadku HAL kamery musi przydzielać ograniczone zasoby sprzętowe do każdego urządzenia kamery.

Przykładowy scenariusz

Ten problem ilustruje poniższy scenariusz.

Problem

Urządzenie ma taką konfigurację:

  • Identyfikator aparatu 0 to aparat logiczny obsługiwany przez aparat szerokokątny i ultraszerokokątny, z których każdy korzysta z jednego zasobu ISP.
  • Identyfikator aparatu 1 to aparat, który korzysta z 1 zasobu ISP.

Urządzenie (telefon) ma 2 dostawców usług internetowych. Jeśli otwarto identyfikator kamery 0 i skonfigurowano sesję, może się zdarzyć, że HAL kamery zarezerwuje 2 procesory ISP, przewidując użycie zarówno kamery ultraszerokokątnej, jak i szerokokątnej.

W takim przypadku przedni aparat (identyfikator 1) nie może skonfigurować żadnych strumieni, ponieważ oba procesory ISP są używane.

Rozwiązanie

Aby rozwiązać ten problem, platforma może otworzyć identyfikatory kamer 01 przed skonfigurowaniem sesji, aby przekazać do HAL kamery wskazówkę dotyczącą sposobu przydzielania zasobów (ponieważ oczekuje teraz jednoczesnego działania kamer). Może to jednak prowadzić do ograniczeń, np. zoom może nie być w stanie obsłużyć pełnego zakresu powiększenia (ponieważ przełączanie fizycznych identyfikatorów aparatu może być problematyczne).

Aby wdrożyć to rozwiązanie, wprowadź w provider@2.6::ICameraProvider::getConcurrentCameraStreamingCameraIds te zmiany:

  • Wymagaj, aby w przypadku jednoczesnego działania kamer platforma kamery otwierała urządzenia kamery (@3.2::ICameraDevice::open) przed skonfigurowaniem na nich sesji. Dzięki temu dostawcy kamer mogą odpowiednio przydzielać zasoby.

  • Aby rozwiązać problem z obsługą pełnego zakresu powiększenia, zadbaj o to, aby aplikacje aparatu podczas jednoczesnego korzystania z kamer używały ustawienia sterowania ZOOM_RATIO tylko w zakresie od 1x do MAX_DIGITAL_ZOOM, a nie w pełnym zakresie ZOOM_RATIO_RANGE (zapobiega to wewnętrznemu przełączaniu kamer fizycznych, co może wymagać większej liczby procesorów obrazu).

Problem z testDualCameraPreview

Wprowadzenie powyższych zmian może spowodować problem z zachowaniem dozwolonym przez MultiViewTest.java#testDualCameraPreview.

Test testDualCameraPreview nie konfiguruje sesji dopiero po otwarciu wszystkich kamer. Przebiega ona w tej kolejności:

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

Toleruje jednak błędy otwierania aparatu z kodem ERROR_MAX_CAMERAS_IN_USE [1]. Aplikacje innych firm mogą zależeć od tego działania.

Ponieważ HAL aparatu nie zna pełnego zestawu identyfikatorów otwieranych kamer do jednoczesnej pracy przed skonfigurowaniem sesji, może mieć trudności z przydzieleniem zasobów sprzętowych (zakładając, że istnieje między nimi konkurencja).

Aby rozwiązać ten problem, oprócz zachowania zgodności wstecznej i obsługi jednoczesnego przesyłania strumieniowego komponenty HAL kamery powinny zwracać błąd w przypadku wywołań openCamera z kodem ERROR_MAX_CAMERAS_IN_USE, jeśli nie obsługują pełnej konfiguracji strumienia dla wszystkich kamer działających jednocześnie.