Date

フィルタのカテゴリ

DirectShow フィルタには、カテゴリというものがある。GraphEdit を起動して[Insert Filteres]を選択すると、ツリーが表示されるが、その最上位に並んでるものがカテゴリだ。

自作の DirectShow フィルタを作成したとき、DllRegisterServer関数内部でAMovieDllRegisterServer2を呼び出しておけば、DirectShow Filtersというカテゴリに登録される。

自分のアプリケーションで使うトランスフォームフィルタやレンダラーフィルタであれば特に問題無いが、例えば何らかのデバイスからキャプチャするためのフィルタを作り、Windows Live Messengerなど他のアプリケーションから認識させたいとき、これだけでは不十分である。カテゴリを指定してフィルターを登録する必要がある。

カテゴリを指定して登録する

カテゴリを登録するにはIFilterMapper2インターフェイスを使う。このインターフェイスは、あるカテゴリを満たすフィルタを列挙したり、登録したりできる。DllRegisterServer関数内部でIFilterMapper2::RegisterFilterを呼び出す。

まず、フィルタ情報を表すREGFILTER2構造体のメンバを適当に設定する。AMOVIESETUP_FILTERと役割がほとんど似ているが互換性はない。

1
2
3
4
5
6
REGFILTER2 rf2FilterReg={
    1,               // Version 1 (ピン メディアとピン カテゴリなし)。
    MERIT_DO_NOT_USE,// メリット。
    1,               // ピンの数。
    &sudPins         // ピン情報へのポインタ。
};

次にDllRegisterServer内で、AMovieDllRegisterServer2の代わりにIFilterMapper2::RegisterFilterを呼び出す。ここではCLSID_VideoInputDeviceCategoryカテゴリで登録する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
IFilterMapper2 *pFM2=NULL;
hr=CoCreateInstance(CLSID_FilterMapper2, NULL,
    CLSCTX_INPROC_SERVER,IID_IFilterMapper2, (void **)&pFM2);
if(FAILED(hr))
    return hr;
hr = pFM2->RegisterFilter(
    CLSID_BlueFilter,// フィルタ CLSID
    FILTER_NAME,     // フィルタ名
    NULL,            // デバイス モニカ
    &CLSID_VideoInputDeviceCategory, // カテゴリ
    FILTER_NAME,     // 表示名
    &rf2FilterReg    // フィルタ情報へのポインタ
);
pFM2->Release();

登録を確認する

CLSID_VideoInputDeviceCategoryは、ビデオキャプチャフィルタを表す。regsvr32で登録し、GraphEdit で見てみると Video Capture Sources カテゴリに登録されていることが確認できる。

Windows Live Messenger からもフィルタを認識することが確認できる。


Comments

comments powered by Disqus