Étape 3. Prise en charge de la négociation du type de média

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

Il s’agit de l’étape 3 du tutoriel Écriture de filtres de transformation.

Lorsque deux broches se connectent, elles doivent convenir d’un type de média pour la connexion. Le type de média décrit le format des données. Sans le type de média, un filtre peut fournir un type de données, pour qu’un autre filtre les traite comme autre chose.

Le mécanisme de base pour la négociation des types de médias est la méthode IPin::ReceiveConnection . La broche de sortie appelle cette méthode sur la broche d’entrée avec un type de média proposé. La broche d’entrée accepte la connexion ou la rejette. S’il rejette la connexion, la broche de sortie peut essayer un autre type de média. Si aucun type approprié n’est trouvé, la connexion échoue. Si vous le souhaitez, la broche d’entrée peut publier une liste de types qu’elle préfère, via la méthode IPin::EnumMediaTypes . Le code pin de sortie peut utiliser cette liste lorsqu’il propose des types de médias, même s’il n’est pas nécessaire de le faire.

La classe CTransformFilter implémente une infrastructure générale pour ce processus, comme suit :

  • La broche d’entrée n’a aucun type de média préféré. Il s’appuie entièrement sur le filtre amont pour proposer le type de média. Pour les données vidéo, cela est logique, car le type de média inclut la taille de l’image et la fréquence d’images. En règle générale, ces informations doivent être fournies par un filtre source ou un filtre d’analyseur amont. Dans le cas des données audio, l’ensemble des formats possibles étant plus petit, il peut être pratique pour la broche d’entrée d’offrir certains types préférés. Dans ce cas, remplacez CBasePin::GetMediaType sur la broche d’entrée.
  • Lorsque le filtre amont propose un type de média, la broche d’entrée appelle la méthode CTransformFilter::CheckInputType, qui accepte ou rejette le type.
  • La broche de sortie ne se connecte pas, sauf si la broche d’entrée est connectée en premier. Ce comportement est typique pour les filtres de transformation. Dans la plupart des cas, le filtre doit déterminer le type d’entrée avant de pouvoir définir le type de sortie.
  • Lorsque la broche de sortie se connecte, elle a une liste de types de médias qu’elle propose au filtre en aval. Il appelle la méthode CTransformFilter::GetMediaType pour générer cette liste. La broche de sortie essaie également tous les types de médias proposés par le filtre en aval.
  • Pour case activée si un type de sortie particulier est compatible avec le type d’entrée, la broche de sortie appelle la méthode CTransformFilter::CheckTransform.

Les trois méthodes CTransformFilter répertoriées précédemment sont des méthodes virtuelles pures. Votre classe dérivée doit donc les implémenter. Aucune de ces méthodes n’appartient à une interface COM ; elles font simplement partie de l’implémentation fournie par les classes de base.

Les sections suivantes décrivent chaque méthode plus en détail :

Comment les filtres se connectent

Écriture de filtres DirectShow