Fourniture d’un Allocator-Presenter personnalisé pour VMR-9

[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.]

Pour utiliser un présentateur-allocator personnalisé avec le filtre Video Mixing Renderer 9 (VMR-9), effectuez les étapes suivantes :

  1. Implémentez une classe qui prend en charge les interfaces IVMRSurfaceAllocator9 et IVMRImagePresenter9 .

  2. Appelez QueryInterface sur le filtre VMR-9 pour l’interface IVMRFilterConfig9 .

  3. Appelez la méthode IVMRFilterConfig9::SetRenderingMode et passez l’indicateur VMR9Mode_Renderless .

  4. QueryInterface sur le filtre VMR-9 pour l’interface IVMRSurfaceAllocatorNotify9 .

  5. Appelez la méthode IVMRSurfaceAllocatorNotify9::AdviseSurfaceAllocator et passez un pointeur vers la méthode IVMRSurfaceAllocator9 de votre allocator-présentateur.

  6. Appelez la méthode IVMRSurfaceAllocator9::AdviseNotify de votre allocator-présentateur et passez un pointeur vers l’interface IVMRSurfaceAllocatorNotify9 du filtre VMR-9.

  7. Dans votre implémentation d’IVMRSurfaceAllocator9::AdviseNotify, appelez IVMRSurfaceAllocatorNotify9::SetD3DDevice Pass dans un pointeur vers l’appareil Direct3D et un handle vers le moniteur où la vidéo apparaîtra.

  8. Dans votre implémentation de la méthode IVMRSurfaceAllocator9::InitializeDevice , Create Direct3D surfaces qui correspondent aux paramètres donnés dans la méthode InitializeDevice . Si vous le souhaitez, vous pouvez utiliser la méthode IVMRSurfaceAllocatorNotify9::AllocateSurfaceHelper du filtre VMR-9 pour allouer ces surfaces. Stockez les pointeurs de surface dans un tableau.

    Notes

    Si vous souhaitez que vmR-9 dessine les images vidéo sur une surface de texture, ajoutez l’indicateur VMR9AllocFlag_TextureSurface à la structure VMR9AllocationInfo . Si l’appareil ne prend pas en charge les textures au format vidéo natif, vous devrez peut-être créer une surface de texture distincte, puis copier les images vidéo de la surface vidéo vers la texture.

     

  9. Pendant la diffusion en continu, vmR-9 obtient des surfaces à partir de l’allocator-présentateur en appelant la méthode IVMRSurfaceAllocator9::GetSurface . VMR-9 spécifie la surface par son index dans le tableau de surfaces (étape 8).

  10. Présentez l’image lorsque le VMR-9 appelle la méthode IVMRImagePresenter9::P resentImage . Les paramètres incluent un pointeur vers la surface Direct3D qui contient l’image vidéo.

  11. Si l’appareil Direct3D est perdu à tout moment, l’allocator-présentateur doit restaurer l’appareil et recréer les surfaces. Par exemple, l’appareil peut être perdu si le mode d’affichage change ou si l’utilisateur déplace la fenêtre vers un autre moniteur. Si l’appareil Direct3D change, appelez la méthode IVMRSurfaceAllocatorNotify9::ChangeD3DDevice du filtre VMR-9.

  12. Lorsque la diffusion en continu s’arrête, le VMR-9 appelle la méthode IVMRSurfaceAllocator9::TerminateDevice . L’allocator-présentateur doit libérer toutes ses ressources Direct3D.

Il existe certaines différences entre le VMR-7 et le VMR-9 dans la façon dont les présentateurs d’allocator personnalisés sont gérés :

  • La méthode AllocateSurfaceHelper du filtre VMR-9 est disponible pour l’allocator-présentateur à utiliser lors de l’allocation de surfaces. Cette méthode rend inutile pour un allocator-présentateur personnalisé de transférer des appels à l’allocator-presenter par défaut. Pour cette raison, le CLSID de l’allocator-présentateur par défaut du filtre VMR-9 n’est pas publié.
  • Contrairement au VMR-7, le VMR-9 ne fournit pas d’allocator-présentateur en mode exclusif DirectDraw spécial. La méthode IVMRSurfaceAllocatorNotify9::AllocateSurfaceHelper rend cet objet inutile.
  • Pour la vidéo entrelacée, le VMR-9 désentlace toujours la vidéo avant de présenter l’image. L’allocator-présentateur n’est plus responsable du désentlacement de l’image avant de l’afficher.

Mode de lecture sans rendu VMR (Allocator-Présentateurs personnalisés)