В Android 15 представлен стандартизированный процесс интеграции пользовательских конфигураций области интереса (RoI) в структуру кодирования видео Android. Эта функция позволяет повысить качество сжатия областей интереса, предлагая общедоступные API для интеграции и анализа конфигураций пользователей в видеокодер.
Реализация
Поставщики SoC и OEM-производители могут управлять поддержкой RoI для кодирования видео с помощью флага FEATURE_Roi. Если FEATURE_Roi не включен, поведение видеокодера не меняется.
Изменения в видеофреймворке
В этом разделе описаны изменения, которые необходимо внести в видеофреймворк, чтобы реализовать эту функцию.
Ключи в Codec2
В Android 15 карта параметров квантования (QP_map) и прямоугольная конфигурация (rect) определяются как типы конфигурации RoI. Кроме того, в Codec2 (C2) добавлены два ключа для поддержки этих новых типов. Использование обоих ключей аналогично использованию общедоступных API.
В цикле кадров кодировщика конфигурация динамически корректируется на этапе выполнения до того, как входной буфер будет поставлен в очередь, как описано ниже:
В фиксированном режиме, если для текущего кадра не задана конфигурация области интереса, кодировщик использует ту же конфигурацию, что и для предыдущего кадра.
В динамическом сценарии типы конфигурации RoI могут меняться динамически.
Новые ключи в C2 описаны в следующих разделах.
kParamIndexQpOffsetMapBuffer
Ключ kParamIndexQpOffsetMapBuffer указывает на карту qp-offset для кадра. Его значение задается с помощью входного параметра PARAMETER_KEY_QP_OFFSET_MAP из setParameters.
kParamIndexQpOffsetMapBuffer – массив байтов в формате C2InfoBuffer со следующими атрибутами:
Длина – количество блоков 16 x 16 в одном кадре.
Значение: каждое значение массива – это смещение QP блока 16 x 16 в регионе -51~51. Параметр квантования целевой наибольшей единицы кодирования (LCU) рассчитывается на основе управления скоростью кодировщика и смещения. Если результат выходит за пределы диапазона 0–51, он усекается до 0–51.
- Если значение равно 0, смещение QP не применяется, а значение QP определяется исходным алгоритмом управления битрейтом.
- Если значение не равно нулю, QP – это исходное управление скоростью передачи данных плюс смещение.
- Если отрицательное, качество видео в целевой LCU повышается.
- Если значение положительное, качество видео в целевом LCU снижается.
Использование. Пользователь должен настроить этот ключ как блоки 16 x 16. Кодер корректирует конфигурацию в соответствии с реальным размером LCU, усредняя значения блоков 16 x 16 в LCU.
C2_PARAMKEY_QP_OFFSET_RECTS
Ключ C2_PARAMKEY_QP_OFFSET_RECTS (заданное значение: coding.qp-offset-rects
устанавливает область интереса как 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– координаты прямоугольной области интереса. Область интереса растягивается, чтобы соответствовать границам 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 находится в допустимом диапазоне, но не поддерживается поставщиками однокристальных систем. | Пользователь задает смещение QP равным 12, но SoC поддерживает смещение QP только до 10. | Поддерживаемый диапазон смещения QP не гарантируется. Значение ограничивается поддерживаемым диапазоном SoC. |
| В одном кадре задано несколько конфигураций ROI (стандартизированный ключ или ключ определенного поставщика). | Пользователь использует и стандартизированный ключ, и ключ поставщика для кадра 1. | Если доступна, платформа сохраняет первую стандартизированную конфигурацию rect, первую стандартизированную конфигурацию QP_map или обе. В каждой категории фреймворк отправляет в SoC только одну стандартизированную конфигурацию. Если она доступна, SoC должен игнорировать конфигурации поставщиков. Если на SoC отправлено несколько конфигураций, поставщик SoC должен сохранить только одну конфигурацию RoI и игнорировать остальные.Конфигурации сохраняются в следующем порядке приоритета:
|