Ouverture et fermeture d’un flux
L’interface de classe Stream envoie une demande de SRB_OPEN_STREAM à un minidriver de classe Stream pour ouvrir un flux avec le format vidéo sélectionné. Les informations transmises dans SRB_OPEN_STREAM incluent l’index du flux à ouvrir et un pointeur vers un pointeur vers une structure KS_VIDEOINFOHEADER . L’index de flux correspond à l’index du flux dans le tableau de structures KS_DATARANGE_VIDEO retournées par le minidriver en réponse à une demande de SRB_GET_STREAM_INFO antérieure. Pour plus d’informations sur la gestion des SRB_GET_STREAM_INFO, consultez Catégories de flux.
L’exemple de code suivant obtient l’index de flux, le format de données de diffusion en continu du noyau et l’en-tête d’informations vidéo de streaming du noyau.
int StreamNumber = pSrb->StreamObject->StreamNumber;
PKS_DATAFORMAT_VIDEOINFOHEADER pKSDataFormat =
(PKS_DATAFORMAT_VIDEOINFOHEADER) pSrb->CommandData.OpenFormat;
PKS_VIDEOINFOHEADER pVideoInfoHdrRequested =
&pKSDataFormat->VideoInfoHeader;
Les minidrivers doivent vérifier qu’ils peuvent prendre en charge le format de flux demandé. En particulier, le contenu de la structure KS_BITMAPINFOHEADER doit être vérifié, ainsi que les informations de rognage et de mise à l’échelle spécifiées par les membres rcSource et rcTarget .
Si le matériel de l’appareil ne peut pas prendre en charge la fréquence d’images de capture demandée dans le membre AvgTimePerFrame de KS_VIDEOINFOHEADER, il doit toujours sélectionner la fréquence d’images inférieure suivante disponible. Par exemple, si une caméra peut prendre en charge une fréquence d’images de capture de 7 images par seconde (fps) et de 15 images/s, et si une application cliente tente d’ouvrir le flux à une fréquence d’images de capture de 10 images/s, la caméra doit créer un flux physique de 7 images par seconde.
Pour une capture de dix secondes dans laquelle les 70 images physiques disponibles sont capturées, le minidriver doit signaler 100 images capturées, dont 30 images ont été supprimées par la propriété KSPROPERTY_DROPPEDFRAMES_CURRENT .
Des règles spéciales s’appliquent lorsque la mémoire tampon de sortie est une surface DirectDraw. Dans ce cas, le membre biWidth de la structure KS_BITMAPINFOHEADER représente en fait la foulée de la surface DirectDraw de destination, qui est généralement supérieure à la largeur de l’image vidéo. La foulée d’une surface est généralement la largeur de la surface multipliée par sa profondeur d’octets. Par exemple, pour une surface de 640 pixels de large avec une profondeur de couleur de 32 bits par pixel, la foulée est de 2 560 octets.
Pour déterminer la largeur d’image demandée, utilisez l’exemple de code suivant :
if (IsRectEmpty(&pVideoInfoHdrRequested->rcTarget) {
Width = pVideoInfoHdrRequested->bmiHeader.biWidth;
Height = pVideoInfoHdrRequested->bmiHeader.biHeight;
}
else {
Width = pVideoInfoHdrRequested->rcTarget.right −
pVideoInfoHdrRequested->rcTarget.left;
Height = pVideoInfoHdrRequested->rcTarget.bottom −
pVideoInfoHdrRequested->rcTarget.top;
}
L’interface de classe Stream envoie une requête SRB_CLOSE_STREAM au minidriver pour fermer un flux. Le minidriver doit ensuite renvoyer tous les SDR de flux en attente à l’interface de classe Stream.