VMR-9 用のカスタム Allocator-Presenterの提供
[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、および Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayer、IMFMediaEngine、Audio/Video Capture を使用することを強くお勧めします。 Microsoft は、従来の API を使用する既存のコードを、可能であれば新しい API を使用するように書き直すよう提案しています。]
Video Mixing Renderer 9 (VMR-9) フィルターでカスタム アロケーター 発表者を使用するには、次の手順を実行します。
IVMRSurfaceAllocator9 インターフェイスと IVMRImagePresenter9 インターフェイスをサポートするクラスを実装します。
IVMRFilterConfig9 インターフェイスの VMR-9 フィルターで QueryInterface を呼び出します。
IVMRFilterConfig9::SetRenderingMode メソッドを呼び出し、VMR9Mode_Renderless フラグを渡します。
IVMRSurfaceAllocatorNotify9 インターフェイスの VMR-9 フィルターの QueryInterface。
IVMRSurfaceAllocatorNotify9::AdviseSurfaceAllocator メソッドを呼び出し、アロケーター発表者の IVMRSurfaceAllocator9 メソッドへのポインターを渡します。
allocator-presenter の IVMRSurfaceAllocator9::AdviseNotify メソッドを呼び出し、VMR-9 フィルターの IVMRSurfaceAllocatorNotify9 インターフェイスへのポインターを渡します。
IVMRSurfaceAllocator9::AdviseNotify の実装では、Direct3D デバイスへのポインターと、ビデオが表示されるモニターへのハンドルで IVMRSurfaceAllocatorNotify9::SetD3DDevice Pass を呼び出します。
IVMRSurfaceAllocator9::InitializeDevice メソッドの実装では、InitializeDevice メソッドで指定されたパラメーターと一致する Direct3D サーフェスを作成します。 必要に応じて、VMR-9 フィルターの IVMRSurfaceAllocatorNotify9::AllocateSurfaceHelper メソッドを使用して、これらのサーフェスを割り当てることができます。 サーフェス ポインターを配列に格納します。
注意
VMR-9 でビデオ フレームをテクスチャ サーフェスに描画する場合は、 VMR9AllocFlag_TextureSurface フラグを VMR9AllocationInfo 構造体に追加します。 デバイスでネイティブ ビデオ形式のテクスチャがサポートされていない場合は、別のテクスチャ サーフェスを作成してから、ビデオ サーフェスからテクスチャにビデオ フレームをコピーすることが必要な場合があります。
ストリーミング中に、VMR-9 は IVMRSurfaceAllocator9::GetSurface メソッドを呼び出してアロケーター発表者からサーフェスを取得します。 VMR-9 は、サーフェス配列内のインデックスによってサーフェスを指定します (手順 8)。
VMR-9 が IVMRImagePresenter9::P resentImage メソッドを呼び出すときにイメージを表示します。 パラメーターには、ビデオ イメージを含む Direct3D サーフェスへのポインターが含まれます。
Direct3D デバイスが失われた場合は、アロケーター発表者がデバイスを復元し、サーフェスを再作成する必要があります。 たとえば、表示モードが変更された場合や、ユーザーがウィンドウを別のモニターに移動すると、デバイスが失われる可能性があります。 Direct3D デバイスが変更された場合は、VMR-9 フィルターの IVMRSurfaceAllocatorNotify9::ChangeD3DDevice メソッドを呼び出します。
ストリーミングが停止すると、VMR-9 は IVMRSurfaceAllocator9::TerminateDevice メソッドを呼び出します。 アロケーター 発表者は、すべての Direct3D リソースを解放する必要があります。
VMR-7 と VMR-9 には、カスタム アロケーター 発表者の管理方法にいくつかの違いがあります。
- VMR-9 フィルターの AllocateSurfaceHelper メソッドは、アロケーター発表者がサーフェスを割り当てるときに使用できます。 このメソッドを使用すると、カスタムアロケーター発表者が呼び出しを既定のアロケーター発表者に転送する必要はありません。 このため、VMR-9 フィルターの既定のアロケーター 発表者の CLSID は発行されません。
- VMR-7 とは異なり、VMR-9 には特別な DirectDraw 排他モード アロケーター 発表者は用意されていません。 IVMRSurfaceAllocatorNotify9::AllocateSurfaceHelper メソッドを使用すると、このオブジェクトは不要になります。
- インターレースされたビデオの場合、VMR-9 は常にイメージを表示する前にビデオのインターレースを解除します。 アロケーター 発表者は、イメージを表示する前にインターレース解除する責任を負いません。
関連トピック