CBasePin 连接过程
[与此页面关联的功能 DirectShow 是旧版功能。 它已被 MediaPlayer、 IMFMediaEngine 和 Media Foundation 中的音频/视频捕获所取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能在 Media Foundation 中使用 MediaPlayer、 IMFMediaEngine 和 音频/视频捕获 ,而不是 DirectShow。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]
本部分介绍 CBasePin 类如何实现引脚连接过程。
Filter Graph 管理器启动所有引脚连接。 它调用输出引脚的 IPin::Connect 方法,指定输入引脚。 输出引脚通过调用输入引脚的 IPin::ReceiveConnection 方法完成连接。 输入引脚可以接受或拒绝连接。
Filter Graph 管理器还可以为连接指定媒体类型。 如果是这样,则引脚会尝试与该类型连接。 否则,引脚必须协商类型。 Filter Graph 管理器还可以指定 部分 媒体类型,该类型具有主要类型、子类型或格式类型的值GUID_NULL。 在这种情况下,引脚会尝试匹配指定媒体类型的任一部分;值GUID_NULL充当通配符。
CBasePin::Connect 方法首先验证引脚是否可以接受连接。 例如,它会检查引脚是否已连接。 它将连接过程的其余部分委托给 CBasePin::AgreeMediaType 方法。 随后的所有内容均由 AgreeMediaType 执行。
如果媒体类型已完全指定,则引脚将调用 CBasePin::AttemptConnection 方法来尝试连接。 否则,它会按以下顺序尝试媒体类型:
- 输入引脚的首选类型。
- 输出引脚的首选类型。
可以通过将 CBasePin::m_bTryMyTypesFirst 标志设置为 TRUE 来反转此顺序。
在每种情况下,引脚都会调用 IPin::EnumMediaTypes 来枚举媒体类型。 此方法检索一个枚举器对象,该对象将传递给 CBasePin::TryMediaTypes 方法。 TryMediaTypes 方法循环访问每个媒体类型,并为每个类型调用 TryConnection。
在 AttemptConnection 方法中,输出引脚调用以下方法:
- 它在自身上调用 CBasePin::CheckConnect,以检查输入引脚是否合适。
- 它在自身上调用 CBasePin::CheckMediaType 来验证媒体类型。
- 它在输入引脚上调用 IPin::ReceiveConnection 。 输入引脚使用此方法确定是否应接受连接。
- 它调用自身上的 CBasePin::CompleteConnect 以完成连接。
注意以下事项:
- CheckConnect 是一种虚拟方法。 在基类中,此方法检查引脚方向是否兼容。 输出引脚必须连接到输入引脚,反之亦然。 派生的引脚类通常会重写此方法以执行其他检查。 例如,它可能会查询连接所需的接口的另一个引脚。 如果派生类重写 CheckConnect,则它还应调用 CBasePin 方法。
- CheckMediaType 是派生类必须实现的纯虚拟方法。
- CompleteConnect 是一种虚拟方法,在基类中不执行任何操作。 派生类可以重写此方法,以执行完成连接所需的任何其他工作,例如确定内存分配器。
如果上述任何步骤失败,输出引脚将调用 CBasePin::BreakConnect 方法,以撤消 CheckConnect 执行的任何步骤。
输入引脚的 ReceiveConnection 方法调用输入引脚的 CheckConnect、 CheckMediaType 和 CompleteConnect 方法。 如果其中任何一个失败,则连接尝试也会失败。
下图显示了 CBasePin 中的连接过程:
相关主题