Функция MFTEnum (mfapi.h)

Перечисляет преобразования Media Foundation (MFT) в реестре.

Начиная с Windows 7 приложения должны использовать функцию MFTEnumEx .

Синтаксис

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
);

Параметры

[in] guidCategory

GUID, указывающий категорию перечисляемых MFT. Список категорий MFT см. в разделе MFT_CATEGORY.

[in] Flags

Зарезервировано. Должен равняться нулю.

[in] pInputType

Указатель на структуру MFT_REGISTER_TYPE_INFO , указывающую тип входного носителя для сопоставления.

Этот параметр может принимать значение NULL. При значении NULL все типы входных данных совпадают.

[in] pOutputType

Указатель на структуру MFT_REGISTER_TYPE_INFO , указывающую тип выходного носителя для сопоставления.

Этот параметр может принимать значение NULL. При значении NULL все типы выходных данных совпадают.

[in] pAttributes

Зарезервировано. Задайте значение NULL.

Примечание Windows Vista и Windows Server 2008: этот параметр может указывать указатель на интерфейс IMFAttributes хранилища атрибутов. Функция MFTEnum сопоставляет атрибуты в этом объекте с атрибутами, хранящимися в реестре. (Атрибуты реестра указываются в параметре pAttributes функции MFTRegister .) В результатах перечисления возвращаются только MFT с соответствующими атрибутами.
 
Примечание Windows 7 и более поздних версий: этот параметр игнорируется.
 

[out] ppclsidMFT

Получает указатель на массив идентификаторов CLSID. Чтобы создать MFT из этого списка, вызовите CoCreateInstance с одним из идентификаторов CLSID. Чтобы получить сведения о конкретном MFT из clSID, вызовите MFTGetInfo. Вызывающий объект должен освободить память для массива, вызвав CoTaskMemFree.

[out] pcMFTs

Получает количество элементов в массиве ppclsidMFT . Значение может быть равно нулю.

Возвращаемое значение

Если эта функция выполняется успешно, она возвращает S_OK. В противном случае возвращается код ошибки HRESULT .

Комментарии

Эта функция возвращает список всех MFT в указанной категории, которые соответствуют условиям поиска, заданным параметрами pInputType, pOutputType и pAttributes . Любой из этих параметров может иметь значение NULL.

Если никакие MFT не соответствуют критериям, метод выполняется успешно, но возвращает нулевое значение в pcMFT.

Примеры

Чтобы найти декодер, задайте для guidCategoryзначение MFT_CATEGORY_AUDIO_DECODER или MFT_CATEGORY_VIDEO_DECODER и укажите формат кодирования в pInputType. В этом случае pOutputType обычно присваивает значение NULL .

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;
}

Чтобы найти кодировщик, задайте для guidCategoryзначение MFT_CATEGORY_AUDIO_ENCODER или MFT_CATEGORY_VIDEO_ENCODER и укажите формат кодирования в pOutputType. В этом случае pInputType обычно присваивает значение NULL .

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;
}

Требования

   
Минимальная версия клиента Windows Vista [только классические приложения]
Минимальная версия сервера Windows Server 2008 [только классические приложения]
Целевая платформа Windows
Header mfapi.h
Библиотека Mfplat.lib
DLL Mfplat.dll

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

Добавление декодера в топологию

MFTEnumEx

MFTRegister

Функции Media Foundation

Преобразования Media Foundation

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