Android 15 introduce un proceso estandarizado para integrar la configuración del usuario de la región de interés (RoI) en el framework de codificación de video de Android. Esta función permite una mejor calidad de compresión para el ROI, ya que ofrece APIs públicas para integrar y analizar la configuración del usuario en el codificador de video.
Implementación
Los OEM y los proveedores de SoC pueden controlar la compatibilidad con el ROI para la codificación de video con la marca FEATURE_Roi
. Si FEATURE_Roi
no está habilitado, no habrá cambios 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 introducen dos claves en Codec2 (C2) para admitir 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, como se describe a continuación:
En una situación persistente, si no se proporciona una configuración del RoI para el fotograma actual, el codificador usa la misma configuración que el fotograma anterior.
En una situación dinámica, los tipos de configuración del ROI pueden cambiar de forma dinámica.
Las nuevas claves en C2 se describen en las siguientes secciones.
kParamIndexQpOffsetMapBuffer
La clave kParamIndexQpOffsetMapBuffer
indica el mapa de qp-offset
para un fotograma. 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 x 16 en un cuadro.
Valor: Cada valor del array es el desplazamiento del QP de un bloque de 16 x 16, en la región de -51 a 51. El QP de la unidad de codificación (LCU) más grande de destino se calcula con el control de velocidad del codificador más el desplazamiento. Si el resultado calculado supera la región de 0 a 51, el valor se trunca a 0 a 51.
- Si es 0, no hay desfase de QP y la QP se decide según el control de velocidad original.
- Si es distinto de cero, QP es el control de velocidad original más el desplazamiento.
- Si es negativa, se mejora la calidad del video en la LCU de destino.
- Si es positivo, la calidad del video disminuye en la LCU objetivo.
Uso: El usuario debe configurar esta clave como bloques de 16 x 16. El codificador ajusta la configuración al tamaño real de la LCU promediando los valores de los bloques de 16 x 16 en la LCU.
C2_PARAMKEY_QP_OFFSET_RECTS
La clave C2_PARAMKEY_QP_OFFSET_RECTS
(establecida 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, se introduce la siguiente estructura C2QpOffsetRectStruct
:
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")
}
En la que:
top
yleft
: Son las coordenadas del RoI, en forma rectangular. El ROI se extiende para alinearse con los límites de la LCU. El valor representa la esquina superior izquierda de cada píxel, de modo que ((0,0), (16, 16)) define un bloque completo de 16 x 16.qpOffset
: Cada valor del array representa el desplazamiento del QP del área derect
objetivo. Su definición y uso son los mismos que los del valorkParamIndexQpOffsetMapBuffer
.
Algoritmo de asignación
En la siguiente tabla, se muestra la asignación de las claves públicas al framework de video:
Claves o APIs públicas | Asignación en el framework de video |
---|---|
PARAMETER_KEY_QP_OFFSET_MAP |
El valor se pasa a kParamIndexQpOffsetMapBuffer como una instancia de 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 del proveedor como la clave estandarizada se usan para activar el ROI. | El usuario llama a setFeatureEnabled(FEATURE_ROI) Y a la clave del proveedor para activar el ROI. |
El ROI debe estar activado. |
El desplazamiento de QP está dentro del rango, pero los proveedores de SoC no lo admiten. | El usuario establece el desplazamiento de QP en 12, pero el SoC solo admite un desplazamiento de QP de hasta 10. | El rango de desplazamiento de QP admitido se deja como mejor esfuerzo. El valor se ajusta al rango admitido del SoC. |
Se establecen varias configuraciones del ROI (ya sea una clave estandarizada o una clave específica del proveedor) en un solo fotograma. | El usuario usa la clave estandarizada y la clave del proveedor para el fotograma 1. | Si están disponibles, el framework conserva la primera configuración estandarizada de rect , 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 la configuración estandarizada 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 conservar solo una configuración del RoI y descartar el resto.Los parámetros de configuración se conservan en este orden de prioridad:
|