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ć.
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:
- Dodaj funkcję
ANDROID_REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERAdla każdego logicznego urządzenia z aparatem, które jest obsługiwane przez co najmniej 2 fizyczne aparaty udostępniane też aplikacji. - Wypełnij statyczne
ANDROID_LOGICAL_MULTI_CAMERA_PHYSICAL_IDSpole metadanych listą identyfikatorów fizycznych aparatów. - Wypełnij statyczne metadane związane z głębią, które są wymagane do powiązania pikseli strumieni fizycznych aparatów:
ANDROID_LENS_POSE_ROTATION,ANDROID_LENS_POSE_TRANSLATION,ANDROID_LENS_INTRINSIC_CALIBRATION,ANDROID_LENS_DISTORTION,ANDROID_LENS_POSE_REFERENCE. Ustaw statyczne
ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPEpole metadanych na:ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_APPROXIMATE: w przypadku czujników w trybie główny-główny bez synchronizacji sprzętowej migawki/ekspozycji.ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_CALIBRATED: w przypadku czujników w trybie główny-dodatkowy z synchronizacją sprzętową migawki/ekspozycji.
Wypełnij pole
ANDROID_REQUEST_AVAILABLE_PHYSICAL_CAMERA_REQUEST_KEYSlistą obsługiwanych parametrów dla poszczególnych fizycznych aparatów. Jeśli urządzenie logiczne nie obsługuje pojedynczych żądań, lista może być pusta.Jeśli pojedyncze żądania są obsługiwane, przetwórz i zastosuj poszczególne
physicalCameraSettings, które mogą być częścią żądań przechwytywania, i odpowiednio dołącz poszczególnephysicalCameraMetadata.W przypadku urządzeń z wersją HAL aparatu 3.5 (wprowadzoną w Androidzie 10) lub nowszą wypełnij
ANDROID_LOGICAL_MULTI_CAMERA_ACTIVE_PHYSICAL_IDklucz wyniku identyfikatorem aktualnie aktywnego fizycznego aparatu obsługującego aparat logiczny.
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 funkcjigetPhysicalCameraCharacteristicsmusi 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:
scene1/test_multi_camera_match.pyscene4/test_multi_camera_alignment.pysensor_fusion/test_multi_camera_frame_sync.py
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_RATIOi używaj funkcjiANDROID_SCALER_CROP_REGIONtylko do przycinania proporcji obrazu.ANDROID_CONTROL_ZOOM_RATIOumożliwia oddalanie obrazu i zachowanie większej precyzji. W takim przypadku, HAL musi dostosować układ współrzędnych funkcjiANDROID_SCALER_CROP_REGION,ANDROID_CONTROL_AE_REGIONS,ANDROID_CONTROL_AWB_REGIONS,ANDROID_CONTROL_AF_REGIONS,ANDROID_STATISTICS_FACE_RECTANGLES, iANDROID_STATISTICS_FACE_LANDMARKS, aby traktować pole widzenia po powiększeniu jako aktywną tablicę czujnika. Więcej informacji o tym, jakANDROID_SCALER_CROP_REGIONdziała razem zANDROID_CONTROL_ZOOM_RATIO, znajdziesz w artykulecamera3_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, iANDROID_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_RATIOwartości mniejszej niż 1.
- 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
- 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ą
discardFreeBuffersdo 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 groupaby do obsługi 2 powierzchni aplikacji używać jednej kolejki buforów, co zmniejsza zużycie pamięci.