OEM-Anleitung zur Implementierung des ROI

Mit Android 15 wird ein standardisierter Prozess Integration von RoI-Konfigurationen (Region of Interest) in das Android-Video Codierungs-Framework an. Diese Funktion ermöglicht eine bessere Komprimierungsqualität für RoIs, indem Es werden öffentliche APIs angeboten, um Nutzerkonfigurationen in das Video zu integrieren und zu analysieren. Encoder.

Implementierung

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

Änderungen am Video-Framework

In diesem Abschnitt werden die Änderungen am Video-Framework beschrieben, die für die Implementierung 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, die diese neuen Typen unterstützen. Die Verwendung der beiden Schlüssel entspricht derjenigen der öffentlichen APIs. Innerhalb der Frameschleife des Encoders wird die Konfiguration dynamisch angepasst. während der Ausführungsphase, bevor der Eingabepuffer in die Warteschlange gestellt wird. Dies wird wie folgt beschrieben: folgt:

  • 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

Die kParamIndexQpOffsetMapBuffer signalisiert die qp-offset-Zuordnung 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 Blocks von 16 x 16 in der Region. -51~51. Der QP der größten Codiereinheit (LCU) wird vom Steuerung der Encoder-Rate und des Offsets. 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 16x16-Blöcke konfigurieren. Der Encoder passt die der Konfiguration auf die tatsächliche Größe der LCU, indem Sie den Durchschnitt der Werte von 16 x 16 Blöcke in der LCU.

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 hat die Struktur C2QpOffsetRectStruct die folgende Struktur: wird 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 steht für die der oberen linken Ecke jedes Pixels, sodass ((0,0), (16, 16)) definiert einen vollständigen Block von 16 x 16.

  • qpOffset: Jeder Wert des Arrays steht für den QP-Versatz des Ziels. Bereich rect. 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 Zuordnung im Video-Framework
PARAMETER_KEY_QP_OFFSET_MAP Der Wert wird an kParamIndexQpOffsetMapBuffer übergeben als C2InfoBuffer-Instanz.
PARAMETER_KEY_QP_OFFSET_RECTS Der Wert wird von String konvertiert in Struct C2QpOffsetRectStruct und übergeben an C2_PARAMKEY_QP_OFFSET_RECTS

Fehlerbehandlung

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

Fehlerfall Beispiel Handhabung
Zum Aktivieren von RoI werden sowohl der Anbieterschlüssel als auch der standardisierte Schlüssel verwendet. Der Nutzer ruft sowohl setFeatureEnabled(FEATURE_ROI) auf als auch die um den ROI zu aktivieren. RoI muss aktiviert sein.
QP-Versatz liegt innerhalb des zulässigen Bereichs, wird jedoch von SoC-Anbietern nicht unterstützt. Der Nutzer legt den QP-Versatz auf 12 fest, das SoC unterstützt jedoch nur einen QP-Versatz von bis zu 10. Der unterstützte QP-Offset-Bereich wird auf Best-Effort-Basis beibehalten. Der Wert wird auf den unterstützten Bereich des SoC begrenzt.
Mehrere RoI-Konfigurationen (ob standardisierter Schlüssel oder ein anbieterspezifischen Schlüssel) auf einen einzelnen Frame gesetzt. 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 an das SoC. Wenn die standardisierte Konfiguration verfügbar ist, muss die SoC-Implementierung die Anbieterkonfigurationen ignorieren. Wenn wenn mehrere Konfigurationen an das SoC gesendet werden, muss der SoC-Anbieter nur eine RoI-Konfiguration und ignoriert die restlichen Konfigurationen.

Die Konfigurationen werden in dieser Prioritätsreihenfolge beibehalten:

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