Partager via


Utilisation de la capture WDDM dans DirectShow

[La fonctionnalité associée à cette page, DirectShow, est une fonctionnalité héritée. Il a été remplacé par MediaPlayer, IMFMediaEngine et Audio/Video Capture dans Media Foundation. Ces fonctionnalités ont été optimisées pour Windows 10 et Windows 11. Microsoft recommande vivement au nouveau code d’utiliser MediaPlayer, IMFMediaEngine et La capture audio/vidéo dans Media Foundation au lieu de DirectShow, lorsque cela est possible. Microsoft suggère que le code existant qui utilise les API héritées soit réécrit pour utiliser les nouvelles API si possible.]

Cette rubrique s’applique à Windows Vista et versions ultérieures.

Certaines cartes vidéo disposent d’une fonctionnalité de capture vidéo intégrée. Sur ces cartes, les images vidéo capturées sont placées dans la mémoire vidéo (VRAM). Avant Windows Vista, il n’existait aucun mécanisme standard pour traiter les images pendant qu’elles restaient en VRAM. Au lieu de cela, les données devaient être copiées dans la mémoire système, traitées, puis copiées dans VRAM pour être affichées. Dans Windows Vista, DirectShow prend désormais en charge un mécanisme permettant de conserver les images vidéo dans VRAM tout au long du pipeline de traitement, de la capture à l’affichage.

Le filtre KsProxy détermine si le pilote prend en charge la capture de surface VRAM en interrogeant le pilote pour la propriété KSPROPERTY_PREFERRED_CAPTURE_SURFACE. (Cette propriété est documentée dans la documentation du Kit de pilotes Windows.) Si le pilote prend en charge la capture de surface VRAM, KsProxy alloue un type spécial d’exemple de média qui contient un pointeur vers une surface Direct3D.

Ensuite, KsProxy détermine si le filtre en aval prend en charge DirectX Video Acceleration (DXVA) 2.0, comme suit :

  1. KsProxy interroge la broche d’entrée en aval pour l’interface IMFGetService .
  2. Si le code pin expose IMFGetService, KsProxy appelle IMFGetService::GetService pour l’interface IDirect3DDeviceManager . L’identificateur de service est MR_VIDEO_ACCELERATION_SERVICE.

Ces deux interfaces sont documentées dans la documentation du Kit de développement logiciel (SDK) Media Foundation.

Si le filtre en aval ne prend pas en charge DXVA 2.0, KsProxy alloue une mémoire tampon système supplémentaire. Il utilise cette mémoire tampon pour copier les images vidéo de VRAM vers la mémoire système. La méthode IMediaSample::GetPointer de l’exemple multimédia retourne un pointeur vers cette mémoire tampon système.

Toutefois, si le filtre en aval prend en charge DXVA 2.0, KsProxy n’alloue pas de mémoire tampon système. Dans ce cas, la méthode GetPointer retourne E_NOTIMPL. Au lieu de cela, le filtre en aval doit accéder directement à la surface Direct3D de l’exemple. Il existe deux façons pour le filtre en aval d’obtenir un pointeur vers la surface, toutes deux équivalentes :

  • Interrogez l’exemple pour l’interface IMFGetService et appelez GetService pour l’interface IDirect3DSurface9 . L’identificateur de service est MR_BUFFER_SERVICE.
  • Interrogez l’exemple pour l’interface IMediaSample2Config et appelez IMediaSample2Config::GetSurface.

Rubriques de capture avancée