Android 15 introduit un processus standardisé pour intégrer les configurations utilisateur de la région d'intérêt (RoI) dans le framework d'encodage vidéo Android. Cette fonctionnalité améliore la qualité de compression des RoI en proposant des API publiques pour intégrer et analyser les configurations utilisateur dans l'encodeur vidéo.
Implémentation
Les fournisseurs de SoC et les OEM peuvent contrôler la prise en charge des RoI pour l'encodage vidéo à l'aide de l'
FEATURE_Roi
indicateur. Si FEATURE_Roi n'est pas activé, le comportement de l'encodeur vidéo ne change pas.
Modifications apportées au framework vidéo
Cette section décrit les modifications apportées au framework vidéo nécessaires pour implémenter cette fonctionnalité.
Clés dans Codec2
Dans Android 15, la carte des paramètres de quantification (QP_map) et la configuration rectangulaire (rect) sont définies comme des types de configuration de RoI. De plus, deux clés sont introduites dans Codec2 (C2) pour prendre en charge ces nouveaux types. L'utilisation des deux clés est la même que celle des API publiques.
Dans la boucle de trame de l'encodeur, la configuration est ajustée de manière dynamique pendant la phase d'exécution, avant la mise en file d'attente du tampon d'entrée, comme décrit ci-dessous :
Dans un scénario sticky, si aucune configuration de RoI n'est fournie pour la trame actuelle, l'encodeur utilise la même configuration que la trame précédente.
Dans un scénario dynamique, les types de configuration de RoI peuvent changer de manière dynamique.
Les nouvelles clés de C2 sont décrites dans les sections suivantes.
kParamIndexQpOffsetMapBuffer
La kParamIndexQpOffsetMapBuffer
clé signale la carte qp-offset pour une trame. Sa valeur est définie à l'aide de l'entrée
paramètre PARAMETER_KEY_QP_OFFSET_MAP
de setParameters.
kParamIndexQpOffsetMapBuffer est un tableau d'octets dans
C2InfoBuffer,
avec les attributs suivants :
Longueur : nombre de blocs 16x16 dans une trame.
Valeur : chaque valeur du tableau est le décalage QP d'un bloc 16x16, dans la région -51~51. Le QP de la plus grande unité de codage (LCU) cible est calculé par le contrôle de débit de l'encodeur plus le décalage. Si le résultat calculé dépasse la région 0~51, la valeur est tronquée à 0~51.
- Si la valeur est 0 : aucun décalage QP, le QP est déterminé par le contrôle de débit d'origine.
- Si la valeur est différente de zéro : le QP correspond au contrôle de débit d'origine plus le décalage.
- Si la valeur est négative : la qualité vidéo est améliorée dans la LCU cible.
- Si la valeur est positive : la qualité vidéo est réduite dans la LCU cible.
Utilisation : l'utilisateur doit configurer cette clé en tant que blocs 16x16. L'encodeur ajuste la configuration à la taille réelle de la LCU en calculant la moyenne des valeurs des blocs 16x16 dans la LCU.
C2_PARAMKEY_QP_OFFSET_RECTS
La C2_PARAMKEY_QP_OFFSET_RECTS
clé (définie sur coding.qp-offset-rects
définit la RoI comme QpOffset-Rects. Sa valeur est définie à l'aide du paramètre d'entrée PARAMETER_KEY_QP_OFFSET_RECTS de setParameters.
Pour prendre en charge cette clé, la structure suivante C2QpOffsetRectStruct
est introduite :
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")
}
Où :
topetleft: coordonnées de la RoI, sous une forme rectangulaire. La RoI est étirée pour s'aligner sur les limites de la LCU. La valeur représente l'angle supérieur gauche de chaque pixel, de sorte que ((0,0), (16, 16)) définit un bloc 16x16 complet.qpOffset: chaque valeur du tableau représente le décalage QP de la zonerectcible. Sa définition et son utilisation sont les mêmes que celles de la valeurkParamIndexQpOffsetMapBuffer.
Algorithme de mappage
Le tableau suivant montre le mappage des clés publiques au framework vidéo :
| Clés ou API publiques | Mappage dans le framework vidéo |
|---|---|
PARAMETER_KEY_QP_OFFSET_MAP |
La valeur est transmise à kParamIndexQpOffsetMapBuffer en tant qu'
C2InfoBuffer instance. |
PARAMETER_KEY_QP_OFFSET_RECTS |
La valeur est convertie de String en
Struct C2QpOffsetRectStruct et transmise à
C2_PARAMKEY_QP_OFFSET_RECTS. |
Gestion des exceptions
L'implémentation OEM doit gérer les cas d'erreur suivants :
| Cas d'erreur | Exemple | Manipulation |
|---|---|---|
| La clé du fournisseur et la clé standardisée sont utilisées pour activer la RoI. | L'utilisateur appelle à la fois setFeatureEnabled(FEATURE_ROI) ET la
clé du fournisseur pour activer la RoI. |
La RoI doit être activée. |
| Le décalage QP se trouve dans la plage, mais n'est pas pris en charge par les fournisseurs de SoC. | L'utilisateur définit le décalage QP sur 12, mais le SoC ne prend en charge que le décalage QP jusqu'à 10. | La plage de décalage QP compatible est laissée au mieux. La valeur est limitée à la plage compatible du SoC. |
| Plusieurs configurations de RoI (qu'il s'agisse d'une clé standardisée ou d'une clé spécifique au fournisseur) sont définies sur une seule trame. | L'utilisateur utilise à la fois la clé standardisée et la clé du fournisseur pour la trame 1. | Si elle est disponible, le framework conserve la première configuration standardisée rect
, la première configuration standardisée QP_map ou les deux. Dans chaque catégorie, le framework n'envoie qu'une seule configuration standardisée
au SoC. Si la configuration standardisée est disponible,
l'implémentation du SoC doit ignorer les configurations du fournisseur. Si
plusieurs configurations sont envoyées au SoC, le fournisseur de SoC ne doit conserver
qu'une seule configuration de RoI et ignorer le reste des configurations.Les configurations sont conservées dans cet ordre de priorité :
|