FrameQueueSink
アプリケーションとして、すべてのフレームを処理する必要がある場合にFrameQueueSinkを使用します。
Sinkはそのコンストラクタをコールする事で作成され、IFrameQueueSinkListenerクラスライブラリリファレンス>クラス>IFrameQueueSinkListenerを実装したクラスへの参照、または 関数オブジェクトを必要とします。リスナーのメソッドはフレームが利用可能になった時、またはSinkの状態が変化したときにコールされます。
バッファの取り扱い
Sinkは内部的にIFrameQueueBufferクラスライブラリリファレンス>クラス>IFrameQueueBufferの2つのキューを管理しています。
- フリーバッファの入力キュー
- 画像の入力されたバッファの出力キュー
バッファは、AllocAndQueueBuffersクラスライブラリリファレンス>クラス>FrameQueueSink>FrameQueueSink.AllocAndQueueBuffers MethodまたはQueueBufferクラスライブラリリファレンス>クラス>FrameQueueSink>FrameQueueSink.QueueBuffer Methodのコールによって入力キューに入れられます。入力キューの現在のバッファ長は InputQueueSizeクラスライブラリリファレンス>クラス>FrameQueueSink>FrameQueueSink.InputQueueSize Propertyで知ることができます。
FrameQueueSinkはデバイスから画像を受け取ると、入力キューからバッファを受け取り、画像データをコピーして出力キューに配置します。Sinkが画像を受け取った時点で入力キューが空の場合、その画像はドロップされます。Sinkがコピーしたフレーム数やドロップされたフレームの情報はCountOfFramesCopiedクラスライブラリリファレンス>クラス>FrameQueueSink>FrameQueueSink.CountOfFramesCopied PropertyとCountOfFramesDroppedクラスライブラリリファレンス>クラス>FrameQueueSink>FrameQueueSink.CountOfFramesDropped Propertyで問い合わせることができます。
バッファは、PopOutputQueueBufferクラスライブラリリファレンス>クラス>FrameQueueSink>FrameQueueSink.PopOutputQueueBuffer MethodまたはPopAllOutputQueueBuffersクラスライブラリリファレンス>クラス>FrameQueueSink>FrameQueueSink.PopAllOutputQueueBuffers Methodをコールすることで、出力キューから取り出すことができます。出力キューの現在のバッファ長はOutputQueueSizeクラスライブラリリファレンス>クラス>FrameQueueSink>FrameQueueSink.OutputQueueSize Propertyで知ることができます。
Sink上でフレームがドロップする事を避けるために、アプリケーションは入力キューがいつでも利用可能なバッファであることを保証しなければなりません。そのため出力キューから抽出されたバッファの処理が終われば、再度キューに入力する必要があります。
Sink イベント
IFrameQueueSinkListener.SinkConnectedクラスライブラリリファレンス>クラス>IFrameQueueSinkListener>IFrameQueueSinkListener.SinkConnected Methodメソッドは、ICImagingControl.LiveStartクラスライブラリリファレンス>クラス>ICImagingControl>ICImagingControl.LiveStart Methodまたは ICImagingControl.LivePrepareクラスライブラリリファレンス>クラス>ICImagingControl>ICImagingControl.LivePrepare Methodの呼び出し中にSink画像フォーマットが決定された際にコールされます。これは、ビデオキャプチャデバイスから最初の画像が入力される前に、正しいフォーマットでバッファを割り当て、それらが正しくキューされるために使用することができます。
IFrameQueueSinkListener.FramesQueuedクラスライブラリリファレンス>クラス>IFrameQueueSinkListener.FramesQueued Methodメソッドは、フレームが入力され、出力キューにコピーされたあと、毎回コールされます。コールバック実行中に次のフレームが出力キューに追加された場合は、コールバックが戻った直後に再度コールされます。
IFrameQueueSinkListener.SinkDisconnectedクラスライブラリリファレンス>クラス>IFrameQueueSinkListener>IFrameQueueSinkListener.SinkDisconnected Methodメソッドは、 ICImagingControl.LiveStopクラスライブラリリファレンス>クラス>ICImagingControl>ICImagingControl.LiveStop Methodの呼び出し中にデバイスが停止するとコールされます。
シンク状態の変化
ICImagingControl.LiveStartクラスライブラリリファレンス>クラス>ICImagingControl>ICImagingControl.LiveStart Methodまたは ICImagingControl.LivePrepareクラスライブラリリファレンス>クラス>ICImagingControl>ICImagingControl.LivePrepare Methodがコールされたとき、
- Sinkは出力バッファキューと、入力バッファキューをクリアして、sink.InputQueueSize == 0 および sink.OutputQueusSize == 0 となります。
- Sinkはsinkの出力フレーム型を確認し、Graph内で接続されます。
- Sinkはユーザーが提供するIFrameQueueSinkListener.SinkConnectedクラスライブラリリファレンス>クラス>IFrameQueueSinkListener>IFrameQueueSinkListener.SinkConnected Methodをコールします。
ストリーミングが開始されると、
- Sinkが新しい画像を受け取り、InputQueueSize > 0になると、画像がIFrameQueueBufferクラスライブラリリファレンス>クラス>IFrameQueueBufferにコピーされ、内部コピーカウンタが追加されます。
- フレームコピー後、スレッドが起動され、ユーザーが提供するIFrameQueueSinkListener.FramesQueuedクラスライブラリリファレンス>クラス>IFrameQueueSinkListener>IFrameQueueSinkListener.FramesQueued Methodをコールします。
- Sinkが新しい画像を受け取り、InputQueueSize == 0になると、内部のドロップカウンタが追加されます。
ICImagingControl.LiveStopクラスライブラリリファレンス>クラス>ICImagingControl>ICImagingControl.LiveStop Methodが コールされると、
- Sinkは画像入力デバイスからの画像の受け取りを停止します。
- sink.IsCancelRequested()はtrueを返します。
- Sinkは、現在実行中のIFrameQueueSinkListener.FramesQueuedクラスライブラリリファレンス>クラス>IFrameQueueSinkListener>IFrameQueueSinkListener.FramesQueued Methodへのコールが返ってくるまで待機します。
- SinkはIFrameQueueSinkListener.SinkDisconnectedクラスライブラリリファレンス>クラス>IFrameQueueSinkListener>IFrameQueueSinkListener.SinkDisconnected Methodをコールします。
- Sinkは入力バッファキューをクリアして、sink.InputQueueSize == 0となります。
- このキューは再度、LiveStartまたはLivePrepareがコールされるまでクリアされません。
インフォメーション
ネームスペース: TIS.Imaging
IC Imaging Control 3.5より実装
プロパティ
プロパティ | 説明 |
---|---|
CountOfFramesCopiedクラスライブラリリファレンス>クラス>FrameQueueSink>FrameQueueSink.CountOfFramesCopied Property | このSinkの出力キューにコピーされたフレーム数を返します。 |
CountOfFramesDroppedクラスライブラリリファレンス>クラス>FrameQueueSink>FrameQueueSink.CountOfFramesDropped Property | 入力キューにバッファが足りないために、このSinkがドロップしたフレーム数を返します。 |
InputQueueSizeクラスライブラリリファレンス>クラス>FrameQueueSink>FrameQueueSink.InputQueueSize Property | キューに入っている(または空いている)IFrameQueueBufferクラスライブラリリファレンス>クラス>IFrameQueueBufferインスタンスの現在の数を返します。 |
IsCancelRequestedクラスライブラリリファレンス>クラス>FrameQueueSink>FrameQueueSink.IsCancelRequested Property | Sinkが現在、停止状態に移行している場合にtrueを返します。 |
OutputFrameTypeクラスライブラリリファレンス>クラス>FrameQueueSink>FrameQueueSink.OutputFrameType Property | このSinkによって使用されているIFrameクラスライブラリリファレンス>クラス>IFramesのFrameTypeクラスライブラリリファレンス>クラス>FrameTypeを返します。 |
OutputQueueSizeクラスライブラリリファレンス>クラス>FrameQueueSink>FrameQueueSink.OutputQueueSize Property | 出力リストに保持されているIFrameQueueBufferクラスライブラリリファレンス>クラス>IFrameQueueBufferインスタンスの現在の数を返します。 |
メソッド
メソッド | 説明 |
---|---|
AllocAndQueueBuffersクラスライブラリリファレンス>クラス>FrameQueueSink>FrameQueueSink.AllocAndQueueBuffers Method | 1つ以上のIFrameQueueBufferクラスライブラリリファレンス>クラス>IFrameQueueBufferをキューバッファリストに割り当て、キューされたバッファリストに入れます。 |
FrameQueueSinkクラスライブラリリファレンス>クラス>FrameQueueSink>FrameQueueSink.FrameQueueSink Method | 新しいFrameQueueSinkクラスライブラリリファレンス>クラス>FrameQueueSinkを作成します。 |
PopAllInputQueueBuffersクラスライブラリリファレンス>クラス>FrameQueueSink>FrameQueueSink.PopAllInputQueueBuffers Method | キューされたバッファリストにある全てのバッファを返し、内部リストを空にします。 |
PopAllOutputQueueBuffersクラスライブラリリファレンス>クラス>FrameQueueSink>FrameQueueSink.PopAllOutputQueueBuffers Method | コピーされたバッファリストにある全てのバッファを返し、内部リストを空にします。 |
PopOutputQueueBufferクラスライブラリリファレンス>クラス>FrameQueueSink>FrameQueueSink.PopOutputQueueBuffer Method | コピーされたバッファリストから1つのIFrameQueueBufferクラスライブラリリファレンス>クラス>IFrameQueueBufferを返します。 |
QueueBufferクラスライブラリリファレンス>クラス>FrameQueueSink>FrameQueueSink.QueueBuffer Method | 1つ以上のIFrameQueueBufferクラスライブラリリファレンス>クラス>IFrameQueueBuffersをキューされたバッファリストに入れます。 |