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がコールされたとき、

ストリーミングが開始されると、

Grabber::stopLiveクラスライブラリリファレンス>クラス>Grabber>Grabber::stopLive Methodがコールされると、

インフォメーション

ヘッダファイル: tisudshl.h
ネームスペース: DShowLib

ICImagingControl3.5より実装

メソッド

メソッド 説明
allocAndQueueBuffersクラスライブラリリファレンス>クラス>FrameQueueSink>FrameQueueSink::allocAndQueueBuffers Method 複数のバッファを確保し、入力キューに割り当てます。
createクラスライブラリリファレンス>クラス>FrameQueueSink>FrameQueueSink::create Method 新しいFrameQueueSinkを作成します。
getFrameCountInfoクラスライブラリリファレンス>クラス>FrameQueueSink>FrameQueueSink::getFrameCountInfo Method Sinkから、FrameCountInfoを取得します。
getInputQueueSizeクラスライブラリリファレンス>クラス>FrameQueueSink>FrameQueueSink::getInputQueueSize Method 入力キューにある現在のFrameQueueBufferオブジェクトの数を返します。
getOutputFrameTypeクラスライブラリリファレンス>クラス>FrameQueueSink>FrameQueueSink::getOutputFrameType Method 現在接続されているFrameTypeInfoを取得します。
getOutputQueueSizeクラスライブラリリファレンス>クラス>FrameQueueSink>FrameQueueSink::getOutputQueueSize Method 出力キューにある現在のFrameQueueBufferオブジェクトの数を返します。
isCancelRequestedクラスライブラリリファレンス>クラス>FrameQueueSink>FrameQueueSink::isCancelRequested Method Grabber::stopLiveがコールされたときに、trueを返します。
isConnectedクラスライブラリリファレンス>クラス>FrameQueueSink>FrameQueueSink::isConnected Method Sinkが現在接続されているかどうかを返します。
popAllInputQueueBuffersクラスライブラリリファレンス>クラス>FrameQueueSink>FrameQueueSink::popAllInputQueueBuffers Method 入力キューからすべてのFrameQueueBufferインスタンスを取得します。
popAllOutputQueueBuffersクラスライブラリリファレンス>クラス>FrameQueueSink>FrameQueueSink::popAllOutputQueueBuffers Method 出力キューからすべてのFrameQueueBufferインスタンスを取得します。
popOutputQueueBufferクラスライブラリリファレンス>クラス>FrameQueueSink>FrameQueueSink::popOutputQueueBuffer Method 出力キューから1枚のFrameQueueBufferインスタンスを取得します。
queueBufferクラスライブラリリファレンス>クラス>FrameQueueSink>FrameQueueSink::queueBuffer Method 1つ以上のFrameQueueBufferオブジェクトをFrameQueueSinkの入力キューにキューイングし ます。