Da die HDR-Funktionen auf Android-Geräten variieren, kann es zu fragmentierten HDR-Ausgaben kommen. Eine LUT (Look-up-Table) ist eine neue Lösung zur Farbkorrektur, die diese Inkonsistenz beheben soll. Diese Inkonsistenz wird behoben, indem eine Methode zur Farbkorrektur vorgeschrieben wird, anstatt sie an einen undefinierten gerätespezifischen Farbkorrekturmechanismus zu delegieren.
SDK-Voraussetzungen
Für die Implementierung von LUTs muss Ihre SDK-Version mindestens 36 sein.
LUT implementieren
So wenden Sie eine LUT auf ein SurfaceControl
an:
- Erstellen Sie eine
DisplayLuts
-Instanz. - Erstellen Sie
DisplayLuts.Entry
-Instanzen mit dem LUT-Datenpuffer, der LUT-Dimension und dem Sampling-Schlüssel der LUT. Weitere Informationen finden Sie in der Dokumentation zuLutProperties
. - Rufen Sie
DisplayLuts#set(DisplayLuts.Entry luts)
oderDisplayLuts#set(DisplayLuts.Entry first, DisplayLuts.Entry second)
auf, um LUT-Einträge festzulegen. Das Framework unterstützt 1D-LUTs, 3D-LUTs oder eine Kombination aus 1D- und 3D-LUTs. - Rufen Sie
SurfaceControl.Transaction#setLuts
auf, um die LUTs auf die Ebene anzuwenden.
Kotlin
val sc = SurfaceControl.Builder().build()
val luts = DisplayLuts()
val entry = DisplayLuts.Entry(
floatArrayOf(0.5f, 0.5f, 0.5f, 0.5f),
LutProperties.ONE_DIMENSION,
LutProperties.SAMPLING_KEY_MAX_RGB
)
luts.set(entry)
SurfaceControl.Transaction().setLuts(sc, luts).apply()
Java
SurfaceControl sc = new SurfaceControl.Builder().build();
DisplayLuts luts = new DisplayLuts();
DisplayLuts.Entry entry = new DisplayLuts.Entry(
new float[]{0.5f, 0.5f, 0.5f, 0.5f},
LutProperties.ONE_DIMENSION,
LutProperties.SAMPLING_KEY_MAX_RGB
);
luts.set(entry);
new SurfaceControl.Transaction().setLuts(sc, luts).apply();
Sie können auch OverlayProperties.getLutProperties()
verwenden, um die LUT-Eigenschaften des Geräts zu ermitteln und festzustellen, ob der Hardware Composer die ausgewählte LUT verarbeiten kann.