Android 15 wprowadza ustandaryzowany proces integrowania konfiguracji użytkowników dotyczących obszaru zainteresowania (RoI) z ramami kodowania wideo w Androidzie. Ta funkcja umożliwia uzyskanie lepszej jakości kompresji w przypadku RoI, oferując publiczne interfejsy API do integrowania i analizowania konfiguracji użytkownika w kodeki.
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 ramach frameworku wideo
W tej sekcji opisano zmiany w ramach filmów, które są potrzebne do wdrożenia tej funkcji.
Klucze w Kodeku2
W Androidzie 15 mapa parametrów kwantyzacji
(QP_map
) i konfiguracja prostokątna (rect
) są zdefiniowane jako ROAS
typów konfiguracji. Dodatkowo w Codec2 (C2) wprowadzono 2 klucze, aby obsługiwać te nowe typy. Oba klucze są używane tak samo jak publiczne interfejsy API.
W pętli ramki kodera konfiguracja jest dostosowywana dynamicznie w trakcie działania, przed umieszczeniem bufora wejściowego w kolejce, w następujący sposób:
w przypadku przyklejonego scenariusza, jeśli w bieżącym okresie nie ma konfiguracji ROAS , koder używa tej samej konfiguracji co poprzednia.
W dynamicznym scenariuszu typy konfiguracji ROI mogą się zmieniać dynamicznie.
Nowe klucze w C2 są opisane w następnych sekcjach.
kParamIndexQpOffsetMapBuffer,
kParamIndexQpOffsetMapBuffer
kluczowe sygnały na mapie qp-offset
dla ramki. Jej wartość jest ustawiana za pomocą parametru wejściowego PARAMETER_KEY_QP_OFFSET_MAP
z 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. Jakość QP docelowej największej jednostki kodującej (LCU) jest obliczana przez ustawienie szybkości enkodera plus przesunięcie. Jeśli obliczony wynik przekracza zakres 0–51, wartość jest przycinana do zakresu 0–51.
- Jeśli 0: brak przesunięcia QP, QP jest określane przez oryginalną kontrolę szybkości.
- Jeśli wartość jest różna od 0: QP to pierwotny kontroler szybkości plus przesunięcie.
- Jeśli wartość ujemna: jakość filmu zostanie poprawiona w docelowej jednostce LCU.
- Jeśli wynik jest pozytywny: jakość filmu w docelowym LCU spada.
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
C2_PARAMKEY_QP_OFFSET_RECTS
klawisz (ustawiony na coding.qp-offset-rects
)
ustawia RoI na QpOffset-Rects
. Jego wartość jest ustalana 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. ROI jest rozciągany, aby dopasować go do granic LCU. Wartość reprezentuje w lewym górnym rogu każdego piksela, tak by ((0,0), (16; 16)) zdefiniować 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 ramy wideo:
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 przekazywana 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łączania RoI służą zarówno klucz dostawcy, jak i standardowy klucz. | Użytkownik wywołuje zarówno setFeatureEnabled(FEATURE_ROI) , ORAZ
klucza 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 określany na podstawie dostępnych możliwości. Wartość jest ograniczona do obsługiwanego zakresu SoC. |
wiele konfiguracji RoI (np. ustandaryzowany klucz lub klucza dostawcy) są ustawione na pojedynczą klatkę. | Użytkownik używa zarówno klucza standardowego, jak i klucza dostawcy w klatce 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ą zachowywane w takiej kolejności:
|