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 permite una mejor calidad de compresión para el RoI, ya que ofrece APIs públicas para integrar y analizar las configuraciones del usuario en el codificador de video.
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 FEATURE_Roi
no está habilitado, 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 necesarios en el framework de videos para implementar esta función.
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 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 tramas 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 fotograma actual, 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 de forma dinámica.
Las nuevas claves de 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 la compensación de QP de un bloque de 16 × 16, en la región de -51 a 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 la región de 0 a 51, el valor se trunca a 0 a 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 16 × 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_PARÁMETRO_PARÁMETRO_QP_DESREF_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, se presenta 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")
}
donde:
top
yleft
: Son las coordenadas de la 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 × 16.qpOffset
: Cada valor del array representa el desplazamiento de QP del árearect
de destino. 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 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 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 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 la clave 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 de hasta 10. | El rango de compensación de QP admitido se deja como el mejor esfuerzo. El valor se acopla al rango admitido por el SoC. |
Se establecen múltiples configuraciones de RoI (ya sea una clave estandarizada o una clave específica del proveedor) en un solo marco. | El usuario usa la clave estandarizada y la clave del proveedor para el fotograma 1. | Si está disponible, 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 retener solo una configuración de ROI y, luego, ignorar el resto de las configuraciones.Las configuraciones se conservan en este orden de prioridad:
|