Konfiguracje strumieniowe

W systemie Android 10 wprowadzono funkcje umożliwiające klientom aparatu wybór optymalnych strumieni z kamery do konkretnych zastosowań oraz zapewnienie obsługi określonych kombinacji strumieni przez kamerę. Konfiguracja strumienia odnosi się do pojedynczego strumienia z kamery skonfigurowanego w urządzeniu z kamerą, a kombinacja strumieni odnosi się do jednego lub większej liczby zestawów strumieni skonfigurowanych w urządzeniu z kamerą. Aby uzyskać więcej informacji na temat tych funkcji, zobacz zalecane konfiguracje strumieni i interfejs API do sprawdzania kombinacji strumieni .

Implementacja referencyjna

Istnieje referencyjna implementacja zalecanych strumieni konfiguracyjnych po stronie dostawcy oraz interfejs API do sprawdzania funkcji kombinacji strumieni. Tę implementację można znaleźć pod adresem QCamera3HWI.cpp

Dostawcy kamer mogą reklamować klientom kamer zalecane konfiguracje strumieni do konkretnych zastosowań. Te zalecane konfiguracje strumieni, które są podzbiorami StreamConfigurationMap , mogą pomóc klientom kamery w wyborze optymalnych konfiguracji.

Chociaż StreamConfigurationMap udostępnia klientom kamer wyczerpujące informacje o konfiguracji strumienia, nie udostępnia żadnych informacji na temat wydajności, mocy ani wpływu wyboru jednego strumienia na inny. Klienci kamer mogą swobodnie wybierać spośród wszystkich możliwych konfiguracji strumieni, ale w wielu przypadkach prowadzi to do korzystania przez klientów z nieoptymalnych konfiguracji kamer i aplikacji, co powoduje czasochłonne i wyczerpujące wyszukiwania.

Na przykład, chociaż niektóre przetworzone formaty YUV są wymagane i muszą być obsługiwane, aparat może nie mieć natywnej obsługi tych formatów. Powoduje to dodatkowy przebieg przetwarzania w celu konwersji formatu i zmniejsza wydajność. Rozmiar i odpowiadające mu proporcje mogą również mieć podobny wpływ, co sprawia, że ​​określone wymiary są preferowane pod względem mocy i wydajności.

Zalecane mapy konfiguracji strumienia nie muszą być wyczerpujące w porównaniu do StreamConfigurationMap . Sugerowane mapy konfiguracji muszą być zgodne z wymaganiami zawartymi w sekcji dotyczącej implementacji i mogą zawierać dowolne z dostępnych formatów, rozmiarów lub innych wartości znajdujących się w StreamConfigurationMap . Ukrytych formatów, rozmiarów i innych wartości, których nie można znaleźć w StreamConfigurationMap, nie można uwzględnić w zalecanych mapach konfiguracji strumienia.

Wszystkie testy pozostają niezmienione i nie są rozluźniane w zależności od zalecanych konfiguracji strumieni.

Zalecane konfiguracje strumieni dostarczane przez implementację kamery są opcjonalne i klient kamery może je zignorować.

Realizacja

Wykonaj poniższe kroki, aby zaimplementować tę funkcję.

Wpisy metadanych

