Metodo CBaseStreamControl.CheckStreamState

[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation. Queste funzionalità sono state ottimizzate per Windows 10 e Windows 11. Microsoft consiglia vivamente che il nuovo codice usi MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation invece di DirectShow, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.

Il CheckStreamState metodo determina se un campione multimediale deve essere recapitato o rimosso.

Sintassi

enum CheckStreamState(
   IMediaSample *pSample
);

Parametri

pSample

Puntatore all'interfaccia IMediaSample dell'esempio.

Valore restituito

Restituisce uno dei valori seguenti.

Codice restituito Descrizione
STREAM_DISCARDING
Rimuovere questo esempio.
STREAM_FLOWING
Distribuire questo esempio.

Commenti

Chiamare questo metodo quando il pin riceve un esempio. Recapitare l'esempio solo se il valore restituito è STREAM_FLOWING. Se il valore restituito è STREAM_DISCARDING, eliminare l'esempio.

Se il pin rimuove tutti gli esempi, deve contrassegnare l'esempio successivo che fornisce come discontinuità, chiamando il metodo IMediaSample::SetDiscontinuity .

Se il filtro implementa l'interfaccia IAMDroppedFrames per contare il numero di fotogrammi che elimina, non contare un frame eliminato come frame eliminato.

Quando il valore restituito è STREAM_DISCARDING, il metodo si blocca fino a quando l'ora di riferimento non raggiunge l'ora di inizio dell'esempio. Ciò impedisce al pin di rimuovere i campioni troppo rapidamente. Se il filtro viene sospeso, il tempo di attesa è infinito, fino a quando il filtro non viene eseguito, arrestato o scarica i dati. Le modifiche e lo streaming dello stato del filtro vengono eseguiti su thread separati, pertanto questo non causa alcun deadlock.

L'enumerazione CBaseStreamControl::StreamControlState è definita come segue:

enum StreamControlState{ 
    STREAM_FLOWING = 0x1000,
    STREAM_DISCARDING
};

Esempio

Nell'esempio seguente si presuppone che il pin usi una variabile membro denominata m_fLastSampleDiscarded per tenere traccia delle discontinuità.

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.
    }
}

Requisiti

Requisito Valore
Intestazione
Strmctl.h (include Streams.h)
Libreria
Strmbase.lib (build retail);
Strmbasd.lib (build di debug)

Vedi anche

Classe CBaseStreamControl