HDR w zrzutach ekranu z Androida

Od czasu wprowadzenia filmów High Dynamic Range (HDR) usługi strumieniowe zaczęły przesyłać strumieniowo filmy HDR, koncentrując się na wyświetlaniu obrazu na pełnym ekranie. Ostatnio aplikacje społecznościowe zaczęły obsługiwać filmy HDR i Ultra HDR, co wskazuje na rosnące zainteresowanie HDR w różnych aplikacjach.

Obsługa HDR w Androidzie

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

Android 7

  • wstępna obsługa dekodowania i wyświetlania wideo HDR;
  • dalsze udoskonalenia funkcji HDR;

Android 13

  • Pełna obsługa rejestrowania, kodowania i wyświetlania filmów HDR.
  • Wprowadzenie kompozycji SDR i HDR, która definiuje różne zakresy luminacji wyświetlania SDR i HDR.

Android 14

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

Ulepszenia funkcji zrzutów ekranu HDR

W tej sekcji znajdziesz informacje o rozwoju funkcji zrzutów ekranu HDR w ostatnich aktualizacjach Androida.

Android 9

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

Android 13

Do bloku renderowania GPU w SurfaceFlinger dodano wtyczkę mapowania tonalnego, dzięki czemu OEM może dostarczyć shader GPU dopasowany do krzywej mapowania tonalnego wyświetlacza. Zrzuty ekranu są prawie identyczne z tym, co widać na ekranie, ale różnią się w kilku aspektach:

  • Zrzuty ekranu są zapisywane w formacie SDR. W związku z tym, gdy są wyświetlane obok sceny HDR, obszary HDR na zrzucie ekranu są ciemniejsze.
  • Jasność SDR nie jest zarządzana, co powoduje, że treści SDR na zrzucie ekranu są tak jasne jak treści HDR.

Innymi słowy, każdy film HDR, który zostanie uchwycony na zrzucie ekranu, zostanie przekonwertowany na film SDR.

Android 14

Funkcja ultra HDR stanowi duże wyzwanie dla robienia zrzutów ekranu. W odróżnieniu od filmów obrazy są zwykle renderowane w ramce framebuffera interfejsu użytkownika, co ma 2 główne konsekwencje:

  • Przetwarzanie obrazu, w tym mapowanie tonacji, nie może różnić się od otaczającego interfejsu.
  • Aplikacje są odpowiedzialne za mapowanie tonów na podstawie źródła podczas renderowania interfejsu.

Aby rozwiązać ten problem, można zastosować 3 możliwe rozwiązania:

  • Zachowanie szczegółów HDR obrazu w trybie ultra HDR, co powoduje przyciemnienie interfejsu aplikacji na zrzucie ekranu.
  • Zachowanie szczegółów interfejsu aplikacji, co powoduje przycięcie obrazu w Ultra HDR.
  • Kompromis polegający na rozjaśnieniu interfejsu aplikacji przy jednoczesnym przycięciu HDR.

Android 14 wdraża trzecie podejście polegające na rozjaśnieniu interfejsu aplikacji i przycięciu HDR-owych podświetleń.

Android 15-QPR1

SurfaceFlinger zawiera lokalny algorytm mapowania tonacji na potrzeby zrzutów ekranu. Ten proces obejmuje:

  • Dzielenie obrazu wejściowego na mniejsze obrazy.
  • Obliczanie maksymalnej luminacji w każdym obrazie i wyrzucanie wartości niskiej luminacji w każdej sekcji.
  • Interpolowanie obliczonej luminescencji przez rozmycie i ponowne próbkowanie.
  • Zastosowanie do obrazu wejściowego parametryzowanego tonem mapowania Reinharda na podstawie interpolowanych wartości luminacji.

Ten algorytm pokazuje znaczne ulepszenia w zakresie zrzutów ekranu między Androidem 14 a Androidem 15-QPR1, jak widać w tych przykładach:

  • Przykład 1 to zrzut ekranu filmu HDR nałożonego na stronę w Chrome zawierającą obraz w ultra HDR. Kolory interfejsu są w dużej mierze 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 w przykładzie 1.

  • Przykład 2 to zrzut ekranu z filmem HDR nałożonym na Ustawienia oraz kolejne zrzuty ekranu. W Androidzie 14 kolory zrzutów ekranu są coraz ciemniejsze. W Androidzie 15-QPR1 funkcja tonemappera 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 przypadku przykładu 2.

Android 16

Podobnie jak w przypadku Ultra HDR, zrzuty ekranu w formacie HDR przechowują mapę wzmocnienia w pliku zrzutu ekranu, aby podczas renderowania można było odzyskać reprezentację HDR. Jednak w odróżnieniu od ultra HDR zrzut ekranu pozostaje w formacie PNG ze względu na zgodność wsteczną z systemami, które przetwarzają zrzuty ekranu PNG.

Szczegóły generowania zrzutu ekranu:

  • Gdy na urządzeniu wyświetlana jest zawartość HDR, zrzut ekranu jest generowany przy użyciu pikseli FP16.
  • Lokalny procesor mapowania tonacji opisany w Androidzie 15-QPR1 generuje 8-bitowe podstawowe odwzorowanie SDR.
  • 8-bitowa mapa wzmocnienia jest tworzona przez połączenie wersji podstawowej SDR z wersją HDR.
  • Podstawowe odwzorowanie SDR i mapa wzmocnienia są kodowane w jednym pliku PNG.

Szczegóły kodowania PNG:

  • Mapa wzmocnienia jest kodowana jako obraz PNG, który zawiera fragment gmAP zawierający metadane ISO 21496-1 mapy wzmocnienia.
  • Podstawowa wersja SDR jest kodowana jako obraz PNG, który zawiera fragment gmAP zawierający wersję metadanych ISO 21496-1. Ten obraz PNG zawiera też fragment gdAT, który zawiera całą zakodowaną mapę wzmocnienia w formacie PNG.

Poniższy rysunek przedstawia układ fragmentów PNG:

Układ fragmentów PNG

Rysunek 3. Układ fragmentów PNG.

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