Android 15 wprowadza standardowy proces integrowania konfiguracji użytkownika dotyczących obszaru zainteresowań z platformą kodowania wideo na Androidzie. Ta funkcja zapewnia lepszą jakość kompresji obszarów zainteresowania, ponieważ udostępnia publiczne interfejsy API do integrowania i analizowania konfiguracji użytkownika w koderze wideo.
Implementacja
Producenci układów SoC i OEM mogą kontrolować obsługę RoI w przypadku kodowania wideo za pomocą flagi
FEATURE_Roi
. Jeśli opcja FEATURE_Roi
nie jest włączona, działanie kodera wideo nie ulegnie zmianie.
Zmiany w strukturze wideo
W tej sekcji opisujemy zmiany w strukturze filmu, które są potrzebne do wdrożenia tej funkcji.
Klucze w Codec2
W Androidzie 15 mapa parametrów kwantyzacji (QP_map
) i konfiguracja prostokątna (rect
) są zdefiniowane jako typy konfiguracji obszaru zainteresowania. Dodatkowo w Codec2 (C2) wprowadzono 2 klucze, które obsługują te nowe typy. Użycie obu kluczy jest takie samo jak w przypadku publicznych interfejsów API.
W pętli klatek kodera konfiguracja jest dynamicznie dostosowywana na etapie działania, zanim bufor wejściowy zostanie umieszczony w kolejce. Opisano to poniżej:
W przypadku przyklejania, jeśli dla bieżącej klatki nie podano konfiguracji RoI, koder używa tej samej konfiguracji co w przypadku poprzedniej klatki.
W scenariuszu dynamicznym typy konfiguracji ROI mogą się zmieniać dynamicznie.
Nowe klucze w C2 są opisane w sekcjach poniżej.
kParamIndexQpOffsetMapBuffer
Klucz kParamIndexQpOffsetMapBuffer
sygnalizuje qp-offset
mapę dla klatki. Jej wartość jest ustawiana za pomocą parametru wejściowego PARAMETER_KEY_QP_OFFSET_MAP
z setParameters
.
kParamIndexQpOffsetMapBuffer
to tablica bajtów w formacieC2InfoBuffer
o tych atrybutach:
Długość: liczba bloków 16x16 w jednej klatce.
Wartość: każda wartość tablicy to przesunięcie QP bloku 16x16 w regionie -51~51. Wartość QP docelowej największej jednostki kodującej (LCU) jest obliczana na podstawie kontroli szybkości kodera plus przesunięcie. Jeśli obliczony wynik przekracza zakres 0–51, wartość jest obcinana do zakresu 0–51.
- Jeśli 0: brak przesunięcia QP, wartość QP jest określana przez pierwotną kontrolę szybkości.
- Jeśli wartość jest różna od zera: QP to pierwotna kontrola szybkości plus przesunięcie.
- Jeśli wartość jest ujemna: jakość wideo w docelowej jednostce LCU zostanie podniesiona.
- Jeśli jest pozytywny: jakość filmu w docelowej jednostce LCU spada.
Użycie: użytkownik musi skonfigurować ten klucz jako bloki 16x16. Koder dostosowuje konfigurację do rzeczywistego rozmiaru LCU, uśredniając wartości bloków 16x16 w LCU.
C2_PARAMKEY_QP_OFFSET_RECTS
Klucz C2_PARAMKEY_QP_OFFSET_RECTS
(ustawiony na coding.qp-offset-rects
) ustawia ROI na QpOffset-Rects
. Jego wartość jest ustawiana za pomocą parametru wejściowego PARAMETER_KEY_QP_OFFSET_RECTS
z setParameters
.
Aby obsługiwać ten klucz, wprowadzamy tę 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 obszaru zainteresowania w postaci prostokąta. Obszar zainteresowania jest rozciągany, aby dopasować się do granic LCU. Wartość reprezentuje lewy górny róg każdego piksela, tak że ((0,0), (16, 16)) definiuje pełny blok 16x16.qpOffset
: każda wartość w tablicy reprezentuje przesunięcie QP obszaru docelowego.rect
Jego definicja i użycie są takie same jak w przypadku wartościkParamIndexQpOffsetMapBuffer
.
Algorytm mapowania
W tabeli poniżej znajdziesz mapowanie kluczy publicznych na platformę wideo:
klucze publiczne lub interfejsy API. | Mapowanie w ramach 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:
Przypadek błędu | Przykład | Obsługa |
---|---|---|
Do włączenia RoI używane są zarówno klucz dostawcy, jak i klucz standardowy. | Użytkownik wywołuje zarówno setFeatureEnabled(FEATURE_ROI) , JAK I klucz dostawcy, aby włączyć zwrot z inwestycji. |
Region zainteresowania musi być włączony. |
Przesunięcie QP mieści się w zakresie, ale nie jest obsługiwane przez dostawcó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 określany na podstawie dostępnych możliwości. Wartość jest ograniczona do obsługiwanego zakresu SoC. |
W jednej klatce ustawia się wiele konfiguracji obszaru zainteresowania (standardowy klucz lub klucz specyficzny dla dostawcy). | Użytkownik używa zarówno standardowego klucza, jak i klucza dostawcy w przypadku klatki 1. | Jeśli są dostępne, platforma zachowuje pierwszą standardową konfigurację rect
lub pierwszą standardową konfigurację QP_map
albo obie te konfiguracje. W każdej kategorii platforma wysyła do układu SoC tylko jedną standardową konfigurację. Jeśli jest ona dostępna, implementacja układu SoC musi ignorować konfiguracje dostawcy. Jeśli do układu SoC zostanie wysłanych wiele konfiguracji, dostawca układu SoC musi zachować tylko jedną konfigurację RoI i zignorować pozostałe.Konfiguracje są zachowywane w tej kolejności priorytetów:
|