Регистрация и перечисление MFT
В этом разделе описывается перечисление преобразований Media Foundation и регистрация пользовательского MFT для обнаружения приложений.
Перечисление MFT
Чтобы обнаружить MFT, зарегистрированные в системе, приложение может вызвать функцию MFTEnumEx.
Примечание.
Эта функция требуется для Windows 7. До Windows 7 приложения должны использовать вместо этого функцию MFTEnum.
Эта функция принимает следующие сведения в качестве входных данных:
- Категория MFT для перечисления, например декодировщик видео или декодировщик звука.
- Формат входных или выходных данных для сопоставления.
- Флаги, указывающие дополнительные условия поиска.
Функция возвращает массив указателей IMFActivate , каждый из которых представляет MFT, соответствующий критериям перечисления.
Например, следующий код перечисляет декодеры видео в 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);
По умолчанию некоторые типы MFT исключаются из перечисления, включая асинхронные MFTs, аппаратные MFTs и MFT с ограничениями на использование полей. Они исключены из-за того, что все они требуют специальной обработки какого-либо вида. Используйте параметр Flags mFTEnumEx, чтобы изменить значение по умолчанию. Например, чтобы включить аппаратные MFT в результаты перечисления, задайте флаг 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
);
Регистрация MFT
При регистрации преобразования Media Foundation (MFT) в реестр записываются два типа информации:
- CLSID MFT, чтобы клиенты могли вызывать CoCreateInstance или CoGetClassObject для создания экземпляра MFT. Эта запись реестра соответствует стандартному формату для фабрик классов COM. Дополнительные сведения см. в документации по пакету SDK для Windows для объектной модели компонентов (COM).
- Сведения, позволяющие приложению перечислять MFT по функциональной категории.
Чтобы создать записи перечисления MFT в реестре, вызовите функцию MFTRegister . Вы можете включить следующие сведения о MFT:
- Категория MFT, например декодировщик видео или кодировщик видео. Список категорий см. в MFT_CATEGORY.
- Список форматов входных и выходных данных, поддерживаемых MFT. Каждый формат определяется основным типом и подтипом. (Чтобы получить более подробные сведения о формате, клиент должен создать MFT и вызвать Методы МВФTransform .) Загрузчик топологии использует эти сведения при разрешении частичной топологии.
Чтобы удалить записи из реестра, вызовите MFTUnregister.
В следующем коде показано, как зарегистрировать MFT. В этом примере предполагается, что MFT — это эффект видео, который поддерживает одинаковые форматы для входных и выходных данных.
// 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;
}
См. также