捕获视频

一旦流处于 KSSTATE_RUN 状态,捕获过程就会开始。 根据打开流时传递的 KS_VIDEOINFOHEADER 结构的 AvgTimePerFrame 成员指定的帧间隔,流会将图像传输到通过SRB_READ_DATA传递的缓冲区中。 有关捕获的图像的其他信息将在追加到 KSSTREAM_HEADER 结构的末尾的 KS_FRAME_INFO 结构中返回。

以下示例代码获取追加的 KS_FRAME_INFO 结构:

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

微型驱动程序应设置有关捕获的数据的其他信息字段,例如捕获的帧、丢弃的帧和字段极性。 帧信息通常存储在驱动程序编写器定义的流扩展的成员中。

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

最好是在转换为KSSTATE_ACQUIRE状态时更新KS_FRAME_INFOKS_VBI_FRAME_INFOKSPROPERTY_DROPPEDFRAMES_CURRENT_SPictureNumberDropCount 成员。

可以在从KSSTATE_ACQUIRE状态转换为KSSTATE_PAUSE状态时更新这些成员。

KSSTATE_PAUSE状态转换为KSSTATE_RUN状态或从KSSTATE_RUN状态转换为KSSTATE_PAUSE状态时,请勿更新 PictureNumberDropCount

如果以前删除了帧,微型驱动程序应设置不连续标志,然后重置其内部标志。 以下代码演示如何设置数据不连续标志:

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

最后,微型驱动程序应放弃对 SRB 的控制,从而完成帧捕获。

CompleteStreamSRB (pSrb);