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