HDR w zrzutach ekranu z Androida

Od czasu wprowadzenia filmów o wysokim zakresie dynamiki (HDR) usługi streamingowe zaczęły przesyłać strumieniowo filmy HDR, koncentrując się na wyświetlaniu na pełnym ekranie. Ostatnio aplikacje społecznościowe wprowadziły obsługę filmów HDR i Ultra HDR, co wskazuje na rosnące zainteresowanie wdrożeniem HDR w różnych aplikacjach.

Obsługa HDR na Androidzie

Oto najważniejsze etapy rozwoju obsługi technologii HDR na Androidzie na przestrzeni kilku lat:

Android 7

  • Wstępna obsługa dekodowania i wyświetlania filmów HDR.
  • Dalszy rozwój funkcji HDR.

Android 13

  • Pełna obsługa nagrywania, kodowania i wyświetlania filmów HDR.
  • Wprowadzenie kompozycji mieszanej SDR i HDR, która określa różne zakresy luminancji wyświetlanej między SDR a HDR.

Android 14

  • Obsługa zdjęć HDR w formacie ultra HDR.

Obsługa zrzutów ekranu w HDR również ewoluowała i przez lata przeszła wiele zmian.

Ulepszenia funkcji zrzutów ekranu w technologii HDR

W tej sekcji znajdziesz informacje o postępach w zakresie możliwości robienia zrzutów ekranu w HDR w ostatnich aktualizacjach Androida.

Android 9

SurfaceFlinger, kompozytor grafiki Androida, wprowadza obsługę filmów HDR. Renderowanie na GPU filmów i zrzutów ekranu HDR jest obsługiwane za pomocą złożonego wielomianowego mapowania tonów. Ta krzywa mapowania tonów nie zawsze jest równoważna mapowaniu tonów wyświetlacza, więc zrzuty ekranu różnią się od treści wyświetlanych na ekranie.

Android 13

Do bloku renderowania GPU SurfaceFlingera dodawana jest wtyczka mapowania tonów, która umożliwia producentowi OEM dostarczenie shadera GPU dopasowanego do krzywej mapowania tonów wyświetlacza. Zrzuty ekranu prawie w całości odpowiadają temu, co jest wyświetlane na ekranie, ale z tymi różnicami:

  • Zrzuty ekranu pozostają w formacie SDR. W związku z tym, gdy zrzut ekranu jest wyświetlany obok sceny HDR, obszary HDR na zrzucie ekranu wydają się ciemniejsze.
  • Jasność SDR nie jest zarządzana, więc treści SDR na zrzucie ekranu będą wyglądać tak samo jasno jak treści HDR.

Innymi słowy, każdy film HDR widoczny na zrzucie ekranu jest konwertowany na film SDR.

Android 14

Ultra HDR stanowi duże wyzwanie dla zrzutów ekranu. W przeciwieństwie do filmów obrazy są zwykle renderowane w buforze ramki interfejsu, co ma 2 główne konsekwencje:

  • Obrazy nie mogą mieć przetwarzania obrazu, w tym mapowania tonalnego, które różni się od otaczającego interfejsu.
  • Aplikacje odpowiadają za mapowanie tonów na podstawie źródła podczas renderowania interfejsu.

Aby rozwiązać ten problem, można zastosować 3 rodzaje zrzutów ekranu:

  • Zachowaj szczegóły HDR obrazu w technologii ultra HDR, co spowoduje przyciemnienie interfejsu aplikacji na zrzucie ekranu.
  • Zachowaj szczegóły interfejsu aplikacji, co spowoduje obcięcie obrazu ultra HDR.
  • Kompromis polega na rozjaśnieniu interfejsu aplikacji przy jednoczesnym obcinaniu najjaśniejszych obszarów HDR.

Android 14 wykorzystuje trzecie podejście, czyli rozjaśnianie interfejsu aplikacji i przycinanie najjaśniejszych obszarów HDR.

Android 15-QPR1

SurfaceFlinger zawiera lokalny algorytm mapowania odcieni dla zrzutów ekranu. Ten proces obejmuje:

  • Podzielenie obrazu wejściowego na mniejsze obrazy.
  • Obliczanie maksymalnej luminancji na każdym obrazie i odrzucanie wartości o niskiej luminancji w każdej sekcji.
  • Interpolowanie obliczonych luminancji przez rozmycie i ponowne próbkowanie.
  • Stosowanie do obrazu wejściowego parametryzowanego odwzorowania tonalnego Reinhard na podstawie interpolowanych wartości luminancji.

Ten algorytm znacznie poprawia jakość zrzutów ekranu w Androidzie 15-QPR1 w porównaniu z Androidem 14, co widać na tych przykładach:

  • Przykład 1 to zrzut ekranu z filmem HDR nałożonym na stronę Chrome zawierającą ultra HDR. Kolory interfejsu są w większości zachowane w nowej implementacji, a obraz nie jest już przycinany.

    Android 14 Android 15-QPR1
    Przykład 1 w Androidzie 14 Przykład 1 w Androidzie 15qpr

    Rysunek 1. Porównanie Androida 14 i Androida 15-QPR1 na przykładzie 1.

  • Przykład 2 to zrzut ekranu z filmem HDR nałożonym na Ustawienia, a następnie kolejne zrzuty ekranu. W Androidzie 14 kolory zrzutu ekranu są kolejno ciemniejsze. W Androidzie 15-QPR1 funkcja mapowania odcieni prawidłowo odwzorowuje i zachowuje kolory interfejsu.

    Android 14 Android 15-QPR1
    Przykład 2 w Androidzie 14 Przykład 2 w Androidzie 15qpr

    Rysunek 2. Porównanie Androida 14 i Androida 15-QPR1 w przykładzie 2.

Android 16

Podobnie jak w przypadku Ultra HDR zrzuty ekranu w technologii HDR przechowują w pliku zrzutu ekranu mapę wzmocnienia, aby podczas renderowania odzyskać reprezentację HDR. Jednak w przeciwieństwie do ultra HDR zrzut ekranu pozostaje w formacie PNG, aby zachować zgodność wsteczną z systemami, które obsługują zrzuty ekranu w tym formacie.

Szczegóły generowania zrzutów ekranu są następujące:

  • Gdy na urządzeniu wyświetlane są treści HDR, zrzut ekranu jest generowany przy użyciu pikseli FP16.
  • Lokalny moduł mapowania tonów opisany w Androidzie 15-QPR1 generuje 8-bitową podstawową wersję SDR.
  • 8-bitowa mapa wzmocnienia powstaje przez połączenie podstawowej wersji SDR z wersją HDR.
  • Podstawowa wersja SDR i mapa wzmocnienia są kodowane w jednym pliku PNG.

Szczegóły kodowania PNG są następujące:

  • Mapa wzmocnienia jest zakodowana jako obraz PNG, który zawiera fragment gmAP z metadanymi ISO 21496-1 mapy wzmocnienia.
  • Podstawowa wersja SDR jest kodowana jako obraz PNG, który zawiera fragment gmAP z wersją metadanych ISO 21496-1. Ten obraz PNG zawiera też fragment gdAT, który zawiera cały zakodowany obraz PNG mapy wzmocnienia.

Na poniższym rysunku przedstawiono układ bloków PNG:

Układ fragmentów PNG

Rysunek 3. Układ bloków PNG.

W Androidzie 16 kodek PNG obsługuje zarówno kodowanie, jak i dekodowanie tych plików PNG. Aplikacje mogą wyświetlać pliki PNG z mapą wzmocnienia w taki sam sposób jak Ultra HDR.