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

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

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 i left: 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 elementu rect. 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:

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