Conseils aux OEM pour l'implémentation du ROI

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é permet d'améliorer la qualité de compression des régions d'intérêt 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 de la RoI pour l'encodage vidéo avec l'indicateur FEATURE_Roi. 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étaille les modifications à apporter au framework vidéo 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 frame 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 suit :

  • Dans un scénario sticky, si aucune configuration de 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 du ROI peuvent changer de manière dynamique.

Les nouvelles clés de C2 sont décrites dans les sections suivantes.

kParamIndexQpOffsetMapBuffer

La clé kParamIndexQpOffsetMapBuffer indique la carte qp-offset d'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 16x16, 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 à la région 0 à 51.

    • Si la valeur est définie sur 0, il n'y a pas de décalage du QP. Le QP est déterminé par le contrôle du débit d'origine.
    • Si la valeur est différente de zéro, QP correspond au contrôle du débit d'origine plus le décalage.
    • Si la valeur est négative : la qualité vidéo est améliorée dans l'unité centrale logique cible.
    • Si la réponse est positive : la qualité vidéo diminue dans l'unité de contrôle logique cible.
  • Utilisation : l'utilisateur doit configurer cette clé sous forme de blocs 16x16. L'encodeur ajuste la configuration à la taille réelle de la LCU en moyennant les valeurs des blocs 16x16 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 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ù :

  • top et left : coordonnées de la ROI, sous forme rectangulaire. Le ROI est étiré pour s'aligner sur les limites de l'unité de couverture de ligne. La valeur représente le coin supérieur gauche de chaque pixel, de sorte que ((0,0), (16, 16)) définit un bloc complet de 16 x 16.

  • qpOffset : chaque valeur du tableau représente le décalage QP de la zone rect cible. Sa définition et son utilisation sont identiques à celles de la valeur kParamIndexQpOffsetMapBuffer.

Algorithme de cartographie

Le tableau suivant montre le mappage des clés publiques au 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 utilisées pour activer le ROI. L'utilisateur appelle à la fois setFeatureEnabled(FEATURE_ROI) ET la clé du fournisseur pour activer le RoI. Le RoI doit être activé.
Le décalage QP est dans la plage, mais n'est pas accepté par les fournisseurs de SoC. L'utilisateur définit le décalage QP sur 12, mais le SoC n'accepte qu'un décalage QP allant jusqu'à 10. La plage de décalage QP acceptée est laissée à la meilleure estimation. 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 à un 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. Si elles sont disponibles, le framework conserve la première configuration rect standardisée, la première configuration QP_map standardisée 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 du SoC ne doit conserver qu'une seule configuration de RoI et ignorer les autres.

Les configurations sont conservées dans cet ordre de priorité :

  1. rect standardisé
  2. QP_map standardisé
  3. Fournisseur rect
  4. Fournisseur QP_map