以引脚为中心的 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-request。 get 处理程序接收包含内核模式 VRAM 图面句柄的 IRP。
捕获驱动程序或显示微型端口驱动程序应将 VRAM 图面句柄映射到实际的 VRAM 物理地址。 VRAM 表面句柄 不保持有效,请勿 缓存它供以后使用。
返回属性请求中提供的 VRAM_SURFACE_INFO_PROPERTY_S 中的映射地址。 捕获驱动程序可以发出 IOCTL 请求以从显示微型端口驱动程序获得映射。
其次,当引脚具有要处理的数据时,将调用捕获筛选器的 AVStrMiniPinProcess 。
微型驱动程序现在应调用 KsPinGetLeadingEdgeStreamPointer 来获取和锁定此引脚的前导流指针。 此函数返回指向 KSSTREAM_POINTER 结构的指针。
此流指针结构包含指向 KSSTREAM_HEADER的指针。
在流标头的数据成员中,找到一个指向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::ProcessD3DSurface 方法显示了一种实现此回调以支持 VRAM 的方法。