Android 15 introduit un processus standardisé pour intégrer les configurations utilisateur des régions d'intérêt (RoI) dans le framework d'encodage vidéo Android. Cette fonctionnalité offre une meilleure qualité de compression pour les ROI en proposant des API publiques permettant d'intégrer et d'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 du RoI de l'encodage vidéo à l'aide de l'option FEATURE_Roi
. Si l'option FEATURE_Roi
n'est pas activée, le comportement de l'encodeur vidéo reste inchangé.
Modifications apportées au framework vidéo
Cette section détaille les modifications du framework vidéo nécessaires pour implémenter cette fonctionnalité.
Clés dans Codec2
Dans Android 15, la carte de paramètres de quantification (QP_map
) et la configuration rectangulaire (rect
) sont définies comme 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 identique à celle des API publiques.
Dans la boucle de frame de l'encodeur, la configuration est ajustée de manière dynamique pendant l'étape d'exécution, avant que la mémoire tampon d'entrée ne soit mise en file d'attente, comme suit :
Dans un scénario persistant, si aucune configuration RoI n'est fournie pour le frame actuel, l'encodeur utilise la même configuration que le frame précédent.
Dans un scénario dynamique, les types de configuration RoI peuvent changer de manière dynamique.
Les nouvelles clés en C2 sont décrites dans les sections suivantes.
kParamIndexQpOffsetMapBuffer
La touche kParamIndexQpOffsetMapBuffer
signale la carte qp-offset
pour un frame. Sa valeur est définie à l'aide du paramètre d'entrée 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 un frame.
Valeur: chaque valeur du tableau correspond au décalage QP d'un bloc 16 x 16, dans la région -51~51. Le QP de la plus grande unité de codage (LCU) cible est calculé par le contrôle du 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 et 51.
- Si la valeur est 0: aucun décalage QP, c'est le contrôle de taux d'origine qui détermine le QP.
- Si la valeur est non nulle, QP correspond au contrôle de débit d'origine plus le décalage.
- Si elle est négative, la qualité de la vidéo est améliorée dans la LCU cible.
- Si elle est positive: la qualité de la vidéo diminue dans la LCU cible.
Utilisation : l'utilisateur doit configurer cette clé en blocs de 16 x 16. L'encodeur ajuste la configuration à la taille réelle de la LCU en faisant la moyenne des valeurs des blocs 16 x 16 de la LCU.
C2_PARAMKEY_QP_OFFSET_RECTS
La clé C2_PARAMKEY_QP_OFFSET_RECTS
(définie sur coding.qp-offset-rects
) définit le ROI sur 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 C2QpOffsetRectStruct
suivante 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ù :
top
etleft
: coordonnées de RoI, dans une forme rectangulaire. Le RoI est étendu 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 16 x 16 complet.qpOffset
: chaque valeur du tableau représente le décalage QP de la zonerect
cible. Sa définition et son utilisation sont identiques à celles de la valeurkParamIndexQpOffsetMapBuffer
.
Algorithme de mappage
Le tableau suivant montre le mappage des clés publiques vers le framework vidéo :
Clés publiques ou API | Mappage dans le framework vidéo |
---|---|
PARAMETER_KEY_QP_OFFSET_MAP |
La valeur est transmise à kParamIndexQpOffsetMapBuffer en tant qu'instance C2InfoBuffer . |
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 toutes deux utilisées pour activer le ROI. | L'utilisateur appelle à la fois setFeatureEnabled(FEATURE_ROI) ET la clé de fournisseur pour activer le RoI. |
Le ROI doit être activé. |
Le décalage QP est compris 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 n'accepte que des décalages QP allant jusqu'à 10. | La plage de décalage QP compatible est définie dans l'optique d'obtenir le meilleur résultat possible. La valeur est limitée à la plage acceptée par le 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 un seul frame. | L'utilisateur utilise à la fois la clé standardisée et la clé du fournisseur pour le frame 1. | Le framework conserve la première configuration rect standardisée, la première configuration QP_map standardisée ou les deux, le cas échéant. 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 du SoC ne doit conserver qu'une seule configuration RoI et ignorer les autres configurations.Les configurations sont conservées dans cet ordre de priorité:
|