OEM-Leitfaden für die ROI-Implementierung

Mit Android 15 wird ein standardisierter Prozess zur Einbindung von Nutzerkonfigurationen für den ROI (Region of Interest) in das Android-Videocodierungsframework eingeführt. Diese Funktion ermöglicht eine bessere Komprimierungsqualität für ROIs, da öffentliche APIs zur Verfügung gestellt werden, mit denen Nutzerkonfigurationen in den Videoencoder eingebunden und analysiert werden können.

Implementierung

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

Änderungen am Video-Framework

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

Schlüssel in Codec2

In Android 15 sind die Quantisierungsparameterkarte (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 der beiden Schlüssel entspricht derjenigen der ö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 geschieht so:

  • Wenn in einem fixierten Szenario keine ROI-Konfiguration für den aktuellen Frame angegeben ist, verwendet der Encoder dieselbe Konfiguration wie für den vorherigen Frame.

  • 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 Schlüssel kParamIndexQpOffsetMapBuffer signalisiert die qp-offset-Map für einen Frame. Der Wert wird mit dem Eingabeparameter PARAMETER_KEY_QP_OFFSET_MAP von setParameters festgelegt.

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

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

  • Wert: Jeder Wert des Arrays ist der QP-Offset eines 16 × 16 Pixel großen Blocks in der Region −51 bis 51. Der QP der größten Zielcodierungseinheit (LCU) wird durch die Ratensteuerung des Encoders plus den Offset berechnet. Wenn das berechnete Ergebnis den Bereich 0–51 überschreitet, wird der Wert auf 0–51 gekürzt.

    • Wenn 0: Kein QP-Offset, wird der QP durch die ursprüngliche Ratensteuerung bestimmt.
    • Wenn nicht 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 in der Ziel-LCU sinkt.
  • 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 Pixel großen Blöcke in der LCU mittelt.

C2_PARAMKEY_QP_OFFSET_RECTS

Der Schlüssel C2_PARAMKEY_QP_OFFSET_RECTS (auf coding.qp-offset-rects festgelegt) legt den ROI auf QpOffset-Rects fest. Der Wert wird mit dem Eingabeparameter PARAMETER_KEY_QP_OFFSET_RECTS von 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")
}

Dabei gilt:

  • top und left: Die Koordinaten des ROI in rechteckiger Form. Der ROI wird so gedehnt, dass er an den LCU-Grenzen ausgerichtet ist. Der Wert gibt die linke obere Ecke jedes Pixels an. So definiert ((0,0), (16, 16)) einen vollständigen Block von 16 × 16 Pixeln.

  • qpOffset: Jeder Wert des Arrays entspricht dem QP-Offset des Zielrect-Bereichs. Definition und Verwendung entsprechen denen des Werts kParamIndexQpOffsetMapBuffer.

Zuordnungsalgorithmus

In der folgenden Tabelle ist die Zuordnung der öffentlichen Schlüssel zum Video-Framework dargestellt:

Ö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 Verwendungsbeispiele 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 die ROI-Funktion zu aktivieren. RoI muss aktiviert sein.
Der QP-Offset liegt im zulässigen Bereich, wird aber von SoC-Anbietern nicht unterstützt. Der Nutzer legt den QP-Offset auf 12 fest, das SoC unterstützt jedoch nur einen QP-Offset von bis zu 10. Der unterstützte QP-Offset-Bereich wird nach dem Best-Effort-Prinzip festgelegt. Der Wert wird auf den unterstützten Bereich des SoC begrenzt.
Für einen einzelnen Frame werden mehrere ROI-Konfigurationen (egal, ob standardisierter oder anbieterspezifischer Schlüssel) festgelegt. Der Nutzer verwendet für Frame 1 sowohl einen standardisierten Schlüssel als auch einen Anbieterschlüssel. Sofern verfügbar, behält das Framework die erste standardisierte rect-Konfiguration, die erste standardisierte QP_map-Konfiguration oder beides 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 den Rest der Konfigurationen ignorieren.

Die Konfigurationen werden in dieser Prioritätsreihenfolge beibehalten:

  1. Standardisierte rect
  2. Standardisierte QP_map
  3. Anbieter rect
  4. Anbieter QP_map