Wskazówki OEM na temat wdrażania RoI

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_MAPsetParameters.

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_RECTSsetParameters.

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 i left: 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 docelowego rect. Jego definicja i użycie są takie same jak wartości kParamIndexQpOffsetMapBuffer.

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:

  1. Standardowa rect
  2. Standard QP_map
  3. Dostawca rect
  4. Dostawca QP_map