Запись видео

После того как поток находится в состоянии KSSTATE_RUN , процесс записи начинается. На основе интервала кадров, указанного членом AvgTimePerFrame структуры KS_VIDEOINFOHEADER , передаваемой при открытии потока, поток передает изображения в буферы, передаваемые через SRB_READ_DATA. Дополнительные сведения о захваченном изображении возвращаются в структуре KS_FRAME_INFO , которая добавляется в конец структуры KSSTREAM_HEADER .

Следующий пример кода получает добавленную 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

Наиболее эффективно обновлять элементы PictureNumber или DropCount в KS_FRAME_INFO, KS_VBI_FRAME_INFO или KSPROPERTY_DROPPEDFRAMES_CURRENT_S при переходе в состояние KSSTATE_ACQUIRE.

Можно обновить эти члены при переходе из состояния KSSTATE_ACQUIRE в состояние KSSTATE_PAUSE .

Не обновляйте pictureNumber или DropCount при переходе из состояния KSSTATE_PAUSE в состояние KSSTATE_RUN или состояние KSSTATE_RUN в состояние KSSTATE_PAUSE .

Если кадры были удалены ранее, минидрайвер должен установить флаг разрывности, а затем сбросить его внутренний флаг. Следующий код демонстрирует настройку флага прекращения данных:

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

Наконец, минидрайвер должен освободить управление SRB, завершив захват кадра.

CompleteStreamSRB (pSrb);