D3D12 視訊編碼
本文提供驅動程式開發人員有關 Direct3D12 視訊編碼功能的一般資訊。 如需其他資訊,包括應用層級細節,請參閱 D3D 視訊編碼規格。
關於 Direct3D 12 視訊編碼
在 Windows 11 (WDDM 3.0) 之前,DirectX 12 提供應用程式和驅動程式層級介面(API 和 DIS),以支援數個視訊應用程式的 GPU 加速,包括視訊譯碼、視訊處理和動作估計。
從 Windows 11 開始,D3D12 會將視訊編碼功能新增至現有的影片 API/DDI 系列。 此功能提供一組一致的編碼 API/DIS,與現有的 D3D12 架構一致,並允許開發人員使用 GPU 加速視訊引擎執行視訊編碼。
影片編碼架構可讓您存取視訊編碼硬體加速功能,以用於不同的案例,例如物聯網(IoT)、雲端、媒體 API、機器學習和遊戲串流。
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_VIDEO_ENCODE_RESOLVE_OUTPUT_METADATA_0082_0 ,才能將編碼作業的輸出元數據解析為可讀取的格式。 驅動程式已解析元數據的配置類似於規格中圖表中顯示的範例。
終結視訊編碼器和相關聯的堆積:
測試
下列測試包含在 Windows 硬體實驗室套件 (WHLK) 中。 如需詳細資訊,請參閱 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(10bit) | 使用不同解析度、GOP 模式、配量模式和其他編解碼器組態來轉碼輸入視訊,並針對輸入視訊串流差異驗證輸出編碼視訊的差異。 這項比較是使用尖峰訊號與雜訊比率 (PSNR) 來完成。 |
EncodeSubregions/ResolutionReconfiguration | 驗證即時重新設定。 |
EncodeH264LongTermReferences | 驗證長期圖片參考的使用。 |
EncodeIntraRefresh | 使用開啟的 IPP 驗證內部重新整理的簡單案例...P。。。P。。。共和黨。 |
VideoEncodeCommandListFeatures | 驗證視訊編碼命令清單的述詞和標記。 |
VideoEncodeTimestamps | 驗證視訊編碼命令清單的時間戳。 |
視訊編碼案例
OneCore
D3D12 視訊編碼支援可在只有 D3D12 的平臺上啟用可攜式硬體加速視訊編碼。 這包括雲端計算和IoT平臺所使用的各種 OneCore SKU。 視訊編碼加速可在這些案例中使用,而不需要使用平臺特定解決方案。
媒體 API
所有硬體廠商都能以低階和可攜式方式存取視訊編碼功能。 這可讓較高層級的媒體 API(例如媒體基礎)在此 API 之上建置其媒體層,以負責抽象化不同的硬體平臺。 鑒於 API 的低階設計,這些較高層級的媒體層可以透過精細控制視訊編碼會話的同步處理和記憶體配置/落地層面,例如完全控制參考圖片管理和位流標頭寫入責任,來優化其案例。 此責任轉移至位於此 API 上方的層,也允許硬體廠商有一組一致的編碼原則(例如。媒體層中的 DPB 啟發學習法,例如可跨不同硬體平臺重複使用的調適型 GOP。
與 D3D 圖形、計算和機器學習的互操作性
D3D12 視訊編碼 API 可讓您在 D3D12 視訊編碼與 D3D12 圖形、計算和機器學習案例之間有效率的互操作性,這對於在相機串流上執行機器學習推斷等案例很有趣。
遊戲串流案例
D3D12 視訊編碼 API 可讓需要高效能低階 API 的遊戲串流案例。