CTransInPlaceFilter 类

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

ctransinplacefilter 类层次结构

CTransInPlaceFilter 专为就地转换筛选器而设计,这些筛选器用于修改输入数据,而不是跨缓冲区复制数据。若要使用此类,请从 CTransInPlaceFilter 派生一个新类,并实现以下方法:

此类将 CTransInPlaceInputPin 类用于其输入引脚,将 CTransInPlaceOutputPin 类用于其输出引脚。 通常,不需要重写这些引脚类。 筛选器在 CTransInPlaceFilter::GetPin 方法中创建这两个图钉。 如果确实重写了引脚类,则必须重写 GetPin 才能创建自定义图钉。

此类的设计使输入类型始终与输出类型匹配。 筛选器尽可能为两个引脚连接使用单个分配器。

首选媒体类型

如果输出引脚已连接,则输入引脚将提供下游筛选器的首选类型。 (事实上,它只返回下游筛选器的枚举器 object.) 否则,它没有首选类型。 输出引脚具有相同的行为,但相反:如果输入引脚已连接,则输出引脚将提供上游筛选器的首选类型。 否则,它没有首选类型

固定连接

当一个引脚连接时,筛选器通常会重新连接另一个引脚,以确保两个引脚使用相同的媒体类型和相同的分配器。 (重新连接引脚的机制在 重新连接引脚中介绍。) 两种方案是可能的:输入引脚先连接,要么先连接输出引脚。

假设输入引脚首先连接。 将执行以下步骤:

  1. 输入引脚调用筛选器的 CheckInputType 方法以检查媒体类型。
  2. 上游筛选器选择分配器。 此时,输入引脚没有分配器要求,它接受连接的任何分配器。 如果上游筛选器请求分配器,则引脚会创建一个新分配器。 由于稍后所述的原因,此分配器不会在最终连接中使用。 它仅用于帮助完成连接过程的这一阶段。

稍后,当输出引脚连接时:

  1. 输出引脚调用筛选器的 CheckInputType 方法以检查媒体类型。 它还在上游筛选器上调用 IPin::QueryAccept。 这可确保输入引脚可以更改其媒体类型以匹配。
  2. 输出引脚调用筛选器的 CheckInputType 方法以检查媒体类型。 它还在上游筛选器上调用 IPin::QueryAccept。 这可确保输入引脚可以更改其媒体类型以匹配。
  3. 输出引脚调用筛选器的 CheckInputType 方法以检查媒体类型。 它还在上游筛选器上调用 IPin::QueryAccept。 这可确保输入引脚可以更改其媒体类型以匹配。
  4. 这一次,输入引脚的 GetAllocator 方法返回下游分配器, GetAllocatorRequirements 返回下游筛选器的分配器要求。 输入引脚接受上游筛选器选择的任何分配器。
  5. 这一次,输入引脚的 GetAllocator 方法返回下游分配器, GetAllocatorRequirements 返回下游筛选器的分配器要求。 输入引脚接受上游筛选器选择的任何分配器。

现在考虑相反的情况,其中输出引脚是要连接的第一个引脚。

  1. 输出引脚调用筛选器的 CheckInputType 方法以检查媒体类型。
  2. 它选择分配器,首选使用下游筛选器的分配器。

然后,当输入引脚连接时:

  1. 输入引脚通过在筛选器上调用 CheckInputType ,并在下游筛选器的输出引脚上调用 QueryAccept 来检查媒体类型。
  2. 如果输入类型与输出类型不匹配,筛选器将重新连接输出引脚。
  3. 上游筛选器选择分配器。 输入引脚的 GetAllocator 方法返回下游分配器,输入引脚接受上游筛选器选择的任何分配器。
  4. 筛选器对下游连接使用相同的分配器,可能会替代原始下游分配器。

如果涉及的任何分配器是只读的,则此事件序列会略有变化,因为下游分配器必须是可写的。 在这种情况下,筛选器可能会使用两个单独的分配器。

有关使用此类的详细信息,请参阅 编写转换筛选器

受保护的成员变量 说明
m_bModifiesData 指示筛选器是否修改示例数据。
受保护的方法 说明
Copy 复制媒体示例。
InputPin 检索指向筛选器输入引脚的指针。
OutputPin 检索指向筛选器输出引脚的指针。
TypesMatch 确定输入媒体类型是否与输出媒体类型匹配。
UsingDifferentAllocators 确定输入和输出引脚是否使用不同的分配器。
公共方法 说明
CTransInPlaceFilter 构造函数方法。
GetPin 检索图钉。
GetMediaType 检索输出引脚的首选媒体类型。
DecideBufferSize 设置输出引脚的缓冲区要求。
CheckTransform 检查输入媒体类型是否与输出媒体类型兼容。
CompleteConnect 完成引脚连接。
接收 接收媒体样本,对其进行处理,并将其传送到下游筛选器。
纯虚拟方法 说明
转换 就地转换示例。

要求

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

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