Mengambil Video

Setelah aliran dalam status KSSTATE_RUN , proses pengambilan dimulai. Berdasarkan interval bingkai yang ditentukan oleh anggota AvgTimePerFrame dari struktur KS_VIDEOINFOHEADER yang diteruskan saat aliran dibuka, aliran mentransfer gambar ke buffer yang diteruskan melalui SRB_READ_DATA. Informasi tambahan tentang gambar yang diambil dikembalikan dalam struktur KS_FRAME_INFO yang ditambahkan ke akhir struktur KSSTREAM_HEADER .

Contoh kode berikut mendapatkan struktur KS_FRAME_INFO yang ditambahkan:

PKSSTREAM_HEADER pDataPacket = pSrb->CommandData.DataBufferArray;
PKS_FRAME_INFO pFrameInfo = (PKS_FRAME_INFO) (pDataPacket + 1); 

Minidriver harus mengatur bidang informasi tambahan tentang data yang diambil, seperti bingkai yang diambil, bingkai yang dihilangkan, dan polaritas bidang. Informasi bingkai umumnya disimpan dalam anggota ekstensi aliran yang ditentukan penulis driver.

*pFrameInfo = pStrmEx->FrameInfo; // Get the frame info from the minidriver-defined stream extension

Ini optimal untuk memperbarui anggota PictureNumber atau DropCount dari KS_FRAME_INFO, KS_VBI_FRAME_INFO, atau KSPROPERTY_DROPPEDFRAMES_CURRENT_S saat transisi ke status KSSTATE_ACQUIRE .

Dapat diterima untuk memperbarui anggota ini saat transisi dari status KSSTATE_ACQUIRE ke status KSSTATE_PAUSE .

Jangan perbarui PictureNumber atau DropCount saat transisi dari status KSSTATE_PAUSE ke status KSSTATE_RUN atau status KSSTATE_RUN ke status KSSTATE_PAUSE .

Jika bingkai telah dihilangkan sebelumnya, minidriver harus mengatur bendera penghentian lalu mengatur ulang bendera internalnya. Kode berikut menunjukkan pengaturan bendera penghentian data:

if (pStrmEx->fDiscontinuity) {
    pDataPacket->OptionsFlags |= KSSTREAM_HEADER_OPTIONSF_DATADISCONTINUITY;
    pStrmEx->fDiscontinuity = FALSE;
}

Akhirnya, minidriver harus melepaskan kontrol SRB, menyelesaikan pengambilan bingkai.

CompleteStreamSRB (pSrb);