Microsoft DirectX 8.0 |
フィルタを実装するための抽象クラス。
宣言 : Amfilter.h
CBaseFilter を使用してフィルタを実装するには、最低限次のステップを実行しなければならない :
CSource や CBaseRenderer や CTransformFilter を含むいくつかの基底クラスが CBaseFilter から派生される。通常 CBaseFilter を使用するより、これらのクラスの 1 つを指定してフィルタを実装する方が容易である。
Protected メンバ変数 | |
---|---|
m_State | フィルタの現在の状態。 |
m_pClock | フィルタの基準クロックへのポインタ。 |
m_tStart | ストリームタイム ゼロに対応した基準クロック。 |
m_clsid | フィルタのクラス ID (CLSID)。 |
m_pLock | クリティカル セクションへのポインタ。 |
m_pName | フィルタ名。 |
m_pGraph | フィルタ グラフ マネージャへのポインタ。 |
m_pSink | フィルタ グラフ マネージャの IMediaEventSink インターフェイスへのポインタ。 |
m_PinVersion | このフィルタの一連のピンの現在のバージョン。 |
Public メソッド | |
CBaseFilter | コンストラクタ メソッド。 |
~CBaseFilter | デストラクタ メソッド。 |
StreamTime | 現在のストリーム タイムを取得。仮想。 |
IsActive | フィルタが現時アクティブかどうか(実行中かポーズが)を決定。 |
IsStopped | フィルタが現在停止しているかどうかを決定。 |
NotifyEvent | イベント通知をフィルタグラフマネージャに送る。 |
GetFilterGraph | フィルタ グラフ マネージャへのポインタを取得。 |
ReconnectPin | 既存のピン接続を壊し、指定したメディアピンを使って、同じピンにそれを再接続する。 |
GetPinVersion | このフィルタの一連のピンのバージョン数を取得。仮想。 |
IncrementPinVersion | 一連のピンのバージョン数をインクリメント。 |
GetSetupData | フィルタについての登録データを取得。仮想。 |
Pure Virtual メソッド | |
GetPinCount | ピンの数を取得。 |
GetPin | ピンを取得。 |
IPersist メソッド | |
GetClassID | クラス ID を取得。 |
IMediaFilter メソッド | |
GetState | フィルタの状態(実行中かポーズか)を取得。 |
SetSyncSource | フィルタの基準クロックをセット。 |
GetSyncSource | フィルタが使用している基準クロックを取得。 |
Stop | フィルタを停止。 |
Pause | フィルタをポーズ。 |
Run | フィルタを実行。 |
IBaseFilter メソッド | |
EnumPins | フィルタのピンを列挙する。 |
FindPin | 指定した ID のフィルタを取得する。 |
QueryFilterInfo | フィルタについての情報を取得する。 |
JoinFilterGraph | フィルタにフィルタ グラフに参加した、あるいはフィルタ グラフを離れたことを通知する。 |
QueryVendorInfo | ベンダー情報を含む文字列を取得。 |
IAMovieSetup メソッド | |
Register | レジストリにフィルタを追加。 |
Unregister | レジストリからフィルタを削除。 |
フィルタの現在の状態。
構文
FILTER_STATE m_State;
フィルタの基準クロックへのポインタ。
構文
IReferenceClock *m_pClock;
ストリーム タイム 0 に対応した基準クロック。
構文
CRefTime m_tStart;
フィルタのクラス ID (CLSID)。
構文
CLSID m_clsid;
クリティカル セクションへのポインタ。
構文
CCritSec *m_pLock;
注意
状態移行中あるいはあるメソッドが複数の操作でその状態にアクセスしているとき、このクリティカル セクションを保持する。基底クラスでは以下のメソッドでクリティカル セクションを保持する :
ストリーミング操作(すなわち、サンプルをストリーミング フィルタに出力している)とき、このクリティカル セクションを保持しては ならない 。異なったクリティカル セクションを使ってストリームング操作を継続する。そうしないと、デッドロックが起こりうる。
フィルタ名。
構文
WCHAR *m_pName;
フィルタ グラフ マネージャへのポインタ。
構文
IFilterGraph *m_pGraph;
フィルタ グラフ マネージャの IMediaEventSink インターフェイスへのポインタ。
構文
IMediaEventSink *m_pSink;
このフィルタの一連のピンの現在のバージョン。 詳細については、「GetPinVersion」を参照すること。
構文
LONG m_PinVersion;
コンストラクタ メソッド。
構文
CBaseFilter( const TCHAR *pName, LPUNKNOWN pUnk, CCritSec *pLock, REFCLSID clsid );
パラメータ
注意
クリティカル セクション オブジェクトについては、通常次のどちらかを行う :
- CBaseFilter と CCritSec の両方を与えるクラスを派生。pLock に this ポインタを渡す。
- CBaseFilter を与え、CCritSec メンバ変数を含むクラスを派生。pLock にはその変数のアドレスを渡す。
デストラクタ メソッド。
構文
CBaseFilter(void);
注意
削除する前にフィルタを必ず停止させること。
フィルタのピンを列挙する。IBaseFilter::EnumPins メソッドの実装。
構文
HRESULT EnumPins( IEnumPins **ppEnum );
パラメータ
- ppEnum
- IEnumPins インターフェイスへのポインタを取得する変数のアドレス。
戻り値
次の HRESULT 値の 1 つを返す。
S_OK 成功。 E_OUTOFMEMORY メモリ不足。 E_POINTER NULL ポインタ引数。
注意
このメソッドは CEnumPins 基底クラスのインターフェイスを作成し、IEnumPins タイプのそのオブジェクトのポインタを返す。このメソッドが成功すると、IEnumPins インターフェイスは未処理の参照カウントを持つ。解放時には注意が必要である。
指定した ID でピンを取得。IBaseFilter::FindPin メソッドの実装。
構文
HRESULT FindPin( LPCWSTR Id, IPin **ppPin );
パラメータ
- Id
- ピンを識別する定数、NULL で終わる Unicode 文字列のポインタ。
- ppPin
- ピンの IPin インターフェイスへのポインタを取得する変数のアドレス。
戻り値
次の HRESULT 値の 1 つを返す。
S_OK 成功。 E_POINTER NULL ポインタ引数。 VFW_E_NOT_FOUND 適合するピンを見つけられなかった。
注意
このメソッドは CBasePin::Name メソッドを呼び出し、各ピンの名前と Id パラメータが示す文字列とを比較する。
このメソッドが成功すると、IEnumPins インターフェイスは未処理の参照カウントを持つ。解放時には注意が必要である。
クラス ID を取得。IPersist::GetClassID メソッドの実装。
構文
HRESULT GetClassID( CLSID *pClsID );
パラメータ
- pClsID
- クラス ID を取得する変数のポインタ。
戻り値
S_OK あるいは E_POINTER を返す。
フィルタ グラフ マネージャへのポインタを取得。
構文
IFilterGraph *GetFilterGraph(void);
戻り値
m_pGraph の値を返す。
ピンを取得する。
構文
virtual CBasePin *GetPin( int n ) PURE;
パラメータ
- n
- 指定されたピンの数。
戻り値
ピンを実装する CBasePin オブジェクトのポインタを返す。
注意
派生クラスはこの純粋仮想メソッドを実装しなければならない。このフィルタのゼロから始まる n 番目のピンのポインタを返す。
ピンの数を取得。
構文
virtual int GetPinCount(void) PURE;
戻り値
ピンの数を返す。
注意
派生クラスはこの純粋仮想メソッドを実装しなければならない。このフィルタで現在有効なピンの数を返す。フィルタは動的にピンを作成、削除できる。
フィルタの一連のピンのバージョン数を取得。
構文
virtual long GetPinVersion(void);
戻り値
m_PinVersion メンバ変数を返す。
注意
CBaseFilter コンストラクタはピン バージョンを 1 で初期化する。基底クラスでは、この数は変化しない。フィルタが動的にピンを作成、削除するとき、ピンが替わるたびにピン バージョンをインクリメントするべきである。バージョン数をインクリメントするには、IncrementPinVersion メソッドを呼び出すこと。
CEnumPins クラスによって実装されるピン列挙オブジェクトはピンバージョンを使って、そのフィルタとの同期を取る。
フィルタの登録データを取得。
注意 このメソッドは現在使われていない。Register と Unregister メソッドによって呼び出される。
構文
virtual LPAMOVIESETUP_FILTER GetSetupData(void);
戻り値
フィルタの登録情報を含む AMOVIESETUP_FILTER 構造体へのポインタを返す。
注意
基底クラスは NULL を返す。
フィルタの状態(実行中かポーズか)を取得。 IMediaFilter::GetState メソッドの実装。
構文
HRESULT GetState( DWORD dwMilliSecsTimeout, FILTER_STATE *State );
パラメータ
- dwMilliSecsTimeout
- タイムアウト間隔、ミリ秒。
- State
- フィルタの状態を示す FILTER_STATE 列挙型のメンバを取得する変数のポインタ。
戻り値
S_OK あるいは E_POINTER を返す。
注意
基底クラスでは、すべての状態移行は同期され、dwMilliSecsTimeout パラメータは無視される。派生クラスが状態移行を同期するには、このメソッドをオーバーライドし、dwMilliSecsTimeout ミリ秒のタイムアウトの間、状態移行を待つべきだ。
フィルタが使用している基準クロックを取得。IMediaFilter::GetSyncSource メソッドの実装。
構文
HRESULT GetSyncSource( IReferenceClock **pClock );
パラメータ
- pClock
- クロックの IReferenceClock インターフェイスのポインタを取得する変数のアドレス。
戻り値
S_OK あるいは E_POINTER を返す。
注意
フィルタが基準クロックを使っている場合、*pClock には NULL がセットされる。このメソッドが返ったとき、*pClock が NULL 以外なら、IReferenceClock インターフェイスが未処理の参照カウントを持つ。その解放時には注意が必要である。
一連のピンのバージョン数をインクリメント。
構文
void IncrementPinVersion(void);
注意
このメソッドは m_PinVersion メンバ変数をインクリメントする。フィルタが動的にピンを作成、削除するさい、ピンが変更されるたびにこのメソッドを呼び出すこと。詳細については、「GetPinVersion」を参照すること。
フィルタが現在アクティブ(実行中あるいはポーズ)かどうかを決定する。
構文
BOOL IsActive(void);
戻り値
フィルタがポーズあるいは実行中のとき TRUE を返し、停止しているとき FALSE を返す。
フィルタが現在停止しているかどうかを決定。
構文
BOOL IsStopped(void);
戻り値
フィルタが停止しているとき TRUE を返し、それ以外なら FALSE を返す。
フィルタにフィルタグラフに参加した、あるいは離れたことを通知する。IBaseFilter::JoinFilterGraph メソッドの実装。
構文
HRESULT JoinFilterGraph( IFilterGraph *pGraph, LPCWSTR pName );
パラメータ
- pGraph
- フィルタ グラフ マネージャの IFilterGraph インターフェイスのポインタ、フィルタが離れたときは NULL 。
- pName
- フィルタ名を含む Unicode 文字列の [in, string] ポインタ。
戻り値
S_OK を返す。
注意
このメソッドは m_pGraph メンバ変数を pGraph に等しく設定する。IMediaEventSink インターフェイス ポインタをもクエリし、m_pSink メンバ変数に保存する。しかし、このフィルタはこれらのインターフェイスの参照カウントを保持しない。フィルタ グラフ マネージャはフィルタの参照カウントを保持するので、この操作は繰り返し参照カウントを作成することになる。
このメソッドは pName によって指定された文字列を m_pName メンバ変数にコピーする。
フィルタ グラフ マネージャにイベント通知を送る。
構文
HRESULT NotifyEvent( long EventCode, LONG_PTR EventParam1, LONG_PTR EventParam2 );
パラメータ
- EventCode
- イベント通知コード。
- EventParam1
- イベントの最初のパラメータ。
- EventParam2
- イベントの 2 つ目のパラメータ。
戻り値
HRESULT 値を返す。次の表は、可能な値を示している。
S_FALSE フィルタ グラフ マネージャはイベント通知を受け取っていない。 S_OK 成功。 E_NOTIMPL フィルタは IMediaEventSink インターフェイスへのポインタを持っていない。
注意
通知コードとパラメータ値のリストについては、「イベント通知コード」を参照すること。
基底クラスでは、イベントコードが EC_COMPLETE なら、メソッドは EventParam2 パラメータをフィルタの IBaseFilter インターフェイスへのポインタに設定する。
フィルタをポーズにする。IMediaFilter::Pause メソッドの実装。
構文
HRESULT Pause(void);
戻り値
成功すれば S_OK を返す、それ以外の場合エラーの原因を含む HRESULT 値を返す。
注意
このメソッドはピンに接続した各フィルタごとに CBasePin::Active メソッドを呼び出す。
フィルタの情報を取得。IBaseFilter::QueryFilterInfo メソッドの実装。
構文
HRESULT QueryFilterInfo( FILTER_INFO *pInfo );
パラメータ
- pInfo
- FILTER_INFO 構造体へのポインタ。
戻り値
S_OK あるいは E_POINTER を返す。
注意
このメソッドは m_pName メンバ変数から、FILTER_INFO 構造体の achName メンバにフィルタの名前をコピーする。m_pName が NULL のとき、メソッドは achName を L'\0' に設定する。
このメソッドはFILTER_INFO 構造体の achName メンバを m_pGraph メンバ変数と等しくし、参照カウントをインクリメントする。呼び出し元はそのインターフェイスを解放しなければならない。
ベンダー情報を含む文字列を取得。
構文
HRESULT QueryVendorInfo( LPWSTR *pVendorInfo );
パラメータ
- pVendorInfo
- ベンダー情報を含むワイド文字列のポインタを取得する変数のアドレス。
戻り値
E_NOTIMPL を返す。
注意
フィルタのベンダー情報を提供し、このメソッドをオーバーライドする。このメソッドを実装する際、CoTaskMemAlloc 関数を使用して文字列のメモリ割り当てを行う。呼び出し元は CoTaskMemFree 関数を呼び出す責任を持つ。
既存のピン接続を壊し、指定したメディアピンを使って、同じピンにそれを再接続する。
構文
HRESULT ReconnectPin( IPin *pPin, AM_MEDIA_TYPE const *pmt );
パラメータ
- pPin
- ピンの IPin インターフェイスへのポインタ。
- pmt
- メディア タイプを指定する AM_MEDIA_TYPE 構造体へのポインタあるいは NULL 。
戻り値
HRESULT 値を返す。以下のいずれかの値を返す。
S_OK 成功。 E_NOINTERFACE m_pGraph メンバ 変数は NULL。
注意
このメソッドはフィルタ グラフ マネージャの IFilterGraph2::ReconnectEx メソッドを呼び出す。IFilterGraph2 が無効なら、メソッドは IFilterGraph::Reconnect を呼び出す。
フィルタをレジストリに追加する。IAMovieSetup::Register メソッドの実装。
注意 この IAMovieSetup インターフェイスは使われていない。新しいフィルタは IAMovieSetup を要求しない AMovieDllRegisterServer2 関数を使ってレジストリに追加すべきである。詳細については、「DirectShow オブジェクトの登録方法」を参照すること。
構文
HRESULT Register(void);
戻り値
以下の HRESULT 値の 1 つを返す。
S_OK 成功。 S_FALSE 有効なレジストリ情報はない。
注意
このメソッドは フィルタのレジストリ登録に、AMovieSetupRegisterFilter 関数を呼び出す。
フィルタを実行する。IMediaFilter::Run メソッドの実装。
構文
HRESULT Run( REFERENCE_TIME tStart );
パラメータ
- tStart
- ストリーム タイム 0 に対応する基準タイム。
戻り値
成功すれば S_OK を返す、それ以外の場合エラーの原因を示す HRESULT 値を返す。
注意
フィルタが停止されると、このメソッドは CBaseFilter::Pause メソッドを呼び出してフィルタをポーズにする。次にフィルタに接続している各ピンのCBasePin::Run メソッドを呼び出す。最後に、m_State メンバ変数をState_Running に設定する。
ストリーム タイムは現在の基準時間引く tStart で計算される。タイム スタンプ ゼロのメディア サンプルは tStart タイムにレンダリングされる。
フィルタの基準クロックをセット。IMediaFilter::SetSyncSource メソッドの実装。
構文
HRESULT SetSyncSource( IReferenceClock *pClock );
パラメータ
- pClock
- クロックの IReferenceClock インターフェイスへのポインタ、あるいは NULL 。
戻り値
S_OK を返す。
フィルタを停止する。 IMediaFilter::Stop メソッドの実装。
構文
HRESULT Stop(void);
戻り値
成功すると S_OK を返す、それ以外の場合エラーの原因を含む HRESULT 値を返す。
注意
このメソッドはフィルタに接続している各ピンの CBasePin::Inactive メソッドを呼び出す。
現在のストリーム タイムを取得。
構文
virtual HRESULT StreamTime( CRefTime& rtStream );
パラメータ
- rtStream
- 現在のストリーム タイムを受け取る CRefTime オブジェクトへの参照。
戻り値
HRESULT 値を返す。次の表は、可能な値を示している。
S_OK 成功。 VFW_E_NO_CLOCK 有効な基準クロックはない。
注意
ストリーム タイムは現在の(基準クロックで与えられる)基準タイム 引く (m_tStart によって指定される)開始タイムとして定義される。メディア サンプルの タイム スタンプ はレダリング時にストリーム タイムを指定する。現在のストリーム タイムより小さいタイム スタンプを持つサンプルがまだレンダリングされてないなら、それは遅れている。
レジストリからフィルタを削除する。IAMovieSetup::Unregister メソッドの実装。
注意 この IAMovieSetup インターフェイスは使われていない。新しいフィルタはレジストリの削除に AMovieDllRegisterServer2 関数を使用べきだ。詳細については、「DirectShow オブジェクトの登録方法」を参照すること。
構文
HRESULT Unregister(void);
戻り値
成功なら S_OK を返す、それ以外の場合エラーの原因を示す HRESULT 値を返す。
注意
このメソッドはAMovieSetupRegisterFilter 関数を呼び出してフィルタをレジストリから削除する。