Microsoft DirectX 8.0

COutputQueue クラス

COutputQueue クラスの階層

メディア サンプルを出力するキューを実装する。

宣言 : Outputq.h

このクラスによって出力ピンはサンプルを非同期に出力することができる。サンプルはキューに置かれ、ワーカースレッドはそれを入力ピンに出力する。キューは新しいセグメント、エンドオブストリーム通知、あるいはフラッシュ処理を示すコントロール メッセージも保持する。

このクラスを使用するには、フィルタの出力ピンごとに COutputQueue オブジェクトを作成すること。コンストラクタ メソッドでその出力ピンに接続する入力ピンを指定すること。このクラスの使用中は、出力ピンは直接入力ピンを呼び出すことができない。代わりに、以下の表に示されているように COutputQueue の対応するメソッドを呼び出す :

Pin メソッドCOutputQueue メソッド
IPin::BeginFlushBeginFlush
IPin::EndFlushEndFlush
IPin::EndOfStreamEOS
IPin::NewSegmentNewSegment
MemInputPin::ReceiveReceive
MemInputPin::ReceiveMultipleReceiveMultiple

オプションとして COutputQueue オブジェクトを構成して、ワーカースレッドを使わず同期を取ってサンプルを出力することができる。オブジェクトはランタイム時に、入力ピンの状態を基にワーカースレッドを使うかどうかを決めることもできる。詳細については、「COutputQueue::COutputQueue」を参照すること。

Protected メンバ変数
m_pPin入力ピンの IPin インターフェイスへのポインタ。
m_pInputPin入力ピンの IMemInputPin インターフェイスへのポインタ。
m_bBatchExactオブジェクトが正確なバッチでサンプルを出力するかどうかを示すフラグ。
m_lBatchSizeバッチ サイズ。
m_Listメディア サンプル キュー。
m_hSemセマフォへのハンドル、サンプルを待つスレッドによって使われる。
m_evFlushCompleteフラッシュ処理が終了したとき通知するイベント。
m_hThreadワーカー スレッドへのハンドル。
m_ppSamplesm_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オブジェクトがキューからサンプルを削除したかどうかを通知するイベントを指定する。

COutputQueue.m_pPin

COutputQueue クラス

入力ピンの IPin インターフェイスへのポインタ。

構文

IPin * const m_pPin;

COutputQueue.m_pInputPin

COutputQueue クラス

入力ピンの IMemInputPin インターフェイスへのポインタ。

構文

IMemInputPin *m_pInputPin;

COutputQueue.m_bBatchExact

COutputQueue クラス

オブジェクトが正確なバッチでサンプルを出力するかどうかを示すフラグ。

構文

BOOL const m_bBatchExact;

注意

この値が TRUE なら、オブジェクトは出力前にメディア サンプルのバッチが完成するまで待つ。それ以外なら、サンプルを受け取るとすぐそれを出力する。m_lBatchSize メンバ変数はバッチのサイズを定義する。

COutputQueue.m_lBatchSize

COutputQueue クラス

バッチ サイズ。

構文

LONG const m_lBatchSize;

COutputQueue.m_List

COutputQueue クラス

メディア サンプル キュー。

構文

typedef CGenericList<IMediaSample> CSampleList;
CSampleList *m_List;

注意

IMediaSample ポインタを保持するために特殊化された CGenericList クラス テンプレートへのポインタ。

COutputQueue.m_hSem

COutputQueue クラス

セマフォへのハンドル、サンプルを待つスレッドによって使われる。

構文

HANDLE m_hSem;

COutputQueue.m_evFlushComplete

COutputQueue クラス

フラッシュ処理が終了したとき通知するイベント。

構文

CAMEvent m_evFlushComplete;

COutputQueue.m_hThread

COutputQueue クラス

ワーカー スレッドへのハンドル。

構文

HANDLE m_hThread;

COutputQueue.m_ppSamples

COutputQueue クラス

m_lBatchSize サイズのサンプルの配列。

構文

IMediaSample  **m_ppSamples;

注意

ワーカー スレッドはサンプルをキュー (m_List) から引き抜いて、それをこの配列に入れる。それは配列を IMemInputPin::ReceiveMultiple メソッドに渡す。オブジェクトがワーカー スレッドを使わなければ、オブジェクトはサンプルをこの配列に直接入れる。

