Freigeben über


Öffnen und Schließen eines Streams

Die Stream-Klassenschnittstelle sendet eine SRB_OPEN_STREAM-Anforderung an einen Stream-Klassen-Minidriver, um einen Stream mit dem ausgewählten Videoformat zu öffnen. Informationen, die SRB_OPEN_STREAM übergeben werden, umfassen den Index des zu öffnenden Datenstroms und einen Zeiger auf einen Zeiger auf eine KS_VIDEOINFOHEADER-Struktur . Der Streamindex entspricht dem Index des Datenstroms im Array der KS_DATARANGE_VIDEO Strukturen, die vom Minidriver als Reaktion auf eine frühere SRB_GET_STREAM_INFO-Anforderung zurückgegeben wurden. Weitere Informationen zur Behandlung von SRB_GET_STREAM_INFO finden Sie unter Stream Categories.

Der folgende Beispielcode ruft den Streamindex, das Kernelstreamingdatenformat und den Header für die Kernelstreamingvideo-Info ab.

int StreamNumber = pSrb->StreamObject->StreamNumber;
PKS_DATAFORMAT_VIDEOINFOHEADER  pKSDataFormat = 
    (PKS_DATAFORMAT_VIDEOINFOHEADER) pSrb->CommandData.OpenFormat;
PKS_VIDEOINFOHEADER pVideoInfoHdrRequested = 
    &pKSDataFormat->VideoInfoHeader;

Minidriver sollten überprüfen, ob sie das angeforderte Streamformat unterstützen können. Insbesondere sollte der Inhalt der KS_BITMAPINFOHEADER-Struktur überprüft werden, zusammen mit Den Zuschneide- und Skalierungsinformationen, die von den Membern rcSource und rcTarget angegeben werden.

Wenn die Gerätehardware die im AvgTimePerFrame-Member von KS_VIDEOINFOHEADER angeforderte Aufnahmebildrate nicht unterstützen kann, sollte immer die nächstniedrigte verfügbare Bildfrequenz ausgewählt werden. Wenn eine Kamera beispielsweise eine Aufnahmebildrate von 7 Bildern pro Sekunde (fps) und 15 fps unterstützen kann und eine Clientanwendung versucht, den Stream mit einer Aufnahmebildrate von 10 fps zu öffnen, sollte die Kamera einen physischen Datenstrom von 7 fps erstellen.

Für eine Zehn-Sekunden-Aufnahme, in der alle 70 verfügbaren physischen Frames erfasst werden, sollte der Minidriver 100 erfasste Frames melden, von denen 30 Frames von der KSPROPERTY_DROPPEDFRAMES_CURRENT-Eigenschaft gelöscht wurden.

Besondere Regeln gelten, wenn der Ausgabepuffer eine DirectDraw-Oberfläche ist. In diesem Fall stellt das biWidth-Element der KS_BITMAPINFOHEADER-Struktur tatsächlich den Schritt der DirectDraw-Zieloberfläche dar, die in der Regel größer als die Breite des Videobilds ist. Der Schritt einer Oberfläche ist in der Regel die Breite der Oberfläche multipliziert mit ihrer Bytetiefe. Bei einer Oberfläche mit einer Breite von 640 Pixeln mit einer Farbtiefe von 32 Bits pro Pixel würde der Schritt beispielsweise 2560 Bytes betragen.

Verwenden Sie das folgende Codebeispiel, um die angeforderte Bildbreite zu bestimmen:

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

Die Stream-Klassenschnittstelle sendet eine SRB_CLOSE_STREAM-Anforderung an den Minitreiber, um einen Stream zu schließen. Der Minidriver sollte dann alle ausstehenden Stream-SRBs an die Stream-Klassenschnittstelle zurückgeben.