Microsoft DirectX 8.0 |
メディア サンプルを出力するキューを実装する。
宣言 : Outputq.h
このクラスによって出力ピンはサンプルを非同期に出力することができる。サンプルはキューに置かれ、ワーカースレッドはそれを入力ピンに出力する。キューは新しいセグメント、エンドオブストリーム通知、あるいはフラッシュ処理を示すコントロール メッセージも保持する。
このクラスを使用するには、フィルタの出力ピンごとに COutputQueue オブジェクトを作成すること。コンストラクタ メソッドでその出力ピンに接続する入力ピンを指定すること。このクラスの使用中は、出力ピンは直接入力ピンを呼び出すことができない。代わりに、以下の表に示されているように COutputQueue の対応するメソッドを呼び出す :
Pin メソッド | COutputQueue メソッド |
---|---|
IPin::BeginFlush | BeginFlush |
IPin::EndFlush | EndFlush |
IPin::EndOfStream | EOS |
IPin::NewSegment | NewSegment |
MemInputPin::Receive | Receive |
MemInputPin::ReceiveMultiple | ReceiveMultiple |
オプションとして COutputQueue オブジェクトを構成して、ワーカースレッドを使わず同期を取ってサンプルを出力することができる。オブジェクトはランタイム時に、入力ピンの状態を基にワーカースレッドを使うかどうかを決めることもできる。詳細については、「COutputQueue::COutputQueue」を参照すること。
Protected メンバ変数 | |
---|---|
m_pPin | 入力ピンの IPin インターフェイスへのポインタ。 |
m_pInputPin | 入力ピンの IMemInputPin インターフェイスへのポインタ。 |
m_bBatchExact | オブジェクトが正確なバッチでサンプルを出力するかどうかを示すフラグ。 |
m_lBatchSize | バッチ サイズ。 |
m_List | メディア サンプル キュー。 |
m_hSem | セマフォへのハンドル、サンプルを待つスレッドによって使われる。 |
m_evFlushComplete | フラッシュ処理が終了したとき通知するイベント。 |
m_hThread | ワーカー スレッドへのハンドル。 |
m_ppSamples | m_lBatchSize サイズのサンプルの配列。 |
m_nBatched | 現在バッチされ処理を待っているサンプルの数。 |
m_lWaiting | スレッドがサンプルを待っているときゼロ以外の値を持つフラグ。 |
m_bFlushing | オブジェクトがフラッシュ処理を実行中かどうかを示すフラグ。 |
m_bTerminate | スレッドが終了すべきかどうかを示すフラグ。 |
m_bSendAnyway | バッチ プロセスをオーバーライドするフラグ。 |
m_hr | オブジェクトがサンプルを受け入れるかどうかを示す HRESULT 値。 |
m_hEventPop | オブジェクトがキューからサンプルを削除するたびに通知するイベント。 |
Protected メソッド | |
InitialThreadProc | スレッドが作成されたとき ThreadProc メソッドを呼び出す。 |
ThreadProc | サンプルをキューから取得し、それを入力ピンに出力する。 |
IsQueued | オブジェクトがワーカースレッドを使ってサンプルを出力しているかどうかを確認する。 |
QueueSample | メディア サンプルあるいはコントロール メッセージをキューに入れる。 |
IsSpecialSample | キューに入れられたデータがコントロール メッセージかどうかを確認する。 |
FreeSamples | すべての未処理のサンプルをフリーにする。 |
NotifyThread | スレッドにキューにデータが入っていることを知らせる。 |
Public メソッド | |
COutputQueue | コンストラクタ メソッド。 |
~COutputQueue | デストラクタ メソッド。 |
BeginFlush | フラッシュ処理の開始。 |
EndFlush | フラッシュ処理の終了。 |
EOS | 入力ピンにエンドオブストリーム呼び出しを出力する。 |
SendAnyway | 未処理のすべてのサンプルを出力する。 |
NewSegment | 入力ピンに新しいセグメントを出力する。 |
Receive | 入力ピンにメディア サンプルを出力する。 |
ReceiveMultiple | メディア サンプルのバッチを入力ピンに出力する。 |
Reset | オブジェクトをリセットし、再びデータを受け取れるようにする。 |
IsIdle | オブジェクトがデータを待っているかどうかを確認する。 |
SetPopEvent | オブジェクトがキューからサンプルを削除したかどうかを通知するイベントを指定する。 |
入力ピンの IPin インターフェイスへのポインタ。
構文
IPin * const m_pPin;
入力ピンの IMemInputPin インターフェイスへのポインタ。
構文
IMemInputPin *m_pInputPin;
オブジェクトが正確なバッチでサンプルを出力するかどうかを示すフラグ。
構文
BOOL const m_bBatchExact;
注意
この値が TRUE なら、オブジェクトは出力前にメディア サンプルのバッチが完成するまで待つ。それ以外なら、サンプルを受け取るとすぐそれを出力する。m_lBatchSize メンバ変数はバッチのサイズを定義する。
バッチ サイズ。
構文
LONG const m_lBatchSize;
メディア サンプル キュー。
構文
typedef CGenericList<IMediaSample> CSampleList; CSampleList *m_List;
注意
IMediaSample ポインタを保持するために特殊化された CGenericList クラス テンプレートへのポインタ。
セマフォへのハンドル、サンプルを待つスレッドによって使われる。
構文
HANDLE m_hSem;
フラッシュ処理が終了したとき通知するイベント。
構文
CAMEvent m_evFlushComplete;
ワーカー スレッドへのハンドル。
構文
HANDLE m_hThread;
m_lBatchSize サイズのサンプルの配列。
構文
IMediaSample **m_ppSamples;
注意
ワーカー スレッドはサンプルをキュー (m_List) から引き抜いて、それをこの配列に入れる。それは配列を IMemInputPin::ReceiveMultiple メソッドに渡す。オブジェクトがワーカー スレッドを使わなければ、オブジェクトはサンプルをこの配列に直接入れる。
現在バッチされ処理を待っているサンプルの数。
構文
LONG m_nBatched;
スレッドがサンプルを待っているときゼロ以外の値を持つフラグ。
構文
LONG m_lWaiting;
オブジェクトがフラッシュ処理を実行中かどうかを示すフラグ。TRUE ならオブジェクトはフラッシュを開始している。
構文
BOOL m_bFlushing;
スレッドが終了すべきかどうかを示すフラグ。 TRUE ならスレッドは終了する。
構文
BOOL m_bTerminate;
バッチ プロセスをオーバーライドするフラグ。このフラグを TRUE にすると、m_bBatchExact フラグをオーバーライドし、すべての未処理サンプルを出力する。
構文
BOOL m_bSendAnyway;
オブジェクトがサンプルを受け入れるかどうかを示す HRESULT 値。この値が S_OK なら、オブジェクトはサンプルを受け入れる。それ以外なら、サンプルを拒否する。
構文
BOOL volatile m_hr;
注意
このメンバ変数はスレッド間の動作を調整する。入力ピンへのダウンストリームがサンプルを拒否する、あるいはオブジェクトがフラッシュを開始するなら、この値には S_FALSE かエラー コードがセットされる。オブジェクトはフラッシュが完了する、あるいは Reset メソッドが終了するまで、それ以降のサンプルを出力しない。
オブジェクトがキューからサンプルを削除するたびに通知済になるオプション イベント。この値は NULL で初期化される。SetPopEvent メソッドを呼び出して、イベントハンドルを指定すること。
構文
HANDLE m_hEventPop;
フラッシュ処理の開始。
構文
void BeginFlush(void);
注意
このメソッドは m_bFlushing メンバ変数を TRUE に設定する。オブジェクトがスレッドを使っているなら、そのスレッドは FreeSamples メソッドを呼び出して未処理のサンプルをフリーにする。スレッドを使っていなければ、オブジェクトは COutputQueue::EndFlush メソッドの間に FreeSamples を呼び出す。このメソッドはまた m_hr メンバ変数を S_FALSE にセットし、オブジェクトにすべての新しいサンプルを放棄させる。
オブジェクトは入力ピンの IPin::BeginFlush メソッドを呼び出すことでダウンストリームにフラッシュ通知を渡す。
コンストラクタ メソッド。
構文
COutputQueue( IPin *pInputPin, HRESULT *phr, BOOL bAuto = TRUE, BOOL bQueue = TRUE, LONG lBatchSize = 1, BOOL bBatchExact = FALSE, LONG lListSize = DEFAULTCACHE, DWORD dwPriority = THREAD_PRIORITY_NORMAL );
パラメータ
- pInputPin
- 入力ピンの IPin インターフェイスへのポインタ。オブジェクトはこのピンにサンプルを出力する。
- phr
- HRESULT 戻り値へのポインタ。このメソッドを呼び出す前にこの値を S_OK に設定すること。返ったとき phr はメソッドの成功/失敗を示す値を返す。
- bAuto
- キューを作る時だとオブジェクトが決めたかどうかを指定するフラグ。TRUE なら、入力ピンがブロックしない場合にのみオブジェクトはキューを作成する。FALSE なら、bQueue パラメータがキューを作成するかどうかを指定する。
- bQueue
- bAuto が TRUEなら、このパラメータは無視される。bAuto が FALSE ならこのフラグはキューを作るかどうかを指定する。
- lBatchSize
- 1 つのバッチに出力されるサンプルの最大数。
- bBatchExact
- 正確なバッチ サイズを使うかどうかを指定するフラグ。TRUE なら、オブジェクトは入力ピンにそれらを出力する前に lBatchSize までサンプルを待つ。FALSE なら、オブジェクトはサンプルを受け取るとすぐ出力する。
- lListSize
- キューのキャッシュ サイズ。デフォルト値 DEFAULTCACHE は CBaseList クラスで定義される定数である。
- dwPriority
- サンプルを出力するスレッドの優先度。
注意
bAuto が TRUE なら、オブジェクトはダウンストリーム ピンの IMemInputPin::ReceiveCanBlock メソッドを呼び出す。ReceiveCanBlock が S_OK を返すなら (ピンが Receive 呼び出しでブロックするかもしれないことを意味する)、オブジェクトはサンプルを出力するスレッドを作成する。そうでなければ、オブジェクトはスレッドを作成しない。
bAuto が FALSE なら、bQueue の値がスレッドを作成するかどうかを決める。
オブジェクトがスレッドを作成するなら、オブジェクトはスレッド ハンドルを m_hThread メンバ変数にアサインする。スレッド プロシージャは InitialThreadProc であり、スレッド パラメータは this へのポインタである。オブジェクトはまたサンプルを保持するキューを作成する、それは m_List メンバ変数によって与えられる。
デストラクタ メソッド。
構文
~COutputQueue(void);
フラッシュ処理の終了。
構文
void EndFlush(void);
注意
オブジェクトがスレッドを使っているなら、このメソッドは m_evFlushComplete イベントを待つ。メソッドは未処理のサンプルをフリーにした後でこのイベントを通知する。オブジェクトがスレッドを使っていないなら、このメソッドは FreeSamples メソッドを呼び出す。
次に EndFlush メソッドは入力ピンの IPin::EndFlush を呼び出す。
入力ピンにエンドオブストリーム呼び出しを出力する。
構文
void EOS(void);
注意
オブジェクトがスレッドを使っているなら、EOS_PACKET コントロール メッセージをキューに入れる。スレッドはすべての未処理のサンプルを出力し、入力ピンの IPin::EndOfStream メソッドを呼び出す。
オブジェクトがスレッドを使っていないなら、SendAnyway メソッドを呼び出して未処理のサンプルを出力する。次にオブジェクトは入力ピンの IPin::EndOfStream を呼び出す。
すべての未処理のサンプルをフリーにする。
構文
void FreeSamples(void);
注意
このメソッドはキューとサンプル配列 (m_ppSamples) からすべての未処理のサンプルを削除する。
スレッドが作成されたとき ThreadProc メソッドを呼び出す。
構文
static DWORD WINAPI InitialThreadProc( LPVOID pv );
パラメータ
- pv
- this ポインタ。
戻り値
ThreadProc が返した値を返す。
注意
このメソッドはオブジェクトのワーカー スレッドのスレッド プロシージャである。オブジェクトの this ポインタはスレッド パラメータである。メソッドは this への参照を解除して、ThreadProc メソッドを呼び出す。
オブジェクトがデータを待っているかどうかを確認する。
構文
BOOL IsIdle(void);
戻り値
スレッドが待っていて、サンプル配列がカラなら TRUE を返す。それ以外なら FALSE を返す。
オブジェクトがワーカースレッドを使ってサンプルを出力しているかどうかを確認する。
構文
BOOL IsQueued(void);
戻り値
オブジェクトがワーカースレッドを使っているなら TRUE を返す、そうでなければ FALSE を返す。
キューに入れられたデータがコントロール メッセージかどうかを確認する。
構文
BOOL IsSpecialSample( IMediaSample *pSample );
パラメータ
- pSample
- キュー内の項目へのポインタ。
戻り値
pSample がコントロール メッセージなら TRUE を返す、そうでなければ FALSE を返す。
注意
QueueSample メソッドはメディア サンプルに加えコントロールメッセージを受け取ることができる。コントロール メッセージはスレッドにある動作を指示する (LONG_PTR タイプにキャストされる) 定義済みの定数である。コントロール メッセージはメディア データを含まない。詳細については、「QueueSample」を参照すること。
入力ピンに新しいセグメントを出力する。
構文
HRESULT NewSegment( REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate );
パラメータ
- tStart
- [in] セグメントの開始メディア位置、100ナノ秒単位。
- tStop
- [in] セグメントの終了メディア位置、100ナノ秒単位。
- dRate
- [in] このセグメントが処理されるべきレート、オリジナル レートのパーセンテージ。
戻り値
Returns an HRESULT value.
注意
オブジェクトがスレッドを使っているなら、それは次の項目を順番にキューに入れる :
- NEW_SEGMENT コントロール メッセージ
- セグメント データ。
The NEW_SEGMENT メッセージはスレッドにキューの次の項目にセグメント データが入っていることを知らせる。セグメント データは次に宣言される構造体に格納されている :
struct NewSegmentPacket { REFERENCE_TIME tStart; REFERENCE_TIME tStop; double dRate; };スレッドはこの構造体で与えられたデータを使って、入力ピンの IPin::NewSegment メソッドを呼び出す。
オブジェクトがスレッドを使っていないなら、SendAnyway メソッドを呼び出してすべての未処理のサンプルを出力する。次にオブジェクトは入力ピンの IPin::NewSegment を呼び出す。
スレッドにキューにデータが入っていることを知らせる。
構文
void NotifyThread(void);
注意
このメソッドを呼び出す前にクリティカル セクションを保持すること。
サンプルをキューに入れる。
構文
void QueueSample( IMediaSample *pSample );
パラメータ
- pSample
- サンプルの IMediaSample インターフェイスへのポインタ。
注意
このメソッドはサンプルをキューの末尾 (m_List) に追加する。このメソッドを呼び出す前にクリティカル セクションを保持すること、そしてオブジェクトがスレッドを使ってサンプルを出力しているときにはそれを呼び出すこと。オブジェクトがスレッドを使っているかどうかを確認するには、IsQueued メソッドを呼び出すこと。
このメソッドはコントロールメッセージをキューに置くために用いることもできる。コントロール メッセージはスレッドにある動作を指示する (LONG_PTR タイプにキャストされる) 定義済みの定数である。COutputQueue クラスは次の表に示されるコントロール メッセージを定義する :
メッセージ 動作 EOS_PACKET エンドオブストリーム通知を出力する。 NEW_SEGMENT 新しいセグメントを出力する。 RESET_PACKET キューの状態をリセットする。 SEND_PACKET サンプルの部分的バッチを送る。 これは COutputQueue クラスが最初に使うプロテクト メソッドである。
入力ピンにメディア サンプルを出力する。
構文
HRESULT Receive( IMediaSample *pSample );
パラメータ
- pSample
- サンプルの IMediaSample インターフェイスへのポインタ。
戻り値
HRESULT 値を返す。以下の表に示されるいずれかの値を。
S_FALSE このサンプルを処理する前にエンドオブストリーム通知を受け取った。 S_OK 成功。
注意
このメソッドは COutputQueue::ReceiveMultiple メソッドを呼び出す。
メディア サンプルのバッチを入力ピンに出力する。
構文
HRESULT ReceiveMultiple ( IMediaSample **ppSamples, long nSamples, long *nSamplesProcessed );
パラメータ
- ppSamples
- サンプル配列へのポインタのアドレス。
- nSamples
- 配列内のサンプルの数。
- nSamplesProcessed
- 出力に成功したサンプルの数を受け取る変数へのポインタ。
戻り値
HRESULT 値を返す。 以下の表に示されるいずれかの値。
S_FALSE このサンプルを処理する前にエンドオブストリーム通知を受け取った。 S_OK 成功。
注意
オブジェクトがスレッドを使っているなら、このメソッドは配列内で未処理のすべてのサンプルをキューに入れる。そうでなければ、このメソッドは入力ピンの IMemInputPin::ReceiveMultiple メソッドを呼び出す。
オブジェクトをリセットし、再びデータを受け取れるようにする。
構文
void Reset(void);
戻り値
戻り値なし。
注意
このメソッドは m_hr メンバ変数を S_OK にリセットする。オブジェクトはメディア サンプルを再び受け取ることができる、たとえばフラッシュ処理の後。
未処理のすべてのサンプルを出力する。
構文
void SendAnyway(void);
注意
If the m_bBatchExact メンバ変数が TRUE なら、オブジェクトはサンプルのバッチを出力する前に m_ppSamples 配列にオブジェクトを入れる。たとえば、EOS メソッドは SendAnyway を呼び出してエンドオブストリーム メッセージを処理する。
オブジェクトがキューからサンプルを削除したかどうかを通知するイベントを指定する。
構文
void COutputQueue::SetPopEvent( HANDLE hEvent );
構文
- hEvent
- 呼び出し元によって作成されたイベントへのハンドル。
サンプルをキューから取得し、それを入力ピンに出力する。
構文
DWORD ThreadProc(void);
戻り値
ゼロを返す。
注意
InitialThreadProc メソッドはこのメソッドを呼び出して、メインのスレッドループを実装する。そのループの中で、メソッドは次のステップを行う :
- キュー (m_List) のサンプルを取得する。
- サンプルがコントロール メッセージなら、スレッドはコントロール動作を実行する。そうでなければ、サンプルを m_ppSamples 配列に入れる。
- その配列がいっぱいなら (あるいは m_bBatchExact が FALSE なら) スレッドは IMemInputPin::ReceiveMultiple メソッドを呼び出してサンプルを出力する。
- キュー内にサンプルがなければ、スレッドは m_hSem セマフォで待つ。
スレッドは m_bTerminate メンバ変数が TRUE になると終了する。