Registrar e enumerar MFTs

Esta seção descreve como enumerar transformações do Media Foundation e como registrar um MFT personalizado para que os aplicativos possam descobri-lo.

Enumerar MFTs

Para descobrir MFTs registrados no sistema, um aplicativo pode chamar a função MFTEnumEx.

Observação

Essa função requer o Windows 7. Antes do Windows 7, os aplicativos devem usar a função MFTEnum.

 

Essa função usa as seguintes informações como entrada:

  • A categoria de MFT a ser enumerada, como decodificador de vídeo ou decodificador de áudio.
  • Um formato de entrada ou saída a ser correspondido.
  • Sinalizadores que especificam condições de pesquisa adicionais.

A função retorna uma matriz de ponteiros IMFActivate, cada um dos quais representa um MFT que corresponde aos critérios de enumeração.

Por exemplo, o código a seguir enumera decodificadores do 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);

Por padrão, alguns tipos de MFT são excluídas da enumeração, incluindo MFTs assíncronas, MFTs de hardware e MFTs com restrições de campo de uso. Elas são excluídas porque todas elas exigem algum tipo de tratamento especial. Use o parâmetro Flags de MFTEnumEx para alterar o padrão. Por exemplo, para incluir MFTs de hardware nos resultados da enumeração, defina o sinalizador 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
    );

Registrar MFTs

Quando você registra uma Transformação do Media Foundation (MFT), dois tipos de informações são gravados no registro:

  • O CLSID do MFT, para que os clientes possam chamar CoCreateInstance ou CoGetClassObject para criar uma instância do MFT. Essa entrada do Registro segue o formato padrão para fábricas de classes COM. Para obter mais informações, confira a documentação do SDK do Windows para o Component Object Model (COM).
  • Informações que permitem a um aplicativo enumerar MFTs por categoria funcional.

Para criar as entradas de enumeração MFT no registro, chame a função MFTRegister. Você pode incluir as seguintes informações sobre a MFT:

  • A categoria da MFT, como decodificador de vídeo ou codificador de vídeo. Para obter uma lista de categorias, confira MFT_CATEGORY.
  • Uma lista de formatos de entrada e saída aos quais a MFT dá suporte. Cada formato é definido por um tipo principal e um subtipo. (Para obter informações de formato mais detalhadas, o cliente deve criar o MFT e chamar os métodos IMFTransform.) O carregador de topologia usa essas informações quando resolve uma topologia parcial.

Para remover as entradas do registro, chame MFTUnregister.

O código a seguir mostra como registrar uma MFT. Este exemplo pressupõe que a MFT é um efeito de vídeo que dá suporte aos mesmos formatos para entrada e saída.

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

Restrições de campo de uso

Transformações do Media Foundation