Bagikan melalui


Mendaftar dan Menghitung MFTs

Bagian ini menjelaskan cara menghitung transformasi Media Foundation, dan cara mendaftarkan MFT kustom sehingga aplikasi dapat menemukannya.

Menghitung MFTs

Untuk menemukan MFTs yang terdaftar di sistem, aplikasi dapat memanggil fungsi MFTEnumEx.

Catatan

Fungsi ini memerlukan Windows 7. Sebelum Windows 7, aplikasi harus menggunakan fungsi MFTEnum sebagai gantinya.

 

Fungsi ini mengambil informasi berikut sebagai input:

  • Kategori MFT untuk dijumlahkan, seperti dekoder video atau dekoder audio.
  • Format input atau output yang cocok.
  • Bendera yang menentukan kondisi pencarian tambahan.

Fungsi mengembalikan array penunjuk IMFActivate , yang masing-masing mewakili MFT yang cocok dengan kriteria enumerasi.

Misalnya, kode berikut menghitung dekode Windows Media Video:

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

Secara default, beberapa jenis MFT dikecualikan dari enumerasi, termasuk MFT asinkron, MFT perangkat keras, dan MFTs dengan pembatasan bidang penggunaan. Ini dikecualikan karena semuanya membutuhkan penanganan khusus. Gunakan parameter Bendera MFTEnumEx untuk mengubah default. Misalnya, untuk menyertakan MFT perangkat keras dalam hasil enumerasi, atur bendera 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
    );

Mendaftarkan MFTs

Ketika Anda mendaftarkan transformasi Media Foundation (MFT), dua jenis informasi ditulis ke registri:

  • CLSID MFT, sehingga klien dapat memanggil CoCreateInstance atau CoGetClassObject untuk membuat instans MFT. Entri registri ini mengikuti format standar untuk pabrik kelas COM. Untuk informasi selengkapnya, lihat dokumentasi Windows SDK untuk Model Objek Komponen (COM).
  • Informasi yang memungkinkan aplikasi menghitung MFTs berdasarkan kategori fungsional.

Untuk membuat entri enumerasi MFT di registri, panggil fungsi MFTRegister. Anda dapat menyertakan informasi berikut tentang MFT:

  • Kategori MFT, seperti dekoder video atau encoder video. Untuk daftar kategori, lihat MFT_CATEGORY.
  • Daftar format input dan output yang didukung MFT. Setiap format didefinisikan oleh jenis utama dan subjenis. (Untuk mendapatkan informasi format yang lebih rinci, klien harus membuat MFT dan panggilan Metode IMFTransform .) Pemuat topologi menggunakan informasi ini ketika menyelesaikan topologi parsial.

Untuk menghapus entri dari registri, panggil MFTUnregister.

Kode berikut menunjukkan cara mendaftarkan MFT. Contoh ini mengasumsikan bahwa MFT adalah efek video yang mendukung format yang sama untuk input dan output.

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

Pembatasan Bidang Penggunaan

Transformasi Media Foundation