Obsługa wielu kamer

W Androidzie 9 wprowadziliśmy obsługę interfejsu API dla urządzeń z wieloma aparatami za pomocą nowego logicznego urządzenia z aparatem, które składa się z co najmniej 2 fizycznych aparatów skierowanych w tym samym kierunku. Logiczne urządzenie z aparatem jest udostępniane aplikacji jako pojedynczy element CameraDevice/CaptureSession, co umożliwia interakcję z funkcjami HAL zintegrowanymi z wieloma aparatami. Aplikacje mogą opcjonalnie uzyskiwać dostęp do strumieni, metadanych i ustawień fizycznych aparatów oraz nimi sterować.

Obsługa wielu kamer

Rysunek 1. Obsługa wielu aparatów

Na tym diagramie różne identyfikatory aparatów są oznaczone kolorami. Aplikacja może jednocześnie przesyłać strumieniowo surowe bufory z każdego fizycznego aparatu. Można też ustawić osobne elementy sterujące i otrzymywać osobne metadane z różnych fizycznych aparatów.

Przykłady i źródła

Urządzenia z wieloma aparatami muszą być reklamowane z użyciem funkcji logicznego aparatu .

Klienci aparatu mogą wysyłać zapytania o identyfikator aparatu fizycznych urządzeń, z których składa się dany logiczny aparat, wywołując funkcję getPhysicalCameraIds(). Identyfikatory zwracane w ramach wyniku są następnie używane do sterowania poszczególnymi urządzeniami fizycznymi za pomocą setPhysicalCameraId(). Wyniki takich pojedynczych żądań można sprawdzić w pełnym wyniku, wywołując getPhysicalCameraResults().

Pojedyncze żądania fizycznego aparatu mogą obsługiwać tylko ograniczony podzbiór parametrów. Aby otrzymać listę obsługiwanych parametrów, deweloperzy mogą wywołać funkcję getAvailablePhysicalCameraRequestKeys().

Strumienie fizycznego aparatu są obsługiwane tylko w przypadku żądań bez ponownego przetwarzania oraz tylko w przypadku czujników monochromatycznych i Bayera.

Implementacja

Lista kontrolna obsługi

Aby dodać logiczne urządzenia z wieloma aparatami po stronie HAL:

W przypadku urządzeń z Androidem 9 urządzenia z aparatem muszą obsługiwać zastępowanie jednego logicznego strumienia YUV lub RAW strumieniami fizycznymi o tym samym rozmiarze (nie dotyczy strumieni RAW) i formacie z 2 fizycznych aparatów. Nie dotyczy to urządzeń z Androidem 10.

W przypadku urządzeń z Androidem 10, w których wersja HAL aparatu to 3.5 lub nowsza, urządzenie z aparatem musi obsługiwać isStreamCombinationSupported , aby aplikacje mogły sprawdzać, czy obsługiwana jest określona kombinacja strumieni zawierająca strumienie fizyczne.

Mapa konfiguracji strumieni

W przypadku logicznego aparatu obowiązkowe kombinacje strumieni dla urządzenia z aparatem o określonym poziomie sprzętu są takie same jak te wymagane w CameraDevice.createCaptureSession. Wszystkie strumienie na mapie konfiguracji strumieni muszą być strumieniami logicznymi.

Jeśli logiczne urządzenie z aparatem obsługuje funkcję RAW z fizycznymi aparatami pomocniczymi o różnych rozmiarach, a aplikacja konfiguruje logiczny strumień RAW, logiczne urządzenie z aparatem nie może przełączać się na fizyczne aparaty pomocnicze o różnych rozmiarach czujnika. Dzięki temu istniejące aplikacje do przechwytywania RAW nie przestaną działać.

Aby korzystać z optycznego zoomu zaimplementowanego w HAL przez przełączanie się między fizycznymi aparatami pomocniczymi podczas przechwytywania RAW, aplikacje muszą skonfigurować strumienie fizycznych aparatów pomocniczych zamiast logicznego strumienia RAW.

Gwarantowana kombinacja strumieni

Zarówno logiczny aparat, jak i jego fizyczne aparaty pomocnicze muszą gwarantować obowiązkowe kombinacje strumieni wymagane na ich poziomach urządzenia.

Logiczne urządzenie z aparatem powinno działać tak samo jak fizyczne urządzenie z aparatem w zależności od poziomu sprzętu i funkcji. Zalecamy, aby zestaw funkcji był nadzbiorem funkcji poszczególnych fizycznych aparatów.

