Воспроизведение HDR-видео

Видео с расширенным динамическим диапазоном (HDR) – это новый шаг в развитии декодирования видео высокого качества. Оно позволяет воспроизводить сцены с беспрецедентной точностью. Это достигается за счет значительного увеличения динамического диапазона компонента яркости (с текущих 100 кд/м2 до тысяч кд/м2) и использования более широкого цветового пространства (BT 2020). Теперь это центральный элемент развития формата 4K UHD в сфере телевидения.

Android 10 поддерживает следующие форматы HDR-видео:

  • HDR10
  • VP9
  • HDR10+

На устройствах с Android 9 и более поздних версий MediaCodec передает метаданные HDR независимо от режима туннелирования. В режиме без туннелирования можно получать декодированные данные вместе со статическими или динамическими метаданными. Для HDR10 и VP9Profile2, в которых используются статические метаданные, они указываются в выходном формате с ключом KEY_HDR_STATIC_INFO. Для HDR10+, в котором используются динамические метаданные, это значение указывается с помощью ключа KEY_HDR10_PLUS_INFO в выходном формате и может меняться для каждого выходного кадра. Подробнее о туннелировании мультимедиа…

Начиная с Android 7.0, поддержка HDR включает создание констант для обнаружения и настройки видеоконвейеров HDR. Это означает, что нужно определить типы кодеков и режимы отображения, а также указать, как передавать данные HDR в MediaCodec и декодерам HDR.

Цель этого документа – помочь разработчикам приложений реализовать поддержку воспроизведения HDR-контента, а производителям оборудования и систем на кристалле – включить функции HDR.

Поддерживаемые технологии HDR

На устройствах с Android 7.0 и более поздних версий поддерживаются следующие технологии HDR:

Технологии Dolby Vision HDR10 VP9-HLG VP9-PQ
Кодек AVC/HEVC HEVC VP9 VP9
Функция передачи ST-2084 ST-2084 HLG ST-2084
Тип метаданных HDR Динамическая Статический Нет Статический

В Android 7.0 определено только воспроизведение HDR в туннельном режиме, но устройства могут поддерживать воспроизведение HDR на SurfaceView с использованием непрозрачных видео буферов. Так вы сможете контролировать, где виден ваш контент.

  • Стандартный Android API для проверки поддержки воспроизведения HDR с помощью декодеров без туннелирования отсутствует.
  • Туннельные видеодекодеры, которые поддерживают воспроизведение HDR-контента, должны воспроизводить его при подключении к дисплеям с поддержкой HDR.
  • Композиция HDR-контента с помощью GL не поддерживается в версии AOSP Android 7.0.

Discovery

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

Экран

Приложения должны использовать новый API Display.getHdrCapabilities для запроса технологий HDR, поддерживаемых указанным дисплеем. Это информация из статического блока метаданных EDID, как определено в CTA-861.3:

  • public Display.HdrCapabilities getHdrCapabilities()
    Возвращает возможности HDR дисплея.
  • Display.HdrCapabilities
    Содержит информацию о возможностях HDR для определенного дисплея. Например, какие типы HDR оно поддерживает и какие данные о яркости ему нужны.

Константы:

  • int HDR_TYPE_DOLBY_VISION
    Поддержка Dolby Vision.
  • int HDR_TYPE_HDR10
    Поддержка HDR10 / PQ.
  • int HDR_TYPE_HDR10_PLUS
    Поддержка HDR10+.
  • int HDR_TYPE_HLG
    Поддержка Hybrid Log-Gamma.
  • float INVALID_LUMINANCE
    Недопустимое значение яркости.

Общедоступные методы:

  • float getDesiredMaxAverageLuminance()
    Возвращает данные о максимальной средней яркости кадра в кд/м2 для этого дисплея.
  • float getDesiredMaxLuminance()
    Возвращает данные о максимальной яркости контента в кд/м2 для этого дисплея.
  • float getDesiredMinLuminance()
    Возвращает данные о минимальной яркости контента в кд/м2 для этого дисплея.
  • int[] getSupportedHdrTypes()
    Возвращает поддерживаемые типы HDR для этого дисплея (см. константы). Возвращает пустой массив, если дисплей не поддерживает HDR.

Декодер

Приложения должны использовать существующий API CodecCapabilities.profileLevels, чтобы проверять поддержку новых профилей с HDR:

Dolby Vision

MediaFormat – константа MIME.

