DirectShow フィルタ機能紹介 ~ 知っておくと便利なフィルタ
こんにちははらだんです。今回は DirectShow のフィルタの種類を紹介します。これまでに GraphEdit にてフィルタを構成する方法をお話ししましたが、実際フィルタ一覧を見ると、そのフィルタの名称から、わかりやすいものもあればさっぱりわからないものもあるのではないかと思います。これらについて DirectX9 SDK のドキュメントに表がありますのでご紹介します。その中から知っておくとよいと思うフィルタをいくつかピックアップします。レンダラ フィルタに関する小ネタも紹介します。
まずはドキュメントの紹介です。
Microsoft DirectX 9.0
GraphEdit で追加することのできるフィルタにはこのリストにない物ももちろんあります。Windows Media Player が使用しているフィルタや、サード パーティ製のフィルタなどです。さらには、キャプチャ フィルタ、ハードウェア デコーダ フィルタなどデバイスに強く依存するフィルタもある場合が環境によりあります。それらについては残念ながら情報がありません。トライ アンド エラーで試すという状況になります。
また Vista 以降で追加されたフィルタなどは日本語のドキュメントにはありませんのでこちらを参考にしてください。
折角ですので、その中からいくつかピック アップしてコメントをさせていただきます。
・ Color Space Converter
カラー フォーマットの変換(色空間の変換)をします。ビデオ デコーダの
後続のエフェクト関連フィルタやレンダラにうまくピンが繋がらない時に
間に入れると接続ができるようになることが多いので、覚えておくと便利です。
・ File Writer
データをファイルに書き出すフィルタです。エンコードしたデータの出力や、
デコードしたデータの出力などファイルに書き出すフィルタです。
テストには重宝します。
・ Infinite Pin Tee
入力をそのまま任意の出力ピンに出すフィルタです。テーブル タップのような
イメージです。電子回路的にはデマルチプレクサという言葉でも合っていると
思います。多数のモニタに同一の画像を出す場合などに使えます。
2 出力に分岐し、片方をレンダラにつながる系列とし、片方をファイルに出力
する系列とするならば Smart Tee フィルタもあります。
・ DMO Wrapper
DirectX Media Object (DMO) を DirectShow で扱えるようにしたフィルタです。
プログラムの際に使用する DMO によっては扱い方が特殊になりますが
覚えておくといいかもしれません。
・ Null Renderer
入力を破棄するフィルタです。なぜこのようなフィルタがあるのかと
いいますと、たとえば Sample Grabber フィルタを使用して
アプリケーションでデータを取得する目的のグラフの場合に、
Sample Grabber から先のフィルタに通常の Renderer フィルタを入れると
Renderer フィルタの持つクロックの動作により実時間の処理時間がかかります。
特にデータを取り出すだけの作業の場合は”可能な限り早く”が望ましいので、
これでは困ります。そんな時にこのレンダラフィルタを使用する手があります。
・ Enhanced Video Renderer (EVR)
EVR は Vista 以降のレンダラフィルタです。Media Foundation の フィルタの
エンジンをDirectShow で使えるようにしたフィルタとなっています。
・ Video Mixing Renderer (VMR7)
Windows XP 以降で使えます。DirectDraw7 を使ったレンダラでデフォルトの
レンダラです。
・ Video Mixing Renderer (VMR9)
Windows XP 以降で使えます。Direct3D 9 を使ったレンダラです。
・ Video Renderer
使用できる場合には DirectDraw や Overlay を使用しますが、使えない場合に
GDI を使用するレンダラです。GDI の描画となりますので処理は重くなります。
さらに VMR7 とフレンドリ名が同じであることが書かれていますが、
これにはのちほど紹介する小ネタがあります。
このフィルタはデインターレース処理が行えないことを特記しておきます。
このように Video Renderer/VMR7/VMR9/EVR はそれぞれ異なるテクノロジを使用したレンダラ フィルタです。この違いは少しだけ覚えておくとよいかもしれません。
Video Renderer と VMR7 の小ネタ
DirectShow アプリケーションでフレンドリ名を指定してグラフを作成した場合には通常 VMR7 が使用されます。同一のフレンドリ名の場合にメリット値が大きいフィルタが使われます。VMR7 の方が Video Renderer よりも大きな値を持っています。 CLSID を使用してグラフを作成している場合には使えない小ネタですが、これを利用すると、メリット値を変更することでアプリケーションのレンダラを変更することができます。たとえば画面をまたいでのレンダリングは、VMR は対応していませんがVideo Renderer では可能です。そこでメリット値を変更してシステムデフォルトレンダラをVideo Renderer に差し替えることで実現可能になります。ただし当然ながらその他の VMR7 を使用するアプリケーションすべてに影響があります。
いかがでしたか、使い慣れている方はコメントしたフィルタはよくご存知かと思いますが、これから DirectShow アプリケーションを開発しようとしている方は知っておくと便利かと思います。
花がないのに花見に行ったはらだんでした。