QueryAccept (en aval)

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

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 taille de mémoire tampon supérieure. La broche 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 broche 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, la broche 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 remet 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 QueryAccept méthode. 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 , qui est prise en charge par certaines broches d’entrée, définit explicitement S_OK pour signifier que la broche peut changer de format lorsqu’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 de modifier radicalement le format, comme la modification de la profondeur de bits. 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 de bits, mais le nouveau type de média a un ensemble différent d’entrées de palette.

Note d’implémentation

Dans les classes de base DirectShow, CBasePin::QueryAccept appelle la méthode CheckMediaType , qui est également appelée lors de la connexion initiale. Dans le cas d’un filtre de transformation, la méthode CheckMediaType de la broche d’entrée doit toujours case activée si la broche de sortie est connectée et, si c’est le cas, 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 afin d’effectuer toutes les vérifications supplémentaires nécessaires. Notez également que la classe CTransformFilter encapsule cette logique dans les méthodes CheckInputType et CheckTransform . La classe CTransInPlaceFilter, quant à elle, appelle QueryAccept toujours le amont suivant ou le filtre en aval.

La méthode CBaseInputPin::Receive recherche un type de média sur l’exemple entrant et, le cas échéant, appelle CheckMediaType. Toutefois, il ne met pas à jour le membre m_mt du code pin, qui contient le type de média actuel. Lorsque votre filtre traite l’exemple, vous devez case activée l’exemple pour un type de média. S’il existe un nouveau type, vous devrez probablement le stocker, soit en appelant SetMediaType sur votre broche, soit en définissant la valeur de m_mt directement. D’autre part, la classe CVideoTransformFilter , qui est 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 le changement de format.