Microsoft DirectX 8.0 |
このトピックでは、ファイル リーダー ソース フィルタで認識できるように新しいファイル タイプを登録する方法について説明する。ここで用いられるメカニズムは Microsoft® Win32® の GetClassFile 関数で使用されているもので、特定のファイル名に関連付けられた CLSID を返す。Microsoft® DirectShow® のメディア タイプではレジストリ内の 4 つの値のセットを使用しており、これは GetClassFile の FileType 登録で使われるものと同じである。ただし、この基準に合致するファイルはファイル タイプではなくメディア タイプに関連付けられる。また、DirectShow メディア タイプのレジストリ エントリには、このメディア タイプを読み取るために使用できるソース フィルタの CLSID が提供される。
FileType 登録と MediaType 登録のいずれにおいても、レジストリ内のパターンには次のフォーマットのエントリ列が含まれる。
regdb key = offset, cb, mask, value
メディア タイプは CLSID のペア {Majortype clsid, Subtype clsid} として定義される。ファイル内の指定されたオフセット位置にあるデータが HKEY_CLASSES_ROOT\Media Type\{<major type>}\{<subtype>} 内のパターンと一致した場合、そのパターンに関連付けられたメディア タイプ CLSID ペアがファイルのメディア タイプとなる。
レジストリ キーのパラメータは次のように解釈される。offset の値はファイルの先頭または末尾からのオフセットであり、cb は長さ (バイト単位) である。この 2 つの 10 進値は、ファイル内の特定のバイト範囲を表す (オフセット値が負の場合はファイルの末尾からのオフセットを表す)。mask 値は 16 進のビット マスクであり、offset と cb で指定されたバイト範囲との論理 AND 演算に使用される。論理 AND 演算の結果は value と比較される。マスクを省略した場合は、すべて 1 と仮定される。mask と value 内の 16 進の桁数は、cb の値の 2 倍でなければならない (cb はバイト単位であるため)。
レジストリ内の各パターンは、データベース内のパターンの順序に従ってファイルと比較される。それぞれの値が AND 演算の結果と一致した最初のパターンが、ファイルのメディア タイプを決定する。
各エントリには、4 つの値の組が複数含まれる場合もある。その場合は、すべての組がファイル内のデータと一致した場合に、メディア タイプがファイルに関連付けられる。1 つのエントリに 4 つの値の組を複数使用する例としては、バイト シーケンスをファイルの先頭と末尾の両方と一致させる場合などがある。次の例では、ファイルの最初の 4 バイトとしてパターン AB CD 12 34、ファイルの最後の 4 バイトとして AB AB 00 AB を指定している (マスクは適用されていない)。ファイルをメディア タイプに関連付けるには、パターンに対してすべての要素が一致する必要がある。
0 = REG_SZ 0, 4, , ABCD1234, -4, 4, , ABAB00AB
また、1 つのメディア タイプについて複数のエントリが指定される場合もある。この場合、いずれか 1 つのエントリに一致すれば、ファイルがメディア タイプに関連付けられる。
たとえば、次のレジストリ エントリに含まれるパターンでは、最初の 3 バイトが AB CD 12、4 つ目のバイトが 32、33、34、または 35、そして最後の 4 バイトが FE FE FE FE である必要がある。
HKEY_CLASSES_ROOT Media Type {12345678-0000-0001-C000-000000000095} {87654321-0000-0001-C000-000000000095} 0 = REG_SZ 0, 4, FFFFFFFE, ABCD1234, -4, 4, , FEFEFEFE 1 = REG_SZ 0, 4, FFFFFFFE, ABCD1232, -4, 4, , FEFEFEFE Source Filter = {56781234-0000-0001-C000-000000000095}
ファイルにそのようなパターンが含まれる場合は、メディア タイプ {12345678-0000-0001-C000-000000000095}{87654321-0000-0001-C000-000000000095} がこのファイルに関連付けられる。メディア タイプに対するファイル ソース フィルタは、メディア タイプのキーにある Source Filter 値の CLSID によって識別される。
メディア タイプを使用して、ファイルをレンダリングするためのフィルタ ハンドラを見つけることができる。タイプに対応するハンドラは、データをレンダリングする前にファイルの詳細なテストを実行して、ファイルのタイプを確認する。
この方式では、代替マスクのセット (.wav ファイル) を使用できる。これには RIFF ヘッダーがあってもなくてもよい。
バイト拡張子なしでのファイル拡張子の登録
前に述べたように、特定のファイル拡張子に対して特定のメディア タイプ/サブタイプのペアまたはソース フィルタ CLSID を登録できる。この場合、メディア タイプの読み取りにはこのタイプおよびソース フィルタのみが使用される。ただし、独自のソース フィルタを登録した場合は、名前がソース フィルタに渡されて解釈されるため、実際のファイル名を表す名前には何の制限もない。
レジストリ エントリは次のようになる。
HKEY_CLASSES_ROOT\Media Type\Extensions
ファイル拡張子が .foo であれば、キーの内容は次のようになる。
.foo REG_SZ:Media Type REG_SZ:Subtype REG_SZ: Source Filter
それぞれの値が GUID を表す。