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, 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. 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 wird die Quantisierungsparameterzuordnung
(QP_map
) und die rechteckige Konfiguration (rect
) sind als ROI definiert.
Konfigurationstypen. 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 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:
In einem fixierten Szenario, wenn keine RoI-Konfiguration für die aktuelle Frame hat, verwendet der Encoder die gleiche Konfiguration wie der vorherige 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. Sein Wert wird mithilfe der Eingabe
Parameter PARAMETER_KEY_QP_OFFSET_MAP
von setParameters
.
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 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.
- Falls positiv: Die Videoqualität im 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
Die C2_PARAMKEY_QP_OFFSET_RECTS
Taste (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
undleft
: 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. Bereichrect
. Die Definition und Verwendung entsprechen denen deskParamIndexQpOffsetMapBuffer
-Wert.
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 als C2InfoBuffer -Instanz an kParamIndexQpOffsetMapBuffer übergeben. |
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:
Fehlerhafter Fall | 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. |
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-Versatzbereich wird als Best-Effort belassen. Der Wert ist beschränkt in den vom SoC unterstützten Bereich. |
Für einen einzelnen Frame werden mehrere ROI-Konfigurationen (egal, ob standardisiert oder anbieterspezifisch) festgelegt. | Der Nutzer verwendet für Frame 1 sowohl einen standardisierten Schlüssel als auch einen Anbieterschlüssel. | Falls verfügbar, behält das Framework die erste standardisierte rect bei.
die erste standardisierte QP_map -Konfiguration,
oder beides. 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
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:
|