Поделиться через


Функция 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, соответствующие условиям поиска, отображаются в конце списка без сортировки.
Если флаг MFT_ENUM_FLAG_SORTANDFILTER не задан, функция MFTEnumEx возвращает несортированные списки.

Установка нулевого значения параметра 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_ENUM_FLAG_LOCALMFT , эквивалентна включению флага MFT_ENUM_FLAG_SYNCMFT . Однако если вы также отсортируете результаты, указав флаг MFT_ENUM_FLAG_SORTANDFILTER , сначала в списке появятся локальные MFT.
 

Создание 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_CATEGORY GUID, поэтому приложения, как правило, должны использовать эти категории вместо категорий устройств KS.

Примеры

В следующем примере выполняется поиск видео- или звукового декодера. Асинхронные декодеры, аппаратные декодеры, декодеры перекодировки и области использования исключаются. Если совпадение найдено, код создает первый 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

См. также раздел

Ограничения области использования

MFTRegister

Функции Media Foundation

Регистрация и перечисление MFT