Microsoft DirectX 8.0

CBaseFilter クラス

CBaseFilter クラスの階層

フィルタを実装するための抽象クラス。

宣言 : Amfilter.h

CBaseFilter を使用してフィルタを実装するには、最低限次のステップを実行しなければならない :

CSourceCBaseRendererCTransformFilter を含むいくつかの基底クラスが 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レジストリからフィルタを削除。

CBaseFilter.m_State

CBaseFilter クラス

フィルタの現在の状態。

構文

FILTER_STATE m_State;

CBaseFilter.m_pClock

CBaseFilter クラス

フィルタの基準クロックへのポインタ。

構文

IReferenceClock *m_pClock;

CBaseFilter.m_tStart

CBaseFilter クラス

ストリーム タイム 0 に対応した基準クロック。

構文

CRefTime m_tStart;

CBaseFilter.m_clsid

CBaseFilter クラス

フィルタのクラス ID (CLSID)。

構文

CLSID m_clsid;

CBaseFilter.m_pLock

CBaseFilter クラス

クリティカル セクションへのポインタ。

構文

CCritSec *m_pLock;

注意

状態移行中あるいはあるメソッドが複数の操作でその状態にアクセスしているとき、このクリティカル セクションを保持する。基底クラスでは以下のメソッドでクリティカル セクションを保持する :

ストリーミング操作(すなわち、サンプルをストリーミング フィルタに出力している)とき、このクリティカル セクションを保持しては ならない 。異なったクリティカル セクションを使ってストリームング操作を継続する。そうしないと、デッドロックが起こりうる。

CBaseFilter.m_pName

CBaseFilter クラス

フィルタ名。

構文

WCHAR *m_pName;

CBaseFilter.m_pGraph

CBaseFilter クラス

フィルタ グラフ マネージャへのポインタ。

構文

IFilterGraph *m_pGraph;

CBaseFilter.m_pSink

CBaseFilter クラス

フィルタ グラフ マネージャの IMediaEventSink インターフェイスへのポインタ。

構文

IMediaEventSink *m_pSink;

CBaseFilter.m_PinVersion

CBaseFilter クラス

このフィルタの一連のピンの現在のバージョン。 詳細については、「GetPinVersion」を参照すること。

構文

LONG m_PinVersion;

CBaseFilter::CBaseFilter

CBaseFilter クラス

コンストラクタ メソッド。

構文

CBaseFilter(
    const TCHAR *pName,
    LPUNKNOWN pUnk,
    CCritSec *pLock,
    REFCLSID clsid
);

パラメータ

pName
デバッグ目的で使用する、フィルタの名前を含む文字列へのポインタ。
pUnk
オブジェクトの所有者へのポインタ。このオブジェクトが集成されているなら、集成されたオブジェクトの IUnknown インターフェイスを渡す。それ以外ではこのパラメータを NULL に設定する。
pLock
状態変化を継続する CCritSec ロックへのポインタ。
clsid
オブジェクトのクラス ID。

注意

クリティカル セクション オブジェクトについては、通常次のどちらかを行う :

CBaseFilter::~CBaseFilter

CBaseFilter クラス

デストラクタ メソッド。

構文

CBaseFilter(void);

注意

削除する前にフィルタを必ず停止させること。

CBaseFilter::EnumPins

CBaseFilter クラス

フィルタのピンを列挙する。IBaseFilter::EnumPins メソッドの実装。

構文

HRESULT EnumPins(
    IEnumPins **ppEnum
);

パラメータ

ppEnum
IEnumPins インターフェイスへのポインタを取得する変数のアドレス。

戻り値

次の HRESULT 値の 1 つを返す。

S_OK成功。
E_OUTOFMEMORYメモリ不足。
E_POINTERNULL ポインタ引数。

注意

このメソッドは CEnumPins 基底クラスのインターフェイスを作成し、IEnumPins タイプのそのオブジェクトのポインタを返す。このメソッドが成功すると、IEnumPins インターフェイスは未処理の参照カウントを持つ。解放時には注意が必要である。

CBaseFilter::FindPin

CBaseFilter クラス

