Direct3D-Aware MFT

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

ビデオ MFT は、 Direct3D サーフェスを含むサンプルを処理できる場合、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 Video 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 が使用された場合、MFT は IMFDXGIDeviceManager::GetVideoService を呼び出します。 通常、デコーダーは 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 を使用した場合は 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 の作成