String MIMETYPE_VIDEO_DOLBY_VISION

MediaCodecInfo.CodecProfileLevel константы профиля:

int DolbyVisionProfileDvavPen
int DolbyVisionProfileDvavPer
int DolbyVisionProfileDvheDen
int DolbyVisionProfileDvheDer
int DolbyVisionProfileDvheDtb
int DolbyVisionProfileDvheDth
int DolbyVisionProfileDvheDtr
int DolbyVisionProfileDvheStn

Видеослои и метаданные Dolby Vision должны быть объединены в один буфер на кадр с помощью видеоприложений. Это делается автоматически с помощью MediaExtractor, поддерживающего Dolby Vision.

HEVC HDR 10

MediaCodecInfo.CodecProfileLevel константы профиля:

int HEVCProfileMain10HDR10
int HEVCProfileMain10HDR10Plus

VP9 HLG и PQ

MediaCodecInfo.CodecProfileLevel profile constants:

int VP9Profile2HDR
int VP9Profile2HDR10Plus
int VP9Profile3HDR
int VP9Profile3HDR10Plus

Если платформа поддерживает декодер с поддержкой HDR, она также должна поддерживать экстрактор с поддержкой HDR.

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

Экстрактор

На устройствах Android 7.0 поддерживаются следующие контейнеры для разных технологий HDR:

Технологии Dolby Vision HDR10 VP9-HLG VP9-PQ
Контейнер MP4; MP4; WebM WebM

Платформа не поддерживает определение того, требуется ли для дорожки (в файле) поддержка HDR. Приложения могут анализировать данные, относящиеся к кодеку, чтобы определить, требуется ли для дорожки определенный профиль HDR.

Сводка

Требования к компонентам для каждой технологии HDR приведены в таблице ниже.

Технологии Dolby Vision HDR10 VP9-HLG VP9-PQ
Поддерживаемый тип HDR (экран) HDR_TYPE_DOLBY_VISION HDR_TYPE_HDR10 HDR_TYPE_HLG HDR_TYPE_HDR10
Контейнер (экстрактор) MP4; MP4; WebM WebM
Декодер MIMETYPE_VIDEO_DOLBY_VISION MIMETYPE_VIDEO_HEVC MIMETYPE_VIDEO_VP9 MIMETYPE_VIDEO_VP9
Профиль (декодер) Один из профилей Dolby HEVCProfileMain10HDR10 VP9Profile2HDR или VP9Profile3HDR VP9Profile2HDR или VP9Profile3HDR

Примечания

  • Битрейты Dolby Vision упаковываются в контейнер MP4 в соответствии с требованиями Dolby. Приложения могут реализовывать собственные экстракторы с поддержкой Dolby, если они упаковывают единицы доступа из соответствующих слоев в одну единицу доступа для декодера, как определено Dolby.
  • Платформа может поддерживать экстрактор с поддержкой HDR, но не декодер с поддержкой HDR.

Воспроизведение

После того как приложение проверит поддержку воспроизведения HDR, оно сможет воспроизводить HDR-контент почти так же, как и обычный контент, но с некоторыми оговорками:

  • Для Dolby Vision информация о том, требуется ли для определенного медиафайла/трека декодер с поддержкой HDR, недоступна. Приложение должно иметь эту информацию заранее или получать ее, анализируя раздел данных кодека в MediaFormat.
  • CodecCapabilities.isFormatSupported не учитывает, требуется ли функция туннельного декодера для поддержки такого профиля.

Как включить поддержку HDR на платформе

Поставщики SoC и OEM-производители должны выполнить дополнительные действия, чтобы включить поддержку HDR на устройстве.

Изменения платформы в Android 7.0 для HDR

Ниже перечислены основные изменения в платформе (уровень приложений/встроенных функций), о которых должны знать производители устройств и систем на кристалле.

Экран

Состав аппаратного обеспечения

Платформы с поддержкой HDR должны поддерживать смешивание HDR-контента с контентом без HDR. В Android 7.0 не определены точные характеристики и операции смешивания, но в целом процесс выглядит следующим образом:

  1. Определите линейное цветовое пространство/объем, содержащее все слои, которые нужно объединить, на основе цвета слоев, мастеринга и потенциальных динамических метаданных.
    Если композиция выполняется непосредственно на дисплее, это может быть линейное цветовое пространство, соответствующее цветовому охвату дисплея.
  2. Преобразуйте все слои в общее цветовое пространство.
  3. Выполните смешивание.
  4. Если вы используете HDMI:
    1. Определите цвет, мастеринг и потенциальные динамические метаданные для смешанной сцены.
    2. Преобразовать полученную смешанную сцену в производное цветовое пространство/объем.
  5. Если выводите изображение непосредственно на экран, преобразуйте полученную смешанную сцену в необходимые сигналы.

