Direct3D12 비디오 인코딩 기능은 Windows 11 버전 24H2(WDDM 3.2)부터 AV1 인코딩을 지원하도록 확장되었습니다. 이 문서에서는 기존 D3D12 비디오 인코딩 DDI에서 AV1 인코딩을 지원하기 위해 수정 및 새 구조가 필요한 확장 지점을 설명합니다. 애플리케이션 수준 세부 정보를 비롯한 자세한 내용은 AV1 D3D12 비디오 인코딩 사양을 참조하세요.
속도 제어를 위한 확장
다음 기존 열거형은 속도 제어 및 속도 제어 지원을 위한 확장으로 업데이트됩니다.
속도 제어 지원 플래그가 D3D12DDI_VIDEO_ENCODER_SUPPORT_FLAGS_0083_0 추가됨
속도 제어 플래그가 D3D12DDI_VIDEO_ENCODER_RATE_CONTROL_FLAGS_0080 추가됨
다음 확장(확장 1) D3D12DDI_VIDEO_ENCODER_RATE_CONTROL_XXX1 구조체가 추가되며, D3D12DDI_VIDEO_ENCODER_RATE_CONTROL_CONFIGURATION_PARAMS에 포함되도록 업데이트됩니다. QualityVsSpeed 가 모든 모드에 추가되고 VBVCapacity 및 InitialVBVFullness 가 _QVBR1 추가됩니다.
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 비디오 인코딩 지원을 쿼리하고 보고하는 데 사용되는 추가되거나 업데이트된 구조 및 열거형을 나열합니다.
D3D12DDI_FEATURE_VERSION_VIDEO_0095_0 Windows 11 버전 24H2(WDDM 3.2)에서 도입된 모든 D3D12 비디오 인코딩 마일스톤의 최소 구현을 정의하는 버전 번호입니다.
D3D12DDICAPS_TYPE_VIDEO_0020 열거형은 다음 비디오 인코딩 지원 값을 포함하도록 확장되었습니다.
- D3D12DDICAPS_TYPE_VIDEO_0095_ENCODER_FRAME_SUBREGION_LAYOUT_CONFIG
- D3D12DDICAPS_TYPE_VIDEO_0096_ENCODER_SUPPORT1
D3D12DDI_VIDEO_ENCODER_CODEC_0080D3D12DDI_VIDEO_ENCODER_CODEC_0095_AV1 추가됨
드라이버에서 지원하는 AV1 프로필을 정의하기 위해 D3D12DDI_VIDEO_ENCODER_AV1_PROFILE_0095 열거형이 추가되었습니다. 드라이버는 D3D12DDICAPS_VIDEO_ENCODER_INPUT_FORMAT_DATA_0080_2 사용하여 지정된 D3D12DDI_VIDEO_ENCODER_AV1_PROFILE_0095 입력에 대해 선택적으로 지원되는 형식을 쿼리에 보고합니다.
D3D12DDI_VIDEO_ENCODER_PROFILE_DESC_0080_2 AV1 프로필(pAV1Profile)을 포함하도록 업데이트됩니다.
AV1 인코딩을 지원하도록 다음 구조 및 열거형이 추가되거나 확장됩니다.
D3D12DDI_VIDEO_ENCODER_AV1_LEVEL_TIER_CONSTRAINTS_0095 (pAV1LevelSetting 이 D3D12DDI_VIDEO_ENCODER_LEVEL_SETTING_0080_2 추가됨)
D3D12DDI_VIDEO_ENCODER_FRAME_SUBREGION_LAYOUT_MODE_0080가 D3D12DDI_VIDEO_ENCODER_FRAME_SUBREGION_LAYOUT_MODE_0095_UNIFORM_GRID_PARTITION 및 D3D12DDI_VIDEO_ENCODER_FRAME_SUBREGION_LAYOUT_MODE_0095_CONFIGURABLE_GRID_PARTITION을 포함하도록 확장됩니다.
D3D12DDI_VIDEO_ENCODER_MOTION_ESTIMATION_PRECISION_MODE_EIGHTH_PIXEL_0095가 D3D12DDI_VIDEO_ENCODER_MOTION_ESTIMATION_PRECISION_MODE_0080에 추가됩니다.
D3D12DDI_VIDEO_ENCODER_AV1_TX_MODE_0095 및 D3D12DDI_VIDEO_ENCODER_AV1_TX_MODE_0095_FLAGS
D3D12DDI_VIDEO_ENCODER_AV1_INTERPOLATION_FILTERS_0095 및 D3D12DDI_VIDEO_ENCODER_AV1_INTERPOLATION_FILTERS_0095_FLAGS
D3D12DDI_VIDEO_ENCODER_AV1_SEGMENTATION_MODE_0095 및 D3D12DDI_VIDEO_ENCODER_AV1_SEGMENTATION_MODE_0095_FLAGS
D3D12DDI_VIDEO_ENCODER_AV1_REFERENCE_WARPED_MOTION_TRANSFORMATION_0095 및 D3D12DDI_VIDEO_ENCODER_AV1_REFERENCE_WARPED_MOTION_TRANSFORMATION_0095_FLAGS
D3D12DDI_VIDEO_ENCODER_AV1_CODEC_CONFIGURATION_SUPPORT에, pAV1Support가 D3D12DDI_VIDEO_ENCODER_CODEC_CONFIGURATION_SUPPORT_0083_0에 추가된
D3D12DDI_VIDEO_ENCODER_AV1_FRAME_TYPE_0095 및 D3D12DDI_VIDEO_ENCODER_AV1_FRAME_TYPE_0095_FLAGS
D3D12DDI_VIDEO_ENCODER_CODEC_AV1_PICTURE_CONTROL_SUPPORT_0095에 pAV1Support이 D3D12DDI_VIDEO_ENCODER_CODEC_PICTURE_CONTROL_SUPPORT_0080_2로 추가됨.
D3D12DDI_VIDEO_ENCODER_AV1_FRAME_SUBREGION_LAYOUT_CONFIG_SUPPORT_0095 및 D3D12DDI_VIDEO_ENCODER_AV1_FRAME_SUBREGION_LAYOUT_CONFIG_VALIDATION_0095_FLAGS
D3D12DDI_FEATURE_DATA_VIDEO_ENCODER_FRAME_SUBREGION_LAYOUT_CONFIG_0095 및 D3D12DDI_VIDEO_ENCODER_FRAME_SUBREGION_LAYOUT_CONFIG_SUPPORT_0095
pAV1Config가 D3D12DDI_VIDEO_ENCODER_CODEC_CONFIGURATION_0082_0 추가됨
D3D12DDI_VIDEO_ENCODER_VALIDATION_FLAG_0080_SUBREGION_LAYOUT_MODE_NOT_SUPPORTED 플래그가 D3D12DDI_VIDEO_ENCODER_VALIDATION_FLAGS_0080에 추가되어 확장된 D3D12DDICAPS_TYPE_VIDEO_0096_ENCODER_SUPPORT1 쿼리 캡과 함께 사용됩니다.
D3D12DDICAPS_VIDEO_ENCODER_SUPPORT1_DATA_0096 구조의 맨 아래에 추가된 매개 변수를 사용하여 이전 D3D12DDICAPS_VIDEO_ENCODER_SUPPORT_DATA_0083_0 쿼리를 확장하기 위해 추가됩니다. 이 확장 쿼리는 모든 H264, HEVC 및 AV1 코덱과 함께 사용할 수 있으며 D3D12_FEATURE_VIDEO_ENCODER_SUPPORT 의미 체계와 정확히 일치해야 합니다.
D3D12DDI_VIDEO_ENCODER_RESOLUTION_SUPPORT_LIMITS_0080_2의 MaxSubregionsNumber, SubregionBlockPixelsSize, 및 QPMapRegionPixelsSize 멤버의 의미 체계가 AV1을 위해 업데이트되었습니다.
_D3D12DDI_VIDEO_ENCODER_AV1_SEQUENCE_STRUCTURE_0095 추가되고 pAV1SequenceStructure 가 D3D12DDI_VIDEO_ENCODER_SEQUENCE_GOP_STRUCTURE_0082_0 추가됩니다.
인코딩 작업
AV1에 대한 예상 비트스트림 헤더 값
드라이버/호스트 헤더 코딩 책임
K 타일이 포함된 인코딩된 프레임이 지정된 경우 드라이버는 압축된 비트스트림에 K decode_tile() AV1 구문 요소를 작성하며, 이 요소는 EncodeFrame 인수의 요청된 타일에 해당합니다.
API 클라이언트는 그런 다음 tile_start_and_end_present_flag/tg_start/tg_end 요소를 사용하여 tile_group_obu() AV1 구문 요소를 작성한 후, 타일을 원하는 대로 타일 그룹으로 정렬해야 하며, 이때 타일은 순차적으로 배치되어야 합니다. 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)로 유추하고, 필요한 경우 open_bitstream_unit() 내에서 temporal_id와 spatial_id를 코딩할 책임이 있습니다.
EncodeFrame 제출은 D3D12 인코딩 API에 구현된 다른 코덱과 마찬가지로 인코딩 순서로 제공됩니다.
해상도 변경 및 공간 확장성
드라이버가 D3D12_VIDEO_ENCODER_SUPPORT_FLAG_RESOLUTION_RECONFIGURATION_AVAILABLE를 보고하는 경우라 해도, 여전히 키 프레임의 해상도 변경에만 적용됩니다.
활성 시퀀스 헤더에는 사용 중인 연결된 ID3D12VideoEncoderHeap에 있는 최대 해상도로 설정된 max_frame_*_minus_1 구문이 있어야 합니다. 연결된 ID3D12VideoEncoderHeap에 있는 해상도를 사용하는 다른 프레임은 frame_size()의 AV1 구문 frame_size_override_flag 사용하여 해상도 변경을 전달할 수 있습니다.
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 품질과 속도 조정에 적용되며, 다양한 속도 제어 모드의 속도 제어 매개 변수인 CBR, VBR 및 QVBR의 일정한 QP, 비트 전송률 및 품질 수준에 적용됩니다. 드라이버는 지원되지 않는 다른 속도 제어 매개 변수 재구성에 대해 D3D12DDI_VIDEO_ENCODER_OUTPUT_METADATA_0083_0.EncodeErrorFlags 에서 D3D12DDI_VIDEO_ENCODER_ENCODE_ERROR_FLAG_0082_0_RECONFIGURATION_REQUEST_NOT_SUPPORTED를 반환할 수 있습니다.
인코딩 작업 API
AV1 인코딩 작업을 지원하기 위해 확장으로 다음 구조 및 열거형이 추가되거나 업데이트됩니다.
D3D12DDI_VIDEO_ENCODER_AV1_REFERENCE_PICTURE_WARPED_MOTION_INFO_0095
D3D12DDI_VIDEO_ENCODER_AV1_REFERENCE_PICTURE_DESCRIPTOR_0095
D3D12DDI_VIDEO_ENCODER_CODEC_AV1_LOOP_FILTER_DELTA_CONFIG_0095
D3D12DDI_VIDEO_ENCODER_CODEC_AV1_QUANTIZATION_DELTA_CONFIG_0095
pAV1PicData가 D3D12DDI_VIDEO_ENCODER_PICTURE_CONTROL_CODEC_DATA_0082_0 추가됨
D3D12DDI_VIDEO_ENCODER_AV1_PICTURE_CONTROL_SUBREGIONS_LAYOUT_DATA_TILES_0095
pTilesPartition_AV1이 D3D12DDI_VIDEO_ENCODER_PICTURE_CONTROL_SUBREGIONS_LAYOUT_DATA_0080_2에 추가되었습니다.
또한, AV1 인코딩을 위해 도입된 AV1 전용 분석 버퍼 레이아웃을 처리할 수 있도록 드라이버의 기존 PFND3D12DDI_VIDEO_ENCODE_RESOLVE_OUTPUT_METADATA_0082_0 콜백을 업데이트해야 합니다.