Inscription et énumération de MFT

Cette section explique comment énumérer les transformations Media Foundation et comment inscrire une MFT personnalisée afin que les applications puissent la découvrir.

Énumération de MFT

Pour découvrir les MFT inscrites sur le système, une application peut appeler la fonction MFTEnumEx.

Remarque

Cette fonction nécessite Windows 7. Avant Windows 7, les applications doivent utiliser la fonction MFTEnum à la place.

 

Cette fonction prend les informations suivantes comme entrée :

  • Catégorie de MFT à énumérer, telle que le décodeur vidéo ou le décodeur audio
  • Format d’entrée ou de sortie à mettre en correspondance
  • Indicateurs qui spécifient des conditions de recherche supplémentaires

La fonction retourne un tableau de pointeurs IMFActivate, chacun représentant une MFT qui correspond aux critères d’énumération.

Par exemple, le code suivant énumère les décodeurs vidéo Windows Media :

HRESULT hr = S_OK;
UINT32 count = 0;

IMFActivate **ppActivate = NULL;    // Array of activation objects.
IMFTransform *pDecoder = NULL;      // Pointer to the decoder.

// Match WMV3 video.
MFT_REGISTER_TYPE_INFO info = { MFMediaType_Video, MFVideoFormat_WMV3 };

UINT32 unFlags = MFT_ENUM_FLAG_SYNCMFT  | 
                 MFT_ENUM_FLAG_LOCALMFT | 
                 MFT_ENUM_FLAG_SORTANDFILTER;

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(&pDecoder));
}

for (UINT32 i = 0; i < count; i++)
{
    ppActivate[i]->Release();
}
CoTaskMemFree(ppActivate);

Par défaut, certains types de MFT sont exclus de l’énumération, notamment les MFT asynchrones, les MFT matérielles et les MFT présentant des restrictions de champ d’utilisation. Ceux-ci sont exclus, car ils nécessitent une gestion spéciale d’un certain type. Utilisez le paramètre Flags de MFTEnumEx pour modifier la valeur par défaut. Par exemple, pour inclure des MFT matérielles dans les résultats de l’énumération, définissez l’indicateur MFT_ENUM_FLAG_HARDWARE :

UINT32 unFlags = MFT_ENUM_FLAG_HARDWARE |
                 MFT_ENUM_FLAG_SYNCMFT  | 
                 MFT_ENUM_FLAG_LOCALMFT | 
                 MFT_ENUM_FLAG_SORTANDFILTER;
hr = MFTEnumEx(
    MFT_CATEGORY_VIDEO_DECODER,
    unFlags,
    &info,      // Input type
    NULL,       // Output type
    &ppActivate,
    &count
    );

Inscription de MFT

Lorsque vous inscrivez une transformation Media Foundation (MFT), deux types d’informations sont écrits dans le Registre :

  • Le CLSID de la MFT, afin que les clients puissent appeler CoCreateInstance ou CoGetClassObject pour créer une instance de la MFT. Cette entrée de Registre suit le format standard pour les fabriques de classes COM. Pour plus d’informations, consultez la documentation du Kit de développement logiciel Windows (Kit SDK Windows) pour le modèle COM (Component Object Model).
  • Informations qui permettent à une application d’énumérer les MFT par catégorie fonctionnelle.

Pour créer les entrées d’énumération de MFT dans le Registre, appelez la fonction MFTRegister. Vous pouvez inclure les informations suivantes sur la MFT :

  • La catégorie de la MFT, telle que le décodeur vidéo ou l’encodeur vidéo. Pour obtenir la liste des catégories, consultez l’article MFT_CATEGORY.
  • La liste des formats d’entrée et de sortie pris en charge par la MFT. Chaque format est défini par un type principal et un sous-type. (Pour obtenir des informations de format plus détaillées, le client doit créer la MFT et appeler les méthodes IMFTransform.) Le chargeur de topologie utilise ces informations lorsqu’il résout une topologie partielle.

Pour supprimer les entrées du Registre, appelez MFTUnregister.

Le code suivant indique comment inscrire une MFT. Cet exemple suppose que la MFT est un effet vidéo qui prend en charge les mêmes formats pour l’entrée et la sortie.

// CLSID of the MFT.
extern const GUID CLSID_MyVideoEffectMFT;

// DllRegisterServer: Creates the registry entries.
STDAPI DllRegisterServer()
{
    HRESULT hr = S_OK;

    // Array of media types.
    MFT_REGISTER_TYPE_INFO aMediaTypes[] =
    {
        {   MFMediaType_Video, MFVideoFormat_NV12 },
        {   MFMediaType_Video, MFVideoFormat_YUY2 },
        {   MFMediaType_Video, MFVideoFormat_UYVY },
    };

    // Size of the array.
    const DWORD cNumMediaTypes = ARRAY_SIZE(aMediaTypes);

    hr = MFTRegister(
        CLSID_MyVideoEffectMFT,     // CLSID.
        MFT_CATEGORY_VIDEO_EFFECT,  // Category.
        L"My Video Effect",         // Friendly name.
        0,                          // Reserved, must be zero.
        cNumMediaTypes,             // Number of input types.
        aMediaTypes,                // Input types.
        cNumMediaTypes,             // Number of output types.
        aMediaTypes,                // Output types.
        NULL                        // Attributes (optional).
        );

    if (SUCCEEDED(hr))
    {
        // Register the CLSID for CoCreateInstance (not shown).
    }
    return hr;
}

// DllUnregisterServer: Removes the registry entries.
STDAPI DllUnregisterServer()
{
    HRESULT hr = MFTUnregister(CLSID_MyVideoEffectMFT);

    // Unregister the CLSID for CoCreateInstance (not shown).

    return hr;
}

Champ des restrictions d’utilisation

Transformations Media Foundation