DMO 包装器筛选器

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

DMO 包装器筛选器使 DirectShow 应用程序能够在筛选器图中使用 DirectX 媒体对象(DMO)。 筛选器包装 DMO 并处理使用 DMO 的所有详细信息,例如向 DMO 传入和传出数据。 此外,筛选器将聚合 DMO,因此应用程序可以查询筛选器以获取 DMO 公开的任何 COM 接口。

标签 价值
筛选器接口 IBaseFilterIDMOWrapperFilterIPersistStream
输入引脚媒体类型 请参阅备注
输入引脚接口 IMemInputPinIPinIQualityControl
输出引脚媒体类型 请参阅备注
输出引脚接口 IAMStreamConfigIAMVideoCompressionIMediaPositionIMediaSeekingIPinIQualityControl
筛选 CLSID CLSID_DMOWrapperFilter
属性页 CLSID 无属性页
可执行 Qasf.dll
优点 请参阅备注
筛选器类别 请参阅备注

 

言论

局限性

DMO 包装器具有以下限制:

  • 它不支持具有零输入、多个输入或零输出的 DMO。 (它确实支持具有一个输入和输出的 DMO。
  • 它不支持自定义传输。 所有数据传输都通过 IMemInputPin 接口完成。
  • 它不使用 IMediaObjectInPlace 接口;所有处理都是使用 IMediaObject 方法完成的。

引 脚

对于 DMO 上的每个输入流,筛选器将创建相应的输入引脚。 对于每个输出流,它将创建相应的输出引脚。 每个引脚支持的媒体类型取决于 DMO

编码器接口

如果 DMO 是视频编码器或音频编码器,则输出引脚会公开 IAMStreamConfig 接口。 如果 DMO 是视频编码器,则输出引脚还会公开 IAMVideoCompression 接口。 在这两种情况下,如果 DMO 支持接口,则引脚委托给 DMO。 否则,引脚提供自己的实现。

筛选器使用 IMemInputPin 接口来处理所有流式处理。 它不支持 IAsyncReader 连接。 筛选器仅在从上游(包括流结束通知)接收数据时才对 DMO 调用 IMediaObject::P rocessOutput。 因此,它不支持具有零输入流的 DMO。

寻求

所有搜寻请求都通过 DMO 包装器上的第一个输入引脚传递到上游筛选器。 对于多输出 DMO,这意味着当应用程序查找图形时,上游筛选器可能会收到多个查找请求。

优点

DirectShow 为所有 DMO 分配默认值 MERIT_NORMAL + 0x800。 此值介于 MERIT_NORMALMERIT_PREFERRED之间。 解码器筛选器通常具有 MERIT_NORMAL的功绩值。 因此,筛选器图形管理器通常会在解码器筛选器上选择 DMO 解码器。 若要替代默认值,请在 HKEY_CLASSES_ROOT\CLSID中将注册表项添加到 DMO 的注册表项中。 包括一个名为“Merit”的 DWORD 值,其值指定了优点。

类别

DMO 包装器筛选器本身不会出现在任何类别中。 当它包装 DMO 时,它将显示在与 DMO 类别对应的 DirectShow 类别中,其名称为 DMO。

缓冲区

DMO 包装器筛选器将媒体缓冲区传递给 DMO,该 DMO 公开 IMediaBuffer 接口。

在 Windows Vista 或更高版本中,媒体缓冲区还会公开 IServiceProvider 接口。 DMO 可以使用此接口获取指向与缓冲区关联的媒体示例的指针。 使用服务标识符 IID_IMediaSample。 视频 DMO 可以使用媒体示例的 IMediaSample2 接口在示例中设置交错标志。 以下代码演示如何获取指向媒体示例的指针:

IServiceProvider *pSp = NULL;
IMediaSample2 *pSample2 = NULL;
HRESULT hr = S_OK;

hr = pBuffer->QueryInterface(IID_IServiceProvider, (void**)&pSp);
if (SUCCEEDED(hr))
{
    hr = pSp->QueryService(
        IID_IMediaSample,  // Service identifier.
        IID_IMediaSample2, // Interface identifier.
        (void**)&pSample2
        );
    if (SUCCEEDED(hr))
    {
        // Set flags (not shown).
        pSample2->Release();
    }
    pSp->Release();
}

有关每个样本交错标志的详细信息,请参阅 AM_SAMPLE2_PROPERTIES 结构

质量管理

如果 DMO 公开 IDMOQualityControl 接口,筛选器会将 IQualityControl::Notify 对其输出引脚的调用转换为 IDMOQualityControl::SetNow 调用 DMO。 SetNowrtNow 参数计算为 TimeStampQuality 结构的成员之和。

在 GraphEdit 中使用 Fiter

在 GraphEdit 中,DMO 包装器筛选器不在其自己的名称下显示。 相反,每个已注册的 DMO 都列在相应的筛选器类别下。 通过 插入筛选器 对话框添加 DMO 时,GraphEdit 将创建 DMO 包装器筛选器并将其配置为使用该 DMO。

DirectShow 筛选器

DirectX 媒体对象