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.
Bu konu, Media Foundation dönüşümleri (MFTs) için zaman uyumsuz veri işlemeyi açıklar.
Not
Bu konu, Windows 7 veya sonraki sürümler için geçerlidir.
- Zaman Uyumsuz MFT'ler Hakkında
- Genel Gereksinimler
- olayları
- processInput
- processoutput
- Boşaltma
- Boşaltma
- İşaretçileri
- Biçim Değişiklikleri
- Öznitelikleri
- Zaman Uyumsuz MFT'lerin Kilidini Açma
- MFT Kapatılıyor
- Kaydı ve Numaralandırma
- İlgili konular
Zaman Uyumsuz MFT'ler hakkında
MFT'ler Windows Vista'da kullanıma sunulduğunda, API zaman uyumlu veri işleme için tasarlanmıştır. Bu modelde MFT her zaman girişi almayı veya çıkış üretmeyi bekler.
Tipik bir video kod çözücü düşünün. Çözülmüş bir çerçeve almak için istemci, IMFTransform::P rocessOutputçağırır. Kod çözücü bir çerçevenin kodunu çözmek için yeterli veriye sahipse, MFT çerçevenin kodunu çözerken ProcessOutput bloklarını. Aksi takdirde, ProcessOutputMF_E_TRANSFORM_NEED_MORE_INPUTdöndürür ve istemcinin IMFTransform::P rocessInputçağrısı yapması gerektiğini belirtir.
Kod çözücü tüm kod çözme işlemlerini tek bir iş parçacığında gerçekleştiriyorsa bu model düzgün çalışır. Ancak kod çözücüde çerçevelerin kodunu paralel olarak çözmek için birkaç iş parçacığının kullanıldığı varsayılır. En iyi performans için kod çözücü, kod çözme iş parçacığı boşta olduğunda yeni giriş almalıdır. Ancak iş parçacıklarının kod çözme işlemlerini tamamlama hızı, istemcinin ProcessInput ve ProcessOutputçağrılarıyla tam olarak uyumlu olmaz ve bu da iş parçacıklarının çalışmayı beklemesine neden olur.
Windows 7, MFT'ler için zaman uyumsuz işleme olay temelli bir uygulama sağlar. Bu modelde MFT'nin girişe ihtiyacı olduğunda veya çıkışı olduğunda istemciye bir olay gönderir.
Genel Gereksinimler
Bu konu, zaman uyumsuz MFT'lerin zaman uyumlu MFT'den nasıl farklı olduğunu açıklar. Bu konu başlığında belirtilenler dışında, iki işleme modeli aynıdır. (Özellikle, biçim anlaşması aynıdır.)
Zaman uyumsuz bir MFT aşağıdaki arabirimleri uygulamalıdır:
Olay
Zaman uyumsuz MFT, veri işleme durumunun sinyalini vermek için aşağıdaki olayları kullanır:
| Olay | Açıklama |
|---|---|
| METransformNeedInput | MFT daha fazla girişi kabul ettiğinde gönderilir. |
| METransformHaveOutput | MFT çıktısı olduğunda gönderilir. |
| METransformDrainComplete | Boşaltma işlemi tamamlandığında gönderilir. Bkz. Boşaltma. |
| METransformMarker | bir işaretçi işlendiğinde gönderilir. bkz. İşaretçileri. |
Bu olaylar bant dışı gönderilir. MFT bağlamında bant içi ve bant dışı olaylar arasındaki farkı anlamak önemlidir.
Özgün MFT tasarımı, bant içi olayları destekler. Bant içi olay, biçim değişikliği gibi veri akışı hakkında bilgiler içerir. İstemci, IMFTransform::P rocessEventçağırarak bant içi olayları MFT'ye gönderir. MFT, ProcessOutput yönteminde bant içi olayları istemciye geri gönderebilir. (Özellikle, olaylar MFT_OUTPUT_DATA_BUFFER yapısının üyesi pEvents'te iletilir.)
MFT, IMFMediaEventGenerator arabirimi aracılığıyla bant dışı olayları aşağıdaki gibi gönderir:
- MFT, Media Event Generatorsbölümünde açıklandığı gibi IMFMediaEventGenerator arabirimini uygular.
- İstemci, IMFMediaEventGenerator arabirimi için MFT üzerinde IUnknown::QueryInterface çağırır. Zaman uyumsuz bir MFT bu arabirimi kullanıma sunmalıdır. Zaman uyumlu MFT'ler bu arabirimi kullanıma sunmamalıdır.
- İstemci, MFT'den bant dışı olayları almak için IMFMediaEventGenerator::BeginGetEvent ve IMFMediaEventGenerator::EndGetEvent çağırır.
ProcessInput
IMFTransform::P rocessInput yöntemi aşağıdaki gibi değiştirilir:
- Akış başladığında, istemci MFT_MESSAGE_NOTIFY_START_OF_STREAM iletisini gönderir.
- Akış sırasında MFT, bir METransformNeedInput olayı göndererek veri isteğinde bulunur. Olay verileri akış tanımlayıcısıdır.
- her METransformNeedInput olayı için istemci, belirtilen akış için ProcessInput çağırır.
- Akışın sonunda istemci, MFT_MESSAGE_NOTIFY_END_OF_STREAM iletisiyle ProcessMessage çağırabilir.
Uygulama notları:
- MFT, MFT_MESSAGE_NOTIFY_START_OF_STREAM iletisini alıncaya kadar METransformNeedInput olayları göndermemelidir.
- Akış sırasında MFT, METransformNeedInput olaylarını istediği zaman gönderebilir.
- MFT, METransformNeedInput olayları bekleyenlerin sayısını tutmalıdır. METransformNeedInput olayına karşılık gelen ProcessInput yapılan tüm çağrılar MF_E_NOTACCEPTINGdöndürmelidir.
- MFT MFT_MESSAGE_NOTIFY_END_OF_STREAM iletisini aldığında, METransformNeedInput olayları bekleyenlerin sayısını sıfırlar.
- MFT, MFT_MESSAGE_NOTIFY_END_OF_STREAM iletisini aldıktan sonra METransformNeedInput olayları göndermemelidir.
- ProcessInputMFT_MESSAGE_NOTIFY_START_OF_STREAM önce veya MFT_MESSAGE_NOTIFY_END_OF_STREAMsonra çağrılırsa, yöntemi MF_E_NOTACCEPTINGdöndürmelidir.
ProcessOutput
IMFTransform::P rocessOutput yöntemi aşağıdaki gibi değiştirilir:
- MFT'nin çıkışı olduğunda, bir METransformHaveOutput olayı gönderir.
- her METransformHaveOutput olayı için istemci, ProcessOutputçağırır.
Uygulama notları:
- İstemci ProcessOutput başka bir zamanda çağırırsa, yöntemi E_UNEXPECTEDdöndürür.
- Zaman uyumsuz MFT hiçbir zaman ProcessOutput yönteminden MF_E_TRANSFORM_NEED_MORE_INPUT döndürmemelidir. MFT daha fazla giriş gerektiriyorsa, bir METransformNeedInput olayı gönderir.
Boşaltma
Bir MFT'nin boşaltılması, MFT'nin gönderilen giriş verilerinden olabildiğince çok çıkış üretmesine neden olur. Zaman uyumsuz bir MFT'nin boşaltılması aşağıdaki gibi çalışır:
- İstemci MFT_MESSAGE_COMMAND_DRAIN iletisini gönderir.
- MFT METransformHaveOutput olayları, işlenmek üzere başka veri kalmayıncaya kadar göndermeye devam eder. Bu süre boyunca METransformNeedInput olayları göndermez.
- MFT, METransformHaveOutput olayının son gönderdikten sonra, bir METransformDrainComplete olayı gönderir.
Boşaltma tamamlandıktan sonra MFT, istemciden bir MFT_MESSAGE_NOTIFY_START_OF_STREAM iletisi alıncaya kadar METransformNeedInput olayı başka bir göndermez.
Kızarma
İstemci, MFT_MESSAGE_COMMAND_FLUSH iletisini göndererek MFT'yi temizleyebilir. MFT, tuttuğu tüm giriş ve çıkış örneklerini bırakır.
MFT, istemciden bir MFT_MESSAGE_NOTIFY_START_OF_STREAM iletisi alıncaya kadar METransformNeedInput başka bir göndermez.
İşaretleyiciler
İstemci, MFT_MESSAGE_COMMAND_MARKER iletisini göndererek akıştaki bir noktayı işaretleyebilir. MFT aşağıdaki gibi yanıt verir:
- MFT, mevcut giriş verilerinden olabildiğince çok çıkış örneği oluşturur ve her çıkış örneği için bir METransformHaveOutput olayı gönderir.
- Tüm çıkış oluşturulduktan sonra MFT bir METransformMarker olayı gönderir. Bu olay, tüm METransformHaveOutput olaylarından sonra gönderilmelidir.
Örneğin, bir kod çözücüde dört çıkış örneği üretmek için yeterli giriş verisi olduğunu varsayalım. İstemci MFT_MESSAGE_COMMAND_MARKER iletisini gönderirse, MFT dört METransformHaveOutput olayını (çıktı örneği başına bir tane) ve ardından METransformMarker olayını kuyruğa alır.
İşaretçi iletisi, boşaltma iletisine benzer. Ancak, bir drenaj akışta bir kesme olarak kabul edilirken, bir işaretçi değildir. Boşaltma ve işaretçiler aşağıdaki farklılıklara sahiptir.
Boşaltma:
- Boşaltılırken MFT, METransformNeedInput olayları göndermez.
- MFT, çıkış örneği oluşturmak için kullanılamayabilecek tüm giriş verilerini atar.
- Bazı MFT'ler, verilerin sonunda bir "kuyruk" oluşturur. Örneğin, yankı veya yankı gibi ses efektleri, giriş verileri durdurulduktan sonra ek veri üretir. Kuyruk oluşturan bir MFT, bir boşaltma işleminin sonunda bunu yapmalıdır.
- MFT'nin boşaltılması tamamlandıktan sonra, akıştaki bir kesintiyi göstermek için sonraki çıkış örneğini MFSampleExtension_Discontinuity özniteliğiyle işaretler.
Işaretleyici:
- MFT, işaretçi olayını göndermeden önce METransformNeedInput olayları göndermeye devam eder.
- MFT hiçbir giriş verisi atmıyor. Kısmi veriler varsa, işaretçi noktasından sonra işlenmelidir.
- MFT, işaretçi noktasında kuyruk üretmez.
- MFT, işaretçi noktasından sonra kesinti bayrağını ayarlamaz.
Değişiklikleri Biçimlendir
Akış Değişikliklerini İşleme açıklandığı gibi zaman uyumsuz MFT dinamik biçim değişikliklerini desteklemelidir.
Öznitelik
Zaman uyumsuz MFT'nin geçerli bir öznitelik deposu döndürmek için IMFTransform::GetAttributes yöntemini uygulaması gerekir. Aşağıdaki öznitelikler zaman uyumsuz MFT'ler için geçerlidir:
| Öznitelik | Açıklama |
|---|---|
| MF_TRANSFORM_ASYNC | MFT bu özniteliği true (1) olarak ayarlamalıdır. İstemci, MFT'nin zaman uyumsuz olup olmadığını bulmak için bu özniteliği sorgulayabilir. |
| MF_TRANSFORM_ASYNC_UNLOCK | |
| MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE | MFT bu özniteliği true (1) olarak ayarlamalıdır. İstemci, bu özniteliğin ayarlandığını varsayabilir. |
Zaman Uyumsuz MFT'lerin Kilidini Açma
Zaman uyumsuz MFT'ler özgün MFT veri işleme modeliyle uyumlu değildir. Zaman uyumsuz MFT'lerin mevcut uygulamaları bozmasını önlemek için aşağıdaki mekanizma tanımlanır:
- İstemci, MFT'de IMFTransform::GetAttributes çağrısında bulunur.
İstemci, bu MF_TRANSFORM_ASYNC özniteliği için sorgular. Zaman uyumsuz MFT için bu özniteliğin değeri **DOĞRU** olur.
MFT'nin kilidini açmak için istemcinin MF_TRANSFORM_ASYNC_UNLOCK özniteliğini **TRUE** olarak ayarlı olması gerekir.
İstemci MFT'nin kilidini açana kadar, tüm IMFTransform yöntemleri aşağıdaki özel durumlar dışında MF_E_TRANSFORM_ASYNC_LOCKEDdöndürmelidir:
- IMFTransform::GetAttributes (tüm zaman uyumsuz MFT'ler)
- IMFTransform::GetInputAvailableType (tüm zaman uyumsuz MFT'ler)
- IMFTransform::GetOutputCurrentType (yalnızca kodlayıcılar)
- IMFTransform::SetOutputType (yalnızca kodlayıcılar)
- IMFTransform::GetStreamCount (tüm zaman uyumsuz MFT'ler)
- IMFTransform::GetStreamIDs (tüm zaman uyumsuz MFT'ler)
Aşağıdaki kod, zaman uyumsuz MFT'nin kilidinin nasıl aç yapılacağını gösterir:
HRESULT UnlockAsyncMFT(IMFTransform *pMFT)
{
IMFAttributes *pAttributes = NULL;
HRESULT hr = hr = pMFT->GetAttributes(&pAttributes);
if (SUCCEEDED(hr))
{
hr = pAttributes->SetUINT32(MF_TRANSFORM_ASYNC_UNLOCK, TRUE);
pAttributes->Release();
}
return hr;
}
MFT Kapatılıyor
Zaman uyumsuz MFT'ler IMFShutdown arabirimini uygulamalıdır.
- Shutdown: MFT olay kuyruğunu kapatmalıdır. Standart olay kuyruğu kullanıyorsanız, IMFMediaEventQueue::Shutdownöğesini çağırın. İsteğe bağlı olarak, MFT diğer kaynakları serbest bırakabilir. İstemci, Shutdownçağrısı yaptıktan sonra MFT'yi kullanmamalıdır.
- GetShutdownStatus: Kapatma çağrıldıktan sonra MFT, pStatus parametresinde MFSHUTDOWN_COMPLETED değerini döndürmelidir. MFSHUTDOWN_INITIATEDdeğerini döndürmemelidir.
Kayıt ve Numaralandırma
Zaman uyumsuz bir MFT kaydetmek için MFTRegister işlevini çağırın ve Bayraklar parametresinde MFT_ENUM_FLAG_ASYNCMFT bayrağını ayarlayın. (Daha önce bu bayrak ayrılmıştı.)
Zaman uyumsuz MFT'leri numaralandırmak için MFTEnumEx işlevini çağırın ve Bayraklar parametresinde MFT_ENUM_FLAG_ASYNCMFT bayrağını ayarlayın. Geriye dönük uyumluluk için MFTEnum işlevi zaman uyumsuz MFT'leri listelemez. Aksi takdirde, kullanıcının bilgisayarına zaman uyumsuz bir MFT yüklemek mevcut uygulamaları bozabilir.
İlgili konular