CDynamicOutputPin 类

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

CDynamicOutputPin 实现支持动态重新连接和格式更改的输出引脚。

此类派生自 CBaseOutputPin 类,实现 IPinFlowControl 接口。 它支持多个对动态图形生成非常重要的操作:

  • 动态重新连接:当筛选器仍处于活动状态时,引脚可以断开连接并重新连接, (暂停或运行) 。
  • 动态格式更改:当筛选器仍然处于活动状态时,引脚可以协商新的媒体类型,而无需重新连接。
  • 流控制:拥有筛选器 (或应用程序) 可以在不停止筛选器的情况下阻止来自引脚的数据流。

有关详细信息,请参阅 动态图形生成

引脚有三种可能的状态:已阻止、取消阻止和挂起。 在 挂起 状态下,引脚正在等待在另一个线程上完成某些操作,然后引脚将切换到阻止状态。 当引脚被阻止时,筛选器无法通过引脚传递数据,或更改引脚的连接。

若要在多个线程之间协调,拥有筛选器必须遵循某些规则。 (有关筛选器图中线程的详细信息,请参阅 线程和关键部分。) 首先,流式处理线程在调用以下任何方法之前必须始终调用 CDynamicOutputPin::StartUsingOutputPin 方法:

之后,它必须调用 CDynamicOutputPin::StopUsingOutputPin 方法。

其次,应用程序线程不得调用上一列表中的任何方法。 第三,流式处理线程不得调用阻止或取消阻止引脚的类方法。 这些方法是: CDynamicOutputPin::BlockCDynamicOutputPin::SynchronousBlockOutputPinCDynamicOutputPin::AsynchronousBlockOutputPinCDynamicOutputPin::UnblockOutputPin

这些规则可确保应用程序线程在流式处理线程使用引脚时无法阻止该引脚,反之亦然。 流式处理线程调用 StartUsingOutputPin 后,在流式处理线程调用 StopUsingOutputPin 之前,该引脚不会阻止。 相反,如果引脚被阻止, StartUsingOutputPin 将等待,直到该引脚被解除阻止。

为了避免忘记调用 StopUsingOutputPin,可以使用 CAutoUsingOutputPin 类。 当超出范围时,它会自动调用 StopUsingOutputPin

当拥有筛选器在其 IBaseFilter::JoinFilterGraph 方法) (联接或离开筛选器图时,它必须调用引脚的 CDynamicOutputPin::SetConfigInfo 方法。

受保护的成员变量 说明
m_BlockStateLock 保护阻止状态的关键部分。
m_hUnblockOutputPinEvent 未阻止引脚时发出信号的事件。
m_hNotifyCallerPinBlockedEvent 引脚成功阻止或用户取消挂起块时发出信号的事件。
m_BlockState 阻止状态。
m_dwBlockCallerThreadID 上次在此引脚上调用 IPinFlowControl::Block 方法的线程的标识符。
m_dwNumOutstandingOutputPinUsers 使用此引脚的流式处理线程数。
m_hStopEvent 当筛选器停止或引脚刷新数据时发出信号的事件。
m_pGraphConfig 指向 IGraphConfig 接口的指针,用于执行动态重新连接。
m_bPinUsesReadOnlyAllocator 指定引脚分配器中的样本是否为只读的标志。
受保护的方法 说明
SynchronousBlockOutputPin 阻止引脚;在阻止引脚之前不会返回 。
AsynchronousBlockOutputPin 阻止引脚;可能会在阻止引脚之前返回。
UnblockOutputPin 取消阻止固定。
BlockOutputPin 阻止引脚。
WaitEvent 等待,直到指定事件收到信号。
公共方法 说明
CDynamicOutputPin 构造函数方法。
~CDynamicOutputPin 析构函数方法。
SetConfigInfo 指定 IGraphConfig 指针和 stop 事件。
DeliverBeginFlush 请求连接的输入引脚开始刷新操作。
DeliverEndFlush 请求连接的输入引脚以结束刷新操作。
非活动 通知引脚筛选器已停止。
活动 通知引脚筛选器现在处于活动状态。
CompleteConnect 完成与输入引脚的连接。 虚拟。
StartUsingOutputPin 获取对流式处理操作的引脚的访问权限。 虚拟。
StopUsingOutputPin 在流式处理操作后释放对 PIN 的访问权限。 虚拟。
StreamingThreadUsingOutputPin 确定是否有任何线程正在引脚上执行流式处理操作。 虚拟。
ChangeOutputFormat 动态更改连接的媒体类型,并提供新的段信息。
ChangeMediaType 动态更改连接的媒体类型。
DynamicReconnect 使用新媒体类型执行动态重新连接。
IPin 方法 说明
断开连接 断开当前引脚连接。
IPinFlowControl 方法 说明
阻止 阻止或取消阻止固定的数据流。

要求

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

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