Partager via


QueryAccept (en aval)

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

Ce mécanisme permet à une broche de sortie de proposer un nouveau format à son homologue en aval. Le nouveau format ne doit pas nécessiter une plus grande taille de mémoire tampon. L’épingle de sortie effectue les opérations suivantes :

  1. Appelle IPin ::QueryAccept ou IPinConnection ::D ynamicQueryAccept sur la broche en aval, pour vérifier si l’autre épingle peut accepter le nouveau type de média (voir illustration, étape A).

  2. Si la valeur de retour de l’étape 1 est S_OK, l’épingle attache le type de média à l’exemple suivant. Pour ce faire, il appelle d’abord IMemAllocator ::GetBuffer pour obtenir l’exemple (B). Ensuite, il appelle IMediaSample ::SetMediaType pour attacher le type de média à cet exemple (C). En attachant le type de média à l’exemple, le filtre indique que le format a changé, en commençant par cet exemple.

  3. La broche livre l’exemple (D).

  4. Lorsque le filtre en aval reçoit l’exemple, il appelle IMediaSample ::GetMediaType pour récupérer le nouveau type de média.

    queryaccept (en aval)

Toutes les broches prennent en charge la méthode QueryAccept. Toutefois, cette méthode est légèrement ambiguë, car une valeur de retour de S_OK ne garantit pas toujours que vous pouvez modifier le format pendant que le graphique est actif. Certains filtres peuvent retourner S_OK mais rejeter la modification si le graphique est actif. La méthode DynamicQueryAccept, prise en charge par certaines broches d’entrée, définit explicitement S_OK pour signifier que l’épingle peut modifier les formats pendant qu’elle est active. Si une broche d’entrée prend en charge l’interface IPinConnection, vous devez appeler DynamicQueryAccept plutôt que QueryAccept.

Dans la plupart des cas, ce mécanisme ne permet pas d’apporter des modifications radicales au format, telles que la modification de la profondeur du bit. Une situation dans laquelle il peut être utilisé est lorsqu’un décodeur vidéo change de palettes. Les détails de base du format restent les mêmes, tels que les dimensions de l’image et la profondeur du bit, mais le nouveau type de média a un ensemble différent d’entrées de palette.

Note de mise en œuvre

Dans les classes de base DirectShow, CBasePin ::QueryAccept appelle la méthode CheckMediaType, également appelée pendant la connexion de broche initiale. Dans le cas d’un filtre de transformation, la méthode CheckMediaType de l'épingle d’entrée doit toujours vérifier si la broche de sortie est connectée et, le cas échéant, si le type de média d’entrée est compatible avec le type de média de sortie. Par conséquent, cette implémentation sera probablement valide pour QueryAccept. Si ce n’est pas le cas, vous devez remplacer QueryAccept pour effectuer des vérifications supplémentaires nécessaires. Notez également que la classe CTransformFilter encapsule cette logique dans les méthodes checkInputType et CheckTransform. Le CTransInPlaceFilter classe, d’autre part, appelle toujours QueryAccept sur le filtre en amont ou en aval suivant.

La méthode CBaseInputPin ::Receive recherche un type de média sur l’exemple entrant et, s’il en existe un, appelle CheckMediaType. Toutefois, elle ne met pas à jour le membre m_mt de l’épingle, qui contient le type de média actuel. Lorsque votre filtre traite l’exemple, vous devez vérifier l’exemple d’un type de média. S’il existe un nouveau type, vous devrez probablement le stocker, soit en appelant SetMediaType sur votre épingle, soit en définissant la valeur de m_mt directement. En revanche, la classe CVideoTransformFilter, conçue pour les filtres de transformation vidéo, stocke le type de média lorsqu’il change. Pour plus d’informations, consultez le code source de CVideoTransformFilter ::Receive dans la bibliothèque de classes de base DirectShow.

Dans certains cas, vous pouvez simplement passer l’appel QueryAccept en aval, puis attacher le type de média à l’exemple de sortie et laisser le filtre en aval gérer la modification du format.