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 |
---|---|
|
Rimuovere questo esempio. |
|
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 |
|
Libreria |
|