指定した ID でピンを取得。IBaseFilter::FindPin メソッドの実装。

構文

HRESULT FindPin(
    LPCWSTR Id,
    IPin **ppPin
);

パラメータ

Id
ピンを識別する定数、NULL で終わる Unicode™ 文字列のポインタ。
ppPin
ピンの IPin インターフェイスへのポインタを取得する変数のアドレス。

戻り値

次の HRESULT 値の 1 つを返す。

S_OK成功。
E_POINTERNULL ポインタ引数。
VFW_E_NOT_FOUND 適合するピンを見つけられなかった。

注意

このメソッドは CBasePin::Name メソッドを呼び出し、各ピンの名前と Id パラメータが示す文字列とを比較する。

このメソッドが成功すると、IEnumPins インターフェイスは未処理の参照カウントを持つ。解放時には注意が必要である。

CBaseFilter::GetClassID

CBaseFilter クラス

クラス ID を取得。IPersist::GetClassID メソッドの実装。

構文

HRESULT GetClassID(
    CLSID *pClsID
    );

パラメータ

pClsID
クラス ID を取得する変数のポインタ。

戻り値

S_OK あるいは E_POINTER を返す。

CBaseFilter::GetFilterGraph

CBaseFilter クラス

フィルタ グラフ マネージャへのポインタを取得。

構文

IFilterGraph *GetFilterGraph(void);

戻り値

m_pGraph の値を返す。

CBaseFilter::GetPin

CBaseFilter クラス

ピンを取得する。

構文

virtual CBasePin *GetPin(
    int n
) PURE;

パラメータ

n
指定されたピンの数。

戻り値

ピンを実装する CBasePin オブジェクトのポインタを返す。

注意

派生クラスはこの純粋仮想メソッドを実装しなければならない。このフィルタのゼロから始まる n 番目のピンのポインタを返す。

CBaseFilter::GetPinCount

CBaseFilter クラス

ピンの数を取得。

構文

virtual int GetPinCount(void) PURE;

戻り値

ピンの数を返す。

注意

派生クラスはこの純粋仮想メソッドを実装しなければならない。このフィルタで現在有効なピンの数を返す。フィルタは動的にピンを作成、削除できる。

CBaseFilter::GetPinVersion

CBaseFilter クラス

フィルタの一連のピンのバージョン数を取得。

構文

virtual long GetPinVersion(void);

戻り値

m_PinVersion メンバ変数を返す。

注意

CBaseFilter コンストラクタはピン バージョンを 1 で初期化する。基底クラスでは、この数は変化しない。フィルタが動的にピンを作成、削除するとき、ピンが替わるたびにピン バージョンをインクリメントするべきである。バージョン数をインクリメントするには、IncrementPinVersion メソッドを呼び出すこと。

CEnumPins クラスによって実装されるピン列挙オブジェクトはピンバージョンを使って、そのフィルタとの同期を取る。

CBaseFilter::GetSetupData

CBaseFilter クラス

フィルタの登録データを取得。

注意   このメソッドは現在使われていない。RegisterUnregister メソッドによって呼び出される。

構文

virtual LPAMOVIESETUP_FILTER GetSetupData(void);

戻り値

フィルタの登録情報を含む AMOVIESETUP_FILTER 構造体へのポインタを返す。

注意

基底クラスは NULL を返す。

CBaseFilter::GetState

CBaseFilter クラス

フィルタの状態(実行中かポーズか)を取得。 IMediaFilter::GetState メソッドの実装。

構文

HRESULT GetState(
    DWORD dwMilliSecsTimeout,
    FILTER_STATE *State
);

パラメータ

dwMilliSecsTimeout
タイムアウト間隔、ミリ秒。
State
フィルタの状態を示す FILTER_STATE 列挙型のメンバを取得する変数のポインタ。

戻り値

S_OK あるいは E_POINTER を返す。

注意

基底クラスでは、すべての状態移行は同期され、dwMilliSecsTimeout パラメータは無視される。派生クラスが状態移行を同期するには、このメソッドをオーバーライドし、dwMilliSecsTimeout ミリ秒のタイムアウトの間、状態移行を待つべきだ。

