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, IMFMediaEngine et Audio/Video Capture in 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 Audio/Video Capture dans Media Foundation au lieu de DirectShow, si 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 graphe de filtre appelle la méthode IPin::Connect , il dispose de 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. Si ce n’est pas le cas, la tentative de connexion échoue.
  • Type de média partiel : Un type de média est partiel 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 qu’une valeur est acceptable. Les broches négocient un type cohérent avec le type partiel.
  • Aucun type de média : Si le Gestionnaire de graphe de filtres 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 fourni par le Gestionnaire de graphe de filtres est de limiter les types de connexions possibles.

Pendant le processus de négociation, la broche 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 soit vide de types et que la connexion échoue.

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

Utilisation des types de média

Dans toute fonction qui reçoit un paramètre AM_MEDIA_TYPE , validez toujours les valeurs de cbFormat et formattype avant de déréférencer 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.
}