Freigeben über


VRAM-Erfassungseigenschaften

Ein pinzentrierter AVStream-Minitreiber muss mehrere Eigenschaften unterstützen, damit er in VRAM erfasst werden kann. In diesem Abschnitt wird die Reihenfolge der 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 Minitreiber sollte unterschiedliche Werte zurückgeben, je nachdem, ob der Treiber im Systemspeicher oder VRAM erfasst.

Erfassen im Systemspeicher

Um im Systemspeicher zu erfassen, geben Sie KS_CAPTURE_ALLOC_SYSTEM_AGP zurück.

Der Erfassungstreiber empfängt dann eine KSPROPERTY_CURRENT_CAPTURE_SURFACE Set-Property-Anforderung mit einem Systemspeicherwerttyp. Der Erfassungstreiber fungiert jetzt als Bus-master DMA-Gerät und platziert die Daten direkt im Systemspeicher.

In diesem Modus empfängt der Erfassungstreiber Systemspeicherpuffer in der AVStrMiniPinProcess-Rückruffunktion des Ausgabepins.

Informationen zum Implementieren von DMA in Ihrem Pinprozessrückruf finden Sie unter Paketbasiertes DMA in AVStream.

Um mit mehreren Ausgabepins (für instance, separate Video-, Audio- und VBI-Pins) zu erfassen, sollte jeder Pin die VRAM-Eigenschaften und -Verarbeitung wie zuvor beschrieben unterstützen. Der Proxy generiert einen separaten Thread für jeden Pin.

Erfassen 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, die die GUID der Anzeigekarte abfragt.

Rufen Sie die Adapter-GUID vom vom Hersteller bereitgestellten Grafik-Miniporttreiber ab. Die DXGK_INTERFACESPECIFICDATA-Struktur enthält die Adapter-GUID, die in der Eigenschaftenanforderung zurückgegeben werden soll. Diese Struktur wird vom DXGK-Subsystem (DirectX Graphics Kernel) generiert und beim Initialisieren des Adapters an den Miniporttreiber übergeben.

Wenn der Pin den VRAM-Transport unterstützt und die GUIDs der Anzeigekarte und des Downstreamfilters übereinstimmen, wird das KS-Proxymodul als Zuweisung ausgewählt. Der Proxy benachrichtigt den Aufnahmepin über die Auswahl des VRAM-Oberflächentransports zwischen den Pins, indem er die eigenschaft KSPROPERTY_CURRENT_CAPTURE_SURFACE mit dem ausgewählten Oberflächentyp für die Erfassung festlegt.

Wenn der Pin KS_CAPTURE_ALLOC_VRAM empfängt, empfängt er VRAM-Verarbeitungsanforderungen.

VRAM-Verarbeitungsanforderungen bestehen aus zwei Teilen. Zunächst empfängt der Erfassungstreiber eine Get-Anforderung von KSPROPERTY_MAP_CAPTURE_HANDLE_TO_VRAM_ADDRESS. Der get-Handler empfängt ein IRP, das das VRAM-Oberflächenhandle im Kernelmodus enthält.

Der Erfassungstreiber oder der Anzeige-Miniporttreiber sollte den VRAM Surface Handle einer tatsächlichen physischen VRAM-Adresse zuordnen. Das Handle für die VRAM-Oberfläche bleibt nicht gültig. Speichern Sie es nicht zur späteren Verwendung zwischen.

Gibt die zugeordnete Adresse im VRAM_SURFACE_INFO_PROPERTY_S zurück, die in der Eigenschaftenanforderung angegeben wurde. Der Erfassungstreiber kann eine IOCTL ausstellen, um die Zuordnung vom Anzeige-Miniporttreiber anzufordern.

Zweitens wird der AVStrMiniPinProcess des Erfassungsfilters aufgerufen, wenn ein Pin über zu verarbeitende Daten verfügt.

Der Minidriver sollte jetzt KsPinGetLeadingEdgeStreamPointer aufrufen, um den führenden Streamzeiger für diesen Pin abzurufen und zu sperren. Diese Funktion gibt einen Zeiger auf eine KSSTREAM_POINTER-Struktur zurück.

Diese Streamzeigerstruktur enthält einen Zeiger auf eine KSSTREAM_HEADER.

Suchen Sie im Datenmember des Streamheaders nach einem Zeiger auf eine VRAM_SURFACE_INFO-Struktur.

Diese Struktur enthält die physische Adresse, die als Antwort auf KSPROPERTY_MAP_CAPTURE_HANDLE_TO_VRAM_ADDRESS zurückgegeben wird. Der hSurface-Member , der das Handle darstellt, ist NULL.

Der Erfassungstreiber sollte Folgendes ausführen:

  • Programmieren Sie die Erfassungshardware mit der physischen VRAM-Adresse.

  • Behandeln Sie die Videoframe-Vervollständigung.

  • Füllen Sie den cbCaptured-Member von VRAM_SURFACE_INFO mit der Anzahl der Bytes aus, die in die VRAM-Oberfläche kopiert wurden. Legen Sie den DataUsed-Member von KSSTREAM_HEADER nicht mit der Anzahl der erfassten Bytes fest. Legen Sie stattdessen DataUsed auf sizeof(VRAM_SURFACE_INFO) fest.

  • Wenn Ihr Erfassungstreiber zeitstempelt, legen Sie PresentationTime, Duration und ggf . OptionsFlags in KSSTREAM_HEADER fest.

  • Rufen Sie KsStreamPointerAdvanceOffsets auf, um die Verarbeitung oder das Löschen aller Klonen fortzusetzen und die Anforderung durch Aufrufen von KsStreamPointerDelete abzuschließen.

Die CCapturePin::P rocessD3DSurface-Methode in der Datei Capture.cpp im AVStream Simulated Hardware Sample Driver (AVSHwS) im Windows Driver Kit (WDK) zeigt eine Möglichkeit zum Implementieren dieses Rückrufs für die VRAM-Unterstützung.