Видео с расширенным динамическим диапазоном (HDR) — это следующий рубеж в высококачественном декодировании видео, обеспечивающий непревзойденное качество воспроизведения сцен. Это достигается за счет значительного увеличения динамического диапазона компонента яркости (с нынешних 100 кд/ м² до тысяч кд/ м² ) и использования гораздо более широкого цветового пространства (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-потоков, а также помочь производителям оборудования и компаниям, занимающимся разработкой однокристальных систем (SOC), внедрить функции HDR.
Поддерживаемые технологии HDR
Начиная с Android 7.0 и выше, поддерживаются следующие технологии HDR.
| Технологии | Dolby-Vision | HDR10 | VP9-HLG | VP9-PQ |
|---|---|---|---|---|
| Кодек | AVC/HEVC | HEVC | VP9 | VP9 |
| Передаточная функция | СТ-2084 | СТ-2084 | HLG | СТ-2084 |
| Тип метаданных HDR | Динамический | Статический | Никто | Статический |
В Android 7.0 определено только воспроизведение HDR в туннельном режиме , но устройства могут добавить поддержку воспроизведения HDR на SurfaceView с использованием непрозрачных видеобуферов. Другими словами:
- В Android отсутствует стандартный API для проверки поддержки воспроизведения HDR с использованием декодеров без туннелирования.
- Видеодекодеры с туннельным подключением, заявляющие о возможности воспроизведения HDR, должны поддерживать воспроизведение HDR при подключении к дисплеям с поддержкой HDR.
- Композиция HDR-контента в GL-режиме не поддерживается в версии 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()
Возвращает необходимые данные о максимальной средней яркости кадра в кд/кд/ м² для данного дисплея. -
float getDesiredMaxLuminance()
Возвращает данные о максимальной яркости контента в кд/кд/ м² для данного дисплея. -
float getDesiredMinLuminance()
Возвращает необходимые данные о минимальной яркости контента в кд/кд/ м² для данного дисплея. -
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 |
|---|---|---|---|---|
| Контейнер | MP4 | MP4 | ВебМ | ВебМ |
Платформа не поддерживает определение необходимости поддержки 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 | ВебМ | ВебМ |
| Декодер | 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.
Вот некоторые ключевые изменения в платформе (приложение/нативный слой), о которых должны знать производители оборудования и разработчики SOC.
Отображать
Аппаратная составляющая
Платформы с поддержкой HDR должны обеспечивать смешивание HDR-контента с контентом без поддержки HDR. Точные характеристики и операции смешивания не определены в Android на версии 7.0, но в целом процесс включает следующие шаги:
- Определите линейное цветовое пространство/объем, содержащее все слои, подлежащие компоновке, на основе цвета слоев, их исходного изображения и потенциальных динамических метаданных.
При компоновке непосредственно на дисплей это может быть линейное пространство, соответствующее цветовому объему дисплея. - Преобразовать все слои в общепринятое цветовое пространство.
- Выполните смешивание.
- При выводе изображения через HDMI:
- Определите цвет, параметры мастеринга и, возможно, динамические метаданные для смешанной сцены.
- Преобразуйте полученную смешанную сцену в производное цветовое пространство/объем.
- При непосредственном выводе изображения на дисплей, преобразуйте полученное смешанное изображение в необходимые сигналы для воспроизведения этого изображения.
обнаружение дисплея
Обнаружение 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 использует значения желаемой яркости в формате float, поэтому 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 поддерживает оба типа профилей, он также должен поддерживать динамическое адаптивное переключение между ними.
Если платформа, помимо поддержки стандартного декодера HDR, предоставляет декодер с поддержкой Dolby-Vision, она должна:
- Предоставьте инструмент для извлечения данных, поддерживающий 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 Extractor (называемого Dolby Extractor) для видеоконтента Dolby.
- Обычный MP4-экстрактор может извлечь из файла только базовый слой, но не слои улучшения или метаданные. Поэтому для извлечения данных из файла необходим специальный экстрактор Dolby.
- Для каждой видеодорожки (группы) Dolby экстрактор должен отображать от 1 до 2 дорожек:
- Дорожка Dolby Vision HDR с типом "video/dolby-vision" для объединенного 2/3-слойного потока 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.
Поддержка 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-дорожка с типом "video/HEVC". Для декодирования этой дорожки фреймворк выбирает видеодекодер HEVC, поддерживающий профиль Main10HDR10. - Декодер HEVC
Информация о HDR хранится либо в формате SEI, либо в формате SPS. Декодер HEVC сначала получает кадры, содержащие информацию о HDR. Затем декодер извлекает информацию о HDR и уведомляет приложение о том, что он декодирует видео HDR. Информация о HDR объединяется в выходной формат декодера, который затем передается на поверхность.
Действия поставщика
- Укажите поддерживаемый профиль декодера HDR и тип уровня OMX. Пример:
OMX_VIDEO_HEVCProfileMain10HDR10(andMain10) - Реализовать поддержку индекса: '
OMX.google.android.index.describeHDRColorInfo' - Реализовать поддержку index: '
OMX.google.android.index.describeColorAspects' - Реализовать поддержку анализа SEI-парсинга метаданных основного файла.
Конвейер декодера Dolby Vision

Рисунок 2. Конвейер обработки данных Dolby Vision.
Потоки Dolby-битов упаковываются в контейнеры MP4, как это определено Dolby. Теоретически, приложения могли бы использовать обычный экстрактор MP4 для независимого извлечения базового слоя, слоя улучшения и слоя метаданных; однако это не соответствует текущей модели Android MediaExtractor/MediaCodec.
- DolbyExtractor:
- Потоки Dolby-битов распознаются программой DolbyExtractor, которая отображает различные слои в виде 1–2 дорожек для каждой видеодорожки (группы) Dolby:
- HDR-дорожка с типом "video/dolby-vision" для объединенного 2/3-слойного потока Dolby. Формат блока доступа HDR-дорожки, определяющий способ упаковки блоков доступа из базового/улучшенного/метаданных слоев в единый буфер для декодирования в один HDR-кадр, должен быть определен Dolby.
- (Необязательно, только если BL обратно совместим) Дорожка BL содержит только базовый слой, который должен декодироваться обычным декодером MediaCodec, например, декодером AVC/HEVC. Экстрактор должен предоставлять обычные блоки доступа AVC/HEVC для этой дорожки. Эта дорожка BL должна иметь тот же уникальный идентификатор дорожки («track-ID»), что и дорожка Dolby, чтобы приложение понимало, что это две кодировки одного и того же видео.
- Приложение может выбирать подходящий маршрут, исходя из возможностей платформы.
- Поскольку HDR-дорожка имеет определенный тип HDR, платформа выберет видеодекодер Dolby для декодирования этой дорожки. Дорожка BL будет декодирована обычным видеодекодером AVC/HEVC.
- Потоки Dolby-битов распознаются программой DolbyExtractor, которая отображает различные слои в виде 1–2 дорожек для каждой видеодорожки (группы) Dolby:
- DolbyDecoder:
- Декодер Dolby принимает блоки доступа, содержащие необходимые блоки доступа для всех слоев (EL+BL+MD или BL+MD).
- Информация CSD (данные, специфичные для кодека, такие как SPS+PPS+VPS) для отдельных слоев может быть упакована в один кадр CSD, определяемый Dolby. Наличие одного кадра CSD является обязательным условием.
действия Dolby
- Определите формат упаковки блоков доступа для различных схем контейнеризации Dolby (например, BL+EL+MD) для абстрактного декодера Dolby (т.е. формат буфера, ожидаемый декодером HDR).
- Определите формат упаковки CSD для абстрактного декодера Dolby.
Действия поставщика
- Реализуйте Dolby Extractor. Это также можно сделать с помощью Dolby.
- Интегрируйте DolbyExtractor в фреймворк. Точка входа находится в
frameworks/av/media/libstagefright/MediaExtractor.cpp. - Объявите профиль декодера HDR и тип OMX уровня. Пример:
OMX_VIDEO_DOLBYPROFILETYPEиOMX_VIDEO_DOLBYLEVELTYP. - Реализовать поддержку index:
'OMX.google.android.index.describeColorAspects' - Передайте динамические метаданные HDR в приложение и отобразите их в каждом кадре. Как правило, эта информация должна быть упакована в декодированный кадр в соответствии с требованиями Dolby, поскольку стандарт HDMI не предусматривает способа передачи этой информации на дисплей.
Конвейер декодера VP9

Рисунок 3. Конвейер VP9-PQ
Потоки данных VP9 упаковываются в контейнеры WebM способом, определенным командой WebM. Приложениям необходимо использовать экстрактор WebM для извлечения метаданных HDR из потока данных перед отправкой кадров декодеру.
- WebM Extractor:
- WebM Extractor извлекает метаданные HDR и кадры из контейнера .
- Декодер VP9:
- Декодер принимает битовые потоки Profile2 и декодирует их как обычные потоки VP9.
- Декодер получает все статические метаданные HDR от фреймворка.
- Декодер получает статические метаданные через блоки доступа к битовому потоку для потоков VP9 PQ.
- Декодер VP9 должен уметь передавать статические/динамические метаданные HDR на дисплей.
Действия поставщика
- Реализовать поддержку index:
OMX.google.android.index.describeHDRColorInfo - Реализовать поддержку index:
OMX.google.android.index.describeColorAspects - Распространение статических метаданных HDR