CDynamicOutputPin 类
[与此页面关联的功能 DirectShow 是旧版功能。 它已被 MediaPlayer、 IMFMediaEngine 和 Media Foundation 中的音频/视频捕获所取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能在 Media Foundation 中使用 MediaPlayer、 IMFMediaEngine 和 音频/视频捕获 ,而不是 DirectShow。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]
类 CDynamicOutputPin
实现支持动态重新连接和格式更改的输出引脚。
此类派生自 CBaseOutputPin 类,实现 IPinFlowControl 接口。 它支持多个对动态图形生成非常重要的操作:
- 动态重新连接:当筛选器仍处于活动状态时,引脚可以断开连接并重新连接, (暂停或运行) 。
- 动态格式更改:当筛选器仍然处于活动状态时,引脚可以协商新的媒体类型,而无需重新连接。
- 流控制:拥有筛选器 (或应用程序) 可以在不停止筛选器的情况下阻止来自引脚的数据流。
有关详细信息,请参阅 动态图形生成。
引脚有三种可能的状态:已阻止、取消阻止和挂起。 在 挂起 状态下,引脚正在等待在另一个线程上完成某些操作,然后引脚将切换到阻止状态。 当引脚被阻止时,筛选器无法通过引脚传递数据,或更改引脚的连接。
若要在多个线程之间协调,拥有筛选器必须遵循某些规则。 (有关筛选器图中线程的详细信息,请参阅 线程和关键部分。) 首先,流式处理线程在调用以下任何方法之前必须始终调用 CDynamicOutputPin::StartUsingOutputPin 方法:
- CDynamicOutputPin::ChangeOutputFormat
- CDynamicOutputPin::ChangeMediaType
- CDynamicOutputPin::D ynamicReconnect
- CBaseOutputPin::D eliver
- CBaseOutputPin::D eliverEndOfStream
- CBaseOutputPin::D eliverNewSegment
- IMemInputPin::Receive
- IMemInputPin::ReceiveMultiple
- IPin::EndOfStream
- IPin::NewSegment
之后,它必须调用 CDynamicOutputPin::StopUsingOutputPin 方法。
其次,应用程序线程不得调用上一列表中的任何方法。 第三,流式处理线程不得调用阻止或取消阻止引脚的类方法。 这些方法是: CDynamicOutputPin::Block、 CDynamicOutputPin::SynchronousBlockOutputPin、 CDynamicOutputPin::AsynchronousBlockOutputPin 和 CDynamicOutputPin::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 方法 | 说明 |
阻止 | 阻止或取消阻止固定的数据流。 |
要求
要求 | 值 |
---|---|
标头 |
|
库 |
|