VRAM 捕获属性
以引脚为中心的 AVStream 微型驱动程序必须支持多个属性,才能将其捕获到 VRAM。 本部分介绍微型驱动程序在 VRAM 处理之前和期间接收的请求序列。
在启动捕获之前,KS 代理会发送 KSPROPERTY_PREFERRED_CAPTURE_SURFACE get-property 请求。 微型驱动程序应返回不同的值,具体取决于驱动程序是捕获到系统内存还是 VRAM。
捕获到系统内存
若要捕获到系统内存,请返回KS_CAPTURE_ALLOC_SYSTEM_AGP。
然后,捕获驱动程序接收具有系统内存值类型的 KSPROPERTY_CURRENT_CAPTURE_SURFACE set-property 请求。 捕获驱动程序现在充当总线主 DMA 设备,并将数据直接放入系统内存中。
在此模式下,捕获驱动程序在输出引脚的 AVStrMiniPinProcess 回调函数中接收系统内存缓冲区。
有关如何在引脚进程回调中实现 DMA 的信息,请参阅 AVStream 中基于数据包的 DMA。
若要捕获多个输出引脚 (例如,单独的视频、音频和 VBI 引脚) ,每个引脚应支持如前所述 VRAM 属性和处理。 代理为每个引脚生成单独的线程。
捕获到 VRAM
如果驱动程序支持 VRAM 捕获,请返回 KS_CAPTURE_ALLOC_VRAM 以响应KSPROPERTY_PREFERRED_CAPTURE_SURFACE。
接下来,微型驱动程序接收 KSPROPERTY_DISPLAY_ADAPTER_GUID get-property 请求,查询显示适配器的 GUID。
从供应商提供的图形微型端口驱动程序获取适配器 GUID。 DXGK_INTERFACESPECIFICDATA 结构包含属性请求中要返回的适配器 GUID。 此结构由 DirectX 图形内核 (DXGK) 子系统生成,并在初始化适配器时传递给微型端口驱动程序。
如果引脚支持 VRAM 传输,并且显示适配器和下游筛选器的 GUID 匹配,则会选择 KS 代理模块作为分配器。 代理使用捕获的所选图面类型设置 KSPROPERTY_CURRENT_CAPTURE_SURFACE 属性,以通知捕获引脚选择 VRAM 图面传输的情况。
如果引脚收到KS_CAPTURE_ALLOC_VRAM,则会接收 VRAM 处理请求。
VRAM 处理请求由两部分组成。 首先,捕获驱动程序接收 KSPROPERTY_MAP_CAPTURE_HANDLE_TO_VRAM_ADDRESS的 get 请求。 获取处理程序接收包含内核模式 VRAM 图面句柄的 IRP。
捕获驱动程序或显示微型端口驱动程序应将 VRAM 图面句柄映射到实际的 VRAM 物理地址。 VRAM 图面句柄 不保持有效;不要 缓存它以供以后使用。
返回属性请求中提供的 VRAM_SURFACE_INFO_PROPERTY_S 中的映射地址。 捕获驱动程序可以发出 IOCTL,以从显示微型端口驱动程序请求映射。
其次,当引脚具有要处理的数据时,将调用捕获筛选器的 AVStrMiniPinProcess 。
微型驱动程序现在应调用 KsPinGetLeadingEdgeStreamPointer 来获取并锁定此引脚的前导流指针。 此函数返回指向 KSSTREAM_POINTER 结构的指针。
此流指针结构包含指向 KSSTREAM_HEADER的指针。
在流标头的 Data 成员中,查找指向 VRAM_SURFACE_INFO 结构的指针。
此结构包含为响应KSPROPERTY_MAP_CAPTURE_HANDLE_TO_VRAM_ADDRESS而返回的物理地址。 表示句柄的 hSurface 成员为 NULL。
捕获驱动程序应:
使用 VRAM 物理地址对捕获硬件进行编程。
处理视频帧完成。
使用复制到 VRAM 图面的字节数填充 VRAM_SURFACE_INFO 的 cbCaptured 成员。 不要使用捕获的字节数设置 KSSTREAM_HEADER 的 DataUsed 成员。 相反,请将 DataUsed 设置为 sizeof (VRAM_SURFACE_INFO) 。
如果捕获驱动程序执行时间戳,请在KSSTREAM_HEADER中设置 PresentationTime、 Duration 以及 OptionsFlags (如果相关)。
调用 KsStreamPointerAdvanceOffsets 以继续处理或删除所有克隆,并通过调用 KsStreamPointerDelete 完成请求。
Windows 驱动程序工具包 (WDK) 示例中的 AVStream 模拟硬件示例驱动程序 (AVSHwS) Capture.cpp 文件中的 CCapturePin::P rocessD3DSurface 方法演示了实现此回调的一种方法,以支持 VRAM。