CBaseFilter::GetSyncSource

CBaseFilter クラス

フィルタが使用している基準クロックを取得。IMediaFilter::GetSyncSource メソッドの実装。

構文

HRESULT GetSyncSource(
    IReferenceClock **pClock
    );

パラメータ

pClock
クロックの IReferenceClock インターフェイスのポインタを取得する変数のアドレス。

戻り値

S_OK あるいは E_POINTER を返す。

注意

フィルタが基準クロックを使っている場合、*pClock には NULL がセットされる。このメソッドが返ったとき、*pClock が NULL 以外なら、IReferenceClock インターフェイスが未処理の参照カウントを持つ。その解放時には注意が必要である。

CBaseFilter::IncrementPinVersion

CBaseFilter クラス

一連のピンのバージョン数をインクリメント。

構文

void IncrementPinVersion(void);

注意

このメソッドは m_PinVersion メンバ変数をインクリメントする。フィルタが動的にピンを作成、削除するさい、ピンが変更されるたびにこのメソッドを呼び出すこと。詳細については、「GetPinVersion」を参照すること。

CBaseFilter::IsActive

CBaseFilter クラス

フィルタが現在アクティブ(実行中あるいはポーズ)かどうかを決定する。

構文

BOOL IsActive(void);

戻り値

フィルタがポーズあるいは実行中のとき TRUE を返し、停止しているとき FALSE を返す。

CBaseFilter::IsStopped

CBaseFilter クラス

フィルタが現在停止しているかどうかを決定。

構文

BOOL IsStopped(void);

戻り値

フィルタが停止しているとき TRUE を返し、それ以外なら FALSE を返す。

CBaseFilter::JoinFilterGraph

CBaseFilter クラス

フィルタにフィルタグラフに参加した、あるいは離れたことを通知する。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 メンバ変数にコピーする。

CBaseFilter::NotifyEvent

CBaseFilter クラス

フィルタ グラフ マネージャにイベント通知を送る。

構文

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 インターフェイスへのポインタに設定する。

CBaseFilter::Pause

CBaseFilter クラス

フィルタをポーズにする。IMediaFilter::Pause メソッドの実装。

構文

HRESULT Pause(void);

戻り値

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

注意

このメソッドはピンに接続した各フィルタごとに CBasePin::Active メソッドを呼び出す。

CBaseFilter::QueryFilterInfo

CBaseFilter クラス

フィルタの情報を取得。IBaseFilter::QueryFilterInfo メソッドの実装。

構文

HRESULT QueryFilterInfo(
    FILTER_INFO *pInfo
);

パラメータ

pInfo
FILTER_INFO 構造体へのポインタ。

戻り値

S_OK あるいは E_POINTER を返す。

注意

このメソッドは m_pName メンバ変数から、FILTER_INFO 構造体の achName メンバにフィルタの名前をコピーする。m_pName が NULL のとき、メソッドは achNameL'\0' に設定する。

このメソッドはFILTER_INFO 構造体の achName メンバを m_pGraph メンバ変数と等しくし、参照カウントをインクリメントする。呼び出し元はそのインターフェイスを解放しなければならない。

CBaseFilter::QueryVendorInfo

CBaseFilter クラス

ベンダー情報を含む文字列を取得。

構文

HRESULT QueryVendorInfo(
    LPWSTR *pVendorInfo
    );

パラメータ

pVendorInfo
ベンダー情報を含むワイド文字列のポインタを取得する変数のアドレス。

戻り値

E_NOTIMPL を返す。

注意

フィルタのベンダー情報を提供し、このメソッドをオーバーライドする。このメソッドを実装する際、CoTaskMemAlloc 関数を使用して文字列のメモリ割り当てを行う。呼び出し元は CoTaskMemFree 関数を呼び出す責任を持つ。

CBaseFilter::ReconnectPin

CBaseFilter クラス

既存のピン接続を壊し、指定したメディアピンを使って、同じピンにそれを再接続する。

構文

HRESULT ReconnectPin(
    IPin *pPin,
    AM_MEDIA_TYPE const *pmt
);

パラメータ

