Функция MFTEnumEx (mfapi.h)
Возвращает список преобразований Microsoft Media Foundation (MFT), соответствующих указанным условиям поиска. Эта функция расширяет функцию MFTEnum .
Синтаксис
HRESULT MFTEnumEx(
[in] GUID guidCategory,
[in] UINT32 Flags,
[in] const MFT_REGISTER_TYPE_INFO *pInputType,
[in] const MFT_REGISTER_TYPE_INFO *pOutputType,
[out] IMFActivate ***pppMFTActivate,
[out] UINT32 *pnumMFTActivate
);
Параметры
[in] guidCategory
GUID, указывающий категорию перечисляемых MFT. Список категорий MFT см. в разделе MFT_CATEGORY.
[in] Flags
Побитовое ИЛИ , равное нулю или нескольким флагам из перечисления _MFT_ENUM_FLAG .
[in] pInputType
Указатель на структуру MFT_REGISTER_TYPE_INFO , указывающую тип входного носителя для сопоставления.
Этот параметр может принимать значение NULL. Если значение РАВНО NULL, все типы входных данных совпадают.
[in] pOutputType
Указатель на структуру MFT_REGISTER_TYPE_INFO , указывающую тип выходного носителя для сопоставления.
Этот параметр может принимать значение NULL. При значении NULL все типы выходных данных совпадают.
[out] pppMFTActivate
Получает массив указателей интерфейса IMFActivate . Каждый указатель представляет объект активации для MFT, соответствующий условиям поиска. Функция выделяет память для массива. Вызывающий объект должен освободить указатели и вызвать функцию CoTaskMemFree , чтобы освободить память для массива.
[out] pnumMFTActivate
Получает количество элементов в массиве pppMFTActivate . Если никакие MFT не соответствуют условиям поиска, этот параметр получает нулевое значение.
Возвращаемое значение
Если эта функция завершается успешно, она возвращает S_OK. В противном случае возвращается код ошибки HRESULT .
Комментарии
Параметр Flags определяет перечисление MFT и порядок их возврата. Флаги для этого параметра делятся на несколько групп.
Первый набор флагов указывает, как MFT обрабатывает данные.
Flag | Описание |
---|---|
MFT_ENUM_FLAG_SYNCMFT | MFT выполняет синхронную обработку данных в программном обеспечении. Это исходная модель обработки MFT, совместимая с Windows Vista. |
MFT_ENUM_FLAG_ASYNCMFT | MFT выполняет асинхронную обработку данных в программном обеспечении. Для этой модели обработки требуется Windows 7. Дополнительные сведения см. в разделе Асинхронные MFT. |
MFT_ENUM_FLAG_HARDWARE | MFT выполняет аппаратную обработку данных, используя драйвер AVStream или прокси-сервер на основе GPU MFT. MFT в этой категории всегда обрабатывают данные асинхронно. Дополнительные сведения см. в разделе Аппаратные MFT. |
Каждый MFT относится именно к одной из этих категорий. Чтобы перечислить категорию, установите соответствующий флаг в параметре Flags . Эти флаги можно объединить для перечисления нескольких категорий. Если ни один из этих флагов не указан, по умолчанию используется категория синхронных MFT (MFT_ENUM_FLAG_SYNCMFT).
Далее следующие флаги включают MFT, которые в противном случае исключены из результатов. По умолчанию флаги, соответствующие этим критериям, исключаются из результатов. Используйте все эти флаги, чтобы включить их.
Flag | Описание |
---|---|
MFT_ENUM_FLAG_FIELDOFUSE | Включите MFT, которые должны быть разблокированы приложением. |
MFT_ENUM_FLAG_LOCALMFT | Включите MFT, зарегистрированные в процессе вызывающего объекта с помощью функции MFTRegisterLocal или MFTRegisterLocalByCLSID . |
MFT_ENUM_FLAG_TRANSCODE_ONLY | Включите MFT, оптимизированные для перекодирования, а не для воспроизведения. |
Последний флаг используется для сортировки и фильтрации результатов:
Flag | Описание |
---|---|
MFT_ENUM_FLAG_SORTANDFILTER | Отсортируйте и отфильтруйте результаты. |
Если установлен флаг MFT_ENUM_FLAG_SORTANDFILTER , функция MFTEnumEx сортирует результаты следующим образом:
- Local: если установлен флаг MFT_ENUM_FLAG_LOCALMFT , сначала в списке отображаются локальные MFT. Чтобы зарегистрировать локальный MFT, вызовите функцию MFTRegisterLocal или MFTRegisterLocalByCLSID .
- Заслуга: MFT со значением заслуги появляются в списке в порядке значения заслуги (от самого высокого до самого низкого). Дополнительные сведения о заслугах см. в разделе MFT_CODEC_MERIT_Attribute.
- Предпочтительно: если MFT указан в списке предпочтительных элементов управления подключаемым модулем, он отображается далее в списке. Дополнительные сведения о подключаемом элементе управления см. в разделе IMFPluginControl.
- Если MFT отображается в списке заблокированных, он исключается из результатов. Дополнительные сведения о списке заблокированных см. в разделе IMFPluginControl::IsDisabled.
- Все остальные MFT, соответствующие условиям поиска, отображаются в конце списка без сортировки.
Установка нулевого значения параметра Flags эквивалентна использованию значения MFT_ENUM_FLAG_SYNCMFT | MFT_ENUM_FLAG_LOCALMFT | MFT_ENUM_FLAG_SORTANDFILTER.
Задание флагамMFT_ENUM_FLAG_SYNCMFT эквивалентно вызову функции MFTEnum .
Если никакие MFT не соответствуют условиям поиска, функция возвращает S_OK, если не возникает какая-то другая ошибка. Поэтому перед разыменовыванием указателя pppMFTActivate всегда проверка число, полученное в параметре pcMFTActivate.
Создание MFT
Если хотя бы один MFT соответствует условиям поиска, параметр pppMFTActivate получает массив указателей IMFActivate . Для каждого соответствующего MFT возвращается один указатель. Каждый указатель представляет объект активации для MFT. Дополнительные сведения см. в разделе Объекты активации.Дополнительные сведения о каждом MFT хранятся в виде атрибутов в объектах активации. Список возможных атрибутов см. в разделе Преобразование атрибутов.
Чтобы создать экземпляр MFT, вызовите IMFActivate::ActivateObject.
Аппаратные кодеки
Аппаратные кодеки исключаются из результатов перечисления, если для следующих разделов реестра задано нулевое значение:Декодеры: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Media Foundation\HardwareMFT\EnableDecoders
Кодировщики: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Media Foundation\HardwareMFT\EnableEncoders
Видеопроцессоры: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Media Foundation\HardwareMFT\EnableVideoProcessors
Эти ключи предназначены для изготовителей оборудования и не должны использоваться приложениями.
Для аппаратных кодеков параметр guidCategoryMFTEnumEx также может указывать одну из следующих категорий устройств потоковой передачи ядра (KS):
- KSCATEGORY_DATACOMPRESSOR
- KSCATEGORY_DATADECOMPRESSOR
Примеры
В следующем примере выполняется поиск видео- или звукового декодера. Асинхронные декодеры, аппаратные декодеры, декодеры перекодировки и области использования исключаются. Если совпадение найдено, код создает первый MFT в списке.
HRESULT FindDecoderEx(
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;
IMFActivate **ppActivate = NULL;
MFT_REGISTER_TYPE_INFO info = { 0 };
info.guidMajorType = bAudio ? MFMediaType_Audio : MFMediaType_Video;
info.guidSubtype = subtype;
hr = MFTEnumEx(
bAudio ? MFT_CATEGORY_AUDIO_DECODER : MFT_CATEGORY_VIDEO_DECODER,
MFT_ENUM_FLAG_SYNCMFT | MFT_ENUM_FLAG_LOCALMFT | MFT_ENUM_FLAG_SORTANDFILTER,
&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(ppDecoder));
}
for (UINT32 i = 0; i < count; i++)
{
ppActivate[i]->Release();
}
CoTaskMemFree(ppActivate);
return hr;
}
В следующем примере выполняется поиск видео или аудиокодировщика. Асинхронные, аппаратные кодировщики, кодировщики и кодировщики полей использования исключаются.
HRESULT FindEncoderEx(
const GUID& subtype, // Subtype
BOOL bAudio, // TRUE for audio, FALSE for video
IMFTransform **ppEncoder // Receives a pointer to the decoder.
)
{
HRESULT hr = S_OK;
UINT32 count = 0;
IMFActivate **ppActivate = NULL;
MFT_REGISTER_TYPE_INFO info = { 0 };
info.guidMajorType = bAudio ? MFMediaType_Audio : MFMediaType_Video;
info.guidSubtype = subtype;
hr = MFTEnumEx(
bAudio ? MFT_CATEGORY_AUDIO_ENCODER : MFT_CATEGORY_VIDEO_ENCODER,
MFT_ENUM_FLAG_SYNCMFT | MFT_ENUM_FLAG_LOCALMFT | MFT_ENUM_FLAG_SORTANDFILTER,
NULL, // Input type
&info, // Output type
&ppActivate,
&count
);
if (SUCCEEDED(hr) && count == 0)
{
hr = MF_E_TOPO_CODEC_NOT_FOUND;
}
// Create the first encoder in the list.
if (SUCCEEDED(hr))
{
hr = ppActivate[0]->ActivateObject(IID_PPV_ARGS(ppEncoder));
}
for (UINT32 i = 0; i < count; i++)
{
ppActivate[i]->Release();
}
CoTaskMemFree(ppActivate);
return hr;
}
В следующем примере выполняется поиск декодера видео с параметрами для включения асинхронных, аппаратных декодеров или декодирования.
HRESULT FindVideoDecoder(
const GUID& subtype,
BOOL bAllowAsync,
BOOL bAllowHardware,
BOOL bAllowTranscode,
IMFTransform **ppDecoder
)
{
HRESULT hr = S_OK;
UINT32 count = 0;
IMFActivate **ppActivate = NULL;
MFT_REGISTER_TYPE_INFO info = { MFMediaType_Video, subtype };
UINT32 unFlags = MFT_ENUM_FLAG_SYNCMFT | MFT_ENUM_FLAG_LOCALMFT |
MFT_ENUM_FLAG_SORTANDFILTER;
if (bAllowAsync)
{
unFlags |= MFT_ENUM_FLAG_ASYNCMFT;
}
if (bAllowHardware)
{
unFlags |= MFT_ENUM_FLAG_HARDWARE;
}
if (bAllowTranscode)
{
unFlags |= MFT_ENUM_FLAG_TRANSCODE_ONLY;
}
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(ppDecoder));
}
for (UINT32 i = 0; i < count; i++)
{
ppActivate[i]->Release();
}
CoTaskMemFree(ppActivate);
return hr;
}
Требования
Минимальная версия клиента | Windows 7 [классические приложения | Приложения UWP] |
Минимальная версия сервера | Windows Server 2008 R2 [классические приложения | Приложения UWP] |
Целевая платформа | Windows |
Header | mfapi.h |
Библиотека | Mfplat.lib |
DLL | Mfplat.dll |