Mit Android 13 wird eine vom Anbieter konfigurierbare statische
libtonemap
, die Tone Mapping-Vorgänge definiert und gemeinsam genutzt wird,
mit dem SurfaceFlinger-Prozess und Hardware Composer (HWC)-Implementierungen.
Mit dieser Funktion können OEMs ihre Tonabbildungen für Displays definieren und teilen.
Algorithmen zwischen Framework und Anbietern zu treffen. Dadurch wird der Tonfall
-Zuordnung.
Vor Android 13 wurde das bildschirmspezifische Tone Mapping Abläufe wurden nicht zwischen HWC, SurfaceFlinger und Apps ausgetauscht. Je nach im Rendering-Pfad, führten bei HDR-Inhalten zu Abweichungen bei der Bildqualität, bei dem der HDR-Inhalt auf unterschiedliche Weise einem Ausgaberaum zugeordnet wurde. Dieses in Szenarien wie der Bildschirmdrehung wahrnehmbar war, zwischen der GPU und der DPU sowie in Bezug auf das Rendering zwischen TextureView und SurfaceView.
Auf dieser Seite werden die Benutzeroberfläche, die Anpassung und die Validierung des
libtonemap
-Bibliothek.
Schnittstelle für die Tone Mapping-Bibliothek
Die libtonemap
enthält CPU-gestützte Implementierungen und SkSL-Shader, die
von SurfaceFlinger für die GPU-Back-End-Zusammensetzung und HWC
eine Tone Mapping-Lookup-Tabelle (LUT) generiert. Der Einstiegspunkt zu libtonemap
ist android::tonemap::getToneMapper()
, wodurch ein Objekt zurückgegeben wird, das
Implementiert die ToneMapper
-Schnittstelle.
Die ToneMapper
-Schnittstelle unterstützt die folgenden Funktionen:
Tone-Mapping-LUT generieren
Die Schnittstelle
ToneMapper::lookupTonemapGain
ist eine CPU Implementierung des inlibtonemap_LookupTonemapGain()
definierten Shaders. Dieses wird von Einheitentests im Framework verwendet und kann von Partnern für Unterstützung beim Generieren einer Tonzuordnungs-LUT in ihrer Farbpipeline.libtonemap_LookupTonemapGain()
akzeptiert Farbwerte in absoluten, nicht normalisierten linearen Raum, sowohl im linearen RGB- als auch in XYZ, und gibt eine Gleitkommazahl zurück. beschreibt, wie stark die Eingabefarben im linearen Raum multipliziert werden sollen.SkSL-Shader generieren
Die Schnittstelle
ToneMapper::generateTonemapGainShaderSkSL()
gibt ein SkSL-Shader-String mit Angabe eines Quell- und Zieldatenraums. Der SkSL-Shader an die Skia-Implementierung fürRenderEngine
angeschlossen ist, die GPU-beschleunigte Compositing-Komponente für SurfaceFlinger. Der Shader ist auch anlibhwui
angeschlossen, damit HDR-zu-SDR-Tone Mapping fürTextureView
effizient durchgeführt werden kann. Da der generierte String in andere von Skia verwendete SkSL-Shader eingebunden ist, Der Shader muss die folgenden Regeln einhalten:- Der Shader-String muss einen Einstiegspunkt mit der Eigenschaft
float libtonemap_LookupTonemapGain(vec3 linearRGB, vec3 xyz)
-Signatur, wobeilinearRGB
ist der Wert der absoluten cd/m2-Werte der RGB-Pixel im linearen Raum undxyz
wirdlinearRGB
in XYZ konvertiert. - Allen Hilfsmethoden, die vom Shader-String verwendet werden, muss das Präfix
den String
libtonemap_
, damit die Framework-Shader-Definitionen nicht in Konflikt stehen. Ebenso müssen Eingabeuniformen das Präfixin_libtonemap_
haben.
- Der Shader-String muss einen Einstiegspunkt mit der Eigenschaft
SkSL-Uniformen erstellen
Die Schnittstelle
ToneMapper::generateShaderSkSLUniforms()
gibt den Fehlerwert weiter unten mit einer Metadaten-struct
, die Metadaten aus verschiedenen HDR- Standards und Anzeigebedingungen:Eine Liste von Uniformen, die an einen SkSL-Shader gebunden sind.
Die einheitlichen Werte
in_libtonemap_displayMaxLuminance
undin_libtonemap_inputMaxLuminance
. Diese Werte werden von Framework-Shadern verwendet beim Skalieren der Eingabe auflibtonemap
und Normalisieren der Ausgabe als zutreffend sind.
Derzeit ist der Prozess der Uniformen unabhängig vom Input und und gibt den Ausgabedatenraum an.
Personalisierung
Die Referenzimplementierung der libtonemap
-Bibliothek liefert akzeptable Ergebnisse. Sie können jedoch
da der von der GPU-Zusammensetzung verwendete Tone Mapping-Algorithmus
die von der Datenschutzaufsichtsbehörde verwendet wird, kann die Verwendung der Referenzimplementierung dazu führen,
in einigen Szenarien wie z. B. bei der Rotationsanimation. Anpassung kann
anbieterspezifische Probleme mit der Bildqualität beheben können.
OEMs wird dringend empfohlen, die Implementierung von libtonemap
zu überschreiben,
eigene ToneMapper
-Unterklasse definieren, die von getToneMapper()
zurückgegeben wird.
Bei der Anpassung der Implementierung müssen Partner einen der folgenden Schritte ausführen:
Folgendes:
- Implementierung von
libtonemap
direkt ändern. - eine eigene statische Bibliothek definieren, die Bibliothek als eigenständige Bibliothek kompilieren und
die Datei
.a
derlibtonemap
-Bibliothek durch die Datei ersetzen, die aus der benutzerdefinierten Bibliothek.
Anbieter müssen keinen Kernel-Code ändern, aber mehrere Anbieter müssen Informationen zu den DPU-Tone-Mapping-Algorithmen Implementierung.
Zertifizierungsstufe
So validieren Sie Ihre Implementierung:
Spielen Sie HDR-Videos auf Bildschirmen mit einem beliebigen HDR-Standard ab, den Ihr Anzeigesystem unterstützt, wie HLG, HDR10, HDR10+ oder DolbyVision.
Schalten Sie die GPU-Zusammensetzung ein, damit kein für Nutzer wahrnehmbares Flackern auftritt.
Verwenden Sie den folgenden
adb
-Befehl, um die GPU-Zusammensetzung umzuschalten:adb shell service call SurfaceFlinger 1008 i32 <0 to enable HWC composition, 1 to force GPU composition>
Häufige Probleme
Bei dieser Implementierung können folgende Probleme auftreten:
Banding tritt auf, wenn das von der GPU-Zusammensetzung verwendete Renderingziel niedriger ist Precision als der typische Wert für HDR-Inhalte. Durch Banding können Sie z. B. treten auf, wenn eine HWC-Implementierung opaker 10-Bit-Formate für HDR unterstützt, z. B. RGBA1010102 oder P010, erfordert aber, dass die GPU-Zusammensetzung in ein 8-Bit-Format schreibt wie RGBA8888, um Alpha zu unterstützen.
Eine subtile Farbverschiebung wird durch Quantisierungsunterschiede verursacht, wenn die DPU mit einer anderen Genauigkeit als die GPU arbeitet.
Jedes dieser Probleme hängt mit der relativen Genauigkeitsunterschiede der zugrunde liegende Hardware. Eine typische Problemumgehung besteht darin, sicherzustellen, die Pfade mit geringerer Genauigkeit ein, wodurch Unterschiede bei der Genauigkeit weniger menschlich werden. wahrnehmbar sind.