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
yleft
: 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 ValorkParamIndexQpOffsetMapBuffer
.
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:
|