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

Видео с высоким динамическим диапазоном (HDR) — это следующий рубеж в высококачественном декодировании видео, обеспечивающий непревзойденные качества воспроизведения сцен. Это достигается за счет значительного увеличения динамического диапазона компонента яркости (с текущих 100 кд/м 2 до 1000 кд/м 2 ) и использования гораздо более широкого цветового пространства (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, а также помощь OEM-производителям и 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 на SurfaceViews с использованием непрозрачных видеобуферов. Другими словами:

  • Стандартного 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
    Поддержка гибридного логарифмического гамма-анализа.
  • 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-HDR10

Константы профиля 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-контент почти так же, как и не-HDR-контент, со следующими оговорками:

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

Включить поддержку платформы HDR

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

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

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

Отображать

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

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

Поддержка декодера 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 (группы):
    • Dolby Vision HDR-дорожка с типом "video/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
    HDR10-битовые потоки распознаются MPEG4Extractor как обычный поток 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-bitstreams упакованы в контейнеры MP4, как определено Dolby. Теоретически приложения могли бы использовать обычный экстрактор MP4 для независимого извлечения базового слоя, слоя улучшения и слоя метаданных; однако это не соответствует текущей модели Android MediaExtractor/MediaCodec.

  • DolbyExtractor:
    • Потоки бит Dolby распознаются DolbyExtractor, который представляет различные слои как 1-2 дорожки для каждой видеодорожки (группы) Dolby:
      • HDR-дорожка с типом "video/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) для отдельных слоев может быть упакована в 1 кадр CSD, который будет определен Dolby. Требуется наличие одного кадра CSD.

Действия Долби

  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