Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
[DirectShow bu sayfayla ilişkilendirilmiş özellik eski bir özelliktir. Yerine MediaPlayer, IMFMediaEngineve Media Foundation 'de Ses/Video Yakalamaalmıştır. Bu özellikler Windows 10 ve Windows 11 için iyileştirilmiştir. Microsoft, mümkün olduğunda, yeni kodun DirectShowyerine MediaPlayer, IMFMediaEngine ve Medya Temelinde Audio/Video Capture kullanmasını kesinlikle önerir. Microsoft, mümkünse yeni API'leri kullanmak için eski API'leri kullanan mevcut kodun yeniden yazılmasını önerir.]
Filtre grafı çalışırken, grafikte rastgele miktarda veri hareket edebilir. Bazıları kuyruklarda, teslim edilmeyi bekliyor olabilir. Filtre grafiğinin bu bekleyen verileri mümkün olan en kısa sürede kaldırması ve yeni verilerle değiştirmesi gereken zamanlar vardır. Örneğin, bir arama komutundan sonra, kaynak filtre kaynaktaki yeni bir konumdan örnekler oluşturur. Gecikme süresini en aza indirmek için aşağı akış filtreleri, arama komutundan önce oluşturulmuş tüm örnekleri atmalıdır. Örneklerin atılması işlemi yıkamaolarak adlandırılır. Olaylar normal veri akışını değiştirdiğinde grafiğin daha hızlı yanıt vermesine olanak tanır.
Boşaltma, çekme modeli tarafından gönderme modeline göre biraz farklı işlenir. Bu makale, gönderme modelini açıklayarak başlar; ardından çekme modelindeki farkları açıklar.
Boşaltma iki aşamada gerçekleşir.
- İlk olarak, kaynak filtre, aşağı yönlü filtrenin giriş pininde IPin::BeginFlush çağırır. Aşağı akış filtresi, yukarı akıştan örnekleri reddetmeye başlar. Ayrıca, tuttuğu tüm örnekleri atar ve BeginFlush aşağı akış çağrısını sonraki filtreye gönderir.
- Kaynak filtre yeni veri göndermeye hazır olduğunda, giriş pininde IPin::EndFlush çağırır. Bu, aşağı akış filtresine yeni örnekler alabileceğini bildirir. Aşağı akış filtresi EndFlush çağrısını sonraki filtreye gönderir.
BeginFlush yönteminde giriş pini aşağıdakileri yapar:
- Alt akış giriş pinlerinde BeginFlush çağırır.
- Veri akışı yapan diğer çağrıları, Al ve EndOfStreamdahil olmak üzere, reddeder.
- Yukarı akış filtresi ayırıcısından örnek beklerken engellenen filtrelerdeki engellemeleri kaldırır. Bazı filtreler, ayırıcılarını bu amaçla kullanımdan kaldırıyor.
- Akışı engelleyen tüm beklemelerden çıkar. Örneğin, işleyici duraklatıldığında bloğu filtreler. Ayrıca, doğru akış zamanında bir veri örneğini oluşturmak için beklerken de engel olurlar. Filtrenin engelini kaldırması gerekir, böylece yukarı akışta kuyruğa alınan örnekler teslim edilebilir veya reddedilebilir. Bu adım, tüm yukarı akış filtrelerinin sonunda engelini kaldırmasını sağlar.
EndFlush yönteminde giriş pini aşağıdakileri yapar:
- Kuyruğa alınan tüm örneklerin atılması için bekler.
- Arabelleğe alınan verileri boşaltır. Bu adım bazen BeginFlush yönteminde gerçekleştirilebilir. Ancak, BeginFlush akış iş parçacığı ile senkronize edilmemiştir. Filtre, BeginFlush çağrısı ile EndFlushçağrısı arasında daha fazla veri işlememeli veya arabelleğe almamalıdır.
- Bekleyen EC_COMPLETE bildirimlerini temizler.
- EndFlush aşağı akış çağırır.
Bu noktada, filtre örnekleri yeniden kabul edebilir. Tüm örneklerin, sıvı boşaltmadan daha yeni olduğu garanti edilir.
Çekme modelinde ayrıştırıcı filtresi, kaynak filtre yerine boşaltma işlemini başlatır. Aşağı akış filtresinde IPin::BeginFlush ve IPin::EndFlush çağırmasının yanında, kaynak filtrenin çıktısı raptiyesinde IAsyncReader::BeginFlush ve IAsyncReader::EndFlush da çağırır. Kaynak filtrede bekleyen okuma istekleri varsa, bunları atar.
İlgili konular