Fonction MFTEnum2 (mfapi.h)
Obtient la liste des transformations Microsoft Media Foundation (MFT) qui correspondent aux critères de recherche spécifiés. Cette fonction étend la fonction MFTEnumEx pour permettre aux applications externes et aux composants internes de découvrir les MFT matériels qui correspondent à une carte vidéo spécifique.
Syntaxe
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
);
Paramètres
[in] guidCategory
GUID qui spécifie la catégorie de mfts à énumérer. Pour obtenir la liste des catégories MFT, consultez MFT_CATEGORY.
[in] Flags
OR au niveau du bit de zéro ou plusieurs indicateurs de l’énumération _MFT_ENUM_FLAG.
[in] pInputType
Pointeur vers une structure de MFT_REGISTER_TYPE_INFO qui spécifie un type de média d’entrée à mettre en correspondance.
Ce paramètre peut être NULL. Si la valeur est NULL, tous les types d’entrée sont mis en correspondance.
[in] pOutputType
Pointeur vers une structure de MFT_REGISTER_TYPE_INFO qui spécifie un type de média de sortie à mettre en correspondance.
Ce paramètre peut être NULL. Si la valeur est NULL, tous les types de sortie sont mis en correspondance.
[in, optional] pAttributes
Pointeur vers une interface IMFAttributes qui permet d’accéder au magasin d’attributs standard. Pour spécifier une carte matérielle spécifique pour laquelle les mfT sont interrogés, définissez l’attribut MFT_ENUM_ADAPTER_LUID sur LUID de l’adaptateur. Dans ce cas, vous devez également spécifier l’indicateur de MFT_ENUM_FLAG_HARDWARE ou E_INVALIDARG est retourné.
[out] pppMFTActivate
Reçoit un tableau de pointeurs d’interface IMFActivate . Chaque pointeur représente un objet d’activation pour un MFT qui correspond aux critères de recherche. La fonction alloue la mémoire pour le tableau. L’appelant doit libérer les pointeurs et appeler la fonction CoTaskMemFree pour libérer la mémoire du tableau.
[out] pnumMFTActivate
Reçoit le nombre d’éléments dans le tableau pppMFTActivate . Si aucun mft ne correspond aux critères de recherche, ce paramètre reçoit la valeur zéro.
Valeur retournée
Si la méthode réussit, retourne S_OK. En cas d’échec, les codes de retour possibles incluent, sans s’y limiter, les valeurs indiquées dans le tableau suivant.
Code de retour | Description |
---|---|
|
Un IMFAttributes contenant l’attribut MFT_ENUM_ADAPTER_LUID a été fourni dans le paramètre pAttributes et l’indicateur MFT_ENUM_FLAG_HARDWARE n’a pas été spécifié. |
Remarques
Le paramètre Flags contrôle les mfts qui sont énumérés et l’ordre dans lequel ils sont retournés. Les indicateurs de ce paramètre se répartissent en plusieurs groupes.
Le premier ensemble d’indicateurs spécifie comment un MFT traite les données.
Indicateur | Description |
---|---|
MFT_ENUM_FLAG_SYNCMFT | Le MFT effectue le traitement synchrone des données dans un logiciel. Il s’agit du modèle de traitement MFT d’origine et est compatible avec Windows Vista. |
MFT_ENUM_FLAG_ASYNCMFT | Le MFT effectue un traitement asynchrone des données dans un logiciel. Ce modèle de traitement nécessite Windows 7. Pour plus d’informations, consultez MfT asynchrones. |
MFT_ENUM_FLAG_HARDWARE |
Le MFT effectue le traitement des données basé sur le matériel, à l’aide du pilote AVStream ou d’un proxy MFT basé sur GPU. Les mfts de cette catégorie traitent toujours les données de manière asynchrone. Pour plus d’informations, consultez MfT matériels.
Note Si un imfAttributes contenant l’attribut MFT_ENUM_ADAPTER_LUID est fourni dans le paramètre pAttributes , l’indicateur MFT_ENUM_FLAG_HARDWARE doit être défini ou E_INVALIDARG est retourné.
|
Chaque MFT appartient exactement à l’une de ces catégories. Pour énumérer une catégorie, définissez l’indicateur correspondant dans le paramètre Flags . Vous pouvez combiner ces indicateurs pour énumérer plusieurs catégories. Si aucun de ces indicateurs n’est spécifié, la catégorie par défaut est les mft synchrones (MFT_ENUM_FLAG_SYNCMFT).
Ensuite, les indicateurs suivants incluent des MFT qui sont autrement exclus des résultats. Par défaut, les indicateurs qui correspondent à ces critères sont exclus des résultats. Utilisez ces indicateurs pour les inclure.
Indicateur | Description |
---|---|
MFT_ENUM_FLAG_FIELDOFUSE | Incluez les MFT qui doivent être déverrouillés par l’application. |
MFT_ENUM_FLAG_LOCALMFT | Incluez les MFT inscrits dans le processus de l’appelant via la fonction MFTRegisterLocal ou MFTRegisterLocalByCLSID . |
MFT_ENUM_FLAG_TRANSCODE_ONLY | Incluez des MFT optimisés pour le transcodage plutôt que pour la lecture. |
Le dernier indicateur est utilisé pour trier et filtrer les résultats :
Indicateur | Description |
---|---|
MFT_ENUM_FLAG_SORTANDFILTER | Triez et filtrez les résultats. |
Si l’indicateur MFT_ENUM_FLAG_SORTANDFILTER est défini, la fonction MFTEnum2 trie les résultats comme suit :
- Local : si l’indicateur MFT_ENUM_FLAG_LOCALMFT est défini, les MFT locaux apparaissent en premier dans la liste. Pour inscrire un MFT local, appelez la fonction MFTRegisterLocal ou MFTRegisterLocalByCLSID .
- Mérite : Les TFM ayant une valeur au mérite apparaissent en regard de la liste, dans l’ordre de la valeur au mérite (la plus élevée à la plus faible). Pour plus d’informations sur le mérite, consultez MFT_CODEC_MERIT_Attribute.
- Préféré : si un MFT est répertorié dans la liste préférée du contrôle de plug-in, il apparaît ensuite dans la liste. Pour plus d’informations sur le contrôle de plug-in, consultez IMFPluginControl.
- Si un MFT apparaît dans la liste bloquée, il est exclu des résultats. Pour plus d’informations sur la liste bloquée, consultez IMFPluginControl ::IsDisabled.
- Tous les autres MFT qui correspondent aux critères de recherche apparaissent à la fin de la liste, sans tri.
Définir le paramètre Flags sur zéro revient à utiliser la valeur MFT_ENUM_FLAG_SYNCMFT | MFT_ENUM_FLAG_LOCALMFT | MFT_ENUM_FLAG_SORTANDFILTER.
Définir indicateurs sur MFT_ENUM_FLAG_SYNCMFT revient à appeler la fonction MFTEnum .
Si aucun objet MFT ne correspond aux critères de recherche, la fonction retourne S_OK, sauf si une autre erreur se produit. Par conséquent, case activée toujours le nombre reçu dans le paramètre pcMFTActivate avant de déréférencer le pointeur pppMFTActivate.
Création du MFT
Si au moins un MFT correspond aux critères de recherche, le paramètre pppMFTActivate reçoit un tableau de pointeurs IMFActivate . Un pointeur est retourné pour chaque MFT correspondant. Chaque pointeur représente un objet d’activation pour le MFT. Pour plus d’informations, consultez Activation Objects.Des informations supplémentaires sur chaque MFT sont stockées en tant qu’attributs sur les objets d’activation. Pour obtenir la liste des attributs possibles, consultez Transformer les attributs.
Pour créer un instance du MFT, appelez IMFActivate ::ActivateObject.
Codecs matériels
Les codecs matériels sont exclus des résultats de l’énumération si les clés de Registre suivantes sont définies sur zéro :Décodeurs : HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Media Foundation\HardwareMFT\EnableDecoders
Encodeurs : HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Media Foundation\HardwareMFT\EnableEncoders
Processeurs vidéo : HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Media Foundation\HardwareMFT\EnableVideoProcessors
Ces clés sont destinées aux oem et ne doivent pas être utilisées par les applications.
Pour les codecs matériels, le paramètre guidCategory de MFTEnum2 peut également spécifier l’une des catégories d’appareils de streaming de noyau (KS) suivantes :
- KSCATEGORY_DATACOMPRESSOR
- KSCATEGORY_DATADECOMPRESSOR
Exemples
L’exemple suivant récupère le premier IDXGIAdapter1 disponible et obtient les adaptateurs LUID, qui est nécessaire pour identifier l’adaptateur pour les exemples suivants.
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;
L’exemple suivant recherche un décodeur vidéo ou audio matériel. Les décodeurs asynchrones, matériels, transcodeurs et champs d’utilisation sont exclus. Si une correspondance est trouvée, le code crée la première MFT de la liste. Contrairement à l’exemple parallèle de l’article MFTEnumEx, cet exemple crée une instance d’IMFAttributes et définit l’attribut MFT_ENUM_ADAPTER_LUID à l’attribut LUID de l’interface à partir de laquelle le décodeur est demandé. Dans l’appel à MFTEnum2, l’indicateur de MFT_ENUM_FLAG_HARDWARE requis est défini et l’argument IMFAttributes est fourni.
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;
}
L’exemple suivant recherche un encodeur vidéo ou audio matériel. Les encodeurs asynchrones, matériels, transcodeurs et champ d’utilisation sont exclus. Contrairement à l’exemple parallèle de l’article MFTEnumEx, cet exemple crée une instance d’IMFAttributes et définit l’attribut MFT_ENUM_ADAPTER_LUID à l’attribut LUID de l’interface à partir de laquelle l’encodeur est demandé. Dans l’appel à MFTEnum2, l’indicateur de MFT_ENUM_FLAG_HARDWARE requis est défini et l’argument IMFAttributes est fourni.
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;
}
L’exemple suivant recherche un décodeur vidéo matériel, avec des options permettant d’inclure des décodeurs asynchrones, matériels ou transcodeurs. Contrairement à l’exemple parallèle de l’article MFTEnumEx, cet exemple crée une instance de IMFAttributes et définit l’attribut MFT_ENUM_ADAPTER_LUID à l’attribut LUID de l’interface à partir de laquelle le décodeur vidéo est demandé. Dans l’appel à MFTEnum2, l’indicateur de MFT_ENUM_FLAG_HARDWARE requis est défini et l’argument IMFAttributes est fourni.
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;
}
Configuration requise
Condition requise | Valeur |
---|---|
Client minimal pris en charge | Windows 10 (applications de bureau uniquement) |
Serveur minimal pris en charge | Windows Server 2016 (applications de bureau uniquement) |
Plateforme cible | Windows |
En-tête | mfapi.h |
Bibliothèque | Mfplat.lib |
DLL | Mfplat.dll |