次の方法で共有


DirectX ビデオ アクセラレーション IAMVideoAccelerator 操作仕様

[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayerIMFMediaEngine、および Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayerIMFMediaEngineAudio/Video Capture を使用することを強くお勧めします。 Microsoft は、従来の API を使用する既存のコードを、可能であれば新しい API を使用するように書き直すよう提案しています。]

操作の正確なメカニズムは次のとおりです。

  1. ここで定義されている各制限付きモード プロファイルには、ダウンストリーム入力ピンの IPin::QueryAccept と IPin::ReceiveConnection でサポートされ、IAMVideoAccelerator::GetVideoAcceleratorGUIDs に記載されている DirectX VA GUID が関連付けられています。

  2. 同様に、DirectX VA で使用する各暗号化プロトコルの種類には、ダウンストリーム入力ピンの IPin::QueryAccept と IPin::ReceiveConnection でサポートされ、IAMVideoAccelerator::GetVideoAcceleratorGUIDs に記載されている暗号化プロトコルの種類 GUID が関連付けられている必要があります。 "暗号化なし" GUID DXVA_NoEncryptは、サポートが必要であるため、暗黙的であるため、この一覧では送信されません。

  3. IPin::ReceiveConnection を呼び出してダウンストリーム入力ピンへの接続を試行した後、デコーダーの IAMVideoAcceleratorNotify::GetCreateVideoAcceleratorData は、接続の接続モード情報を含むDXVA_ConnectMode データ構造体へのポインターを返す必要があります。 IAMVideoAccelerator::GetCompBufferInfo は *pdwNumTypesCompBuffers = 16 で呼び出され、各バッファーの型番号 (DirectX VA 仕様のセクション 3.4 で定義) を返される AMVACompBufferInfo データ構造体の配列に直接使用できるという規則に基づいて圧縮バッファー情報を返す必要があります。 これには、使用されないバッファーの種類 (バッファーの種類 0 を含む)、アクセラレータ ドライバーは AMVACompBufferInfo データ構造に何らかの形式の "dummy" パラメーター値 (dwNumCompBuffers=0、dwWidthToCreate=0、dwHeightToCreate=0、dwBytesToAllocate=0 など) を提供する必要があります。

  4. DXVA 関数の表示と関連するデータ バッファーは、 IAMVideoAccelerator::Execute を使用して送信されます。 DXVA 関数は、呼び出しの dwFunction パラメーターで示されます。 初期化に関連する DXVA 関数は、DXVA_ConfigQueryOrReplyFuncとDXVA_EncryptProtocolFuncのみです。

    • dwFunction にDXVA_ConfigQueryOrReplyFuncが含まれている場合、この呼び出しでアクセラレータにデータを渡すための lpPrivateInputData ポインターは構成データ構造を指し、アクセラレータから情報を受信するための lpPrivateOutputData ポインターは、代替または重複する構成データ構造を配置できる領域を指す必要があります。AMVABUFFERINFO の配列の pamvaBufferInfo ポインターは NULL、 および dwNumBuffers は 0 でなければなりません。 返された HRESULT には、プロトコルの実行で重大な問題 (無効な構成パラメーターなど) が発生した場合に、S_OKまたはS_FALSE表示、またはE_FAILまたはE_INVALIDARGまたはその他のエラー表示 HRESULT が含まれます。 IAMVideoAccelerator::Execute に対するすべての呼び出しは、DXVA_ConfigQueryOrReplyFuncのすべての使用に対して、IAMVideoAccelerator::Execute に対する他のすべての呼び出しの前に置く必要があります。

    • dwFunction にDXVA_EncryptProtocolFuncが含まれている場合、この呼び出しでアクセラレータにデータを渡すための lpPrivateInputData ポインターは、DXVA_EncryptProtocolHeaderで始まる暗号化プロトコル データ構造を指す必要があります。アクセラレータから情報を受信するための lpPrivateOutputData ポインターは、暗号化プロトコル (DXVA_EncryptProtocolHeader で始まる) によって返されるデータ (証明書など) が配置される領域を指す必要があります。 AMVABUFFERINFO の配列の pamvaBufferInfo ポインターは NULL、dwNumBuffers は 0 でなければなりません。 返される HRESULT には、暗号化プロトコルが正常に機能している限り、S_OKが含まれており、プロトコルの実行で重大な問題が発生した場合にE_FAILまたはE_INVALIDARGまたはその他のエラー表示 HRESULT が含まれます。

      上記の方法で操作を初期化した後、デコーダーの実際の操作は次のように進みます。

  5. IAMVideoAccelerator::BeginFrame は、圧縮されていない宛先サーフェスへの書き込みを引き起こす圧縮バッファー パラメーターを持つbDXVA_Funcを送信する前に呼び出す必要があります。 DirectX VA の IAMVideoAccelerator::BeginFrame の目的は、ターゲット サーフェスをインデックス値に関連付け、サーフェスの書き込みを開始する意図をビデオ アクセラレータ ドライバーに通知して、ドライバーがサーフェスを上書きする準備ができているかどうかを示す応答を行えるようにすることです。 IAMVideoAccelerator::BeginFrame で渡される AMVABeginFrameInfo 構造体には、IAMVideoAccelerator::BeginFrame に渡されるフレーム インデックスに一致する単一の WORD wBeginPictureIndex パラメーターへの pInputData ポインターが含まれている必要があります (および dwSizeInputData は 2 になります)。 これは、サーフェスへの書き込みを実行するために圧縮バッファーで使用されるインデックスです (たとえば、wDecodedPictureIndex、wDeblockedPictureIndex、wBlendedDestinationIndex、または wPicResampleDestPicIndex として使用されます)。 IAMVideoAccelerator::BeginFrame の各呼び出しは、以下で説明するように、IAMVideoAccelerator::EndFrame への対応する呼び出しとペアにする必要があります。 たとえば、圧縮された画像をデコードし、フロントエンドバッファーからバッファーへのブレンドを使用してアルファ ブレンドする場合は、wDecodedPictureIndex で指定されたサーフェスに圧縮された画像をデコードする前に IAMVideoAccelerator::BeginFrame を呼び出し、画像をデコードするために使用されるすべての圧縮バッファーを渡した後に IAMVideoAccelerator::EndFrame を 呼び出します。 次に、グラフィック ソースとデコードされた画像のアルファ ブレンドの組み合わせを wBlendedDestinationIndex で指定されたサーフェスに指定する前に IAMVideoAccelerator::BeginFrame に対する 2 回目の呼び出し、アルファ ブレンドの組み合わせ操作後の IAMVideoAccelerator::EndFrame の 2 回目の呼び出し。AMVABeginFrameInfo のポインター pOutputData は NULL (および dwSizeOutputData は "0" でなければなりません)。 IAMVideoAccelerator::BeginFrame によって返される HRESULT は次のようになります。

    • S_OK、圧縮されていないサーフェスが使用可能で、使用できる状態になっている場合に使用できます。
    • E_PENDING圧縮されていないサーフェスがまだ使用できないが、すぐに使用可能になる場合 (非圧縮サーフェスが表示用に読み取られ、サーフェスの読み取り/表示がまだ完了していない場合)。
    • データ形式またはプロトコル エラー (dwSizeInputData の正しくない値や NULL 以外の pOutputData など) が検出された場合にのみ、他のエラー表示をE_FAILまたはE_INVALIDARGします。
  6. DXVA 関数の表示と関連するデータ バッファーは、 IAMVideoAccelerator::Execute を使用して送信されます。 IAMVideoAccelerator::Execute の同じ呼び出しで、複数のbDXVA_Func値を示す場合があります。 bDXVA_Func値は、8 つの MSB の最初の関数コマンド、次の 8 ビットの次のコマンドなど、呼び出しの dwFunction パラメーターにパックされ、残りのビットはゼロで埋め込まれます。 bDXVA_Funcの値0xFFは、bDXVA_Funcが 2 バイトまたは 4 バイトに拡張されていることを示します。 2 番目のバイトも0xFF場合は、bDXVA_Funcが 4 バイトに拡張されていることを示します。 3 番目のバイトの上位 4 ビットが0xFまたは0x0場合は、bDXVA_FuncにDXVA_ConfigQueryOrReplyFuncまたはDXVA_EncryptProtocolFuncが含まれていることを示します。 マルチバイト コマンドは、dwFunction の末尾を過ぎた継続を示すものではありません。 IAMVideoAccelerator::Execute の同じ呼び出しで指定された異なるbDXVA_Func値間に順次依存関係が存在しないようにし、すべての潜在的な競合状態 (画像のデコードとサブ画像のブレンド、サブ画像の読み込みとサブ画像のブレンドなど) が IAMVideoAccelerator: への適切な呼び出しによって防止されるように、デコーダーで注意する必要があります。以降の IAMVideoAccelerator::Execute の呼び出しの前に、BeginFrame と IAMVideoAccelerator::QueryRenderStatus

    • dwFunction にDXVA_ConfigQueryOrReplyFuncが含まれている場合、この呼び出しでアクセラレータにデータを渡すための lpPrivateInputData ポインターは構成データ構造を指し、アクセラレータから情報を受信するための lpPrivateOutputData ポインターは、代替または重複する構成データ構造を配置できる領域を指す必要があります。AMVABUFFERINFO の配列の pamvaBufferInfo ポインターは NULL、 および dwNumBuffers は 0 でなければなりません。 返された HRESULT には、クエリに応答したS_OKまたはS_FALSE表示が含まれます。または、プロトコルの実行で重大な問題が発生した場合に HRESULT をE_FAILまたはE_INVALIDARGします (invalid.configuration パラメーターなど)。 IAMVideoAccelerator::Execute に対するすべての呼び出しは、DXVA_ConfigQueryOrReplyFuncのすべての使用に対して、IAMVideoAccelerator::Execute に対する他のすべての呼び出しの前に置く必要があります。

    • dwFunction にDXVA_EncryptProtocolFuncが含まれている場合、この呼び出しでアクセラレータにデータを渡すための lpPrivateInputData ポインターは、DXVA_EncryptProtocolHeaderで始まる暗号化プロトコル データ構造を指す必要があります。アクセラレータから情報を受信するための lpPrivateOutputData ポインターは、暗号化プロトコル (DXVA_EncryptProtocolHeader で始まる) によって返されるデータ (証明書など) が配置される領域を指す必要があります。 AMVABUFFERINFO の配列の pamvaBufferInfo ポインターは NULL、dwNumBuffers は 0 でなければなりません。 返される HRESULT には、暗号化プロトコルが正常に機能している限り、S_OKが含まれており、プロトコルの実行で重大な問題が発生した場合にE_FAILまたはE_INVALIDARGまたはその他のエラー表示 HRESULT が含まれます。

    • dwFunction にDXVA_ConfigQueryOrReplyFuncまたはDXVA_EncryptProtocolFuncが含まれていない場合、アクセラレータにデータを渡すための lpPrivateInputData ポインターは、バッファー記述リストを指す必要があります。 各バッファーのバッファー記述リスト構造内の最初の 4 つのエントリ (dwTypeIndex、dwBufferIndex、dwDataOffset、および dwDataSize) は、同じバッファーの AMVABUFFERINFO データ構造のエントリと同じである必要があります。 bDXVA_Funcが dwFunction 内で "1" と等しく、bPicReadbackRequests が "1" である場合、 アクセラレータから情報を受け取るための lpPrivateOutputData ポインターは、アクセラレータからの読み取りバック マクロブロック データで埋め込まれる永続メモリ (ヒープなど) の領域を指す必要があります ( IAMVideoAccelerator::QueryRenderStatus が同じ画像パラメーター バッファーに書き込む場合は、次の項目 10 で説明するようにS_OKが示されるまで、このようなデータは存在することが保証されません)。 それ以外の場合、アクセラレータから情報を受信するための lpPrivateOutputData ポインターは、1 つの DWORD をポイントして、次のいずれかの表示値に設定する必要があります (特に、ホスト外 VLD 操作でビットストリーム エラーを報告する場合に便利です)。

      説明
      0 実行 OK。
      1 データ形式で軽微な問題が発生しました。
      2 データ形式で重大な問題が発生しました。
      3 データ形式で重大な問題が発生しました。
      4 その他の重大な問題が発生しました。

       

      いずれかの種類の "重大な" 問題が示されている場合、修正アクションを実行できない限り、ソフトウェア デコーダーは機能の操作を停止する必要があります。 IAMVideoAccelerator::QueryRenderStatus でテストできるように、アクセラレータから返されたこのデータは、画像のバッファー レンダリングが完了するまでホストによって読み取られるものではありません。 返される HRESULT には、インターフェイス操作が正常に機能し、重大な問題が発生した場合にE_FAILまたはE_INVALIDARGまたはその他のエラー表示 HRESULT が返される可能性がある限り、S_OKが含まれます。

  7. 画像デコード パラメーター バッファーは、 IAMVideoAccelerator::Execute を使用する場合、各画像のデコード用に送信される最初のバッファーの中に、"1" と等しいbDXVA_Funcとします。また、ビットストリーム内の画像をデコードするためのバッファーはすべて、後続の画像をデコードするためのバッファーの前に送信される必要があります。 マクロブロック制御コマンド バッファーが送信された場合、対応する残差データ バッファー (同じマクロブロックのデータを含む) が、同じ IAMVideoAccelerator::Execute 呼び出しで送信されます。

  8. IAMVideoAccelerator::EndFrame は、すべての圧縮バッファーが送信された後に呼び出され、指定した圧縮されていないサーフェスに出力コンテンツが作成されます (wDecodedPictureIndex、wDeblockedPictureIndex、wBlendedDestinationIndex、または wPicResampleDestPicIndex に対して指定された操作の結果)。 IAMVideoAccelerator::EndFrame に対するこの呼び出しの目的は、指定された操作に必要なすべてのデータが送信されたことをビデオ アクセラレータ ハードウェアに通知することです。 IAMVideoAccelerator::EndFrame を介してダウンストリームに送信するデータへのポインターは、終了するフレームのインデックスを含む単一の WORD wEndPictureIndex を指す必要があります。 このパラメーターは、関連する圧縮バッファーを送信する前に 、IAMVideoAccelerator::BeginFrame の前の呼び出しで指定された wBeginPictureIndex 値と一致する必要があります。 IAMVideoAccelerator::EndFrame の呼び出しの後、IAMVideoAccelerator::BeginFrame への別の呼び出しが発行されるまで、インデックス wEndPictureIndex を持つ圧縮されていないサーフェスは、画像の wDecodedPictureIndex、wDeblockedPictureIndex、wBlendedDestinationIndex、または wPicResampleDestPicIndex で見つからず、これが発生し、結果としてS_OKが返されたことを通知します。 ただし、その宛先サーフェス インデックスは、wForwardRefPictureIndex、wBackwardRefPictureIndex、wPicResampleSourcePicIndex、bRefPicSelect[i] などの後続の読み取りアクセス コマンドで発生する可能性があります。 IAMVideoAccelerator::EndFrame によって返される HRESULT は、何らかの種類のデータ形式またはプロトコル エラーがない限り、S_OKする必要があります。その場合は、E_FAILまたはE_INVALIDARGまたはその他のエラーを示すことができます。

  9. フィールド ベースのデコード (MPEG-2 ビットストリームなど) の場合、アクセラレータ インターフェイスの非圧縮サーフェスへのビットストリーム内の機能画像の 1 対 1 のマッピングは行われません。 MPEG-2 ビットストリームでフィールド画像をデコードすると、2 つの "ピクチャ" がデコードされ、1 つの完全な出力非圧縮サーフェスが生成されます。 DirectX VA インターフェイス定義では、各フレームは wDecodedPictureIndex、wDeblockedPictureIndex、wBlendedDestinationIndex、または wPicResampleDestPicIndex の各使用に対応します。 したがって、出力された非圧縮サーフェスへのフィールド画像のデコードには、 IAMVideoAccelerator::BeginFrameIAMVideoAccelerator::EndFrame の 2 組の呼び出しが必要です。

  10. iamVideoAccelerator::QueryRenderStatus と dwFlags が 0 に等しい呼び出し。これは、特定の wEndPictureIndex で IAMVideoAccelerator::EndFrame を呼び出した後に発生し、wDecodedPictureIndex に wEndPictureIndex を含む送信されたバッファーの状態を確認します。 wDeblockedPictureIndex、wBlendedDestinationIndex、または wPicResampleDestPicIndex は、圧縮されていないサーフェスにデータを書き込むすべての操作が完了した場合にS_OKを返しますと は、操作がまだ完了していない場合はE_PENDINGを返します。 プロトコル エラーが発生した場合、E_FAILまたはE_INVALIDARGまたはその他のエラー表示が返されることがあります。

DirectX ビデオ アクセラレーションを IAMVideoAccelerator にマッピングする