Microsoft DirectX 8.0 |
レンダリング フィルタを実装するための基底クラス。CRendererInputPin クラスによって実装される入力ピンを 1 つサポートする。
宣言 : Renbase.h
このクラスを使用するには、CBaseRenderer を継承する派生クラスを宣言する。派生クラスでは、少なくとも以下のメソッドを実装する必要がある。これらのメソッドは、基底クラス内で純粋仮想関数として宣言される。
状態の変化および同期の問題を処理する基底クラス。この基底クラスは、サンプルのレンダリングのスケジュールも行う。ただし、品質コントロールのための手段は実装しない。
この基底クラスは、各種の "ハンドラ" メソッドも宣言する。これらは、ストリーミング処理におけるそれぞれ固有の段階で、フィルタが呼び出すメソッドである。基底クラスでは何もしないが、派生クラスでオーバーライドできる。後の一覧では、これらのメソッドが「Public メソッド : ハンドラ」としてまとめられている。
OnReceiveFirstSample ハンドラには少し説明が必要だろう。フィルタはこのメソッドを呼び出すのは、ポーズ中にサンプルを受け取る場合である。この状況は、グラフが停止からポーズに切り替わる場合か、またはポーズ中にグラフがシークされる場合に発生する可能性がある。ビデオ レンダラは、通常、このサンプルを使って静止フレームを表示する。ポーズから実行に切り替わると、フィルタは、DoRenderSample メソッドにストリーム内の最初のサンプルと同じサンプルを送る。
スケジューリング
アップストリーム フィルタが入力ピンの IMemInputPin::Receive メソッドを呼び出してサンプルを渡すと、ピンはその呼び出しをフィルタの Receive メソッドに渡す。フィルタは、サンプルをドロップするか、直ちにレンダリングするか、またはレンダリングをスケジュールする。
サンプルにタイム スタンプがない場合、または基準クロックが利用できない場合、フィルタはサンプルを直ちにレンダリングする。それ以外の場合、フィルタは ShouldDrawSampleNow メソッドを呼び出して、実行すべき処理を判断する。デフォルトでは、タイム スタンプに基づいてサンプルがスケジュールされる。派生クラスでは、ShouldDrawSampleNow をオーバーライドして、品質コントロールをサポートできる。
サンプルをスケジュールするため、フィルタは、アドバイズ要求を作成する IReferenceClock::AdviseTime メソッドを呼び出す。この結果、スケジュールされた時間になるか、またはフィルタの状態が変化するまで、Receive メソッドがブロックする。ブロックすると、アップストリーム フィルタは、現在のサンプルがレンダリングされるまで、次のサンプルを渡すことができなくなる。
アップストリーム フィルタが IPin::EndOfStream メソッドを呼び出してエンドオブストリームを通知すると、フィルタは、フィルタ グラフ マネージャに EC_COMPLETE イベントを送信する。フィルタは、このイベントを送信する前に、現在のサンプルの終了タイムまで待機する。
プロテクト メンバ変数 | |
---|---|
m_bAbort | レンダリングを停止して、以降のサンプルを拒否するかどうかを示すフラグ。 |
m_bEOS | エンドオブストリームに達しているかどうかを示すフラグ。 |
m_bEOSDelivered | フィルタが EC_COMPLETE イベントを発行したかどうかを示すフラグ。 |
m_bInReceive | フィルタが Receive 呼び出しの処理中かどうかを示すフラグ。 |
m_bRepaintStatus | 再描画イベントを有効または無効にするフラグ。 |
m_bStreaming | フィルタがデータのストリーミング中かどうかを示すフラグ。 |
m_dwAdvise | レンダリングをスケジュールするタイマ イベントの識別子。 |
m_EndOfStreamTimer | EC_COMPLETE 通知のスケジュールに使用されるタイマ イベントの識別子。 |
m_evComplete | 状態の移行が完了したときに通知済になるイベント。 |
m_InterfaceLock | フィルタ状態のロック。 |
m_pInputPin | フィルタの入力ピンへのポインタ。 |
m_pMediaSample | 現在のメディア サンプルへのポインタ。 |
m_pPosition | アップストリームにシーク コマンドを渡すためのヘルパー オブジェクト。 |
m_pQSink | 品質コントロール メッセージを受け取るオブジェクトへのポインタ。 |
m_RendererLock | ストリーミングのロック。 |
m_RenderEvent | レンダリングのスケジュールに使用されるイベント。 |
m_SignalTime | 現在のサンプル上の終了タイム。 |
m_ThreadSignal | ストリーミング スレッドを解放するために使用されるイベント。 |
Public メソッド | |
CancelNotification | レンダリングをスケジュールするタイマ イベントをキャンセルする。仮想。 |
CBaseRenderer | コンストラクタ メソッド。 |
~CBaseRenderer | デストラクタ メソッド。 |
GetMediaPositionInterface | フィルタの IMediaPosition および IMediaSeeking インターフェイス ポインタを取得する。仮想。 |
GetPin | ピンを取得する。仮想。 |
GetPinCount | ピンの数を取得する。仮想。 |
GetSampleTimes | サンプルからタイム スタンプを取得する。仮想。 |
OnDisplayChange | フィルタ グラフ マネージャに EC_DISPLAY_CHANGED イベントを発行する。 |
PrepareReceive | サンプルをレンダリングする準備をする。仮想。 |
Receive | ストリームの次のメディア サンプルを取得する。仮想。 |
Render | サンプルをレンダリングする。仮想。 |
ScheduleSample | サンプルのレンダリングをスケジュールする。仮想。 |
SendNotifyWindow | アップストリーム フィルタにビデオ ウィンドウのハンドルを通知する。 |
SendRepaint | フィルタ グラフ マネージャに再描画イベントを送信する。 |
SetMediaType | ピンのメディア タイプを設定するときに呼び出される。仮想。 |
SignalTimerFired | レンダリングのスケジュールに使用されるタイマ識別子をクリアする。 |
SourceThreadCanWait | ストリーミング スレッドを保持または解放する。仮想。 |
WaitForReceiveToComplete | Receive メソッドが完了するまで待機する。 |
WaitForRenderTime | 現在のサンプルのプレゼンテーション時間を待機する。仮想。 |
Public メソッド : アクセサ | |
ClearPendingSample | 現在のサンプルを解放する。仮想。 |
GetCurrentSample | 現在のサンプルを取得する。仮想。 |
GetRealState | フィルタの状態を取得する。 |
GetRenderEvent | レンダリングをスケジュールするイベントを取得する。 |
HaveCurrentSample | フィルタにサンプルがあるかどうかを判断する。仮想。 |
IsEndOfStream | エンドオブストリーム通知が受信されたかどうかを照会する。 |
IsEndOfStreamDelivered | EC_COMPLETE イベントがフィルタ グラフ マネージャに配信されたかどうかを照会する。 |
IsStreaming | フィルタがデータのストリーミング中かどうかを照会する。 |
SetAbortSignal | レンダリングを停止して以降のサンプルを拒否するかどうかを示す、中止フラグを設定する。 |
SetRepaintStatus | 再描画イベントを有効または無効にする。 |
Public メソッド : 状態変更関連 | |
Active | 状態がポーズまたは実行に切り替わるときに呼び出される。仮想。 |
BeginFlush | フラッシュ処理を開始する。仮想。 |
BreakConnect | 接続から入力ピンを解放する。仮想。 |
CheckReady | 状態の移行が完了しているかどうかを照会する。 |
CompleteConnect | 入力ピンからほかのピンへの接続を完了する。仮想。 |
CompleteStateChange | ポーズ状態への移行が完了しているかどうかを判断する。仮想。 |
EndFlush | フラッシュ処理を終了する。仮想。 |
Inactive | 状態が停止に切り替わるときに呼び出される。仮想。 |
NotReady | 状態の移行がまだ完了していないことを通知する。 |
Ready | 状態の移行が完了していることを通知する。 |
StartStreaming | フィルタが実行状態に切り替わるときに、ストリーミングを開始する。仮想。 |
StopStreaming | フィルタが実行状態以外に切り替わるときに、ストリーミングを停止する。仮想。 |
Public メソッド : エンドオブストリーム関連 | |
EndOfStream | 入力ピンがエンドオブストリーム通知を受信したことをフィルタに知らせる。仮想。 |
NotifyEndOfStream | フィルタ グラフ マネージャに EC_COMPLETE イベントを送信する。 |
ResetEndOfStream | エンドオブストリーム関連フラグをリセットする。 |
ResetEndOfStreamTimer | EC_COMPLETE 通知をスケジュールするタイマをキャンセルする。仮想。 |
SendEndOfStream | エンドオブストリームに達している場合に、フィルタ グラフ マネージャへの EC_COMPLETE イベントをスケジュールする。仮想。 |
TimerCallback | エンドオブストリーム用のタイマ イベントで使用するコールバック メソッド。 |
Public メソッド : ハンドラ | |
OnReceiveFirstSample | ポーズ中にフィルタがサンプルを受信するときに呼び出される。仮想。 |
OnRenderEnd | サンプルがレンダリングされた後で呼び出される。仮想。 |
OnRenderStart | レンダリングが開始されようとしているときに呼び出される。仮想。 |
OnStartStreaming | フィルタがストリーミングを開始するときに呼び出される。仮想。 |
OnStopStreaming | フィルタがストリーミングを停止するときに呼び出される。仮想。 |
OnWaitEnd | フィルタがサンプルのプレゼンテーション時間の待機を終了するときに呼び出される。仮想。 |
OnWaitStart | フィルタがサンプルのプレゼンテーション時間の待機を開始するときに呼び出される。仮想。 |
PrepareRender | フィルタがサンプルをレンダリングする前に呼び出される。仮想。 |
ShouldDrawSampleNow | サンプルのレンダリングをスケジュールする方法を判断する。仮想。 |
Pure Virtual メソッド | |
CheckMediaType | 特定のメディア タイプをフィルタが受け入れるかどうかを確認する。 |
DoRenderSample | サンプルをレンダリングする。 |
IMediaFilter メソッド | |
GetState | フィルタの状態 (実行、停止、ポーズ) を取得する。 |
Pause | フィルタをポーズする。 |
Run | フィルタを実行する。 |
Stop | フィルタを停止する。 |
IBaseFilter メソッド | |
FindPin | 指定された識別子を持つピンを取得する。 |
レンダリングを停止して、以降のサンプルを拒否するかどうかを示すフラグ。
構文
BOOL m_bAbort;
エンドオブストリームに達しているかどうかを示すフラグ。
構文
BOOL m_bEOS;
フィルタが EC_COMPLETE イベントを発行したかどうかを示すフラグ。
構文
BOOL m_bEOSDelivered;
フィルタが Receive 呼び出しの処理中かどうかを示すフラグ。
構文
BOOL m_bInReceive;
再描画イベントを有効または無効にするフラグ。
構文
BOOL m_bRepaintStatus;
フィルタがデータのストリーミング中かどうかを示すフラグ。
構文
BOOL m_bStreaming;
レンダリングをスケジュールするタイマ イベントの識別子。
構文
DWORD_PTR m_dwAdvise;
EC_COMPLETE 通知のスケジュールに使用されるタイマ イベントの識別子。
構文
UINT m_EndOfStreamTimer;
状態の移行が完了したときに通知済になるイベント。
構文
CAMEvent m_evComplete;
フィルタ状態のロック。
構文
CCritSec m_InterfaceLock;
フィルタの入力ピンへのポインタ。
構文
CRendererInputPin *m_pInputPin;
現在のメディア サンプルへのポインタ。
構文
IMediaSample *m_pMediaSample;
アップストリームにシーク コマンドを渡すためのヘルパー オブジェクト。
構文
CRendererPosPassThru *m_pPosition;
品質コントロール メッセージを受け取るオブジェクトへのポインタ。
構文
IQualityControl *m_pQSink;
注意
基底クラスでは品質コントロールを実装しない。このメンバ変数のデフォルト値は NULL である。
ストリーミングのロック。
構文
CCritSec m_RendererLock;
レンダリングのスケジュールに使用されるイベント。
構文
CAMEvent m_RenderEvent;
現在のサンプル上の終了タイム。
構文
REFERENCE_TIME m_SignalTime;
ストリーミング スレッドを解放するために使用されるイベント。
構文
CAMEvent m_ThreadSignal;
状態がポーズまたは実行に切り替わるときに呼び出される。
構文
virtual HRESULT Active(void);
戻り値
S_OK を返す。
注意
入力ピンは、ピン自体の CRendererInputPin::Active メソッドからこのメソッドを呼び出す。このメソッドは基底クラスでは何もしない。
フラッシュ処理を開始する。
構文
virtual HRESULT BeginFlush(void);
戻り値
S_OK を返す。
注意
フィルタの入力ピンは、IPin::BeginFlush メソッドの呼び出しを受け取ると、このメソッドを呼び出す。フィルタは、ストリーミング スレッドを解放し、レンダリングのために保持しているサンプルをすべて解放する。
接続から入力ピンを解放する
構文
virtual HRESULT BreakConnect(void);
戻り値
次の一覧に含まれるいずれかの HRESULT 値を返す。
S_FALSE ピンが接続されていない。 S_OK 成功。 VFW_E_NOT_STOPPED フィルタがまだアクティブである。
注意
フィルタの入力ピンは、ピン自体の BreakConnect メソッド内部からこのメソッドを呼び出す (詳細については「CBasePin::BreakConnect」を参照)。フィルタは、エンドオブストリーム関連フラグのリセットなどの内部的な定番処理をいくつか実行する。
レンダリングをスケジュールするタイマ イベントをキャンセルする。
構文
virtual HRESULT CancelNotification(void);
戻り値
次の一覧に含まれるいずれかの HRESULT 値を返す。
S_FALSE 保留されているタイマ イベントがない。 S_OK 成功。
注意
フィルタはストリーミングを停止するときにこのメソッドを呼び出す。メソッドは、スケジュールされているレンダリングをすべてキャンセルする。
コンストラクタ メソッド。
構文
CBaseRenderer( REFCLSID RenderClass, TCHAR *pName, LPUNKNOWN pUnk, HRESULT *phr );
パラメータ
デストラクタ メソッド。
構文
~CBaseRenderer(void);
特定のメディア タイプをフィルタが受け入れるかどうかを確認する。
構文
virtual HRESULT CheckMediaType( const CMediaType *pmt ) PURE;
パラメータ
- pmt
- 提案されたメディア タイプを含む CMediaType オブジェクトへのポインタ。
戻り値
提案されたメディア タイプが受け入れられるなら S_OK を返す。そうでなければ S_FALSE かエラー コードを返す。
注意
入力ピンは、ピン自体の CBasePin::CheckMediaType メソッドからこのメソッドを呼び出す。派生クラスではこのメソッドを実装する必要がある。
状態の移行が完了しているかどうかを照会する。
構文
BOOL CheckReady(void);
戻り値
状態の移行が完了している場合は TRUE を返し、フィルタがまだ新しい状態に移行中の場合は FALSE を返す。
参照
現在のサンプルを解放する。
構文
virtual HRESULT ClearPendingSample(void);
戻り値
S_OK を返す。
入力ピンからほかのピンへの接続を完了する。
構文
virtual HRESULT CompleteConnect( IPin *pReceivePin );
パラメータ
- pReceivePin
- 出力ピンの IPin インターフェイスへのポインタ。
戻り値
S_OK を返す。
注意
フィルタの入力ピンは、ピン接続を完了するために呼び出される、ピン自体の CompleteConnect メソッド内部からこのメソッドを呼び出す (詳細については「CBasePin::CompleteConnect」を参照)。フィルタは、SetRepaintStatus メソッドを呼び出して EC_REPAINT イベントを有効にする。
ポーズ状態への移行が完了しているかどうかを判断する。
構文
virtual HRESULT CompleteStateChange( FILTER_STATE OldState );
パラメータ
- OldState
- 移行の前の状態。
戻り値
移行が完了している場合は、S_OK を返す。それ以外の場合は、S_FALSE を返す。
注意
Pause メソッドは、このメソッドを呼び出して、移行状態を更新する。通常、ポーズ状態への移行は、フィルタがサンプルを受け取るまで完了しない。ただし、たとえばフィルタが接続されていない場合や、エンドオブストリームに達している場合などには、移行が直ちに完了する。このメソッドは、各種の条件を確認したうえで、Ready メソッドまたは NotReady メソッドを呼び出して、移行状態を更新する。
サンプルをレンダリングする。
構文
virtual HRESULT DoRenderSample( IMediaSample *pMediaSample ) PURE;
パラメータ
- pMediaSample
- サンプルの IMediaSample インターフェイスへのポインタ。
戻り値
HRESULT 値を返す。
注意
派生クラスではこのメソッドを実装する必要がある。メソッドの動作は、実装されるフィルタの種類によってまったく異なる。たとえばビデオ レンダラであれば、サンプルに含まれるビデオ イメージを描画する。
フラッシュ処理を終了する。
構文
virtual HRESULT EndFlush(void);
戻り値
S_OK を返す。
注意
フィルタの入力ピンは、IPin::EndFlush メソッドの呼び出しを受け取ると、このメソッドを呼び出す。
入力ピンがエンドオブストリーム通知を受信したことをフィルタに知らせる。
構文
HRESULT EndOfStream(void);
戻り値
S_OK を返す。
注意
フィルタの入力ピンは、エンドオブストリーム通知を受信すると、このメソッドを呼び出す。
このメソッドは、m_bEOS フラグを TRUE に設定し、SendEndOfStream メソッドを呼び出して EC_COMPLETE イベントをスケジュールする。フィルタがポーズ中にサンプルを待機している場合、このメソッドは状態の移行を完了する。
指定された識別子を持つピンを取得する。
構文
HRESULT FindPin( LPCWSTR Id, IPin **ppPin );
パラメータ
- Id
- ピンを識別する定数、NULL で終わる Unicode 文字列のポインタ。L"In" でなければならない。
- ppPin
- ピンの IPin インターフェイスへのポインタを受け取る変数のアドレス。メソッドが失敗すると、*ppPin は NULL にセットされる。
戻り値
次の一覧に含まれるいずれかの HRESULT 値を返す。
S_OK 成功。 E_POINTER NULL ポインタ引数。 VFW_E_NOT_FOUND 見つからなかった。
注意
このメソッドは、CBaseFilter::FindPin メソッドをオーバーライドする。フィルタの唯一のピン (入力ピン) には、In という名前が付いている。
現在のサンプルを取得する。
構文
virtual IMediaSample *GetCurrentSample(void);
戻り値
サンプルの IMediaSample インターフェイスへのポインタを返し、サンプルがない場合は NULL を返す。
注意
戻り値が NULL 以外の場合、IMediaSample ポインタは未処理の参照カウントを持つ。この参照カウントは必ず解放すること。
フィルタの IMediaPosition および IMediaSeeking インターフェイス ポインタを取得する。
構文
virtual HRESULT GetMediaPositionInterface( REFIID riid, void **ppv );
パラメータ
- riid
- インターフェイスの参照識別子。
- ppv
- インターフェイス ポインタを受け取る変数のアドレス。
戻り値
HRESULT 値を返す。可能な値は次の一覧のとおり。
S_OK 成功。 E_OUTOFMEMORY メモリ不足。 E_NOINTERFACE インターフェイスがサポートされていない。
注意
フィルタは、アップストリームへの受け渡しをする CRendererPosPassThru オブジェクトに、すべてのシーク コマンドを委任する。このメソッドは、CRendererPosPassThru オブジェクトがまだ存在しなければ作成し、要求されたインターフェイスをそのオブジェクトに照会する。
m_pPosition メンバ変数には、CRendererPosPassThru オブジェクトへのポインタが格納される。
ピンを取得する。
構文
virtual CBasePin *GetPin( int n );
パラメータ
- n
- 指定されたピンの数。0 でなければならない。
戻り値
m_pInputPin ポインタを返す。
注意
このメソッドは、CBaseFilter クラス内の純粋仮想メソッド CBaseFilter::GetPin を実装する。このフィルタは、ピンを 1 つだけ (入力ピン) サポートする。このメソッドは、初めて呼び出されたときに、新しい CRendererInputPin オブジェクトとしてこのピンを作成する。
ピンの数を取得する。
構文
virtual int GetPinCount(void);
戻り値
1 を返す。
注意
このメソッドは、CBaseFilter クラスの純粋仮想メソッド CBaseFilter::GetPinCount を実装する。
フィルタの状態を取得する。
構文
FILTER_STATE GetRealState(void);
戻り値
CBaseFilter.m_State の値を返す。この値は FILTER_STATE 列挙型のメンバである。
注意
このメソッドは、GetState メソッドの代わりに内部的に使用できる、より簡単な手段である。
レンダリングをスケジュールするイベントを取得する。
構文
CAMEvent *GetRenderEvent(void);
戻り値
m_RenderEvent イベントへのポインタを返す。
サンプルからタイム スタンプを取得する。
構文
virtual HRESULT GetSampleTimes( IMediaSample *pMediaSample, REFERENCE_TIME *pStartTime, REFERENCE_TIME *pEndTime );
パラメータ
- pMediaSample
- サンプルの IMediaSample インターフェイスへのポインタ。
- pStartTime
- 開始タイムを受け取る変数へのポインタ。
- pEndTime
- 終了タイムを受け取る変数へのポインタ。
戻り値
HRESULT 値を返す。可能な値は次の一覧のとおり。
S_OK サンプルを直ちにレンダリングしなければならない。 S_FALSE タイム スタンプに基づいて、サンプルのレンダリングをスケジュールしなければならない。 E_FAIL このサンプルをレンダリングしてはならない。 VFW_E_START_TIME_AFTER_END 不正なタイム スタンプ : 終了タイムが開始タイムより早い。
注意
フィルタは、このメソッドを呼び出すことにより、サンプルをどのように処理すべきかどうかを判断する。戻り値が S_OK の場合、フィルタは直ちにサンプルをレンダリングする。S_FALSE の場合は、タイム スタンプに基づいてサンプルのレンダリングをスケジュールする。エラー コードの場合は、サンプルを拒否する。
サンプルにタイム スタンプがない場合、またはフィルタに基準クロックがない場合、このメソッドは S_OK を返す。それ以外の場合、このメソッドは ShouldDrawSampleNow メソッドの値を返す。この場合、ShouldDrawSampleNow は必ず S_FALSE を返す。この動作は派生クラスでオーバーライドできる。たとえば、派生クラスが品質コントロールの管理を実装する場合は、サンプルをドロップするために E_FAIL を返すことができる。
フィルタの状態 (実行、停止、ポーズ) を取得する。
構文
HRESULT GetState( DWORD dwMilliSecsTimeout, FILTER_STATE *State );
パラメータ
- dwMilliSecsTimeout
- タイムアウト間隔 (ミリ秒単位)。
- State
- フィルタの状態を示す FILTER_STATE 列挙型のメンバを取得する変数のポインタ。
戻り値
次の一覧に含まれるいずれかの HRESULT 値を返す。
S_OK 成功。 VFW_S_STATE_INTERMEDIATE フィルタ グラフは指定された状態に移行中。 E_POINTER NULL ポインタ引数。
注意
このメソッドは、CBaseFilter::GetState メソッドをオーバーライドする。レンダラがポーズしていると、状態の移行は、レンダリングするサンプルを受け取るまで完了しない。状態の移行が完了する前にタイムアウトすると、メソッドは VFW_S_STATE_INTERMEDIATE を返す。
フィルタにサンプルがあるかどうかを判断する。
構文
virtual BOOL HaveCurrentSample(void);
戻り値
フィルタにサンプルがある場合は TRUE を返し、それ以外の場合は FALSE を返す。
状態が停止に切り替わるときに呼び出される。
構文
virtual HRESULT Inactive(void);
戻り値
S_OK を返す。
注意
入力ピンは、ピン自体の CRendererInputPin::Inactive メソッドからこのメソッドを呼び出す。フィルタは、ClearPendingSample メソッドを呼び出して最新のサンプルを解放する。
エンドオブストリーム通知が受信されたかどうかを照会する。
構文
BOOL IsEndOfStream(void);
戻り値
m_bEOS フラグを返す。
EC_COMPLETE イベントがフィルタ グラフ マネージャに配信されたかどうかを照会する。
構文
BOOL IsEndOfStreamDelivered(void);
戻り値
m_bEOSDelivered フラグを返す。
フィルタがデータのストリーミング中かどうかを照会する。
構文
BOOL IsStreaming(void);
戻り値
m_bStreaming フラグを返す。
状態の移行がまだ完了していないことを通知する。
構文
void NotReady(void);
注意
このメソッドにより、GetState メソッドは VFW_S_STATE_INTERMEDIATE を返すようになる。この値は、フィルタが現在の状態へまだ移行中であることを示す。フィルタは、状態の移行が保留されるたびに、このメソッドを呼び出す。この状況は、フィルタがポーズしてから、サンプルを受け取るまでに発生する。
参照
フィルタ グラフ マネージャに EC_COMPLETE イベントを送信する。
構文
void NotifyEndOfStream(void);
参照
フィルタ グラフ マネージャに EC_DISPLAY_CHANGED イベントを送信する。
構文
BOOL CBaseRenderer::OnDisplayChange(void);
戻り値
イベントが発行された場合は TRUE を返し、それ以外の場合は FALSE を返す。
注意
ビデオ レンダラは、WM_DISPLAYCHANGE メッセージへの応答として、このメソッドを呼び出さなければならない。入力ピンが接続されている場合、メソッドはフィルタ グラフ マネージャに EC_DISPLAY_CHANGED イベントを送信する。
ポーズ中にフィルタがサンプルを受信するときに呼び出される。
構文
virtual void OnReceiveFirstSample( IMediaSample *pMediaSample );
パラメータ
- pMediaSample
- サンプルの IMediaSample インターフェイスへのポインタ。
注意
Receive メソッドはこのメソッドを呼び出す。このメソッドは基底クラスでは何もしないが、派生クラスでオーバーライドできる。このメソッドは、主にビデオ レンダラでの使用を目的としている。ビデオ レンダラがポーズ中なら、通常は、最初のサンプルを静止画として表示する。
ポーズ中にグラフをシークした場合にも、このメソッドが呼び出される。
サンプルがレンダリングされた後で呼び出される。
構文
virtual void OnRenderEnd( IMediaSample *pMediaSample );
パラメータ
- pMediaSample
- サンプルの IMediaSample インターフェイスへのポインタ。
注意
Render メソッドはこのメソッドを呼び出す。このメソッドは基底クラスでは何もしないが、たとえば品質コントロール データを収集するように、派生クラスでオーバーライドできる。
レンダリングが開始されようとしているときに呼び出される。
構文
virtual void OnRenderStart( IMediaSample *pMediaSample );
パラメータ
- pMediaSample
- サンプルの IMediaSample インターフェイスへのポインタ。
注意
Render メソッドはこのメソッドを呼び出す。このメソッドは基底クラスでは何もしないが、たとえば品質コントロール データを収集するように、派生クラスでオーバーライドできる。
フィルタがストリーミングを開始するときに呼び出される。
構文
virtual HRESULT OnStartStreaming(void);
戻り値
S_OK を返す。
注意
StartStreaming メソッドはこのメソッドを呼び出す。このメソッドは基底クラスでは何もしないが、派生クラスでオーバーライドできる。
フィルタがストリーミングを停止するときに呼び出される。
構文
virtual HRESULT OnStopStreaming(void);
戻り値
S_OK を返す。
注意
StopStreaming メソッドはこのメソッドを呼び出す。このメソッドは基底クラスでは何もしないが、派生クラスでオーバーライドできる。
フィルタがサンプルのプレゼンテーション時間の待機を終了するときに呼び出される。
構文
virtual void OnWaitEnd(void);
注意
WaitForRenderTime メソッドは、サンプルのプレゼンテーション時間の待機を終了したとき、このメソッドを呼び出す。このメソッドは基底クラスでは何もしないが、派生クラスでオーバーライドできる。
品質コントロールを実装する場合には、このメソッドと共に OnWaitStart メソッドをオーバーライドしてもよい。これらのメソッドを使用すると、フィルタのパフォーマンスを追跡できる。
フィルタがサンプルのプレゼンテーション時間の待機を開始するときに呼び出される。
構文
virtual void OnWaitStart(void);
注意
WaitForRenderTime メソッドは、サンプルのプレゼンテーション時間の待機を開始するとき、このメソッドを呼び出す。このメソッドは基底クラスでは何もしないが、派生クラスでオーバーライドできる。
品質コントロールを実装する場合には、このメソッドと共に OnEndStart メソッドをオーバーライドしてもよい。これらのメソッドを使用すると、フィルタのパフォーマンスを追跡できる。
フィルタをポーズする。
構文
HRESULT Pause(void);
戻り値
HRESULT 値を返す。可能な値は次の一覧のとおり。
S_OK 移行は完了している。 S_FALSE 移行は完了していない。
注意
このメソッドは、CBaseFilter::Pause メソッドをオーバーライドする。以下のステップを実行する。
- CBaseFilter::Pause メソッドを呼び出す。
- アロケータにコミットする (「IMemAllocator::Commit」を参照)。
- 直前の状態が停止だった場合、フィルタは保持しているサンプルをすべて解放する (そのサンプルはもう有効でない)。
- CompleteStateChange メソッドを呼び出し、その値を返す。
サンプルをレンダリングする準備をする。
構文
virtual HRESULT PrepareReceive( IMediaSample *pMediaSample );
パラメータ
- pMediaSample
- サンプルの IMediaSample インターフェイスへのポインタ。
戻り値
HRESULT 値を返す。可能な値は次の一覧のとおり。
S_OK 成功。 E_FAIL 失敗。 E_UNEXPECTED 予期せぬエラー。 VFW_E_SAMPLE_REJECTED フィルタはこのサンプルをドロップする。
注意
フィルタは、サンプルをレンダリングする前に、Receive メソッド内からこのメソッドを呼び出す。フィルタが実行中の場合、このメソッドはサンプルのレンダリングをスケジュールする。
フィルタに既に保留されているサンプルがある場合、または既にエンドオブストリームに達している場合、メソッドは E_UNEXPECTED を返す。アップストリーム フィルタによるストリーミングの呼び出し順序が正しくない可能性がある。
スケジューリング アルゴリズムにより、サンプルをドロップしなければならないと判断される場合 (「ScheduleSample」参照)、メソッドは VFW_E_SAMPLE_REJECTED を返す。ただし、サンプルのドロップはエラーでないため、入力ピンの IMemInputPin::Receive メソッドは、このエラー コードをアップストリーム フィルタに渡さない。
フィルタがサンプルをレンダリングする前に呼び出される。
構文
virtual void PrepareRender(void);
注意
フィルタは、OnReceiveFirstSample メソッドまたは Render メソッドを呼び出す前に、このメソッドを呼び出す。PrepareRender は基底クラスでは何もしない。派生クラスでは、このメソッドをオーバーライドして、レンダリング前に必要な任意の処理を実行できる。たとえば、ビデオ レンダラであれば、このメソッドをオーバーライドしてパレットを実現してもよい。
状態の移行が完了していることを通知する。
構文
void Ready(void);
注意
このメソッドにより、GetState メソッドは S_OK を返すようになる。この値は、フィルタが現在の状態への移行を完了していることを示す。フィルタは、状態の移行を完了するたびに、このメソッドを呼び出す。
参照
ストリーム内の次のメディア サンプルを取得する。
構文
virtual HRESULT Receive( IMediaSample *pMediaSample );
パラメータ
- pMediaSample
- サンプルの IMediaSample インターフェイスへのポインタ。
戻り値
成功なら S_OK を返し、それ以外の場合はエラーの原因を示す HRESULT 値を返す。
注意
入力ピンは、アップストリーム フィルタからサンプルを受け取るときに、このメソッドを呼び出す。
フィルタが実行中の場合、このメソッドは以下のステップを実行する。
- サンプルのレンダリングをスケジュールする (PrepareReceive)。
- スケジュールされた時間を待機する (WaitForRenderTime)。
- サンプルをレンダリングする (Render)。
- サンプルを解放する (ClearPendingSample)。
フィルタがポーズ中の場合、このメソッドは次のステップを実行する。
- サンプルが利用可能なことを派生クラスに通知する (OnReceiveFirstSample)。
- スケジュールされた時間を待機する。
- サンプルをレンダリングする。
- サンプルを解放する。
ポーズ中の場合、メソッドはステップ 2. でフィルタが実行状態に切り替わるまで待機する。この時点で、フィルタがサンプルをスケジュールする。
OnReceiveFirstSample メソッドは基底クラスでは何もしない。派生クラスではこのメソッドをオーバーライドできる。たとえば、ビデオ レンダラがポーズ中なら、通常は、最初のサンプルを静止画として表示する。
サンプルをレンダリングする。
構文
virtual HRESULT Render( IMediaSample *pMediaSample );
パラメータ
- pMediaSample
- サンプルの IMediaSample インターフェイスへのポインタ。
戻り値
HRESULT 値を返す。可能な値は次の一覧のとおり。
S_FALSE フィルタが停止しているか、または pMediaSample が NULL。 S_OK 成功。
注意
このメソッドは、実際の処理をする純粋仮想メソッド DoRenderSample を呼び出す。派生クラスでは DoRenderSample を実装する必要がある。
このメソッドは、DoRenderSample を呼び出す直前に OnRenderStart メソッドを呼び出す。また、直後には OnRenderEnd メソッドを呼び出す。派生クラスでは、必要に応じてこれらの 2 つのメソッドをオーバーライドできる。
エンドオブストリーム関連フラグをリセットする。
構文
virtual HRESULT ResetEndOfStream(void);
戻り値
S_OK を返す。
注意
このメソッドは、直前のエンドオブストリーム状態をクリアする。その時点で、フィルタが新しいデータを受け取れるようになる。Stop および BeginFlush メソッドは、このメソッドを呼び出す。
EC_COMPLETE 通知をスケジュールするタイマをキャンセルする。
構文
void ResetEndOfStreamTimer(void);
参照
フィルタを実行する。
構文
HRESULT Run(void);
戻り値
成功なら S_OK を返し、それ以外の場合はエラーの原因を示す HRESULT 値を返す。
注意
このメソッドは、CBaseFilter::Run メソッドをオーバーライドする。以下の処理を実行する。
- CBaseFilter::Run メソッドを呼び出す。
- アロケータにコミットする (「IMemAllocator::Commit」を参照)。
- 直前の状態が停止だった場合、フィルタは保持しているサンプルをすべて解放する (そのサンプルはもう有効でない)。
- StartStreaming メソッドを呼び出し、その結果を返す。サンプルが保留されている場合、StartStreaming メソッドはサンプルのレンダリングをスケジュールする。
フィルタが接続されていない場合は、直ちに EC_COMPLETE イベントを送信する。
サンプルのレンダリングをスケジュールする。
構文
virtual BOOL ScheduleSample( IMediaSample *pMediaSample );
パラメータ
- pMediaSample
- サンプルの IMediaSample インターフェイスへのポインタ。
戻り値
サンプルがスケジュールされた場合は TRUE を返し、サンプルがドロップされた場合は FALSE を返す。
注意
このメソッドは、最初に、サンプルを直ちにレンダリングすべきか、後でレンダリングすべきか、またはドロップすべきかを判断する (このために GetSampleTimes メソッドを呼び出す)。直ちにレンダリングする場合、メソッドは m_RenderEvent イベントを通知する。後でレンダリングする場合には、スケジュールするために IReferenceClock::AdviseTime メソッドを呼び出す。
エンドオブストリームに達している場合に、フィルタ グラフ マネージャへの EC_COMPLETE イベントをスケジュールする。
構文
virtual HRESULT SendEndOfStream(void);
戻り値
HRESULT 値を返す。可能な値は次の一覧のとおり。
S_FALSE フィルタ グラフ マネージャはイベント通知を受け取っていない。 S_OK 成功。
注意
現在のサンプルの終了タイムより前に、フィルタにエンドオブストリーム通知が届くことがある。この場合、フィルタは、フィルタ グラフ マネージャに EC_COMPLETE 通知を送信する前に、待機しなければならない。
したがって、以下のようになる。
- フィルタがエンドオブストリーム (EOS) 通知を先に受け取った場合、このメソッドはタイマ イベントをスケジュールする。タイマ イベントをアクティブにすると、フィルタが EC_COMPLETE イベントを送信する。
- フィルタが EOS 通知を後から 受け取った場合、このメソッドは直ちに EC_COMPLETE イベントを送信する。
- フィルタに保留されている EOS 通知がない場合、メソッドは何もせずに戻る。
タイマ用のコールバック メソッドは、TimerCallback である。EC_COMPLETE イベントを配信するため、フィルタは NotifyEndOfStream メソッドを呼び出す。
アップストリーム フィルタにビデオ ウィンドウのハンドルを通知する。
構文
void SendNotifyWindow( IPin *pPin, HWND hwnd );
パラメータ
- pPin
- アップストリーム フィルタの出力ピンの IPin インターフェイスへのポインタ。
- hwnd
- ビデオ ウィンドウのハンドル、または NULL。
戻り値
戻り値なし。
注意
アップストリーム フィルタの出力ピンが IMediaEventSink インターフェイスをサポートする場合、このメソッドは、ウィンドウ ハンドルと共に EC_NOTIFY_WINDOW イベント コードをアップストリーム フィルタに送信する。
ビデオ レンダラは、レンダラ自体の CompleteConnect メソッドを、このメソッドを呼び出すようにオーバーライドできる。これは、アップストリーム フィルタにウィンドウ ハンドルを知らせるためのメカニズムである。この場合、BreakConnect メソッドもオーバーライドし、NULL ハンドルを指定して SendNotifyWindow を呼び出すようにする。
フィルタ グラフ マネージャに再描画イベントを送信する。
構文
void SendRepaint(void);
注意
このメソッドは、以下の条件が満たされる場合、フィルタ グラフ マネージャに EC_REPAINT イベントを送信する。
- 入力ピンが接続されている。
- フィルタがフラッシュ中でない。
- エンドオブストリームに達していない。
- m_bAbort フラグが FALSE。
- m_bRepaintStatus フラグが TRUE。
EC_REPAINT イベントの結果、グラフの状態に応じて、アップストリーム フィルタがサンプルを再送信するか、フィルタ グラフが現在位置までシークするか、またはフィルタ グラフ マネージャが一瞬ポーズする (「EC_REPAINT」を参照)。有効でない可能性があるため、このイベントはあまり使用しないほうがよい。ただし、ビデオ レンダラでは表示をリフレッシュしなければならないこともある。
レンダリングを停止して以降のサンプルを拒否するかどうかを示す、中止フラグを設定する。
構文
void SetAbortSignal( BOOL bAbort );
パラメータ
- bAbort
- レンダリングを停止するかどうかを示すブール型の値。TRUE の場合、フィルタは以降のサンプルをレンダリングしない。
注意
このメソッドは m_bAbort フラグを設定する。
ピンのメディア タイプを設定するときに呼び出される。
構文
virtual HRESULT SetMediaType( const CMediaType *pmt );
パラメータ
- pmt
- メディア タイプを指定する CMediaType オブジェクトへのポインタ。
戻り値
S_OK を返す。
注意
入力ピンは、ピン自体の CRendererInputPin::SetMediaType メソッドからこのメソッドを呼び出す。このメソッドは基底クラスでは何もしない。
再描画イベントを有効または無効にする。
構文
void SetRepaintStatus( BOOL bRepaint );
パラメータ
- bRepaint
- 再描画イベントが有効になっているかどうかを示すブール型の値。TRUE の場合、フィルタは EC_REPAINT イベントをフィルタ グラフ マネージャに送信する。それ以外の場合は、EC_REPAINT イベントを送信しない。
注意
このメソッドは、フィルタ グラフ マネージャに EC_REPAINT イベントが溜まることを防ぐ。フィルタは、EC_REPAINT イベントを送信した後で、値 TRUE を指定してこのメソッドを呼び出す。次のデータを受け取るまで、フィルタは以降の EC_REPAINT イベントを送信しない。
サンプルのレンダリングをスケジュールする方法を判断する。
構文
virtual HRESULT ShouldDrawSampleNow( IMediaSample *pMediaSample, REFERENCE_TIME *pStartTime, REFERENCE_TIME *pEndTime );
パラメータ
- pMediaSample
- サンプルの IMediaSample インターフェイスへのポインタ。
- pStartTime
- サンプルの開始タイムが格納された変数へのポインタ。
- pEndTime
- サンプルの終了タイムが格納された変数へのポインタ。
戻り値
S_FALSE を返す。派生クラスでこのメソッドをオーバーライドする場合には、次の一覧に含まれるいずれかの値を返す。
S_OK サンプルを直ちにレンダリングしなければならない。 S_FALSE タイム スタンプに基づいて、サンプルのレンダリングをスケジュールしなければならない。 エラー コード このサンプルをレンダリングしてはならない。
注意
GetSampleTimes メソッドはこのメソッドを呼び出す。デフォルトでは、サンプルのレンダリングが、常にタイム スタンプに基づいてスケジュールされる。このメソッドは、たとえば品質コントロール データを収集するように、派生クラスでオーバーライドできる。
レンダリングのスケジュールに使用されるタイマ識別子をクリアする。
構文
virtual void SignalTimerFired(void);
注意
フィルタは、レンダリング タイマをアクティブにするとき (「WaitForRenderTime」を参照)、またはキャンセルするとき (「CancelNotification」を参照) に、このメソッドを呼び出す。メソッドは、m_dwAdvise メンバ変数を 0 にリセットする。
ストリーミング スレッドを保持または解放する。
構文
virtual HRESULT SourceThreadCanWait( BOOL bCanWait );
パラメータ
- bCanWait
- ストリーミング スレッドを保持するかどうかを示すブール型の値。TRUE の場合、以降のサンプルをレンダリングするまでフィルタが待機する間、ストリーミング スレッドがブロックされる。FALSE の場合、ストリーミング スレッドは解放される。
戻り値
S_OK を返す。
注意
値 FALSE を指定した SourceThreadCanWait メソッドの呼び出しは、ブロックされた IMemInputPin::Receive 呼び出しからフィルタを強制的に復帰させる。フィルタが実行中の場合、現在のサンプルのプレゼンテーション時間まで、Receive の呼び出しをブロックする。フィルタがポーズ中の場合は、Receive の呼び出しを無期限にブロックする。この動作によって、ストリーム内のデータの流れを調整する。ただし、フィルタが停止中またはフラッシュ中の場合、ブロックは行わない。
ブロックは、m_RenderEvent と m_ThreadSignal の 2 つのイベントを待機する WaitForRenderTime メソッドが制御する。m_RenderEvent イベントは、プレゼンテーション時間になると通知済になる。m_ThreadSignal イベントは、値 FALSE で SourceThreadCanWait を呼び出すと通知済になる。このイベントは、値 TRUE で SourceThreadCanWait を呼び出すとリセットされる。
Stop および BeginFlush メソッドは値 FALSE で SourceThreadCanWait を呼び出す (ストリーミング スレッドを解放する)。Pause、Run、および EndFlush メソッドは、値 TRUE で SourceThreadCanWait を呼び出す。
フィルタが実行状態に切り替わるときに、ストリーミングを開始する。
構文
virtual HRESULT StartStreaming(void);
戻り値
S_OK またはその他の HRESULT 値を返す。
注意
フィルタにサンプルがある場合、フィルタはそのサンプルのレンダリングをスケジュールする。それ以外の場合、保留されているエンドオブストリーム通知があれば、フィルタはフィルタ グラフ マネージャに EC_COMPLETE イベントを送信する。
このメソッドは OnStartStreaming メソッドを呼び出す。OnStartStreaming メソッドは基底クラスでは何もしないが、派生クラスでオーバーライドできる。
フィルタを停止する。
構文
HRESULT Stop(void);
戻り値
S_OK を返す。
注意
このメソッドは CBaseFilter::Stop メソッドをオーバーライドする。以下の処理を実行する。
- CBaseFilter::Stop を呼び出す。
- アロケータへのコミットを解除する (「IMemAllocator::Decommit」を参照)。
- スケジュールされているレンダリングをすべてキャンセルし、ストリーミング スレッドを解放する。
- 保留されている Receive 呼び出しの完了を待機する。
フィルタが実行状態以外に切り替わるときに、ストリーミングを停止する。
構文
virtual HRESULT StopStreaming(void);
戻り値
S_OK を返す。
注意
このメソッドは OnStopStreaming メソッドを呼び出す。OnStopStreaming メソッドは基底クラスでは何もしないが、派生クラスでオーバーライドできる。
エンドオブストリーム用のタイマ イベントで使用するコールバック メソッド。
構文
void TimerCallback(void);
注意
SendEndOfStream メソッドは、タイマ イベントを使って EC_COMPLETE 通知をスケジュールする。TimerCallback メソッドは、タイマ イベント用のコールバック関数である。TimerCallback メソッドがもう 1 度 SendEndOfStream を呼び出し、SendEndOfStream が EC_COMPLETE 通知を送信するか、またはほかのタイマを設定するかを判断する。
ResetEndOfStreamTimer メソッドは、タイマ イベントをキャンセルする。
Receive メソッドが完了するまで待機する。
構文
void WaitForReceiveToComplete(void);
注意
Stop および BeginFlush メソッドはこのメソッドを呼び出して、状態の変化と Receive メソッドの同期をとる。
つまり、このメソッドは、m_bInReceive フラグが FALSE になるまで待機する間に、メッセージをディスパッチする。このフラグは、PrepareReceive メソッド内で TRUE になり、Receive メソッドが PrepareRender メソッドを呼び出した後で FALSE に戻る。派生クラスでは、PrepareRender を使ってパレットを設定できる。PrepareRender の完了を待機すると、状態の変化が起きる前に、パレット変更メッセージが確実にディスパッチされる。この結果、デッドロックの危険性を回避できる。
現在のサンプルのプレゼンテーション時間を待機する。
構文
virtual HRESULT WaitForRenderTime(void);
戻り値
以下のいずれかの HRESULT 値を返す。
S_OK 成功。 VFW_E_STATE_CHANGED プレゼンテーション時間になる前に、フィルタの状態が変化した。
注意
このメソッドは、以下のいずれかが起きるまで待機する。
- サンプルのプレゼンテーション時間になる (つまり、サンプルをレンダリングできる)。
- フィルタがデータのフラッシュを停止または開始する。
プレゼンテーション時間になると、m_RenderEvent イベントが通知済になる。状態が変化すると、m_ThreadSignal イベントが通知済になる。このメソッドは、両方のイベントを待機する。派生クラスでは、必要に応じてこのメソッドをオーバーライドして、ほかのイベントを待機できる。
このメソッドは、待機を開始するとき OnWaitStart メソッドを呼び出し、待機を終了すると OnWaitEnd メソッドを呼び出す。どちらのメソッドも、基底クラスでは何もしないが、派生クラスでオーバーライドできる。