![]() |
| |||||||
| Forum Arşivi Gereksiz,Yanlış konular bu alanda toplanır. |
| |
| |
| | LinkBack | Konu Araçları | Stil |
| | #1 (permalink) |
| Usta Koxper | Bilgisayarımızdaki medya dosyalarını oynatan, görüntü ve seste değişiklikler veya efekt yazmamıza yarayan ve çoğu zaman codec olarak DirectShow filtrelerinin yazılımına ilişkin bir başlangıç dökümanıdır.Hafıza Tahsis İşlemleri Bağlı olan iki pin arasında veri alışverişi için bir mekanizma gereklidir. Bu mekanizmaya, veri taşıma denir. Genel olarak DirectShow mimarisi, veri taşıma konusunda tarafsızdır. İki filtre arasındaki veri transferi için herhangi bir taşıma yöntemini kabul edebilirsiniz. En yaygın ulaşım şekli yerel bellek taşımasıdır. Medya verileri içindeki ana bellek alanının taşınmasıdır. Yerel bellek taşıma işlemi iki türlü yapılabilmektedir. Bunlar yerel bellekten veriyi itme (push) ve çekme (pull) yöntemleridir. İtme (push) yönteminde, kaynak filtre hedef filtrenin giriş pinine ait IMemInputPin arayüzünü kullanarak veriyi aktarır. Çekme modelinde ise hedef filtre kaynak filtrenin çıkış pininden IAsyncReader arayüzü vasıtasıyla veri isteminde bulunur. Yerel bellek taşımalarında, hafıza ayırma işleminden nesne sorumludur. IMemAllocator arayüzü ayırma işlemlerini destekler. Bu işlemler bu arayüz vasıtası ile gerçekleştirilir. Her iki pine de tek ayırıcı paylaştırılır. Kullanılacak olan ayırıcıyı çıkış pini seçer. Çıkış pini ayrıca, ayırıcı özelliklerini de tayin eder. Bunlar, kaç adet bellek kullanılacağı, bellek hizalaması, bellek boyutu gibi özelliklerdir. Giriş pinleri için hafıza gereksinimlerinde çıkış pini erteleyici rol oynar. Yani giriş pininden gönderilen veri boyutu çıkış pini için ayrılmış olan veri boyutundan fazla ise kalan veri bir sonraki kullanım için ertelenir. IMemInputPin bağlantısı aşağıdaki gibi çalışır. 1. İsteğe bağlı olarak, çıkış pini IMemInputPin::GetAllocatorRequirements metoduna çağrı yapar. Bu yöntem hafıza uyumunu sağlamak açısından, giriş pini için gerekli olan hafıza alanını ele geçirir. Giriş pininin isteklerini çıkış pininin kabul ettiği durumlarda kullanılmalıdır. Aksi takdirde kullanımı iyi bir sebep değildir. 2. İsteğe bağlı olarak, çıkış pini IMemInputPin::GetAllocator metoduna çağrı yapar.Bu yöntem, giriş pininden ayırıcıyı ister. Giriş pini bu tip bir durumda ayırıcıyı verir veya hata döndürür. 3. Çıkış pini ayırıcıyı seçer. Çıkış pini giriş pini tarafından sağlanan ayırıcıyı veya bizim oluşturduğumuz ayırıcıyı kullanabilir. Fakat şeçim isteği çıkış pini tarafından yapılır. 4. Ayırıcının özelliklerini belirlemek için, çıkış pini IMemAllocator::SetProperties metoduna çağrıda bulunur. Bununla birlikte, ayırıcı istenilen özellikleri kabul etmeyebilir. (giriş pininin ayırıcıyı sağladığı durumlarda). SetProperties yönteminde çıkış parametresi olarak gerçek özellik değerleri de dönmektedir. Böylece değiştirmek istediğimiz değerlerin değişip değişmediğini, dönen bu değerle karşılaştırarak tespit edebiliriz. 5. Çıkış pini IMemInputPin::NotifyAllocator metoduna yaptığı çağrı ile seçilmiş olan ayırıcıyı giriş pinine bildirir. 6. Giriş pini IMemAllocator::GetProperties metoduna yaptığı çağrı ile ayırıcı işlemlerini kabul ettiğine dair bilgiyi doğrular. 7. Çıkış pini ayırıcıyı kabul edip etmemekle sorumludur. Bu işlem akış başlarken ve biterken oluşur. IAsyncReader bağlantısı aşağıdaki gibi çalışır. 1. Giriş pini, çıkış pinindeki IAsyncReader::RequestAllocator metoduna çağrıda bulunur. Giriş pini, hafıza gereksinimlere, isteğe bağlı özelliklere göre ayırıcıyı kesinleştirir. 2. Çıkış pini bir ayırıcı seçer. Bu giriş pini tarafından sağlanan veya bizim oluşturduğumuz bir ayırıcı olabilir. 3. RequestAllocator metodunun içindeki çıkış parametreleri vasıtasıyla ayırıcı, çıkış pinine döndürülür. Giriş pininin ayırıcısını kontrol etmeniz gerekir. 4. Giriş pini ayırıcıyı kabul edip etmediğininin yanıtını verir. 5. Bu işlemler sırasında herhangi bir zamanda bağlantı başarısız olabilir. 6. Eğer çıkış pini, giriş pininin ayırıcısını kullanıyorsa, sadece diğer giriş pinine teslim etmek amacıyla kullanmalıdır. Özel Ayırıcı Verme İşlemleri Bu bölümde sadece IMemInputPin arayüzü için bilgi verilecektir. Fakat IAsyncReader arayüzü için işlemler benzerdir. Önce ayırıcı için C++ sınıfı tanımlayın. Temel sınıflardaki CBaseAllocator veya CMemAllocator sınıflarını kullanabilir veya kendinize özel yeni bir sınıf tanımlayarak kullanabilirsiniz. Eğer yeni bir sınıf oluşturacaksanız mutlaka IMemAllocator arayüzünü sınıfınız kapsamalıdır. Geri kalan adımlar giriş ve çıkış pinlerinde tanımlanacak olan ayırıcı yöntemlerini içeren sınıfları kullanmaktır. Giriş pinleri, çıkış pinlerinin ayırıcıyı devretme aşamasında farklı bir rol oynar. Giriş pinleri için özel ayırıcı tanımlama: Giriş pinine ayırıcı sağlamak için, CBaseInputPin::GetAllocator yöntemini geçersiz kılmak gerekir. Bunun için kendi oluşturduğunuz CMyInput gibi bir sınıfta bu metodu tanımlamanız gerekmektedir. Bu yöntem ile m_pAllocator üye değişkenini kontrol ederiz. Eğer bu değişken boş değilse, bağlantı için seçilmiş bir ayırıcıya zaten sahiptir. Böylece GetAllocator yöntemi ayırıcı için işaretçi döndürmelidir. Eger m_pAllocator değişkeni boşsa, ayırıcı seçilmemiştir. Böylece GetAllocator yöntemi giriş pini için tercih edilen ayırıcı işaretçisini döndürmelidir. Bu durumda sizin özel bir ayırıcı oluşturum IMemAllocator arayüzü tipinde işaretçi döndürmeniz gerekmektedir. Aşağıdaki kod GetAllocator yönteminin kullanımını anlatmaktadır. STDMETHODIMP CMyInputPin::GetAllocator(IMemAllocator **ppAllocator) { CheckPointer(ppAllocator, E_POINTER); if (m_pAllocator) { // We already have an allocator, so return that one. *ppAllocator = m_pAllocator; (*ppAllocator)->AddRef(); return S_OK; } // No allocator yet, so propose our custom allocator. The exact code // here will depend on your custom allocator class definition. HRESULT hr = S_OK; CMyAllocator *pAlloc = new CMyAllocator(&hr); if (!pAlloc) { return E_OUTOFMEMORY; } if (FAILED(hr)) { delete pAlloc; return hr; } // Return the IMemAllocator interface to the caller. return pAlloc->QueryInterface(IID_IMemAllocator, (void**)ppAllocator); } Akışı sağlayan filtrede seçili olan ayırıcı giriş pininin IMemInputPin::NotifyAllocator metoduna yapılan çağrı ile bildirilir. Ayırıcı özellikleri kontrol etmek için temel sınıftaki CBaseInputPin::NotifyAllocator metodunu geçersiz kılıp kendi sınıfımızda tanımlamamız gerekmektedir. Bazı durumlarda bu ayırıcıyı özelliklerini kontrol ettikten sonra herhangi bir uyumsuzluktan dolayı redddetmek gerekebilir. |
| |
| Etiket |
| 2 or 3, directshow, filtre, yazılımı |
| Konuyu Toplam 1 Üye okuyor. (0 Kayıtlı üye ve 1 Misafir) | |
| Konu Araçları | |
| Stil | |
| |