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

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

Android 10 поддерживает следующие HDR-видео.

  • HDR10
  • ВП9
  • 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, а также помощь производителям оригинального оборудования и SOC в реализации функций HDR.

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

Начиная с Android 7.0 поддерживаются следующие технологии HDR.

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

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

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

Открытие

Для воспроизведения 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
    Поддержка гибридного Log-Gamma.
  • float INVALID_LUMINANCE
    Неверное значение яркости.

Публичные методы:

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

Декодер

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

Dolby-Vision

Константа MIME MediaFormat :

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 :

int VP9Profile2HDR
int VP9Profile2HDR10Plus
int VP9Profile3HDR
int VP9Profile3HDR10Plus

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

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

Экстрактор

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

Технология Dolby-Vision HDR10 VP9-HLG VP9-PQ
Контейнер МП4 МП4 ВебМ ВебМ

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

Краткое содержание

Требования к компонентам для каждой технологии HDR показаны в следующей таблице:

Технология Dolby-Vision HDR10 VP9-HLG VP9-PQ
Поддерживаемый тип HDR (дисплей) HDR_TYPE_DOLBY_VISION HDR_TYPE_HDR10 HDR_TYPE_HLG HDR_TYPE_HDR10
Контейнер (Экстрактор) МП4 МП4 ВебМ ВебМ
Декодер 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

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

Отображать

Состав оборудования

Платформы с поддержкой 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 осуществляется в соответствии с определениями соответствующих органов.
  • Обратите внимание, что API HWC2 использует плавающие значения желаемой яркости, поэтому 8-битные значения EDID должны быть преобразованы соответствующим образом.

Декодеры

Платформы должны добавлять туннельные декодеры с поддержкой 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.

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

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

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

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

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

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

Экстракторы

Поддержка экстрактора Dolby Vision

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

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

Поддержка экстракторов HDR10 и VP9 HDR

Для поддержки 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
    MPEG4Extractor распознаёт потоки HDR10 как обычный поток HEVC, и извлекает HDR-дорожку с типом «видео/HEVC». Для декодирования этой дорожки фреймворк выбирает видеодекодер HEVC с поддержкой профиля Main10HDR10.
  • Декодер HEVC
    Информация HDR хранится в формате SEI или SPS. Декодер HEVC сначала получает кадры, содержащие информацию HDR. Затем декодер извлекает информацию HDR и уведомляет приложение о декодировании HDR-видео. Информация HDR упаковывается в выходной формат декодера, который затем распространяется на поверхность.

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

  1. Укажите поддерживаемый профиль HDR-декодера и тип уровня OMX. Пример:
    OMX_VIDEO_HEVCProfileMain10HDR10Main10 )
  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-дорожка с типом «видео/Dolby-Vision» для комбинированного потока Dolby из 2/3 слоёв. Формат единиц доступа HDR-дорожки, определяющий порядок упаковки единиц доступа из базового/расширенного/метаданных слоёв в единый буфер для декодирования в один HDR-кадр, определяется Dolby.
      • (Необязательно, только если BL обратно совместим) Дорожка BL содержит только базовый слой, который должен декодироваться стандартным декодером MediaCodec, например, декодером AVC/HEVC. Экстрактор должен предоставить стандартные блоки доступа AVC/HEVC для этой дорожки. Эта BL-дорожка должна иметь тот же уникальный идентификатор (track-id), что и дорожка Dolby, чтобы приложение понимало, что это две кодировки одного и того же видео.
    • Приложение может решить, какой трек выбрать, основываясь на возможностях платформы.
    • Поскольку HDR-дорожка имеет определённый тип HDR, фреймворк выберет видеодекодер Dolby для её декодирования. BL-дорожка будет декодирована обычным видеодекодером AVC/HEVC.
  • DolbyDecoder:
    • DolbyDecoder получает блоки доступа, которые содержат требуемые блоки доступа для всех слоев (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