CBasePin 连接过程

[与此页面关联的功能 DirectShow 是旧版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音频/视频捕获所取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能在 Media Foundation 中使用 MediaPlayerIMFMediaEngine音频/视频捕获 ,而不是 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 方法来尝试连接。 否则,它会按以下顺序尝试媒体类型:

  1. 输入引脚的首选类型。
  2. 输出引脚的首选类型。

可以通过将 CBasePin::m_bTryMyTypesFirst 标志设置为 TRUE 来反转此顺序。

在每种情况下,引脚都会调用 IPin::EnumMediaTypes 来枚举媒体类型。 此方法检索一个枚举器对象,该对象将传递给 CBasePin::TryMediaTypes 方法。 TryMediaTypes 方法循环访问每个媒体类型,并为每个类型调用 TryConnection

AttemptConnection 方法中,输出引脚调用以下方法:

注意以下事项:

  • CheckConnect 是一种虚拟方法。 在基类中,此方法检查引脚方向是否兼容。 输出引脚必须连接到输入引脚,反之亦然。 派生的引脚类通常会重写此方法以执行其他检查。 例如,它可能会查询连接所需的接口的另一个引脚。 如果派生类重写 CheckConnect,则它还应调用 CBasePin 方法。
  • CheckMediaType 是派生类必须实现的纯虚拟方法。
  • CompleteConnect 是一种虚拟方法,在基类中不执行任何操作。 派生类可以重写此方法,以执行完成连接所需的任何其他工作,例如确定内存分配器。

如果上述任何步骤失败,输出引脚将调用 CBasePin::BreakConnect 方法,以撤消 CheckConnect 执行的任何步骤。

输入引脚的 ReceiveConnection 方法调用输入引脚的 CheckConnectCheckMediaTypeCompleteConnect 方法。 如果其中任何一个失败,则连接尝试也会失败。

下图显示了 CBasePin 中的连接过程:

cbasepin 连接过程

CBasePin