MFT を登録および列挙する
このセクションでは、メディア ファンデーション変換を列挙する方法、およびアプリケーションで検出できるようにカスタム MFT を登録する方法について説明します。
MFT を列挙する
システムに登録されている MFT を検出するために、アプリケーションで MFTEnumEx 関数を呼び出すことができます。
Note
この関数には Windows 7 が必要です。 Windows 7 より前のアプリケーションでは、代わりに MFTEnum 関数を使用する必要があります。
この関数には、入力として次の情報を指定します。
- 列挙する MFT のカテゴリ (ビデオ デコーダーやオーディオ デコーダーなど)。
- 一致させる入力または出力の形式。
- 追加の検索条件を指定するフラグ。
この関数からは、それぞれに列挙条件に一致する MFT を表す IMFActivate ポインターが、配列で返されます。
たとえば、次のコードを指定すると、Windows Media ビデオ デコーダーが列挙されます。
HRESULT hr = S_OK;
UINT32 count = 0;
IMFActivate **ppActivate = NULL; // Array of activation objects.
IMFTransform *pDecoder = NULL; // Pointer to the decoder.
// Match WMV3 video.
MFT_REGISTER_TYPE_INFO info = { MFMediaType_Video, MFVideoFormat_WMV3 };
UINT32 unFlags = MFT_ENUM_FLAG_SYNCMFT |
MFT_ENUM_FLAG_LOCALMFT |
MFT_ENUM_FLAG_SORTANDFILTER;
hr = MFTEnumEx(
MFT_CATEGORY_VIDEO_DECODER,
unFlags,
&info, // Input type
NULL, // Output type
&ppActivate,
&count
);
if (SUCCEEDED(hr) && count == 0)
{
hr = MF_E_TOPO_CODEC_NOT_FOUND;
}
// Create the first decoder in the list.
if (SUCCEEDED(hr))
{
hr = ppActivate[0]->ActivateObject(IID_PPV_ARGS(&pDecoder));
}
for (UINT32 i = 0; i < count; i++)
{
ppActivate[i]->Release();
}
CoTaskMemFree(ppActivate);
既定では、一部の種類の MFT (非同期 MFT、ハードウェア MFT、使用分野制限のある MFT など) は列挙から除外されます。 除外の理由は、これらがすべて何らかの特殊な処理を必要とすることです。 既定値を変更するには、MFTEnumEx の Flags パラメーターを使用します。 たとえば、列挙結果にハードウェア MFT を含めるには、MFT_ENUM_FLAG_HARDWARE フラグを設定します。
UINT32 unFlags = MFT_ENUM_FLAG_HARDWARE |
MFT_ENUM_FLAG_SYNCMFT |
MFT_ENUM_FLAG_LOCALMFT |
MFT_ENUM_FLAG_SORTANDFILTER;
hr = MFTEnumEx(
MFT_CATEGORY_VIDEO_DECODER,
unFlags,
&info, // Input type
NULL, // Output type
&ppActivate,
&count
);
MFT を登録する
メディア ファンデーション変換 (MFT) を登録すると、次の 2 種類の情報がレジストリに書き込まれます。
- MFT の CLSID。クライアントが CoCreateInstance または CoGetClassObject を呼び出して MFT のインスタンスを作成できるようにします。 このレジストリ エントリは、COM クラス ファクトリの標準形式に従います。 詳細については、コンポーネント オブジェクト モデル (COM) に関する Windows SDK のドキュメントを参照してください。
- アプリケーションが機能カテゴリ別に MFT を列挙できるようにする情報。
レジストリに MFT 列挙エントリを作成するには、MFTRegister 関数を呼び出します。 MFT に関する次の情報を含めることができます。
- MFT のカテゴリ (ビデオ デコーダーやビデオ エンコーダーなど)。 カテゴリの一覧については、「MFT_CATEGORY」を参照してください。
- MFT でサポートされる入力と出力の形式の一覧。 各形式は、メジャー タイプとサブタイプによって定義されます。 (より詳細な形式情報を取得するには、クライアントで MFT を作成し、IMFTransform メソッドを呼び出す必要があります。)この情報は、トポロジ ローダーによって部分トポロジの解決時に使用されます。
レジストリからエントリを削除するには、MFTUnregister を呼び出します。
次のコードは、MFT の登録方法を示しています。 この例では、MFT が、入力と出力の両方で同じ形式をサポートするビデオ効果であることを想定しています。
// CLSID of the MFT.
extern const GUID CLSID_MyVideoEffectMFT;
// DllRegisterServer: Creates the registry entries.
STDAPI DllRegisterServer()
{
HRESULT hr = S_OK;
// Array of media types.
MFT_REGISTER_TYPE_INFO aMediaTypes[] =
{
{ MFMediaType_Video, MFVideoFormat_NV12 },
{ MFMediaType_Video, MFVideoFormat_YUY2 },
{ MFMediaType_Video, MFVideoFormat_UYVY },
};
// Size of the array.
const DWORD cNumMediaTypes = ARRAY_SIZE(aMediaTypes);
hr = MFTRegister(
CLSID_MyVideoEffectMFT, // CLSID.
MFT_CATEGORY_VIDEO_EFFECT, // Category.
L"My Video Effect", // Friendly name.
0, // Reserved, must be zero.
cNumMediaTypes, // Number of input types.
aMediaTypes, // Input types.
cNumMediaTypes, // Number of output types.
aMediaTypes, // Output types.
NULL // Attributes (optional).
);
if (SUCCEEDED(hr))
{
// Register the CLSID for CoCreateInstance (not shown).
}
return hr;
}
// DllUnregisterServer: Removes the registry entries.
STDAPI DllUnregisterServer()
{
HRESULT hr = MFTUnregister(CLSID_MyVideoEffectMFT);
// Unregister the CLSID for CoCreateInstance (not shown).
return hr;
}
関連トピック