Wskazówki dla OEM dotyczące implementacji 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 opcja FEATURE_Roi jest wyłączona, działanie kodera wideo się nie zmienia.

Zmiany w ramach frameworku wideo

W tej sekcji znajdziesz szczegółowe informacje o zmianach w ramach wideo, które są potrzebne do wdrożenia tej funkcji.

Klucze w Codec2

W Androidzie 15 mapa parametru kwantowania (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 przypadku przyległości, jeśli dla bieżącego kadru nie podano konfiguracji ROI, koder używa tej samej konfiguracji co w przypadku poprzedniego kadru.

  • sytuacji dynamicznej typy konfiguracji ROI mogą się zmieniać dynamicznie.

Nowe klucze w C2 są opisane w następnych sekcjach.

kParamIndexQpOffsetMapBuffer

Klawisz kParamIndexQpOffsetMapBuffer sygnalizuje mapę qp-offset dla danej klatki. Jej wartość jest ustawiana za pomocą parametru wejściowego PARAMETER_KEY_QP_OFFSET_MAPsetParameters.

kParamIndexQpOffsetMapBuffer to tablica bajtów w C2InfoBuffer, która ma te atrybuty:

  • 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 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 pierwotna kontrola szybkości plus przesunięcie.
    • Jeśli wartość jest ujemna: jakość wideo 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. 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_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:

  • topleft: współrzędne obszaru roboczego w postaci prostokąta. ROI jest rozciągany, aby dopasować go 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. Definicja i zastosowanie tej wartości są takie same jak w przypadku wartości kParamIndexQpOffsetMapBuffer.

Algorytm mapowania

W tabeli poniżej znajdziesz mapowanie kluczy publicznych do frameworku wideo:

Klucze publiczne lub interfejsy API Mapowanie w ramach frameworku 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 służy zarówno klucz dostawcy, jak i klucz standardowy. Użytkownik wywołuje zarówno klucz setFeatureEnabled(FEATURE_ROI), jak 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 określany na podstawie dostępnych możliwości. Wartość jest ograniczona do obsługiwanego zakresu SoC.
W jednym ujęciu występuje wiele konfiguracji zwrotu z inwestycji (zarówno kluczy standardowych, jak i kluczy dostawców). Użytkownik używa zarówno klucza standardowego, jak i klucza dostawcy w klatce 1. Jeśli jest dostępna, rama danych zachowuje pierwszą standardową konfigurację rect, pierwszą standardową konfigurację QP_map lub obie te konfiguracje. W przypadku każdej kategorii framework wysyła do SoC tylko jedną standaryzowaną konfigurację. Jeśli dana konfiguracja jest dostępna, implementacja SoC musi zignorować konfiguracje dostawców. Jeśli do SoC wysłano wiele konfiguracji, dostawca SoC musi zachować tylko jedną konfigurację ROI i zignorować pozostałe konfiguracje.

Konfiguracje są przechowywane w tej kolejności:

  1. Unormowana rect
  2. Unormowana QP_map
  3. Dostawca rect
  4. Dostawca QP_map