Share via


VMR-9 用のカスタム Allocator-Presenterの提供

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

Video Mixing Renderer 9 (VMR-9) フィルターでカスタム アロケーター 発表者を使用するには、次の手順を実行します。

  1. IVMRSurfaceAllocator9 インターフェイスと IVMRImagePresenter9 インターフェイスをサポートするクラスを実装します。

  2. IVMRFilterConfig9 インターフェイスの VMR-9 フィルターで QueryInterface を呼び出します。

  3. IVMRFilterConfig9::SetRenderingMode メソッドを呼び出し、VMR9Mode_Renderless フラグを渡します。

  4. IVMRSurfaceAllocatorNotify9 インターフェイスの VMR-9 フィルターの QueryInterface

  5. IVMRSurfaceAllocatorNotify9::AdviseSurfaceAllocator メソッドを呼び出し、アロケーター発表者の IVMRSurfaceAllocator9 メソッドへのポインターを渡します。

  6. allocator-presenter の IVMRSurfaceAllocator9::AdviseNotify メソッドを呼び出し、VMR-9 フィルターの IVMRSurfaceAllocatorNotify9 インターフェイスへのポインターを渡します。

  7. IVMRSurfaceAllocator9::AdviseNotify の実装では、Direct3D デバイスへのポインターと、ビデオが表示されるモニターへのハンドルで IVMRSurfaceAllocatorNotify9::SetD3DDevice Pass を呼び出します。

  8. IVMRSurfaceAllocator9::InitializeDevice メソッドの実装では、InitializeDevice メソッドで指定されたパラメーターと一致する Direct3D サーフェスを作成します。 必要に応じて、VMR-9 フィルターの IVMRSurfaceAllocatorNotify9::AllocateSurfaceHelper メソッドを使用して、これらのサーフェスを割り当てることができます。 サーフェス ポインターを配列に格納します。

    注意

    VMR-9 でビデオ フレームをテクスチャ サーフェスに描画する場合は、 VMR9AllocFlag_TextureSurface フラグを VMR9AllocationInfo 構造体に追加します。 デバイスでネイティブ ビデオ形式のテクスチャがサポートされていない場合は、別のテクスチャ サーフェスを作成してから、ビデオ サーフェスからテクスチャにビデオ フレームをコピーすることが必要な場合があります。

     

  9. ストリーミング中に、VMR-9 は IVMRSurfaceAllocator9::GetSurface メソッドを呼び出してアロケーター発表者からサーフェスを取得します。 VMR-9 は、サーフェス配列内のインデックスによってサーフェスを指定します (手順 8)。

  10. VMR-9 が IVMRImagePresenter9::P resentImage メソッドを呼び出すときにイメージを表示します。 パラメーターには、ビデオ イメージを含む Direct3D サーフェスへのポインターが含まれます。

  11. Direct3D デバイスが失われた場合は、アロケーター発表者がデバイスを復元し、サーフェスを再作成する必要があります。 たとえば、表示モードが変更された場合や、ユーザーがウィンドウを別のモニターに移動すると、デバイスが失われる可能性があります。 Direct3D デバイスが変更された場合は、VMR-9 フィルターの IVMRSurfaceAllocatorNotify9::ChangeD3DDevice メソッドを呼び出します。

  12. ストリーミングが停止すると、VMR-9 は IVMRSurfaceAllocator9::TerminateDevice メソッドを呼び出します。 アロケーター 発表者は、すべての Direct3D リソースを解放する必要があります。

VMR-7 と VMR-9 には、カスタム アロケーター 発表者の管理方法にいくつかの違いがあります。

  • VMR-9 フィルターの AllocateSurfaceHelper メソッドは、アロケーター発表者がサーフェスを割り当てるときに使用できます。 このメソッドを使用すると、カスタムアロケーター発表者が呼び出しを既定のアロケーター発表者に転送する必要はありません。 このため、VMR-9 フィルターの既定のアロケーター 発表者の CLSID は発行されません。
  • VMR-7 とは異なり、VMR-9 には特別な DirectDraw 排他モード アロケーター 発表者は用意されていません。 IVMRSurfaceAllocatorNotify9::AllocateSurfaceHelper メソッドを使用すると、このオブジェクトは不要になります。
  • インターレースされたビデオの場合、VMR-9 は常にイメージを表示する前にビデオのインターレースを解除します。 アロケーター 発表者は、イメージを表示する前にインターレース解除する責任を負いません。

VMR レンダリングレス再生モード (カスタム アロケーター 発表者)