Bagikan melalui


Fungsi MFTEnumEx (mfapi.h)

Mendapatkan daftar transformasi Microsoft Media Foundation (MFTs) yang cocok dengan kriteria pencarian yang ditentukan. Fungsi ini memperluas fungsi MFTEnum .

Sintaks

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

Parameter

[in] guidCategory

GUID yang menentukan kategori MFTs untuk dijumlahkan. Untuk daftar kategori MFT, lihat MFT_CATEGORY.

[in] Flags

Bitwise OR dari nol atau lebih bendera dari enumerasi _MFT_ENUM_FLAG .

[in] pInputType

Penunjuk ke struktur MFT_REGISTER_TYPE_INFO yang menentukan jenis media input yang cocok.

Parameter ini bisa NULL. Jika NULL, semua jenis input cocok.

[in] pOutputType

Penunjuk ke struktur MFT_REGISTER_TYPE_INFO yang menentukan jenis media output yang cocok.

Parameter ini bisa NULL. Jika NULL, semua jenis output cocok.

[out] pppMFTActivate

Menerima array penunjuk antarmuka IMFActivate . Setiap penunjuk mewakili objek aktivasi untuk MFT yang cocok dengan kriteria pencarian. Fungsi mengalokasikan memori untuk array. Pemanggil harus melepaskan pointer dan memanggil fungsi CoTaskMemFree untuk membebaskan memori untuk array.

[out] pnumMFTActivate

Menerima jumlah elemen dalam array pppMFTActivate . Jika tidak ada MFT yang cocok dengan kriteria pencarian, parameter ini menerima nilai nol.

Menampilkan nilai

Jika fungsi ini berhasil, fungsi akan mengembalikan S_OK. Jika tidak, kode kesalahan HRESULT akan dikembalikan.

Keterangan

Parameter Bendera mengontrol MFT mana yang dijumlahkan, dan urutan pengembaliannya. Bendera untuk parameter ini termasuk dalam beberapa grup.

Kumpulan bendera pertama menentukan cara MFT memproses data.

Bendera Deskripsi
MFT_ENUM_FLAG_SYNCMFT MFT melakukan pemrosesan data sinkron dalam perangkat lunak. Ini adalah model pemrosesan MFT asli, dan kompatibel dengan Windows Vista.
MFT_ENUM_FLAG_ASYNCMFT MFT melakukan pemrosesan data asinkron dalam perangkat lunak. Model pemrosesan ini memerlukan Windows 7. Untuk informasi selengkapnya, lihat MFTs Asinkron.
MFT_ENUM_FLAG_HARDWARE MFT melakukan pemrosesan data berbasis perangkat keras, menggunakan driver AVStream atau MFT proksi berbasis GPU. MFT dalam kategori ini selalu memproses data secara asinkron. Untuk informasi selengkapnya, lihat MFTs Perangkat Keras.
 

Setiap MFT termasuk dalam salah satu kategori ini. Untuk menghitung kategori, atur bendera yang sesuai di parameter Bendera . Anda dapat menggabungkan bendera ini untuk menghitung lebih dari satu kategori. Jika tidak ada bendera ini yang ditentukan, kategori defaultnya adalah MFT sinkron (MFT_ENUM_FLAG_SYNCMFT).

Selanjutnya, bendera berikut mencakup MFT yang dikecualikan dari hasilnya. Secara default, bendera yang cocok dengan kriteria ini dikecualikan dari hasilnya. Gunakan bendera ini untuk menyertakannya.

Bendera Deskripsi
MFT_ENUM_FLAG_FIELDOFUSE Sertakan MFT yang harus dibuka kuncinya oleh aplikasi.
MFT_ENUM_FLAG_LOCALMFT Sertakan MFTs yang terdaftar dalam proses pemanggil melalui fungsi MFTRegisterLocal atau MFTRegisterLocalByCLSID .
MFT_ENUM_FLAG_TRANSCODE_ONLY Sertakan MFT yang dioptimalkan untuk transcoding daripada pemutaran.
 

Bendera terakhir digunakan untuk mengurutkan dan memfilter hasilnya:

Bendera Deskripsi
MFT_ENUM_FLAG_SORTANDFILTER Urutkan dan filter hasilnya.
 

