В 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
сигнализирует о карте 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. | РоИ должен быть включен. |
Смещение QP находится в пределах диапазона, но не поддерживается поставщиками SoC. | Пользователь устанавливает смещение QP как 12, но SoC поддерживает смещение QP только до 10. | Поддерживаемый диапазон смещения QP оставлен как лучший. Значение ограничено поддерживаемым диапазоном SoC. |
Несколько конфигураций RoI (будь то стандартизированный ключ или ключ, специфичный для поставщика) устанавливаются для одного кадра. | Пользователь использует как стандартный ключ, так и ключ поставщика для кадра 1. | Если доступно, платформа сохраняет первую стандартизированную конфигурацию rect , первую стандартизированную конфигурацию QP_map или обе. В каждой категории платформа отправляет в SoC только одну стандартизированную конфигурацию, и если стандартизированная конфигурация доступна, реализация SoC должна игнорировать конфигурации поставщика. Если в SoC отправляется несколько конфигураций, поставщик SoC должен сохранить только одну конфигурацию RoI и игнорировать остальные конфигурации.Конфигурации сохраняются в следующем порядке приоритета:
|