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;
}
Tópicos relacionados