Поделиться через


Кодировка видео D3D12

В этой статье содержатся общие сведения для разработчиков драйверов относительно функции кодирования видео Direct3D12. Дополнительные сведения, включая особенности уровня приложения, см. в спецификации кодировки видео D3D.

Сведения о кодировке видео Direct3D 12

До Windows 11 (WDDM 3.0) DirectX 12 предоставил интерфейсы уровня приложений и драйверов (API и DDIs) для поддержки ускорения GPU для нескольких приложений видео, включая декодирование видео, обработку видео и оценку движения.

Начиная с Windows 11 D3D12 добавляет функцию кодирования видео в существующее семейство API видео или DDI. Эта функция предоставляет последовательный набор API-интерфейсов кодирования и DDI, которые соответствуют существующей платформе D3D12 и позволяют разработчикам осуществлять кодирование видео с помощью видео движков с ускорением GPU.

Платформа кодирования видео предоставляет доступ к возможностям аппаратного ускорения кодировщика видео. Его можно использовать в различных сценариях, таких как Интернет вещей (IoT), облако, API мультимедиа, машинное обучение (ML) и потоковая передача игр.

Поддержка кодирования AV1 добавлена в Windows 11 версии 24H2 (WDDM 3.2). Дополнительные сведения см. в статье D3D12 AV1 Video Encoding.

Поддерживаемые кодеки

Начиная с Windows 11 поддерживаемые кодеки — H.264 и HEVC, хотя платформа кодирования видео D3D12 обеспечивает открытую расширяемость для новых кодеков, таких как AV1.

Специфические для кодека аспекты интерфейса платформы делегированы структурам, зависящим от кодека, и их доступ к типам объединения. Например, структура D3D12DDI_VIDEO_ENCODER_CODEC_CONFIGURATION_0082_0 содержит объединение с указателями на структуры D3D12DDI_VIDEO_ENCODER_CODEC_CONFIGURATION_H264_0082_0 и D3D12DDI_VIDEO_ENCODER_CODEC_CONFIGURATION_HEVC_0082_0, которые содержат информацию о конфигурации, специфичной для каждого кодека.

Чтобы сохранить совместимость двоичного интерфейса с расширяемостью, типы объединения всегда содержат указатели на структуры, относящиеся к кодеку. Типы объединения имеют постоянный размер на основе размера адресации архитектуры хоста. Это решение также запрещает структурам, содержащим члены (или содержащие анонимные) типы объединения, изменять их размеры при расширении интерфейса. Некоторые из объединений содержат только указатели на типы перечислений; для согласованности эти перечисления также указываются в виде указателей в случае, если новый кодек требует более сложного типа, чем перечисление, для представления этих концепций.

Отчет о поддержке и возможностях кодирования видео

Существующая платформа, связанная с видео, была расширена, чтобы позволить водителям сообщать о поддержке и возможностях кодирования видео.

  • D3D12DDI_FEATURE_VERSION_VIDEO_0083_0 — это номер версии, определяющий первую полную реализацию всех вех кодированных видео D3D12, представленных в Windows 11.

  • Перечисление D3D12DDICAPS_TYPE_VIDEO_0020 было расширено, чтобы включить следующие значения поддержки кодирования видео:

    • D3D12DDICAPS_TYPE_VIDEO_0080_ENCODER_CODEC = 31,
    • D3D12DDICAPS_TYPE_VIDEO_0080_ENCODER_PROFILE_LEVEL = 32,
    • D3D12DDICAPS_TYPE_VIDEO_0080_ENCODER_OUTPUT_RESOLUTION_RATIOS_COUNT = 33,
    • D3D12DDICAPS_TYPE_VIDEO_0080_ENCODER_OUTPUT_RESOLUTION = 34,
    • D3D12DDICAPS_TYPE_VIDEO_0080_ENCODER_INPUT_FORMAT = 35,
    • D3D12DDICAPS_TYPE_VIDEO_0080_ENCODER_RATE_CONTROL_MODE = 36,
    • D3D12DDICAPS_TYPE_VIDEO_0080_ENCODER_INTRA_REFRESH_MODE = 37,
    • D3D12DDICAPS_TYPE_VIDEO_0080_ENCODER_FRAME_SUBREGION_LAYOUT_MODE = 38,
    • D3D12DDICAPS_TYPE_VIDEO_0080_ENCODER_HEAP_SIZE = 39,
    • D3D12DDICAPS_TYPE_VIDEO_0080_ENCODER_CODEC_CONFIGURATION_SUPPORT = 40,
    • D3D12DDICAPS_TYPE_VIDEO_0080_ENCODER_SUPPORT = 41,
    • D3D12DDICAPS_TYPE_VIDEO_0080_ENCODER_CODEC_PICTURE_CONTROL_SUPPORT = 42,
    • D3D12DDICAPS_TYPE_VIDEO_0080_ENCODER_RESOURCE_REQUIREMENTS = 43

    Среда выполнения D3D вызывает обратный вызов драйвера PFND3D12DDI_VIDEO_GETCAPS для запроса поддержки кодирования видео.

  • Драйвер, который поддерживает кодирование видео, предоставляет среде выполнения D3D указатели на свои функции обратного вызова видеокодирования в структуре D3D12DDI_DEVICE_FUNCS_VIDEO_0082_0.

