CTransInPlaceFilter 类
[与此页面关联的功能 DirectShow 是一项旧功能。 它已被 MediaPlayer、 IMFMediaEngine 和 媒体基金会中的音频/视频捕获取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能使用 MediaPlayer、 IMFMediaEngine 和 Media Foundation 中的音频/视频捕获 ,而不是 DirectShow。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]
类 CTransInPlaceFilter
专为就地转换筛选器而设计,这些筛选器用于修改输入数据,而不是跨缓冲区复制数据。若要使用此类,请从 CTransInPlaceFilter
派生一个新类,并实现以下方法:
此类将 CTransInPlaceInputPin 类用于其输入引脚,将 CTransInPlaceOutputPin 类用于其输出引脚。 通常,不需要重写这些引脚类。 筛选器在 CTransInPlaceFilter::GetPin 方法中创建这两个图钉。 如果确实重写了引脚类,则必须重写 GetPin 才能创建自定义图钉。
此类的设计使输入类型始终与输出类型匹配。 筛选器尽可能为两个引脚连接使用单个分配器。
首选媒体类型
如果输出引脚已连接,则输入引脚将提供下游筛选器的首选类型。 (事实上,它只返回下游筛选器的枚举器 object.) 否则,它没有首选类型。 输出引脚具有相同的行为,但相反:如果输入引脚已连接,则输出引脚将提供上游筛选器的首选类型。 否则,它没有首选类型
固定连接
当一个引脚连接时,筛选器通常会重新连接另一个引脚,以确保两个引脚使用相同的媒体类型和相同的分配器。 (重新连接引脚的机制在 重新连接引脚中介绍。) 两种方案是可能的:输入引脚先连接,要么先连接输出引脚。
假设输入引脚首先连接。 将执行以下步骤:
- 输入引脚调用筛选器的 CheckInputType 方法以检查媒体类型。
- 上游筛选器选择分配器。 此时,输入引脚没有分配器要求,它接受连接的任何分配器。 如果上游筛选器请求分配器,则引脚会创建一个新分配器。 由于稍后所述的原因,此分配器不会在最终连接中使用。 它仅用于帮助完成连接过程的这一阶段。
稍后,当输出引脚连接时:
- 输出引脚调用筛选器的 CheckInputType 方法以检查媒体类型。 它还在上游筛选器上调用 IPin::QueryAccept。 这可确保输入引脚可以更改其媒体类型以匹配。
- 输出引脚调用筛选器的 CheckInputType 方法以检查媒体类型。 它还在上游筛选器上调用 IPin::QueryAccept。 这可确保输入引脚可以更改其媒体类型以匹配。
- 输出引脚调用筛选器的 CheckInputType 方法以检查媒体类型。 它还在上游筛选器上调用 IPin::QueryAccept。 这可确保输入引脚可以更改其媒体类型以匹配。
- 这一次,输入引脚的 GetAllocator 方法返回下游分配器, GetAllocatorRequirements 返回下游筛选器的分配器要求。 输入引脚接受上游筛选器选择的任何分配器。
- 这一次,输入引脚的 GetAllocator 方法返回下游分配器, GetAllocatorRequirements 返回下游筛选器的分配器要求。 输入引脚接受上游筛选器选择的任何分配器。
现在考虑相反的情况,其中输出引脚是要连接的第一个引脚。
- 输出引脚调用筛选器的 CheckInputType 方法以检查媒体类型。
- 它选择分配器,首选使用下游筛选器的分配器。
然后,当输入引脚连接时:
- 输入引脚通过在筛选器上调用 CheckInputType ,并在下游筛选器的输出引脚上调用 QueryAccept 来检查媒体类型。
- 如果输入类型与输出类型不匹配,筛选器将重新连接输出引脚。
- 上游筛选器选择分配器。 输入引脚的 GetAllocator 方法返回下游分配器,输入引脚接受上游筛选器选择的任何分配器。
- 筛选器对下游连接使用相同的分配器,可能会替代原始下游分配器。
如果涉及的任何分配器是只读的,则此事件序列会略有变化,因为下游分配器必须是可写的。 在这种情况下,筛选器可能会使用两个单独的分配器。
有关使用此类的详细信息,请参阅 编写转换筛选器。
受保护的成员变量 | 说明 |
---|---|
m_bModifiesData | 指示筛选器是否修改示例数据。 |
受保护的方法 | 说明 |
Copy | 复制媒体示例。 |
InputPin | 检索指向筛选器输入引脚的指针。 |
OutputPin | 检索指向筛选器输出引脚的指针。 |
TypesMatch | 确定输入媒体类型是否与输出媒体类型匹配。 |
UsingDifferentAllocators | 确定输入和输出引脚是否使用不同的分配器。 |
公共方法 | 说明 |
CTransInPlaceFilter | 构造函数方法。 |
GetPin | 检索图钉。 |
GetMediaType | 检索输出引脚的首选媒体类型。 |
DecideBufferSize | 设置输出引脚的缓冲区要求。 |
CheckTransform | 检查输入媒体类型是否与输出媒体类型兼容。 |
CompleteConnect | 完成引脚连接。 |
接收 | 接收媒体样本,对其进行处理,并将其传送到下游筛选器。 |
纯虚拟方法 | 说明 |
转换 | 就地转换示例。 |
要求
要求 | 值 |
---|---|
标头 |
|
库 |
|