В 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")
}
Где:
- topand- 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 и игнорировать остальные конфигурации.Конфигурации сохраняются в следующем порядке приоритета: 
 | 
