从用户模式组件调用反交错 DDI

用户模式组件(如 VMR)启动对取消交错 DDI 的调用。

若要使 VMR 能够对视频内容取消解释并执行帧速率转换,显示驱动程序必须实现运动补偿回调函数,这些函数由 DD_MOTIONCOMPCALLBACKS定义。

为了简化驱动程序开发,驱动程序编写器可以使用运动补偿代码模板,并实现反 交错示例函数。 运动补偿模板调用反交错示例函数,以对视频内容执行反交错和帧速率转换。 有关使用运动补偿模板的信息,请参阅 DirectX VA 设备的示例代码

以下步骤说明 VMR 如何启动对取消解释 DDI 的调用:

  1. 将 VMR 添加到筛选器图时,它会启动对驱动程序提供的 DdMoCompGetGuids 回调函数的调用,以检索驱动程序支持的设备列表。 函数 结构的 GetMoCompGuids DD_MOTIONCOMPCALLBACKS指向此回调函数。 有关筛选器图详细信息,请参阅 KS 微型驱动程序体系结构

  2. 如果存在取消解释容器设备 GUID,则 VMR 将启动对 DdMoCompCreate 回调函数的调用,以创建设备的实例。 的 CreateMoComp 成员DD_MOTIONCOMPCALLBACKS回调函数。 在 DdMoCompCreate 调用中,在容器结构的 lpGuid 成员中指定指向容器设备 GUID DD_CREATEMOCOMPDATA指针。 容器设备 GUID 的定义如下:

    DEFINE_GUID(DXVA_DeinterlaceContainerDevice, 0x0e85cb93,0x3046,0x4ff0,0xae,0xcc,0xd5,0x8c,0xb5,0xf0,0x35,0xfd);
    
  3. 若要确定特定输入视频格式的可用反交错或帧速率转换模式,VMR 会启动对驱动程序提供的 DdMoCompRender 回调函数的调用。 函数 的 RenderMoCompDD_MOTIONCOMPCALLBACKS 指向回调函数。 在 DdMoCompRender 调用DXVA_ProcAmpControlQueryCapsFnCode dxva.h) 中定义的 (常量在 DD_RENDERMOCOMPDATA 结构的 dwFunction成员中设置。 DD_RENDERMOCOMPDATA的 lpInputData 成员通过指向已完成的 DXVA_VideoDesc 结构将输入 参数传递给 驱动程序。 驱动程序通过 DD_RENDERMOCOMPDATA 的 lpOutputData 成员返回其DD_RENDERMOCOMPDATA; lpOutputData指向DXVA_DeinterlaceQueryAvailableModes结构

    如果驱动程序实现 DeinterlaceQueryAvailableModes 示例函数, 则 DdMoCompRender 回调函数将调用 DeinterlaceQueryAvailableModes

  4. 对于驱动程序支持的每个取消交互模式,VMR 启动对驱动程序提供的 DdMoCompRendercallback 函数的调用。 在 DdMoCompRender 调用中,DXVA_DeinterlaceQueryModeCapsFnCode dxva.h (中定义的) 常量在 DD_RENDERMOCOMPDATA 的 dwFunction 成员中设置。 DD_RENDERMOCOMPDATA的 lpInputData 成员通过指向已完成的 DXVA_DeinterlaceQueryModeCaps 结构将输入 参数传递给 驱动程序。 驱动程序通过 DD_RENDERMOCOMPDATA 的 lpOutputData 成员返回其DD_RENDERMOCOMPDATA; lpOutputData指向DXVA_DeinterlaceCaps结构

    如果驱动程序实现 DeinterlaceQueryModeCaps 示例函数, 则 DdMoCompRender 回调函数将调用 DeinterlaceQueryModeCaps

  5. 在 VMR 确定特定反交错模式 (例如 bob 反交错) 的反交错功能后,它会启动对 DdMoCompCreate 的调用,以创建反交错模式设备的实例 (例如,取消交错 bob 设备) 。 在 DdMoCompCreate 调用中,在 DD_CREATEMOCOMPDATA 的 lpGuid 成员中指定指向取消交互模式设备 GUID 的指针。 取消解释 bob 设备 GUID 的定义如下:

    DEFINE_GUID(DXVAp_DeinterlaceBobDevice, 0x335aa36e,0x7884,0x43a4,0x9c,0x91,0x7f,0x87,0xfa,0xf3,0xe3,0x7e);
    

    如果驱动程序实现 DeinterlaceOpenStream 示例函数, 则 DdMoCompCreate 回调函数将调用 DeinterlaceOpenStream

  6. 对于每个取消交错操作,VMR 将启动对驱动程序提供的 DdMoCompRender 回调函数的调用。 在 DdMoCompRender 调用中, DXVA_ProcAmpControlQueryCapsFnCodedxva.h) 中定义的 (常量在 DD_RENDERMOCOMPDATA 的 dwFunction 成员中设置。 的 lpBufferInfo 成员DD_RENDERMOCOMPDATA指向描述目标图面和每个输入视频源示例的缓冲区数组。 DD_RENDERMOCOMPDATA的 lpInputData 成员通过指向已完成的 DXVA_DeinterlaceBlt 向 驱动程序传递输入 参数。 驱动程序不返回任何输出;也就是说,DD_RENDERMOCOMPDATA lpOutputData 成员为 NULL

    如果驱动程序实现 DeinterlaceBlt 示例函数, 则 DdMoCompRender 回调函数将调用 DeinterlaceBlt

  7. 对于每个组合取消交错和子流组合操作,Microsoft Windows Server 2003 SP1 及更高版本以及 Windows XP SP2 及更高版本上的 VMR 将启动对驱动程序提供的 DdMoCompRender 回调函数的调用。 在 DdMoCompRender 调用中,DXVA_DeinterlaceBltExFnCode dxva.h (中定义的) 常量在 DD_RENDERMOCOMPDATA 的 dwFunction 成员中设置。 的 lpBufferInfo 成员DD_RENDERMOCOMPDATA指向一个缓冲区数组,该数组描述每个输入视频源示例的目标图面和图面。 DD_RENDERMOCOMPDATA的 lpInputData 成员通过指向已完成的 DXVA_DeinterlaceBltEx 结构将输入 参数传递给 驱动程序。 驱动程序不返回任何输出;也就是说,DD_RENDERMOCOMPDATA lpOutputData 成员为 NULL

    如果驱动程序实现 DeinterlaceBltEx 示例函数, 则 DdMoCompRender 回调函数将调用 DeinterlaceBltEx

  8. 当 VMR 不再需要执行任何其他反交互操作时,将调用驱动程序提供的 DdMoCompDestroy 回调函数。 的 DestroyMoComp 成员DD_MOTIONCOMPCALLBACKS回调函数。

    如果驱动程序实现 DeinterlaceCloseStream 示例函数, 则 DdMoCompDestroy 回调函数将调用 DeinterlaceCloseStream

  9. 然后,驱动程序释放取消交互模式设备使用的任何资源。