Présentation du développement de filtre 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 section décrit brièvement les tâches impliquées dans le développement d’un filtre DirectShow personnalisé. Il fournit également des liens vers des rubriques qui traitent de ces tâches plus en détail. Avant de lire cette section, lisez les rubriques de À propos de DirectShow, qui décrivent l’architecture globale de DirectShow.

Bibliothèque de classes de base DirectShow

Le Kit de développement logiciel (SDK) DirectShow inclut un ensemble de classes C++ pour l’écriture de filtres. Bien qu’elles ne soient pas obligatoires, ces classes sont le moyen recommandé d’écrire un nouveau filtre. Pour utiliser les classes de base, compilez-les dans une bibliothèque statique et liez le fichier .lib à votre projet, comme décrit dans Création de filtres directShow.

La bibliothèque de classes de base définit une classe racine pour les filtres, la classe CBaseFilter . Plusieurs autres classes dérivent de CBaseFilter et sont spécialisées pour des types particuliers de filtres. Par exemple, la classe CTransformFilter est conçue pour les filtres de transformation. Pour créer un filtre, implémentez une classe qui hérite de l’une des classes de filtre. Par exemple, votre déclaration de classe peut être la suivante :

class CMyFilter : public CTransformFilter
{
private:
    /* Declare variables and methods that are specific to your filter.
public:
    /* Override various methods in CTransformFilter */
};

Pour plus d’informations sur les classes de base DirectShow, consultez les rubriques suivantes :

Création d’épingles

Un filtre doit créer une ou plusieurs broches. Le nombre de broches peut être fixe au moment de la conception, ou le filtre peut créer de nouvelles broches en fonction des besoins. Les broches dérivent généralement de la classe CBasePin ou d’une classe qui hérite de CBasePin, telle que CBaseInputPin. Les broches du filtre doivent être déclarées en tant que variables membres dans la classe de filtre. Certaines des classes de filtre définissent déjà les broches, mais si votre filtre hérite directement de CBaseFilter, vous devez déclarer les broches dans votre classe dérivée.

Négociation des connexions de broche

Lorsque le Gestionnaire de graphes de filtre tente de connecter deux filtres, les broches doivent se mettre d’accord sur différents éléments. Si ce n’est pas le cas, la tentative de connexion échoue. En règle générale, les épingles négocient les éléments suivants :

  • Transport. Le transport est le mécanisme que les filtres utiliseront pour déplacer des exemples multimédias de la broche de sortie vers la broche d’entrée. Par exemple, ils peuvent utiliser l’interface IMemInputPin (« modèle push ») ou l’interface IAsyncReader (« modèle pull »).
  • Type de média. Presque toutes les broches utilisent des types de supports pour décrire le format des données qu’elles fournissent.
  • Allocator. L’allocateur est l’objet qui crée les mémoires tampons qui contiennent les données. Les broches doivent convenir de la broche qui fournira l’allocateur. Ils doivent également se mettre d’accord sur la taille des mémoires tampons, le nombre de mémoires tampons à créer et d’autres propriétés de mémoire tampon.

Les classes de base implémentent un framework pour ces négociations. Vous devez compléter les détails en remplaçant différentes méthodes dans la classe de base. L’ensemble de méthodes que vous devez remplacer dépend de la classe et des fonctionnalités de votre filtre. Pour plus d’informations, consultez Comment les filtres se connectent.

Traitement et livraison de données

La fonction principale de la plupart des filtres est de traiter et de fournir des données multimédias. La façon dont cela se produit dépend du type de filtre :

  • Une source push a un thread de travail qui remplit en continu les échantillons avec des données et les fournit en aval.
  • Une source de tirage attend que son voisin en aval demande un exemple. Il répond en écrivant des données dans un exemple et en livrant l’exemple au filtre en aval. Le filtre en aval crée le thread qui pilote le flux de données.
  • Un filtre de transformation a des exemples qui lui sont remis par son voisin amont. Lorsqu’il reçoit un exemple, il traite les données et les remet en aval.
  • Un filtre de convertisseur reçoit des exemples de amont et les planifie pour le rendu en fonction des horodatages.

D’autres tâches liées à la diffusion en continu incluent le vidage des données du graphique, la gestion de la fin du flux et la réponse aux demandes de recherche. Pour plus d’informations sur ces problèmes, consultez les rubriques suivantes :

Prise en charge de COM

Les filtres DirectShow sont des objets COM, généralement empaquetés dans des DLL. La bibliothèque de classes de base implémente une infrastructure pour prendre en charge COM. Il est décrit dans la section DirectShow et COM.

Écriture de filtres DirectShow