Обнаружение дисплеев

Обнаружение HDR-дисплеев поддерживается только через HWC2. Чтобы эта функция работала, разработчики устройств должны выборочно включить адаптер HWC2, выпущенный вместе с Android 7.0. Поэтому платформы должны добавить поддержку HWC2 или расширить фреймворк AOSP, чтобы обеспечить возможность предоставления этой информации. HWC2 предоставляет новый API для передачи статических данных HDR в фреймворк и приложение.

HDMI

  • Подключенный дисплей HDMI передает информацию о поддержке HDR через HDMI EDID, как описано в разделе 4.2 стандарта CTA-861.3.
  • Используйте следующее сопоставление EOTF:
    • ET_0 Традиционная гамма – диапазон яркости SDR: не сопоставлен ни с каким типом HDR
    • ET_1 Традиционная гамма – диапазон яркости HDR: не сопоставлен ни с каким типом HDR
    • ET_2 SMPTE ST 2084 – сопоставлено с типом HDR HDR10
  • Сигнализация поддержки Dolby Vision или HLG через HDMI выполняется в соответствии с требованиями соответствующих организаций.
  • Обратите внимание, что в HWC2 API используются значения желаемой яркости с плавающей запятой, поэтому 8-битные значения EDID необходимо преобразовать соответствующим образом.

Декодеры

Платформы должны добавлять туннелированные декодеры с поддержкой HDR и рекламировать свою поддержку HDR. Как правило, декодеры с поддержкой HDR должны:

  • Поддержка туннельного декодирования (FEATURE_TunneledPlayback).
  • Поддержка статических метаданных HDR (OMX.google.android.index.describeHDRColorInfo) и их распространения на дисплей/аппаратную композицию. Для HLG на дисплей должны передаваться подходящие метаданные.
  • Поддержка описания цвета (OMX.google.android.index.describeColorAspects) и его передачи на дисплей или в аппаратную композицию.
  • Поддерживать встроенные метаданные HDR, как определено в соответствующем стандарте.

Поддержка декодера Dolby Vision

Чтобы поддерживать Dolby Vision, платформы должны добавить декодер HDR OMX, совместимый с Dolby Vision. Учитывая особенности Dolby Vision, обычно это декодер-обертка для одного или нескольких декодеров AVC и/или HEVC, а также композитор. Такие декодеры должны:

  • Поддержка MIME-типа video/dolby-vision.
  • Указывать поддерживаемые профили и уровни Dolby Vision.
  • Принимаются блоки доступа, содержащие подблоки доступа всех уровней, как определено Dolby.
  • Принимать данные, относящиеся к кодеку, определенные Dolby. Например, данные, содержащие профиль/уровень Dolby Vision и, возможно, данные, относящиеся к кодеку, для внутренних декодеров.
  • Поддержка адаптивного переключения между профилями/уровнями Dolby Vision в соответствии с требованиями Dolby.

При настройке декодера фактический профиль Dolby не передается кодеку. Это происходит только через данные, относящиеся к кодеку, после запуска декодера. Платформа может поддерживать несколько декодеров Dolby Vision: один для профилей AVC, а другой – для профилей HEVC. Это позволяет инициализировать базовые кодеки во время настройки. Если декодер Dolby Vision поддерживает оба типа профилей, он также должен поддерживать динамическое переключение между ними.

Если платформа предоставляет декодер с поддержкой Dolby Vision в дополнение к общему декодеру HDR, она должна:

  • Предоставьте экстрактор с поддержкой Dolby Vision, даже если он не поддерживает воспроизведение HDR.
  • Предоставьте декодер, который поддерживает профиль Dolby Vision.

Поддержка декодера HDR10

