适用于 UVC 设备的 DShow 桥实现指南

本主题提供有关为符合 USB 视频类 (UVC) 规范的相机和设备配置 DShow 桥的实现指南。 该平台使用 USB 总线标准中的 Microsoft OS 描述符 来配置 DShow Bridge。 扩展属性 OS 描述符是 USB 标准描述符的扩展,USB 设备使用它来返回尚未通过标准规范启用的 Windows 特定设备属性。

概述

Microsoft 相机捕获堆栈包括名为 DirectShow 的旧框架堆栈和名为多媒体基础的新式框架。 IHV 和 OEM 必须为其设备编写组件来满足这两个管道的需求。

DShow Bridge 的编写目的是将 DShow 管道与媒体基础平台进行桥接。 这可实现真正的通用驱动程序,以便 IHV 和 OEM 可以编写可与 Windows 版本 1607 及更高版本上的 MediaFoundation 和 DShow 应用程序一起运行的驱动程序。 启用 DShow Bridge 选择加入后,DShow 应用程序和共享应用程序可以同时共享相同的相机硬件。

IHV 和 OEM 可能需要免除管理 DShow 管道的策略。 合作伙伴可以使用 OS 描述符启用以下功能:

  • 选择加入或退出 DShow Bridge:设备可以选择加入或退出更适合其需求的管道。 新式管道更全面地记录,并利用在多个版本中添加到 OS 的功能。 处于维护模式的旧管道滞后。

  • FrameServer 中的 MJPEG 解压缩:FrameServer 是虚拟化相机设备的服务。 这使设备的 Pin 可以在多个客户端之间共享。 具有优化媒体基础解压缩器的体系结构可以使用此功能在 FrameServer 中解码 MJPEG。 未压缩的翻译媒体格式 (YUY2) 提供给多个应用程序。 对于多个可能的客户端,流仅解压缩一次。 这可以提高应用程序的性能。 下图显示了相机捕获管道:

相机捕获管道。

打包 USB 相机设备的 OEM 和 IHV 可以使用 USB 总线标准的扩展属性 OS 功能描述符规范来配置 DShow Bridge,而无需对其 UVC 驱动程序进行任何 INF 文件更改。

OS 描述符允许设备定义 USB 设备或复合设备的注册表属性。

若要使用 USB OS 描述符配置 DShow 桥,主机软件应为每个 USB 设备接口创建以下注册表项:

HKLM\SYSTEM\CurrentControlSet\Enum\USB\<DeviceVID&PID>\<DeviceInstance>\Device Parameters

DWORD: EnableDshowRedirection

EnableDshowRedirection 注册表值是一个位掩码值,可用于配置 DShow Bridge,如下表所述。

位掩码 说明 备注
0x00000001 选择加入 DShow Bridge 0 – 选择退出
1 – 选择加入
0x00000002 在 FrameServer 中启用 MJPEG 解码一次 (请参阅下面的说明) 0 – (无操作) 公开 MJPEG 压缩媒体类型
1 – 公开 MJPEG (YUY2) 中已翻译的未压缩媒体类型

注意

在 FrameServer 中启用 MJPEG 解码一次,然后将未压缩的转换媒体格式 (YUY2) 提供给多个应用程序。 对于多个可能的客户端,流仅解压缩一次。 这可以提高应用程序的性能。

示例布局

下面是针对以下规范的示例:

  • Microsoft OS 扩展描述符规范 1.0

  • Microsoft OS 2.0 描述符规范

Microsoft OS 扩展属性描述符规范版本 1.0

扩展属性 OS 描述符有两个组件

  • 固定长度的标头部分

  • 标头部分后面的一个或多个可变长度自定义属性部分

标题部分

标头部分描述整个扩展属性描述符,包括总长度和版本号。

Offset 字段 大小(字节) 说明
0 dwLength 4 0x0000004c 76 十进制
4 bcdVersion 2 0x0100 版本 1.0
6 wIndex 2 0x005 扩展属性 OS 描述符
8 wCount 2 0x0001 一个自定义属性

自定义属性节 (1.0 描述符)

USB HID 设备的扩展属性 OS 描述符有一个自定义属性部分,用于创建 EnableDshowRedirection DWORD 注册表项。

Offset 字段 大小(字节)
0 dwSize 4 此属性) 0x00000042 (66 字节
4 dwPropertyDataType 4 0x00000004 (REG_DWORD_LITTLE_ENDIAN)
8 wPropertyNameLength 2 0x0030
10 bPropertyName 48 EnableDshowRedirection (Unicode 字符串)
58 dwPropertyDataLength 4 0x00000004 (Sizeof (DWORD) )
62 bPropertyData 4 0x00000001 (DWORD 数据)

Microsoft OS 2.0 描述符规范

此示例演示了如何使用 Microsoft 2.0 描述符集提供适用于 Windows 版本的 EnableDshowRedirection 的单个 DWORD 注册表值。

自定义属性部分 (2.0 描述符)

Offset 字段 大小(字节)
0 wLength 2 此描述符的长度(以字节为单位)
4 wDescriptorType 2 0x00000004 (REG_DWORD_LITTLE_ENDIAN)
8 wPropertyDataType 2 0x0030
wPropertyNameLength 2
10 PropertyName 变量 属性名称的长度
58 dwPropertyDataLength 2 属性数据长度
62 PropertyData 变量 属性数据
UCHAR Example2\_MSOS20DescriptorSetForFutureWindows\[0x48\] =
{
    //
    // Microsoft OS 2.0 Descriptor Set Header
    //
    0x0A, 0x00,                 // wLength - 12 bytes
    0x00, 0x00,                 // MSOS20_SET_HEADER_DESCRIPTOR
    0x00, 0x00, 0x0?, 0x06,     // dwWindowsVersion – 0x06030000 for future Windows version
    0x4A, 0x00,                 // wTotalLength – 72 bytes

    //
    // Microsoft OS 2.0 Registry Value Feature Descriptor
    //
    0x3E, 0x00,                 // wLength - 62 bytes
    0x04, 0x00,                 // wDescriptorType – 5 for Registry Property
    0x04, 0x00,                 // wPropertyDataType - 4 for REG_DWORD
    0x30, 0x00,                 // wPropertyNameLength – 48 bytes
    0x45, 0x00, 0x6E, 0x00,     // Property Name - "EnableDshowRedirection"
    0x61, 0x00, 0x62, 0x00,
    0x6C, 0x00, 0x65, 0x00,
    0x44, 0x00, 0x73, 0x00,
    0x68, 0x00, 0x6F, 0x00,
    0x77, 0x00, 0x52, 0x00,
    0x65, 0x00, 0x64, 0x00,
    0x69, 0x00, 0x72, 0x00,
    0x65, 0x00, 0x63, 0x00,
    0x74, 0x00, 0x69, 0x00,
    0x6F, 0x00, 0x6E, 0x00,
    0x00, 0x00, 0x00, 0x00,
    0x04, 0x00,                 // wPropertyDataLength – 4 bytes
    0x00, 0x00, 0x00, 0x00      // PropertyData – 0x00000003 (DShow Bridge is enabled and MJPEG is decoded in FrameServer)
}

资源

针对 USB 设备的 Microsoft OS 描述符

USB 常规父驱动程序 (Usbccgp.sys)

USB 规范