Partager via


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
E_INVALIDARG
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.
Si vous ne définissez pas l’indicateur MFT_ENUM_FLAG_SORTANDFILTER , la fonction MFTEnum2 retourne une liste non triée.

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.

Note Il n’existe aucun moyen d’énumérer uniquement les MFT locaux et rien d’autre. La définition d’indicateurs sur MFT_ENUM_FLAG_LOCALMFT équivaut à inclure l’indicateur MFT_ENUM_FLAG_SYNCMFT . Toutefois, si vous triez également les résultats en spécifiant l’indicateur MFT_ENUM_FLAG_SORTANDFILTER , les MFT locaux apparaissent en premier dans la liste.
 

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
Les codecs matériels doivent également être inscrits sous un GUID de MFT_CATEGORY , de sorte que les applications doivent généralement utiliser ces catégories au lieu des catégories d’appareils KS.

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

Voir aussi

Champ de restrictions d’utilisation

MFTRegister

Fonctions Media Foundation

Inscription et énumération de mfts