Cómo corregir el color con tablas de consulta (LUT)

Las diferentes capacidades de HDR en los dispositivos Android pueden generar salidas de visualización de HDR fragmentadas. Una tabla de búsqueda (LUT) es una nueva solución de corrección de color diseñada para resolver esta incoherencia. Esta incoherencia se resuelve prescribiendo una forma de corregir el color, en lugar de delegar en un mecanismo de corrección de color por dispositivo indefinido.

Requisitos previos del SDK

Para implementar LUT, tu versión del SDK debe ser 36 o posterior.

Implementa una LUT

Sigue estos pasos para aplicar una LUT a un SurfaceControl:

  1. Crea una instancia de DisplayLuts.
  2. Crea instancias de DisplayLuts.Entry con el búfer de datos de la LUT, la dimensión de la LUT y la clave de muestreo de la LUT. Para obtener más información, consulta la documentación de LutProperties.
  3. Llama a DisplayLuts#set(DisplayLuts.Entry luts) o DisplayLuts#set(DisplayLuts.Entry first, DisplayLuts.Entry second) para establecer las entradas de la LUT. El framework admite LUTs 1D, LUTs 3D o una combinación de LUTs 1D y 3D.
  4. Llama a SurfaceControl.Transaction#setLuts para aplicar las LUT a la capa.

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();

También puedes usar OverlayProperties.getLutProperties() para comprender las propiedades de la LUT del dispositivo y determinar si el Hardware Composer puede controlar la LUT seleccionada.