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:
topundleft: 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 Zielbereichsrectdar. Seine Definition und Verwendung sind dieselben wie beim WertkParamIndexQpOffsetMapBuffer.
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:
|