Compartir a través de


Registro y enumeración de MFT

En esta sección se describe cómo enumerar las transformaciones de Media Foundation y cómo registrar una MFT personalizada para que las aplicaciones puedan detectarla.

Enumeración de MFT

Para detectar las MFT registradas en el sistema, una aplicación puede llamar a la función MFTEnumEx.

Nota:

Esta función necesita Windows 7. Antes de Windows 7, las aplicaciones debían usar la función MFTEnum en su lugar.

 

Esta función toma la siguiente información como entrada:

  • Categoría de MFT que se va a enumerar, como descodificador de vídeo o descodificador de audio.
  • Formato de entrada o salida que debe coincidir.
  • Marcas que especifican condiciones de búsqueda adicionales.

La función devuelve una matriz de punteros IMFActivate, y cada uno representa una MFT que coincide con los criterios de enumeración.

Por ejemplo, el código siguiente enumera los descodificadores de Windows Media Video:

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);

De manera predeterminada, algunos tipos de MFT se excluyen de la enumeración, incluidas las MFT asincrónicas, las de hardware y las que tienen restricciones de campo de uso. Se excluyen porque todas necesitan algún tipo de control especial. Use el parámetro Flags de MFTEnumEx para cambiar el valor predeterminado. Por ejemplo, para incluir MFT de hardware en los resultados de la enumeración, establezca la marca 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
    );

Registro de MFT

Al registrar una transformación de Media Foundation (MFT), se escriben dos tipos de información en el Registro:

  • CLSID de la MFT, de modo que los clientes puedan llamar a CoCreateInstance o CoGetClassObject para crear una instancia de la MFT. Esta entrada del Registro sigue el formato estándar para los generadores de clases COM. Para más información, vea la documentación de Windows SDK para el Modelo de objetos componentes (COM).
  • Información que permite a una aplicación enumerar las MFT por categoría funcional.

Para crear las entradas de enumeración de MFT en el Registro, llame a la función MFTRegister. Puede incluir la información siguiente sobre la MFT:

  • Categoría de la MFT, como descodificador de vídeo o codificador de vídeo. Para obtener una lista de categorías, vea MFT_CATEGORY.
  • Lista de formatos de entrada y salida que admite la MFT. Cada formato se define mediante un tipo principal y un subtipo. (Para obtener información de formato más detallada, el cliente debe crear la MFT y llamar a métodos IMFTransform). El cargador de topología usa esta información cuando resuelve una topología parcial.

Para quitar las entradas del Registro, llame a MFTUnregister.

En el código siguiente se muestra cómo registrar una MFT. En este ejemplo se supone que la MFT es un efecto de vídeo que admite los mismos formatos para la entrada y la salida.

// 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;
}

Restricciones de campo de uso

Transformaciones de Media Foundation