Guía de OEM para la implementación del ROI

Android 15 presenta un proceso estandarizado para integrar las configuraciones de usuario de la región de interés (RoI) en el framework de codificación de video de Android. Esta función mejora la calidad de compresión del ROI al ofrecer APIs públicas para integrar y analizar configuraciones de usuario en el video codificador.

Implementación

Los proveedores de SoC y los OEMs pueden controlar la compatibilidad de ROI para la codificación de video con la marca FEATURE_Roi. Si no se habilita FEATURE_Roi, no se produce ningún cambio en el comportamiento del codificador de video.

Cambios en el framework de video

En esta sección, se detallan los cambios en el framework de video necesarios para implementar esta función.

Claves en Codec2

En Android 15, el mapa de parámetros de cuantificación (QP_map) y la configuración rectangular (rect) se definen como tipos de configuración de ROI. Además, se presentan dos claves en Codec2 (C2) para admitir estos tipos nuevos. El uso de ambas claves es el mismo que el de las APIs públicas. Dentro del bucle de fotogramas del codificador, la configuración se ajusta de forma dinámica durante la etapa de ejecución, antes de que el búfer de entrada se ponga en cola, como se describe a continuación:

  • En una situación fija, si no se proporciona una configuración de RoI para el modelo el codificador usa la misma configuración que el fotograma anterior.

  • En una situación dinámica, los tipos de configuración de RoI pueden cambiar dinámicamente.

Las claves nuevas en C2 se describen en las siguientes secciones.

kParamIndexQpOffsetMapBuffer

La clave kParamIndexQpOffsetMapBuffer indica al mapa qp-offset que debe mostrar un marco. Su valor se establece con el parámetro de entrada PARAMETER_KEY_QP_OFFSET_MAP de setParameters.

kParamIndexQpOffsetMapBuffer es un array de bytes en C2InfoBuffer, con los siguientes atributos:

  • Longitud: Es la cantidad de bloques de 16 × 16 en un fotograma.

  • Valor: cada valor del array es el desplazamiento de QP de un bloque de 16x16, en la región. −51~51. El QP de la unidad de codificación más grande (LCU) objetivo se calcula mediante el control de tasa del codificador más el desplazamiento. Si el resultado calculado supera el rango de 0-51 región, el valor se trunca a 0~51.

    • Si es 0: No hay compensación de QP, el control de tasa original decide el QP.
    • Si es distinto de cero, el QP es el control de tasa original más el desplazamiento.
    • Si es negativo, la calidad del video aumenta en la LCU de destino.
    • Si es positiva, la calidad de video disminuye en la LCU objetivo.
  • Uso: El usuario debe configurar esta clave como bloques de 16 × 16. El codificador ajusta la configuración al tamaño real de la LCU promediando los valores de los bloques de 16 × 16 en la LCU.

C2_PARAMKEY_QP_OFFSET_RECTS

La clave C2_PARAMKEY_QP_OFFSET_RECTS (configurada en coding.qp-offset-rects) establece el ROI como QpOffset-Rects. Su valor se establece con el parámetro de entrada PARAMETER_KEY_QP_OFFSET_RECTS de setParameters.

Para admitir esta clave, la siguiente estructura C2QpOffsetRectStruct se presenta:

struct C2QpOffsetRectStruct : C2Rect {
  int32_t qpOffset;

  DEFINE_AND_DESCRIBE_C2STRUCT(QpOffsetRect)
  C2FIELD(width, "width")
  C2FIELD(height, "height")
  C2FIELD(left, "left")
  C2FIELD(top, "top")
  C2FIELD(qpOffset, "qp-offset")
}

donde:

  • top y left: Son las coordenadas de la ROI, en forma rectangular. El ROI se estira para alinearse con los límites de la LCU. El valor representa esquina superior izquierda de cada píxel, de modo que ((0,0), (16, 16)) define un bloque completo de 16x16.

  • qpOffset: Cada valor del array representa la compensación de QP del objetivo. rect área. Su definición y uso son los mismos que los de la Valor kParamIndexQpOffsetMapBuffer.

Algoritmo de asignación

En la siguiente tabla, se muestra la asignación de las claves públicas al video en la nube:

Claves públicas o APIs Asignación en el framework de video
PARAMETER_KEY_QP_OFFSET_MAP El valor se pasa a kParamIndexQpOffsetMapBuffer como una Instancia C2InfoBuffer.
PARAMETER_KEY_QP_OFFSET_RECTS El valor se convierte de String a Struct C2QpOffsetRectStruct y se pasa a C2_PARAMKEY_QP_OFFSET_RECTS.

Manejo de errores

La implementación del OEM debe controlar los siguientes casos de error:

Caso de error Ejemplo Manipulación
Tanto la clave de proveedor como la estandarizada se usan para activar el ROI. El usuario llama a setFeatureEnabled(FEATURE_ROI) Y a del proveedor para activar el ROI. Se debe activar la ROI.
La compensación del QP está dentro del rango, pero no es compatible con los proveedores de SoC. El usuario establece el desplazamiento de QP en 12, pero el SoC solo admite un desplazamiento de QP de hasta 10. El rango de compensación de QP admitido se deja como el mejor esfuerzo. El valor es anclado al rango admitido por el SoC.
Múltiples configuraciones de RoI (ya sea una clave estandarizada o una específica del proveedor) están configuradas en un solo fotograma. El usuario usa la clave estandarizada y la clave del proveedor para el fotograma 1. Si está disponible, el framework conserva el primer rect estandarizado la primera configuración estandarizada de QP_map, o ambas. En cada categoría, el framework envía solo una configuración estandarizada al SoC y, si está disponible, la implementación del SoC debe ignorar las configuraciones del proveedor. Si se envían varias configuraciones al SoC, el proveedor del SoC debe retener solo una configuración de ROI y, luego, ignorar el resto de las configuraciones.

Las configuraciones se conservan en este orden de prioridad:

  1. rect estandarizado
  2. QP_map estandarizado
  3. Proveedor rect
  4. Proveedor QP_map