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
0to aparat logiczny obsługiwany przez aparat szerokokątny i ultraszerokokątny, z których każdy korzysta z jednego zasobu ISP. - Identyfikator aparatu
1to 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_RATIOtylko w zakresie od 1x doMAX_DIGITAL_ZOOM, a nie w pełnym zakresieZOOM_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.