Aby włączyć tę funkcję, warstwa HAL kamery musi wypełnić następujące statyczne wpisy metadanych:

  • android.scaler.availableRecommendedStreamConfigurations : zalecany podzbiór konfiguracji strumieni dla określonych przypadków użycia. W deklaracji zastosowano proste bitmapy wskazujące sugerowane przypadki użycia w postaci [1 << PREVIEW | 1 << RECORD..] . Przypadki użycia rozszerzają zwykłą krotkę (format, szerokość, wysokość, dane wejściowe) o jeden dodatkowy wpis. Nieistniejące przypadki użycia publicznego lub inne bity ustawione w zakresie [PUBLIC_END, VENDOR_START] są zabronione.

    Informacje te są przechowywane w tagu metadanych availableRecommendedStreamConfigurations .

    Poniższy przykład przedstawia tablicę zalecanej konfiguracji strumienia dla kamery obsługującej tylko rozdzielczości 4K i 1080p, gdzie obie rozdzielczości są preferowane do nagrywania wideo, ale do podglądu sugerowana jest tylko 1080p.

    [3840, 2160, HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED,
    ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT,
    (1 << ANDROID_SCALER_AVAILABLE_RECOMMENDED_STREAM_CONFIGURATIONS_RECORD |
    1 << ANDROID_SCALER_AVAILABLE_RECOMMENDED_STREAM_CONFIGURATIONS_SNAPSHOT |
    1 << ANDROID_SCALER_AVAILABLE_RECOMMENDED_STREAM_CONFIGURATIONS_VIDEO_SNAPSHOT),
    1920, 1080, HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED,
    ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT,
    (1 << ANDROID_SCALER_AVAILABLE_RECOMMENDED_STREAM_CONFIGURATIONS_PREVIEW |
    1 << ANDROID_SCALER_AVAILABLE_RECOMMENDED_STREAM_CONFIGURATIONS_RECORD |
    1 << ANDROID_SCALER_AVAILABLE_RECOMMENDED_STREAM_CONFIGURATIONS_SNAPSHOT |
    1 << ANDROID_SCALER_AVAILABLE_RECOMMENDED_STREAM_CONFIGURATIONS_VIDEO_SNAPSHOT)]
    
  • android.depth.availableRecommendedDepthStreamConfigurations (dostępne tylko wtedy, gdy są obsługiwane przez urządzenie): zalecane konfiguracje strumienia przestrzeni danych dotyczące głębi sugerowane dla tego urządzenia z kamerą. Podobnie jak w przypadku powyższego wpisu metadanych, dodatkowa mapa bitowa przypadków użycia wskazuje sugerowane przypadki użycia.

    Informacje te są przechowywane w tagu metadanych availableRecommendedInputOutputFormatsMap .

  • android.scaler.availableRecommendedInputOutputFormatsMap (dostępne tylko wtedy, gdy jest obsługiwane przez urządzenie): mapowanie zalecanych formatów obrazu sugerowanych dla tej kamery dla strumieni wejściowych na odpowiadające im formaty wyjściowe.

    Informacje te są przechowywane w tagu metadanych availableRecommendedDepthStreamConfigurations .

Informacje te są dostępne dla klientów kamer za pośrednictwem interfejsu API RekomendowanegoStreamConfigurationMap .

Wymagane przypadki użycia

Należy zapewnić zalecane konfiguracje strumieni dla następujących przypadków użycia i spełniać odpowiednie wymagania:

Przypadek użycia Wymóg
PREVIEW Podgląd może obejmować wyłącznie przetworzone konfiguracje strumieni bez opóźnień z formatami wyjściowymi, takimi jak YUV_420_888 i IMPLEMENTATION_DEFINED .
RECORD Nagranie wideo musi zawierać konfiguracje strumieni zgodne z reklamowanymi obsługiwanymi profilami multimediów w formacie IMPLEMENTATION_DEFINED .
VIDEO_SNAPSHOT Migawka wideo musi zawierać konfiguracje strumieni co najmniej tak duże, jak maksymalne rozdzielczości RECORD i tylko w kombinacji formatu/przestrzeni danych BLOB + DATASPACE_JFIF (JPEG). Konfiguracje nie powinny powodować błędów podglądu i powinny umożliwiać działanie z szybkością 30 klatek na sekundę.
SNAPSHOT Konfiguracje strumienia zrzutów muszą obejmować co najmniej jedną o rozmiarze zbliżonym do android.sensor.info.activeArraySize z kombinacją formatu/przestrzeni danych BLOB + DATASPACE_JFIF (JPEG). Biorąc pod uwagę ograniczenia dotyczące proporcji, wyrównania i inne ograniczenia specyficzne dla dostawcy, obszar maksymalnego sugerowanego rozmiaru nie powinien być mniejszy niż 97% obszaru rozmiaru matrycy czujników.
ZSL (jeśli jest obsługiwany) Jeśli jest to obsługiwane przez kamerę, zalecane konfiguracje strumienia wejściowego można reklamować wyłącznie razem z innymi przetworzonymi lub opóźnionymi formatami wyjściowymi.
RAW (jeśli jest obsługiwany) Jeśli jest to obsługiwane przez aparat, zalecane konfiguracje strumieni surowych muszą obejmować wyłącznie formaty wyjściowe oparte na formacie RAW.

