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


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

Функция кодирования видео Direct3D12 расширена для поддержки кодирования AV1, начиная с Windows 11 версии 24H2 (WDDM 3.2). В этой статье описываются точки расширения, где существующий DDI видеокодирования D3D12 нуждается в изменениях и новых структурах для поддержки кодирования 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() окружён элементами open_bitstream_unit типа OBU_TILE_GROUP и к нему добавляется в начале 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:

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