Funkcje wyświetlacza (takie jak tryby wyświetlania i obsługiwane typy HDR) mogą się dynamicznie zmieniać na urządzeniach z zewnętrznymi wyświetlaczami (przez HDMI lub DisplayPort), takich jak dekodery Android TV (STB) i urządzenia Over-The-Top (OTT). Może to być spowodowane sygnałem połączenia HDMI, na przykład przełączeniem się z jednego wyświetlacza na drugi lub uruchomieniem urządzenia bez podłączonego wyświetlacza. W Androidzie 12 i nowszych wprowadziliśmy zmiany w strukturze umożliwiającej obsługę technologii Hotpluging i wyświetlania dynamicznego.
Na tej stronie opisujemy obsługę wtyczek typu „displayowe wtyczki” i zmieniamy możliwości wyświetlania w implementacji HAL Composer. Omawiamy też w nim, jak zarządzać powiązanym buforem klatek i zapobiegać zawodom wyścigowym w takich sytuacjach.
Zaktualizuj funkcje wyświetlania
W tej sekcji opisujemy, jak platforma Androida obsługuje zmiany w możliwościach wyświetlania zainicjowane przez usługę Composer HAL.
Aby Android mógł prawidłowo obsługiwać zmiany w możliwościach wyświetlania, producent OEM musi wdrożyć narzędzie HAL Composer w taki sposób, by za pomocą onHotplug(display, connection=CONNECTED)
powiadamiał platformę o zmianach funkcji wyświetlania. Potem Android wprowadza te zmiany w funkcjach wyświetlania:
- Po wykryciu zmiany w możliwościach wyświetlania platforma otrzymuje powiadomienie
onHotplug(display, connection=CONNECTED)
. - Po otrzymaniu powiadomienia platforma usuwa stan wyświetlania i tworzy go z nowymi możliwościami z HAL przy użyciu metod
getActiveConfig
,getDisplayConfigs
,getDisplayAttribute
,getColorModes
,getHdrCapabilities
igetDisplayCapabilities
. - Po odtworzeniu nowego stanu wyświetlania platforma wysyła wywołanie zwrotne
onDisplayChanged
do aplikacji, które nasłuchują takich zdarzeń.
Platforma ponownie przydziela bufory ramek w kolejnych zdarzeniach onHotplug(display, connection=CONNECTED)
. Więcej informacji o tym, jak prawidłowo zarządzać pamięcią bufora ramki klienta, by uniknąć błędów podczas alokacji nowych buforów ramek, znajdziesz w artykule Zarządzanie buforem ramek klienta.
Obsługa typowych scenariuszy dotyczących połączeń
Z tej sekcji dowiesz się, jak prawidłowo obsługiwać różne scenariusze połączeń w implementacjach, gdy główny ekran jest podłączony i odłączony.
Platforma Androida została stworzona z myślą o urządzeniach mobilnych i nie ma wbudowanej obsługi odłączonego wyświetlacza głównego. W przypadku interakcji z platformą HAL w przypadku, gdy ekran główny jest fizycznie odłączony, w interakcjach z platformą musi zastąpić wyświetlacz zastępczy.
Poniższe sytuacje mogą wystąpić w przypadku STB i kluczy sprzętowych TV z podłączonymi zewnętrznymi wyświetlaczami, które można odłączyć. Aby wdrożyć obsługę takich scenariuszy, skorzystaj z informacji w tabeli poniżej:
Scenariusz | Obsługa |
---|---|
Podczas uruchamiania brak podłączonego wyświetlacza |
|
Ekran główny jest fizycznie podłączony |
|
Główny wyświetlacz jest fizycznie odłączony |
|
Uwagi dotyczące połączeń innych niż HDMI
Android TV obsługuje tylko te rozdzielczości:
- 720x1280
- 1080x1920
- 2160x3840
- 4320x7680
Gdy STB lub wtyczka TV próbuje wyświetlić nieobsługiwaną rozdzielczość, np. 480i przez połączenie CVBS, użytkownik zobaczy komunikat o błędzie.
Jeśli STB lub wtyczka do telewizora ma złącza HDMI i inne niż HDMI, głównym wyświetlaczem jest połączenie HDMI, a połączenie inne niż HDMI jest nieaktywne. W związku z tym, jeśli połączenie HDMI zostanie odłączone, gdy połączenie inne niż HDMI jest nadal podłączone, do usługi SurfaceFlinger zostanie wysłane zdarzenie, a funkcje wyświetlacza innego niż HDMI muszą być odzwierciedlane przez interfejs getDisplayAttribute
i inne interfejsy API iComposerClient
(takie jak getHdrCapabilities
).
Używaj sekwencyjnych identyfikatorów konfiguracji, aby zapobiegać warunkom wyścigu
Warunki wyścigu mogą wystąpić, jeśli HAL usługi Composer zaktualizuje obsługiwane konfiguracje wyświetlania jednocześnie z wywoływaniem platformy setActiveConfig
lub setActiveConfigWithConstraints
.
Rozwiązaniem jest wdrożenie interfejsu HAL usługi Composer, co pozwoli na korzystanie z sekwencyjnych identyfikatorów i zapobiega temu problemowi.
W tej sekcji opisujemy, jak mogą wystąpić warunki wyścigu, oraz podajemy szczegółowe informacje na temat implementowania HAL usługi Composer, tak aby używała ona kolejnych identyfikatorów do zapobiegania takim warunkom.
Rozważ tę sekwencję zdarzeń. Gdy nowe identyfikatory sekwencyjne NIE są przypisane do nowych konfiguracji wyświetlania, spowoduje to powstanie warunku wyścigu:
Obsługiwane identyfikatory konfiguracji wyświetlania:
- id=1, 1080 x 1920, 60 Hz
- id=2, 1080 x 1920, 50 Hz
Platforma wywołuje
setActiveConfig(display, config=1)
.Jednocześnie usługa HAL Composer przetwarza zmianę konfiguracji wyświetlania i aktualizuje swój stan wewnętrzny do nowego zestawu konfiguracji wyświetlania, jak pokazano poniżej:
- id=1, 2160 x 3840, 60 Hz
- id=2, 2160 x 3840 50 Hz
- id=3, 1080 x 1920, 60 Hz
- id=4, 1080 x 1920, 50 Hz
HAL usługi Composer wysyła do platformy zdarzenie
onHotplug
, aby powiadomić o zmianie zestawu obsługiwanych trybów.HAL usługi Composer otrzymuje
setActiveConfig(display, config=1)
(z kroku 2).HAL interpretuje, że platforma zażądała zmiany konfiguracji na 2160 x 3840 60 Hz, choć w rzeczywistości był potrzebny 1080 x 1920 60 Hz.
Proces wykorzystujący niesekwencyjne przypisywanie identyfikatorów kończy się błędną interpretacją oczekiwanej zmiany konfiguracji.
Konfigurowanie listy HAL usługi Composer tak, aby używała identyfikatorów sekwencyjnych
Aby uniknąć takich warunków wyścigu, OEM musi wdrożyć HAL Composer w następujący sposób:
- Gdy interfejs HAL usługi Composer aktualizuje obsługiwane konfiguracje wyświetlacza, przypisuje do nowych konfiguracji wyświetlania nowe, sekwencyjne identyfikatory.
- Gdy platforma wywołuje metodę
setActiveConfig
lubsetActiveConfigWithConstraints
z nieprawidłowym identyfikatorem konfiguracji, HAL Composer ignoruje wywołanie.
Te kroki służą do zapobiegania warunkom wyścigu, jak pokazano w tej dyskusji.
Rozważ tę sekwencję zdarzeń, jeśli do nowych konfiguracji wyświetlania zostaną przypisane nowe identyfikatory sekwencyjne:
Obsługiwane identyfikatory konfiguracji wyświetlania:
- id=1, 1080 x 1920, 60 Hz
- id=2, 1080 x 1920, 50 Hz
Platforma wywołuje
setActiveConfig(display, config=1)
.Po przetworzeniu zmiany konfiguracji wyświetlania jest przypisywany następny zestaw identyfikatorów konfiguracji, zaczynając od następnej nieużywanej liczby całkowitej, która wygląda tak:
id=3, 2160 x 3840, 60 Hz
id=4, 2160 x 3840 50 Hz
id=5, 1080 x 1920, 60 Hz
id=6, 1080 x 1920, 50 Hz
HAL usługi Composer wysyła do platformy zdarzenie
onHotplug
, aby powiadomić o zmianie zestawu obsługiwanych trybów.HAL usługi Composer otrzymuje wartość
setActiveConfig(display, config=1)
(z kroku 2).HAL Composer ignoruje wywołanie, ponieważ identyfikator nie jest już prawidłowy.
Platforma odbiera i przetwarza zdarzenie
onHotplug
z kroku 4. Wywołuje on interfejs HAL usługi Composer za pomocą funkcjigetDisplayConfigs
igetDisplayAttribute
. Dzięki tym funkcjom platforma określa nowy identyfikator (5) dla żądanej rozdzielczości i częstotliwości odświeżania 1080 x 1920 i 60 Hz.Platforma wysyła kolejne zdarzenie
setActiveConfig
ze zaktualizowanym identyfikatorem 5.HAL usługi Composer otrzymuje wartość
setActiveConfig(display, config=5)
z kroku 5.HAL poprawnie interpretuje, że platforma zażądała zmiany konfiguracji na 1080 x 1920 przy 60 Hz.
Jak widać w przykładzie powyżej, proces korzystający z sekwencyjnego przypisywania identyfikatorów zapewnia, że warunek wyścigu jest niemożliwy i zaktualizowana jest prawidłowa zmiana konfiguracji wyświetlania.