ストリーミングスレッドの実装 (QStreamer)

パーサーフィルターに該当する機能を持つフィルターは、ストリーミングスレッド を管理し、下流フィルターへ能動的にデーターストリームを送信する必要がある。

ストリーミングスレッド

ストリーミングスレッドは、フィルターグラフの開始 (Run(), Pause()) によって 作成、開始する。フィルターグラフの停止 (Stop()) によって、停止、解放する。

ストリーミングスレッドでは、Matroska の Block を読み込み、デコードして、 出力サンプルを、入力ピンへと出力する。

全てのサンプルを出力し終わったら、IPin::EndOfStream() を呼び出し、ストリーム の終了を通知する。

シークの要求を受けた場合、IPin::BeginFlush() を呼び出し、下流フィルターに バッファリングされているサンプルを破棄させる。その後、シーク処理を行い、 IPin::EndFlush() を呼び出し、サンプルの受信再開を準備させる。

フィルターグラフの開始要求で、入力ピンの Allocator の IMemAllocator::Commit() を 呼び出しバッファーの準備を行う。

フィルターグラフの停止要求では、入力ピンの Allocator の IMemAllocator::Decommit() を 呼び出しバッファーの破棄を要求する。ストリーミングスレッドにて、出力サンプルバッファーの要求処理 でブロックされいる場合は、この処理によって制御を戻すので、ストリーミングスレッドを終了 することが可能になる。

サンプルの出力

IMemAllocator, IMemInputPin を使用して、Push Model でサンプルデーターの出力する処理は、 以下の通りである。

IMemAllocator::GetBuffer() を呼び出し MediaSample を要求する。下流フィルターのバッファー が一杯の場合は、ブロックされる。

IMediaSample::GetPointer() で、バッファーのポインタを取得し、サンプルデーターを書き込む。

必要に応じて、IMediaSample::SetTime() 等で、タイムスタンプ等の追加の情報を設定する。

IMemInputPin::Receive() を呼び出し、MediaSample を引き渡す。