Capture vidéo
Une fois que le flux est dans l’état KSSTATE_RUN , le processus de capture commence. En fonction de l’intervalle de trame spécifié par le membre AvgTimePerFrame de la structure KS_VIDEOINFOHEADER passée lors de l’ouverture du flux, le flux transfère les images dans des mémoires tampons passées via SRB_READ_DATA. Des informations supplémentaires sur l’image capturée sont retournées dans la structure KS_FRAME_INFO qui est ajoutée à la fin de la structure KSSTREAM_HEADER .
L’exemple de code suivant obtient la structure KS_FRAME_INFO ajoutée :
PKSSTREAM_HEADER pDataPacket = pSrb->CommandData.DataBufferArray;
PKS_FRAME_INFO pFrameInfo = (PKS_FRAME_INFO) (pDataPacket + 1);
Un minidriver doit définir des champs d’informations supplémentaires sur les données capturées, telles que les images capturées, les images supprimées et la polarité des champs. Les informations de trame sont généralement stockées dans un membre de l’extension de flux définie par l’enregistreur de pilotes.
*pFrameInfo = pStrmEx->FrameInfo; // Get the frame info from the minidriver-defined stream extension
Il est optimal de mettre à jour les membres PictureNumber ou DropCount de KS_FRAME_INFO, KS_VBI_FRAME_INFO ou KSPROPERTY_DROPPEDFRAMES_CURRENT_S lors de la transition vers l’état KSSTATE_ACQUIRE .
Il est acceptable de mettre à jour ces membres lors de la transition de l’état KSSTATE_ACQUIRE à l’état KSSTATE_PAUSE .
Ne mettez pas à jour PictureNumber ou DropCount lors de la transition de l’état KSSTATE_PAUSE à l’état KSSTATE_RUN ou de l’état KSSTATE_RUN à l’état KSSTATE_PAUSE .
Si les images ont été précédemment supprimées, le minidriver doit définir l’indicateur de discontinuité, puis réinitialiser son indicateur interne. Le code suivant illustre la définition de l’indicateur de discontinuité des données :
if (pStrmEx->fDiscontinuity) {
pDataPacket->OptionsFlags |= KSSTREAM_HEADER_OPTIONSF_DATADISCONTINUITY;
pStrmEx->fDiscontinuity = FALSE;
}
Enfin, le minidriver doit abandonner le contrôle du SRB, en effectuant la capture du cadre.
CompleteStreamSRB (pSrb);