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

Android 15 introduce un proceso estandarizado para Integración de configuraciones de usuarios de la región de interés (RoI) en el video de Android de codificación de Kubernetes. 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 OEM pueden controlar la compatibilidad con RoI para la codificación de video con el FEATURE_Roi marca. Si FEATURE_Roi no está habilitado, no se produce ningún cambio en el comportamiento del codificador de video.

Cambios en el framework de los videos

En esta sección, se detallan los cambios necesarios en el marco de trabajo de los videos para implementarlo .

Claves en Codec2

En Android 15, el mapa de parámetros de cuantización (QP_map) y la configuración rectangular (rect) se definen como ROI. tipos de configuración. Además, se introducen dos claves en el Códec2 (C2) para admiten estos nuevos tipos. 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 se ponga en cola el búfer de entrada, descrito como sigue:

  • 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 kParamIndexQpOffsetMapBuffer señalan el mapa de qp-offset de un fotograma. Su valor se establece con la entrada parámetro PARAMETER_KEY_QP_OFFSET_MAP desde setParameters.

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

  • Longitud: es la cantidad de bloques de 16 x 16 en un marco.

  • 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 programación objetivo más grande (LCU) se calcula de la siguiente manera: control de frecuencia 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: Sin compensación de QP, se decide el QP según el control de frecuencia original.
    • Si el valor no es cero, QP es el control de tarifa original más el desplazamiento.
    • Si el resultado es negativo, la calidad del video aumenta en la LCU objetivo.
    • Si es positiva, la calidad de video disminuye en la LCU objetivo.
  • Uso: El usuario debe configurar esta clave como bloques de 16x16. El codificador se ajusta la configuración al tamaño real de la LCU. Para ello, promedia los valores de la longitud de 16x16 bloques en la LCU.

C2_PARÁMETRO_PARÁMETRO_QP_DESREF_RECTS

La C2_PARAMKEY_QP_OFFSET_RECTS tecla (configurada en coding.qp-offset-rects establece el ROI en 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 del ROI, en forma rectangular. El ROI es se extienda 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 pasan a C2_PARAMKEY_QP_OFFSET_RECTS

Manejo de errores

La implementación del OEM debe manejar 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. Debes activar el 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 hasta el 10. El rango de desplazamiento del QP admitido se conserva como mejor esfuerzo. El valor es acotado 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 un del SoC y, si la configuración estandarizada está disponible, la implementación del SoC debe ignorar la configuración del proveedor. Si se envían varias configuraciones al SoC, el proveedor de SoC debe retener una sola configuración de RoI e 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