Тональное отображение яркости HDR в диапазон, совместимый с SDR

В Android 13 представлена ​​настраиваемая производителем статическая библиотека libtonemap , которая определяет операции тонального отображения и используется совместно с процессом SurfaceFlinger и реализациями Hardware Composer (HWC). Эта функция позволяет производителям оборудования определять и совместно использовать свои алгоритмы тонального отображения дисплея между фреймворком и поставщиками, уменьшая несоответствие в тональном отображении.

До Android 13 операции тонального отображения, специфичные для каждого дисплея, не использовались совместно HWC, SurfaceFlinger и приложениями. В зависимости от пути рендеринга, для HDR-контента это приводило к несоответствиям в качестве изображения, поскольку HDR-контент тонально отображался в выходное пространство по-разному. Это было заметно в таких сценариях, как поворот экрана, где стратегия композиции меняется между GPU и DPU, а также в различиях в поведении рендеринга между TextureView и SurfaceView.

На этой странице описаны интерфейс, возможности настройки и проверки данных в библиотеке libtonemap .

Интерфейс к библиотеке тонального отображения

Библиотека libtonemap содержит реализации, работающие на ЦП, и шейдеры SkSL, которые могут быть подключены SurfaceFlinger для композиции на ГП и HWC для генерации таблицы поиска тонального отображения (LUT). Точкой входа в libtonemap является android::tonemap::getToneMapper() , которая возвращает объект, реализующий интерфейс ToneMapper .

Интерфейс ToneMapper поддерживает следующие возможности:

  • Сгенерируйте LUT-таблицу для тонального отображения.

    Интерфейс ToneMapper::lookupTonemapGain представляет собой реализацию шейдера, определенного в функции libtonemap_LookupTonemapGain() для ЦП. Он используется модульными тестами во фреймворке и может быть использован партнерами для помощи в генерации таблицы преобразования тонов (LUT) внутри их цветового конвейера.

    libtonemap_LookupTonemapGain() принимает значения цвета в абсолютном, ненормализованном линейном пространстве, как в линейном RGB, так и в XYZ, и возвращает число с плавающей запятой, описывающее, насколько следует умножить входные цвета в линейном пространстве.

  • Сгенерировать шейдер SkSL

    Интерфейс ToneMapper::generateTonemapGainShaderSkSL() возвращает строку шейдера SkSL, заданную исходным и целевым пространством данных. Шейдер SkSL интегрируется в реализацию Skia для RenderEngine , компонента композитинга с ускорением на GPU для SurfaceFlinger. Шейдер также интегрируется в libhwui , что позволяет эффективно выполнять тональное отображение HDR в SDR для TextureView . Поскольку сгенерированная строка встраивается в другие шейдеры SkSL, используемые Skia, шейдер должен соответствовать следующим правилам:

    • Строка шейдера должна иметь точку входа с сигнатурой типа float libtonemap_LookupTonemapGain(vec3 linearRGB, vec3 xyz) , где linearRGB — значение абсолютных нит пикселей RGB в линейном пространстве, а xyzlinearRGB преобразованный в XYZ.
    • Любые вспомогательные методы, используемые строкой шейдера, должны иметь префикс libtonemap_ чтобы избежать конфликтов в определениях шейдеров фреймворка. Аналогично, входные униформы должны иметь префикс in_libtonemap_ .
  • Сгенерировать униформу SkSL

    Интерфейс ToneMapper::generateShaderSkSLUniforms() возвращает следующее, если ему предоставлена struct метаданных, описывающая метаданные из различных стандартов HDR и условий отображения:

    • Список униформ, к которым привязан шейдер SkSL.

    • Универсальные значения in_libtonemap_displayMaxLuminance и in_libtonemap_inputMaxLuminance . Эти значения используются шейдерами фреймворка при масштабировании входного изображения в libtonemap и нормализации выходного изображения, если это необходимо.

    В настоящее время процесс генерации униформ не зависит от входного и выходного пространства данных.

Настройка

Эталонная реализация библиотеки libtonemap дает приемлемые результаты. Однако, поскольку алгоритм тонального отображения, используемый при композиции на GPU, может отличаться от алгоритма, используемого при композиции на DPU, использование эталонной реализации может вызывать мерцание в некоторых сценариях, например, при анимации вращения. Настройка может решить подобные проблемы качества изображения, специфичные для конкретного производителя.

Производителям оборудования настоятельно рекомендуется переопределить реализацию libtonemap , чтобы определить собственный подкласс ToneMapper , который возвращается функцией getToneMapper() . При настройке реализации партнеры должны выполнить одно из следующих действий:

  • Измените реализацию libtonemap напрямую.
  • Определите собственную статическую библиотеку, скомпилируйте её как отдельный файл и замените файл .a библиотеки libtonemap файлом, сгенерированным из их собственной библиотеки.

Производителям не нужно модифицировать какой-либо код ядра, но для корректной реализации несколько производителей должны обмениваться информацией об алгоритмах тонального отображения DPU.

Проверка

Выполните следующие шаги для проверки вашей реализации:

  1. Воспроизводите на экране HDR-видео, поддерживающие любые стандарты HDR, которые поддерживает ваша система отображения , такие как HLG, HDR10, HDR10+ или DolbyVision.

  2. Включите режим композиции с использованием графического процессора, чтобы исключить заметное для пользователя мерцание.

    Для переключения режима работы с графическим процессором используйте следующую команду adb :

    adb shell service call SurfaceFlinger 1008 i32 <0 to enable HWC composition,
    1 to force GPU composition>
    
    

Общие проблемы

При данной реализации могут возникнуть следующие проблемы:

  • Полосатость возникает, когда целевой формат рендеринга, используемый при композиции на графическом процессоре, имеет более низкую точность, чем типичное значение для HDR-контента. Например, полосатость может возникнуть, когда реализация HWC поддерживает непрозрачные 10-битные форматы для HDR, такие как RGBA1010102 или P010, но требует, чтобы композиция на графическом процессоре записывала данные в 8-битный формат, например RGBA8888, для поддержки альфа-канала.

  • Незначительное изменение цвета может быть вызвано различиями в квантовании, если DPU работает с другой точностью, чем GPU.

Каждая из этих проблем связана с относительными различиями в точности используемого оборудования. Типичным обходным путем является обеспечение наличия этапа дизеринга в путях с более низкой точностью, что делает любые различия в точности менее заметными для человека.