Registrieren und Aufzählen von MFTs

In diesem Abschnitt wird beschrieben, wie Sie Media Foundation-Transformationen aufzählen und wie Sie eine benutzerdefinierte MFT registrieren, damit Anwendungen sie ermitteln können.

Aufzählen von MFTs

Um MFTs zu ermitteln, die im System registriert sind, kann eine Anwendung die MFTEnumEx-Funktion aufrufen.

Hinweis

Diese Funktion erfordert Windows 7. Vor Windows 7 sollten Anwendungen stattdessen die Funktion MFTEnum verwenden.

 

Diese Funktion verwendet die folgenden Informationen als Eingabe:

  • Die Kategorie der MFT, die aufgezählt werden soll, z. B. Videodecoder oder Audiodecoder.
  • Ein Eingabe- oder Ausgabeformat, das übereinstimmen soll.
  • Flags, die zusätzliche Suchbedingungen angeben.

Die Funktion gibt ein Array von IMFActivate-Zeigern zurück, die jeweils eine MFT darstellen, die den Enumerationskriterien entspricht.

Der folgende Code listet beispielsweise Windows Media Video-Decoder auf:

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);

Standardmäßig werden einige MFT-Typen von der Enumeration ausgeschlossen, einschließlich asynchroner MFTs, Hardware-MFTs und MFTs mit Einschränkungen für die Verwendung. Diese werden ausgeschlossen, da sie alle eine besondere Verarbeitung erfordern. Verwenden Sie den Parameter Flags von MFTEnumEx, um den Standardwert zu ändern. Um beispielsweise Hardware-MFTs in die Enumerationsergebnisse einzuschließen, legen Sie das Flag MFT_ENUM_FLAG_HARDWARE fest:

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
    );

Registrieren von MFTs

Wenn Sie eine Media Foundation-Transformation (MFT) registrieren, werden zwei Arten von Informationen in die Registrierung geschrieben:

  • Die CLSID der MFT, sodass Clients CoCreateInstance oder CoGetClassObject aufrufen können, um eine Instanz der MFT zu erstellen. Dieser Registrierungseintrag folgt dem Standardformat für COM-Klassenfabriken. Weitere Informationen finden Sie in der Windows SDK-Dokumentation für das Component Object Model (COM).
  • Informationen, mit denen eine Anwendung MFTs nach funktionaler Kategorie aufzählen kann.

Rufen Sie die Funktion MFTRegister auf, um die MFT-Enumerationseinträge in der Registrierung zu erstellen. Sie können die folgenden Informationen in die MFT einschließen:

  • Die Kategorie der MFT, z. B. Videodecoder oder Video-Encoder. Eine Liste der Kategorien finden Sie unter MFT_CATEGORY.
  • Eine Liste von Eingabe- und Ausgabeformaten, die von der MFT unterstützt werden. Jedes Format wird durch einen Haupttyp und einen Untertyp definiert. (Um detailliertere Formatinformationen zu erhalten, muss der Client die MFT und die IMFTransform-Methoden aufrufen.) Das Topolader verwendet diese Informationen, wenn eine partielle Topologie aufgelöst wird.

Um die Einträge aus der Registrierung zu entfernen, rufen Sie MFTUnregister an.

Der folgende Code zeigt, wie eine MFT registriert wird. In diesem Beispiel wird davon ausgegangen, dass es sich bei der MFT um einen Videoeffekt handelt, der dieselben Formate sowohl für die Eingabe als auch für die Ausgabe unterstützt.

// 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;
}

Feld der Verwendungseinschränkungen

Media Foundation-Transformationen