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 0 i 1 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.