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.
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.
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
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 |