COutputQueue.m_nBatched

COutputQueue クラス

現在バッチされ処理を待っているサンプルの数。

構文

LONG m_nBatched;

COutputQueue.m_lWaiting

COutputQueue クラス

スレッドがサンプルを待っているときゼロ以外の値を持つフラグ。

構文

LONG m_lWaiting;

COutputQueue.m_bFlushing

COutputQueue クラス

オブジェクトがフラッシュ処理を実行中かどうかを示すフラグ。TRUE ならオブジェクトはフラッシュを開始している。

構文

BOOL m_bFlushing;

COutputQueue.m_bTerminate

COutputQueue クラス

スレッドが終了すべきかどうかを示すフラグ。 TRUE ならスレッドは終了する。

構文

BOOL m_bTerminate;

COutputQueue.m_bSendAnyway

COutputQueue クラス

バッチ プロセスをオーバーライドするフラグ。このフラグを TRUE にすると、m_bBatchExact フラグをオーバーライドし、すべての未処理サンプルを出力する。

構文

BOOL m_bSendAnyway;

COutputQueue.m_hr

COutputQueue クラス

オブジェクトがサンプルを受け入れるかどうかを示す HRESULT 値。この値が S_OK なら、オブジェクトはサンプルを受け入れる。それ以外なら、サンプルを拒否する。

構文

BOOL volatile m_hr;

注意

このメンバ変数はスレッド間の動作を調整する。入力ピンへのダウンストリームがサンプルを拒否する、あるいはオブジェクトがフラッシュを開始するなら、この値には S_FALSE かエラー コードがセットされる。オブジェクトはフラッシュが完了する、あるいは Reset メソッドが終了するまで、それ以降のサンプルを出力しない。

COutputQueue.m_hEventPop

COutputQueue クラス

オブジェクトがキューからサンプルを削除するたびに通知済になるオプション イベント。この値は NULL で初期化される。SetPopEvent メソッドを呼び出して、イベントハンドルを指定すること。

構文

HANDLE m_hEventPop;

COutputQueue::BeginFlush

COutputQueue クラス

フラッシュ処理の開始。

構文

void BeginFlush(void);

注意

このメソッドは m_bFlushing メンバ変数を TRUE に設定する。オブジェクトがスレッドを使っているなら、そのスレッドは FreeSamples メソッドを呼び出して未処理のサンプルをフリーにする。スレッドを使っていなければ、オブジェクトは COutputQueue::EndFlush メソッドの間に FreeSamples を呼び出す。このメソッドはまた m_hr メンバ変数を S_FALSE にセットし、オブジェクトにすべての新しいサンプルを放棄させる。

オブジェクトは入力ピンの IPin::BeginFlush メソッドを呼び出すことでダウンストリームにフラッシュ通知を渡す。

COutputQueue::COutputQueue

COutputQueue クラス

コンストラクタ メソッド。

構文

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::~COutputQueue

COutputQueue クラス

デストラクタ メソッド。

構文

~COutputQueue(void);

COutputQueue::EndFlush

COutputQueue クラス

フラッシュ処理の終了。

構文

void EndFlush(void);

注意

オブジェクトがスレッドを使っているなら、このメソッドは m_evFlushComplete イベントを待つ。メソッドは未処理のサンプルをフリーにした後でこのイベントを通知する。オブジェクトがスレッドを使っていないなら、このメソッドは FreeSamples メソッドを呼び出す。

次に EndFlush メソッドは入力ピンの IPin::EndFlush を呼び出す。

COutputQueue::EOS

COutputQueue クラス

入力ピンにエンドオブストリーム呼び出しを出力する。

構文

void EOS(void);

注意

オブジェクトがスレッドを使っているなら、EOS_PACKET コントロール メッセージをキューに入れる。スレッドはすべての未処理のサンプルを出力し、入力ピンの IPin::EndOfStream メソッドを呼び出す。

オブジェクトがスレッドを使っていないなら、SendAnyway メソッドを呼び出して未処理のサンプルを出力する。次にオブジェクトは入力ピンの IPin::EndOfStream を呼び出す。

