Регистрация и перечисление 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;
}

Поле ограничений использования

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