Verwenden von WDDM Capture in DirectShow

[Das dieser Seite zugeordnete Feature DirectShow ist ein Legacyfeature. Es wurde von MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation abgelöst. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code mediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation anstelle von DirectShow verwendet, wenn möglich. Microsoft schlägt vor, dass vorhandener Code, der die Legacy-APIs verwendet, so umgeschrieben wird, dass nach Möglichkeit die neuen APIs verwendet werden.]

Dieses Thema gilt für Windows Vista und höher.

Einige Grafikkarten verfügen über integrierte Videoaufnahmefunktionen. Auf diesen Karten werden aufgezeichnete Videoframes im Videospeicher (VRAM) platziert. Vor Windows Vista gab es keinen Standardmechanismus für die Verarbeitung der Frames, während sie in VRAM verblieben. Stattdessen mussten die Daten in den Systemspeicher kopiert, verarbeitet und dann zur Anzeige wieder in VRAM kopiert werden. In Windows Vista unterstützt DirectShow jetzt einen Mechanismus zum Beibehalten der Videoframes in VRAM während der gesamten Verarbeitungspipeline, von der Aufnahme bis zur Anzeige.

Der KsProxy-Filter bestimmt, ob der Treiber die VRAM-Oberflächenerfassung unterstützt, indem er den Treiber nach der KSPROPERTY_PREFERRED_CAPTURE_SURFACE-Eigenschaft fragt. (Diese Eigenschaft ist in der Dokumentation zum Windows Driver Kit dokumentiert.) Wenn der Treiber die VRAM-Oberflächenerfassung unterstützt, ordnet KsProxy eine spezielle Art von Medienbeispiel zu, das einen Zeiger auf eine Direct3D-Oberfläche enthält.

Als Nächstes bestimmt KsProxy wie folgt, ob der Downstreamfilter directX Video Acceleration (DXVA) 2.0 unterstützt:

  1. KsProxy fragt den Downstreameingabepin für die IMFGetService-Schnittstelle ab.
  2. Wenn der Pin IMFGetService verfügbar macht, ruft KsProxy IMFGetService::GetService für die IDirect3DDeviceManager-Schnittstelle auf. Die Dienstidentier-Instanz ist MR_VIDEO_ACCELERATION_SERVICE.

Beide Schnittstellen sind in der Media Foundation SDK-Dokumentation dokumentiert.

Wenn der Downstreamfilter DXVA 2.0 nicht unterstützt, weist KsProxy einen zusätzlichen Systemspeicherpuffer zu. Dieser Puffer wird verwendet, um die Videoframes aus dem VRAM in den Systemspeicher zu kopieren. Die IMediaSample::GetPointer-Methode des Medienbeispiels gibt einen Zeiger auf diesen Systemspeicherpuffer zurück.

Wenn der Downstreamfilter jedoch DXVA 2.0 unterstützt, weist KsProxy keinen Systemspeicherpuffer zu. In diesem Fall gibt die GetPointer-Methode E_NOTIMPL zurück. Stattdessen wird erwartet, dass der Downstreamfilter direkt auf die Direct3D-Oberfläche des Beispiels zugreift. Es gibt zwei Möglichkeiten für den downstream-Filter, um einen Zeiger auf die Oberfläche zu erhalten, die beide gleichwertig sind:

Themen zur erweiterten Erfassung