« Async Readerでないと無理 | メイン | O/Rマッピング »

2005年10月24日

吉里吉里 ムービー拡張日誌2:: インプレイスフィルタ with VMR

    

DirectX VAを使用する場合は、レンダーの入力ピンからIAMVideoAcceleratorを取得する必要がある。
だが、インプレイスフィルタをデコーダーとVMRの間に挿入した場合、デコーダーに渡される入力ピンはインプレイスフィルタのものになる。
つまり、インプレイスフィルタの入力ピンに対してQueryInterfaceしてIAMVideoAcceleratorを得ようとするわけだが、インプレイスフィルタの入力ピンはそんなもの持っていない。

VMRでパフォーマンスが下がってしまう原因はこれだろうか?
本来、インプレイスフィルタはデータの変換を行うので、DirectX VAの利用はできなくなってしまうが、現在使用しているインプレイスフィルタは単にイベントを投げるだけなので、DirectX VAの使用は問題ないはず。

現在の接続プロセスでは、一度デコーダーとVMRをつないで、その接続に使われているメディアタイプを取得し、取得したメディアタイプを使ってインプレイスフィルタをつなぐ。
もし、最初の接続でDirectX VAが使われていた場合、このメディアタイプはDirectX VAの物となる。
だけど、WMF SDKのヘルプには、IPin::Disconnectが発生したらソースフィルタはNULLを引数にしてIWMCodecAMVideoAccelerator::SetAcceleratorInterfaceをコールし、CodecとレンダラーとのDirectX VA接続を解除するように実装しろとある。
つまり、現在の実装では一度VMRの入力ピンのデコーダーとVMRをDisconnectしてしまっているので、DirectX VAの接続が切れてしまっている可能性がある。
ただ、Disconnectなどの実装はいい加減なことが多いようなので、DirectX VAの接続を解除していない可能性もある。
この場合、DirectX VAがたまたま使えているかもしれない。
でも、そのような手抜きのたまたまの処理に依存するのは好ましくない。
単にイベントを投げるだけのインプレイスフィルタでは、レンダーの入力ピンへのポインタを保持しておき、QueryInterfaceでIID_IAMVideoAcceleratorが指定された時に、保持しているレンダーの入力ピンへ処理を委譲した方が良さそうだ。

だけど、DirectX VAが使えないとしたら、以前の接続に使われていたメディアタイプで再接続できるのは変だな。。。
DirectX VAの接続の解除を行っていないのか?

後、良くわからないのはインプレイスフィルタのReceiveがコールされていること。
WMF SDKのヘルプとDirectXのヘルプによると、DirectX VAが使われている時は、IAMVideoAcceleratorを使ってダイレクトに表示の更新を行う。
もしインプレイスフィルタを使うなら、アップストリームからダウンストリームへ順次Receiveを呼び出していくような処理が必要だし、現にReceiveがコールされているので、そのような処理が組まれていると思われる。
これはどうやっているのか?
単純にWMF SDKのヘルプのDirectX VAのネゴシエーション方法を参照しただけではこの辺りがうまく実装できなさそうだ。
デコーダフィルタでIAMVideoAcceleratorを使う方法なども良く読んでおいたほうが良いな。



投稿者 Takenori : 2005年10月24日 22:36




comments powered by Disqus
Total : Today : Yesterday : なかのひと