Inne przypadki użycia

Możesz podać dodatkowe zalecane strumienie konfiguracji dla przypadków użycia specyficznych dla Twojej implementacji.

Walidacja

Aby przetestować implementację zalecanych strumieni konfiguracyjnych, uruchom następujące testy CTS i VTS:

API do sprawdzania kombinacji strumieni

Platforma Android obsługuje interfejs API do sprawdzania kombinacji strumieni. Implementacja tego interfejsu API umożliwia klientom kamer bezpieczne wysyłanie zapytań do kombinacji strumieni w dowolnym momencie po odebraniu prawidłowej instancji CameraDevice , eliminując obciążenie związane z inicjowaniem sesji przechwytywania kamery oraz ryzyko wystąpienia późniejszych wyjątków dotyczących kamery, w tym uszkodzenia kamery, a także umożliwiając szybsze zapytania.

Ta funkcja umożliwia także klientom kamer otrzymanie listy kombinacji strumieni skompilowanej zgodnie z wytycznymi dla CameraDevice i obsługiwanego poziomu sprzętu. Dostępne są testy CTS, które pozwalają w jak największym stopniu wymusić poprawność wyników zapytań, obejmując niewielki podzbiór najpopularniejszych kombinacji strumieni.

Możesz wybrać obsługę tej funkcji, implementując jedno dodatkowe wywołanie API HIDL w warstwie HAL kamery.

Realizacja

Aby obsługiwać interfejs API do sprawdzania kombinacji strumieni, warstwa HAL kamery musi zapewniać implementację interfejsu API isStreamCombinationSupported HIDL. Ten interfejs sprawdza, czy kamera obsługuje określoną kombinację strumieni kamery.

Po wywołaniu interfejs API musi zwrócić jeden z następujących kodów stanu:

  • OK : zapytanie o kombinację strumieni powiodło się.
  • METHOD_NOT_SUPPORTED : Kamera nie obsługuje zapytania o kombinację strumieni.
  • INTERNAL_ERROR : Zapytanie o kombinację strumieni nie może zostać ukończone z powodu błędu wewnętrznego.

Interfejs API zwraca wartość true, jeśli obsługiwana jest kombinacja strumieni. W przeciwnym razie zwraca wartość false.

Framework korzysta z publicznego API isSessionConfigurationSupported w celu sprawdzenia, czy dana konfiguracja sesji jest obsługiwana przez kamerę.

Wywołania API nie mogą mieć żadnych skutków ubocznych na normalne działanie kamery. Wywołania API nie mogą zmieniać żadnych stanów wewnętrznych ani spowalniać działania kamery. Upewnij się, że po pomyślnym sprawdzeniu kombinacji strumieni przez warstwę HAL kamery klienci kamer będą mogli pomyślnie skonfigurować kombinację strumieni. Aby uniknąć problemów, upewnij się, że implementacja nie przechowuje żadnych informacji podczas zapytań o kombinację strumieni, nie zmienia swojego stanu wewnętrznego ani nie wykonuje czasochłonnych operacji.

Walidacja

Aby sprawdzić tę funkcję, uruchom następujące przypadki testowe CTS i VTS kamery:

Moduły kamery CTS:

Kamera VTS:

VtsHalCameraProviderV2_4TargetTest.cpp