OEM-Leitfaden für die ROI-Implementierung

Mit Android 15 wird ein standardisierter Prozess für die Einbindung von Nutzerkonfigurationen für Region of Interest (RoI) in das Android-Video-Codierungsframework eingeführt. Diese Funktion ermöglicht eine bessere Komprimierungsqualität für RoIs, indem öffentliche APIs zur Einbindung und Analyse von Nutzerkonfigurationen in den Video-Encoder bereitgestellt werden.

Implementierung

SoC-Anbieter und OEMs können die RoI-Unterstützung für die Videocodierung mit dem FEATURE_Roi Flag steuern. Wenn FEATURE_Roi nicht aktiviert ist, ändert sich das Verhalten des Video-Encoders nicht.

Änderungen im Video-Framework

In diesem Abschnitt werden die Änderungen im Video-Framework beschrieben, die für die Implementierung dieser Funktion erforderlich sind.

Schlüssel in Codec2

In Android 15 werden die Quantisierungsparameterzuordnung (QP_map) und die rechteckige Konfiguration (rect) als RoI-Konfigurationstypen definiert. Außerdem werden in Codec2 (C2) zwei Schlüssel eingeführt, um diese neuen Typen zu unterstützen. Die Verwendung beider Schlüssel ist dieselbe wie bei den öffentlichen APIs. Innerhalb der Frame-Schleife des Encoders wird die Konfiguration während der Ausführungsphase dynamisch angepasst, bevor der Eingabepuffer in die Warteschlange gestellt wird. Das funktioniert so:

  • In einem Sticky-Szenario verwendet der Encoder dieselbe Konfiguration wie für den vorherigen Frame, wenn keine RoI-Konfiguration für den aktuellen Frame bereitgestellt wird.

  • In einem dynamischen Szenario können sich die RoI-Konfigurationstypen dynamisch ändern.

Die neuen Schlüssel in C2 werden in den folgenden Abschnitten beschrieben.

kParamIndexQpOffsetMapBuffer

Der kParamIndexQpOffsetMapBuffer Schlüssel signalisiert die qp-offset Zuordnung für einen Frame. Sein Wert wird mit dem Eingabeparameter PARAMETER_KEY_QP_OFFSET_MAP aus setParameters festgelegt.

kParamIndexQpOffsetMapBuffer ist ein Byte-Array in C2InfoBuffer, mit den folgenden Attributen:

  • Länge: Die Anzahl der 16 × 16-Blöcke in einem Frame.

  • Wert: Jeder Wert des Arrays ist der QP-Offset eines 16 × 16-Blocks im Bereich von -51 bis 51. Der QP der größten Zielcodierungseinheit (Largest Coding Unit, LCU) wird durch die Ratensteuerung des Encoders plus den Offset berechnet. Wenn das berechnete Ergebnis den Bereich von 0 bis 51 überschreitet, wird der Wert auf 0 bis 51 gekürzt.

    • Wenn 0: Kein QP-Offset, der QP wird durch die ursprüngliche Ratensteuerung festgelegt.
    • Wenn ungleich null: QP ist die ursprüngliche Ratensteuerung plus Offset.
    • Wenn negativ: Die Videoqualität wird in der Ziel-LCU verbessert.
    • Wenn positiv: Die Videoqualität nimmt in der Ziel-LCU ab.
  • Verwendung: Der Nutzer muss diesen Schlüssel als 16 × 16-Blöcke konfigurieren. Der Encoder passt die Konfiguration an die tatsächliche LCU-Größe an, indem er die Werte der 16 × 16-Blöcke in der LCU mittelt.

C2_PARAMKEY_QP_OFFSET_RECTS

Der C2_PARAMKEY_QP_OFFSET_RECTS Schlüssel (auf coding.qp-offset-rects gesetzt) legt den RoI als QpOffset-Rects fest. Sein Wert wird mit dem Eingabeparameter PARAMETER_KEY_QP_OFFSET_RECTS aus setParameters festgelegt.

Zur Unterstützung dieses Schlüssels wird die folgende Struktur C2QpOffsetRectStruct eingeführt:

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")
}

Wobei:

  • top und left: Die Koordinaten des RoI in rechteckiger Form. Der RoI wird so gestreckt, dass er an den LCU-Grenzen ausgerichtet ist. Der Wert stellt die linke obere Ecke jedes Pixels dar, sodass ((0,0), (16, 16)) einen vollständigen 16 × 16-Block definiert.

  • qpOffset: Jeder Wert des Arrays stellt den QP-Offset des Zielbereichs rect dar. Seine Definition und Verwendung sind dieselben wie beim Wert kParamIndexQpOffsetMapBuffer.

Zuordnungsalgorithmus

Die folgende Tabelle zeigt die Zuordnung von den öffentlichen Schlüsseln zum Video-Framework:

Öffentliche Schlüssel oder APIs Zuordnung im Video-Framework
PARAMETER_KEY_QP_OFFSET_MAP Der Wert wird als C2InfoBuffer Instanz an kParamIndexQpOffsetMapBuffer übergeben.
PARAMETER_KEY_QP_OFFSET_RECTS Der Wert wird von String in Struct C2QpOffsetRectStruct konvertiert und an C2_PARAMKEY_QP_OFFSET_RECTS übergeben.

Fehlerbehandlung

Die OEM-Implementierung muss die folgenden Fehlerfälle verarbeiten:

Fehlerfall Beispiel Handhabung
Sowohl der Anbieterschlüssel als auch der standardisierte Schlüssel werden verwendet, um RoI zu aktivieren. Der Nutzer ruft sowohl setFeatureEnabled(FEATURE_ROI) als auch den Anbieterschlüssel auf, um RoI zu aktivieren. RoI muss aktiviert sein.
Der QP-Offset liegt im Bereich, wird aber von SoC-Anbietern nicht unterstützt. Der Nutzer legt den QP-Offset auf 12 fest, aber das SoC unterstützt nur einen QP-Offset von bis zu 10. Der unterstützte QP-Offset-Bereich wird nach dem Best-Effort-Prinzip festgelegt. Der Wert wird begrenzt auf den vom SoC unterstützten Bereich.
Für einen einzelnen Frame werden mehrere RoI-Konfigurationen festgelegt (unabhängig davon, ob ein standardisierter oder ein anbieterspezifischer Schlüssel verwendet wird). Der Nutzer verwendet sowohl den standardisierten als auch den Anbieterschlüssel für Frame 1. Wenn verfügbar, behält das Framework die erste standardisierte rect Konfiguration, die erste standardisierte QP_map Konfiguration, oder beide bei. In jeder Kategorie sendet das Framework nur eine standardisierte Konfiguration an das SoC. Wenn die standardisierte Konfiguration verfügbar ist, muss die SoC-Implementierung die Anbieterkonfigurationen ignorieren. Wenn mehrere Konfigurationen an das SoC gesendet werden, muss der SoC-Anbieter nur eine RoI-Konfiguration beibehalten und die restlichen Konfigurationen ignorieren.

Die Konfigurationen werden in dieser Prioritätsreihenfolge beibehalten:

  1. Standardisierte rect
  2. Standardisierte QP_map
  3. rect des Anbieters
  4. QP_map des Anbieters