フィルタ情報の宣言
最初のステップは、フィルタ情報の宣言である (必要な場合)。DirectShow は、フィルタ、ピン、メディア タイプを記述するために、次のような構造体を定義している。
構造体 | 説明 |
AMOVIESETUP_FILTER | フィルタを記述する。 |
AMOVIESETUP_PIN | ピンを記述する。 |
AMOVIESETUP_MEDIATYPE | メディア タイプを記述する。 |
これらの構造体はネストしている。AMOVEIESETUP_FILTER 構造体には AMOVIESETUP_PIN 構造体の配列へのポインタがあり、各 AMOVIESETUP_PIN 構造体には AMOVEIESETUP_MEDIATYPE 構造体の配列へのポインタがある。これらすべての構造体によって、IFilterMapper2 インターフェイスがフィルタを見つけるために必要な情報が十分に与えられる。構造体によって、フィルタが完全に記述されるわけではない。たとえば、フィルタが同じピンの複数のインスタンスを生成する場合でも、そのフィルタに対して 1 つの AMOVIESETUP_PIN 構造体を宣言するだけでよい。また、登録しているメディア タイプのすべての組み合わせをサポートする必要はなく、サポートしているすべてのメディア タイプを登録する必要もない。
このセットアップ構造体を、DLL の内部でグローバル変数として宣言する。次の例に、出力ピンを 1 つ持つフィルタを示す。
static const WCHAR g_wszName[] = L"Some Filter";
AMOVIESETUP_MEDIATYPE sudMediaTypes[] = {
{ &MEDIATYPE_Video, &MEDIASUBTYPE_RGB24 },
{ &MEDIATYPE_Video, &MEDIASUBTYPE_RGB32 },
};
AMOVIESETUP_PIN sudOutputPin = {
L"", // 現在使われていない。
FALSE, // このピンはレンダリングされるか?
TRUE, // 出力ピンか?
FALSE, // フィルタはゼロ個のインスタンスを作成できるか?
FALSE, // フィルタは複数のインスタンスを作成できるか?
&GUID_NULL, // 現在使われていない。
NULL, // 現在使われていない。
2, // メディア タイプの数。
sudMediaTypes // メディア タイプへのポインタ。
};
AMOVIESETUP_FILTER sudFilterReg = {
&CLSID_SomeFilter, // フィルタ CLSID。
g_wszName, // フィルタ名。
MERIT_NORMAL, // メリット。
1, // ピン タイプの数。
&sudOutputPin // ピン情報へのポインタ。
};
フィルタ名は他の場所でも使用するので、静的グローバル変数としてフィルタ名を宣言している。