Capturando vídeo
Depois que o fluxo estiver no estado KSSTATE_RUN , o processo de captura será iniciado. Com base no intervalo de quadro especificado pelo membro AvgTimePerFrame da estrutura KS_VIDEOINFOHEADER passada quando o fluxo é aberto, o fluxo transfere imagens para buffers passados por SRB_READ_DATA. Informações adicionais sobre a imagem capturada são retornadas na estrutura KS_FRAME_INFO acrescentada ao final da estrutura KSSTREAM_HEADER .
O código de exemplo a seguir obtém a estrutura KS_FRAME_INFO acrescentada:
PKSSTREAM_HEADER pDataPacket = pSrb->CommandData.DataBufferArray;
PKS_FRAME_INFO pFrameInfo = (PKS_FRAME_INFO) (pDataPacket + 1);
Um minidriver deve definir campos de informações adicionais sobre os dados capturados, como quadros capturados, quadros removidos e polaridade de campo. As informações de quadro geralmente são armazenadas em um membro da extensão de fluxo definida pelo driver-writer.
*pFrameInfo = pStrmEx->FrameInfo; // Get the frame info from the minidriver-defined stream extension
É ideal atualizar os membros PictureNumber ou DropCount de KS_FRAME_INFO, KS_VBI_FRAME_INFO ou KSPROPERTY_DROPPEDFRAMES_CURRENT_S em transição para o estado KSSTATE_ACQUIRE .
É aceitável atualizar esses membros na transição do estado KSSTATE_ACQUIRE para o estado KSSTATE_PAUSE .
Não atualize PictureNumber ou DropCount na transição do estado KSSTATE_PAUSE para o estado KSSTATE_RUN ou o estado KSSTATE_RUN para o estado KSSTATE_PAUSE .
Se os quadros tiverem sido removidos anteriormente, o minidriver deverá definir o sinalizador de descontinuidade e, em seguida, redefinir seu sinalizador interno. O código a seguir demonstra como definir o sinalizador de descontinuidade de dados:
if (pStrmEx->fDiscontinuity) {
pDataPacket->OptionsFlags |= KSSTREAM_HEADER_OPTIONSF_DATADISCONTINUITY;
pStrmEx->fDiscontinuity = FALSE;
}
Por fim, o minidriver deve renunciar ao controle do SRB, concluindo a captura de quadros.
CompleteStreamSRB (pSrb);