次の方法で共有


状態の変更とポーズの完了の処理

レンダリング フィルタは、その状態が変化するときにフィルタ グラフ内の他のフィルタと同じように動作するが、次のような例外がある。ポーズされた後、レンダラはデータをキューに入れ、以降の実行でレンダリングを行う準備をする。ビデオ レンダラを停止した場合、レンダラはこのキューに入っているデータを保持する。これは、フィルタ グラフが停止状態のときは、フィルタはリソースを保持してはならないという DirectShow の規則に対する例外である。

この例外の理由は、リソースを保持することでレンダラは WM_PAINT メッセージを受け取った場合にウィンドウを再描画するイメージを常に持つということにある。またレンダラは、現在のイメージのコピーを要求する CBaseControlVideo::GetStaticImage などのメソッドを満足させるイメージを持つ。リソースを保持するもう 1 つの効果として、イメージを保持することでアロケータがデコミットされることがなくなり、イメージ バッファが既に割り当てられているので次の状態変更がより迅速に行われるようになる。

ビデオ レンダラは、実行中にのみ、サンプルをレンダリングおよび解放しなければならない。ポーズ状態のとき、フィルタがサンプルをレンダリングすることはある (たとえば、ウィンドウ内で静的なポスター イメージを描画するとき) が、サンプルを解放してはならない。オーディオ レンダラは、ポーズ状態のときはレンダリングを行わない (ただし、たとえば wave デバイスの準備などの他の処理は行える)。サンプルをレンダリングする時間は、サンプルのストリーム タイムと、IMediaControl::Run メソッドへのパラメータとして渡された基準タイムとを組み合わせることによって求められる。レンダラは、終了タイム以下の開始タイムを持つサンプルを拒否しなければならない。

アプリケーションがフィルタ グラフをポーズすると、フィルタ グラフはレンダラでキューに入れられたデータが存在するまで IMediaControl::Pause メソッドから復帰しない。これを確実にするために、レンダラがポーズされたときにレンダリングするデータがない場合は S_FALSE を返さなければならない。キューに入れられているデータがある場合は、S_OK を返すことができる。

フィルタ グラフ マネージャは、フィルタ グラフをポーズするときにすべての戻り値をチェックして、レンダラがデータをキューに入れたことを確認する。1 つまたは複数のフィルタの準備が整っていない場合、フィルタ グラフ マネージャは GetState 呼び出しによってグラフ内のそのフィルタをポーリングする。GetState メソッドは、タイムアウト パラメータを取る。状態の変更を完了する前にデータが到着するのを待っているフィルタ (通常はレンダラ) は、GetState メソッドがタイムアウトすると VFW_S_STATE_INTERMEDIATE を返す。データがレンダラに到着した場合、GetState は S_OK を即座に返さなければならない。

中間状態および完了状態のどちらにおいても、報告されるフィルタ状態は State_Paused となる。フィルタの準備が整っているかどうかは、戻り値によって示される。レンダラがデータの到着を待っている場合、ソース フィルタはストリーム終了通知を送信し、状態変更を完了しなければならない。

すべてのフィルタにおいてレンダリングするデータの準備が整うと、フィルタ グラフは、ポーズ状態の変更を完了する。