Share via


MFT 등록 및 열거

이 섹션에서는 Media Foundation 변환을 열거하는 방법과 애플리케이션에서 검색할 수 있도록 사용자 지정 MFT를 등록하는 방법을 설명합니다.

MFT 열거

시스템에 등록된 MFT를 검색하기 위해 애플리케이션은 MFTEnumEx 함수를 호출할 수 있습니다.

참고 항목

이 함수는 Windows 7에 필요합니다. Windows 7 이전에는 애플리케이션에서 MFTEnum 함수를 대신 사용해야 합니다.

 

이 함수는 다음 정보를 입력으로 사용합니다.

  • 비디오 디코더 또는 오디오 디코더와 같이 열거할 MFT의 범주입니다.
  • 일치시킬 입력 또는 출력 형식입니다.
  • 추가 검색 조건을 지정하는 플래그입니다.

이 함수는 각각 열거형 조건과 일치하는 MFT를 나타내는 IMFActivate 포인터의 배열을 반환합니다.

예를 들어 다음 코드는 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, 하드웨어 MFT 및 사용 필드 제한이 있는 MFT를 포함하여 일부 유형의 MFT는 열거형에서 제외됩니다. 이들은 모두 어떤 종류의 특별한 처리가 필요하기 때문에 제외됩니다. MFTEnumExFlags 매개 변수를 사용하여 기본값을 변경합니다. 예를 들어 열거형 결과에 하드웨어 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 등록

MFT(Media Foundation 변환)를 등록하면 두 가지 유형의 정보가 레지스트리에 기록됩니다.

  • 클라이언트가 CoCreateInstance 또는 CoGetClassObject를 호출하여 MFT 인스턴스를 만들 수 있도록 MFT의 CLSID입니다. 이 레지스트리 항목은 COM 클래스 팩터리의 표준 형식을 따릅니다. 자세한 내용은 COM(구성 요소 개체 모델)에 대한 Windows SDK 설명서를 참조하세요.
  • 애플리케이션이 기능 범주별로 MFT를 열거할 수 있도록 하는 정보입니다.

레지스트리에서 MFT 열거형 항목을 만들려면 MFTRegister 함수를 호출합니다. MFT에 대한 다음 정보를 포함할 수 있습니다.

  • 비디오 디코더 또는 비디오 인코더와 같은 MFT의 범주입니다. 범주 목록은 MFT_CATEGORY 참조하세요.
  • MFT에서 지원하는 입력 및 출력 형식 목록입니다. 각 형식은 주 형식 및 하위 형식으로 정의됩니다. (자세한 형식 정보를 얻으려면 클라이언트가 MFT를 만들고 호출 해야 합니다.IMFTransform 메서드.) 토폴로지 로더는 부분 토폴로지 해결 시 이 정보를 사용합니다.

레지스트리에서 항목을 제거하려면 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 변환