W przypadku urządzeń z Androidem 9 w każdej gwarantowanej kombinacji strumieni logiczny aparat musi obsługiwać:

  • Zastępowanie jednego logicznego strumienia YUV_420_888 lub RAW 2 strumieniami fizycznymi o tym samym rozmiarze i formacie, z których każdy pochodzi z innego fizycznego aparatu, pod warunkiem że rozmiar i format są obsługiwane przez fizyczne aparaty.

  • Dodawanie 2 strumieni RAW, po jednym z każdego fizycznego aparatu, jeśli logiczny aparat nie reklamuje funkcji RAW, ale fizyczne aparaty pomocnicze tak. Zwykle dzieje się tak, gdy fizyczne aparaty mają różne rozmiary czujnika.

  • Używanie strumieni fizycznych zamiast strumienia logicznego o tym samym rozmiarze i formacie. Nie może to spowolnić liczby klatek na sekundę podczas przechwytywania, gdy minimalny czas trwania klatki strumieni fizycznych i logicznych jest taki sam.

Względy dotyczące wydajności i zużycia energii

  • Wydajność:

    • Konfigurowanie i przesyłanie strumieni fizycznych może spowolnić szybkość przechwytywania logicznego aparatu z powodu ograniczeń zasobów.
    • Stosowanie ustawień fizycznego aparatu może spowolnić szybkość przechwytywania, jeśli aparaty pomocnicze są ustawione na różne liczby klatek na sekundę.
  • Zużycie energii:

    • Optymalizacja zużycia energii w HAL nadal działa w przypadku domyślnym.
    • Konfigurowanie lub żądanie strumieni fizycznych może zastąpić wewnętrzną optymalizację zużycia energii w HAL i spowodować większe zużycie energii.

Dostosowywanie

Implementację urządzenia możesz dostosować na te sposoby.

  • Połączone dane wyjściowe logicznego urządzenia z aparatem zależą całkowicie od implementacji HAL. Decyzja o tym, jak połączone strumienie logiczne są wyprowadzane z fizycznych aparatów, jest niewidoczna dla aplikacji i platformy aparatu Android.
  • Pojedyncze żądania i wyniki fizyczne mogą być opcjonalnie obsługiwane. Zestaw dostępnych parametrów w takich żądaniach zależy też całkowicie od konkretnej implementacji HAL.
  • Od Androida 10 HAL może zmniejszyć liczbę aparatów, które mogą być bezpośrednio otwierane przez aplikację, przez pominięcie niektórych lub wszystkich identyfikatorów PHYSICAL_ID w getCameraIdList. Wywołanie funkcji getPhysicalCameraCharacteristics musi wtedy zwrócić charakterystykę fizycznego aparatu.

Weryfikacja

Logiczne urządzenia z wieloma aparatami muszą przejść testy CTS aparatu tak jak każdy inny zwykły aparat. Testy, które są kierowane na ten typ urządzenia, znajdziesz w LogicalCameraDeviceTest module.

Te 3 testy ITS są kierowane na systemy z wieloma aparatami, aby ułatwić prawidłowe łączenie obrazów:

Testy sceny 1 i sceny 4 są przeprowadzane za pomocą platformy testowej ITS-in-a-box test rig. Test test_multi_camera_match sprawdza, czy jasność środka obrazów jest taka sama, gdy oba aparaty są włączone. Test test_multi_camera_alignment sprawdza, czy prawidłowo wczytane są odstępy między aparatami, ich orientacja i parametry zniekształceń. Jeśli system z wieloma aparatami zawiera aparat o szerokim polu widzenia (>90 stopni), wymagana jest wersja 2 skrzynki ITS.

Sensor_fusion to druga platforma testowa, która umożliwia powtarzanie określonych ruchów telefonu i sprawdza, czy znaczniki czasu żyroskopu i czujnika obrazu są zgodne oraz czy klatki z wielu aparatów są zsynchronizowane.

Wszystkie skrzynki są dostępne w firmach AcuSpec, Inc. (www.acuspecinc.com, fred@acuspecinc.com) i MYWAY Manufacturing (www.myway.tw, sales@myway.tw). Dodatkowo skrzynkę ITS w wersji 1 można kupić w firmie West-Mark (www.west-mark.com, dgoodman@west-mark.com).

Sprawdzone metody

