本主题提供有关为符合 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)
}