Чтобы поддерживать HDR10, платформы должны добавить декодер OMX с поддержкой HDR10. Обычно это туннелированный декодер HEVC, который также поддерживает синтаксический анализ и обработку метаданных, связанных с HDMI. Такой декодер (в дополнение к общему декодеру HDR) должен:

  • Поддержка MIME-типа video/hevc.
  • Рекламировать поддерживаемый HEVCMain10HDR10. Поддержка профиля HEVCMain10HRD10 также требует поддержки профиля HEVCMain10, для которого, в свою очередь, требуется поддержка профиля HEVCMain на тех же уровнях.
  • Поддержка анализа блоков SEI метаданных мастеринга, а также другой информации, связанной с HDR, которая содержится в SPS.

Поддержка декодера VP9

Чтобы поддерживать VP9 HDR, платформы должны добавить декодер VP9 Profile2-capable HDR OMX. Обычно это туннельный декодер VP9, который также поддерживает обработку метаданных, связанных с HDMI. Такие декодеры (в дополнение к общей поддержке декодеров HDR) должны:

  • Поддержка MIME-типа video/x-vnd.on2.vp9.
  • Рекламируйте поддерживаемый VP9Profile2HDR. Для поддержки профиля VP9Profile2HDR также требуется поддержка профиля VP9Profile2 на том же уровне.

Извлекатели

Поддержка извлечения Dolby Vision

Платформы, поддерживающие декодеры Dolby Vision, должны добавить поддержку Dolby Extractor (извлекателя Dolby) для видеоконтента Dolby Video.

  • Обычный экстрактор MP4 может извлечь из файла только базовый слой, но не слои улучшений или метаданных. Поэтому для извлечения данных из файла требуется специальный декодер Dolby.
  • Извлечение Dolby должно предоставлять 1–2 дорожки для каждой видеодорожки Dolby (группы):
    • Дорожка Dolby Vision HDR с типом "video/dolby-vision" для комбинированного потока Dolby из двух или трех слоев. Формат единицы доступа дорожки HDR, который определяет, как упаковать единицы доступа из базового, улучшенного и метаданных слоев в один буфер для декодирования в один кадр HDR, должен быть определен Dolby.
    • Если видеодорожка Dolby Vision содержит отдельный базовый слой (BL), обратно совместимый, извлекающая программа должна также представить его как отдельную дорожку "video/avc" или "video/hevc". Экстрактор должен предоставлять регулярные блоки доступа AVC/HEVC для этой дорожки.
    • У дорожки BL должен быть тот же уникальный идентификатор дорожки (track-ID), что и у дорожки HDR. Это необходимо, чтобы приложение понимало, что это две кодировки одного и того же видео.
    • Приложение может выбрать дорожку в зависимости от возможностей платформы.
  • Профиль/уровень Dolby Vision должен быть указан в формате дорожки HDR.
  • Если платформа предоставляет декодер с поддержкой Dolby Vision, она также должна предоставлять экстрактор с поддержкой Dolby Vision, даже если воспроизведение HDR не поддерживается.

Поддержка извлечения HDR-контента в форматах HDR10 и VP9

Для поддержки HDR10 или VP9-HLG не требуются дополнительные извлекатели. Платформы должны расширить экстрактор MP4, чтобы поддерживать VP9 PQ в MP4. Статические метаданные HDR должны передаваться в битовом потоке VP9 PQ таким образом, чтобы они поступали в декодер VP9 PQ и на дисплей через обычный конвейер MediaExtractor => MediaCodec.

Расширения Stagefright для поддержки Dolby Vision

Платформы должны добавить поддержку формата Dolby Vision в Stagefright:

  • Поддержка запроса определения порта для сжатого порта.
  • Поддержка перечисления профилей/уровней для декодера DV.
  • Поддержка профиля/уровня DV для дорожек DV HDR.

Особенности реализации для разных технологий

Конвейер декодера HDR10

Рисунок 1. Конвейер HDR10

Битовые потоки HDR10 упаковываются в контейнеры MP4. Приложения используют обычный экстрактор MP4, чтобы извлечь данные кадра и отправить их декодеру.

  • MPEG4 Extractor
    MPEG4Extractor распознает битовые потоки HDR10 как обычный поток HEVC и извлекает дорожку HDR с типом video/HEVC. Платформа выбирает декодер HEVC, поддерживающий профиль Main10HDR10, чтобы декодировать эту дорожку.
  • Декодер HEVC
    Информация о HDR содержится в SEI или SPS. Сначала декодер HEVC получает кадры, содержащие информацию HDR. Затем декодер извлекает информацию HDR и уведомляет приложение о том, что декодирует видео в формате HDR. Информация HDR объединяется с выходным форматом декодера, который затем передается на поверхность.

