Руководство OEM по реализации рентабельности инвестиций

Android 15 представляет стандартизированный процесс для интеграции пользовательских конфигураций области интереса (RoI) в фреймворк кодирования видео Android. Эта функция обеспечивает лучшее качество сжатия для RoI, предлагая публичные API для интеграции и анализа пользовательских конфигураций в видеокодер.

Выполнение

Поставщики SoC и OEM-производители могут управлять поддержкой RoI для кодирования видео с помощью флага FEATURE_Roi . Если FEATURE_Roi не включен, поведение видеокодера не изменится.

Изменения в видеофреймворке

В этом разделе подробно описаны изменения в видеофреймворке, необходимые для реализации этой функции.

Ключи в Codec2

В Android 15 карта параметров квантования ( QP_map ) и прямоугольная конфигурация ( rect ) определены как типы конфигурации RoI. Кроме того, в Codec2 (C2) введены два ключа для поддержки этих новых типов. Использование обоих ключей такое же, как и в общедоступных API. В цикле кадров кодировщика конфигурация динамически корректируется во время выполнения этапа, до того как входной буфер будет поставлен в очередь, как описано ниже:

  • В липком сценарии, если для текущего кадра не указана конфигурация RoI, кодер использует ту же конфигурацию, что и для предыдущего кадра.

  • В динамическом сценарии типы конфигурации RoI могут динамически меняться.

Новые ключи в C2 описаны в следующих разделах.

kParamIndexQpOffsetMapBuffer

Ключ kParamIndexQpOffsetMapBuffer сигнализирует карту qp-offset для кадра. Его значение устанавливается с помощью входного параметра PARAMETER_KEY_QP_OFFSET_MAP из setParameters .

kParamIndexQpOffsetMapBuffer — это байтовый массив в C2InfoBuffer со следующими атрибутами:

  • Длина: Количество блоков 16x16 в одном кадре.

  • Значение: Каждое значение массива является смещением QP блока 16x16 в области -51~51. QP целевого наибольшего блока кодирования (LCU) вычисляется с помощью управления скоростью кодера плюс смещение. Если вычисленный результат превышает область 0~51, значение усекается до 0~51.

    • Если 0: смещение QP отсутствует, QP определяется исходным управлением скоростью.
    • Если ненулевое значение: QP — это исходное управление скоростью плюс смещение.
    • Если отрицательно: качество видео повышается в целевом LCU.
    • Если результат положительный: качество видео снижается в целевом LCU.
  • Использование: Пользователь должен настроить этот ключ как блоки 16x16. Кодер подстраивает конфигурацию под реальный размер LCU, усредняя значения блоков 16x16 в LCU.

C2_PARAMKEY_QP_OFFSET_RECTS

Ключ C2_PARAMKEY_QP_OFFSET_RECTS (установленный на coding.qp-offset-rects устанавливает RoI как QpOffset-Rects . Его значение задается с помощью входного параметра PARAMETER_KEY_QP_OFFSET_RECTS из setParameters .

Для поддержки этого ключа вводится следующая структура 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")
}

Где:

  • top and left : Координаты RoI в прямоугольной форме. RoI растянуто для выравнивания с границами LCU. Значение представляет верхний левый угол каждого пикселя, так что ((0,0), (16, 16)) определяет полный блок 16x16.

  • qpOffset : Каждое значение массива представляет смещение QP целевой rect области. Его определение и использование такие же, как и у значения kParamIndexQpOffsetMapBuffer .

Алгоритм картирования

В следующей таблице показано сопоставление открытых ключей с видеофреймворком:

Открытые ключи или API Картографирование в видеофреймворке
PARAMETER_KEY_QP_OFFSET_MAP Значение передается в kParamIndexQpOffsetMapBuffer как экземпляр C2InfoBuffer .
PARAMETER_KEY_QP_OFFSET_RECTS Значение преобразуется из String в Struct C2QpOffsetRectStruct и передается в C2_PARAMKEY_QP_OFFSET_RECTS .

Обработка ошибок

Реализация OEM должна обрабатывать следующие случаи ошибок:

Случай ошибки Пример Умение обращаться
Для включения RoI используются как ключ поставщика, так и стандартизированный ключ. Пользователь вызывает как setFeatureEnabled(FEATURE_ROI) так и ключ поставщика, чтобы включить RoI. RoI должен быть включен.
Смещение QP находится в пределах диапазона, но не поддерживается поставщиками SoC. Пользователь устанавливает смещение QP равным 12, но SoC поддерживает смещение QP только до 10. Поддерживаемый диапазон смещения QP оставлен как наилучший. Значение ограничено поддерживаемым диапазоном SoC.
Несколько конфигураций RoI (будь то стандартизированный ключ или ключ конкретного поставщика) устанавливаются для одного кадра. Пользователь использует как стандартизированный ключ, так и ключ поставщика для кадра 1. Если доступно, фреймворк сохраняет первую стандартизированную конфигурацию rect , первую стандартизированную конфигурацию QP_map или обе. В каждой категории фреймворк отправляет в SoC только одну стандартизированную конфигурацию, и если стандартизированная конфигурация доступна, реализация SoC должна игнорировать конфигурации поставщика. Если в SoC отправлено несколько конфигураций, поставщик SoC должен сохранить только одну конфигурацию RoI и игнорировать остальные конфигурации.

Конфигурации сохраняются в следующем порядке приоритета:

  1. Стандартизированный rect
  2. Стандартизированная QP_map
  3. Поставщик rect
  4. Карта QP_map