Partager via


CBaseInputPin.Receive, méthode

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

La Receive méthode reçoit l’exemple de média suivant dans le flux. Cette méthode implémente la méthode IMemInputPin::Receive .

Syntaxe

HRESULT Receive(
   IMediaSample *pSample
);

Paramètres

pSample

Pointeur vers l’interface IMediaSample de l’exemple.

Valeur renvoyée

Retourne une valeur HRESULT . Les valeurs possibles incluent celles répertoriées dans le tableau suivant.

Code de retour Description
S_OK
Opération réussie.
S_FALSE
Broche est en cours de vidage ; l’échantillon a été rejeté.
E_POINTER
Argument pointeur NULL .
VFW_E_INVALIDMEDIATYPE
Type de média non valide.
VFW_E_RUNTIME_ERROR
Une erreur d’exécution s’est produite.
VFW_E_WRONG_STATE
L’épingle est arrêtée.

Notes

Le amont broche de sortie appelle cette méthode pour remettre un exemple à la broche d’entrée. La broche d’entrée doit effectuer l’une des opérations suivantes :

  • Traitez l’exemple avant de retourner.
  • Retournez et traitez l’exemple dans un thread de travail.
  • Rejetez l’exemple.

Si l’épingle utilise un thread de travail pour traiter l’exemple, ajoutez un nombre de références à l’exemple dans cette méthode. Une fois la méthode retournée, l’épingle amont libère l’exemple. Lorsque le nombre de références de l’échantillon atteint zéro, l’échantillon retourne à l’allocateur pour réutilisation.

Cette méthode est synchrone et peut bloquer. Si la méthode peut bloquer, la méthode CBaseInputPin::ReceiveCanBlock de l’épingle doit retourner S_OK.

Dans la classe de base, cette méthode effectue les étapes suivantes :

  1. Appelle la méthode CBaseInputPin::CheckStreaming pour vérifier que l’épingle peut traiter des exemples maintenant. Si elle ne peut pas, par exemple, si l’épingle est arrêtée, la méthode échoue.
  2. Récupère les exemples de propriétés et vérifie si le format a changé (voir ci-dessous).
  3. Si le format a changé, la méthode appelle la méthode CBasePin::CheckMediaType pour déterminer si le nouveau format est acceptable.
  4. Si le nouveau format n’est pas acceptable, la méthode appelle la méthode CBasePin::EndOfStream , publie un événement EC_ERRORABORT et retourne un code d’erreur.
  5. En supposant qu’il n’y a pas eu d’erreurs, la méthode retourne S_OK.

Testez un changement de format comme suit :

  • Si l’exemple prend en charge l’interface IMediaSample2, case activée le membre dwSampleFlags de la structure AM_SAMPLE2_PROPERTIES. Si l’indicateur AM_SAMPLE_TYPECHANGED est présent, le format a changé.
  • Sinon, si l’exemple ne prend pas en charge IMediaSample2, appelez la méthode IMediaSample::GetMediaType . Si la méthode retourne une valeur non NULL , le format a changé.

Dans la classe de base, cette méthode ne traite pas l’exemple. La classe dérivée doit remplacer cette méthode pour effectuer le traitement. (Ce que cela implique dépend entièrement du filtre.) La classe dérivée doit appeler la méthode de classe de base pour case activée pour les erreurs décrites précédemment.

Configuration requise

Condition requise Valeur
En-tête
Amfilter.h (include Streams.h)
Bibliothèque
Strmbase.lib (builds de vente au détail) ;
Strmbasd.lib (builds de débogage)

Voir aussi

CBaseInputPin, classe