Руководство 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