Date

Windows SDK の中に「PushSource Desktop Filter(CPushSourceDesktop)」というサンプルコードがある。これは、GDIを使ってデスクトップのビットマップを取得し、ダウンストリームフィルタへ送るプッシュソースフィルタである。

ヘルプにはAVIファイルに書きだす場合の方法が書いてある。

出力を AVI ファイルにレンダリングする場合は、AVI Mux を読み込み、ファイル ライタ フィルタを読み込み、ファイル ライタに出力名を指定し、プッシュ ソース フィルタの出力ピンをレンダリングする。

これに従って、次のようなグラフを作る。

ところが5fpsや1fpsなど低いfpsで出力したり、GraphEditのUse Clockを使ったりしても、全速力で書き出されてしまう。

これがプルではなくプッシュソースフィルタというのもひとつの原因ではあるが、「AVI Muxフィルタが過剰に到着したフレームをドロップしない」「ファイルライタフィルタがプレゼンテーションタイムを待たずに到着したデータを次から次へと書き込んでいく」という仕様のおかげで全速力で書き出されてしまうようだ。

試しにファイルライタフィルタの代わりに「各サンプルのプレゼンテーション タイムを待つ」Null Rendererを繋ぐと、適切なタイミングで処理が進む。

ひとまず対策としては、PushSource Desktop FilterのFill Bufferに(特に負荷が高くない環境であれば)Sleep(1000)を入れる、あるいはtimeGetTimeなどのAPIを呼び、タイミングを見計らってプッシュすると良いだろう。


Comments

comments powered by Disqus