FrameQueueSink
ビデオキャプチャデバイスから受け取った、連続したフレームを処理するのに適したSinkです。
シンクはFrameQueueSink::createクラスライブラリリファレンス>クラス>FrameQueueSink>FrameQueueSink::create Methodをコールすることで作成され、FrameQueueSinkListenerクラスライブラリリファレンス>クラス>FrameQueueSinkListenerから派生 したクラスのインスタンスへの参照が必要です。入力された画像フレームが処理可能になった際、またsinkの状態が変化したとにリスナーのメソッドがコールされます。
バッファの取り扱い
このsinkの内部では、FrameQueueBufferクラスライブラリリファレンス>クラス>FrameQueueBufferの2つのキューを管理します。
- 中身のない入力キュー
- 画像データの入った出力キュー
allocAndQueueBuffersクラスライブラリリファレンス>クラス>FrameQueueSink>FrameQueueSink::allocAndQueueBuffers Methodまたは、queueBufferクラスライブラリリファレンス>クラス>FrameQueueSink>FrameQueueSink::queueBuffer Methodのコールによって入力キューに投入されます。入力キューの現在の長さはgetInputQueueSizeクラスライブラリリファレンス>クラス>FrameQueueSink>FrameQueueSink::getInputQueueSize Methodをコールすることで取得できます。
デバイスから画像フレームを受け取ると、入力キューからバッファを受け取り、画像データがコピーされ、出力キューの最後に配置されます。sinkが画像を受け取ったときに入力キューに空きがない場合は、フレームドロップが発生します。Sinkがコピーしたフレーム数やドロップしたフレーム数の情報は、getFrameCountInfoクラスライブラリリファレンス>クラス>FrameQueueSink>FrameQueueSink::getFrameCountInfo Methodで取得することができます。
SinkからはpopOutputQueueBufferクラスライブラリリファレンス>クラス>FrameQueueSink>FrameQueueSink::popOutputQueueBuffer Methodまたは、popAllOutputQueueBuffersクラスライブラリリファレンス>クラス>FrameQueueSink>FrameQueueSink::popAllOutputQueueBuffers Methodを使って出力キューから 画像データを取り出します。出力キューの長さはgetOutputQueueSizeクラスライブラリリファレンス>クラス>FrameQueueSink>FrameQueueSink::getOutputQueueSize Methodをコールすること事で取得できます。
フレームドロップを避けるためには、入力キューにいつでも利用可能なバッファがある必要があります。
そのため、出力キューからデータを取り出したバッファはを再利用できるように再キューすことが必須です。
イベント
FrameQueueSinkListener::sinkConnectedクラスライブラリリファレンス>クラス>FrameQueueSink>FrameQueueSinkListener::sinkConnected Methodメソッドは、 Grabber::prepareLiveクラスライブラリリファレンス>クラス>Grabber>Grabber::prepareLive MethodまたはGrabber::startLiveクラスライブラリリファレンス>クラス>Grabber>Grabber::startLive Methodのコール中にSink画像フォーマットが決定された際にコールされます。これにより、ビデオキャプチャデバイスから最初の画像が入力される前に、正しいフォーマットでバッファを割り当て、それらが正しくキューされるために使用することができます。
FrameQueueSinkListener::framesQueuedクラスライブラリリファレンス>クラス>FrameQueueSinkListener>FrameQueueSinkListener::framesQueued Methodメソッドは、フレームが入力され出力キューにコピーされると、毎回コールされます。コールバック実行中に次のフレームが出力キューに追加された場合は、コールバックが戻った直後に再度コールされます。
FrameQueueSinkListener::sinkDisconnectedクラスライブラリリファレンス>クラス>FrameQueueSinkListener>FrameQueueSinkListener::sinkConnected Methodメソッドは、 Grabber::stopLiveクラスライブラリリファレンス>クラス>Grabber>Grabber::stopLive Methodのコール中にデバイスが停止するとコールされます。
sink状態の変化
Grabber::prepareLiveクラスライブラリリファレンス>クラス>Grabber>Grabber::prepareLive MethodまたはGrabber::startLiveクラスライブラリリファレンス>クラス>Grabber>Grabber::startLive Methodがコールされたとき、
- Sinkは出力バッファキューと、入力バッファキューをクリアして、sink.getInputQueueSize() == 0 およびsink.getOutputQueusSize() == 0 となります。
- Sinkはsinkの出力フレーム型を確認し、Graph内で接続されます。
- Sinkはユーザーが提供するFrameQueueSinkListener::sinkConnectedクラスライブラリリファレンス>クラス>FrameQueueSink>FrameQueueSinkListener::sinkConnected Methodをコールします。
ストリーミングが開始されると、
- Sinkが新しい画像を受け取り、getInputQueueSize() > 0になると、画像がFrameQueueBufferクラスライブラリリファレンス>クラス>FrameQueueBufferにコピーされ、内部コピーカウンタが追加されます。
- 画像フレームがコピーされると、スレッドが起動され、ユーザーが提供するFrameQueueSinkListener::framesQueuedクラスライブラリリファレンス>クラス>FrameQueueSinkListener>FrameQueueSinkListener::framesQueued Methodをコールします。
- Sinkが新しい画像を受け取り、getInputQueueSize() == 0になると、内部のドロップカウンタが追加されます。
Grabber::stopLiveクラスライブラリリファレンス>クラス>Grabber>Grabber::stopLive Methodがコールされると、
- Sinkは画像入力デバイスからの画像の受け取りを停止します。
- sink.isCancelRequested()はtrueを返します。
- Sinkは、現在実行中のFrameQueueSinkListener::framesQueuedクラスライブラリリファレンス>クラス>FrameQueueSinkListener>FrameQueueSinkListener::framesQueued Methodへのコールが返ってくるまで待機します。
- SinkはFrameQueueSinkListener::sinkDisconnectedクラスライブラリリファレンス>クラス>FrameQueueSinkListener>FrameQueueSinkListener::sinkConnected Methodをコールします。
- Sinkは入力バッファキューをクリアして、sink.getInputQueueSize() == 0となります。
- 中身の入ったバッファは出力キューに留まり、再度LiveStartまたはLivePrepareがコールされるまでクリアされません。
インフォメーション
ヘッダファイル: tisudshl.h
ネームスペース: DShowLib
ICImagingControl3.5より実装
継承
GrabberSinkTypeクラスライブラリリファレンス>クラス>GrabberSinkType
FrameQueueSink
メソッド
構造体
構造体 | 説明 |
---|---|
FrameCountInformationクラスライブラリリファレンス>クラス>FrameQueueSink>FrameQueueSink::FrameCountInfomation Structure | sinkからのフレームカウント情報 |