OEM-Anleitung zur Implementierung des ROI

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 zum Einbinden und Analysieren von Nutzerkonfigurationen in den Videoencoder angeboten werden.

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 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 für beide Schlüssel erfolgt auf dieselbe Weise wie bei den öffentlichen APIs. Innerhalb der Frameschleife des Encoders wird die Konfiguration während der Ausführungsphase dynamisch angepasst, bevor der Eingabepuffer in die Warteschlange gestellt wird. Dies ist so beschrieben:

  • In einem fixierten Szenario verwendet der Encoder die gleiche 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-Map 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 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 Zielcodierung (LCU) wird durch die Encoder-Ratensteuerung 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 die QP durch die ursprüngliche Preiskontrolle festgelegt.
    • Wenn nicht null: QP ist die ursprüngliche Ratensteuerung plus Offset.
    • Wenn negativ: Die Videoqualität wird in der Ziel-LCU verbessert.
    • Falls positiv: Die Videoqualität im Ziel-LCU sinkt.
  • Verwendung: Der Nutzer muss diesen Schlüssel als 16x16-Blöcke konfigurieren. Der Encoder passt die Konfiguration an die tatsächliche Größe der LCU an. Dazu ermittelt er einen Durchschnitt der Werte der 16-x-16-Blöcke in der LCU.

C2_PARAMKEY_QP_OFFSET_RECTS

Mit dem Schlüssel C2_PARAMKEY_QP_OFFSET_RECTS (auf coding.qp-offset-rects gesetzt) wird der ROI auf QpOffset-Rects festgelegt. Sein 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 gestreckt, dass er sich an den LCU-Grenzen angleicht. Der Wert stellt die obere linke Ecke jedes Pixels dar, sodass ((0,0), (16, 16)) einen vollständigen 16-x-16-Block definiert.

  • qpOffset: Jeder Wert des Arrays steht für den QP-Offset des rect-Zielbereichs. Definition und Verwendung entsprechen denen des Werts kParamIndexQpOffsetMapBuffer.

Zuordnungsalgorithmus

Die folgende Tabelle zeigt die Zuordnung der öffentlichen Schlüssel zum Video-Framework:

Öffentliche Schlüssel oder APIs Kartografieren 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:

Fehlerhafter Fall Verwendungsbeispiele Handhabung
Zum Aktivieren von RoI werden sowohl der Anbieterschlüssel als auch der standardisierte Schlüssel verwendet. Der Nutzer ruft sowohl setFeatureEnabled(FEATURE_ROI) als auch den Anbieterschlüssel auf, um RoI zu aktivieren. RoI muss aktiviert sein.
QP-Versatz liegt innerhalb des zulässigen Bereichs, 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 maximal 10. Der unterstützte QP-Offset-Bereich wird als Best-Effort belassen. Der Wert wird auf den unterstützten Bereich des SoC begrenzt.
Mehrere RoI-Konfigurationen (ob ein standardisierter Schlüssel oder ein anbieterspezifischer Schlüssel) werden auf einen einzelnen Frame festgelegt. Der Nutzer verwendet sowohl einen standardisierten Schlüssel als auch einen 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 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 der folgenden Prioritätsreihenfolge beibehalten:

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