D3D12 비디오 인코딩

이 페이지에서는 Direct3D12 비디오 인코딩 기능에 대한 드라이버 개발자를 위한 일반 정보를 제공합니다. 애플리케이션 수준 세부 정보를 포함한 추가 정보는 D3D 비디오 인코딩 사양을 참조하세요.

Direct3D 12 비디오 인코딩 정보

Windows 11(WDDM 3.0)에 앞서 DirectX 12는 비디오 디코딩, 비디오 처리 및 동작 추정을 비롯한 여러 비디오 애플리케이션에 대한 GPU 가속을 지원하기 위해 API 및 DDI(애플리케이션 및 드라이버 수준 인터페이스)를 제공했습니다.

Windows 11 D3D12는 기존 비디오 API/DDI 제품군에 비디오 인코딩 기능을 추가했습니다. 이 기능은 기존 D3D12 프레임워크와 일치하는 일관된 인코딩 API/DDI 집합을 제공하며 개발자가 GPU 가속 비디오 엔진을 사용하여 비디오 인코딩을 수행할 수 있도록 합니다.

비디오 인코딩 프레임워크는 IoT(사물 인터넷), 클라우드, 미디어 API, 기계 학습 및 게임 스트리밍과 같은 다양한 시나리오에 대한 비디오 인코딩 하드웨어 가속 기능에 대한 액세스를 제공합니다.

지원되는 코덱

D3D12 비디오 인코딩 프레임워크는 AV1과 같은 최신 코덱에 대해 개방형 확장성을 제공하지만 Windows 11 지원되는 코덱은 H.264 및 HEVC입니다.

프레임워크 인터페이스의 코덱별 측면은 코덱별 구조체 및 공용 구조체 형식에 대한 액세스 권한으로 위임됩니다. 예를 들어 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 Windows 11 도입된 모든 D3D12 비디오 인코딩 마일스톤의 첫 번째 전체 구현을 정의하는 버전 번호입니다.

  • 다음 비디오 인코딩 지원 값을 포함하도록 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 콜백을 호출하여 비디오 인코딩 지원을 쿼리합니다.

  • 비디오 인코딩을 지원하는 드라이버는 D3D12DDI_DEVICE_FUNCS_VIDEO_0082_0 구조의 비디오 인코딩 콜백 함수에 대한 포인터를 D3D 런타임에 제공합니다.

D3D12 비디오 인코딩 콜백 함수

드라이버는 D3D12 비디오 인코딩을 지원하기 위해 다음 콜백 함수를 구현합니다.

테스트

다음 테스트는 WHLK(Windows Hardware Lab Kit)의 일부로 포함됩니다. 자세한 내용은 WHLK를 참조하세요.

테스트 이름 설명
CreateVideoEncoder 보고된 CheckFeatureSupport 관련 사례를 기반으로 VideoEncoder/VideoEncoderHeap 만들기의 유효성을 검사합니다.
SingleEncodeH264/HEVC 구조적 이미지 기본 검사에 대한 QR 코드 기반 테스트입니다. 입력 이미지 시퀀스는 미리 정의된 QR 콘텐츠로 스탬프를 찍은 다음 인코딩 및 디코딩되고 마지막으로 출력 값(그리고 어느 정도 품질)이 필요한지 확인합니다.
EncodeProfileLevelSuggestionsH264/HEVC D3D12_FEATURE_DATA_VIDEO_ENCODER_SUPPORT 유효성을 검사합니다. SuggestedProfile/Level 값은 H.264/HEVC 사양 및 D3D12_FEATURE_DATA_VIDEO_ENCODER_SUPPORT 입력으로 전달된 구성에 따라 예상대로 표시됩니다.
EncodeHeapSizeCap 입력 인수가 증가하는 다른 메모리 공간의 유효성을 검사합니다.
SimpleGOPEncodeH264/HEVC(10비트) 다양한 해상도, GOP 패턴, 조각 모드 및 기타 코덱 구성을 사용하여 입력 비디오를 트랜스코딩하고 입력 비디오 스트림 차이에 대해 출력 인코딩 비디오의 유효성을 검사합니다. 이 비교는 PSNR(최고 신호 대 노이즈 비율)을 사용하여 수행됩니다.
EncodeSubregions/ResolutionReconfiguration 즉석 재구성의 유효성을 검사합니다.
EncodeH264LongTermReferences 장기 그림 참조의 사용 유효성을 검사합니다.
EncodeIntraRefresh 열린 IPP를 사용하여 새로 고침 내의 간단한 시나리오의 유효성을 검사합니다... P... P... 공화당.
VideoEncodeCommandListFeatures 비디오 인코딩 명령 목록에 대한 조건자 및 표식의 유효성을 검사합니다.
VideoEncodeTimestamps 비디오 인코딩 명령 목록에 대한 타임스탬프의 유효성을 검사합니다.

비디오 인코딩 시나리오

OneCore

D3D12 비디오 인코딩 지원을 사용하면 D3D12만 사용할 수 있는 플랫폼에서 휴대용 하드웨어 가속 비디오 인코딩을 사용할 수 있습니다. 여기에는 클라우드 컴퓨팅 및 IoT 플랫폼에서 사용하는 다양한 OneCore SKU가 포함됩니다. 비디오 인코딩 가속은 플랫폼별 솔루션을 사용할 필요 없이 이러한 시나리오에서 사용할 수 있습니다.

미디어 API

모든 하드웨어 공급업체에서 낮은 수준의 이식 가능한 방식으로 비디오 인코딩 기능에 액세스할 수 있습니다. 이렇게 하면 더 높은 수준의 미디어 API(예: Media Foundation)가 다양한 하드웨어 플랫폼을 추상화할 수 있는 이 API를 기반으로 미디어 계층을 빌드할 수 있습니다. API의 낮은 수준의 디자인을 고려할 때 이러한 상위 수준 미디어 계층은 참조 사진 관리 및 비트스트림 헤더 쓰기 책임을 완전히 제어하는 등 비디오 인코딩 세션의 동기화 및 메모리 할당/상주 측면을 세분화하여 시나리오에 최적화할 수 있습니다. 또한 이 API 위에 있는 계층으로 책임을 전환하면 하드웨어 공급업체가 일관된 인코딩 정책 집합(예: )을 가질 수 있습니다. 다양한 하드웨어 플랫폼에서 재사용할 수 있는 미디어 계층의 적응형 GOP와 같은 DPB 추론입니다.

D3D 그래픽, 컴퓨팅 및 기계 학습과의 상호 운용성

D3D12 비디오 인코딩 API를 사용하면 D3D12 비디오 인코딩과 D3D12 그래픽, 컴퓨팅 및 기계 학습 시나리오 간의 효율적인 상호 운용성을 사용할 수 있으며, 이는 카메라 스트림을 통해 기계 학습 유추를 실행하는 등의 시나리오에 흥미롭습니다.

게임 스트리밍 시나리오

D3D12 비디오 인코딩 API를 사용하면 높은 성능의 낮은 수준 API가 필요한 게임 스트리밍 시나리오를 사용할 수 있습니다.