Captura de vídeo

Una vez que la secuencia está en estado KSSTATE_RUN , comienza el proceso de captura. Según el intervalo de fotogramas especificado por el miembro AvgTimePerFrame de la estructura KS_VIDEOINFOHEADER pasada cuando se abre la secuencia, la secuencia transfiere imágenes a búferes pasados a través de SRB_READ_DATA. Se devuelve información adicional sobre la imagen capturada en la estructura KS_FRAME_INFO que se anexa al final de la estructura de KSSTREAM_HEADER .

El código de ejemplo siguiente obtiene la estructura de KS_FRAME_INFO anexada:

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

Un minidriver debe establecer campos de información adicionales sobre los datos capturados, como fotogramas capturados, fotogramas quitados y polaridad de campo. La información de fotogramas se almacena generalmente en un miembro de la extensión de secuencia definida por driver-writer.

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

Es óptimo actualizar los miembros PictureNumber o DropCount de KS_FRAME_INFO, KS_VBI_FRAME_INFO o KSPROPERTY_DROPPEDFRAMES_CURRENT_S en la transición al estado KSSTATE_ACQUIRE .

Es aceptable actualizar estos miembros en la transición del estado KSSTATE_ACQUIRE al estado KSSTATE_PAUSE .

No actualice PictureNumber o DropCount en la transición del estado KSSTATE_PAUSE al estado KSSTATE_RUN o al estado de KSSTATE_RUN al estado de KSSTATE_PAUSE .

Si los fotogramas se han quitado anteriormente, el minidriver debe establecer la marca de discontinuidad y, a continuación, restablecer su marca interna. En el código siguiente se muestra cómo establecer la marca de discontinuidad de datos:

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

Por último, el minidriver debe renunciar al control de la SRB, completando la captura de fotogramas.

CompleteStreamSRB (pSrb);