COutputQueue::FreeSamples

COutputQueue クラス

すべての未処理のサンプルをフリーにする。

構文

void FreeSamples(void);

注意

このメソッドはキューとサンプル配列 (m_ppSamples) からすべての未処理のサンプルを削除する。

COutputQueue::InitialThreadProc

COutputQueue クラス

スレッドが作成されたとき ThreadProc メソッドを呼び出す。

構文

static DWORD WINAPI InitialThreadProc(
    LPVOID pv
);

パラメータ

pv
this ポインタ。

戻り値

ThreadProc が返した値を返す。

注意

このメソッドはオブジェクトのワーカー スレッドのスレッド プロシージャである。オブジェクトの this ポインタはスレッド パラメータである。メソッドは this への参照を解除して、ThreadProc メソッドを呼び出す。

COutputQueue::IsIdle

COutputQueue クラス

オブジェクトがデータを待っているかどうかを確認する。

構文

BOOL IsIdle(void);

戻り値

スレッドが待っていて、サンプル配列がカラなら TRUE を返す。それ以外なら FALSE を返す。

COutputQueue::IsQueued

COutputQueue クラス

オブジェクトがワーカースレッドを使ってサンプルを出力しているかどうかを確認する。

構文

BOOL IsQueued(void);

戻り値

オブジェクトがワーカースレッドを使っているなら TRUE を返す、そうでなければ FALSE を返す。

COutputQueue::IsSpecialSample

COutputQueue クラス

キューに入れられたデータがコントロール メッセージかどうかを確認する。

構文

BOOL IsSpecialSample(
    IMediaSample *pSample
);

パラメータ

pSample
キュー内の項目へのポインタ。

戻り値

pSample がコントロール メッセージなら TRUE を返す、そうでなければ FALSE を返す。

注意

QueueSample メソッドはメディア サンプルに加えコントロールメッセージを受け取ることができる。コントロール メッセージはスレッドにある動作を指示する (LONG_PTR タイプにキャストされる) 定義済みの定数である。コントロール メッセージはメディア データを含まない。詳細については、「QueueSample」を参照すること。

COutputQueue::NewSegment

COutputQueue クラス

入力ピンに新しいセグメントを出力する。

構文

HRESULT NewSegment(
    REFERENCE_TIME tStart,
    REFERENCE_TIME tStop,
    double dRate
);

パラメータ

tStart
[in] セグメントの開始メディア位置、100ナノ秒単位。
tStop
[in] セグメントの終了メディア位置、100ナノ秒単位。
dRate
[in] このセグメントが処理されるべきレート、オリジナル レートのパーセンテージ。

戻り値

Returns an HRESULT value.

注意

オブジェクトがスレッドを使っているなら、それは次の項目を順番にキューに入れる :

The NEW_SEGMENT メッセージはスレッドにキューの次の項目にセグメント データが入っていることを知らせる。セグメント データは次に宣言される構造体に格納されている :

struct NewSegmentPacket {
    REFERENCE_TIME tStart;
    REFERENCE_TIME tStop;
    double dRate;
}; 

スレッドはこの構造体で与えられたデータを使って、入力ピンの IPin::NewSegment メソッドを呼び出す。

オブジェクトがスレッドを使っていないなら、SendAnyway メソッドを呼び出してすべての未処理のサンプルを出力する。次にオブジェクトは入力ピンの IPin::NewSegment を呼び出す。

COutputQueue::NotifyThread

COutputQueue クラス

スレッドにキューにデータが入っていることを知らせる。

構文

void NotifyThread(void);

注意

このメソッドを呼び出す前にクリティカル セクションを保持すること。

COutputQueue::QueueSample

COutputQueue クラス

サンプルをキューに入れる。

構文

void QueueSample(
    IMediaSample *pSample
);

パラメータ

pSample
サンプルの IMediaSample インターフェイスへのポインタ。

注意

このメソッドはサンプルをキューの末尾 (m_List) に追加する。このメソッドを呼び出す前にクリティカル セクションを保持すること、そしてオブジェクトがスレッドを使ってサンプルを出力しているときにはそれを呼び出すこと。オブジェクトがスレッドを使っているかどうかを確認するには、IsQueued メソッドを呼び出すこと。

