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, yeni yazılımların mümkün olduğunda MediaPlayer, IMFMediaEngine ve Media Foundation'daki Audio/Video İletisi kullanmalarını, DirectShowyerine önermektedir. Microsoft, mümkünse yeni API'leri kullanmak için eski API'leri kullanan mevcut kodun yeniden yazılmasını önerir.]
Bir pin medya verilerini başka bir pine teslim ettiğinde, bellek arabelleğine doğrudan bir işaretçi geçirmez. Bunun yerine, belleği yöneten bir COM nesnesine işaretçi getirir. medya örneğiolarak adlandırılan bu nesne, IMediaSample arabirimini kullanıma sunar. Alıcı pin, IMediaSample::GetPointer,IMediaSample::GetSizeve IMediaSample::GetActualDataLengthgibi IMediaSample yöntemlerini çağırarak bellek arabelleğine erişir.
Örnekler her zaman çıkış pininden giriş pinine kadar aşağı doğru ilerler. Gönderme modelinde, çıkış pini, giriş pininde IMemInputPin::Receive çağrısını yaparak bir örnek ulaştırır. Giriş pini verileri eşzamanlı olarak (yani tamamen Alma yönteminin içinde) veya bir çalışan iş parçacığında zaman uyumsuz olarak işleyebilir. Giriş pininin, kaynakları beklemesi gerekiyorsa Alma yöntemi içinde engellemesine izin verilir.
ayırıcı olarak adlandırılan başka bir COM nesnesi, medya örneklerini oluşturmak ve yönetmekle sorumludur. Ayırıcılar IMemAllocator arabirimini sağlar. Bir filtre boş arabelleğe sahip bir medya örneğine ihtiyaç duyduğunda, örneğe bir işaretçi döndüren IMemAllocator::GetBuffer yöntemini çağırır. Her pin bağlantısı bir ayırıcıyı paylaşır. İki pin bağlandığında, hangi filtrenin ayırıcıyı sağlayacağına birlikte karar verirler. Pinler ayırıcıda arabellek sayısı ve her arabelleğin boyutu gibi özellikleri de ayarlar. (Ayrıntılar için bkz. Filtrelerin Bağlantısı ve Dağıtıcılarla Pazarlık Yapma.)
Aşağıdaki çizimde ayırıcı, medya örnekleri ve filtre arasındaki ilişkiler gösterilmektedir.
Medya Örneği Sayı Referansları
Ayırıcı, sonlu bir örnek havuzu oluşturur. Herhangi bir zamanda bazı örnekler kullanımda olabilirken, diğerleri GetBuffer çağrıları için kullanılabilir. Tahsis edici, örnekleri takip etmek için referans sayımını kullanır. GetBuffer yöntemi, başvuru sayısı 1 olan bir örnek döndürür. Başvuru sayısı sıfıra düşerse, örnek nesne bellek ayırıcısının havuzuna geri döner ve sonraki GetBuffer çağrısında kullanılabilir. Başvuru sayısı sıfırın üzerinde olduğu sürece, örnek GetBufferiçin kullanılamaz. Ayırıcıya ait her örnek kullanımdaysa, GetBuffer yöntemi bir örnek kullanılabilir duruma gelene kadar engeller.
Örneğin, bir giriş pin'inin bir örnek aldığını varsayalım. Örneği senkron şekilde işlerse, başvuru sayısını Receive yönteminin içinde artırmaz. Alması döndüğünde, çıkış pini örneği serbest bırakır, başvuru sayısı sıfıra iner ve örnek ayırıcının havuzuna geri döner. Öte yandan, giriş pini örnek bir çalışan iş parçacığında çalıştırılıyorsa, Receive yönteminden çıkmadan önce başvuru sayısını artırır. Başvuru sayısı şimdi 2'dir. Çıkış pini örneği serbest bıraktığında, sayı 1'e gider; örnek henüz havuza geri dönmez. Çalışan iş parçacığı örnekle tamamlandıktan sonra, örneği serbest bırakmak için Release çağırır. Şimdi örnek havuza geri döner.
Pin bir örnek aldığında verileri başka bir örneğe kopyalayabilir veya özgün örneği değiştirip bir sonraki filtreye teslim edebilir. Potansiyel olarak, bir örnek grafiğin tüm uzunluğu boyunca seyahat edebilir ve her filtre sırasıyla AddRef ve Release çağırır. Bu nedenle çıkış pini, Almaçağrısı yaptıktan sonra hiçbir zaman örneği yeniden kullanmamalıdır çünkü aşağı akış filtresi örneği kullanıyor olabilir. Yeni bir örnek almak için çıkış pini her zaman GetBuffer çağırmalıdır.
Bu mekanizma, filtreler aynı arabellekleri yeniden kullandığından bellek ayırma miktarını azaltır. Ayrıca, dağıtıcı kullanılabilir örneklerin bir listesini tuttuğu için, filtrelerin işlenmemiş verilerin üzerine yanlışlıkla yazmasını önler.
Bir filtre giriş ve çıkış için ayrı ayırıcılar kullanabilir. Giriş verilerini genişletirse (örneğin, sıkıştırmasını kaldırarak) bunu yapabilir. Eğer çıktı, girdiden büyük değilse, bir filtre, verileri yeni bir örneğe kopyalamadan yerinde işleyebilir. Bu durumda, iki veya daha fazla pin bağlantısı bir ayırıcıyı paylaşabilir.
Ayırıcıları İşleme ve Ayrıştırma
Bir filtre bir ayırıcıyı ilk kez oluşturduğunda ayırıcı henüz hiçbir bellek arabelleği ayırmamıştır. Bu noktada, GetBuffer yöntemine yapılan tüm çağrılar başarısız olur. Akış başladığında, çıkış pin'i IMemAllocator::Commityöntemini çağırarak ayırıcıyı taahhüt eder ve bunun sonucunda bellek tahsis edilir. Pinler artık GetBufferçağırabilir.
Akış durduğunda, pin IMemAllocator::Decommitöğesini çağırarak ayırıcıyı devre dışı bırakır. GetBuffer sonraki tüm çağrılar, ayırıcı yeniden bağlı olana kadar başarısız olur. Ayrıca, GetBuffer çağrıları şu anda örnek beklerken engellenirse, hemen bir hata kodu döndürür. Decommit yöntemi, uygulamaya bağlı olarak belleği boşaltabilir veya boşaltmayabilir. Örneğin, CMemAllocator sınıfı, belleği boşaltmak için yıkıcı metoduna kadar bekler.
İlgili konular
-
Filtre Grafındaki Veri Akışı