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 Einführung von HDR in verschiedenen Apps hinweist.

HDR-Unterstützung unter Android

Android unterstützt HDR-Technologie seit mehreren Meilensteinen:

Android 7

  • Erste Unterstützung für die HDR-Videodecodierung und -Wiedergabe.
  • Kontinuierliche Weiterentwicklung der HDR-Funktionen.

Android 13

  • Umfassende Unterstützung für HDR-Videoaufnahmen, ‑Codierung und ‑Wiedergabe.
  • Die Komposition aus SDR und HDR wurde eingeführt. Sie definiert unterschiedliche darstellbare Luminanzbereiche 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, bietet Unterstützung für HDR-Videos. Für das GPU-Rendering von HDR-Videos und Screenshots wird ein komplexer polynomieller Tone Mapper verwendet. Diese Tonzuordnungskurve entspricht nicht immer der Tonzuordnung des Displays. Daher unterscheiden sich Screenshots vom Inhalt auf dem Display.

Android 13

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

  • Screenshots bleiben im SDR-Format. Daher erscheinen die HDR-Bereiche im Screenshot dunkler, wenn sie neben einer HDR-Szene angezeigt werden.
  • Die SDR-Leuchtdichte wird nicht verwaltet, sodass SDR-Inhalte im Screenshot genauso 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 rendert das System Bilder in der Regel im UI-Framebuffer. Das hat zwei Hauptfolgen:

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

Um dieses Problem zu beheben, 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.
  • Die App-Benutzeroberfläche wird aufgehellt, während HDR-Highlights abgeschnitten werden.

Unter Android 14 wird der dritte Ansatz umgesetzt, bei dem die Benutzeroberfläche der App aufgehellt und HDR-Highlights abgeschnitten werden.

Android 15 QPR1

SurfaceFlinger enthält einen lokalen Tone-Mapping-Algorithmus für Screenshots. Dazu sind folgende Schritte erforderlich:

  • Das Eingabebild wird in kleinere Bilder unterteilt.
  • Die maximale Leuchtdichte in jedem Bild wird berechnet und niedrige Leuchtdichtewerte in jedem Abschnitt werden verworfen.
  • Die berechneten Luminanzen werden durch Weichzeichnen und Resampling interpoliert.
  • Anwenden eines parametrisierten Reinhard-Tonemappers auf das Eingabebild 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 eine Chrome-Seite mit Ultra HDR gelegt wurde. Die Farben der Benutzeroberfläche bleiben in der neuen Implementierung weitgehend 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 Einstellungen gelegt wurde, gefolgt von weiteren Screenshots. In Android 14 sind die Farben des Screenshots immer dunkler. In Android 15-QPR1 werden die Farben der Benutzeroberfläche durch den Tonemapper korrekt wiedergegeben 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 während des Renderns 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.

Die Generierung von Screenshots umfasst Folgendes:

  • 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 Kombinieren der SDR-Basiswiedergabe mit der HDR-Wiedergabe 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-Chunk, 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.

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