次の方法で共有


Direct3D-Aware MFT

このトピックでは、ビデオ用の Direct3D 対応 Media Foundation 変換 (MFT) を実装する方法について説明します。

Direct3D サーフェスを含むサンプルを処理できる場合、ビデオ MFT は Direct3D 対応 と見なされます。 ビデオ MFT で Direct3D をサポートする一般的な理由は、DirectX ビデオ アクセラレーション (DXVA) を使用してハードウェア アクセラレータによるデコードを有効にするためです。

このトピックでは、MFT Direct3D に対応するために必要な手順について説明します。 このトピックでは、DXVA デコードの仕組みについては説明しません。 DXVA の詳細については、「DirectX Video Acceleration 2.0」を参照してください。

大事な

Windows 8 以降では、IDirect3DDeviceManager9の代わりに、IMFDXGIDeviceManager を使用できます。 Windows ストア アプリの場合は、IMFDXGIDeviceManager と Microsoft Direct3D 11 使用する必要があります。 詳細については、Direct3D 11 ビデオ APIを参照してください。

 

  1. IMFTransform::GetAttributes メソッドを実装します。 このメソッドは、属性ストアへのポインターを返します。
  2. MFT は、MF_SA_D3D_AWARE 属性の値を、独自の属性ストアで TRUE 設定する必要があります。 Windows 8 以降では、Direct3D 11 を使用する場合は MF_SA_D3D11_AWAREを使用します。
  3. フォーマット ネゴシエーション中に、MF_SA_D3D_AWARE (または Direct3D 11 を使用する場合は MF_SA_D3D11_AWARE) 属性が TRUE 場合、クライアントは MFT_MESSAGE_SET_D3D_MANAGER メッセージを MFT に送信できます。 ulParam イベント パラメーターは、IDirect3DDeviceManager9 インターフェイスへのポインターです。 Windows 8 以降では、IDirect3DDeviceManager9 ではなく、IMFDXGIDeviceManager使用できます。 クライアントはこのメッセージを送信する必要はありません。
  4. MFT IDirect3DDeviceManager9::GetVideoService を呼び出して、必要な DXVA サービスを照会します。 Windows 8 以降では、IMFDXGIDeviceManager使用された場合、IMFDXGIDeviceManager::GetVideoServiceMFT 呼び出しが使用されました。 通常、デコーダーは IDirectXVideoDecoderServiceを照会し、ビデオ プロセッサは IDirectXVideoProcessorServiceクエリを実行します。
  5. 前の手順が成功したと仮定すると、IMFTransform::GetInputAvailableType および IMFTransform::GetOutputAvailableType メソッドは DXVA 互換の形式を返す必要があります。
  6. クライアントは、MFT でメディアの種類を構成します。 メディアの種類が DXVA と互換性がない場合、MFT はエラー コード MF_E_UNSUPPORTED_D3D_TYPEを返す必要があります。
  7. この時点で、クライアントが適切な DXVA 形式を見つけるかどうかに応じて、2 つのオプションがあります。
    • クライアントが DXVA 形式を正常に構成すると、処理が開始される可能性があります。 この時点で、MFT は DXVA を使用して処理することも、ソフトウェア処理にフォールバックすることもできます。
    • または、クライアントが許容可能な DXVA 形式を見つけられない場合、クライアントは別の MFT_MESSAGE_SET_D3D_MANAGER メッセージを送信できます。今回は ulParam 設定して NULL します。 MFT は、IDirect3DDeviceManager9 ポインター (IMFDXGIDeviceManager ポインター 使用されている場合) とその他の DXVA インターフェイスを解放し、ソフトウェア処理に戻す必要があります。 この時点で、MFT は DXVA 処理を使用してはなりません。

Direct3D サーフェスを含むサンプルを処理するには、Direct3D 対応 MFT を準備する必要があります。 サンプルには、メディア バッファーが 1 つだけ含まれます。 バッファーから Direct3D サーフェスを取得するには、MFGetService 関数を呼び出し、MR_BUFFER_SERVICE サービスを指定します。 詳細については、「DirectX Surface Buffer」を参照してください。

DXVA を使用する MFT では、次のように独自の出力サンプルを割り当てる必要があります。

  1. IMFTransform::GetOutputStreamInfo メソッドで、MFT_OUTPUT_STREAM_PROVIDES_SAMPLES フラグを設定します。
  2. DXVA 仕様で説明されているように、DXVA サーフェスのプールを作成します。
  3. MFCreateVideoSampleFromSurface呼び出してメディア サンプルを作成します。

いくつかの理由により、DXVA 処理が使用できない可能性があるため、MFT は常にフォールバックとしてソフトウェア処理をサポートする必要があります。

  • GPU は DXVA をサポートしていない可能性があります。
  • クライアントが Direct3D を使用していない可能性があります。
  • DXVA プロファイルは、すべてのビデオ形式に対して定義されているわけではありません。

Direct3D 対応 MFT には、1 つの出力ストリームが必要です。 複数の出力を含めることはできません。

カスタム MFT の書き込みの