pPin
ピンの IPin インターフェイスへのポインタ。
pmt
メディア タイプを指定する AM_MEDIA_TYPE 構造体へのポインタあるいは NULL 。

戻り値

HRESULT 値を返す。以下のいずれかの値を返す。

S_OK成功。
E_NOINTERFACEm_pGraph メンバ 変数は NULL。

注意

このメソッドはフィルタ グラフ マネージャの IFilterGraph2::ReconnectEx メソッドを呼び出す。IFilterGraph2 が無効なら、メソッドは IFilterGraph::Reconnect を呼び出す。

CBaseFilter::Register

CBaseFilter クラス

フィルタをレジストリに追加する。IAMovieSetup::Register メソッドの実装。

注意   この IAMovieSetup インターフェイスは使われていない。新しいフィルタは IAMovieSetup を要求しない AMovieDllRegisterServer2 関数を使ってレジストリに追加すべきである。詳細については、「DirectShow オブジェクトの登録方法」を参照すること。

構文

HRESULT Register(void);

戻り値

以下の HRESULT 値の 1 つを返す。

S_OK成功。
S_FALSE有効なレジストリ情報はない。

注意

このメソッドは フィルタのレジストリ登録に、AMovieSetupRegisterFilter 関数を呼び出す。

CBaseFilter::Run

CBaseFilter クラス

フィルタを実行する。IMediaFilter::Run メソッドの実装。

構文

HRESULT Run(
    REFERENCE_TIME tStart
);

パラメータ

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

戻り値

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

注意

フィルタが停止されると、このメソッドは CBaseFilter::Pause メソッドを呼び出してフィルタをポーズにする。次にフィルタに接続している各ピンのCBasePin::Run メソッドを呼び出す。最後に、m_State メンバ変数をState_Running に設定する。

ストリーム タイムは現在の基準時間引く tStart で計算される。タイム スタンプ ゼロのメディア サンプルは tStart タイムにレンダリングされる。

CBaseFilter::SetSyncSource

CBaseFilter クラス

フィルタの基準クロックをセット。IMediaFilter::SetSyncSource メソッドの実装。

構文

HRESULT SetSyncSource(
    IReferenceClock *pClock
    );

パラメータ

pClock
クロックの IReferenceClock インターフェイスへのポインタ、あるいは NULL 。

戻り値

S_OK を返す。

CBaseFilter::Stop

CBaseFilter クラス

フィルタを停止する。 IMediaFilter::Stop メソッドの実装。

構文

HRESULT Stop(void);

戻り値

成功すると S_OK を返す、それ以外の場合エラーの原因を含む HRESULT 値を返す。

注意

このメソッドはフィルタに接続している各ピンの CBasePin::Inactive メソッドを呼び出す。

CBaseFilter::StreamTime

CBaseFilter クラス

現在のストリーム タイムを取得。

構文

virtual HRESULT StreamTime(
    CRefTime& rtStream
);

パラメータ

rtStream
現在のストリーム タイムを受け取る CRefTime オブジェクトへの参照。

戻り値

HRESULT 値を返す。次の表は、可能な値を示している。

S_OK成功。
VFW_E_NO_CLOCK有効な基準クロックはない。

注意

ストリーム タイムは現在の(基準クロックで与えられる)基準タイム 引く (m_tStart によって指定される)開始タイムとして定義される。メディア サンプルの タイム スタンプ はレダリング時にストリーム タイムを指定する。現在のストリーム タイムより小さいタイム スタンプを持つサンプルがまだレンダリングされてないなら、それは遅れている。

CBaseFilter::Unregister

CBaseFilter クラス

レジストリからフィルタを削除する。IAMovieSetup::Unregister メソッドの実装。

注意   この IAMovieSetup インターフェイスは使われていない。新しいフィルタはレジストリの削除に AMovieDllRegisterServer2 関数を使用べきだ。詳細については、「DirectShow オブジェクトの登録方法」を参照すること。

構文

HRESULT Unregister(void);

戻り値

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

注意

このメソッドはAMovieSetupRegisterFilter 関数を呼び出してフィルタをレジストリから削除する。