このメソッドはコントロールメッセージをキューに置くために用いることもできる。コントロール メッセージはスレッドにある動作を指示する (LONG_PTR タイプにキャストされる) 定義済みの定数である。COutputQueue クラスは次の表に示されるコントロール メッセージを定義する :

メッセージ動作
EOS_PACKETエンドオブストリーム通知を出力する。
NEW_SEGMENT新しいセグメントを出力する。
RESET_PACKETキューの状態をリセットする。
SEND_PACKETサンプルの部分的バッチを送る。

これは COutputQueue クラスが最初に使うプロテクト メソッドである。

COutputQueue::Receive

COutputQueue クラス

入力ピンにメディア サンプルを出力する。

構文

HRESULT Receive(
    IMediaSample *pSample
);

パラメータ

pSample
サンプルの IMediaSample インターフェイスへのポインタ。

戻り値

HRESULT 値を返す。以下の表に示されるいずれかの値を。

S_FALSE このサンプルを処理する前にエンドオブストリーム通知を受け取った。
S_OK 成功。

注意

このメソッドは COutputQueue::ReceiveMultiple メソッドを呼び出す。

COutputQueue::ReceiveMultiple

COutputQueue クラス

メディア サンプルのバッチを入力ピンに出力する。

構文

HRESULT ReceiveMultiple (
    IMediaSample **ppSamples,
    long nSamples,
    long *nSamplesProcessed
);

パラメータ

ppSamples
サンプル配列へのポインタのアドレス。
nSamples
配列内のサンプルの数。
nSamplesProcessed
出力に成功したサンプルの数を受け取る変数へのポインタ。

戻り値

HRESULT 値を返す。 以下の表に示されるいずれかの値。

S_FALSE このサンプルを処理する前にエンドオブストリーム通知を受け取った。
S_OK 成功。

注意

オブジェクトがスレッドを使っているなら、このメソッドは配列内で未処理のすべてのサンプルをキューに入れる。そうでなければ、このメソッドは入力ピンの IMemInputPin::ReceiveMultiple メソッドを呼び出す。

COutputQueue::Reset

COutputQueue クラス

オブジェクトをリセットし、再びデータを受け取れるようにする。

構文

void Reset(void);

戻り値

戻り値なし。

注意

このメソッドは m_hr メンバ変数を S_OK にリセットする。オブジェクトはメディア サンプルを再び受け取ることができる、たとえばフラッシュ処理の後。

COutputQueue::SendAnyway

COutputQueue クラス

未処理のすべてのサンプルを出力する。

構文

void SendAnyway(void);

注意

If the m_bBatchExact メンバ変数が TRUE なら、オブジェクトはサンプルのバッチを出力する前に m_ppSamples 配列にオブジェクトを入れる。たとえば、EOS メソッドは SendAnyway を呼び出してエンドオブストリーム メッセージを処理する。

COutputQueue::SetPopEvent

COutputQueue クラス

オブジェクトがキューからサンプルを削除したかどうかを通知するイベントを指定する。

構文

void COutputQueue::SetPopEvent(
    HANDLE hEvent
);

構文

hEvent
呼び出し元によって作成されたイベントへのハンドル。

COutputQueue::ThreadProc

COutputQueue クラス

サンプルをキューから取得し、それを入力ピンに出力する。

構文

DWORD ThreadProc(void);

戻り値

ゼロを返す。

注意

InitialThreadProc メソッドはこのメソッドを呼び出して、メインのスレッドループを実装する。そのループの中で、メソッドは次のステップを行う :

  1. キュー (m_List) のサンプルを取得する。
  2. サンプルがコントロール メッセージなら、スレッドはコントロール動作を実行する。そうでなければ、サンプルを m_ppSamples 配列に入れる。
  3. その配列がいっぱいなら (あるいは m_bBatchExact が FALSE なら) スレッドは IMemInputPin::ReceiveMultiple メソッドを呼び出してサンプルを出力する。
  4. キュー内にサンプルがなければ、スレッドは m_hSem セマフォで待つ。

スレッドは m_bTerminate メンバ変数が TRUE になると終了する。