DMO包装器筛选器

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

Label Value
筛选器接口 IBaseFilterIDMOWrapperFilterIPersistStream
输入固定媒体类型 请参阅备注
输入引脚接口 IMemInputPinIPinIQualityControl
输出引脚媒体类型 请参阅备注
输出引脚接口 IAMStreamConfigIAMVideoCompressionIMediaPosition、IMediaSeekingIPinIQualityControl
筛选 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包装器筛选器将媒体缓冲区传递给公开 IMediaBuffer 接口的DMO。

在 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 在其输出引脚上的调用转换为DMO上的 IDMOQualityControl::SetNow 调用。 SetNowrtNow 参数计算为 Quality 结构的 TimeStamp后期成员的总和。

在 GraphEdit 中使用 Fiter

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

DirectShow筛选器

DirectX 媒体对象