CBaseRenderer クラス
CBaseRenderer クラスは、レンダラ フィルタを実装する基底クラスである。CRendererInputPin クラスによって実装される入力ピンを 1 つサポートする。このクラスを使うには、CBaseRenderer を継承する派生クラスを宣言する。派生クラスでは、少なくとも以下のメソッドを実装する必要がある。これらのメソッドは、基底クラス内で純粋仮想関数として宣言される。
- CBaseRenderer::CheckMediaType: 指定されたメディア タイプを受け入れるか拒否する。フィルタは、ピン接続の処理中にこのメソッドを呼び出す。
- CBaseRenderer::DoRenderSample: サンプルをレンダリングする。フィルタは、実行中に受け取るそれぞれのサンプルについて、このメソッドを呼び出す。
状態の変化および同期の問題を処理する基底クラス。この基底クラスは、サンプルのレンダリングのスケジュールも行う。ただし、品質コントロールのための手段は実装しない。この基底クラスは、各種の "ハンドラ" メソッドも宣言する。これらは、ストリーミング処理におけるそれぞれ固有の段階で、フィルタが呼び出すメソッドである。基底クラスでは何も実行しないが、派生クラスでオーバーライドできる。後の一覧では、これらのメソッドが「Public メソッド: ハンドラ」としてまとめられている。
CBaseRenderer::OnReceiveFirstSample ハンドラには少し説明が必要だろう。フィルタがこのメソッドを呼び出すのは、ポーズ中にサンプルを受け取った場合である。この状況は、グラフが停止からポーズに切り替わったときか、ポーズ中にグラフがシークされたときに発生する可能性がある。ビデオ レンダラは、通常、このサンプルを使って静止フレームを表示する。ポーズから実行中に切り替わると、フィルタは、CBaseRenderer::DoRenderSample メソッドにストリーム内の最初のサンプルと同じサンプルを送る。
CBaseRenderer クラスは、CRendererPosPassThru オブジェクトを通して IMediaSeeking インターフェイスと IMediaPosition インターフェイスを公開する。また、すべてのシーク要求をアップストリームにある次のフィルタに渡す。
スケジューリング
アップストリーム フィルタが入力ピンの IMemInputPin::Receive メソッドを呼び出してサンプルを渡すと、ピンはその呼び出しをフィルタの CBaseRenderer::Receive メソッドに渡す。フィルタは、サンプルをドロップするか、直ちにレンダリングするか、またはレンダリングをスケジュールする。
サンプルにタイム スタンプがない場合、または基準クロックが利用できない場合、フィルタはサンプルを直ちにレンダリングする。それ以外の場合、フィルタは CBaseRenderer::ShouldDrawSampleNow メソッドを呼び出して、実行すべき処理を判断する。デフォルトでは、タイム スタンプに基づいてサンプルがスケジュールされる。派生クラスでは、ShouldDrawSampleNow をオーバーライドして、品質コントロールをサポートできる。
サンプルをスケジュールするために、フィルタは、アドバイズ要求を作成する IReferenceClock::AdviseTime メソッドを呼び出す。この結果、スケジュールされた時間になるか、またはフィルタの状態が変化するまで、Receive メソッドがブロックする。このブロックによって、アップストリーム フィルタは、現在のサンプルがレンダリングされるまで、次のサンプルを渡すことができなくなる。
アップストリーム フィルタが IPin::EndOfStreamメソッドを呼び出してエンドオブストリームを通知すると、フィルタは、フィルタ グラフ マネージャに EC_COMPLETE イベントを送信する。フィルタは、現在のサンプルの終了タイムまで待機してから、このイベントを送信する。
要件
ヘッダー : Renbase.h で宣言し、Streams.h をインクルードする。
ライブラリ : Strmbase.lib (リテール ビルド) または Strmbasd.lib (デバッグ ビルド)。
プロテクト メンバ変数 | |
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_ObjectCreationLock | フィルタ内部のオブジェクトの作成を保護するためのロック。 |
m_pInputPin | フィルタの入力ピンへのポインタ。 |
m_pMediaSample | 現在のメディア サンプルへのポインタ。 |
m_pPosition | アップストリームにシーク コマンドを渡すヘルパー オブジェクト。 |
m_pQSink | 品質コントロール メッセージを受け取るオブジェクトへのポインタ。 |
m_RendererLock | ストリーミングのロック。 |
m_RenderEvent | レンダリングのスケジュールに使われるイベント。 |
m_SignalTime | 現在のサンプル上の終了タイム。 |
m_ThreadSignal | ストリーミング スレッドを解放するために使われるイベント。 |
パブリック メソッド | |
CancelNotification | レンダリングをスケジュールするタイマ イベントをキャンセルする。仮想。 |
CBaseRenderer | コンストラクタ メソッド。 |
~CBaseRenderer | デストラクタ メソッド。 |
GetMediaPositionInterface | フィルタの IMediaPosition および IMediaSeeking インターフェイス ポインタを取得する。仮想。 |
GetPin | ピンを取得する。仮想。 |
GetPinCount | ピンの数を取得する。仮想。 |
GetSampleTimes | サンプルからタイム スタンプを取得する。仮想。 |
OnDisplayChange | フィルタ グラフ マネージャに EC_DISPLAY_CHANGED イベントを送信する。 |
PrepareReceive | サンプルをレンダリングする準備をする。仮想。 |
Receive | ストリーム内の次のメディア サンプルを取得する。仮想。 |
Render | サンプルをレンダリングする。仮想。 |
ScheduleSample | サンプルのレンダリングをスケジュールする。仮想。 |
SendNotifyWindow | アップストリーム フィルタにビデオ ウィンドウのハンドルを通知する。 |
SendRepaint | フィルタ グラフ マネージャに再描画イベントを送信する。 |
SetMediaType | ピンのメディア タイプを設定するときに呼び出される。仮想。 |
SignalTimerFired | レンダリングのスケジュールに使われるタイマ識別子をクリアする。 |
SourceThreadCanWait | ストリーミング スレッドを保持または解放する。仮想。 |
WaitForReceiveToComplete | CBaseRenderer::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 | サンプルのレンダリングをスケジュールする方法を判断する。仮想。 |
純粋仮想メソッド | |
CheckMediaType | 特定のメディア タイプをフィルタが受け入れるかどうかを確認する。 |
DoRenderSample | サンプルをレンダリングする。 |
IMediaFilter メソッド | |
GetState | フィルタの状態 (実行、停止、ポーズ) を取得する。 |
Pause | フィルタをポーズする。 |
Run | フィルタを実行する。 |
Stop | フィルタを停止する。 |
IBaseFilter メソッド | |
FindPin | 指定した識別子でピンを取得する。 |