Status 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.]

Filter memiliki tiga kemungkinan status: dihentikan, dijeda, dan berjalan. Tujuan dari status dijeda adalah untuk membius data dalam grafik, sehingga perintah jalankan segera merespons. Filter Graph Manager mengontrol semua transisi status. Saat aplikasi memanggil IMediaControl::Run, IMediaControl::P ause, atau IMediaControl::Stop, Filter Graph Manager memanggil metode IMediaFilter yang sesuai pada semua filter. Transisi antara berhenti dan berjalan selalu melalui status dijeda, jadi jika aplikasi memanggil Jalankan pada grafik yang dihentikan, Filter Graph Manager menjeda grafik sebelum menjalankannya.

Untuk sebagian besar filter, status berjalan dan dijeda identik. Pertimbangkan grafik filter berikut:

Perender Transformasi > Sumber >

Asumsikan untuk saat ini bahwa filter sumber bukan sumber penangkapan langsung. Ketika filter sumber dijeda, filter membuat utas yang menghasilkan data baru dan menulisnya ke sampel media secepat mungkin. Utas "mendorong" sampel ke hilir dengan memanggil IMemInputPin::Receive pada pin input filter transformasi. Filter transformasi menerima sampel pada utas filter sumber. Ini dapat menggunakan utas pekerja untuk mengirimkan sampel ke perender, tetapi biasanya mengirimkannya pada utas yang sama. Saat perender dijeda, perender menunggu untuk menerima sampel. Setelah menerimanya, ia memblokir dan menahan sampel tersebut tanpa batas waktu. Jika itu adalah perender video, itu menampilkan sampel sebagai gambar poster, mengecat ulang gambar seperlunya.

Pada titik ini, aliran sepenuhnya terisi dan siap untuk dirender. Jika grafik tetap dijeda, sampel akan "menumpuk" dalam grafik di belakang sampel pertama, hingga setiap filter diblokir di Receive atau IMemAllocator::GetBuffer. Namun, tidak ada data yang hilang. Setelah utas sumber tidak diblokir, alur sumber hanya dilanjutkan dari titik di mana ia diblokir.

Filter sumber dan filter transformasi mengabaikan transisi dari dijeda ke berjalan—mereka hanya terus memproses data secepat mungkin. Tetapi ketika perender berjalan, perender mulai merender sampel. Pertama merender sampel yang dipegangnya saat dijeda. Kemudian, setiap kali menerima sampel baru, sampel menghitung waktu presentasi sampel. (Untuk detailnya, lihat Waktu dan Jam di DirectShow.) Perender menyimpan setiap sampel hingga waktu presentasi, di mana perender merender sampel. Saat menunggu waktu presentasi, ia memblokir dalam metode Terima , atau menerima sampel baru pada utas pekerja dengan antrean. Filter upstram dari perender tidak terlibat dalam penjadwalan.

Sumber langsung, seperti perangkat tangkap, adalah pengecualian untuk arsitektur umum ini. Dengan sumber langsung, tidak tepat untuk membiakkan data apa pun terlebih dahulu. Aplikasi mungkin menjeda grafik dan kemudian menunggu lama sebelum menjalankannya. Grafik tidak boleh merender sampel "basi". Oleh karena itu, sumber langsung tidak menghasilkan sampel saat dijeda, hanya saat berjalan. Untuk memberi sinyal fakta ini ke Filter Graph Manager, metode IMediaFilter::GetState filter sumber mengembalikan VFW_S_CANT_CUE. Kode pengembalian ini menunjukkan bahwa filter telah beralih ke status dijeda, meskipun perender tidak menerima data apa pun.

Ketika filter berhenti, filter menolak sampel lagi yang dikirimkan ke dalamnya. Filter sumber mematikan utas streaming mereka, dan filter lain mematikan utas pekerja apa pun yang mungkin telah mereka buat. Pin menonaktifkan alokator mereka.

Transisi Status

Filter Graph Manager melakukan semua transisi status dalam urutan upstram, mulai dari perender dan bekerja mundur ke filter sumber. Pengurutan ini diperlukan untuk mencegah sampel dihilangkan dan untuk mencegah grafik mengalami kebuntuan. Transisi status yang paling penting adalah antara dijeda dan dihentikan:

  • Dihentikan untuk dijeda: Saat setiap filter dijeda, filter menjadi siap untuk menerima sampel dari filter berikutnya. Filter sumber adalah yang terakhir dijeda. Ini membuat utas streaming dan mulai mengirimkan sampel. Karena semua filter hilir dijeda, tidak ada filter yang menolak sampel apa pun. Filter Graph Manager tidak menyelesaikan transisi sampai setiap perender dalam grafik telah menerima sampel (dengan pengecualian sumber langsung, seperti yang dijelaskan sebelumnya).
  • Dijeda untuk dihentikan: Saat filter berhenti, filter akan merilis sampel apa pun yang dipegangnya, yang membuka blokir filter upstram yang menunggu di GetBuffer. Jika filter menunggu sumber daya di dalam metode Terima , filter berhenti menunggu dan kembali dari Terima, yang membuka blokir filter panggilan. Oleh karena itu, ketika Filter Graph Manager menghentikan filter upstream berikutnya, filter tersebut tidak diblokir di GetBuffer atau Receive, dan dapat merespons perintah hentikan. Filter upstram mungkin mengirimkan beberapa sampel tambahan sebelum mendapatkan perintah berhenti, tetapi filter hilir hanya menolaknya, karena sudah berhenti.

Aliran Data di Grafik Filter