Função MFTEnum (mfapi.h)

Enumera MFTs (transformações do Media Foundation) no registro.

A partir do Windows 7, os aplicativos devem usar a função MFTEnumEx .

Sintaxe

HRESULT MFTEnum(
  [in]  GUID                   guidCategory,
  [in]  UINT32                 Flags,
  [in]  MFT_REGISTER_TYPE_INFO *pInputType,
  [in]  MFT_REGISTER_TYPE_INFO *pOutputType,
  [in]  IMFAttributes          *pAttributes,
  [out] CLSID                  **ppclsidMFT,
  [out] UINT32                 *pcMFTs
);

Parâmetros

[in] guidCategory

GUID que especifica a categoria de MFTs a enumerar. Para obter uma lista de categorias de MFT, consulte MFT_CATEGORY.

[in] Flags

Reservado. Deve ser zero.

[in] pInputType

Ponteiro para uma estrutura MFT_REGISTER_TYPE_INFO que especifica um tipo de mídia de entrada a ser correspondido.

Este parâmetro pode ser NULL. Se FOR NULL, todos os tipos de entrada serão correspondidos.

[in] pOutputType

Ponteiro para uma estrutura MFT_REGISTER_TYPE_INFO que especifica um tipo de mídia de saída a ser correspondido.

Este parâmetro pode ser NULL. Se FOR NULL, todos os tipos de saída serão correspondidos.

[in] pAttributes

Reservado. Defina como NULL.

Nota Windows Vista e Windows Server 2008: esse parâmetro pode especificar um ponteiro para a interface IMFAttributes de um repositório de atributos. A função MFTEnum corresponde aos atributos nesse objeto em relação aos atributos armazenados no registro. (Os atributos do Registro são especificados no parâmetro pAttributes da função MFTRegister .) Somente MFTs com atributos correspondentes são retornados nos resultados da enumeração.
 
Nota Windows 7 e posterior: esse parâmetro é ignorado.
 

[out] ppclsidMFT

Recebe um ponteiro para uma matriz de CLSIDs. Para criar um MFT nessa lista, chame CoCreateInstance com um dos CLSIDs. Para obter informações sobre um determinado MFT de seu CLSID, chame MFTGetInfo. O chamador deve liberar a memória para a matriz chamando CoTaskMemFree.

[out] pcMFTs

Recebe o número de elementos na matriz ppclsidMFT . O valor pode ser zero.

Valor retornado

Se essa função for bem-sucedida, ela retornará S_OK. Caso contrário, ele retornará um código de erro HRESULT.

Comentários

Essa função retorna uma lista de todos os MFTs na categoria especificada que correspondem aos critérios de pesquisa dados pelos parâmetros pInputType, pOutputType e pAttributes . Qualquer um desses parâmetros pode ser NULL.

Se nenhum MFTs corresponder aos critérios, o método terá êxito, mas retornará o valor zero em pcMFTs.

Exemplos

Para localizar um decodificador, defina guidCategory como MFT_CATEGORY_AUDIO_DECODER ou MFT_CATEGORY_VIDEO_DECODER e especifique o formato de codificação em pInputType. Normalmente, você definiria pOutputType como NULL nesse caso.

HRESULT FindDecoder(
    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;

    CLSID *ppCLSIDs = NULL;

    MFT_REGISTER_TYPE_INFO info = { 0 };

    info.guidMajorType = bAudio ? MFMediaType_Audio : MFMediaType_Video;
    info.guidSubtype = subtype;

    hr = MFTEnum(   
        bAudio ? MFT_CATEGORY_AUDIO_DECODER : MFT_CATEGORY_VIDEO_DECODER,
        0,      // Reserved
        &info,  // Input type
        NULL,   // Output type
        NULL,   // Reserved
        &ppCLSIDs,
        &count
        );

    if (SUCCEEDED(hr) && count == 0)
    {
        hr = MF_E_TOPO_CODEC_NOT_FOUND;
    }

    // Create the first decoder in the list.

    if (SUCCEEDED(hr))
    {
        hr = CoCreateInstance(ppCLSIDs[0], NULL,
            CLSCTX_INPROC_SERVER, IID_PPV_ARGS(ppDecoder));
    }

    CoTaskMemFree(ppCLSIDs);
    return hr;
}

Para localizar um codificador, defina guidCategory como MFT_CATEGORY_AUDIO_ENCODER ou MFT_CATEGORY_VIDEO_ENCODER e especifique o formato de codificação em pOutputType. Normalmente, você definiria pInputType como NULL nesse caso.

HRESULT FindEncoder(
    const GUID& subtype, 
    BOOL bAudio, 
    IMFTransform **ppEncoder
    )
{
    HRESULT hr = S_OK;
    UINT32 count = 0;

    CLSID *ppCLSIDs = NULL;

    MFT_REGISTER_TYPE_INFO info = { 0 };

    info.guidMajorType = bAudio ? MFMediaType_Audio : MFMediaType_Video;
    info.guidSubtype = subtype;

    hr = MFTEnum(   
        bAudio ? MFT_CATEGORY_AUDIO_ENCODER : MFT_CATEGORY_VIDEO_ENCODER,
        0,          // Reserved
        NULL,       // Input type
        &info,      // Output type
        NULL,       // Reserved
        &ppCLSIDs,
        &count
        );

    if (SUCCEEDED(hr) && count == 0)
    {
        hr = MF_E_TOPO_CODEC_NOT_FOUND;
    }

    // Create the first encoder in the list.

    if (SUCCEEDED(hr))
    {
        hr = CoCreateInstance(ppCLSIDs[0], NULL,
            CLSCTX_INPROC_SERVER, IID_PPV_ARGS(ppEncoder));
    }

    CoTaskMemFree(ppCLSIDs);
    return hr;
}

Requisitos

   
Cliente mínimo com suporte Windows Vista [somente aplicativos da área de trabalho]
Servidor mínimo com suporte Windows Server 2008 [somente aplicativos da área de trabalho]
Plataforma de Destino Windows
Cabeçalho mfapi.h
Biblioteca Mfplat.lib
DLL Mfplat.dll

Confira também

Adicionando um decodificador a uma topologia

MFTEnumEx

MFTRegister

Funções do Media Foundation

Transformações do Media Foundation

Registrando e enumerando MFTs