次の方法で共有


ビデオ レンダラーからの書式変更の処理

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

このセクションでは、デコーダー フィルターまたは変換フィルターでビデオ レンダラーからの形式変更を処理する方法について説明します。

ビデオ レンダラー フィルター

古い ビデオ レンダラー フィルターが接続するときは、プライマリ モニターの表示形式と一致する RGB 形式が必要です。 これにより、DirectDraw が使用できない場合に、GDI をレンダリングに使用できます。 再生が開始されると、ビデオ レンダラーが DirectDraw 互換の形式に切り替わる場合があります。 アップストリーム フィルターが新しい形式をサポートできるかどうかを判断するために、ビデオ レンダラーはアップストリーム フィルターの出力ピンで IPin::QueryAccept を呼び出します。 アップストリーム フィルターが新しい形式を受け入れる場合、 QueryAccept メソッドは S_OKを返します。 ビデオ レンダラーは、アロケーターによって返される次のメディア サンプルに新しい形式のメディアの種類をアタッチすることで、形式を切り替えます。 アップストリーム フィルターは、各サンプルで IMediaSample::GetMediaType を呼び出して、書式の変更をチェックする必要があります。 ビデオ レンダラーは、ストリーミング中にいつでも元の形式と新しい形式を切り替えることができます。 最初の形式の変更後、 QueryAccept は呼び出されません。 アップストリーム フィルターが新しい形式を受け入れると、そのフィルターは切り替え可能である必要があります。

アップストリーム フィルターは、 QueryAccept からS_FALSEを返すことによって、形式の変更を拒否できます。 その場合、ビデオ レンダラーでは元の形式の GDI が引き続き使用されます。

ビデオ ミキシング レンダラー フィルター

ビデオ ミキシング レンダラー フィルター (VMR-7 と VMR-9) は、システム上のグラフィックス ハードウェアでサポートされている任意の形式で接続されます。 VMR-7 は常にレンダリングに DirectDraw を使用し、アップストリーム フィルターが接続されたときに基になる DirectDraw サーフェスを割り当てます。 VMR-9 は常にレンダリングに Direct3D を使用し、アップストリーム フィルターが接続されたときに基になる Direct3D サーフェスを割り当てます。

グラフィックス ハードウェアでは、イメージ幅よりも大きなサーフェスストライドが必要な場合があります。 その場合、VMR は QueryAccept を呼び出して新しい形式を要求します。 これは、BITMAPINFOHEADERbiWidth メンバーのサーフェスストライドをビデオ形式で報告します。 アップストリーム フィルターが QueryAccept からS_OKを返さない場合、VMR は形式を拒否し、アップストリーム フィルターによってアドバタイズされた次の形式を使用して接続を試みます。 VMR は、新しい形式のメディアの種類を最初のメディア サンプルにアタッチします。 最初のサンプルの後、形式は一定のままです。グラフの実行中に VMR で形式が切り替えられません。

拡張ビデオ レンダリング (EVR)

EVR では、レンダリングに常に Direct3D が使用されます。 より大きなサーフェスストライドが必要な場合、EVR は VMR と同じ QueryAccept メカニズムを使用します。

QueryAccept (アップストリーム)