MFTEnumEx-Funktion (mfapi.h)

Ruft eine Liste von Microsoft Media Foundation-Transformationen (MFTs) ab, die den angegebenen Suchkriterien entsprechen. Diese Funktion erweitert die MFTEnum-Funktion .

Syntax

HRESULT MFTEnumEx(
  [in]  GUID                         guidCategory,
  [in]  UINT32                       Flags,
  [in]  const MFT_REGISTER_TYPE_INFO *pInputType,
  [in]  const MFT_REGISTER_TYPE_INFO *pOutputType,
  [out] IMFActivate                  ***pppMFTActivate,
  [out] UINT32                       *pnumMFTActivate
);

Parameter

[in] guidCategory

Eine GUID, die die Kategorie der aufzuzählenden MFTs angibt. Eine Liste der MFT-Kategorien finden Sie unter MFT_CATEGORY.

[in] Flags

Das bitweise OR von null oder mehr Flags aus der _MFT_ENUM_FLAG-Enumeration .

[in] pInputType

Ein Zeiger auf eine MFT_REGISTER_TYPE_INFO-Struktur , die einen zu übereinstimmenden Eingabemedientyp angibt.

Dieser Parameter kann NULL sein. Bei NULL werden alle Eingabetypen abgeglichen.

[in] pOutputType

Ein Zeiger auf eine MFT_REGISTER_TYPE_INFO-Struktur , die einen Ausgabemedientyp angibt, der übereinstimmen soll.

Dieser Parameter kann NULL sein. Bei NULL werden alle Ausgabetypen abgeglichen.

[out] pppMFTActivate

Empfängt ein Array von IMFActivate-Schnittstellenzeigern . Jeder Zeiger stellt ein Aktivierungsobjekt für einen MFT dar, das den Suchkriterien entspricht. Die Funktion weist den Arbeitsspeicher für das Array zu. Der Aufrufer muss die Zeiger freigeben und die CoTaskMemFree-Funktion aufrufen, um den Arbeitsspeicher für das Array freizugeben.

[out] pnumMFTActivate

Empfängt die Anzahl der Elemente im pppMFTActivate-Array . Wenn keine MFTs den Suchkriterien entsprechen, erhält dieser Parameter den Wert 0.

Rückgabewert

Wenn diese Funktion erfolgreich ist, gibt sie S_OK zurück. Andernfalls wird ein Fehlercode HRESULT zurückgegeben.

Hinweise

Der Flags-Parameter steuert, welche MFTs aufgelistet werden, und die Reihenfolge, in der sie zurückgegeben werden. Die Flags für diesen Parameter sind in mehrere Gruppen unterteilt.

Der erste Satz von Flags gibt an, wie ein MFT Daten verarbeitet.

Flag Beschreibung
MFT_ENUM_FLAG_SYNCMFT Die MFT führt synchrone Datenverarbeitung in Software durch. Dies ist das ursprüngliche MFT-Verarbeitungsmodell und mit Windows Vista kompatibel.
MFT_ENUM_FLAG_ASYNCMFT Die MFT führt asynchrone Datenverarbeitung in Software durch. Für dieses Verarbeitungsmodell ist Windows 7 erforderlich. Weitere Informationen finden Sie unter Asynchrone MFTs.
MFT_ENUM_FLAG_HARDWARE Der MFT führt hardwarebasierte Datenverarbeitung durch, wobei entweder der AVStream-Treiber oder ein GPU-basiertes Proxy-MFT verwendet wird. MFTs in dieser Kategorie verarbeiten Daten immer asynchron. Weitere Informationen finden Sie unter Hardware-MFTs.
 

Jede MFT fällt genau in eine dieser Kategorien. Um eine Kategorie aufzulisten, legen Sie das entsprechende Flag im Flags-Parameter fest. Sie können diese Flags kombinieren, um mehrere Kategorien aufzulisten. Wenn keines dieser Flags angegeben ist, ist die Standardkategorie synchrone MFTs (MFT_ENUM_FLAG_SYNCMFT).

Als Nächstes enthalten die folgenden Flags MFTs, die andernfalls von den Ergebnissen ausgeschlossen werden. Standardmäßig werden Flags, die diesen Kriterien entsprechen, von den Ergebnissen ausgeschlossen. Verwenden Sie diese Flags, um sie einzuschließen.

Flag Beschreibung
MFT_ENUM_FLAG_FIELDOFUSE Schließen Sie MFTs ein, die von der Anwendung entsperrt werden müssen.
MFT_ENUM_FLAG_LOCALMFT Schließen Sie MFTs ein, die im Prozess des Aufrufers über die Funktion MFTRegisterLocal oder MFTRegisterLocalByCLSID registriert sind.
MFT_ENUM_FLAG_TRANSCODE_ONLY Schließen Sie MFTs ein, die für die Transcodierung und nicht für die Wiedergabe optimiert sind.
 

