OEM-Leitfaden für die ROI-Implementierung

Mit Android 15 wird ein standardisierter Prozess für die Einbindung von Nutzerkonfigurationen für die Region of Interest (RoI) in das Android-Videocodierungs-Framework eingeführt. Diese Funktion ermöglicht eine bessere Komprimierungsqualität für ROIs, da öffentliche APIs zur Verfügung stehen, mit denen Nutzerkonfigurationen in den Video-Encoder integriert und analysiert werden können.

Implementierung

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

Änderungen am Videoframework

In diesem Abschnitt werden die Änderungen am Videoframework 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 Nutzung beider Schlüssel entspricht der Nutzung der öffentlichen APIs. Im Frame-Loop des Encoders wird die Konfiguration während der Ausführungsphase dynamisch angepasst, bevor der Eingabepuffer in die Warteschlange gestellt wird. Das wird so beschrieben:

  • In einem sticky-Szenario verwendet der Encoder dieselbe Konfiguration wie der vorherige Frame, wenn für den aktuellen Frame keine RoI-Konfiguration angegeben ist.

  • 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-Karte für einen Frame. Der 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 Codiereinheit (LCU) des Ziels 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 bestimmt.
    • 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

Mit dem Schlüssel C2_PARAMKEY_QP_OFFSET_RECTS (auf coding.qp-offset-rects festgelegt) wird der ROI auf QpOffset-Rects festgelegt. 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")
}

Dabei gilt:

  • top und left: Die Koordinaten des ROI in rechteckiger Form. Der ROI wird so gedehnt, dass er an die Grenzen der LCU angepasst wird. Der Wert stellt die obere linke 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. Die Definition und Verwendung sind dieselben wie beim Wert kParamIndexQpOffsetMapBuffer.

Zuordnungsalgorithmus

In der folgenden Tabelle sehen Sie die Zuordnung der öffentlichen Schlüssel zum Videoframework:

Öffentliche Schlüssel oder APIs Zuordnung im Videoframework
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 abfangen:

Fehlerfall Beispiel Handhabung
Sowohl der Anbieterschlüssel als auch der standardisierte Schlüssel werden verwendet, um den ROI zu aktivieren. Der Nutzer ruft sowohl setFeatureEnabled(FEATURE_ROI) als auch den Anbieterschlüssel auf, um RoI zu aktivieren. Die Funktion 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, aber der SoC unterstützt nur einen QP-Offset von bis zu 10. Der unterstützte QP-Offsetbereich wird nach dem Best-Effort-Prinzip festgelegt. Der Wert wird auf den vom SoC unterstützten Bereich begrenzt.
Mehrere ROI-Konfigurationen (entweder ein standardisierter oder ein anbieterspezifischer Schlüssel) werden auf einen einzelnen Frame festgelegt. Der Nutzer verwendet sowohl den standardisierten Schlüssel als auch den Anbieterschlüssel für Frame 1. Falls 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 den SoC. Wenn die standardisierte Konfiguration verfügbar ist, muss die SoC-Implementierung die Anbieterkonfigurationen ignorieren. Wenn mehrere Konfigurationen an den 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. Anbieter rect
  4. Anbieter QP_map