Fungsi MFTEnum2 (mfapi.h)
Mendapatkan daftar transformasi Microsoft Media Foundation (MFTs) yang cocok dengan kriteria pencarian tertentu. Fungsi ini memperluas fungsi MFTEnumEx untuk memungkinkan aplikasi eksternal dan komponen internal menemukan MFT perangkat keras yang sesuai dengan adaptor video tertentu.
Sintaks
HRESULT MFTEnum2(
[in] GUID guidCategory,
[in] UINT32 Flags,
[in] const MFT_REGISTER_TYPE_INFO *pInputType,
[in] const MFT_REGISTER_TYPE_INFO *pOutputType,
[in, optional] IMFAttributes *pAttributes,
[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 ATAU 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 dicocokkan.
[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 dicocokkan.
[in, optional] pAttributes
Penunjuk ke antarmuka IMFAttributes yang memungkinkan akses ke penyimpanan atribut standar. Untuk menentukan adaptor perangkat keras tertentu yang MFTs-nya dikueri, atur atribut MFT_ENUM_ADAPTER_LUID ke LUID adaptor. Jika Anda melakukan ini, Anda juga harus menentukan bendera MFT_ENUM_FLAG_HARDWARE atau E_INVALIDARG dikembalikan.
[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.
Nilai kembali
Jika metode berhasil, metode akan mengembalikan S_OK. Jika gagal, kemungkinan kode pengembalian menyertakan, tetapi tidak terbatas pada, nilai yang diperlihatkan dalam tabel berikut.
Menampilkan kode | Deskripsi |
---|---|
|
IMFAttributes yang berisi atribut MFT_ENUM_ADAPTER_LUID disediakan dalam parameter pAttributes dan bendera MFT_ENUM_FLAG_HARDWARE tidak ditentukan. |
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. MFTs dalam kategori ini selalu memproses data secara asinkron. Untuk informasi selengkapnya, lihat MFTs Perangkat Keras.
Catatan Jika IMFAttributes yang berisi atribut MFT_ENUM_ADAPTER_LUID disediakan dalam parameter pAttributes , bendera MFT_ENUM_FLAG_HARDWARE harus diatur atau E_INVALIDARG akan dikembalikan.
|
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 MFTs sinkron (MFT_ENUM_FLAG_SYNCMFT).
Selanjutnya, bendera berikut menyertakan 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 | Mengurutkan dan memfilter hasilnya. |
Jika bendera MFT_ENUM_FLAG_SORTANDFILTER diatur, fungsi MFTEnum2 mengurutkan hasilnya sebagai berikut:
- Lokal: Jika bendera MFT_ENUM_FLAG_LOCALMFT diatur, MFTs 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 berikutnya dalam daftar. 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 MFTs 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 penunjuk 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 guidCategoryMFTEnum2 juga dapat menentukan salah satu kategori perangkat streaming kernel (KS) berikut:
- KSCATEGORY_DATACOMPRESSOR
- KSCATEGORY_DATADECOMPRESSOR
Contoh
Contoh berikut mengambil IDXGIAdapter1 pertama yang tersedia dan mendapatkan ADAPTOR LUID, yang diperlukan untuk mengidentifikasi adaptor untuk contoh berikutnya.
HRESULT hr = S_OK;
IDXGIFactory1 *pDxgiFactory = NULL;
IDXGIAdapter1 *pDxgiAdapter = NULL;
LUID adapterLuid;
if (FAILED(hr = CreateDXGIFactory1(__uuidof(IDXGIFactory1), (void **)&pDxgiFactory)))
{
return hr;
}
if (FAILED(hr = pDxgiFactory->EnumAdapters1(0, &pDxgiAdapter)))
{
return hr;
}
DXGI_ADAPTER_DESC1 AdapterDescr;
if (FAILED(hr = pDxgiAdapter->GetDesc1(&AdapterDescr)))
{
if (pDxgiAdapter)
{
pDxgiAdapter->Release();
pDxgiAdapter = NULL;
}
return hr;
}
adapterLuid = AdapterDescr.AdapterLuid;
Contoh berikut mencari dekoder video atau audio perangkat keras. Dekode asinkron, perangkat keras, transkode, dan bidang penggunaan dikecualikan. Jika kecocokan ditemukan, kode akan membuat MFT pertama dalam daftar. Tidak seperti contoh paralel dalam artikel MFTEnumEx , contoh ini membuat instans IMFAttributes dan mengatur atribut MFT_ENUM_ADAPTER_LUID ke LUID antarmuka tempat dekoder diminta. Dalam panggilan ke MFTEnum2, bendera MFT_ENUM_FLAG_HARDWARE yang diperlukan diatur dan argumen IMFAttributes disediakan.
HRESULT FindHWDecoder(
const GUID& subtype, // Subtype
BOOL bAudio, // TRUE for audio, FALSE for video
LUID& adapterLuid, // LUID of the graphics adapter for which to find the decoder
IMFTransform **ppDecoder // Receives a pointer to the decoder.
)
{
HRESULT hr = S_OK;
UINT32 count = 0;
IMFActivate **ppActivate = NULL;
CComPtr<IMFAttributes> spAttributes;
hr = MFCreateAttributes(&spAttributes, 1);
if (FAILED(hr = spAttributes->SetBlob(MFT_ENUM_ADAPTER_LUID, (BYTE*)&adapterLuid, sizeof(LUID))))
{
return hr;
}
MFT_REGISTER_TYPE_INFO info = { 0 };
info.guidMajorType = bAudio ? MFMediaType_Audio : MFMediaType_Video;
info.guidSubtype = subtype;
hr = MFTEnum2(
bAudio ? MFT_CATEGORY_AUDIO_DECODER : MFT_CATEGORY_VIDEO_DECODER,
MFT_ENUM_FLAG_HARDWARE | MFT_ENUM_FLAG_SYNCMFT | MFT_ENUM_FLAG_LOCALMFT | MFT_ENUM_FLAG_SORTANDFILTER,
&info, // Input type
NULL, // Output type
spAttributes,
&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 penyandi video atau audio perangkat keras. Encoder asinkron, perangkat keras, transkode, dan bidang penggunaan dikecualikan. Tidak seperti contoh paralel dalam artikel MFTEnumEx , contoh ini membuat instans IMFAttributes dan mengatur atribut MFT_ENUM_ADAPTER_LUID ke LUID antarmuka tempat encoder diminta. Dalam panggilan ke MFTEnum2, bendera MFT_ENUM_FLAG_HARDWARE yang diperlukan diatur dan argumen IMFAttributes disediakan.
HRESULT FindHWEncoder(
const GUID& subtype, // Subtype
BOOL bAudio, // TRUE for audio, FALSE for video
LUID& adapterLuid, // LUID of the graphics adapter for which to find the encoder
IMFTransform **ppEncoder // Receives a pointer to the decoder.
)
{
HRESULT hr = S_OK;
UINT32 count = 0;
IMFActivate **ppActivate = NULL;
CComPtr<IMFAttributes> spAttributes;
hr = MFCreateAttributes(&spAttributes, 1);
if (FAILED(hr = spAttributes->SetBlob(MFT_ENUM_ADAPTER_LUID, (BYTE*)&adapterLuid, sizeof(LUID))))
{
return hr;
}
MFT_REGISTER_TYPE_INFO info = { 0 };
info.guidMajorType = bAudio ? MFMediaType_Audio : MFMediaType_Video;
info.guidSubtype = subtype;
hr = MFTEnum2(
bAudio ? MFT_CATEGORY_AUDIO_ENCODER : MFT_CATEGORY_VIDEO_ENCODER,
MFT_ENUM_FLAG_HARDWARE | MFT_ENUM_FLAG_SYNCMFT | MFT_ENUM_FLAG_LOCALMFT | MFT_ENUM_FLAG_SORTANDFILTER,
NULL, // Input type
&info, // Output type
spAttributes,
&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 perangkat keras, dengan opsi untuk menyertakan dekoder asinkron, perangkat keras, atau transkode. Tidak seperti contoh paralel dalam artikel MFTEnumEx , contoh ini membuat instans IMFAttributes dan mengatur atribut MFT_ENUM_ADAPTER_LUID ke LUID antarmuka tempat dekoder video diminta. Dalam panggilan ke MFTEnum2, bendera MFT_ENUM_FLAG_HARDWARE yang diperlukan diatur dan argumen IMFAttributes disediakan.
HRESULT FindHWVideoDecoder(
const GUID& subtype,
BOOL bAllowAsync,
BOOL bAllowHardware,
BOOL bAllowTranscode,
LUID& adapterLuid, // LUID of the graphics adapter for which to find the encoder
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;
}
unFlags |= MFT_ENUM_FLAG_HARDWARE;
CComPtr<IMFAttributes> spAttributes;
hr = MFCreateAttributes(&spAttributes, 1);
if (FAILED(hr = spAttributes->SetBlob(MFT_ENUM_ADAPTER_LUID, (BYTE*)&adapterLuid, sizeof(LUID))))
{
return hr;
}
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
Persyaratan | Nilai |
---|---|
Klien minimum yang didukung | Windows 10 [khusus aplikasi desktop] |
Server minimum yang didukung | Windows Server 2016 [hanya aplikasi desktop] |
Target Platform | Windows |
Header | mfapi.h |
Pustaka | Mfplat.lib |
DLL | Mfplat.dll |