Freigeben über


CBaseStreamControl.CheckStreamState-Methode

[Das dieser Seite zugeordnete Feature DirectShow ist ein Legacyfeature. Es wurde durch MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation ersetzt. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code nach Möglichkeit MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation anstelle von DirectShow verwendet. Microsoft schlägt vor, vorhandenen Code, der die Legacy-APIs verwendet, um nach Möglichkeit die neuen APIs zu verwenden.]

Die CheckStreamState -Methode bestimmt, ob ein Medienbeispiel übermittelt oder verworfen werden soll.

Syntax

enum CheckStreamState(
   IMediaSample *pSample
);

Parameter

pSample

Zeiger auf die IMediaSample-Schnittstelle des Beispiels.

Rückgabewert

Gibt einen der folgenden Werte zurück.

Rückgabecode Beschreibung
STREAM_DISCARDING
Verwerfen Sie dieses Beispiel.
STREAM_FLOWING
Liefern Sie dieses Beispiel.

Bemerkungen

Rufen Sie diese Methode auf, wenn Ihre Pin ein Beispiel empfängt. Geben Sie das Beispiel nur an, wenn der Rückgabewert STREAM_FLOWING ist. Wenn der Rückgabewert STREAM_DISCARDING ist, verwerfen Sie das Beispiel.

Wenn der Pin Beispiele verwirft, sollte er das nächste Von ihr übermittelte Beispiel als Diskontinuität markieren, indem die IMediaSample::SetDiscontinuity-Methode aufgerufen wird .

Wenn Ihr Filter die IAMDroppedFrames-Schnittstelle implementiert, um zu zählen, wie viele Frames er abbricht, zählen Sie einen verworfenen Frame nicht als gelöschten Frame.

Wenn der Rückgabewert STREAM_DISCARDING ist, blockiert die -Methode, bis die Referenzzeit die Startzeit des Beispiels erreicht. Dadurch wird verhindert, dass Ihre Pin Beispiele zu schnell verwirft. Wenn der Filter angehalten wird, ist die Wartezeit unendlich, bis der Filter ausgeführt, angehalten oder Daten geleert wird. (Filterzustandsänderungen und Streaming erfolgen in separaten Threads, sodass dies keinen Deadlock verursacht.)

Die CBaseStreamControl::StreamControlState-Enumeration ist wie folgt definiert:

enum StreamControlState{ 
    STREAM_FLOWING = 0x1000,
    STREAM_DISCARDING
};

Beispiele

Im folgenden Beispiel wird davon ausgegangen, dass der Pin eine Membervariable namens m_fLastSampleDiscarded verwendet, um Unterbrechungen nachzuverfolgen.

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

Anforderungen

Anforderung Wert
Header
Strmctl.h (include Streams.h)
Bibliothek
Strmbase.lib (Einzelhandelsbuilds);
Strmbasd.lib (Debugbuilds)

Siehe auch

CBaseStreamControl-Klasse