Zaman Uyumsuz MFT'ler

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

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:

  1. MFT, Media Event Generatorsbölümünde açıklandığı gibi IMFMediaEventGenerator arabirimini uygular.
  2. İ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.
  3. İ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:

  1. Akış başladığında, istemci MFT_MESSAGE_NOTIFY_START_OF_STREAM iletisini gönderir.
  2. Akış sırasında MFT, bir METransformNeedInput olayı göndererek veri isteğinde bulunur. Olay verileri akış tanımlayıcısıdır.
  3. her METransformNeedInput olayı için istemci, belirtilen akış için ProcessInput çağırır.
  4. Akışın sonunda istemci, MFT_MESSAGE_NOTIFY_END_OF_STREAM iletisiyle ProcessMessage çağırabilir.

Uygulama notları:

ProcessOutput

IMFTransform::P rocessOutput yöntemi aşağıdaki gibi değiştirilir:

  1. MFT'nin çıkışı olduğunda, bir METransformHaveOutput olayı gönderir.
  2. 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:

  1. İstemci MFT_MESSAGE_COMMAND_DRAIN iletisini gönderir.
  2. MFT METransformHaveOutput olayları, işlenmek üzere başka veri kalmayıncaya kadar göndermeye devam eder. Bu süre boyunca METransformNeedInput olayları göndermez.
  3. 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:

  1. MFT, mevcut giriş verilerinden olabildiğince çok çıkış örneği oluşturur ve her çıkış örneği için bir METransformHaveOutput olayı gönderir.
  2. 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:

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.

Media Foundation Dönüştürmeleri