Das letzte Flag wird verwendet, um die Ergebnisse zu sortieren und zu filtern:

Flag Beschreibung
MFT_ENUM_FLAG_SORTANDFILTER Sortieren und filtern Sie die Ergebnisse.
 

Wenn das MFT_ENUM_FLAG_SORTANDFILTER-Flag festgelegt ist, sortiert die MFTEnumEx-Funktion die Ergebnisse wie folgt:

  • Lokal: Wenn das flag MFT_ENUM_FLAG_LOCALMFT festgelegt ist, werden lokale MFTs zuerst in der Liste angezeigt. Um einen lokalen MFT zu registrieren, rufen Sie die Funktion MFTRegisterLocal oder MFTRegisterLocalByCLSID auf.
  • Verdienst: MFTs mit einem Verdienstwert werden als nächstes in der Liste in der Reihenfolge des Verdienstwerts (höchster bis niedrigster Wert) angezeigt. Weitere Informationen zum Verdienst finden Sie unter MFT_CODEC_MERIT_Attribute.
  • Bevorzugt: Wenn ein MFT in der bevorzugten Liste des Plug-In-Steuerelements aufgeführt ist, wird er als Nächstes in der Liste angezeigt. Weitere Informationen zum Plug-In-Steuerelement finden Sie unter IMFPluginControl.
  • Wenn ein MFT in der Blockierten Liste angezeigt wird, wird er von den Ergebnissen ausgeschlossen. Weitere Informationen zur Blockierten Liste finden Sie unter IMFPluginControl::IsDisabled.
  • Alle anderen MFTs, die den Suchkriterien entsprechen, werden unsortiert am Ende der Liste angezeigt.
Wenn Sie das MFT_ENUM_FLAG_SORTANDFILTER-Flag nicht festlegen, gibt die MFTEnumEx-Funktion eine unsortierte Liste zurück.

Das Festlegen des Flags-Parameters auf 0 entspricht der Verwendung des Werts MFT_ENUM_FLAG_SYNCMFT | MFT_ENUM_FLAG_LOCALMFT | MFT_ENUM_FLAG_SORTANDFILTER.

Das Festlegen von Flags auf MFT_ENUM_FLAG_SYNCMFT entspricht dem Aufrufen der MFTEnum-Funktion .

Wenn keine MFTs den Suchkriterien entsprechen, gibt die Funktion S_OK zurück, es sei denn, es tritt ein anderer Fehler auf. Überprüfen Sie daher immer die anzahl, die im pcMFTActivate-Parameter empfangen wurde, bevor Sie den pppMFTActivate-Zeiger ableiten.

Hinweis Es gibt keine Möglichkeit, nur lokale MFTs aufzulisten und nichts anderes. Das Festlegen von Flags gleich MFT_ENUM_FLAG_LOCALMFT entspricht dem Einschließen des MFT_ENUM_FLAG_SYNCMFT Flags. Wenn Sie die Ergebnisse jedoch auch sortieren, indem Sie das MFT_ENUM_FLAG_SORTANDFILTER-Flag angeben, werden lokale MFTs zuerst in der Liste angezeigt.
 

Erstellen des MFT

Wenn mindestens ein MFT den Suchkriterien entspricht, empfängt der parameter pppMFTActivate ein Array von IMFActivate-Zeigern . Für jeden übereinstimmenden MFT wird ein Zeiger zurückgegeben. Jeder Zeiger stellt ein Aktivierungsobjekt für den MFT dar. Weitere Informationen finden Sie unter Aktivierungsobjekte.

Zusätzliche Informationen zu jedem MFT werden als Attribute für die Aktivierungsobjekte gespeichert. Eine Liste der möglichen Attribute finden Sie unter Transform Attributes.

Um eine instance des MFT zu erstellen, rufen Sie IMFActivate::ActivateObject auf.

Hardwarecodecs

Hardwarecodecs werden von den Enumerationsergebnissen ausgeschlossen, wenn die folgenden Registrierungsschlüssel auf 0 festgelegt sind:

Decoder: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Media Foundation\HardwareMFT\EnableDecoder

Encoder: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Media Foundation\HardwareMFT\EnableEncoder

Videoprozessoren: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Media Foundation\HardwareMFT\EnableVideoProcessors

Diese Schlüssel sind für OEMs bestimmt und sollten nicht von Anwendungen verwendet werden.

Für Hardwarecodecs kann der guidCategory-Parameter von MFTEnumEx auch eine der folgenden Kernelstreaming-Gerätekategorien (KS) angeben:

  • KSCATEGORY_DATACOMPRESSOR
  • KSCATEGORY_DATADECOMPRESSOR
Hardwarecodecs sollten auch unter einer MFT_CATEGORY GUID registriert werden, sodass Anwendungen diese Kategorien im Allgemeinen anstelle der KS-Gerätekategorien verwenden sollten.

Beispiele

