VMR-9 用カスタム アロケータ プレゼンタの指定

Video Mixing Renderer 9 (VMR-9) フィルタと共にカスタム アロケータ プレゼンタを使うには、次の手順を実行する。

  1. IVMRSurfaceAllocator9 インターフェイスおよび IVMRImagePresenter9 インターフェイスをサポートするクラスを実装する。
  2. VMR-9 で IVMRFilterConfig9 インターフェイスおよび IVMRSurfaceAllocatorNotify9 インターフェイスを問い合わせる。
  3. VMR9Mode_Renderless を使って IVMRFilterConfig9::SetRenderingMode メソッドを呼び出す。
  4. アロケータ プレゼンタへのポインタを使って IVMRSurfaceAllocatorNotify9::AdviseSurfaceAllocator メソッドを呼び出す。
  5. VMR-9 フィルタの IVMRSurfaceAllocatorNotify9 インターフェイスを使い、アロケータ プレゼンタの IVMRSurfaceAllocator9::AdviseNotify メソッドを呼び出す。この手順と前の手順により、VMR-9 とアロケータ プレゼンタ間の通信リンクが確立される。
  6. IVMRSurfaceAllocator9::InitializeDevice コールバック メソッドでサーフェイスを割り当てる。
    • Direct3D デバイスへのポインタとモニタへのハンドルを使って IVMRSurfaceAllocatorNotify9::SetD3DDevice メソッドを呼び出す。
    • InitializeDevice メソッドに指定されたパラメータに一致する Direct3D サーフェイスを作成する。VMR-9 フィルタの IVMRSurfaceAllocatorNotify9::AllocateSurfaceHelper メソッドを使い、サーフェイスを割り当てる。
    • 通常、Direct3D プリミティブ上にテクスチャをレンダリングできるようにするため、テクスチャ サーフェイスにビデオ フレームを描画させる。その場合、VMR9AllocationInfo 構造体 (lpAllocInfo パラメータ) への VMR9AllocFlag_TextureSurface フラグの追加が必要になることがある。デバイスがネイティブ ビデオ フォーマットのテクスチャをサポートしていない場合は、異なるテクスチャ サーフェイスを作成した後、ビデオ サーフェイスからテクスチャへビデオ フレームをコピーすることが必要になることがある。
  7. VMR-9 は IVMRSurfaceAllocator9::GetSurface メソッドを呼び出して、アロケータ プレゼンタからサーフェイスを取得する。
  8. VMR-9 が IVMRImagePresenter9::PresentImage メソッドを呼び出すとき、イメージを表示する。パラメータには、ビデオ イメージが入った Direct3D サーフェイスへのポインタが含まれる。
  9. Direct3D デバイスが失われた場合は、常にデバイスとサーフェイスを復元する必要がある。たとえば、表示モードが変わるか、ユーザーがウィンドウを別のモニタに移動すると、デバイスは失われることがある。
  10. Direct3D デバイスが変わった場合は、VMR-9 フィルタの IVMRSurfaceAllocatorNotify9::ChangeD3DDevice メソッドを呼び出す。
  11. ストリーミングが停止すると、VMR-9 は IVMRSurfaceAllocator9::TerminateDevice メソッドを呼び出す。アロケータ プレゼンタはその Direct3D リソースをすべて解放する。

カスタム アロケータ プレゼンタを管理する方法において、VMR-7 と VMR-9 ではいくつかの違いがある。

  • アロケータ プレゼンタはサーフェイスを割り当てるとき、VMR-9 フィルタの AllocateSurfaceHelper メソッドを利用できる。このメソッドを使うと、カスタム アロケータ プレゼンタはデフォルトのアロケータ プレゼンタに呼び出しを転送する必要がない。そのため、VMR-9 フィルタのデフォルト アロケータ プレゼンタの CLSID は公開されない。
  • VMR-7 とは異なり、VMR-9 は特別な DirectDraw 排他モードのアロケータ プレゼンタを提供していない。AllocateSurfaceHelper メソッドを使うと、このオブジェクトは必要なくなる。
  • インターレース ビデオの場合、VMR-9 は PresentImage メソッドを呼び出す前に常にビデオを非インターレース化する。アロケータ プレゼンタがイメージの表示前に非インターレース化することはない。