Microsoft DirectX 8.0 |
CSource フィルタ クラスの出力ピン。
宣言: Source.h
このクラスの使用の詳細については、「CSource」を参照すること。このクラスは、ピンからのストリーミング データにワーカー スレッドを提供する CAMThread クラスを継承する。CSourceStream クラスは、次のヘルパー メソッドを実装して、スレッドに要求を送る。
スレッドへの最初の要求は、Init でなくてはならない。Exit 要求によって、スレッドが終了される。実際には、これらのいずれのメソッドも直接呼び出す必要はない。これは、ピンの Active メソッドと Inactive メソッドが、必要に応じてメソッドを呼び出すためである。
このクラスは、次に示すいくつかの "ハンドラ" メソッドも提供する。
これらのメソッドは、基底クラスでは何も処理を行わないが、派生クラスはそれらにオーバーライドできる。
プロテクト メンバ変数 | |
---|---|
m_pFilter | このピンが含まれているフィルタへのポインタ。 |
プロテクト メソッド | |
OnThreadCreate | ストリーミング スレッドが初期化されたときに呼び出される。仮想。 |
OnThreadDestroy | ストリーミング スレッドがまもなく終了するときに呼び出される。仮想。 |
OnThreadStartPlay | DoBufferProcessingLoop メソッドの処理が開始されたときに呼び出される。仮想。 |
Active | フィルタがアクティブになったことをピンに通知する。 |
Inactive | フィルタがアクティブでなくなったことをピンに通知する。 |
GetRequest | 次のスレッド要求を待つ。 |
CheckRequest | ブロックせずに、スレッド要求があるかどうかを調べる。 |
ThreadProc | スレッド プロシージャ。仮想。 |
DoBufferProcessingLoop | メディア サンプルを生成し、ダウンストリームの入力ピンに提供する。仮想。 |
CheckMediaType | ピンが特定のメディア タイプを受け入れることができるかどうかを判定する。仮想。 |
GetMediaType | 優先メディア タイプを取得する。仮想。 |
Public メソッド | |
CSourceStream | コンストラクタ メソッド。 |
~CSourceStream | デストラクタ メソッド。仮想。 |
Init | ストリーミング スレッドを初期化する。 |
Exit | ストリーミングに終了するように通知する。 |
Run | ストリーミングに実行するように通知する。 |
Pause | ストリーミング スレッドにアクティブになるように通知する。 |
Stop | ストリーミング スレッドに停止するように通知する。 |
純粋仮想メソッド | |
FillBuffer | メディア タイプにデータを埋める。 |
IPin メソッド | |
QueryId | ピンの識別子を取得する。 |
このピンが含まれているフィルタへのポインタ。
構文
CSource *m_pFilter;
フィルタがアクティブになったことをピンに通知する。CBasePin::Active メソッドをオーバーライドする。ピンが接続されると、このメソッドはストリーミング スレッドを開始する。
構文
HRESULT Active(void);
戻り値
HRESULT 値を返す。 以下の表に示されるいずれかの値。
S_FALSE ピンは既にアクティブである。 S_OK 成功。 E_FAIL スレッドを開始できなかった。
ピンが特定のメディア タイプを受け入れることができるかどうかを判定する。純粋仮想メソッド CBasePin::CheckMediaType を実装する。
構文
virtual HRESULT CheckMediaType( CMediaType *pMediaType );
パラメータ
- pMediaType
- 照会されたメディア タイプが含まれた CMediaType オブジェクトへのポインタ。
戻り値
次の表に示されるいずれかの HRESULT 値を返す。
S_OK ピンは、このメディア タイプをサポートしている。 E_FAIL ピンは、このメディア タイプをサポートしていない。
注意
デフォルトでは、このピンは 1 つのメディア タイプをサポートする。このメソッドは、1 つのパラメータ版の GetMediaType メソッドを呼び出して、サポートされているタイプを取得し、照会されたタイプと比較する。ピンが 2 つ以上のメディア タイプをサポートしている場合は、このメソッドをオーバーライドする。
ブロックせずに、スレッド要求があるかどうかを調べる。
構文
BOOL CheckRequest( Command *pCom );
パラメータ
- pCom
- 最後の呼び出しで CAMThread::CallWorker メソッドに渡された値を受け取る変数へのポインタ。
戻り値
保留中の要求がある場合は TRUE を返し、ない場合は FALSE を返す。
注意
このメソッドは、CAMThread::CheckRequest メソッドをオーバーライドし、タイプ チェックを実行する。CSourceStream クラスは、pCom パラメータ用の次の列挙型を定義する。
enum Command {CMD_INIT, CMD_PAUSE, CMD_RUN, CMD_STOP, CMD_EXIT};
コンストラクタ メソッド。
構文
CSourceStream( TCHAR *pObjectName, HRESULT *phr, CSource *pms, LPCWSTR pName );
パラメータ
注意
pObjectName パラメータに指定された文字列は、デバッグの目的だけに使用される。詳細については、「CBaseObject」を参照すること。
pName パラメータに指定された文字列は、IPin::QueryPinInfo メソッドによって返される名前である。この名前は、QueryId メソッドが返すピン識別には使用されない。その代わり、QueryId はピン番号に基づいてピン識別子を計算する。ピン識別子は、グラフの永続性をサポートしている。詳細については、「IPin::QueryId」を参照すること。
デストラクタ メソッド。
構文
~CSourceStream(void);
メディア タイプを生成し、ダウンストリームの入力ピンに提供する。
構文
virtual HRESULT DoBufferProcessingLoop(void);
戻り値
HRESULT 値を返す。 以下の表に示されるいずれかの値。
S_FALSE スレッドは停止要求を受け取った。 S_OK ストリームが終了したか、またはダウンストリーム フィルタはサンプルを受け入れていない。
注意
このメソッドは、データを処理するメイン ループを実装し、ダウンストリームにそのループを提供する。メソッドは、毎回ループを通じてアロケータから空のメディア サンプルを取得し、このサンプルを FillBuffer メソッドに渡す。FillBuffer メソッド (派生クラスが実装しなければならない) は、次にメディア データを生成し、サンプル バッファにそのデータを移動する。
次のいずれかの場合に、ループは終了する。
- 入力ピンの IMemInputPin::Receive メソッドがサンプルを拒否した。
- FillBuffer メソッドが S_FALSE を返し、ストリームの終了を示すか、またはエラー コードを返した。
- スレッドが Stop 要求を受け取った。
DoBufferProcessingLoop メソッドは、エンドオブストリーム通知を処理する。エラーが発生すると、このメソッドは EC_ERRORABORT イベントをフィルタ グラフ マネージャに送る。
ストリーミング スレッドに終了するように通知する。
構文
HRESULT Exit(void);
戻り値
S_OK または E_UNEXPECTED を返す。
注意
Inactive メソッドは、このメソッドを呼び出す。
メディア サンプルにデータを埋める。
構文
virtual HRESULT FillBuffer( IMediaSample *pSample ) PURE;
パラメータ
- pSample
- サンプルの IMediaSample インターフェイスへのポインタ。
戻り値
HRESULT 値を返す。 以下の表に示されるいずれかの値。
S_FALSE ストリームの終了 S_OK 成功
注意
派生クラスは、このメソッドを実装しなければならない。
このメソッドに提供されたメディア サンプルには、タイム スタンプがない。派生クラスは、IMediaSample::SetTime メソッドを呼び出し、タイム スタンプを設定する必要がある。メディア サンプルに対して適切な場合、派生クラスは IMediaSample::SetMediaTime メソッドを呼び出して、メディア タイムも設定する必要がある。詳細については、「DirectShow のタイムとクロック」を参照すること。
優先メディア タイプを取得する。
構文
virtual HRESULT GetMediaType( int iPosition, CMediaType *pMediaType ); virtual HRESULT GetMediaType( CMediaType *pMediaType );
パラメータ
- iPosition
- ゼロ ベースのインデックス値。
- pMediaType
- メディア タイプを受け取る CMediaType オブジェクトへのポインタ。
戻り値
次の表に示されるいずれかの HRESULT 値を返す。
S_OK 成功。 VFW_S_NO_MORE_ITEMS インデックスが範囲外である。 E_INVALIDARG インデックスがゼロ以下である。 E_UNEXPECTED 予期しないエラー。
注意
このメソッドには、2 つの版がある。1 つの版は CBasePin::GetMediaType メソッドにオーバーライドし、インデックス値をパラメータとしてとる。もう 1 つの版は 1 つのメディア タイプを取得するように設計されているので、インデックス パラメータはない。
1 つのパラメータ版のメソッドは、E_UNEXPECTED を返す。2 つのパラメータ版のメソッドは、iPosition パラメータが 1 であることを確認し、1 つのパラメータ版のメソッドを呼び出す。ピンがサポートするメディア タイプ数に応じて、これらのいずれかのメソッドをオーバーライドしなければならない。
- ピンが確実に 1 つのメディア タイプをサポートしている場合は、1 つのパラメータ版にオーバーライドする。ピンがサポートするメディア タイプを埋め込む。
- ピンが 2 つ以上のメディア タイプをサポートしている場合は、2 つのパラメータ版をオーバーライドする。CheckMediaType メソッドもオーバーライドする。
次のスレッド要求を待つ。
構文
Command GetRequest(void);
戻り値
次のスレッド要求を返す。
注意
このメソッドは、CAMThread::GetRequest メソッドをオーバーライドする。戻り値は、次の列挙型にキャストされる。
enum Command {CMD_INIT, CMD_PAUSE, CMD_RUN, CMD_STOP, CMD_EXIT};
フィルタがアクティブではなくなったことをピンに通知し、CBasePin::Inactive メソッドをオーバーライドする。ストリーミング スレッドがアクティブな場合、このメソッドはストリーミング スレッドを停止し、スレッドが終了するのを待つ。
構文
HRESULT Inactive(void);
戻り値
S_OK またはほかの HRESULT 値を返す。
ストリーミング スレッドを初期化する。
構文
HRESULT Init(void);
戻り値
S_OK またはほかの HRESULT 値を返す。
注意
このメソッドは、ThreadProc メソッドに送られる最初のスレッド要求でなくてはならない。Active メソッドは、このメソッドを呼び出す。
ストリーミング スレッドが初期化されたときに呼び出される。
構文
virtual HRESULT OnThreadCreate(void);
戻り値
S_OK を返す。
注意
スレッド プロシージャ ThreadProc は、最初に Init 要求を受け取ったときにこのメソッドを呼び出す。このメソッドは、基底クラスでは何も処理を行わない。派生クラスは、このメソッドをオーバーライドし、スレッドを初期化できる。派生クラスがエラー コードを返した場合、スレッドでエラーが発生し、スレッドは終了される。
ストリーミング スレッドがまもなく終了するときに呼び出される。
構文
virtual HRESULT OnThreadDestroy(void);
戻り値
S_OK を返す。
注意
スレッド プロシージャ ThreadProc は、このメソッドを呼び出してから終了する。このメソッドは、基底クラスでは何も処理を行わなず、派生クラスがオーバーライドするために利用可能となる。派生クラスがエラー コードを返すと、スレッドでエラー が発生し、スレッドは終了される。
DoBufferProcessingLoop メソッドの処理が開始されたときに呼び出される。
構文
virtual HRESULT OnThreadStartPlay(void);
戻り値
S_OK を返す。
注意
このメソッドは、基底クラスでは何も処理を行わず、派生クラスがオーバーライドするために利用可能となる。
ストリーミング スレッドにアクティブになるように通知する。
構文
HRESULT Pause(void);
戻り値
S_OK または E_UNEXPECTED を返す。
注意
Active メソッドは、このメソッドを呼び出す。ThreadProc メソッドがこの要求を受け取ると、DoBufferProcessingLoop メソッドを呼び出す。
ピンの識別子を取得する。
構文
HRESULT QueryId( LPWSTR *Id );
パラメータ
- Id
- ピン ID が入る文字列を受け取る変数へのポインタ。
戻り値
HRESULT 値を返す。以下の表に示されるいずれかの値。
S_OK 成功。 E_OUTOFMEMORY メモリ不足。 E_POINTER NULL ポインタ引数。 VFW_E_NOT_FOUND ピンはフィルタで見つからなかった。
注意
このメソッドは、IPin::QueryId メソッドを実装する。識別子文字列を構築するため、ピンはそれ自身をパラメータとして、CSource::FindPinNumber メソッドを呼び出す。FindPinNumber メソッドは、ゼロからインデックス設定されるピン番号を返す。QueryId は、1 つずつ戻り値をインクリメントし、結果を文字列に変換する。たとえば、最初のピンは "1" となり、2 番目のピンは "2"になり、以降も同様となる。
このメソッドが VFW_E_NOT_FOUND を返す場合は、フィルタのピン配列が無効であることを示す。この原因は、フィルタのバグである可能性が高い。
ストリーミング スレッドに実行するように通知する。
構文
HRESULT Run(void);
戻り値
S_OK または E_UNEXPECTED を返す。
注意
基底クラスでは、このメソッドは Pause 要求と同じ効果があり、使用されない。
ストリーミング スレッドに停止するように通知する。
構文
HRESULT Stop(void);
戻り値
S_OK または E_UNEXPECTED を返す。
注意
Inactive メソッドは、このメソッドを呼び出す。
スレッド プロシージャ。純粋仮想メソッド CAMThread::ThreadProc を実装する。
構文
virtual DWORD ThreadProc(void);
戻り値
スレッドが正常に完了された場合は 0 を返し、それ以外の場合は 1 を返す。戻り値が 1 の場合、スレッドのリソースは割り当てられたままになっている可能性がある。
注意
このメソッドは、CAMThread::GetRequest メソッドを呼び出して、スレッド要求を無限に待つ。 Run または Pause 要求を受け取ると、DoBufferProcessingLoop メソッドを呼び出す。 DoBufferProcessingLoop メソッドは、Stop 要求を受け取るまでデータをプッシュする。スレッド プロシージャは、Exit 要求を受け取ったときに終了する。