Partager via


Négociation des types de supports

[La fonctionnalité associée à cette page, DirectShow, est une fonctionnalité héritée. Il a été remplacé par MediaPlayer, IMFMediaEngineet audio/vidéo capture dans Media Foundation. Ces fonctionnalités ont été optimisées pour Windows 10 et Windows 11. Microsoft recommande vivement que le nouveau code utilise MediaPlayer, IMFMediaEngine et 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.]

Lorsque le Gestionnaire de graphes de filtre appelle la méthode IPin ::Connect, elle propose plusieurs options pour spécifier un type de média :

  • Type complet : Si le type de média est entièrement spécifié, les broches tentent de se connecter à ce type. S’ils ne peuvent pas, la tentative de connexion échoue.
  • type de média partiel : type de média A est partielle si le type principal, le sous-type ou le type de format est GUID_NULL. La valeur GUID_NULL agit comme un caractère générique, indiquant que toute valeur est acceptable. Les broches négocient un type cohérent avec le type partiel.
  • Aucun type de média : Si le Gestionnaire de graphes de filtre transmet un pointeur NULL, les broches peuvent accepter n’importe quel type de média acceptable pour les deux broches.

Si les broches se connectent, la connexion a toujours un type de média complet. L’objectif du type de média donné par le Gestionnaire de graphes de filtre est de limiter les types de connexion possibles.

Pendant le processus de négociation, l’épingle de sortie propose un type de média en appelant la méthode IPin ::ReceiveConnection de la broche d’entrée. La broche d’entrée peut accepter ou rejeter le type proposé. Ce processus se répète jusqu’à ce que la broche d’entrée accepte un type, ou que la broche de sortie s’exécute hors des types et que la connexion échoue.

La façon dont une broche de sortie sélectionne les types de supports à proposer dépend de l’implémentation. Dans les classes de base DirectShow, l’épingle de sortie appelle IPin ::EnumMediaTypes sur la broche d’entrée. Cette méthode retourne un énumérateur qui énumère les types de supports préférés de la broche d’entrée. En cas d’échec, l’épingle de sortie énumère ses propres types préférés.

utiliser des types de supports

Dans n’importe quelle fonction qui reçoit un paramètre AM_MEDIA_TYPE, validez toujours les valeurs de cbFormat et type de format avant de déreferencer le membre pbFormat. Le code suivant est incorrect :

if (pmt->formattype == FORMAT_VideoInfo)
{
    VIDEOINFOHEADER *pVIH = (VIDEOINFOHEADER*)pmt->pbFormat;
    // Wrong!
}

Le code suivant est correct :

if ((pmt->formattype == FORMAT_VideoInfo) && 
    (pmt->cbFormat > sizeof(VIDEOINFOHEADER) &&
    (pbFormat != NULL))
{
    VIDEOINFOHEADER *pVIH = (VIDEOINFOHEADER*)pmt->pbFormat;
    // Now you can dereference pVIH.
}