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 成员,该成员保留当前媒体类型。 筛选器处理示例时,应检查媒体类型的示例。 如果有新类型,则可能需要通过调用引脚上的 SetMediaType 或直接设置 m_mt 的值来存储它。 另一方面,为视频转换筛选器设计的 CVideoTransformFilter 类在更改时存储媒体类型。 有关详细信息,请参阅 DirectShow 基类库中 CVideoTransformFilter::Receive 的源代码。

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