次の方法で共有


CBaseStreamControl.CheckStreamState メソッド

[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayerIMFMediaEngine、および Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayerIMFMediaEngineAudio/Video Capture を使用することを強くお勧めします。 Microsoft は、従来の API を使用する既存のコードを、可能であれば新しい API を使用するように書き直すよう提案しています。]

メソッドは CheckStreamState 、メディア サンプルを配信するか破棄するかを決定します。

構文

enum CheckStreamState(
   IMediaSample *pSample
);

パラメーター

pSample

サンプルの IMediaSample インターフェイスへのポインター。

戻り値

次のいずれかの値を返します。

リターン コード 説明
STREAM_DISCARDING
このサンプルを破棄します。
STREAM_FLOWING
このサンプルを配信します。

解説

ピンがサンプルを受け取ったときに、このメソッドを呼び出します。 戻り値がSTREAM_FLOWING場合にのみサンプルを配信します。 戻り値がSTREAM_DISCARDING場合は、サンプルを破棄します。

ピンがサンプルを破棄する場合は、 IMediaSample::SetDiscontinuity メソッドを呼び出して、提供する次のサンプルを不連続としてマークする必要があります。

フィルターで IAMDroppedFrames インターフェイスを実装してドロップしたフレームの数をカウントする場合は、破棄されたフレームをドロップされたフレームとしてカウントしないでください。

戻り値がSTREAM_DISCARDINGされると、メソッドは参照時間がサンプルの開始時刻に達するまでブロックします。 これにより、ピンでサンプルが短時間で破棄されるのを防ぐことができます。 フィルターが一時停止されている場合、フィルターが実行、停止、またはデータをフラッシュするまでの待機時間は無限です。 (フィルター状態の変更とストリーミングは別々のスレッドで行われるので、デッドロックは発生しません)。

CBaseStreamControl::StreamControlState 列挙体は次のように定義されます。

enum StreamControlState{ 
    STREAM_FLOWING = 0x1000,
    STREAM_DISCARDING
};

次の例では、ピンが m_fLastSampleDiscarded という名前のメンバー変数を使用して不連続性を追跡することを前提としています。

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

要件

要件
ヘッダー
Strmctl.h (Stream.h を含む)
ライブラリ
Strmbase.lib (小売ビルド);
Strmbasd.lib (デバッグ ビルド)

関連項目

CBaseStreamControl クラス