Android 15 wprowadza standardowy proces integrowanie konfiguracji użytkowników dotyczących regionu zainteresowań z filmem na Androida. platformy kodowania. Ta funkcja umożliwia lepszą jakość kompresji dla RoI dzięki oferowanie publicznych interfejsów API do integracji i analizowania konfiguracji użytkowników z filmem kodera.
Implementacja
Dostawcy SoC i OEM-y mogą kontrolować obsługę ROI w przypadku kodowania wideo za pomocą flagi FEATURE_Roi
. Jeśli opcja FEATURE_Roi
jest wyłączona, działanie kodera wideo się nie zmienia.
Zmiany w strukturze wideo
W tej sekcji opisujemy zmiany w strukturze wideo niezbędne do ich wdrożenia funkcji.
Klucze w Kodeku2
W Androidzie 15 mapa parametru kwantyzacji (QP_map
) i konfiguracja prostokątna (rect
) są zdefiniowane jako typy konfiguracji ROI. Dodatkowo w Kodekie2 (C2) wprowadzono dwa klucze,
obsługują nowe typy treści. Oba klucze są używane tak samo jak publiczne interfejsy API.
W pętli klatki kodera konfiguracja jest dostosowywana dynamicznie.
przed umieszczeniem bufora wejściowego w kolejce. Opisaliśmy to jako
następujące:
W scenariuszu przyległości, jeśli dla bieżącego kadru nie podano konfiguracji ROI, koder używa tej samej konfiguracji co w przypadku poprzedniego kadru.
W scenariuszu dynamicznym typy konfiguracji ROI mogą się zmieniać dynamicznie.
Nowe klucze w języku C2 zostały opisane w sekcjach poniżej.
kParamIndexQpOffsetMapBuffer
Klucz kParamIndexQpOffsetMapBuffer
sygnalizuje mapę qp-offset
dla danego kadru. Jego wartość jest ustawiana na podstawie danych wejściowych
parametr PARAMETER_KEY_QP_OFFSET_MAP
od setParameters
.
kParamIndexQpOffsetMapBuffer
to tablica bajtów w argumencie
C2InfoBuffer
o następujących atrybutach:
Długość: liczba bloków 16 x 16 w ramce.
Wartość: każda wartość tablicy to przesunięcie QP bloku 16 x 16 w regionie -51 do 51. Wartość QP dla docelowej największej jednostki kodowania (LCU) jest obliczana przez kontrolę szybkości kodowania plus przesunięcie. Jeśli obliczony wynik przekracza 0~51 regionu, wartość jest skracana do 0~51.
- Jeśli 0: brak przesunięcia QP, QP jest określane przez oryginalną kontrolę szybkości.
- Jeśli ma wartość różną od 0: QP to pierwotna kontrola stawki i przesunięcie.
- Jeśli wartość jest ujemna: jakość filmu jest poprawiana w docelowym LCU.
- Jeśli wartość jest dodatnia: jakość filmu pogorszy się w docelowej jednostce LCU.
Użycie: użytkownik musi skonfigurować ten klucz jako bloki 16 x 16. Koder dostosowuje konfigurację do rzeczywistego rozmiaru LCU, uśredniając wartości bloków 16 x 16 w LCU.
C2_PARAMKEY_QP_OFFSET_RECTS
Klucz C2_PARAMKEY_QP_OFFSET_RECTS
(ustawiony na coding.qp-offset-rects
) ustawia ROI jako QpOffset-Rects
. Jej wartość jest ustawiana za pomocą parametru wejściowego PARAMETER_KEY_QP_OFFSET_RECTS
z setParameters
.
Aby obsługiwać ten klucz, wprowadzamy strukturę C2QpOffsetRectStruct
:
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")
}
Gdzie:
top
ileft
: współrzędne RoI w prostokątnym kształcie. Wskaźnik RoI to rozciągnięto, by dopasować je do granic LCU. Wartość reprezentuje lewy górny róg każdego piksela, tak aby ((0,0), (16, 16)) definiowało pełny blok 16 x 16.qpOffset
: każda wartość tablicy odpowiada przesunięciem QP docelowego elementurect
. Jego definicja i zastosowanie są takie same jak Wartość:kParamIndexQpOffsetMapBuffer
.
Algorytm mapowania
W tabeli poniżej znajdziesz mapowanie kluczy publicznych na film platforma:
Klucze publiczne lub interfejsy API | Mapowanie w ramach struktury wideo |
---|---|
PARAMETER_KEY_QP_OFFSET_MAP |
Wartość jest przekazywana do kParamIndexQpOffsetMapBuffer jako
C2InfoBuffer instancję. |
PARAMETER_KEY_QP_OFFSET_RECTS |
Wartość jest konwertowana z: String na
Struct C2QpOffsetRectStruct i przekazano do
C2_PARAMKEY_QP_OFFSET_RECTS |
Obsługa błędów
Implementacja OEM musi obsługiwać te przypadki błędów:
Wielkość błędu | Przykład | Obsługa |
---|---|---|
Do włączenia ROI służy zarówno klucz dostawcy, jak i klucz standardowy. | Użytkownik wywołuje klucz setFeatureEnabled(FEATURE_ROI) I klucz dostawcy, aby włączyć ROI. |
ROI musi być włączony. |
Odchylenie QP mieści się w zakresie, ale nie jest obsługiwane przez dostawców układów SoC. | Użytkownik ustawia przesunięcie QP na 12, ale układ SoC obsługuje tylko przesunięcia QP do 10. | Obsługiwany zakres przesunięcia QP jest pozostawiany zgodnie z oczekiwaniami. Wartość jest ograniczona do obsługiwanego zakresu SoC. |
W jednym ujęciu są ustawione różne konfiguracje zwrotu z inwestycji (zarówno klucze ze standaryzowanym kluczem, jak i klucze konkretnego dostawcy). | Użytkownik używa zarówno klucza standardowego, jak i klucza dostawcy na potrzeby ramki 1. | Jeśli platforma jest dostępna, zachowuje pierwszy ustandaryzowany zasób rect
pierwszą ustandaryzowaną konfigurację QP_map ,
lub jedno i drugie. W każdej kategorii platforma przesyła tylko jeden
do SOC. Jeśli dostępna jest konfiguracja ustandaryzowana,
Implementacja SOC musi ignorować konfiguracje dostawcy. Jeśli
do układu SOC wysyła się wiele konfiguracji, jego dostawca musi zachować
tylko jedną konfigurację RoI i zignoruj pozostałe.Konfiguracje są przechowywane w kolejności priorytetów:
|