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. Urządzenie kamery logicznej jest udostępniane aplikacji jako pojedyncze urządzenie CameraDevice lub sesja przechwytywania, co umożliwia interakcję z funkcjami wielu kamer zintegrowanymi z HAL. Aplikacje mogą opcjonalnie uzyskiwać dostęp do strumieni, metadanych i elementów sterujących fizycznego aparatu oraz nimi zarządzać.
Rysunek 1. Obsługa wielu aparatów
Na tym diagramie różne identyfikatory kamer są oznaczone kolorami. Aplikacja może jednocześnie przesyłać strumieniowo surowe bufory z każdej kamery fizycznej. 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 kamerami muszą być reklamowane z logicznie powiązaną funkcją wielu kamer.
Klienci aparatu mogą wysyłać zapytania o identyfikator aparatu urządzeń fizycznych, z których składa się dany aparat logiczny, wywołując funkcję getPhysicalCameraIds().
Identyfikatory zwrócone w ramach wyniku są następnie używane do sterowania poszczególnymi urządzeniami fizycznymi za pomocą setPhysicalCameraId().
Wyniki takich pojedynczych żądań można uzyskać z pełnego wyniku, wywołując getPhysicalCameraResults().
Poszczególne żądania dotyczące fizycznej kamery mogą obsługiwać tylko ograniczony podzbiór parametrów. Aby otrzymać listę obsługiwanych parametrów, programiści mogą wywołać funkcję getAvailablePhysicalCameraRequestKeys().
Strumienie z fizycznej kamery są obsługiwane tylko w przypadku żądań bez ponownego przetwarzania i tylko w przypadku czujników monochromatycznych i Bayer.
Implementacja
Lista kontrolna pomocy
Aby dodać logiczne urządzenia z wieloma aparatami po stronie HAL:
- Dodaj funkcję
ANDROID_REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERAdo dowolnego urządzenia z kamerą logiczną obsługiwanego przez co najmniej 2 kamery fizyczne, które są też udostępniane aplikacji. - Wypełnij pole metadanych statycznych
ANDROID_LOGICAL_MULTI_CAMERA_PHYSICAL_IDSlistą identyfikatorów kamer fizycznych. - Wypełnij statyczne metadane związane z głębią, które są wymagane do skorelowania pikseli strumieni z kamer fizycznych:
ANDROID_LENS_POSE_ROTATION,ANDROID_LENS_POSE_TRANSLATION,ANDROID_LENS_INTRINSIC_CALIBRATION,ANDROID_LENS_DISTORTION,ANDROID_LENS_POSE_REFERENCE. W polu metadanych static
ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPEustaw wartość:ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_APPROXIMATE: w przypadku czujników w trybie główny-główny nie ma synchronizacji sprzętowej migawki ani ekspozycji.ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_CALIBRATED: w przypadku czujników w trybie głównym i dodatkowym synchronizacja sprzętowej migawki i ekspozycji.
Wypełnij pole
ANDROID_REQUEST_AVAILABLE_PHYSICAL_CAMERA_REQUEST_KEYSlistą obsługiwanych parametrów dla poszczególnych kamer fizycznych. Lista może być pusta, jeśli urządzenie logiczne nie obsługuje poszczególnych żądań.Jeśli obsługiwane są prośby indywidualne, przetwórz i zastosuj indywidualny element
physicalCameraSettings, który może być częścią próśb o przechwytywanie, i odpowiednio dołącz indywidualny elementphysicalCameraMetadata.W przypadku wersji urządzenia Camera HAL 3.5 (wprowadzonej w Androidzie 10) lub nowszych wypełnij klucz wyniku
ANDROID_LOGICAL_MULTI_CAMERA_ACTIVE_PHYSICAL_IDidentyfikatorem aktualnie aktywnego aparatu fizycznego 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 tym samym formacie z 2 aparatów fizycznych. Nie dotyczy to urządzeń z Androidem 10.
W przypadku urządzeń z Androidem 10, na których wersja urządzenia HAL aparatu to 3.5 lub nowsza, urządzenie musi obsługiwać isStreamCombinationSupported, aby aplikacje mogły sprawdzać, czy obsługiwana jest określona kombinacja strumieni zawierająca strumienie fizyczne.
Mapa konfiguracji strumienia
W przypadku kamery logicznej obowiązkowe kombinacje strumieni dla urządzenia z aparatem o określonym poziomie sprzętowym są takie same jak wymagane w CameraDevice.createCaptureSession.
Wszystkie strumienie w mapie konfiguracji strumienia muszą być strumieniami logicznymi.
W przypadku urządzenia z kamerą logiczną obsługującego funkcję RAW z fizycznymi podkamerami o różnych rozmiarach, jeśli aplikacja skonfiguruje logiczny strumień RAW, urządzenie z kamerą logiczną nie może przełączać się na fizyczne podkamery o różnych rozmiarach matrycy. Dzięki temu istniejące aplikacje do rejestrowania obrazów w formacie RAW nie przestaną działać.
Aby korzystać z zoomu optycznego zaimplementowanego w HAL przez przełączanie się między fizycznymi podkamerami podczas przechwytywania w formacie RAW, aplikacje muszą konfigurować strumienie fizycznych podkamer zamiast logicznego strumienia RAW.
Gwarantowana kombinacja strumieni
Zarówno kamera logiczna, jak i jej fizyczne kamery muszą gwarantować obowiązkowe kombinacje strumieni wymagane na ich poziomach urządzenia.
Urządzenie z kamerą logiczną powinno działać w taki sam sposób jak urządzenie z kamerą fizyczną, w zależności od poziomu sprzętu i możliwości. Zalecamy, aby zestaw funkcji był nadzbiorem funkcji poszczególnych kamer fizycznych.
Na urządzeniach z Androidem 9 w przypadku każdej gwarantowanej kombinacji strumieni kamera logiczna musi obsługiwać:
Zastąpienie jednego strumienia logicznego YUV_420_888 lub strumienia surowego dwoma strumieniami fizycznymi o tym samym rozmiarze i formacie, z których każdy pochodzi z osobnej kamery fizycznej, pod warunkiem że rozmiar i format są obsługiwane przez kamery fizyczne.
Dodawanie 2 strumieni RAW, po jednym z każdej kamery fizycznej, jeśli kamera logiczna nie obsługuje formatu RAW, ale obsługują go kamery fizyczne. Zwykle ma to miejsce, gdy kamery fizyczne mają różne rozmiary matryc.
Używanie strumieni fizycznych zamiast strumienia logicznego o tym samym rozmiarze i formacie. Nie może to spowalniać liczby klatek podczas rejestrowania, gdy minimalny czas trwania klatki w strumieniach fizycznym i logicznym jest taki sam.
Wydajność i zasilanie
Skuteczność:
- Konfigurowanie i przesyłanie strumieni fizycznych może spowolnić szybkość rejestrowania przez kamerę logiczną z powodu ograniczeń zasobów.
- Zastosowanie ustawień aparatu fizycznego może spowolnić szybkość rejestrowania, jeśli aparaty bazowe mają różne liczby klatek.
Zasilanie:
- Optymalizacja zużycia energii przez 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-u i zwiększyć zużycie energii.
Dostosowywanie
Implementację urządzenia możesz dostosować na te sposoby:
- Połączone dane wyjściowe logicznego urządzenia kamery zależą całkowicie od implementacji HAL. Decyzja o tym, jak połączone strumienie logiczne są uzyskiwane z kamer fizycznych, jest niewidoczna dla aplikacji i platformy aparatu Android.
- Opcjonalnie można obsługiwać indywidualne prośby i wyniki dotyczące aktywności fizycznej. 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ę kamer, które aplikacja może bezpośrednio otworzyć, poprzez nieudostępnianie niektórych lub wszystkich identyfikatorów PHYSICAL_ID w
getCameraIdList. Wywołanie metodygetPhysicalCameraCharacteristicsmusi zwrócić charakterystykę kamery fizycznej.
Weryfikacja
Urządzenia z wieloma kamerami logicznymi muszą przejść testy CTS kamery, tak jak każda inna zwykła kamera.
Przypadki testowe, które są przeznaczone dla tego typu urządzenia, znajdziesz w module
LogicalCameraDeviceTest.
Te 3 testy ITS są przeznaczone dla systemów wielokamerowych, 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 na stanowisku testowym ITS-in-a-box. Test test_multi_camera_match sprawdza, czy jasność środka obrazów jest taka sama, gdy obie kamery są włączone. Test test_multi_camera_alignment sprawdza, czy odstępy między kamerami, ich orientacja i parametry zniekształceń są prawidłowo wczytywane. Jeśli system wielu kamer zawiera kamerę o szerokim polu widzenia (ponad 90°), wymagana jest wersja 2 skrzynki ITS.
Sensor_fusion to drugie stanowisko testowe, które umożliwia powtarzanie określonych ruchów telefonu i sprawdzanie, czy sygnatury czasowe żyroskopu i czujnika obrazu są zgodne oraz czy klatki z wielu aparatów są zsynchronizowane.
Wszystkie pudełka są dostępne w firmach AcuSpec, Inc. (www.acuspecinc.com, fred@acuspecinc.com) i MYWAY Manufacturing (www.myway.tw, sales@myway.tw). Dodatkowo urządzenie ITS w wersji rev1 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, zachowując przy tym zgodność aplikacji, podczas wdrażania logicznego urządzenia z wieloma aparatami stosuj te sprawdzone metody:
- (Android 10 lub nowszy) Ukrywanie fizycznych aparatów dodatkowych przed
getCameraIdList. Zmniejsza to liczbę kamer, które mogą być bezpośrednio otwierane przez aplikacje, eliminując potrzebę stosowania przez nie złożonej logiki wyboru kamery. - (Android 11 lub nowszy) W przypadku urządzenia z wieloma kamerami logicznymi obsługującego zoom optyczny zaimplementuj interfejs API
ANDROID_CONTROL_ZOOM_RATIOi używajANDROID_SCALER_CROP_REGIONtylko do przycinania współczynnika proporcji.ANDROID_CONTROL_ZOOM_RATIO– umożliwia oddalenie obrazu i zachowanie większej precyzji. W takim przypadku warstwa HAL musi dostosować układ współrzędnychANDROID_SCALER_CROP_REGION,ANDROID_CONTROL_AE_REGIONS,ANDROID_CONTROL_AWB_REGIONS,ANDROID_CONTROL_AF_REGIONS,ANDROID_STATISTICS_FACE_RECTANGLESiANDROID_STATISTICS_FACE_LANDMARKS, aby traktować pole widzenia po powiększeniu jako aktywną tablicę czujnika. Więcej informacji o tym, jakANDROID_SCALER_CROP_REGIONwspółpracuje zANDROID_CONTROL_ZOOM_RATIO, znajdziesz w artykulecamera3_crop_reprocess#cropping. - W przypadku urządzeń z wieloma kamerami fizycznymi o różnych możliwościach upewnij się, że urządzenie reklamuje obsługę określonej wartości lub zakresu dla elementu sterującego tylko wtedy, gdy cały zakres powiększenia obsługuje tę wartość lub ten zakres. Jeśli na przykład aparat logiczny składa się z aparatu ultraszerokokątnego, szerokokątnego i teleobiektywu, wykonaj te czynności:
- Jeśli aktywne rozmiary matryc fizycznych aparatów są różne, interfejs HAL aparatu musi mapować aktywne matryce fizycznych aparatów na aktywną matrycę aparatu logicznego dla
ANDROID_SCALER_CROP_REGION,ANDROID_CONTROL_AE_REGIONS,ANDROID_CONTROL_AWB_REGIONS,ANDROID_CONTROL_AF_REGIONS,ANDROID_STATISTICS_FACE_RECTANGLESiANDROID_STATISTICS_FACE_LANDMARKS, tak aby z perspektywy aplikacji układ współrzędnych był aktywnym rozmiarem matrycy aparatu logicznego. - Jeśli aparat szerokokątny i teleobiektyw obsługują autofokus, ale aparat ultraszerokokątny ma stałą ostrość, upewnij się, że aparat logiczny reklamuje obsługę autofokusu. Warstwa HAL musi symulować automat stanu autofokusa dla aparatu ultraszerokokątnego, aby w momencie, gdy aplikacja oddala obraz do obiektywu ultraszerokokątnego, fakt, że fizyczny aparat ma stałą ostrość, był dla niej niewidoczny, a automaty stanu autofokusa dla obsługiwanych trybów AF działały zgodnie z oczekiwaniami.
- Jeśli aparat 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 aparat logiczny nie reklamuje rozdzielczości 4K przy 60 klatkach na sekundę w obsługiwanych konfiguracjach strumieni. Gwarantuje to integralność możliwości kamery logicznej, dzięki czemu aplikacja nie napotka problemu z osiągnięciem 4K przy 60 kl./s przy wartości
ANDROID_CONTROL_ZOOM_RATIOmniejszej niż 1.
- Jeśli aktywne rozmiary matryc fizycznych aparatów są różne, interfejs HAL aparatu musi mapować aktywne matryce fizycznych aparatów na aktywną matrycę aparatu logicznego dla
- W Androidzie 10 i nowszych wersjach logiczny aparat wielokamerowy nie jest wymagany do obsługi kombinacji strumieni, które obejmują 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 z obrazu stereoskopowego i śledzenie ruchu, ustaw pole widzenia fizycznych strumieni wyjściowych tak szerokie, jak to możliwe w przypadku danego sprzętu. Jeśli jednak strumień fizyczny i strumień logiczny pochodzą z tej samej kamery fizycznej, ograniczenia sprzętowe mogą wymusić, aby pole widzenia strumienia fizycznego było takie samo jak strumienia logicznego.
- Aby zmniejszyć obciążenie pamięci spowodowane przez wiele strumieni fizycznych, upewnij się, że aplikacje używają funkcji
discardFreeBuffersdo zwalniania wolnych buforów (buforów zwolnionych przez odbiorcę, ale jeszcze nie usuniętych z kolejki przez producenta), jeśli oczekuje się, że strumień fizyczny będzie nieaktywny przez pewien czas. - Jeśli strumienie fizyczne z różnych kamer fizycznych nie są zwykle dołączane do tego samego żądania, zadbaj o to, aby aplikacje używały
surface group, dzięki czemu jedna kolejka buforów będzie używana do obsługi 2 interfejsów aplikacji, co zmniejszy zużycie pamięci.