Pemrosesan yang ber sentris filter

Jika filter menggunakan pemrosesan yang berpusat pada filter, maka secara default AVStream memanggil rutinitas panggilan balik AVStrMiniFilterProcess yang disediakan minidriver saat ada bingkai data yang tersedia pada setiap instans pin. Minidriver dapat mengubah perilaku default ini dengan mengatur anggota Bendera dari struktur KSPIN_DESCRIPTOR_EX .

Untuk menerapkan pemrosesan yang berpusat pada filter, berikan penunjuk ke rutinitas panggilan balik AVStrMiniFilterProcess yang disediakan minidriver di anggota Proses struktur KSFILTER_DISPATCH . Atur anggota ProsesKSPIN_DISPATCH ke NULL.

AVStream memanggil AVStrMiniFilterProcess hanya ketika semua kondisi berikut terpenuhi:

  • Bingkai tersedia pada pin yang memerlukan bingkai untuk diproses. Minidriver dapat mengubah perilaku pemrosesan dengan mengatur bendera di anggota BenderaKSPIN_DESCRIPTOR_EX. Perhatikan kombinasi bendera yang saling eksklusif KSPIN_FLAG_FRAMES_NOT_REQUIRED_FOR_PROCESSING dan KSPIN_FLAG_SOME_FRAMES_REQUIRED_FOR_PROCESSING. Minidriver juga dapat memodifikasi set pin yang memerlukan bingkai melalui penggunaan rutinitas KsPinAttachAndGate atau KsPinAttachOrGate .

  • Jumlah instans pin sama dengan atau lebih besar dari anggota InstancesNecessary dari struktur KSPIN_DESCRIPTOR_EX . Anggota ClientState dari struktur KSPIN menentukan enumerator KSSTATE tertentu tempat pin saat ini ditetapkan. Setelah InstancesNecessary terpenuhi, pin tambahan dalam status KSSTATE_STOP tidak akan mencegah pemrosesan filter.

  • Jumlah instans pin yang diperlukan terpenuhi (seperti yang ditentukan oleh anggota InstancesNecessary dari struktur KSPIN_DESCRIPTOR_EX .

  • Minidriver belum menutup gerbang kontrol proses filter dengan menggunakan fungsi KSGATEXxx .

Dalam rutinitas panggilan balik AVStrMiniFilterProcess , minidriver menerima penunjuk ke array struktur KSPROCESSPIN_INDEXENTRY . AVStream mengurutkan array struktur KSPROCESSPIN_INDEXENTRY berdasarkan ID pin.

Contoh kode berikut menggambarkan cara menggunakan struktur pin proses. Kode diambil dari sampel AVStream Filter-Centric Simulated Capture Driver (Avssamp), yang menunjukkan cara menulis driver pengambilan yang berpusat pada filter. Kode sumber dan deskripsi sampel ini disertakan dalam unduhan sampel Windows Driver Kit.

Minidriver menerima array struktur KSPROCESSPIN_INDEXENTRY dalam pengiriman proses filternya. Dalam contoh ini, minidriver mengekstrak struktur KSPROCESSPIN pertama dari struktur KSPROCESSPIN_INDEXENTRY indeks VIDEO_PIN_ID:

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

Minidriver tidak boleh mereferensikan ProcessPinsIndex [n]. Sematkan [0] sebelum memverifikasi bahwa anggota CountProcessPinsIndex [n] setidaknya satu, atau bahwa anggota InstancesNecessary dari struktur KSPIN_DESCRIPTOR_EX yang terkandung dalam Pin [0] setidaknya satu. (Jika yang terakhir benar, pin dijamin ada.)

Kemudian, untuk menentukan pin untuk mengambil bingkai, rutinitas panggilan balik AVStrMiniFilterProcess meneruskan pointer ke struktur KSPROCESSPIN ke CaptureFrame, rutinitas pengambilan yang disediakan vendor:

VidCapPin -> CaptureFrame (VideoPin, m_Tick);

Rutinitas pengambilan kemudian dapat menyalin ke atau dari anggota Data dari struktur KSPROCESSPIN. Ini mungkin juga memperbarui anggota BytesUsed dan Penghentian struktur ini, seperti dalam contoh berikut:

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

Minidriver juga dapat mengakses struktur header aliran yang sesuai dengan penunjuk aliran dan pin saat ini:

PKSSTREAM_HEADER StreamHeader = ProcessPin -> StreamPointer -> StreamHeader;

Sebagian besar minidriver yang menggunakan pemrosesan yang ber sentris filter menggunakan penunjuk aliran hanya untuk akses header aliran. Dalam model yang berfokus pada filter, AVStream memanipulasi penunjuk aliran secara internal. Akibatnya, minidriver harus melanjutkan dengan hati-hati jika mereka memanipulasi penunjuk aliran dalam driver yang berpusat pada filter.