Bagikan melalui


Pembilasan

[Fitur yang terkait dengan halaman ini, DirectShow, adalah fitur warisan. Ini telah digantikan oleh MediaPlayer, IMFMediaEngine, dan Tangkapan 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 Audio/Video Capture 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.]

Saat grafik filter berjalan, jumlah data arbitrer dapat bergerak melalui grafik. Beberapa di antaranya mungkin dalam antrean, menunggu untuk dikirimkan. Ada kalanya grafik filter perlu menghapus data yang tertunda ini secepat mungkin dan menggantinya dengan data baru. Setelah perintah pencarian, misalnya, filter sumber menghasilkan sampel dari posisi baru di sumber. Untuk meminimalkan latensi, filter hilir harus membuang sampel apa pun yang dibuat sebelum perintah pencarian. Proses membuang sampel disebut pembersihan. Ini memungkinkan grafik menjadi lebih responsif ketika peristiwa mengubah aliran data normal.

Pembersihan ditangani sedikit berbeda oleh model penarikan daripada model pendorongan. Artikel ini dimulai dengan menjelaskan model pendorongan; kemudian menjelaskan perbedaan dalam model penarikan.

Flushing terjadi dalam dua tahap.

  • Pertama, filter sumber memanggil IPin::BeginFlush pada pin input filter hilir. Filter hilir mulai menolak sampel dari hulu. Ini juga membuang sampel apa pun yang dipegangnya, dan mengirim panggilan BeginFlush ke filter berikutnya.
  • Ketika filter sumber siap untuk mengirim data baru, filter tersebut memanggil IPin::EndFlush pada pin input. Ini menandakan filter hilir bahwa ia dapat menerima sampel baru. Filter hilir mengirimkan panggilan EndFlush ke filter berikutnya.

Dalam metode BeginFlush , pin input melakukan hal berikut:

  1. Memanggil BeginFlush pada pin input hilir.
  2. Menolak panggilan lebih lanjut yang mengalirkan data, termasuk Receive dan EndOfStream.
  3. Membuka blokir filter upstram apa pun yang diblokir menunggu sampel dari alokator filter. Beberapa filter menonaktifkan alokatornya untuk tujuan ini.
  4. Keluar dari setiap tunggu yang memblokir streaming. Misalnya, filter perender memblokir saat dijeda. Mereka juga memblokir ketika mereka menunggu untuk merender sampel pada waktu streaming yang benar. Filter harus membuka blokir, sehingga sampel yang diantrekan di hulu dapat dikirimkan dan ditolak. Langkah ini memastikan bahwa semua filter upstram akhirnya membuka blokir.

Dalam metode EndFlush , pin input melakukan hal berikut:

  1. Menunggu semua sampel antrean dibuang.
  2. Membebaskan data yang di-buffer. Langkah ini terkadang dapat dilakukan dalam metode BeginFlush . Namun, BeginFlush tidak disinkronkan dengan utas streaming. Filter tidak boleh memproses atau buffer data lagi antara panggilan ke BeginFlush dan panggilan ke EndFlush.
  3. Menghapus pemberitahuan EC_COMPLETE yang tertunda.
  4. Memanggil EndFlush downstream.

Pada titik ini, filter dapat menerima sampel lagi. Semua sampel dijamin lebih baru daripada flush.

Dalam model penarikan, filter pengurai memulai pembersihan, bukan filter sumber. Tidak hanya memanggil IPin::BeginFlush dan IPin::EndFlush pada filter hilir, ini juga memanggil IAsyncReader::BeginFlush dan IAsyncReader::EndFlush pada pin output filter sumber. Jika filter sumber memiliki permintaan baca yang tertunda, filter tersebut akan membuangnya.

Membersihkan Data