本文提供驅動程式開發人員的 Direct3D12 視訊編碼功能的一般資訊。 如需詳細資訊,包括應用程式層級的詳細資料,請參閱 D3D 視訊編碼規格。
關於 Direct3D 12 視訊編碼
在 Windows 11 (WDDM 3.0) 之前,DirectX 12 提供了應用程式和驅動程式層級介面(API 和 DDI),以支援多個視訊應用程式的 GPU 加速,包括視訊解碼、視訊處理和運動估計。
從 Windows 11 開始,D3D12 會將視訊編碼功能新增至現有的視訊 API/DDI 系列。 此功能提供一組一致的編碼 API/DIS,與現有的 D3D12 架構一致,並允許開發人員使用 GPU 加速視訊引擎執行視訊編碼。
視訊編碼架構可讓您存取視訊編碼器硬體加速功能。 它可以用於物聯網(IoT)、雲端、媒體API、機器學習(ML)和遊戲串流等不同場景。
Windows 11 版本 24H2 (WDDM 3.2) 中新增了對 AV1 編碼的支援。 如需詳細資訊,請參閱 D3D12 AV1 視訊編碼。
支援的編解碼器
從 Windows 11 開始,支援的編解碼器是 H.264 和 HEVC,不過 D3D12 視訊編碼架構為較新的編解碼器 (例如 AV1) 提供開放的擴充性。
框架介面的編解碼器特定層面會委派給編解碼器特定結構及其對聯合類型的存取。 例如, 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 回呼來查詢視訊編碼支援。
支援視訊編碼的驅動程式會為 D3D 執行階段提供 D3D12DDI_DEVICE_FUNCS_VIDEO_0082_0 結構中其視訊編碼回呼函式的指標。
D3D12 視訊編碼回呼函式
驅動程式會實作下列回呼函式,以支援 D3D12 視訊編碼。
建立代表視訊編碼器的驅動程式物件:
PFND3D12DDI_CALCPRIVATEVIDEOENCODERSIZE_0082_0 會計算 D3D 執行階段需要配置給驅動程式物件的記憶體數量。
PFND3D12DDI_CREATEVIDEOENCODER_0082_0 會建立實際的視訊編碼器物件,以保存視訊編碼會話的狀態。
建立代表視訊編碼器堆積的驅動程式物件:
PFND3D12DDI_CALCPRIVATEVIDEOENCODERHEAPSIZE_0080_2 會計算 D3D 執行階段需要配置給驅動程式物件的記憶體數量。
PFND3D12DDI_CREATEVIDEOENCODERHEAP_0080_2 會建立視訊編碼器堆積物件,其中包含解析度相依的驅動程式資源和狀態。
對框架進行編碼:
PFND3D12DDI_VIDEO_ENCODE_FRAME_0082_0 會將編碼框架作業記錄到命令清單。
在編碼作業之後,也必須呼叫 PFND3D12DDI_VIDEO_ENCODE_RESOLVE_OUTPUT_METADATA_0082_0 ,才能將編碼作業的輸出中繼資料解析為可讀取的格式。 驅動程式中解析後的中繼資料版面配置類似於 規格中圖表所示的範例。
銷毀視訊編碼器和相關的堆:
測試
下列測試包含在 Windows 硬體實驗室套件 (WHLK) 中。 詳情請參閱 WHLK。
| 測試名稱 | 說明 |
|---|---|
| CreateVideoEncoder | 根據報告的 CheckFeatureSupport 相關案例,確認 VideoEncoder/VideoEncoderHeap 的正確建立。 |
| 單一編碼 H264/HEVC | 基於 QR 碼的基本結構影像檢查測試。 輸入圖像序列使用預定義的 QR 內容進行標記,然後進行編碼和解碼。 最後,檢查輸出值(以及某種程度上的品質)以確保它們符合預期。 |
| H264/HEVC 編碼配置層級建議 | 驗證 D3D12_FEATURE_DATA_VIDEO_ENCODER_SUPPORT 的 SuggestedProfile/Level 值是否符合預期,基於 H.264/HEVC 規格和傳入 D3D12_FEATURE_DATA_VIDEO_ENCODER_SUPPORT 的配置。 |
| EncodeHeapSizeCap | 驗證不同輸入引數對記憶體使用量增加的影響。 |
| SimpleGOPEncodeH264/HEVC(10位元) | 使用不同的解析度、GOP 模式、切片模式和其他編解碼器組態對輸入視訊進行轉碼,並根據輸入視訊串流差異驗證輸出編碼視訊是否可接受。 此比較是使用峰值信噪比 (PSNR) 完成的。 |
| 編碼子區域/解析度重新設定 | 驗證即時重新設定。 |
| 編碼H264長期參考文獻 | 驗證長期圖像參考的使用。 |
| 編碼 IntraRefresh | 驗證使用開放 IPP...P...P... GOP 格式進行內部重新整理的簡單案例。 |
| VideoEncodeCommandList功能 | 驗證影片編碼命令清單中的預測條件和標記。 |
| VideoEncode時間戳記 | 驗證視訊編碼命令清單的時間戳記。 |
視訊編碼案例
OneCore
D3D12 視訊編碼支援可在只有 D3D12 可用的平臺上啟用可攜式硬體加速視訊編碼。 這些平臺包括雲端運算和 IoT 平臺所使用的各種 OneCore SKU。 視訊編碼加速可在這些案例中使用,而不需要使用特定於平臺的解決方案。
媒體 API
所有硬體廠商都可以存取低階且可攜式方式的視訊編碼功能。 此可及性允許更高層級的媒體 API(例如 Media Foundation)可以在此 API 之上建構其媒體層,從而抽象化不同的硬體平臺。 鑑於 API 的低階設計,這些較高層級的媒體層可以透過對視訊編碼會話的同步處理和記憶體配置/駐留方面進行細緻控制,例如完全控制參考圖片管理和位流標頭寫入責任,針對其情境進行優化。 這種將責任轉移到位於此 API 之上的層也允許硬體供應商在媒體層中擁有一組一致的編碼策略(例如,DPB 啟發式方法,例如自適應 GOP),這些策略可以在不同的硬體平台上重複使用。
與 D3D 圖形、計算和機器學習的互通性
D3D12 視訊編碼 API 可在 D3D12 視訊編碼與 D3D12 圖形、計算和 ML 案例之間提供有效率的互通性。 這種互通性對於在相機串流上執行 ML 推論等案例很有趣。
遊戲串流案例
D3D12 視訊編碼 API 可啟用需要高效能低階 API 的遊戲串流案例。