Microsoft DirectX 8.0 |
このクラスは、入力ピンと出力ピンの両方について、IAMStreamControl インターフェイスを実装する。このクラスによって、フィルタ グラフ内の個々のストリームの開始および終了を制御できる。詳細については、「IAMStreamControl」を参照すること。
IAMStreamControl をサポートするピンを実装する場合は、この基底クラスから継承する必要がある。入力ピンの標準的な宣言を次に示す。
class CMyInputPin : public CBaseInputPin, public CBaseStreamControl
NonDelegatingQueryInteface をオーバーライドして IAMStreamControl を公開する必要がある。詳細については、「IUnknown の実装方法」を参照すること。
このクラスは、StreamControlState 列挙を使用してストリームの現在の状態を記述する。
このクラスは、現在の状態を取得するヘルパー関数 CheckStreamState も提供する。このクラスから派生したピンで、指定されたサンプルの処理方法を判断するには、この関数を呼び出す必要がある。
また、ピンが基準クロックと同期していることも重要である。基準クロックと同期していない場合、ピンはすべてのサンプルを直ちに破棄するので、ファイル全体がフィルタを介して可能な範囲で高速にプッシュされ、後でストリームを再開できなくなる場合がある。ピンが正しく同期している場合、ピンはスケジュールされた時間までサンプルを保持した後、サンプルを破棄する。基準クロックを指定するには、SetSyncSource メンバ関数を呼び出す。
この基底クラスを正しく使用するには、特定の時点で特定のメンバ関数を呼び出さなければならない。以下にその方法と、簡単なコードの例を示す。実際のコードでは、この例で省略されているその他の詳細な処理を行わなければならない場合がある。
STDMETHODIMP CMyFilter::SetSyncSource(IReferenceClock *pClock) { m_pMyPin->SetSyncSource(pClock); return CBaseFilter::SetSyncSource(pClock); }
STDMETHODIMP CMyFilter::JoinFilterGraph(IFilterGraph * pGraph, LPCWSTR pName) { HRESULT hr = CBaseFilter::JoinFilterGraph(pGraph, pName); if (hr == S_OK) m_pMyPin->SetFilterGraph(m_pSink); return hr; }
STDMETHODIMP CMyFilter::Run(REFERENCE_TIME tStart) { m_pMyPin->NotifyFilterState(State_Running, tStart); return CBaseFilter::Run(tStart); }
HRESULT CMyPin::BeginFlush() { Flushing(TRUE); return CBaseOutputPin::BeginFlush(); // 入力ピンの場合は、CBaseInputPin } HRESULT CMyPin::EndFlush() { Flushing(FALSE); return CBaseOutputPin::EndFlush(); // 入力ピンの場合は、CBaseInputPin }
CMyPin::Receive(IMediaSample *pSample) { int iStreamState = CheckStreamState(pSample); if (iStreamState == STREAM_FLOWING) { if (m_fLastSampleDiscarded) pSample->SetDiscontinuity(TRUE); m_fLastSampleDiscarded = FALSE; // サンプルを配信するか、その他の処理を行う。 } else { m_fLastSampleDiscarded = TRUE; // 次のサンプルは不連続 // このサンプルを配信せずに、破棄する。 } }
メンバ関数
CBaseStreamControl CBaseStreamControl オブジェクトを作成する。 CheckStreamState ストリームの現在の状態を取得する。 Flushing フィルタがフラッシュするときにピンに通知する。 GetInfo 現在のストリーミングの設定に関する情報を取得する。 NotifyFilterState ピンにフィルタの状態を通知する。 SetFilterGraph フィルタ グラフが使用するイベント シンク通知を設定する。 SetSyncSource フィルタが含まれるグラフによって使用される基準クロックを識別する。 StartAt いつストリーミング データの送信を開始するかをピンに通知する。 StopAt いつデータの処理を停止し、新しいサンプルを破棄するかをピンに通知する。
CBaseStreamControl オブジェクトを作成する。
構文
CBaseStreamControl(void);
戻り値
戻り値なし。
注意
この関数は、開始タイムと終了タイムの両方を MAX_TIME に初期化し、ストリームの先頭から開始して、ストリームの最後まで停止しないことを指定する。
ストリームの現在の状態を取得する。
構文
enum StreamControlState CheckStreamState( IMediaSample *pSample );
パラメータ
- pSample
- IMediaSample インターフェイスへのポインタ。
戻り値
StreamControlState 列挙型を返す。
注意
フィルタは、ピンが転送しようとするサンプルを受信したときにこのメンバ関数を呼び出す。1 つ以上のサンプルを破棄した後で最初に転送するサンプルは、不連続性のマークを付ける必要がある。
フィルタが IAMDroppedFrames を実装し、ドロップされたフレームの数をカウントしている場合、破棄されたフレームをドロップされたフレームとしてカウントしてはならない。
フィルタがフラッシュしていることをピンに通知する。
構文
void Flushing( BOOL bInProgress );
パラメータ
- bInProgress
- フィルタがフラッシュしているかどうかを示す値。TRUE はフラッシュが進行中であることを示す。FALSE はフラッシュしていないことを示す。
戻り値
戻り値なし。
注意
独自のフィルタを実装する場合は、ピンで BeginFlush および EndFlush を呼び出したときにこのメンバ関数を呼び出して、フラッシュしていることを通知しなければならない。
シークをサポートしないキャプチャ フィルタはこのメソッドを呼び出さない。
現在のストリーミングの設定に関する情報を取得する。
構文
HRESULT GetInfo( AM_STREAM_INFO *pInfo );
パラメータ
- pInfo
- AM_STREAM_INFO 構造体へのポインタ。
戻り値
S_OK を返す。
注意
このメンバ関数は、IAMStreamControl インターフェイスを実装し、ピンがストリーミング中であるかどうかを調べたり、ストリームの属性を取得するためにユーザーによって呼び出される。
ピンにフィルタの状態を通知する。
構文
void NotifyFilterState( FILTER_STATE new_state, REFERENCE_TIME tStart = 0 );
パラメータ
- new_state
- フィルタの新しい状態。
- tStart
- ストリーミングが開始される時間 (new_state が State_Running の場合のみ有効)。
戻り値
戻り値なし。
注意
このメンバ関数は、FILTER_STATE 列挙型変数を設定することによって、ピンにフィルタの新しい状態を通知する。
独自のフィルタを実装している場合は、次の例に示すように、フィルタの状態が変化するたびに、ピンの CBaseStreamControl::NotifyFilterState メンバ関数にフィルタの状態を通知する。
STDMETHODIMP CMyFilter::Run(REFERENCE_TIME tStart) { // エラー チェックが成功した場合 m_pMyPin->NotifyFilterState(State_Running, tStart); // 次のように、次に行うべき任意の処理を続行する。 return CBaseFilter::Run(tStart); } STDMETHODIMP CMyFilter::Pause() { // エラー チェックが成功した場合 m_pMyPin->NotifyFilterState(State_Paused, 0); // 次のように、次に行うべき任意の処理を続行する。 return CBaseFilter::Pause(); } STDMETHODIMP CMyFilter::Stop() { // エラー チェックが成功した場合 m_pMyPin->NotifyFilterState(State_Stopped, 0); // 次のように、次に行うべき任意の処理を続行する。 return CBaseFilter::Stop(tStart); }
フィルタ グラフがイベント通知で使用するイベント シンクを設定する。
構文
void SetFilterGraph( IMediaEventSink *pSink );
パラメータ
- pSink
- IMediaEventSink インターフェイスへのポインタ。
戻り値
戻り値なし。
注意
フィルタは、IMediaEventSink を作成した後、JoinFilterGraph メンバ関数でこのメンバ関数を呼び出す。
フィルタが含まれるグラフによって使用される基準クロックを識別する。
構文
void SetSyncSource( IReferenceClock *pRefClock );
パラメータ
- pRefClock
- IReferenceClock インターフェイスへのポインタ。
戻り値
戻り値なし。
注意
このクラスを使用するピンを持つフィルタは、同期ソース情報をこのメンバ関数に渡すようにする必要がある。
いつストリーミング データの送信を開始するかをピンに通知する。
構文
HRESULT StartAt( const REFERENCE_TIME *ptStart = NULL, DWORD dwCookie = 0 );
パラメータ
- ptStart
- ストリーミングを開始する基準タイムへのポインタ。NULL の場合は、直ちに開始する (通知しない)。MAX_TIME の場合、開始は取り消されるか、効果がない。
- dwCookie
- 開始時に通知と共に送信される 0 以外の値。ptStart が NULL 以外または MAX_TIME の場合にのみ使用される。
戻り値
NOERROR を返す。
注意
ストリームはデフォルトで有効なので、このメンバ関数は、以前に StopAt を呼び出した場合以外は効果がない。
ストリームが STREAM_FLOWING 状態になると、フィルタは EC_STREAM_CONTROL_STARTED イベント通知をフィルタ グラフ マネージャに送信する。
注 開始と終了が同じ時点にスケジュールされている場合、開始は終了の極限小時間前に行われると見なされる。この効果を使用して、単一のフレームをキャプチャできる。
いつデータの処理を停止し、新しいサンプルを破棄するかをピンに通知する。
構文
HRESULT StopAt( const REFERENCE_TIME *ptStop = NULL, BOOL bSendExtra = FALSE, DWORD dwCookie = 0 );
パラメータ
- ptStop
- ストリーミングを終了する基準タイムへのポインタ。NULL の場合は、直ちに終了する (通知しない)。MAX_TIME の場合は、終了を取り消す。
- bSendExtra
- スケジュールされた ptStop 時間よりも後にピンが追加のサンプルを送信するかどうかを指定するフラグ。TRUE は追加のサンプルを送信することを示す。詳細については、「注意」を参照すること。
- dwCookie
- 終了時に通知と共に送信される値。ptStart が NULL 以外または MAX_TIME の場合にのみ使用される。
戻り値
NOERROR を返す。
注意
このメンバ関数は、IAMStreamControl::StopAt メソッドを実装し、ストリームの終了をサポートする必要があるピンおよびフィルタによって使用される。このメンバ関数は、StreamControlState 列挙型を STREAM_DISCARDING に設定する。
ビデオ キャプチャの場合は、キャプチャ フィルタの出力ピンと、マルチプレクサの入力ピンの両方で StopAt 指定して、マルチプレクサに終了の通知を送信させる。これによって、キャプチャ フィルタは不必要に余分なフレームをキャプチャすることがなくなり、マルチプレクサが最後のフレームをディスクに書き込むことを保証できる。
さらに、キャプチャの出力ピンでは bSendExtra 変数に TRUE を指定し、ほかのすべてのピンでは FALSE を指定する必要がある。追加のフレームが送信されないと、マルチプレクサは終了タイムを無限に待機することになり、既にすべてのキャプチャ情報を受信していることが認識されない。
ICaptureGraphBuilder を使用している場合は、ICaptureGraphBuilder::ControlStream メソッドが自動的にこの処理を行う。
注 パケットの途中で終了タイムが指定されている場合、フィルタはパケット全体を配信した後、破棄状態になる。また、開始と終了が同じ時点にスケジュールされている場合、開始は終了の極限小時間前に行われると見なされる。この効果を使用して、単一のフレームをキャプチャできる。