Data Flow utilisant des tuyaux isochroneuses
USBCAMD2 commence la diffusion en continu sur le canal isochronous en demandant deux transferts de 32 paquets. Chaque paquet a une taille maximale qui correspond à la taille maximale dans l’autre paramètre sélectionné.
Note Le streaming sur le canal isochronous est indépendant du streaming Microsoft DirectShow.
Les demandes de transfert isochroneuses à double mémoire tampon sont envoyées en continu à USBCAMD2 et ne s’arrêtent que lorsque l’une des deux conditions suivantes se produit :
Un état de flux DirectShow d’arrêt est émis (KSSTATE_STOP).
Le minidriver de l’appareil photo demande à USBCAMD2 d’arrêter la diffusion en continu isochroneuse en passant l’indicateur USBCAMD_STOP_STREAMING dans le paramètre PipeStateFlags dans un appel à USBCAMD_SetIsoPipeState.
Pendant la diffusion en continu, USBCAMD2 et le minidriver de l’appareil photo répètent le processus suivant jusqu’à ce que la diffusion s’arrête :
USBCAMD2 appelle la fonction de rappel CamProcessUSBPacketEx du minidriver de l’appareil photo (à l’adresse IRQL = DISPATCH_LEVEL) pour chaque paquet que l’USBCAMD2 reçoit du pilote de bus USB. Le minidriver de l’appareil photo doit définir les indicateurs d’erreur appropriés en cas de conditions d’erreur. Le minidriver doit également définir un nouvel indicateur d’image vidéo si le début d’une nouvelle image vidéo est détecté à l’aide du paramètre FrameComplete de CamProcessUSBPacketEx.
Une fois que le minidriver de la caméra a déterminé qu’une image vidéo est terminée, USBCAMD2 appelle la fonction de rappel CamProcessRawVideoFrameEx du minidriver de l’appareil photo (à partir du contexte d’un thread de travail) pour traiter l’image vidéo s’il est nécessaire d’effectuer une conversion d’espace de couleur ou une décompression. USBCAMD2 retourne un frame brut complet au pilote de classestream.sys à traiter par le minidriver de l’appareil photo à l’adresse IRQL = PASSIVE_LEVEL. Si les données de trame sont insuffisantes ou si une erreur s’est produite pendant la décompression en raison de données incorrectes, par exemple, le paramètre BytesReturned en CamProcessRawVideoFrameEx doit être défini sur 0.