Compartilhar via


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);