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