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