QTheora (0.9.0) | 2009-09-09 12:00 |
パーサーフィルターに該当する機能を持つフィルターは、ストリーミングスレッド を管理し、下流フィルターへ能動的にデーターストリームを送信する必要がある。
ストリーミングスレッドは、フィルターグラフの開始 (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 を引き渡す。
[PageInfo]
LastUpdate: 2009-06-10 16:59:29, ModifiedBy: noumiakira
[License]
Creative Commons 2.1 Attribution-ShareAlike
[Permissions]
view:all, edit:members, delete/config:members