Jika bendera MFT_ENUM_FLAG_SORTANDFILTER diatur, fungsi MFTEnumEx mengurutkan hasilnya sebagai berikut:

  • Lokal: Jika bendera MFT_ENUM_FLAG_LOCALMFT diatur, MFT lokal muncul terlebih dahulu dalam daftar. Untuk mendaftarkan MFT lokal, panggil fungsi MFTRegisterLocal atau MFTRegisterLocalByCLSID .
  • Merit: MFTs dengan nilai merit muncul di daftar berikutnya, dalam urutan nilai merit (tertinggi hingga terendah). Untuk informasi selengkapnya tentang manfaat, lihat MFT_CODEC_MERIT_Attribute.
  • Disukai: Jika MFT tercantum dalam daftar pilihan kontrol plug-in, MFT akan muncul di daftar berikutnya. Untuk informasi selengkapnya tentang kontrol plug-in, lihat IMFPluginControl.
  • Jika MFT muncul di daftar yang diblokir, MFT akan dikecualikan dari hasilnya. Untuk informasi selengkapnya tentang daftar yang diblokir, lihat IMFPluginControl::IsDisabled.
  • MFT lain yang cocok dengan kriteria pencarian muncul di akhir daftar, tidak diurai.
Jika Anda tidak mengatur bendera MFT_ENUM_FLAG_SORTANDFILTER , fungsi MFTEnumEx mengembalikan daftar yang tidak diurai.

Mengatur parameter Bendera ke nol setara dengan menggunakan nilai MFT_ENUM_FLAG_SYNCMFT MFT_ENUM_FLAG_LOCALMFT | | MFT_ENUM_FLAG_SORTANDFILTER.

Mengatur Bendera ke MFT_ENUM_FLAG_SYNCMFT setara dengan memanggil fungsi MFTEnum .

Jika tidak ada MFT yang cocok dengan kriteria pencarian, fungsi mengembalikan S_OK, kecuali beberapa kesalahan lain terjadi. Oleh karena itu, selalu periksa jumlah yang diterima dalam parameter pcMFTActivate sebelum Anda mendereferensikan penunjuk pppMFTActivate .

Catatan Tidak ada cara untuk menghitung hanya MFTs lokal dan tidak ada yang lain. Mengatur Bendera sama dengan MFT_ENUM_FLAG_LOCALMFT setara dengan menyertakan bendera MFT_ENUM_FLAG_SYNCMFT . Namun, jika Anda juga mengurutkan hasil dengan menentukan bendera MFT_ENUM_FLAG_SORTANDFILTER , MFT lokal muncul terlebih dahulu dalam daftar.
 

Membuat MFT

Jika setidaknya satu MFT cocok dengan kriteria pencarian, parameter pppMFTActivate menerima array penunjuk IMFActivate . Satu pointer dikembalikan untuk setiap MFT yang cocok. Setiap pointer mewakili objek aktivasi untuk MFT. Untuk informasi selengkapnya, lihat Objek Aktivasi.

Informasi tambahan tentang setiap MFT disimpan sebagai atribut pada objek aktivasi. Untuk daftar atribut yang mungkin, lihat Mengubah Atribut.

Untuk membuat instans MFT, panggil IMFActivate::ActivateObject.

Codec Perangkat Keras

Codec perangkat keras dikecualikan dari hasil enumerasi jika kunci registri berikut diatur ke nol:

Dekoder: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Media Foundation\HardwareMFT\EnableDecoders

Encoder: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Media Foundation\HardwareMFT\EnableEncoders

Prosesor video: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Media Foundation\HardwareMFT\EnableVideoProcessors

Kunci ini ditujukan untuk OEM, dan tidak boleh digunakan oleh aplikasi.

Untuk codec perangkat keras, parameter guidCategoryMFTEnumEx juga dapat menentukan salah satu kategori perangkat streaming kernel (KS) berikut:

  • KSCATEGORY_DATACOMPRESSOR
  • KSCATEGORY_DATADECOMPRESSOR
Codec perangkat keras juga harus terdaftar di bawah GUID MFT_CATEGORY , sehingga aplikasi umumnya harus menggunakan kategori tersebut alih-alih kategori perangkat KS.

Contoh

Contoh berikut mencari dekoder video atau audio. Dekode asinkron, perangkat keras, transkode, dan bidang penggunaan dikecualikan. Jika kecocokan ditemukan, kode akan membuat MFT pertama dalam daftar.

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

Contoh berikutnya mencari encoder video atau audio. Encoder asinkron, perangkat keras, transkode, dan bidang penggunaan dikecualikan.

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

Contoh berikutnya mencari dekoder video, dengan opsi untuk menyertakan dekoder asinkron, perangkat keras, atau transkode.

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

Persyaratan

   
Klien minimum yang didukung Windows 7 [aplikasi desktop | Aplikasi UWP]
Server minimum yang didukung Windows Server 2008 R2 [aplikasi desktop | Aplikasi UWP]
Target Platform Windows
Header mfapi.h
Pustaka Mfplat.lib
DLL Mfplat.dll

Lihat juga

Pembatasan Bidang Penggunaan

MFTRegister

Fungsi Media Foundation

Mendaftar dan Menghitung MFTs