Rantai Filter
[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.]
rantai filter adalah urutan filter yang memenuhi kondisi berikut:
- Setiap filter dalam rantai memiliki paling banyak satu pin input yang terhubung dan satu pin output yang terhubung.
- Dimungkinkan untuk melintasi setiap filter dalam rantai tanpa melintasi filter di luar rantai.
Misalnya, dalam diagram berikut, filter A–B, C–D, dan F–G–H adalah rantai filter. Setiap subchain di F–G–H (F–G dan G–H) juga merupakan rantai filter. Rantai filter dapat terdiri dari satu filter, sehingga filter A, B, C, D, F, G, dan H juga merupakan rantai filter yang berbeda. Filter E memiliki dua koneksi input, sehingga urutan filter apa pun yang menyertakan filter E bukan rantai filter.
rantai filter (contoh 1)
AntarmukaIFilterChain menyediakan metode berikut untuk mengontrol rantai filter:
Label | Nilai |
---|---|
IFilterChain::StartChain | Memulai rantai. |
IFilterChain::StopChain | Menghentikan rantai. |
IFilterChain::P auseChain | Menjeda rantai. |
IFilterChain::RemoveChain | Menghapus rantai dari grafik. |
Tidak ada metode khusus untuk menambahkan rantai. Untuk menambahkan rantai, sisipkan filter baru menggunakan metode IFilterGraph::AddFilter. Kemudian sambungkan filter dengan memanggil IGraphBuilder::Connect, IGraphBuilder::Render, atau metode serupa.
Saat grafik berjalan, rantai filter dapat beralih antara berjalan dan berhenti. Saat grafik dijeda, grafik dapat beralih antara dijeda dan dihentikan. Ini adalah satu-satunya transisi status yang mungkin dilakukan dengan rantai filter.
Panduan Rantai Filter
Saat Anda menggunakan metode IFilterChain, penting untuk memastikan bahwa filter dalam grafik dapat mendukung operasi penautan filter. Jika tidak, Anda dapat menyebabkan kebuntuan atau kesalahan grafik. Filter yang tersambung ke rantai harus berfungsi dengan benar setelah status perubahan rantai.
Cara terbaik untuk menggunakan IFilterChain adalah dengan serangkaian filter yang telah Anda rancang khusus untuk penautan. Gunakan panduan berikut untuk memastikan bahwa filter Anda aman untuk operasi rantai filter. Poin-poin ini mengacu pada diagram berikut.
rantai filter (contoh 2)
- Sebelum status rantai filter berubah, semua panggilan pemrosesan data di batas rantai filter harus diselesaikan. Aturan ini berlaku untuk metode IMemInputPin::Receive, IPin::NewSegment, dan IPin::EndOfStream. Filter dalam rantai harus kembali dari panggilan ke metode ini yang dibuat oleh filter di luar rantai; dan filter di luar rantai harus kembali dari panggilan yang dilakukan oleh filter dalam rantai.
Misalnya, dalam diagram sebelumnya, filter B harus menyelesaikan panggilan pemrosesan data apa pun dari filter A, dan filter E harus menyelesaikan panggilan apa pun dari filter D. Jika pin mengeksposIPinFlowControldan antarmukaIPinConnection, Anda dapat mendorong data melalui grafik dengan memanggil IPinFlowControl::Block dan IGraphConfig::P ushThroughData metode, seperti yang dijelaskan dalam Dynamic Reconnection. Filter mungkin juga mendukung metode privat untuk mendorong data.
- Filter upstram harus mengharapkan status rantai berubah. Misalnya, dalam diagram sebelumnya, misalkan rantai dihentikan tetapi filter Panggilan A IMemInputPin::Terima. Panggilan gagal dan respons filter A adalah menghentikan streaming. Ketika aplikasi memulai ulang rantai, itu tidak berpengaruh karena filter A tidak lagi mengalirkan data.
- Filter hilir juga harus mengharapkan status rantai berubah. Jika tidak, filter hilir mungkin memblokir saat menunggu sampel yang tidak pernah tiba. Misalnya, filter multiplexer (MUX) sering memerlukan data dari semua pin inputnya. Menghentikan aliran data dari satu pin input dapat memblokir aliran lain dari pemrosesan. Ini dapat menyebabkan grafik kebuntuan.
- Setiap koneksi pin dari filter di luar rantai ke filter dalam rantai harus memiliki alokatornya sendiri, yang tidak dibagikan oleh koneksi lain. Ketika rantai berubah status atau dihapus dari grafik, alokator mungkin dinonaktifkan. Jika koneksi lain menggunakan alokator yang sama, koneksi tersebut tidak dapat lagi memproses sampel.
- Jangan hapus rantai kecuali filter yang tersambung ke rantai mendukung pemutusan dinamis. Biasanya, filter yang terhubung akan mendukung IPinConnection atau antarmuka IPinFlowControl, tetapi mungkin mendukung antarmuka privat sebagai gantinya.
Topik terkait