Запись видео
Когда поток перейдет в состояние 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 или DropCountKS_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 .
Если кадры были удалены ранее, мини-driver должен установить флаг непрерывности, а затем сбросить свой внутренний флаг. В следующем коде показано, как установить флаг неразрывности данных:
if (pStrmEx->fDiscontinuity) {
pDataPacket->OptionsFlags |= KSSTREAM_HEADER_OPTIONSF_DATADISCONTINUITY;
pStrmEx->fDiscontinuity = FALSE;
}
Наконец, мини-диск должен отказаться от управления SRB, завершив захват кадра.
CompleteStreamSRB (pSrb);