Obsługa Hotpluga

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:

  1. Po wykryciu zmiany w możliwościach wyświetlania platforma otrzymuje powiadomienie onHotplug(display, connection=CONNECTED).
  2. 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 i getDisplayCapabilities.
  3. 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
  • Wyślij sygnał onHotplug(display, connection=CONNECTED) z HAL usługi Composer do platformy.
  • Zastąp fizyczny stan wyświetlania w HAL usługi Composer stanem wyświetlania zastępczego.
Ekran główny jest fizycznie podłączony
Główny wyświetlacz jest fizycznie odłączony
  • Wyślij kolejne zdarzenie onHotplug(display, connection=CONNECTED) z interfejsu HAL usługi Composer do platformy.
  • Zastąp fizyczny stan wyświetlania w HAL usługi Composer stanem wyświetlania zastępczego. Wyświetlacz zastępczy musi mieć jeden tryb wyświetlania, aby platforma wysyłała wywołanie zwrotne onDisplayChanged do aplikacji (ponieważ zmienił się zestaw obsługiwanych trybów). Ten tryb pojedynczego wyświetlacza musi pasować do ostatniego aktywnego trybu wyświetlacza fizycznego przed odłączeniem, aby aplikacje nie odbierały zdarzeń zmiany konfiguracji.

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:

  1. Obsługiwane identyfikatory konfiguracji wyświetlania:

    • id=1, 1080 x 1920, 60 Hz
    • id=2, 1080 x 1920, 50 Hz
  2. Platforma wywołuje setActiveConfig(display, config=1).

  3. 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
  4. HAL usługi Composer wysyła do platformy zdarzenie onHotplug, aby powiadomić o zmianie zestawu obsługiwanych trybów.

  5. HAL usługi Composer otrzymuje setActiveConfig(display, config=1) (z kroku 2).

  6. 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 lub setActiveConfigWithConstraints 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:

  1. Obsługiwane identyfikatory konfiguracji wyświetlania:

    • id=1, 1080 x 1920, 60 Hz
    • id=2, 1080 x 1920, 50 Hz
  2. Platforma wywołuje setActiveConfig(display, config=1).

  3. 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

  4. HAL usługi Composer wysyła do platformy zdarzenie onHotplug, aby powiadomić o zmianie zestawu obsługiwanych trybów.

  5. HAL usługi Composer otrzymuje wartość setActiveConfig(display, config=1) (z kroku 2).

  6. HAL Composer ignoruje wywołanie, ponieważ identyfikator nie jest już prawidłowy.

  7. Platforma odbiera i przetwarza zdarzenie onHotplug z kroku 4. Wywołuje on interfejs HAL usługi Composer za pomocą funkcji getDisplayConfigs i getDisplayAttribute. 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.

  8. Platforma wysyła kolejne zdarzenie setActiveConfig ze zaktualizowanym identyfikatorem 5.

  9. HAL usługi Composer otrzymuje wartość setActiveConfig(display, config=5) z kroku 5.

  10. 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.