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
E_INVALIDARG
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.
Jika Anda tidak mengatur bendera MFT_ENUM_FLAG_SORTANDFILTER , fungsi MFTEnum2 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 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 .

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 , MFTs 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 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
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 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

Lihat juga

Pembatasan Bidang Penggunaan

MFTRegister

Fungsi Media Foundation

Mendaftar dan Menghitung MFTs