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

В Android 15 представлен стандартизированный процесс интеграции пользовательских настроек областей интереса (RoI) в структуру кодирования видео Android. Эта функция обеспечивает лучшее качество сжатия для областей интереса, предоставляя общедоступные 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 и left : координаты области интереса (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. Vendor QP_map