Aby w pełni korzystać z funkcji włączonych przez wiele aparatów przy zachowaniu zgodności aplikacji, podczas implementowania logicznego urządzenia z wieloma aparatami stosuj te sprawdzone metody:

  • (Android 10 lub nowszy) Ukryj fizyczne aparaty pomocnicze w funkcji getCameraIdList. Zmniejsza to liczbę aparatów, które mogą być bezpośrednio otwierane przez aplikacje, eliminując potrzebę stosowania przez aplikacje złożonej logiki wyboru aparatu.
  • (Android 11 lub nowszy) W przypadku logicznego urządzenia z wieloma aparatami obsługującego zoom optyczny zaimplementuj interfejs API ANDROID_CONTROL_ZOOM_RATIO i używaj funkcji ANDROID_SCALER_CROP_REGION tylko do przycinania proporcji obrazu. ANDROID_CONTROL_ZOOM_RATIO umożliwia oddalanie obrazu i zachowanie większej precyzji. W takim przypadku, HAL musi dostosować układ współrzędnych funkcji ANDROID_SCALER_CROP_REGION, ANDROID_CONTROL_AE_REGIONS, ANDROID_CONTROL_AWB_REGIONS, ANDROID_CONTROL_AF_REGIONS, ANDROID_STATISTICS_FACE_RECTANGLES, i ANDROID_STATISTICS_FACE_LANDMARKS , aby traktować pole widzenia po powiększeniu jako aktywną tablicę czujnika. Więcej informacji o tym, jak ANDROID_SCALER_CROP_REGION działa razem z ANDROID_CONTROL_ZOOM_RATIO, znajdziesz w artykule camera3_crop_reprocess#cropping.
  • W przypadku urządzeń z wieloma aparatami, których fizyczne aparaty mają różne funkcje, upewnij się, że urządzenie reklamuje obsługę określonej wartości lub zakresu dla elementu sterującego tylko wtedy, gdy cały zakres zoomu obsługuje tę wartość lub zakres. Jeśli na przykład logiczny aparat składa się z aparatu ultraszerokokątnego, szerokokątnego i teleobiektywu, wykonaj te czynności:
    • Jeśli rozmiary aktywnych tablic fizycznych aparatów są różne, HAL aparatu musi mapować aktywne tablice fizycznych aparatów na aktywną tablicę logicznego aparatu w przypadku funkcji ANDROID_SCALER_CROP_REGION, ANDROID_CONTROL_AE_REGIONS, ANDROID_CONTROL_AWB_REGIONS, ANDROID_CONTROL_AF_REGIONS, ANDROID_STATISTICS_FACE_RECTANGLES, i ANDROID_STATISTICS_FACE_LANDMARKS, aby z perspektywy aplikacji układ współrzędnych był rozmiarem aktywnej tablicy logicznego aparatu.
    • Jeśli aparaty szerokokątny i teleobiektyw obsługują autofokus, ale aparat ultraszerokokątny ma stałą ostrość, upewnij się, że logiczny aparat reklamuje obsługę autofokusu. HAL musi symulować automat stanów autofokusu dla aparatu ultraszerokokątnego, aby gdy aplikacja oddala obraz do obiektywu ultraszerokokątnego, fakt, że fizyczny aparat pomocniczy ma stałą ostrość, był niewidoczny dla aplikacji, a automaty stanów autofokusu dla obsługiwanych trybów AF działały zgodnie z oczekiwaniami.
    • Jeśli aparaty szerokokątny i teleobiektyw obsługują rozdzielczość 4K przy 60 klatkach na sekundę, a aparat ultraszerokokątny obsługuje tylko rozdzielczość 4K przy 30 klatkach na sekundę lub 1080p przy 60 klatkach na sekundę, ale nie 4K przy 60 klatkach na sekundę, upewnij się, że logiczny aparat nie reklamuje rozdzielczości 4K przy 60 klatkach na sekundę w obsługiwanych konfiguracjach strumieni. Gwarantuje to integralność funkcji logicznego aparatu, dzięki czemu aplikacja nie będzie miała problemu z osiągnięciem rozdzielczości 4K przy 60 klatkach na sekundę przy ANDROID_CONTROL_ZOOM_RATIO wartości mniejszej niż 1.
  • W Androidzie 10 i nowszych wersjach logiczny aparat nie musi obsługiwać kombinacji strumieni, które zawierają strumienie fizyczne. Jeśli HAL obsługuje kombinację ze strumieniami fizycznymi:
    • (Android 11 lub nowszy) Aby lepiej obsługiwać przypadki użycia, takie jak głębia ze stereo i śledzenie ruchu, ustaw pole widzenia fizycznych danych wyjściowych strumienia tak duże, jak to możliwe w przypadku sprzętu. Jeśli jednak strumień fizyczny i strumień logiczny pochodzą z tego samego fizycznego aparatu, ograniczenia sprzętowe mogą wymusić, aby pole widzenia strumienia fizycznego było takie samo jak strumienia logicznego.
    • Aby rozwiązać problem z brakiem pamięci spowodowany przez wiele strumieni fizycznych, upewnij się, że aplikacje używają discardFreeBuffers do zwalniania wolnych buforów (buforów zwolnionych przez konsumenta, ale jeszcze nie pobranych przez producenta), jeśli oczekuje się, że strumień fizyczny będzie przez pewien czas nieaktywny.
    • Jeśli strumienie fizyczne z różnych fizycznych aparatów zwykle nie są dołączane do tego samego żądania, upewnij się, że aplikacje używają surface group aby do obsługi 2 powierzchni aplikacji używać jednej kolejki buforów, co zmniejsza zużycie pamięci.