Partager via


Méthode CBaseStreamControl.CheckStreamState

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

La CheckStreamState méthode détermine si un exemple multimédia doit être remis ou ignoré.

Syntaxe

enum CheckStreamState(
   IMediaSample *pSample
);

Paramètres

pSample

Pointeur vers l’interface IMediaSample de l’exemple.

Valeur renvoyée

Retourne l’une des valeurs suivantes.

Code de retour Description
STREAM_DISCARDING
Ignorez cet exemple.
STREAM_FLOWING
Fournissez cet exemple.

Notes

Appelez cette méthode lorsque votre broche reçoit un exemple. Remettre l’exemple uniquement si la valeur de retour est STREAM_FLOWING. Si la valeur de retour est STREAM_DISCARDING, ignorez l’exemple.

Si la broche ignore des exemples, elle doit marquer l’exemple suivant qu’elle fournit comme une discontinuité, en appelant la méthode IMediaSample::SetDiscontinuity .

Si votre filtre implémente l’interface IAMDroppedFrames pour compter le nombre d’images qu’il supprime, ne comptez pas une image ignorée comme image supprimée.

Lorsque la valeur de retour est STREAM_DISCARDING, la méthode se bloque jusqu’à ce que l’heure de référence atteigne l’heure de début de l’exemple. Cela empêche votre épingle d’ignorer les échantillons trop rapidement. Si le filtre est suspendu, le temps d’attente est infini, jusqu’à ce que le filtre exécute, arrête ou vide les données. (Les changements d’état de filtre et la diffusion en continu se produisent sur des threads distincts, ce qui ne provoque pas d’interblocage.)

L’énumération CBaseStreamControl::StreamControlState est définie comme suit :

enum StreamControlState{ 
    STREAM_FLOWING = 0x1000,
    STREAM_DISCARDING
};

Exemples

L’exemple suivant part du principe que la broche utilise une variable membre nommée m_fLastSampleDiscarded pour effectuer le suivi des discontinuités.

CMyPin::Receive(IMediaSample *pSample)
{
    if (!pSample) return E_POINTER;

    int iStreamState = CheckStreamState(pSample);
    if (iStreamState == STREAM_FLOWING) 
    {
        if (m_fLastSampleDiscarded)
            pSample->SetDiscontinuity(TRUE);
        m_fLastSampleDiscarded = FALSE;
        /* Deliver the sample. */
    } 
    else 
    {
        m_fLastSampleDiscarded = TRUE;  
       // Discard this sample. Do not deliver it.
    }
}

Configuration requise

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

Voir aussi

Classe CBaseStreamControl