Функции обратного вызова для кодирования видео в D3D12

Драйвер реализует следующие функции обратного вызова для поддержки кодирования видео D3D12.

  • Создайте объект драйвера, представляющий кодировщик видео:

  • Создайте объект драйвера, представляющий кучу видеокодировщика:

  • Кодирование кадра:

    • PFND3D12DDI_VIDEO_ENCODE_FRAME_0082_0 записывает операцию кодирования кадра в список команд.

    • После операции кодирования также необходимо вызвать PFND3D12DDI_VIDEO_ENCODE_RESOLVE_OUTPUT_METADATA_0082_0, чтобы преобразовать выходные метаданные операции кодирования в читаемый формат. Макет разрешенных метаданных драйвера аналогичен примеру, показанном на схеме в спецификации.

  • Уничтожить кодировщик видео и связанную кучу:

Тестирование

Следующие тесты включены в состав набора для лабораторных испытаний оборудования Windows (WHLK). Дополнительные сведения см. в WHLK.

Название теста Описание
CreateVideoEncoder Проверяет создание VideoEncoder/VideoEncoderHeap на основе сообщаемых случаев CheckFeatureSupport.
SingleEncodeH264/HEVC Тесты на основе QR-кода для базовых проверок структурного изображения. Последовательность входных изображений помечена предопределенным QR-содержимым, а затем закодирована и декодирована. Наконец, выходные значения (и в некоторой степени качество) проверяются, чтобы убедиться, что они ожидаемы.
EncodeProfileLevelSuggestionsH264/HEVC Проверяет, что значения D3D12_FEATURE_DATA_VIDEO_ENCODER_SUPPORT.SuggestedProfile/Level соответствуют спецификациям H.264/HEVC и конфигурациям, передаваемым в качестве входных данных в D3D12_FEATURE_DATA_VIDEO_ENCODER_SUPPORT.
EncodeHeapSizeCap Проверяет увеличение объема памяти при увеличении входных аргументов.
SimpleGOPEncode H264 / HEVC (10 бит) Транскодирует входное видео с различными разрешениями, шаблонами GOP, режимами сегментации и другими конфигурациями кодека, проверяя, что выходное закодированное видео имеет допустимую разницу по сравнению с входным видеопотоком. Это сравнение выполняется с помощью пикового сигнала к коэффициенту шума (PSNR).
EncodeSubregions/ResolutionReconfiguration Проверяет перенастройки во время полета.
EncodeH264LongTermReferences Проверяет использование долгосрочных ссылок на рисунки.
EncodeIntraRefresh Проверяет простой сценарий внутрикадрового обновления в открытом кадре типа IPP... P... P... GOP.
VideoEncodeCommandListFeatures Проверяет предикаты и маркеры для списков команд кодирования видео.
VideoEncodeTimestamps Проверяет метки времени для списков команд кодирования видео.

Сценарии кодирования видео

OneCore

Поддержка кодирования видео D3D12 обеспечивает переносимое аппаратно-ускоренное видеокодирование на платформах, где доступно только D3D12. Эти платформы включают различные номера SKU OneCore, используемые облачными вычислительными ресурсами и платформами Интернета вещей. Ускорение кодирования видео доступно в этих сценариях без необходимости использования решений для конкретной платформы.

API мультимедиа

Возможности кодирования видео на низком уровне абстракции и переносимым образом доступны для всех производителей оборудования. Эта доступность позволяет api-интерфейсам мультимедиа более высокого уровня (например, Media Foundation) создавать их уровни мультимедиа на основе этого API, который заботится об абстрагации различных аппаратных платформ. Учитывая низкоуровневую структуру API, эти более высокоуровневые мультимедийные элементы могут оптимизировать свою работу для конкретных сценариев, имея детальный контроль над аспектами синхронизации и распределения/распределённости памяти в сеансе видеокодирования, такими как полный контроль над управлением эталонными кадрами и ответственностью за запись заголовков битового потока. Эта смена обязанностей на уровень, сидящий над этим API, также позволяет поставщикам оборудования иметь согласованный набор политик кодирования (например, эвристики DPB, например адаптивные GOP) на уровне мультимедиа, который можно повторно использовать на разных аппаратных платформах.

Взаимодействие с графикой D3D, вычислениями и машинным обучением

API кодирования видео D3D12 позволяет эффективно взаимодействовать между видеокодированием D3D12 и сценариями D3D12, вычислений и машинного обучения. Это взаимодействие интересно для таких сценариев, как вывод машинного обучения в потоке камеры.

Сценарии потоковой передачи игр

API кодирования видео D3D12 открывает возможности для сценариев потоковой передачи игр, требующих использования высокопроизводительного API с низким уровнем.