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 doMAX_DIGITAL_ZOOM
zamiast pełnegoZOOM_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.