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 dalam 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 bukanlah rantai filter.
Antarmuka IFilterChain 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 dihentikan. Saat grafik dijeda, grafik dapat beralih antara dijeda dan dihentikan. Ini adalah satu-satunya transisi status yang dimungkinkan 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 rantai berubah status.
Cara terbaik untuk menggunakan IFilterChain adalah dengan sekumpulan 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.
- 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 mengekspos antarmuka IPinFlowControl dan IPinConnection , Anda dapat mendorong data melalui grafik dengan memanggil metode IPinFlowControl::Block dan IGraphConfig::P ushThroughData , seperti yang dijelaskan dalam Koneksi Ulang Dinamis. 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 A memanggil IMemInputPin::Receive. 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 menghapus rantai kecuali filter yang terhubung ke rantai mendukung pemutusan dinamis. Biasanya, filter yang terhubung akan mendukung antarmuka IPinConnection atau IPinFlowControl , tetapi mungkin mendukung antarmuka privat sebagai gantinya.
Topik terkait