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


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

Функция кодирования видео Direct3D12 расширена для поддержки кодирования AV1, начиная с Windows 11 версии 24H2 (WDDM 3.2). В этой статье описываются точки расширения, в которых существующий D3D12 Видеокодирование DDI нуждается в изменениях и новых структурах для поддержки кодирования AV1. Дополнительные сведения, включая особенности уровня приложения, см . в спецификации кодирования видео AV1 D3D12.

Расширения для управления скоростью

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

Если включена D3D12DDI_VIDEO_ENCODER_RATE_CONTROL_FLAG_0096_ENABLE_EXTENSION1_SUPPORT, в D3D12DDI_VIDEO_ENCODER_RATE_CONTROL_CONFIGURATION_PARAMS_0080_2.pConfiguration_XXX используются структуры расширенной скорости; в противном случае устаревшие структуры используются при отключении таблицы, описанной на странице ссылки D3D12DDI_VIDEO_ENCODER_RATE_CONTROL_FLAGS_0080.

Расширения поддержки кодирования видео

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

Операция кодирования

Ожидаемые значения заголовка битового потока для AV1

Обязанности по кодированию заголовка драйвера и узла

Учитывая закодированный кадр с плитками K, драйвер записывает элементы синтаксиса K decode_tile() AV1 в сжатый битовый поток, соответствующий запрошенным плиткам в аргументах EncodeFrame .

Затем клиент API создает элементы синтаксиса AV1 tile_group_obu() с элементами tile_start_and_end_present_flag/tg_start/tg_end, чтобы упорядочить плитки в группы плиток по желанию с условием, что плитки помещаются последовательно. Элемент tile_size_minus_1 закодирован из связанной плитки D3D12_VIDEO_ENCODER_FRAME_SUBREGION_METADATA сведения и элементы decode_tile () копируются из сжатого буфера битового потока. Наконец, каждый tile_group_obu() упаковывается вокруг элементов типа OBU_TILE_GROUP() open_bitstream_unit и предустановлен с помощью OBU_FRAME_HEADER. Для одной группы плиток вместо этого можно использовать тип OBU_FRAME.

Клиент API отвечает за вывод obu_extension_flag как !(TemporalLayerIndexPlus1 || SpatialLayerIndexPlus1) для текущего кадра, так и кода при необходимости temporal_id и spatial_id в open_bitstream_unit().

Отправки EncodeFrame находятся в порядке кодирования, как и другие кодеки, реализованные в API кодирования D3D12.

Изменения в разрешении и пространственной масштабируемости

Если драйвер сообщает D3D12_VIDEO_ENCODER_SUPPORT_FLAG_RESOLUTION_RECONFIGURATION_AVAILABLE, он по-прежнему применяется только к изменениям разрешения в ключевом кадре.

Заголовок активной последовательности должен иметь синтаксис max_frame_*_minus_1 для максимального разрешения, присутствующих в используемом файле ID3D12VideoEncoderHeap. Различные кадры, использующие разрешения, также присутствуют в связанном идентификаторе ID3D12VideoEncoderHeap, могут использовать синтаксис AV1 frame_size_override_flag в frame_size() для передачи изменений разрешения.

Если D3D12_VIDEO_ENCODER_AV1_FRAME_TYPE_FLAG_SWITCH_FRAME поддерживается, то ссылочные кадры должны указывать на более высокое или равное разрешение, чем текущий кадр коммутатора, а различные разрешения должны присутствовать в используемом идентификаторе ID3D12VideoEncoderHeap.

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

Заметки по управлению скоростью

Допустимый диапазон для D3D12DDI_VIDEO_ENCODER_RATE_CONTROL_QVBR1_0096.ConstantQualityTarget равен [0..63]. Наименьшее значение дает наивысшее качество.

Как правило, D3D12DDI_VIDEO_ENCODER_SUPPORT_FLAG_0083_0_RATE_CONTROL_RECONFIGURATION_AVAILABLE применяется к качеству и скорости настройки и следующим параметрам управления скоростью различных режимов управления скоростью: QP в константном QP, скорости и уровнях качества в CBR, VBR и QVBR. Драйвер может возвращать D3D12DDI_VIDEO_ENCODER_ENCODE_ERROR_FLAG_0082_0_RECONFIGURATION_REQUEST_NOT_SUPPORTED в D3D12DDI_VIDEO_ENCODER_OUTPUT_METADATA_0083_0.EncodeErrorFlags для перенастройки других неподдерживаемых параметров управления скоростью.

API операций кодирования

Следующие структуры и перечисления добавляются или обновляются с расширениями для поддержки операции кодирования AV1:

Кроме того, для обработки разрешенного макета буфера AV1, добавленного для кодирования AV1, необходимо обновить существующий PFND3D12DDI_VIDEO_ENCODE_RESOLVE_OUTPUT_METADATA_0082_0 обратного вызова драйвера.