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.
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 .
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
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 |