D3D12 AV1 비디오 인코딩
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_0095_AV1 D3D12DDI_VIDEO_ENCODER_CODEC_0080 추가됨
드라이버에서 지원하는 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
pAV1Support가 D3D12DDI_VIDEO_ENCODER_CODEC_CONFIGURATION_SUPPORT_0083_0 추가된 D3D12DDI_VIDEO_ENCODER_AV1_CODEC_CONFIGURATION_SUPPORT
D3D12DDI_VIDEO_ENCODER_AV1_FRAME_TYPE_0095 및 D3D12DDI_VIDEO_ENCODER_AV1_FRAME_TYPE_0095_FLAGS
pAV1Support가 D3D12DDI_VIDEO_ENCODER_CODEC_PICTURE_CONTROL_SUPPORT_0080_2 추가된 D3D12DDI_VIDEO_ENCODER_CODEC_AV1_PICTURE_CONTROL_SUPPORT_0095
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 추가 됨
확장된 D3D12DDICAPS_TYPE_VIDEO_0096_ENCODER_SUPPORT1 쿼리 상한과 함께 사용할 D3D12DDI_VIDEO_ENCODER_VALIDATION_FLAGS_0080 D3D12DDI_VIDEO_ENCODER_VALIDATION_FLAG_0080_SUBREGION_LAYOUT_MODE_NOT_SUPPORTED 플래그가 추가됩니다.
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 타일로 인코딩된 프레임이 지정된 경우 드라이버는 EncodeFrame 인수의 요청된 타일에 해당하는 압축 비트스트림에 K decode_tile() AV1 구문 요소를 씁니다.
그런 다음 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 콜백을 업데이트해야 합니다.