次の方法で共有


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、機械学習 (ML)、ゲーム ストリーミングなど、さまざまなシナリオで使用できます。

AV1 エンコードのサポートは、Windows 11 バージョン 24H2 (WDDM 3.2) で追加されました。 詳細については、「 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 ビデオ エンコードをサポートするために、次のコールバック関数を実装します。

テスティング

次のテストは、 Windows ハードウェア ラボ キット (WHLK) の一部として含まれています。 詳細については WHLK を参照してください。

テスト名 説明
CreateVideoEncoder 報告された CheckFeatureSupport 関連のケースに基づいて、VideoEncoder/VideoEncoderHeap の作成を検証します。
SingleEncodeH264/HEVC 構造イメージの基本チェックのための QR コード ベースのテスト。 入力画像シーケンスには、定義済みの QR コンテンツがスタンプされ、エンコードおよびデコードされます。 最後に、出力値 (およびある程度は品質) がチェックされ、期待どおりであることを確認します。
EncodeProfileLevelSuggestionsH264/HEVC (エンコードプロファイルレベルの提案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) を使用して行われます。
EncodeSubregions/ResolutionReconfiguration その場で再構成を検証します。
EncodeH264LongTermReferences 長期的な画像参照の使用を検証します。
EncodeIntraRefresh オープン IPP...P...P...GOP を使用して、イントラリフレッシュの単純なシナリオを検証します。
ビデオエンコードコマンドリスト機能 ビデオ エンコード コマンド リストのプレディケーションとマーカーを検証します。
ビデオエンコードタイムスタンプ ビデオ エンコード コマンド リストのタイムスタンプを検証します。

ビデオ エンコードのシナリオ

OneCore

D3D12 ビデオ エンコードのサポートにより、D3D12 のみが使用可能なプラットフォームで、ハードウェアで高速化されたポータブル ビデオ エンコードが可能になります。 これらのプラットフォームには、クラウド コンピューティングと IoT プラットフォームで使用されるさまざまな OneCore SKU が含まれます。 ビデオ エンコード アクセラレーションは、プラットフォーム固有のソリューションを使用する必要なく、これらのシナリオで使用できます。

メディア API

低レベルでポータブルな方法で、すべてのハードウェア ベンダーでビデオエンコード機能にアクセス可能です。 このアクセシビリティにより、より高いレベルのメディア API (Media Foundation など) は、さまざまなハードウェア プラットフォームの抽象化を処理するこの API の上にメディア レイヤーを構築できます。 API の低レベル設計を考えると、これらの上位レベルのメディア レイヤーは、ビデオ エンコード セッションの同期とメモリの割り当て/常駐の側面 (参照画像管理の完全な制御やビットストリーム ヘッダーの書き込み責任など) を細かく制御することで、シナリオに合わせて最適化できます。 この API の上にあるレイヤーへのこの責任の移行により、ハードウェア ベンダーは、異なるハードウェア プラットフォーム間で再利用できる一貫したエンコード ポリシー (たとえば、アダプティブ GOP などの DPB ヒューリスティック) をメディア レイヤー内に持つことができます。

D3D グラフィックス、コンピューティング、機械学習との相互運用性

D3D12 ビデオ エンコード API を使用すると、D3D12 ビデオ エンコードと D3D12 グラフィックス、コンピューティング、ML のシナリオ間の効率的な相互運用性を実現できます。 この相互運用性は、カメラ ストリームで ML 推論を実行するなどのシナリオで興味深いものです。

ゲーム ストリーミング シナリオ

D3D12 ビデオ エンコード API を使用すると、パフォーマンスの高い低レベル API を必要とするゲーム ストリーミング シナリオが可能になります。