Filtre odaklı işleme

Filtrede filtre odaklı işleme kullanılıyorsa, her pin örneğinde kullanılabilir veri çerçeveleri olduğunda, varsayılan olarak AVStream minidriver tarafından sağlanan AVStrMiniFilterProcess geri çağırma yordamını çağırır. Minidriver'lar, KSPIN_DESCRIPTOR_EX yapısının Flags üyesini ayarlayarak bu varsayılan davranışı değiştirebilir.

Filtre odaklı işleme uygulamak için, KSFILTER_DISPATCH yapısının İşlem üyesinde minidriver tarafından sağlanan AVStrMiniFilterProcess geri çağırma yordamına bir işaretçi sağlayın. KSPIN_DISPATCHİşlem üyesini NULL olarak ayarlayın.

AVStream , AVStrMiniFilterProcess'i yalnızca aşağıdaki koşulların tümü karşılandığında çağırır:

  • Çerçeveler, işlemenin gerçekleşmesi için çerçeve gerektiren pinlerde mevcuttur. Minidriver'lar, KSPIN_DESCRIPTOR_EXFlags üyesinde bayrakları ayarlayarak işleme davranışını değiştirebilir. KSPIN_FLAG_FRAMES_NOT_REQUIRED_FOR_PROCESSING ve KSPIN_FLAG_SOME_FRAMES_REQUIRED_FOR_PROCESSING birbirini dışlayan bayrakların birleşimlerine özellikle dikkat edin. Minidriver, KsPinAttachAndGate veya KsPinAttachOrGate yordamlarının kullanımı aracılığıyla çerçeve gerektiren pin kümesini de değiştirebilir.

  • Pin örneklerinin sayısı, KSPIN_DESCRIPTOR_EX yapısının InstancesNecessary üyesine eşit veya ondan büyüktür. KSPIN yapısının ClientState üyesi, pinin şu anda ayarlandığı belirli KSSTATE numaralandırıcısını belirtir. InstancesNecessary karşılandıktan sonra, KSSTATE_STOP durumundaki ek pinler filtre işlemeyi engellemez.

  • Gerekli pin örneği sayısı karşılanır (KSPIN_DESCRIPTOR_EX yapısının InstancesNecessary üyesi tarafından belirtildiği gibi).

  • Minidriver, KSGATEXxx işlevlerini kullanarak filtrenin işlem denetim kapısını kapatmadı.

AVStrMiniFilterProcess geri çağırma yordamında, minidriver KSPROCESSPIN_INDEXENTRY yapıları dizisine bir işaretçi alır. AVStream, KSPROCESSPIN_INDEXENTRY yapıları dizisini pin kimliğine göre sıralar.

Aşağıdaki kod örnekleri, işlem pin yapılarının nasıl kullanılacağını göstermektedir. Kod, filtre merkezli yakalama sürücüsünün nasıl yazıldığını gösteren AVStream Filter-Centric Simulated Capture Driver (Avssamp) örneğinden alınır. Kaynak kodu ve bu örneğin açıklaması Windows Driver Kit örnekleri indirmesine dahildir.

Minidriver, filtre işlem gönderiminde bir dizi KSPROCESSPIN_INDEXENTRY yapısı alır. Bu örnekte, minidriver, VIDEO_PIN_ID dizinindeki KSPROCESSPIN_INDEXENTRY yapısından ilk KSPROCESSPIN yapısını ayıklar.

NTSTATUS
CCaptureFilter::
Process (
    IN PKSPROCESSPIN_INDEXENTRY ProcessPinsIndex
    )
{
PKSPROCESSPIN VideoPin = NULL;
...
VideoPin = ProcessPinsIndex [VIDEO_PIN_ID].Pins [0];
...
}

Mini sürücü, ProcessPinsIndex [n] öğesinin Count üyesinin en az bir olduğunu doğrulamadan, ya da Pins [0] içinde yer alan KSPIN_DESCRIPTOR_EX yapısının InstancesNecessary üyesinin en az bir olduğunu kontrol etmeden önce ProcessPinsIndex [n].Pins [0]'ı referans almamalıdır. (İkinci doğruysa, pinin mevcut olduğu garanti edilir.)

Ardından, çerçeveleri yakalamak için hangi pimin kullanılacağını belirtmek amacıyla, AVStrMiniFilterProcess geri çağırma yordamı, satıcı tarafından sağlanan yakalama yordamı CaptureFrame'e bir KSPROCESSPIN yapısının işaretçisini geçirir.

VidCapPin -> CaptureFrame (VideoPin, m_Tick);

Yakalama yordamı daha sonra KSPROCESSPIN yapısının Veri üyesine veya üyesinden kopyalama işlemini gerçekleştirebilir. Aşağıdaki örnekte olduğu gibi bu yapının BytesUsed ve Terminate üyelerini de güncelleştirebilir:

RtlCopyMemory ( ProcessPin -> Data,
                m_SynthesisBuffer,
                m_VideoInfoHeader -> bmiHeader.biSizeImage
               );
ProcessPin -> BytesUsed = m_VideoInfoHeader -> bmiHeader.biSizeImage;
ProcessPin -> Terminate = TRUE;

Mini sürücü, geçerli akış işaretçisine ve sabitlemeye karşılık gelen akış üst bilgisi yapısına da erişebilir:

PKSSTREAM_HEADER StreamHeader = ProcessPin -> StreamPointer -> StreamHeader;

Filtre odaklı işleme kullanan çoğu minidriver yalnızca akış üst bilgisi erişimi için akış işaretçisini kullanır. Filtre merkezli modelde AVStream, akış işaretçisini dahili olarak işler. Sonuç olarak, filtre merkezli bir sürücüde akış işaretçisini manipüle eden minidriver'lar dikkatli olmalıdır.