Fonction MFTEnumEx (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 MFTEnum .
Syntaxe
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
);
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 à correspondre.
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 à correspondre.
Ce paramètre peut être NULL. Si la valeur est NULL, tous les types de sortie sont mis en correspondance.
[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 cette fonction réussit, elle retourne S_OK. Sinon, elle retourne un code d’erreur HRESULT.
Notes
Le paramètre Flags contrôle les mfts é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 la façon dont un MFT traite les données.
Indicateur | Description |
---|---|
MFT_ENUM_FLAG_SYNCMFT | Le MFT effectue un 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 | MFT effectue le traitement des données matérielles, à l’aide du pilote AVStream ou d’un proxy gpu MFT. Les mfts de cette catégorie traitent toujours les données de manière asynchrone. Pour plus d’informations, consultez Mfts matériels. |
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 mfts synchrones (MFT_ENUM_FLAG_SYNCMFT).
Ensuite, les indicateurs suivants incluent les mfts qui sont par ailleurs 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 mfts qui doivent être déverrouillés par l’application. |
MFT_ENUM_FLAG_LOCALMFT | Incluez les MFT qui sont 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 MFTEnumEx trie les résultats comme suit :
- Local : si l’indicateur MFT_ENUM_FLAG_LOCALMFT est défini, les mfts locaux apparaissent en premier dans la liste. Pour inscrire un MFT local, appelez la fonction MFTRegisterLocal ou MFTRegisterLocalByCLSID .
- Mérite : Les TPF ayant une valeur de mérite apparaissent ensuite sur la liste, par ordre de valeur au mérite (du plus élevé au plus bas). 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 s’affichent à la fin de la liste, sans tri.
Définir le paramètre Flags sur zéro équivaut à utiliser la valeur MFT_ENUM_FLAG_SYNCMFT | MFT_ENUM_FLAG_LOCALMFT | MFT_ENUM_FLAG_SORTANDFILTER.
Définir indicateurs sur MFT_ENUM_FLAG_SYNCMFT équivaut à appeler la fonction MFTEnum .
Si aucun 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 Objets d’activation.Des informations supplémentaires sur chaque MFT sont stockées sous forme d’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 MFTEnumEx peut également spécifier l’une des catégories d’appareils de diffusion en continu du noyau (KS) suivantes :
- KSCATEGORY_DATACOMPRESSOR
- KSCATEGORY_DATADECOMPRESSOR
Exemples
L’exemple suivant recherche un décodeur vidéo ou audio. Les décodeurs asynchrones, matériels, transcodeurs et champs d’utilisation sont exclus. Si une correspondance est trouvée, le code crée le premier MFT dans la 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;
}
L’exemple suivant recherche un encodeur vidéo ou audio. Les encodeurs asynchrones, matériels, transcodeurs et champ d’utilisation sont exclus.
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;
}
L’exemple suivant recherche un décodeur vidéo, avec des options permettant d’inclure des décodeurs asynchrones, matériels ou transcodeurs.
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;
}
Spécifications
Client minimal pris en charge | Windows 7 [applications de bureau | Applications UWP] |
Serveur minimal pris en charge | Windows Server 2008 R2 [applications de bureau | Applications UWP] |
Plateforme cible | Windows |
En-tête | mfapi.h |
Bibliothèque | Mfplat.lib |
DLL | Mfplat.dll |