Воспроизведение 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 ВП9-HLG ВП9-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.

ХВК 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 ВП9-HLG ВП9-PQ
Контейнер МП4 МП4 ВебМ ВебМ

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

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

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

Технология Dolby-Vision HDR10 ВП9-HLG ВП9-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 HEVCПрофильMain10HDR10 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 с типом «видео/dolby-vision» для комбинированного 2/3-слойного потока Dolby. Формат единиц доступа к дорожке HDR, который определяет, как упаковать единицы доступа из базового/улучшенного уровня/слоев метаданных в один буфер для декодирования в один кадр HDR, должен определяться Dolby.
    • Если видеодорожка Dolby Vision содержит отдельный (обратно совместимый) базовый слой (BL), экстрактор также должен представить его как отдельную дорожку «video/avc» или «video/hevc». Экстрактор должен предоставить обычные блоки доступа AVC/HEVC для этого трека.
    • Дорожка BL должна иметь тот же уникальный идентификатор дорожки («идентификатор дорожки»), что и дорожка 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

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

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

  • ДолбиЭкстрактор:
    • Битовые потоки Dolby распознаются DolbyExtractor, который отображает различные слои как 1–2 дорожки для каждой дорожки (группы) видео Dolby:
      • HDR-дорожка с типом «видео/долби-видение» для комбинированного 2/3-слойного потока Dolby. Формат единиц доступа к дорожке HDR, который определяет, как упаковать единицы доступа из базового/улучшенного уровня/слоев метаданных в один буфер для декодирования в один кадр HDR, должен определяться Dolby.
      • (Необязательно, только если BL обратно совместим) Дорожка BL содержит только базовый уровень, который должен быть декодирован обычным декодером MediaCodec, например, декодером AVC/HEVC. Экстрактор должен предоставлять обычные блоки доступа AVC/HEVC для этого трека. Эта дорожка BL должна иметь тот же уникальный идентификатор дорожки («идентификатор дорожки»), что и дорожка Dolby, чтобы приложение понимало, что это две кодировки одного и того же видео.
    • Приложение может решить, какой трек выбрать, исходя из возможностей платформы.
    • Поскольку дорожка HDR имеет определенный тип HDR, платформа выберет видеодекодер Dolby для декодирования этой дорожки. Дорожка BL будет декодирована обычным видеодекодером AVC/HEVC.
  • Долбидекодер:
    • DolbyDecoder получает единицы доступа, которые содержат необходимые единицы доступа для всех уровней (EL+BL+MD или BL+MD).
    • Информация CSD (специфические данные кодека, такие как SPS+PPS+VPS) для отдельных уровней может быть упакована в 1 кадр 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