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 など) は列挙から除外されます。 除外の理由は、これらがすべて何らかの特殊な処理を必要とすることです。 既定値を変更するには、MFTEnumExFlags パラメーターを使用します。 たとえば、列挙結果にハードウェア 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;
}

使用分野制限

メディア ファンデーション変換