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


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

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

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

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

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

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

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

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

Начиная с 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_CALCPRIVATEVIDEOENCODERSIZE_0082_0 вычисляет объем памяти, необходимой среде выполнения D3D для объекта драйвера.

    • PFND3D12DDI_CREATEVIDEOENCODER_0082_0 создает фактический объект кодировщика видео, содержащий состояние сеанса кодирования видео.

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

    • PFND3D12DDI_CALCPRIVATEVIDEOENCODERHEAPSIZE_0080_2 вычисляет объем памяти, необходимой среде выполнения D3D для объекта драйвера.

    • PFND3D12DDI_CREATEVIDEOENCODERHEAP_0080_2 создает объект кучи видеокодировщика, содержащий ресурсы драйвера, зависящие от разрешения, и состояние.

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

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

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

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

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

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

OneCore

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

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

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

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

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

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

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