CBaseRenderer 类

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

cbaserenderer 类层次结构

CBaseRenderer 是用于实现呈现器筛选器的基类。 它支持一个由 CRendererInputPin 类实现的输入引脚。 若要使用此类,请声明继承 的 CBaseRenderer派生类。 派生类至少必须实现以下方法,这些方法在基类中声明为纯虚拟:

基类处理状态更改和同步问题。 它还计划用于呈现的示例,尽管它不实现任何质量控制措施。 基类还声明了多个“处理程序”方法。 这些是筛选器在流式处理过程中的特定点调用的方法。 它们在基类中不执行任何操作,但派生类可以重写它们。 在下表中,它们列在“公共方法:处理程序”标题下。

CBaseRenderer::OnReceiveFirstSample 处理程序应具有特殊的提及。 如果在筛选器暂停时收到示例,筛选器将调用此方法。 如果图形从“已停止”切换到“已暂停”,或者在暂停时查找图形,则可能会发生这种情况。 视频呈现器通常使用示例来显示静止帧。 当筛选器从暂停切换到正在运行时,它会将相同的示例发送到 CBaseRenderer::D oRenderSample 方法,作为流中的第一个示例。

CBaseRenderer通过 CRendererPosPassThru 对象公开 IMediaSeekingIMediaPosition 接口。 它将所有搜寻请求传递到下一个筛选器上游。

计划

当上游筛选器调用输入引脚的 IMemInputPin::Receive 方法来传递示例时,引脚会将此调用传递给筛选器的 CBaseRenderer::Receive 方法。 筛选器会删除示例,立即呈现它,或者计划它进行呈现。

如果示例没有时间戳,或者没有可用的参考时钟,筛选器将立即呈现示例。 否则,筛选器会调用 CBaseRenderer::ShouldDrawSampleNow 方法来确定要执行的操作。 默认情况下,根据示例的时间戳来计划该示例。 派生类可以替代 ShouldDrawSampleNow 以支持质量控制。

为了计划示例,筛选器调用 IReferenceClock::AdviseTime 方法,该方法创建建议请求。 然后 ,Receive 方法会阻止,直到计划的时间或筛选器更改状态。 阻止会阻止上游筛选器在呈现当前样本之前传递更多样本。

当上游筛选器调用 IPin::EndOfStream 方法以向流结束发出信号时,筛选器会将EC_COMPLETE事件发送到筛选器图管理器。 筛选器在发送事件之前等待当前样本的停止时间。

