Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Ein pinorientierter AVStream-Minidriver muss mehrere Eigenschaften unterstützen, damit er in VRAM erfasst werden kann. In diesem Abschnitt wird die Abfolge von Anforderungen beschrieben, die der Minidriver vor und während der VRAM-Verarbeitung empfängt.
Bevor die Erfassung initiiert wird, sendet der KS-Proxy eine KSPROPERTY_PREFERRED_CAPTURE_SURFACE get-property-Anforderung. Der Minidriver sollte unterschiedliche Werte zurückgeben, abhängig davon, ob der Treiber in den Systemspeicher oder das VRAM aufzeichnet.
Erfassung in den Systemspeicher
Um in den Systemspeicher zu speichern, geben Sie KS_CAPTURE_ALLOC_SYSTEM_AGP zurück.
Der Aufnahmetreiber empfängt dann eine KSPROPERTY_CURRENT_CAPTURE_SURFACE-Set-Property-Anforderung mit einem Werttyp für den Systemspeicher. Der Aufnahmetreiber fungiert jetzt als Busmaster-DMA-Gerät und platziert die Daten direkt in den Systemspeicher.
In diesem Modus empfängt Aufnahmetreiber Systemspeicherpuffer in der AVStrMiniPinProcess-Rückruffunktion des Ausgabepins.
Informationen zum Implementieren von DMA in Ihrem Pin-Prozess-Callback finden Sie unter Paketbasiertes DMA in AVStream.
Zur Aufnahme mit mehreren Ausgabe-Pins (z. B. separate Video-, Audio- und VBI-Pins) sollte jeder Pin die VRAM-Eigenschaften und -Verarbeitung wie zuvor beschrieben unterstützen. Der Proxy generiert einen separaten Thread für jeden Pin.
Aufzeichnen in VRAM
Wenn Ihr Treiber die VRAM-Erfassung unterstützt, geben Sie KS_CAPTURE_ALLOC_VRAM als Reaktion auf KSPROPERTY_PREFERRED_CAPTURE_SURFACE zurück.
Der Minidriver empfängt als Nächstes eine KSPROPERTY_DISPLAY_ADAPTER_GUID get-property-Anforderung und fragt nach der GUID des Anzeigeadapters ab.
Rufen Sie die Adapter-GUID vom vom Hersteller bereitgestellten Grafik-Miniporttreiber ab. Die DXGK_INTERFACESPECIFICDATA-Struktur enthält die Adapter-GUID, die in der Eigenschaftsanforderung zurückgegeben werden soll. Diese Struktur wird vom DirectX-Grafikkernsystem (DXGK) generiert und beim Initialisieren des Adapters an den Miniporttreiber übergeben.
Wenn der Pin den VRAM-Transport unterstützt und die GUIDs des Anzeigeadapters und des nachgeschalteten Filters übereinstimmen, wird das KS-Proxymodul als Allocator ausgewählt. Der Proxy benachrichtigt den Aufnahme-Pin über die Auswahl des VRAM-Oberflächentransports zwischen den Pins, indem die KSPROPERTY_CURRENT_CAPTURE_SURFACE-Eigenschaft mit dem ausgewählten Oberflächentyp für die Aufnahme festgelegt wird.
Wenn der Pin KS_CAPTURE_ALLOC_VRAM empfängt, erhält er dann VRAM-Verarbeitungsanforderungen.
VRAM-Verarbeitungsanforderungen bestehen aus zwei Teilen. Zunächst empfängt der Aufnahmetreiber eine get-Anforderung von KSPROPERTY_MAP_CAPTURE_HANDLE_TO_VRAM_ADDRESS. Der Get-Handler empfängt ein IRP, das den Kernelmodus-VRAM-Oberflächenhandle enthält.
Der Aufnahmetreiber oder der Display-Miniporttreiber sollten den VRAM-Oberflächenziehpunkt einer tatsächlichen physischen VRAM-Adresse zuordnen. Der VRAM-Oberflächenhandle bleibt nicht dauerhaft gültig; speichern Sie ihn nicht für eine spätere Verwendung.
Gibt die zugeordnete Adresse in der VRAM_SURFACE_INFO_PROPERTY_S zurück, die in der Eigenschaftsanforderung angegeben wurde. Der Aufnahmetreiber kann eine IOCTL ausgeben, um die Zuordnung vom Display-Miniporttreiber anzufordern.
Zweitens wird der AVStrMiniPinProcess des Aufnahmefilters aufgerufen, wenn ein Pin Daten enthält, die verarbeitet werden sollen.
Der Minidriver sollte jetzt KsPinGetLeadingEdgeStreamPointer aufrufen, um den führenden Stream-Zeiger für diesen Pin zu erhalten und zu sperren. Diese Funktion gibt einen Zeiger auf eine KSSTREAM_POINTER Struktur zurück.
Diese Datenstromzeigerstruktur enthält einen Zeiger auf eine KSSTREAM_HEADER.
Suchen Sie im Datenelement des Stream-Headers einen Zeiger auf eine VRAM_SURFACE_INFO-Struktur.
Diese Struktur enthält die physische Adresse, die als Reaktion auf KSPROPERTY_MAP_CAPTURE_HANDLE_TO_VRAM_ADDRESS zurückgegeben wird. Das hSurface-Element , das den Handle darstellt, ist NULL.
Der Aufnahmetreiber sollte:
Programmieren Sie die Aufnahmehardware mit der physischen VRAM-Adresse.
Bearbeiten Sie den Abschluss des Video-Frames.
Füllen Sie das cbCaptured-Element von VRAM_SURFACE_INFO mit der Anzahl der Bytes aus, die in die VRAM-Oberfläche kopiert wurden. Legen Sie das DataUsed-Element von KSSTREAM_HEADER nicht mit der Anzahl der erfassten Bytes fest. Legen Sie stattdessen DataUsed auf sizeof(VRAM_SURFACE_INFO) fest.
Wenn Ihr Aufnahmetreiber Zeitstempel ausführt, legen Sie PresentationTime, Duration und ggf. OptionsFlags in KSSTREAM_HEADER fest.
Rufen Sie KsStreamPointerAdvanceOffsets auf, um die Verarbeitung fortzusetzen oder alle Klone zu löschen und die Anforderung durch Aufrufen von KsStreamPointerDelete abzuschließen.
Die CCapturePin::ProcessD3DSurface-Methode in der Datei Capture.cpp im AVStream-Simulierten Hardware-Beispieltreiber (AVSHwS) in den Windows Driver Kit (WDK) Samples zeigt eine Möglichkeit, diesen Rückruf für die VRAM-Unterstützung zu implementieren.