Microsoft DirectX 8.0

IMediaFilter インターフェイス

フィルタのストリーミング状態を制御する。

すべての Microsoft® DirectShow® フィルタは、このインターフェイスを実装する。このインターフェイスは、フィルタの状態 (停止、ポーズ、実行) を切り替えるメソッド、フィルタの現在の状態を取得するメソッド、および基準クロックを設定するメソッドを提供する。フィルタ グラフ マネージャも、このインターフェイスを公開する。フィルタ グラフ マネージャは、フィルタグラフ内のフィルタに、メソッド呼び出しを提供する。

このインターフェイスは、低いレベルの制御をグラフへ提供する。アプリケーションは、より高いレベルの制御を提供する IMediaControl インターフェイスを使う必要がある。

IMediaFilter は、IPersist インターフェイスを継承する。IBaseFilter インターフェイスは、IMediaFilter から継承される。

vtable 順のメソッド

IUnknown メソッド説明
QueryInterface サポートされているインターフェイスへのポインタを返す。
AddRef 参照カウントをインクリメントする。
Release 参照カウントをデクリメントする。
IMediaFilter メソッド説明
Stop フィルタを停止する。
Pause フィルタをポーズする。
Run フィルタを実行する。
GetState フィルタの状態 (停止、ポーズ、実行) を取得する。
SetSyncSource フィルタの基準クロックを設定する。
GetSyncSource フィルタが使用している基準クロックを取得する。

IMediaFilter::GetState

IMediaFilter インターフェイス

フィルタの状態 (停止、ポーズ、実行) を取得する。

構文

HRESULT GetState(
  DWORD dwMilliSecsTimeout,
  FILTER_STATE *State
  );

パラメータ

dwMilliSecsTimeout
[in] タイムアウト時間、ミリ秒単位。無期限にブロックするには INFINITE を渡す。
State
[out] フィルタの状態を示す FILTER_STATE 列挙型のメンバを受け取る変数へのポインタ。

戻り値

HRESULT 値を返す。以下の表に示されるいずれかの値。

S_OK成功。
E_POINTERNULL ポインタ引数。
VFW_S_STATE_INTERMEDIATE状態移行中。
VFW_S_CANT_CUEフィルタはアクティブだが、データを出力することができない。

注意

状態移行は非同期で行うことができる。フィルタが新しい状態に移行していて、移行が完了する前にメソッドのタイムアウト時間が来たなら、メソッドは VFW_S_STATE_INTERMEDIATE を返す。

フィルタがある理由でデータを出力できないなら、VFW_S_CANT_CUE を返す。ライブ キャプチャ フィルタは、ポーズ状態ではデータを出力しないため、ポーズ中にこの値を返す。

詳細については、「フィルタ グラフのデータ フロー」を参照すること。

IMediaFilter::GetSyncSource

IMediaFilter インターフェイス

フィルタが使用している基準クロックを取得する。

構文

HRESULT GetSyncSource(

  IReferenceClock **pClock
  );

パラメータ

pClock
[out] クロックの IReferenceClock インターフェイスへのポインタを受け取る変数のアドレス。

戻り値

HRESULT 値を返す。以下の表に示されるいずれかの値。

E_OK成功。
E_POINTERNull ポインタ引数。

注意

もしフィルタが基準クロックを使わないなら、*pClock に NULL が設定される。メソッドが帰るとき、*pClock が NULL 以外なら、IReferenceClock インターフェイスには参照カウントが残る。解放時には注意が必要である。

IMediaFilter::Pause

IMediaFilter インターフェイス

フィルタをポーズする。

構文

HRESULT Pause(void);

戻り値

HRESULT 値を返す。以下の表に示されるいずれかの値。

S_FALSE移行が完了しなかった。
S_OK成功。移行は完了した。

注意

フィルタがポーズのとき、フィルタはサンプルを受け取り、処理し、出力することができる。しかし、レンダリング フィルタはポーズ中は 1 つのサンプルにしかアクセスできない。そのため、フィルタ グラフがポーズのときは、最初のサンプルがレンダラに届くまではサンプルはグラフ内を移動する。そのとき、ストリーミングは Run メソッドが呼び出されるまでポーズとなる。ビデオ レンダラは、最初のサンプルを静止画として表示する。

ライブ キャプチャ フィルタはポーズ中にはサンプルを出力できず、実行中のみ出力する。

状態移行は非同期の場合がある。移行が完了する前にメソッドが返るなら、戻り値は S_FALSE である。レンダラ フィルタは、サンプルを 1 つ受け取るまでは状態移行を完了しない。

IMediaFilter::Run

IMediaFilter インターフェイス

フィルタを実行する。

構文

HRESULT Run(
    REFERENCE_TIME tStart
);

パラメータ

tStart
ストリーム タイム 0 に対応する基準タイム。

戻り値

HRESULT 値を返す。以下の表に示されるいずれかの値。

S_FALSE移行が完了しなかった。
S_OK成功。移行は完了した。

注意

フィルタがポーズのとき、フィルタはサンプルを受け取り、処理し、出力することができる。しかし、ソース フィルタは新しいサンプルを生成し、レンダリング フィルタはそれをレンダリングする。

状態移行は非同期の場合がある。移行が完了する前にメソッドが返る場合、戻り値は S_FALSE である。

ストリーム タイムは現在の基準タイムから tStart を引いて計算される。メディア サンプルがいつレンダリングされかを計算するために、レンダラは現在のストリーム タイムとタイム スタンプを比較する。そのため、タイム スタンプ ゼロのメディア サンプルは、tStart 時にレンダリングされる必要がある。詳細については、「DirectShow のタイムとクロック」を参照すること。

アプリケーションが IMediaControl::Run メソッドを呼び出す場合に、フィルタ グラフ マネージャは各フィルタで IMediaFilter::Run を呼び出す。フィルタ グラフ マネージャは tStart の値を少し後で設定し、グラフの遅延に対応する。

IMediaFilter::SetSyncSource

IMediaFilter インターフェイス

フィルタの基準クロックを設定する。

構文

HRESULT SetSyncSource(
    IReferenceClock *pClock
);

パラメータ

pClock
[in] クロックの IReferenceClock インターフェイスへのポインタまたは NULL 。

戻り値

成功の場合 S_OK を返す。それ以外の場合は、エラーの原因を示す HRESULT 値を返す。

注意

pClock パラメータが NULL の場合、フィルタは基準クロックを使用しない。レンダリング フィルタは基準クロックを使って、いつサンプルがレンダリングされるかをスケジュールする。基準クロックがない場合、レンダリング フィルタは、すべてのサンプルを受け取るとすぐにレンダリングする。

フィルタ グラフ内のすべてのフィルタは、同期を取るために、同じ基準クロックを共有する必要がある。通常、フィルタ グラフ マネージャは基準クロックを選択する。アプリケーションは、フィルタ グラフ マネージャで IMediaFilter::SetSyncSource メソッドを呼び出して、デフォルトのクロックをオーバーライドできる。ただし、このようにするのは、ほかのクロックを選択する特別な理由がある場合のみである。

IMediaFilter::Stop

IMediaFilter インターフェイス

フィルタを停止する。

構文

HRESULT Stop(void);

戻り値

HRESULT 値を返す。以下の表に示されるいずれかの値。

S_FALSE移行が完了しなかった。
S_OK成功。移行は完了した。

注意

フィルタが停止すると、フィルタはサンプルの処理や出力は行わない。また、アップストリーム フィルタからのサンプルを拒否する。

状態移行は非同期の場合がある。移行が完了する前にメソッドが返る場合、戻り値は S_FALSE となる。