Воспроизведение 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-производителям и поставщикам систем включить функции HDR.

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

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

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

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

  • Не существует стандартного Android API для проверки поддержки воспроизведения 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
    Поддержка DolbyVision.
  • int HDR_TYPE_HDR10
    Поддержка HDR10/PQ.
  • 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:

Долби-видение

Константа 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

VP9 ГВУ и ПК

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

int VP9Profile2HDR
int VP9Profile3HDR

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

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

Экстрактор

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

Технологии Долби-видение HDR10 VP9-HLG VP9-PQ
Контейнер MP4 MP4 ВебМ ВебМ

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

Резюме

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

Технологии Долби-видение 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

Вот некоторые ключевые изменения в платформе (прикладной/собственный уровень), о которых должны знать 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, как определено в CTA-861.3, раздел 4.2.
  • Следует использовать следующее отображение 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» для комбинированного 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 с типом «video/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 с типом «видео/долби-видение» для комбинированного 2/3-слойного потока долби. Формат единицы доступа дорожки 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.

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

  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