MFTEnum2-Funktion (mfapi.h)

Ruft eine Liste von Microsoft Media Foundation-Transformationen (MFTs) ab, die den angegebenen Suchkriterien entsprechen. Diese Funktion erweitert die MFTEnumEx-Funktion , damit externe Anwendungen und interne Komponenten die Hardware-MFTs ermitteln können, die einem bestimmten Grafikkarten entsprechen.

Syntax

HRESULT MFTEnum2(
  [in]           GUID                         guidCategory,
  [in]           UINT32                       Flags,
  [in]           const MFT_REGISTER_TYPE_INFO *pInputType,
  [in]           const MFT_REGISTER_TYPE_INFO *pOutputType,
  [in, optional] IMFAttributes                *pAttributes,
  [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.

[in, optional] pAttributes

Ein Zeiger auf eine IMFAttributes-Schnittstelle , die den Zugriff auf den Standardattributspeicher ermöglicht. Um einen bestimmten Hardwareadapter anzugeben, für den MFTs abgefragt werden, legen Sie das attribut MFT_ENUM_ADAPTER_LUID auf die LUID des Adapters fest. Wenn Sie dies tun, müssen Sie auch das MFT_ENUM_FLAG_HARDWARE-Flag angeben, oder E_INVALIDARG zurückgegeben wird.

[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 die Methode erfolgreich ist, wird S_OK zurückgegeben. Wenn ein Fehler auftritt, können mögliche Rückgabecodes die in der folgenden Tabelle gezeigten Werte umfassen, sind jedoch nicht darauf beschränkt.

Rückgabecode Beschreibung
E_INVALIDARG
Im pAttributes-Parameter wurde ein IMFAttributes-Attribut mit dem MFT_ENUM_ADAPTER_LUID-Attribut bereitgestellt, und das MFT_ENUM_FLAG_HARDWARE-Flag wurde nicht angegeben.

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.
Hinweis Wenn im pAttributes-Parameter ein IMFAttributes-Attribut mit dem MFT_ENUM_ADAPTER_LUID-Attribut angegeben wird, muss das MFT_ENUM_FLAG_HARDWARE-Flag festgelegt werden, damit E_INVALIDARG zurückgegeben wird.
 
 

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 MFTEnum2-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 MFTEnum2-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\EnableEncoders

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

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

Für Hardwarecodecs kann der guidCategory-Parameter von MFTEnum2 auch eine der folgenden KS-Gerätekategorien (Kernel streaming) 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

Das folgende Beispiel ruft den ersten verfügbaren IDXGIAdapter1 ab und ruft die Adapter-LUID ab, die zum Identifizieren des Adapters für die nachfolgenden Beispiele erforderlich ist.

HRESULT hr = S_OK;
IDXGIFactory1 *pDxgiFactory = NULL;
IDXGIAdapter1 *pDxgiAdapter = NULL;
LUID adapterLuid;

if (FAILED(hr = CreateDXGIFactory1(__uuidof(IDXGIFactory1), (void **)&pDxgiFactory)))
{
    return hr;
}

if (FAILED(hr = pDxgiFactory->EnumAdapters1(0, &pDxgiAdapter)))
{
    return hr;
}

DXGI_ADAPTER_DESC1 AdapterDescr;
if (FAILED(hr = pDxgiAdapter->GetDesc1(&AdapterDescr)))
{
    if (pDxgiAdapter)
    {
        pDxgiAdapter->Release();
        pDxgiAdapter = NULL;
    }
    return hr;
}

adapterLuid = AdapterDescr.AdapterLuid;

Im folgenden Beispiel wird nach einem Hardwarevideo- oder Audiodecoder gesucht. Asynchrone Decoder, Hardware- und Transcodierungsdecoder sind ausgeschlossen. Wenn eine Übereinstimmung gefunden wird, erstellt der Code das erste MFT in der Liste. Im Gegensatz zum parallelen Beispiel im MFTEnumEx-Artikel erstellt dieses Beispiel eine instance von IMFAttributes und legt das attribut MFT_ENUM_ADAPTER_LUID auf die LUID der Schnittstelle fest, von der der Decoder angefordert wird. Beim Aufruf von MFTEnum2 wird das erforderliche MFT_ENUM_FLAG_HARDWARE-Flag festgelegt, und das IMFAttributes-Argument wird bereitgestellt.

HRESULT FindHWDecoder(
    const GUID& subtype,        // Subtype
    BOOL bAudio,                // TRUE for audio, FALSE for video
    LUID& adapterLuid,          // LUID of the graphics adapter for which to find the decoder
    IMFTransform **ppDecoder    // Receives a pointer to the decoder.
)
{
    HRESULT hr = S_OK;

    
    UINT32 count = 0;

    IMFActivate **ppActivate = NULL;

    CComPtr<IMFAttributes> spAttributes;
    hr = MFCreateAttributes(&spAttributes, 1);
    if (FAILED(hr = spAttributes->SetBlob(MFT_ENUM_ADAPTER_LUID, (BYTE*)&adapterLuid, sizeof(LUID))))
    {
        return hr;
    }


    MFT_REGISTER_TYPE_INFO info = { 0 };

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

    hr = MFTEnum2(
        bAudio ? MFT_CATEGORY_AUDIO_DECODER : MFT_CATEGORY_VIDEO_DECODER,
        MFT_ENUM_FLAG_HARDWARE | MFT_ENUM_FLAG_SYNCMFT | MFT_ENUM_FLAG_LOCALMFT | MFT_ENUM_FLAG_SORTANDFILTER,
        &info,      // Input type
        NULL,       // Output type
        spAttributes,
        &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 Hardwarevideo- oder Audioencoder gesucht. Asynchrone Encoder, Hardware-, Transcodierungs- und Field-of-Use-Encoder sind ausgeschlossen. Im Gegensatz zum parallelen Beispiel im MFTEnumEx-Artikel erstellt dieses Beispiel eine instance von IMFAttributes und legt das attribut MFT_ENUM_ADAPTER_LUID auf die LUID der Schnittstelle fest, von der der Encoder angefordert wird. Beim Aufruf von MFTEnum2 wird das erforderliche MFT_ENUM_FLAG_HARDWARE-Flag festgelegt, und das IMFAttributes-Argument wird bereitgestellt.

HRESULT FindHWEncoder(
    const GUID& subtype,        // Subtype
    BOOL bAudio,                // TRUE for audio, FALSE for video
    LUID& adapterLuid,          // LUID of the graphics adapter for which to find the encoder
    IMFTransform **ppEncoder    // Receives a pointer to the decoder.
)
{
    HRESULT hr = S_OK;
    UINT32 count = 0;

    IMFActivate **ppActivate = NULL;

    CComPtr<IMFAttributes> spAttributes;
    hr = MFCreateAttributes(&spAttributes, 1);
    if (FAILED(hr = spAttributes->SetBlob(MFT_ENUM_ADAPTER_LUID, (BYTE*)&adapterLuid, sizeof(LUID))))
    {
        return hr;
    }

    MFT_REGISTER_TYPE_INFO info = { 0 };

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

    hr = MFTEnum2(
        bAudio ? MFT_CATEGORY_AUDIO_ENCODER : MFT_CATEGORY_VIDEO_ENCODER,
        MFT_ENUM_FLAG_HARDWARE | MFT_ENUM_FLAG_SYNCMFT | MFT_ENUM_FLAG_LOCALMFT | MFT_ENUM_FLAG_SORTANDFILTER,
        NULL,       // Input type
        &info,      // Output type
        spAttributes,
        &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 Hardware-Videodecoder mit Optionen gesucht, die asynchrone Decoder, Hardware- oder Transcodierungsdecoder einschließen können. Im Gegensatz zum parallelen Beispiel im MFTEnumEx-Artikel erstellt dieses Beispiel eine instance von IMFAttributes und legt das attribut MFT_ENUM_ADAPTER_LUID auf die LUID der Schnittstelle fest, von der der Videodecoder angefordert wird. Beim Aufruf von MFTEnum2 wird das erforderliche MFT_ENUM_FLAG_HARDWARE-Flag festgelegt, und das IMFAttributes-Argument wird bereitgestellt.

HRESULT FindHWVideoDecoder(
    const GUID& subtype,
    BOOL bAllowAsync,
    BOOL bAllowHardware,
    BOOL bAllowTranscode,
    LUID& adapterLuid,          // LUID of the graphics adapter for which to find the encoder
    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;
    }

    unFlags |= MFT_ENUM_FLAG_HARDWARE;

    CComPtr<IMFAttributes> spAttributes;
    hr = MFCreateAttributes(&spAttributes, 1);
    if (FAILED(hr = spAttributes->SetBlob(MFT_ENUM_ADAPTER_LUID, (BYTE*)&adapterLuid, sizeof(LUID))))
    {
        return hr;
    }

    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

Anforderung Wert
Unterstützte Mindestversion (Client) Windows 10 [nur Desktop-Apps]
Unterstützte Mindestversion (Server) Windows Server 2016 [nur Desktop-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