Im folgenden Beispiel wird nach einem Video- oder Audiodecoder gesucht. Asynchrone, Hardware-, Transcodierungs- und Einsatzfelddecoder sind ausgeschlossen. Wenn eine Übereinstimmung gefunden wird, erstellt der Code den ersten MFT in der Liste.

HRESULT FindDecoderEx(
    const GUID& subtype,        // Subtype
    BOOL bAudio,                // TRUE for audio, FALSE for video
    IMFTransform **ppDecoder    // Receives a pointer to the decoder.
    )
{
    HRESULT hr = S_OK;
    UINT32 count = 0;

    IMFActivate **ppActivate = NULL;

    MFT_REGISTER_TYPE_INFO info = { 0 };

    info.guidMajorType = bAudio ? MFMediaType_Audio : MFMediaType_Video;
    info.guidSubtype = subtype;

    hr = MFTEnumEx(
        bAudio ? MFT_CATEGORY_AUDIO_DECODER : MFT_CATEGORY_VIDEO_DECODER,
        MFT_ENUM_FLAG_SYNCMFT | MFT_ENUM_FLAG_LOCALMFT | MFT_ENUM_FLAG_SORTANDFILTER,
        &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(ppDecoder));
    }

    for (UINT32 i = 0; i < count; i++)
    {
        ppActivate[i]->Release();
    }
    CoTaskMemFree(ppActivate);

    return hr;
}

Im nächsten Beispiel wird nach einem Video- oder Audioencoder gesucht. Asynchrone, Hardware-, Transcodierungs- und Field-of-Use-Encoder sind ausgeschlossen.

HRESULT FindEncoderEx(
    const GUID& subtype,        // Subtype
    BOOL bAudio,                // TRUE for audio, FALSE for video
    IMFTransform **ppEncoder    // Receives a pointer to the decoder.
    )
{
    HRESULT hr = S_OK;
    UINT32 count = 0;

    IMFActivate **ppActivate = NULL;

    MFT_REGISTER_TYPE_INFO info = { 0 };

    info.guidMajorType = bAudio ? MFMediaType_Audio : MFMediaType_Video;
    info.guidSubtype = subtype;

    hr = MFTEnumEx(
        bAudio ? MFT_CATEGORY_AUDIO_ENCODER : MFT_CATEGORY_VIDEO_ENCODER,
        MFT_ENUM_FLAG_SYNCMFT | MFT_ENUM_FLAG_LOCALMFT | MFT_ENUM_FLAG_SORTANDFILTER,
        NULL,       // Input type
        &info,      // Output type
        &ppActivate,
        &count
        );

    if (SUCCEEDED(hr) && count == 0)
    {
        hr = MF_E_TOPO_CODEC_NOT_FOUND;
    }

    // Create the first encoder in the list.

    if (SUCCEEDED(hr))
    {
        hr = ppActivate[0]->ActivateObject(IID_PPV_ARGS(ppEncoder));
    }

    for (UINT32 i = 0; i < count; i++)
    {
        ppActivate[i]->Release();
    }
    CoTaskMemFree(ppActivate);

    return hr;
}

Im nächsten Beispiel wird nach einem Videodecoder gesucht, mit Optionen, die asynchrone, Hardware- oder Transcodierungsdecoder enthalten können.

HRESULT FindVideoDecoder(
    const GUID& subtype,
    BOOL bAllowAsync,
    BOOL bAllowHardware, 
    BOOL bAllowTranscode,
    IMFTransform **ppDecoder
    )
{
    HRESULT hr = S_OK;
    UINT32 count = 0;

    IMFActivate **ppActivate = NULL;

    MFT_REGISTER_TYPE_INFO info = { MFMediaType_Video, subtype };

    UINT32 unFlags = MFT_ENUM_FLAG_SYNCMFT  | MFT_ENUM_FLAG_LOCALMFT | 
                     MFT_ENUM_FLAG_SORTANDFILTER;

    if (bAllowAsync)
    {
        unFlags |= MFT_ENUM_FLAG_ASYNCMFT;
    }
    if (bAllowHardware)
    {
        unFlags |= MFT_ENUM_FLAG_HARDWARE;
    }
    if (bAllowTranscode)
    {
        unFlags |= MFT_ENUM_FLAG_TRANSCODE_ONLY;
    }

    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(ppDecoder));
    }

    for (UINT32 i = 0; i < count; i++)
    {
        ppActivate[i]->Release();
    }
    CoTaskMemFree(ppActivate);

    return hr;
}

Anforderungen

   
Unterstützte Mindestversion (Client) Windows 7 [Desktop-Apps | UWP-Apps]
Unterstützte Mindestversion (Server) Windows Server 2008 R2 [Desktop-Apps | UWP-Apps]
Zielplattform Windows
Kopfzeile mfapi.h
Bibliothek Mfplat.lib
DLL Mfplat.dll

Weitere Informationen

Nutzungseinschränkungen

MFTRegister

Media Foundation-Funktionen

Registrieren und Aufzählen von MFTs