受保护的成员变量 说明
m_bAbort 指示是否停止呈现并拒绝进一步示例的标志。
m_bEOS 指示是否已到达流结束的标志。
m_bEOSDelivered 指示筛选器是否已发布EC_COMPLETE事件的标志。
m_bInReceive 指示筛选器是否正在处理 接收 调用的标志。
m_bRepaintStatus 启用或禁用重绘事件的标志。
m_bStreaming 指示筛选器是否为流数据的标志。
m_dwAdvise 计划呈现的计时器事件的标识符。
m_EndOfStreamTimer 计时器事件标识符,用于计划EC_COMPLETE通知。
m_evComplete 状态转换完成时发出信号的事件。
m_InterfaceLock 筛选器状态锁。
m_ObjectCreationLock 锁定以保护在筛选器内创建对象。
m_pInputPin 指向筛选器的输入引脚的指针。
m_pMediaSample 指向当前媒体示例的指针。
m_pPosition 帮助程序对象,用于上游传递 seek 命令。
m_pQSink 指向接收质量控制消息的 对象的指针。
m_RendererLock 流式处理锁。
m_RenderEvent 用于计划呈现的事件。
m_SignalTime 当前样本的停止时间。
m_ThreadSignal 用于释放流式处理线程的事件。
公共方法 说明
CancelNotification 取消计划呈现的计时器事件。 虚拟。
CBaseRenderer 构造函数方法。
~CBaseRenderer 析构函数方法。
GetMediaPositionInterface 检索筛选器的 IMediaPositionIMediaSeeking 接口指针。 虚拟。
GetPin 检索图钉。 虚拟。
GetPinCount 检索引脚数。 虚拟。
GetSampleTimes 从样本中检索时间戳。 虚拟。
OnDisplayChange EC_DISPLAY_CHANGED 事件发布到筛选器图管理器。
PrepareReceive 准备呈现示例。 虚拟。
接收 接收流中的下一个媒体示例。 虚拟。
呈现 呈现示例。 虚拟。
ScheduleSample 计划用于呈现的示例。 虚拟。
SendNotifyWindow 通知视频窗口句柄的上游筛选器。
SendRepaint 将重绘事件发送到筛选器关系图管理器。
SetMediaType 在设置引脚的媒体类型时调用。 虚拟。
SignalTimerFired 清除用于计划呈现的计时器标识符。
SourceThreadCanWait 保留或释放流式处理线程。 虚拟。
WaitForReceiveToComplete 等待 CBaseRenderer::Receive 方法完成。
WaitForRenderTime 等待当前示例的演示时间。 虚拟。
公共方法:访问器方法 说明
ClearPendingSample 释放当前示例。 虚拟。
GetCurrentSample 检索当前示例。 虚拟。
GetRealState 检索筛选器状态。
GetRenderEvent 检索计划呈现的事件。
HaveCurrentSample 确定筛选器是否具有样本。 虚拟。
IsEndOfStream 查询是否已收到流结束通知。
IsEndOfStreamDelivered 查询EC_COMPLETE事件是否已传递到筛选器图管理器。
IsStreaming 查询筛选器是否为流式处理数据。
SetAbortSignal 设置一个标志,该标志指示是否停止呈现并拒绝进一步的样本。
SetRepaintStatus 启用或禁用重绘事件。
公共方法:State-Change方法 说明
活动 当状态切换为已暂停或正在运行时调用。 虚拟。
BeginFlush 开始刷新操作。 虚拟。
BreakConnect 从连接释放输入引脚。 虚拟。
CheckReady 查询状态转换是否已完成。
CompleteConnect 完成输入引脚与另一个引脚的连接。 虚拟。
CompleteStateChange 确定到暂停状态的转换是否完成。 虚拟。
EndFlush 结束刷新操作。 虚拟。
非活动 在状态切换为停止时调用。 虚拟。
NotReady 指示状态转换尚未完成。
准备 指示状态转换已完成。
StartStreaming 当筛选器切换到运行状态时启动流式处理。 虚拟。
停止流式处理 当筛选器退出运行状态时停止流式处理。 虚拟。
公共方法:流结束方法 说明
EndOfStream 通知筛选器输入引脚收到了流结束通知。 虚拟。
NotifyEndOfStream EC_COMPLETE 事件发布到筛选器关系图管理器。
ResetEndOfStream 重置流结束标志。
ResetEndOfStreamTimer 取消计划EC_COMPLETE通知的计时器。 虚拟。
SendEndOfStream 如果已到达流结束,则为筛选器图管理器计划EC_COMPLETE事件。 虚拟。
TimerCallback 流结束计时器事件的回调方法。
公共方法:处理程序 说明
OnReceiveFirstSample 当筛选器在暂停时收到样本时调用。 虚拟。
OnRenderEnd 在呈现示例后调用。 虚拟。
OnRenderStart 在呈现即将开始时调用。 虚拟。
OnStartStreaming 在筛选器开始流式处理时调用。 虚拟。
OnStopStreaming 在筛选器停止流式处理时调用。 虚拟。
OnWaitEnd 在筛选器完成等待示例的呈现时间时调用。 虚拟。
OnWaitStart 当筛选器开始等待示例的呈现时间时调用。 虚拟。
PrepareRender 在筛选器呈现示例之前调用。 虚拟。
ShouldDrawSampleNow 确定如何计划示例进行呈现。 虚拟。
纯虚拟方法 说明
CheckMediaType 确定筛选器是否接受特定媒体类型。
DoRenderSample 呈现示例。
IMediaFilter 方法 说明
GetState 检索筛选器的状态 (运行、停止或暂停) 。
暂停 暂停筛选器。
运行 运行筛选器。
停止 停止筛选器。
IBaseFilter 方法 说明
FindPin 检索具有指定标识符的引脚。

要求

要求
标头
Renbase.h (包括 Streams.h)

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