HDR in Android-Screenshots

Nach der Einführung von HDR-Videos (High Dynamic Range) begannen Streamingdienste, HDR-Videos zu streamen, wobei der Fokus auf Vollbildwiedergabe lag. Social-Media-Apps unterstützen jetzt HDR-Video und Ultra HDR, was auf ein wachsendes Interesse an der HDR-Einführung in verschiedenen Apps hindeutet.

Android-Unterstützung für HDR

Android unterstützt HDR-Technologie seit mehreren Meilensteinen:

Android 7

  • Erste Unterstützung für die HDR-Videodecodierung und ‑anzeige.
  • Kontinuierliche Verbesserungen der HDR-Funktionen.

Android 13

  • End-to-End-Unterstützung für HDR-Videoaufnahmen, ‑Codierung und ‑Wiedergabe.
  • Die Funktion Mischung aus SDR- und HDR-Komposition wurde eingeführt. Sie definiert unterschiedliche darstellbare Helligkeitsbereiche zwischen SDR und HDR.

Android 14

Auch die Unterstützung von HDR-Screenshots hat sich weiterentwickelt und geändert.

Verbesserungen bei HDR-Screenshots

In diesem Abschnitt wird die Entwicklung der HDR-Screenshot-Funktion in Android-Updates beschrieben.

Android 9

SurfaceFlinger, der Grafik-Compositor von Android, unterstützt jetzt HDR-Videos. Für das GPU-Rendering von HDR-Videos und ‑Screenshots wird ein komplexer polynomieller Tone Mapper verwendet. Diese Tone-Mapping-Kurve entspricht nicht immer dem Tone-Mapper des Displays, sodass sich Screenshots von den Inhalten auf dem Display unterscheiden.

Android 13

Der GPU-Rendering-Block von SurfaceFlinger enthält ein Tone-Mapping-Plug-in, mit dem der OEM einen GPU-Shader bereitstellen kann, der der Tone-Mapping-Kurve des Displays entspricht. Die Screenshots stimmen fast mit den Bildschirminhalten überein, aber mit den folgenden Unterschieden:

  • Screenshots bleiben im SDR-Format. Wenn der Screenshot neben einer HDR-Szene angezeigt wird, erscheinen die HDR-Bereiche daher dunkler.
  • Die SDR-Leuchtdichte wird nicht verwaltet, sodass SDR-Inhalte im Screenshot so hell wie HDR-Inhalte erscheinen.

Das System wandelt also alle im Screenshot aufgenommenen HDR-Videos in SDR-Videos um.

Android 14

Ultra HDR stellt eine große Herausforderung für Screenshots dar. Im Gegensatz zu Videos werden Bilder in der Regel im UI-Framebuffer gerendert. Das hat zwei wesentliche Auswirkungen:

  • Bilder dürfen keine Bildverarbeitung, einschließlich Tonemapping, aufweisen, die sich von der umgebenden Benutzeroberfläche unterscheidet.
  • Apps sind für das quellenbasierte Tone-Mapping beim Rendern der Benutzeroberfläche verantwortlich.

Um diese Herausforderung zu meistern, gibt es drei mögliche Implementierungen für Screenshots:

  • Die HDR-Details eines Ultra HDR-Bildes werden beibehalten, was zu einer abgedunkelten App-Benutzeroberfläche im Screenshot führt.
  • Die Details der App-Benutzeroberfläche werden beibehalten, was zu einem Clipping von Ultra-HDR-Bildern führt.
  • Kompromiss: Die App-Benutzeroberfläche wird aufgehellt, während HDR-Highlights abgeschnitten werden.

Android 14 implementiert den dritten Ansatz, bei dem die App-Benutzeroberfläche aufgehellt und HDR-Highlights abgeschnitten werden.

Android 15 QPR1

SurfaceFlinger enthält einen lokalen Tone-Mapping-Algorithmus für Screenshots. Dieser Prozess umfasst Folgendes:

  • Das Eingabebild wird in kleinere Bilder unterteilt.
  • Berechnung der maximalen Luminanz in jedem Bild und Verwerfen niedriger Luminanzwerte in jedem Abschnitt.
  • Die berechneten Luminanzen werden durch Weichzeichnen und Resampling interpoliert.
  • Wendet einen parametrisierten Reinhard-Tonemapper auf das Eingabebild an, basierend auf den interpolierten Luminanzwerten.

Dieser Algorithmus verbessert Screenshots zwischen Android 14 und Android 15 QPR1 erheblich, wie die folgenden Beispiele zeigen:

  • Beispiel 1 ist ein Screenshot eines HDR-Videos, das über einer Chrome-Seite mit Ultra HDR eingeblendet wird. Die Farben der Benutzeroberfläche bleiben in der neuen Implementierung größtenteils erhalten und das Bild wird nicht mehr abgeschnitten.

    Android 14 Android 15 QPR1
    Beispiel 1 in Android 14 Beispiel 1 in Android 15qpr

    Abbildung 1. Vergleich von Android 14 und Android 15 QPR1 für Beispiel 1

  • Beispiel 2 ist ein Screenshot eines HDR-Videos, das über den Einstellungen und nachfolgenden Screenshots eingeblendet wird. In Android 14 sind die Farben der Screenshots immer dunkler. In Android 15 QPR1 werden die Farben der Benutzeroberfläche vom Tonemapper korrekt repliziert und beibehalten.

    Android 14 Android 15 QPR1
    Beispiel 2 in Android 14 Beispiel 2 in Android 15qpr

    Abbildung 2: Vergleich von Android 14 und Android 15 QPR1 für Beispiel 2.

Android 16

Ähnlich wie bei Ultra HDR wird bei HDR-Screenshots eine Gainmap in der Screenshot-Datei gespeichert, um die HDR-Darstellung beim Rendern wiederherzustellen. Im Gegensatz zu Ultra HDR bleibt der Screenshot jedoch im PNG-Format, um die Abwärtskompatibilität mit Systemen zu gewährleisten, die PNG-Screenshots verarbeiten.

So werden Screenshots generiert:

  • Wenn HDR-Inhalte auf dem Gerät angezeigt werden, wird ein Screenshot mit FP16-Pixeln erstellt.
  • Der in Android 15 QPR1 beschriebene lokale Tone-Mapper generiert eine 8-Bit-SDR-Basiswiedergabe.
  • Eine 8-Bit-Gainmap wird durch die Kombination der SDR-Basisdarstellung mit der HDR-Darstellung erstellt.
  • Die SDR-Basiswiedergabe und die Gainmap werden in einer einzigen PNG-Datei codiert.

Die PNG-Codierung umfasst Folgendes:

  • Die Gainmap wird als PNG-Bild codiert, das einen gmAP-Chunk mit den ISO 21496-1-Metadaten für die Gainmap enthält.
  • Die SDR-Basiswiedergabe wird als PNG-Bild codiert, das einen gmAP-Chunk mit der Version der ISO 21496-1-Metadaten enthält. Dieses PNG-Bild enthält auch einen gdAT-Block, der das gesamte codierte Gainmap-PNG enthält.

Die folgende Abbildung zeigt das Layout der PNG-Chunks:

Layout der PNG-Chunks

Abbildung 3: Layout der PNG-Chunks.

Unter Android 16 unterstützt der PNG-Codec sowohl die Codierung als auch die Decodierung dieser PNGs. Apps können ein PNG mit einer Gainmap auf dieselbe Weise wie Ultra HDR anzeigen.