ビデオ レンダラからのフォーマット変更の処理
ここでは、デコーダ フィルタまたは変換フィルタがビデオ レンダラからのフォーマット変更をどのように処理するかについて説明する。
ビデオ レンダラ フィルタ
古いビデオ レンダラ フィルタは、接続するときにプライマリ モニタの表示フォーマットに一致する RGB フォーマットを必要とする。このフォーマットを使うと、DirectDraw が利用できない場合に GDI をレンダリングに使用できる。再生が始まると、ビデオ レンダラは DirectDraw 互換フォーマットに切り替わることがある。アップストリーム フィルタが新しいフォーマットをサポートできるかどうか確認するため、ビデオ レンダラはアップストリーム フィルタの出力ピンの IPin::QueryAccept を呼び出す。アップストリーム フィルタが新しいフォーマットを受け入れる場合、QueryAccept メソッドは S_OK を返す。ビデオ レンダラでは、そのアロケータが返した次のメディア サンプルに新しいフォーマットを持つメディア タイプをアタッチして、フォーマットを切り替える。アップストリーム フィルタは、各サンプルで IMediaSample::GetMediaType を呼び出し、フォーマット変更を調べる必要がある。ビデオ レンダラは、ストリーミング中の任意の時期に元のフォーマットと新しいフォーマットを切り替えることがある。最初のフォーマット変更の後、QueryAccept は呼び出さない。アップストリーム フィルタが一度新しいフォーマットを受け入れれば、何度でも切り替えられるはずである。
アップストリーム フィルタは、QueryAccept から S_FALSE を返すことでフォーマット変更を拒否できる。その場合、ビデオ レンダラは元のフォーマットで GDI を使い続ける。
Video Mixing Renderer フィルタ
Video Mixing Renderer フィルタ (VMR-7 および VMR-9) は、システムのグラフィック ハードウェアでサポートされている任意のフォーマットで接続する。VMR はレンダリングに常に DirectDraw を使い、アップストリーム フィルタが接続すると、基になる DirectDraw サーフェイスを割り当てる。
グラフィック ハードウェアはイメージ幅より大きいサーフェイス ストライドを必要とすることがある。その場合、VMR は QueryAccept を呼び出して新しいフォーマットを要求する。ビデオ フォーマットの BITMAPINFOHEADER の biWidth メンバでサーフェイス ストライドを報告する。アップストリーム フィルタが QueryAccept から S_OK を返さない場合、VMR はそのフォーマットを拒否し、アップストリーム フィルタにより通知された次のフォーマットを使って接続を試みる。VMR は新しいフォーマットを持つメディア タイプを最初のメディア サンプルにアタッチする。最初のサンプルの後、フォーマットは一定である。グラフの実行中、VMR はフォーマットを切り替えない。
参照