ビデオ キャプチャでの再描画イベントの処理
ICaptureGraphBuilder2 インターフェイスを "使わずに" ビデオ キャプチャ グラフを作成し、古いビデオ レンダラ フィルタを使ってビデオをプレビューする場合は、EC_REPAINT イベントのデフォルト処理をオーバーライドする。
フィルタ グラフ マネージャで IMediaEvent インターフェイスを問い合わせ、値 EC_REPAINT を使って IMediaEvent::CancelDefaultHandling メソッドを呼び出す。
IMediaEvent *pEvent = 0;
hr = pGraph->QueryInterface(IID_IMediaEvent, (void**)&pEvent);
if (SUCCEEDED(hr))
{
pEvent->CancelDefaultHandling (EC_REPAINT);
pEvent->Release();
}
この処理により、キャプチャ ファイルを破損する可能性があるエラーの発生を回避できる。ユーザーがプレビュー ウィンドウに重ねて何かを表示し、それを消去すると、ビデオ レンダリング フィルタは WM_PAINT メッセージを受け取る。デフォルトでは、ビデオ レンダラが新しいフレームを要求すると、フィルタ グラフ マネージャは別のビデオ フレームを頭出しするためにグラフをポーズする。グラフがファイルに書き込んでいる間にこの処理が発生すると、ファイルは破損する。EC_REPAINT のデフォルト動作をオーバーライドすると、レンダラは新しいフレームを要求しなくなる。
ICaptureGraphBuilder2 インターフェイスを使う場合、この手順を実行する必要はない。これは、Capture Graph Builder が自動的に処理するためである。また、プレビューに Video Mixing Renderer (VMR) を使っている場合も必要ない。VMR は常に最新のフレームを利用できるため、EC_REPAINT イベントは送信しない。
参照