CBaseStreamControl.CheckStreamState 方法

[与此页面关联的功能 DirectShow 是一项旧功能。 它已被 MediaPlayerIMFMediaEngine媒体基金会中的音频/视频捕获取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能使用 MediaPlayerIMFMediaEngineMedia Foundation 中的音频/视频捕获 ,而不是 DirectShow。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]

方法 CheckStreamState 确定是应传送还是丢弃媒体样本。

语法

enum CheckStreamState(
   IMediaSample *pSample
);

参数

pSample

指向示例 IMediaSample 接口的指针。

返回值

返回以下值之一。

返回代码 说明
STREAM_DISCARDING
放弃此示例。
STREAM_FLOWING
提供此示例。

备注

当 PIN 收到示例时,调用此方法。 仅当返回值STREAM_FLOWING时,才传递示例。 如果返回值STREAM_DISCARDING,请放弃示例。

如果引脚放弃任何样本,则应通过调用 IMediaSample::SetDiscontinuity 方法将它提供的下一个样本标记为不连续。

如果筛选器实现 IAMDroppedFrames 接口来计算它丢弃的帧数,则不要将丢弃的帧计数为丢弃的帧。

当返回值STREAM_DISCARDING时, 方法会阻塞,直到引用时间达到样本的开始时间。 这可以防止 Pin 过快丢弃样本。 如果暂停筛选器,则等待时间是无限的,直到筛选器运行、停止或刷新数据。 (筛选器状态更改和流式处理发生在单独的线程上,因此这不会导致任何死锁。)

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 (包括 Streams.h)

Strmbase.lib (零售版本) ;
Strmbasd.lib (调试生成)

另请参阅

CBaseStreamControl 类