Действия поставщиков

  1. Объявите поддерживаемый профиль декодера HDR и тип OMX уровня. Пример:
    OMX_VIDEO_HEVCProfileMain10HDR10 (и Main10)
  2. Реализуйте поддержку индекса: OMX.google.android.index.describeHDRColorInfo
  3. Реализуйте поддержку индекса: OMX.google.android.index.describeColorAspects
  4. Реализовать поддержку синтаксического анализа SEI для метаданных мастеринга.

Конвейер декодера Dolby Vision

Рисунок 2. Конвейер Dolby Vision

Потоки Dolby упаковываются в контейнеры MP4 в соответствии с требованиями Dolby. Теоретически приложения могут использовать обычный экстрактор MP4, чтобы извлекать базовый слой, слой улучшения и слой метаданных по отдельности. Однако это не соответствует текущей модели Android MediaExtractor/MediaCodec.

  • DolbyExtractor:
    • Потоки Dolby распознаются с помощью DolbyExtractor, который предоставляет различные слои в виде 1–2 дорожек для каждой видеодорожки Dolby (группы):
      • Дорожка HDR с типом "video/dolby-vision" для комбинированного потока Dolby из двух или трех слоев. Формат блока доступа HDR-дорожки, который определяет, как упаковать блоки доступа из базового слоя, слоя улучшения и слоя метаданных в один буфер для декодирования в один HDR-кадр, должен быть определен Dolby.
      • (Необязательно, только если базовый уровень обратно совместим.) Дорожка BL содержит только базовый уровень, который должен декодироваться обычным декодером MediaCodec, например декодером AVC/HEVC. Извлеченная информация должна содержать регулярные единицы доступа AVC/HEVC для этой дорожки. У этой дорожки BL должен быть тот же уникальный идентификатор дорожки («идентификатор дорожки»), что и у дорожки Dolby, чтобы приложение понимало, что это две кодировки одного и того же видео.
    • Приложение может выбрать дорожку в зависимости от возможностей платформы.
    • Поскольку у дорожки HDR есть определенный тип HDR, фреймворк выберет видеодекодер Dolby для ее декодирования. Дорожка BL будет декодироваться обычным видеодекодером AVC/HEVC.
  • DolbyDecoder:
    • Декодер Dolby получает единицы доступа, содержащие необходимые единицы доступа для всех слоев (EL+BL+MD или BL+MD).
    • Информация CSD (данные, относящиеся к кодеку, например SPS+PPS+VPS) для отдельных слоев может быть упакована в один кадр CSD, который определяется Dolby. Требуется один кадр CSD.

Действия Dolby

  1. Определите упаковку единиц доступа для различных схем контейнеров Dolby (например, BL+EL+MD) для абстрактного декодера Dolby (то есть формата буфера, ожидаемого декодером HDR).
  2. Определите упаковку CSD для абстрактного декодера Dolby.

Действия поставщиков

  1. Реализуйте извлечение Dolby. Это также может сделать Dolby.
  2. Интегрируйте DolbyExtractor в фреймворк. Точка входа: frameworks/av/media/libstagefright/MediaExtractor.cpp.
  3. Объявите профиль декодера HDR и уровень типа OMX. Примеры: OMX_VIDEO_DOLBYPROFILETYPE и OMX_VIDEO_DOLBYLEVELTYP.
  4. Реализуйте поддержку индекса: 'OMX.google.android.index.describeColorAspects'
  5. Передавать динамические метаданные HDR в приложение и на экран в каждом кадре. Как правило, эта информация должна быть упакована в декодированный кадр, как определено Dolby, поскольку стандарт HDMI не позволяет передавать ее на дисплей.

Конвейер декодера VP9

Рисунок 3. Конвейер VP9-PQ

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

  • Извлечение WebM:
  • Декодер VP9:
    • Декодер получает битовые потоки Profile2 и декодирует их как обычные потоки VP9.
    • Декодер получает от фреймворка любые статические метаданные HDR.
    • Декодер получает статичные метаданные через единицы доступа к битовому потоку для потоков VP9 PQ.
    • Декодер VP9 должен иметь возможность передавать статические/динамические метаданные HDR на дисплей.

Действия поставщиков

  1. Реализуйте поддержку индекса: OMX.google.android.index.describeHDRColorInfo
  2. Реализуйте поддержку индекса: OMX.google.android.index.describeColorAspects
  3. Передавать статические метаданные HDR