Filter Driver Kelas WDM
[Fitur yang terkait dengan halaman ini, DirectShow, adalah fitur warisan. Ini telah digantikan oleh MediaPlayer, IMFMediaEngine, dan Pengambilan Audio/Video di Media Foundation. Fitur-fitur tersebut telah dioptimalkan untuk Windows 10 dan Windows 11. Microsoft sangat menyarankan agar kode baru menggunakan MediaPlayer, IMFMediaEngine , dan Pengambilan Audio/Video di Media Foundation alih-alih DirectShow, jika memungkinkan. Microsoft menyarankan agar kode yang ada yang menggunakan API warisan ditulis ulang untuk menggunakan API baru jika memungkinkan.]
Jika perangkat tangkapan menggunakan driver Windows Driver Model (WDM), grafik mungkin memerlukan filter tertentu di hulu dari filter pengambilan. Filter ini disebut filter driver kelas aliran atau filter WDM. Mereka mendukung fungsionalitas tambahan yang disediakan oleh perangkat keras. Misalnya, kartu tuner TV memiliki fungsi untuk mengatur saluran. Filter yang sesuai adalah filter Tuner TV , yang mengekspos antarmuka IAMTVTuner . Untuk membuat fungsionalitas ini tersedia untuk aplikasi, Anda harus menyambungkan filter Tuner TV ke filter pengambilan.
Antarmuka ICaptureGraphBuilder2 menyediakan cara termampu untuk menambahkan filter WDM ke grafik. Pada titik tertentu saat membangun grafik, panggil FindInterface atau RenderStream. Salah satu metode ini akan secara otomatis menemukan filter WDM yang diperlukan dan menghubungkannya ke filter pengambilan. Bagian lainnya menjelaskan cara menambahkan filter WDM secara manual. Namun, ketahuilah bahwa pendekatan yang direkomendasikan hanyalah memanggil salah satu metode ICaptureGraphBuilder2 ini.
Pin pada filter WDM mendukung satu atau beberapa media. Media mendefinisikan metode komunikasi, seperti bus. Anda harus menyambungkan pin yang mendukung media yang sama. Struktur REGPINMEDIUM , yang setara dengan struktur KSPIN_MEDIUM yang digunakan untuk driver streaming kernel, mendefinisikan media dalam DirectShow. Anggota clsMedium dari struktur REGPINMEDIUM menentukan pengidentifikasi kelas (CLSID) untuk medium. Untuk mengambil media pin, panggil metode IKsPin::KsQueryMediums . Metode ini mengembalikan pointer ke blok memori yang berisi struktur KSMULTIPLE_ITEM , diikuti oleh nol atau lebih struktur REGPINMEDIUM . Setiap struktur REGPINMEDIUM mengidentifikasi media yang didukung pin.
Jangan sambungkan pin jika media memiliki CLSID GUID_NULL atau KSMEDIUMSETID_Standard. Ini adalah nilai default yang menunjukkan bahwa pin tidak mendukung media.
Selain itu, jangan sambungkan pin kecuali filter memerlukan tepat satu instans yang terhubung dari pin tersebut. Jika tidak, aplikasi Anda mungkin mencoba menghubungkan berbagai pin yang seharusnya tidak memiliki koneksi, yang dapat menyebabkan program berhenti merespons. Untuk mengetahui jumlah instans yang diperlukan, ambil kumpulan properti KSPROPERTY_PIN_NECESSARYINSTANCES, seperti yang ditunjukkan dalam contoh kode berikut. (Untuk brevity, contoh ini tidak menguji kode pengembalian atau merilis antarmuka apa pun. Aplikasi Anda harus melakukan keduanya, tentu saja.)
// Obtain the pin factory identifier.
IKsPinFactory *pPinFactory;
hr = pPin->QueryInterface(IID_IKsPinFactory, (void **)&pPinFactory);
ULONG ulFactoryId;
hr = pPinFactory->KsPinFactory(&ulFactoryId);
// Get the "instance" property from the filter.
IKsControl *pKsControl;
hr = pFilter->QueryInterface(IID_IKsControl, (void **)&pKsControl);
KSP_PIN ksPin;
ksPin.Property.Set = KSPROPSETID_Pin;
ksPin.Property.Id = KSPROPERTY_PIN_NECESSARYINSTANCES;
ksPin.Property.Flags = KSPROPERTY_TYPE_GET;
ksPin.PinId = ulFactoryId;
ksPin.Reserved = 0;
KSPROPERTY ksProp;
ULONG ulInstances, bytes;
pKsControl->KsProperty((PKSPROPERTY)&ksPin, sizeof(ksPin),
&ulInstances, sizeof(ULONG), &bytes);
if (hr == S_OK && bytes == sizeof(ULONG))
{
if (ulInstances == 1)
{
// Filter requires one instance of this pin.
// This pin is OK.
}
}
Pseudocode berikut adalah kerangka yang sangat singkat yang menunjukkan cara menemukan dan menyambungkan filter WDM. Ini menghilangkan banyak detail, dan hanya dimaksudkan untuk menunjukkan langkah-langkah umum yang perlu diambil aplikasi Anda.
Add supporting filters:
{
foreach input pin:
skip if (pin is connected)
Get pin medium
skip if (medium is GUID_NULL or KSMEDIUMSETID_Standard)
Query filter for KSPROPERTY_PIN_NECESSARYINSTANCES property
skip if (necessary instances != 1)
Match an existing pin || Find a matching filter
}
Match an existing pin:
{
foreach filter in the graph
foreach unconnected pin
Get pin medium
if (mediums match)
connect the pins
}
Find a matching filter:
{
Query the filter graph manager for IFilterMapper2.
Find a filter with an output pin that matches the medium.
Add the filter to the graph.
Connect the pins.
Add supporting filters. (Recursive call.)
}
Topik terkait