CBaseStreamControl.CheckStreamState 方法
[与此页面关联的功能 DirectShow 是一项旧功能。 它已被 MediaPlayer、 IMFMediaEngine 和 媒体基金会中的音频/视频捕获取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能使用 MediaPlayer、 IMFMediaEngine 和 Media Foundation 中的音频/视频捕获 ,而不是 DirectShow。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]
方法 CheckStreamState
确定是应传送还是丢弃媒体样本。
语法
enum CheckStreamState(
IMediaSample *pSample
);
参数
-
pSample
-
指向示例 IMediaSample 接口的指针。
返回值
返回以下值之一。
返回代码 | 说明 |
---|---|
|
放弃此示例。 |
|
提供此示例。 |
备注
当 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.
}
}
要求
要求 | 值 |
---|---|
标头 |
|
库 |
|