Partager via


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

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.

Note Il n’y a aucun moyen d’énumérer seulement les TPF 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 mfts 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 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
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 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

Voir aussi

Restrictions de champ d’utilisation

MFTRegister

Fonctions Media Foundation

Inscription et énumération des MFT