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 nie włączysz FEATURE_Roi
, działanie kodera nie ulegnie zmianie.
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 Codec2
W Androidzie 15 mapa parametru kwantyzacji (QP_map
) i konfiguracja prostokątna (rect
) są zdefiniowane jako typy konfiguracji ROI. 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 sytuacji przyklejonej, jeśli dla bieżącej klatki nie zostanie skonfigurowana żadna konfiguracja RoI, koder użyje takiej samej konfiguracji jak poprzednia.
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
wskazuje mapę qp-offset
klatki. Jej wartość jest ustawiana za pomocą parametru wejściowego PARAMETER_KEY_QP_OFFSET_MAP
z setParameters
.
kParamIndexQpOffsetMapBuffer
to tablica bajtów w C2InfoBuffer
z tymi atrybutami:
Długość: liczba 16 x 16 bloków w jednej klatce.
Wartość: każda wartość tablicy to przesunięcie QP bloku 16 x 16 w regionie -51~51. Jakość QP docelowej największej jednostki kodującej (LCU) jest obliczana przez ustawienie szybkości kodera i przesunięcie. Jeśli obliczony wynik przekracza 0~51 regionów, wartość jest skracana do 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ść jest ujemna: jakość filmu jest poprawiana w docelowym 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. Enkoder 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 jest rozciągnięty tak, aby dopasować się 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 reprezentuje przesunięcie QP obszaru docelowegorect
. Jego definicja i użycie są takie same jak wartościkParamIndexQpOffsetMapBuffer
.
Algorytm mapowania
W tabeli poniżej znajdziesz mapowanie kluczy publicznych do frameworku wideo:
Klucze publiczne lub interfejsy API | Mapowanie w ramach struktury wideo |
---|---|
PARAMETER_KEY_QP_OFFSET_MAP |
Wartość jest przekazywana do kParamIndexQpOffsetMapBuffer jako instancja C2InfoBuffer . |
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łą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 SoC obsługuje przesunięcie QP tylko do 10. | Obsługiwany zakres przesunięcia QP jest pozostawiany zgodnie z oczekiwaniami. Wartość jest ograniczona do obsługiwanego zakresu SoC. |
Wiele konfiguracji RoI (zarówno standardowego, jak i konkretnego dostawcy) jest ustawionych na jedną ramkę. | Użytkownik używa zarówno klucza standardowego, jak i klucza dostawcy na potrzeby ramki 1. | Jeśli platforma jest dostępna, zachowuje pierwszą ustandaryzowaną konfigurację rect , pierwszą ustandaryzowaną konfigurację QP_map lub obie. W każdej kategorii platforma wysyła do SoC tylko 1 ustandaryzowaną konfigurację, a jeśli taka konfiguracja jest dostępna, implementacja SOC musi ignorować konfiguracje dostawcy. Jeśli do układu SOC wysyła się wiele konfiguracji, dostawca SOC musi zachować tylko 1 konfigurację RoI i zignorować pozostałe.Konfiguracje są przechowywane w kolejności priorytetów:
|