QueryAccept (下游)

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

此机制使输出引脚能够向下游对等方提出新的格式。 新格式不得要求更大的缓冲区大小。 输出引脚执行以下作:

  1. 调用 IPin::QueryAcceptIPinConnection::D ynamicQueryAccept 下游引脚,以验证其他引脚是否可以接受新媒体类型(请参阅插图,步骤 A)。

  2. 如果步骤 1 中的返回值S_OK,则引脚会将媒体类型附加到下一个示例。 为此,首先调用 IMemAllocator::GetBuffer 以获取示例(B)。 然后,它调用 IMediaSample::SetMediaType 将媒体类型附加到该示例(C)。 通过将媒体类型附加到示例,筛选器指示格式已更改,从该示例开始。

  3. 引脚提供示例 (D)。

  4. 当下游筛选器收到示例时,它会调用 IMediaSample::GetMediaType 来检索新的媒体类型。

    queryaccept (下游)

所有引脚都支持 QueryAccept 方法。 但是,此方法略有歧义,因为返回值S_OK并不总是保证可以在图形处于活动状态时更改格式。 某些筛选器可能会返回S_OK,但如果图形处于活动状态,则拒绝更改。 DynamicQueryAccept 方法(某些输入引脚支持)显式定义S_OK,表示引脚可以在活动时更改格式。 如果输入引脚支持 IPinConnection 接口,则应调用 DynamicQueryAccept 而不是 QueryAccept

在大多数情况下,此机制不允许对格式进行大幅更改,例如更改位深度。 可以使用它的一种情况是视频解码器切换调色板。 格式的基本详细信息保持不变,如图像尺寸和位深度,但新媒体类型具有不同的调色板条目集。

实现说明

在 DirectShow 基类中,CBasePin::QueryAccept 调用 CheckMediaType 方法,该方法在初始引脚连接期间也调用。 对于转换筛选器,输入引脚的 CheckMediaType 方法应始终检查输出引脚是否已连接,如果是,则输入媒体类型是否与输出媒体类型兼容。 因此,此实现对 QueryAccept可能有效。 否则,应替代 QueryAccept,以便执行所需的任何其他检查。 另请注意,CTransformFilter 类将此逻辑封装 在 checkInputTypeCheckTransform 方法中。 另一方面,CTransInPlaceFilter 类始终在下一个上游或下游筛选器上调用 QueryAccept

CBaseInputPin::Receive 方法检查传入示例中的媒体类型,如果有媒体类型,则调用 CheckMediaType。 但是,它不会更新固定 m_mt 成员,该成员保存当前媒体类型。 筛选器处理示例时,应检查该示例是否为媒体类型。 如果存在新类型,则可能需要存储它,无论是通过在 pin 上调用 SetMediaType,还是直接设置 m_mt 的值。 另一方面,CVideoTransformFilter 类(专为视频转换筛选器设计)在更改时存储媒体类型。 有关详细信息,请参阅 DirectShow 基类库中 CVideoTransformFilter::Receive 的源代码。

在某些情况下,可能只需将 QueryAccept 调用传递到下游,然后将媒体类型附加到输出示例,并允许下游筛选器处理格式更改。