CBaseInputPin.Receive, méthode

La Receive méthode reçoit l’exemple multimé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 retourné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
L’épingle est actuellement vidée ; l’échantillon a été rejeté.
E_POINTER
Argument du 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
La broche est arrêtée.

Notes

L’épingle de sortie en amont appelle cette méthode pour fournir 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 worker.
  • Rejetez l’exemple.

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

Cette méthode est synchrone et peut être bloquée. Si la méthode peut bloquer, la méthode CBaseInputPin::ReceiveCanBlock du code pin 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. S’il 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 avait aucune erreur, la méthode retourne S_OK.

Testez une modification de format comme suit :

  • Si l’exemple prend en charge l’interface IMediaSample2 , vérifiez 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 qui implique dépend entièrement du filtre.) La classe dérivée doit appeler la méthode de classe de base pour rechercher les erreurs décrites précédemment.

Spécifications

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

Voir aussi

CBaseInputPin, classe