从 Windows 10 开始,为符合 USB 视频类规范(版本 1.0 到 1.5)的设备提供了收件箱 USB 视频类 (UVC) 驱动程序。 此驱动程序支持颜色和传感器类型相机。 本文档概述了如何通过收件箱驱动程序向应用程序公开符合 UVC 的相机的某些功能。
术语
| 关键字 | DESCRIPTION | 
|---|---|
| UVC | USB 视频类 | 
| UVC 驱动程序 | 操作系统随附的USBVideo.sys驱动程序 | 
| IR | 红外线 | 
| 彩色相机 | 输出颜色流的相机(例如 RGB 或 YUV 相机) | 
| 传感器相机 | 输出非颜色流的相机(例如 IR 或深度相机) | 
| BOS | 二进制设备对象存储 | 
| MS OS 2.0 描述符 | 微软专用于平台的 BOS 设备功能描述 | 
传感器摄像机
Windows 支持两类相机。 一个是彩色相机,另一个是非颜色传感器相机。 RGB 或 YUV 相机被归类为彩色相机,非彩色相机(如灰度、IR 和深度相机)归类为传感器相机。 UVC 驱动程序支持这两种类型的相机。 我们建议相机固件指定一个值,根据该值,UVC 驱动程序会在一个或两个受支持的类别下注册相机。
仅支持颜色格式类型的相机应在KSCATEGORY_VIDEO_CAMERA下注册。 支持 IR 或仅限深度格式的相机应在 KSCATEGORY_SENSOR_CAMERA 下注册。 支持颜色和非颜色格式类型的相机应在KSCATEGORY_VIDEO_CAMERA和KSCATEGORY_SENSOR_CAMERA下注册。 此分类可帮助应用程序选择要使用的相机。
UVC 相机可以在其 BOS MS OS 2.0 描述符中,通过属性 SensorCameraMode 和 SkipCameraEnumeration 指定其类别偏好,详见以下部分。
SensorCameraMode 属性采用值 1 或 2。
值为 1 将在KSCATEGORY_SENSOR_CAMERA下注册设备。 除此之外,请指定 SkipCameraEnumeration 的值为 1,以使相机可供仅查找传感器相机的应用程序使用。 仅公开传感器相机媒体类型的相机应使用此值。
SensorCameraMode 的值为 2,将在 KSCATEGORY_SENSOR_CAMERA & KSCATEGORY_VIDEO_CAMERA 下注册设备。 这使得相机适用于需要传感器和彩色相机功能的应用程序。 支持传感器摄像头和彩色摄像头媒体类型的相机应使用此值。
建议使用 BOS 描述符指定上述注册表值。 有关具有特定于平台的 MS OS 2.0 描述符的示例 BOS 描述符,请参阅下面的 示例复合设备 部分。
如果无法按上述方式更新设备固件,则可以使用自定义 INF,并通过指定 SensorCameraMode 和 SkipCameraEnumeration 的值来指定相机需要注册为传感器相机,如下所示:
自定义 INF 文件(基于收件箱 UVC 驱动程序)必须包含以下 AddReg 条目:
SensorCameraMode: REG_DWORD: 1 (注册为传感器相机)
SkipCameraEnumeration: REG_DWORD: 1 (使其仅适用于 IR 应用程序)
自定义 INF 部分的示例如下所示:
[USBVideo.NT.HW]
AddReg=USBVideo.HW.AddReg
[USBVideo.HW.AddReg]
HKR,, SensorCameraMode, 0x00010001,1      ; places the value under device HW
                                          ; Registry key
HKR,, SkipCameraEnumeration, 0x00010001,1 ; This makes the camera available
                                          ; only for application looking for
                                          ; IR cameras
如果未在固件或 INF 中指定 SensorCameraMode 和 SkipCameraEnumeration 属性,相机将注册为彩色相机,并且仅对彩色相机感知应用程序可见。
IR 流
Windows 收件箱 USB 视频类 (UVC) 驱动程序支持以 YUV 格式捕获场景的相机,并将像素数据以未压缩的 YUV 或压缩的 MJPEG 帧的形式通过 USB 传输。
应按照 WDK ksmedia.h 头文件中的定义,在流视频格式描述符中指定以下格式类型 GUID:
| 类型 | DESCRIPTION | 
|---|---|
| KSDATAFORMAT_SUBTYPE_L8_IR | 未压缩的 8 位 luma 平面。 此类型映射到 MFVideoFormat_L8。 | 
| KSDATAFORMAT_SUBTYPE_L16_IR | 未压缩的 16 位 luma 平面。 此类型映射到 MFVideoFormat_L16。 | 
| KSDATAFORMAT_SUBTYPE_MJPG_IR | 压缩的 MJPEG 帧。 媒体基础将此帧转换为 NV12 未压缩的帧,并且仅使用 luma 平面。 | 
在帧描述符的 guidFormat 字段中指定这些格式类型 GUID 时,Media Foundation 捕获管道会将流标记为 IR 流。 使用 Media Foundation FrameReader API 编写的应用程序将能够使用 IR 流。 IR 流的管道不支持 IR 帧的缩放或转换。
公开 IR 格式类型的流不得公开 RGB 或深度格式类型。
// Example Format Descriptor for UVC 1.1 frame based format
typedef struct _VIDEO_FORMAT_FRAME
{
    UCHAR bLength;
    UCHAR bDescriptorType;
    UCHAR bDescriptorSubtype;
    UCHAR bFormatIndex;
    UCHAR bNumFrameDescriptors;
    GUID  guidFormat;  // this field should contain the IR subtype GUID
    UCHAR bBitsPerPixel;
    UCHAR bDefaultFrameIndex;
    UCHAR bAspectRatioX;
    UCHAR bAspectRatioY;
    UCHAR bmInterlaceFlags;
    UCHAR bCopyProtect;
    UCHAR bVariableSize;
} VIDEO_FORMAT_FRAME, *PVIDEO_FORMAT_FRAME;
注释
IR 流将在 DShow 中显示为常规捕获流。
深度流
Windows 收件箱 USB 视频类驱动程序支持生成深度流的相机。 这些相机捕获场景的深度信息(例如飞行时间),并通过 USB 以未压缩的 YUV 帧的形式传输深度地图。 应按照 WDK ksmedia.h 头文件中的定义,在流视频格式描述符中指定以下格式类型 GUID:
| 类型 | DESCRIPTION | 
|---|---|
| KSDATAFORMAT_SUBTYPE_D16 | 16 位深度映射值。 此类型与 MFVideoFormat_D16相同。 这些值以毫米为单位。 | 
在框架描述符的 guidFormat 成员中指定格式类型 GUID 时,Media Foundation 捕获管道会将流标记为深度流。 使用 FrameReader API 编写的应用程序将能够消费深度数据流。 处理深度流的管道不支持对深度帧进行缩放或转换。
公开深度格式类型的流不得公开 RGB 或 IR 格式类型。
// Example Format Descriptor for UVC 1.1 frame based format
typedef struct _VIDEO_FORMAT_FRAME
{
    UCHAR bLength;
    UCHAR bDescriptorType;
    UCHAR bDescriptorSubtype;
    UCHAR bFormatIndex;
    UCHAR bNumFrameDescriptors;
    GUID guidFormat; // this field should contain the IR subtype GUID
    UCHAR bBitsPerPixel;
    UCHAR bDefaultFrameIndex;
    UCHAR bAspectRatioX;
    UCHAR bAspectRatioY;
    UCHAR bmInterlaceFlags;
    UCHAR bCopyProtect;
    UCHAR bVariableSize;
} VIDEO_FORMAT_FRAME, *PVIDEO_FORMAT_FRAME;
注释
深度流在 DShow 中显示为常规捕获流。
对相机进行分组
Windows 支持基于相机的容器 ID 对相机进行分组,以帮助应用程序处理相关相机。 例如,在同一物理设备上存在的 IR 相机和彩色相机可以作为相关相机向 OS 公开。 这使得像 Windows Hello 这样的应用程序在其场景中使用相关的相机。
相机函数之间的关系可以在固件中的相机的 BOS 描述符中指定。 UVC 驱动程序将利用此信息,并将这些相机功能以相关功能的方式呈现。 这使得操作系统相机堆栈将其呈现为应用程序的相关相机组。
相机固件必须指定 UVC-FSSensorGroupID,它是采用带大括号的字符串形式的 GUID。 具有相同 UVC-FSSensorGroupID 的相机将组合在一起。
可以通过在固件中指定 UVC-FSSensorGroupName(Unicode 字符串)来为传感器组指定名称。
有关指定 UVC-FSSensorGroupID 和 UVC-FSSensorGroupName 的示例 BOS,请参阅下面的示例复合设备部分。
如果无法按上述方式更新设备固件,则可以使用自定义 INF,并通过指定传感器组 ID 和名称来指定相机是传感器组的一部分,如下所示。 自定义 INF 文件(基于收件箱 UVC 驱动程序)必须包含以下 AddReg 条目:
FSSensorGroupID:REG_SZ:“{你的传感器组 ID GUID}”
FSSensorGroupName:REG_SZ:“传感器组友好名称”
自定义 INF 部分的示例如下所示:
[USBVideo.NT.Interfaces]
AddInterface=%KSCATEGORY_CAPTURE%,GLOBAL,USBVideo.Interface
AddInterface=%KSCATEGORY_RENDER%,GLOBAL,USBVideo.Interface
AddInterface=%KSCATEGORY_VIDEO%,GLOBAL,USBVideo.Interface
AddInterface=%KSCATEGORY_RENDER_EXT%,GLOBAL,USBVideo.Interface
AddInterface=%KSCATEGORY_VIDEO_CAMERA%,GLOBAL,USBVideo.Interface
[USBVideo.Interface]
AddReg=USBVideo.Interface.AddReg
[USBVideo.Interface.AddReg]
HKR,,CLSID,,%ProxyVCap.CLSID%
HKR,,FriendlyName,,%USBVideo.DeviceDesc%
HKR,,RTCFlags,0x00010001,0x00000010
HKR,, FSSensorGroupID,0x00000000,%FSSensorGroupID%
HKR,, FSSensorGroupName,0x00000000,%FSSensorGroupName%
注释
DirectShow 捕获管道不支持传感器组。
方法 2 或方法 3 仍然支持捕获功能
UVC 规范确实提供了一种机制,用于指定视频流接口是否支持方法 1/2/3 类型的静止图像捕获。 为了使操作系统利用设备的静态图像捕获支持(方法 2/3),设备固件可以通过 UVC 驱动程序在 BOS 描述符中指定一个值。
要指定启用方法 2/3 静止图像捕获的值是名为 UVC-EnableDependentStillPinCapture 的 DWORD。 使用 BOS 描述符指定其值。 下面的示例 复合设备 演示如何使用示例 BOS 描述符启用静止图像捕获。
如果无法按上述方式更新设备固件,可以使用自定义 INF 文件指定相机支持静态捕获方法 2 或方法 3。
自定义 INF 文件(基于自定义 UVC 驱动程序或收件箱 UVC 驱动程序)必须包含以下 AddReg 条目:
EnableDependentStillPinCapture:REG_DWORD:0x0(禁用)到 0x1(启用)
如果此项设置为“已启用”(0x1),则捕获管道将方法 2/3 用于静止图像捕获(假定固件也宣告支持 UVC 规范中指定的方法 2/3)。
自定义 INF 部分的示例如下所示:
[USBVideo.NT.Interfaces]
AddInterface=%KSCATEGORY_CAPTURE%,GLOBAL,USBVideo.Interface
AddInterface=%KSCATEGORY_RENDER%,GLOBAL,USBVideo.Interface
AddInterface=%KSCATEGORY_VIDEO%,GLOBAL,USBVideo.Interface
AddInterface=%KSCATEGORY_RENDER_EXT%,GLOBAL,USBVideo.Interface
AddInterface=%KSCATEGORY_VIDEO_CAMERA%,GLOBAL,USBVideo.Interface
[USBVideo.Interface]
AddReg=USBVideo.Interface.AddReg
[USBVideo.Interface.AddReg]
HKR,,CLSID,,%ProxyVCap.CLSID%
HKR,,FriendlyName,,%USBVideo.DeviceDesc%
HKR,,RTCFlags,0x00010001,0x00000010
HKR,,EnableDependentStillPinCapture,0x00010001,0x00000001
设备 MFT 级联
设备 MFT 是 IHV 和 OEM 的建议用户模式插件机制,用于扩展 Windows 上的相机功能。
在 Windows 10 版本 1703 之前,相机管道仅支持一个 DMFT 扩展插件。
从 Windows 10 版本 1703 开始,Windows 相机管道支持一个最多包含两个 DMFT 的可选链。
从 Windows 11 版本 22H2 开始,Windows 相机管道支持最多可选的四个 DMFT 组成的链。
这为 OEM 和 IHV 提供了更大的灵活性,以后处理相机流的形式提供增值功能。 例如,设备可以使用 PDMFT 以及 IHV DMFT 和 OEM DMFT。
下图说明了涉及 DMFT 链的体系结构。
              
              
            
捕获的数据样本从相机驱动程序传递到 DevProxy,然后经过 DMFT 链。 链中的每个 DMFT 都有机会处理样本。 如果 DMFT 不想处理样本,它可以作为中转,直接将样本传递给下一个 DMFT。
对于 KsProperty 等控件,调用将进入上游 – 链中的最后一个 DMFT 先获取调用,可以在该处处理该调用,也可以传递到链中的上一个 DMFT。
错误从 DMFT 传播到 DTM,然后传播到应用程序。 对于 IHV/OEM DMFT,如果任何 DMFT 无法实例化,这将导致 DTM 出现致命错误。
关于 DMFTs 的要求:
DMFT 的输入引脚计数必须与以前的 DMFT 的输出引脚计数匹配,否则 DTM 在初始化期间会失败。 但是,同一 DMFT 的输入和输出引脚计数不需要匹配。
DMFT 需要支持接口 - IMFDeviceTransform、IMFShutdown、IMFRealTimeClientEx、IKsControl 和 IMFMediaEventGenerator;如果已配置 MFT0,或者链中的下一个 DMFT 需要 IMFTransform 支持,则可能需要支持 IMFTransform。
在不使用帧服务器的 64 位系统上,必须注册 32 位和 64 位 DMFT。 鉴于 USB 相机可能插入任意系统,对于“外部”(或非收件箱)USB 相机,USB 相机供应商应同时提供 32 位和 64 位 DMFT。
配置 DMFT 链
相机设备可以通过一份自定义 INF 文件,在 DLL 中提供 DMFT COM 对象,该文件使用收件箱 USBVideo.INF 中的部分内容。
在自定义 .INF 文件的“Interface AddReg”部分中,通过添加以下注册表项来指定 DMFT CLSID 的值。
CameraDeviceMftCLSIDChain (REG_MULTI_SZ) %Dmft0.CLSID%,%Dmft,CLSID%,%Dmft2.CLSID%
如下面的示例 INF 设置(将 %Dmft0.CLSID% 和 % Dmft1.CLSID% 替换为用于 DMFT 的实际 CLSID 字符串),Windows 10 版本 1703 中最多允许 2 个 CLID,第一个 ID 最接近 DevProxy,最后一个是链中的最后一个 DMFT。
平台 DMFT CLSID 为 {3D096DDE-8971-4AD5-98F9-C74F56492630}。
一些示例 CameraDeviceMftCLSIDChain 设置:
无 IHV/OEM DMFT 或平台 DMFT
- CameraDeviceMftCLSIDChain = “” (或不需要指定此注册表项)
 
IHV/OEM DMFT
- CameraDeviceMftCLSIDChain = %Dmft。CLSID%
 
平台 DMFT <-> IHV/OEM DMFT
CameraDeviceMftCLSIDChain = “{3D096DDE-8971-4AD5-98F9-C74F56492630}”,%Dmft.CLSID%
这是包含平台 DMFT 和 DMFT(GUID {D671BE6C-FDB8-424F-81D7-03F5B1CE2CC7})的 USB 相机结果注册表项链的屏幕截图。
              
              
            
IHV/OEM DMFT0 <-> IHV/OEM DMFT1
- CameraDeviceMftCLSIDChain = %Dmft0.CLSID%,%Dmft1.CLSID%,
 
注释
CameraDeviceMftCLSIDChain 最多可以有 2 个 CLSID。
如果配置了 CameraDeviceMftCLSIDChain,DTM 会跳过旧的 CameraDeviceMftCLSID 设置。
如果未配置 CameraDeviceMftCLSIDChain,并且配置了旧版 CameraDeviceMftCLSID,则链将如下所示(如果其 USB 相机受平台 DMFT 支持并已启用)DevProxy <–> Platform DMFT <–> OEM/IHV DMFT,或者(如果平台 DMFT 不支持该相机或平台 DMFT 已禁用)DevProxy <-> OEM/IHV DMFT。
INF 文件设置示例:
[USBVideo.Interface.AddReg]
HKR,,CLSID,,%ProxyVCap.CLSID%
HKR,,FriendlyName,,%USBVideo.DeviceDesc%
HKR,,RTCFlags,0x00010001,0x00000010
HKR,,EnablePlatformDmft,0x00010001,0x00000001
HKR,,DisablePlatformDmftFeatures,0x00010001,0x00000001
HKR,,CameraDeviceMftCLSIDChain, 0x00010000,%Dmft0.CLSID%,%Dmft1.CLSID%
MFT 平台设备
从 Windows 10 版本 1703 开始,Windows 以选择方式为称为平台 DMFT(PDMFT)的 UVC 相机提供收件箱设备 MFT。 此 DMFT 允许 IHV 和 OEM 利用 Windows 提供的后期处理算法。
| 平台 DMFT 支持的功能 | Windows 版本 | 
|---|---|
| 在支持 ROI 的 USB 相机中,为 3A 调整启用基于人脸的感兴趣区域(ROI)。 | Windows 10 版本 1703 | 
注释
如果相机不支持基于 UVC 1.5 的 ROI,即使设备选择使用 PDMFT,PDMFT 仍然不会加载。
UVC 相机可以通过 BOS 描述符指定 EnablePlatformDmft,从而选择启用平台 DMFT 功能。
要指定启用平台 DMFT 的值是 DWORD,名称 为 UVC-EnablePlatformDmft ,并使用 BOS 描述符指定其值。 下面的 示例复合设备 部分展示了如何通过使用示例 BOS 描述符来启用平台 DMFT。
如果无法按上文所述更新设备固件,可以使用自定义 INF 文件为设备启用平台 DMFT。
自定义 INF 文件(基于自定义 UVC 驱动程序或收件箱 UVC 驱动程序)必须包含以下 AddReg 条目:
EnablePlatformDmft:REG_DWORD:0x0(禁用)到 0x1(启用)
当此项设置为“已启用”(0x1),捕获管道将收件箱平台 DMFT 用于设备。 下面显示了此自定义 INF 部分的示例:
[USBVideo.NT.Interfaces]
AddInterface=%KSCATEGORY_CAPTURE%,GLOBAL,USBVideo.Interface
AddInterface=%KSCATEGORY_RENDER%,GLOBAL,USBVideo.Interface
AddInterface=%KSCATEGORY_VIDEO%,GLOBAL,USBVideo.Interface
AddInterface=%KSCATEGORY_RENDER_EXT%,GLOBAL,USBVideo.Interface
AddInterface=%KSCATEGORY_VIDEO_CAMERA%,GLOBAL,USBVideo.Interface
[USBVideo.Interface]
AddReg=USBVideo.Interface.AddReg
[USBVideo.Interface.AddReg]
HKR,,CLSID,,%ProxyVCap.CLSID%
HKR,,FriendlyName,,%USBVideo.DeviceDesc%
HKR,,RTCFlags,0x00010001,0x00000010
HKR,,EnablePlatformDmft,0x00010001,0x00000001
在 Windows 10 版本 1703 中,如果设备选择使用 PDMFT,则会启用 PDMFT 支持的所有功能(基于设备功能)。 不支持 PDMFT 功能的细粒度配置。
注释
基于人脸的 ROI 坐标相对于传输到 PDMFT 的图像的视野进行计算。 如果由于使用诸如缩放、平移、倾斜或数字窗口之类的控件而修改了视野,那么相机负责将提供的坐标映射回传感器的完整视野,同时考虑当前缩放/平移窗口的状态。
通过 MS OS 描述符的人脸身份验证配置文件
Windows 10 RS5 现在为任何支持 Windows Hello 的相机强制实施人脸身份验证配置文件 V2 要求。 对于具有自定义相机驱动程序堆栈的基于 MIPI 的系统,此支持可以通过 INF(或扩展 INF)文件或通过用户模式插件(设备 MFT)进行发布。
但是,对于 USB 视频设备,基于 UVC 的相机有一个限制,即在 Windows 10 19H1 中,不允许使用自定义相机驱动程序。 所有基于 UVC 的相机都必须使用内置的 USB 视频类驱动程序,并且任何供应商扩展都必须以设备 MFT 的形式实现。
对于许多 OEM/ODM,相机模块的首选方法是通过Microsoft OS 描述符在模块的固件中实现大部分功能。
以下相机支持通过 MSOS 描述符(也称为 BOS 描述符)发布人脸身份验证配置文件:
仅在传感器组中与单独的 IR 相机一起使用的 RGB 相机。
仅用于传感器组中的 IR 相机,需要搭配单独的 RGB 相机使用。
带独立 IR 和 RGB 引脚的 RGB+IR 相机。
注释
如果相机固件不能满足上述三个要求之一,ODM/OEM 必须使用扩展 INF 来声明相机配置文件 V2。
Microsoft 操作系统描述符布局示例
下面提供了以下规范的示例:
Microsoft OS 扩展描述符规范 1.0
Microsoft OS 2.0 描述符规范
Microsoft OS 扩展描述符 1.0 规范
扩展属性 操作系统描述符有两个组件
- 固定长度标头部分
 - 标题节后面的一个或多个可变长度自定义属性节
 
Microsoft OS 1.0 描述符标头部分
“Header”部分描述一个自定义属性(Face Auth Profile)。
| Offset | 领域 | 大小(字节) | 价值 | DESCRIPTION | 
|---|---|---|---|---|
| 0 | dwLength | 4 | <> | |
| 4 | bcdVersion | 2 | 0x0100 | 版本 1.0 | 
| 6 | wIndex | 2 | 0x0005 | 扩展属性 OS 描述符 | 
| 8 | wCount | 2 | 0x0001 | 一个自定义属性 | 
Microsoft OS 1.0 描述符自定义属性部分
| Offset | 领域 | 大小(字节) | 价值 | DESCRIPTION | 
|---|---|---|---|---|
| 0 | dwSize | 4 | 0x00000036 (54) | 此属性的总大小(以字节为单位)。 | 
| 4 | dwPropertyDataType | 4 | 0x00000004 | REG_DWORD_LITTLE_ENDIAN | 
| 8 | wPropertyNameLength | 2 | 0x00000024 (36) | 属性名称的大小(以字节为单位)。 | 
| 10 | bPropertyName | 36 | UVC-CPV2FaceAuth | Unicode 中的“UVC-CPV2FaceAuth”字符串。 | 
| 46 | dwPropertyDataLength | 4 | 0x00000004 | 属性数据(sizeof(DWORD)的 4 字节。 | 
| 50 | bPropertyData | 4 | 请参阅下面的数据架构 | 请参阅下面的数据架构。 | 
有效负载架构
UVC-CPV2FaceAuth 数据有效负载是 32 位无符号整数。 高阶 16 位表示 RGB 引脚所公开的媒体类型列表中的以 0 为起始的索引。 低位 16 位表示通过 IR 引脚公开的媒体类型列表从 0 开始的索引。
类型 3 相机按 RGB 引脚声明的顺序曝光以下媒体类型:
YUY2,640x480@30fps
MJPG,1280x720@30fps
MJPG,800x600@30fps
MJPG,1920x1080@30fps
以下是 IR 的媒体类型:
L8、480x480@30fps
L8、480x480@15fps
L8、480x480@10fps
有效负载值0x00010000将导致发布以下人脸身份验证配置文件:
Pin0:(RES==1280,720;FRT==30,1;SUT==MJPG) // 第二种媒体类型 (0x0001)
Pin1:(RES==480,480;FRT==30,1;SUT==L8) // 第一媒体类型 (0x0000)
注释
撰写本文时,Windows Hello 对 RGB 流的最低要求为 480x480@7.5fps,IR 流340x340@15fps。 当启用面部身份验证配置文件时,要求 IHV/OEM 选择满足此要求的媒体类型。
类型 1 相机示例
对于类型1相机,由于没有IR引脚(期望类型1相机在一个传感器组中与设备上的类型2相机配对),因此仅发布RGB媒体类型索引。 对于 IR 媒体类型索引,有效负载的低序 16 位值必须设置为0xFFFF。
例如,如果类型 1 相机公开了以下媒体类型列表:
YUY2,640x480@30fps
MJPG,1280x720@30fps
MJPG,800x600@30fps
MJPG,1920x1080@30fps
若要使用媒体类型 MJPG, 1280x720@30fps 发布 CPV2FaceAuth,必须将负载设置为 0x0001FFFF。
类型 2 相机示例
对于类型 2 相机,高阶 16 位必须设置为0xFFFF,低序 16 位表示要使用的 IR 媒体类型。
例如,对于具有以下媒体类型的类型 2 相机:
L8、480x480@30fps
L8、480x480@15fps
L8、480x480@10fps
如果第一种媒体类型用于人脸身份验证,该值必须为:0xFFFF0000。
Microsoft OS 扩展描述符 2.0 规范
MSOS 扩展描述符 2.0 可用于定义注册表值以添加人脸身份验证配置文件支持。 这是使用 Microsoft OS 2.0 注册表属性描述符完成的。
对于 UVC-CPV2FaceAuth 注册表项,下面显示了一个示例 MSOS 2.0 描述符集:
UCHAR Example2_MSOS20DescriptorSet_UVCFaceAuthForFutureWindows[0x3C] =
{
    //
    // Microsoft OS 2.0 Descriptor Set Header
    //
    0x0A, 0x00,               // wLength - 10 bytes
    0x00, 0x00,               // MSOS20_SET_HEADER_DESCRIPTOR
    0x00, 0x00, 0x0?, 0x06,   // dwWindowsVersion – 0x060?0000 for future Windows version
    0x3C, 0x00,               // wTotalLength – 60 bytes
    //
    // Microsoft OS 2.0 Registry Value Feature Descriptor
    //
    0x32, 0x00,               // wLength - 50 bytes
    0x04, 0x00,               // wDescriptorType – 4 for Registry Property
    0x04, 0x00,               // wPropertyDataType - 4 for REG_DWORD_LITTLE_ENDIAN
    0x30, 0x00,               // wPropertyNameLength – 36 bytes
    0x55, 0x00, 0x56, 0x00,   // Property Name - "UVC-CPV2FaceAuth"
    0x43, 0x00, 0x2D, 0x00,
    0x43, 0x00, 0x50, 0x00,
    0x56, 0x00, 0x32, 0x00,
    0x46, 0x00, 0x61, 0x00,
    0x63, 0x00, 0x65, 0x00,
    0x41, 0x00, 0x75, 0x00,
    0x74, 0x00, 0x68, 0x00,
    0x00, 0x00, 0x00, 0x00,
    0x04, 0x00,               // wPropertyDataLength – 4 bytes
    0x00, 0x00, 0x01, 0x00    // PropertyData – 0x00010000 (see Payload Schema)
}
添加 UVC-CPV2FaceAuth 注册表项时,设备无需发布 EnableDshowRedirection 注册表项,如 DShow Bridge 实现 UVC 设备的指南中所述。
但是,如果设备供应商必须支持较旧版本的 Windows 和/或需要在 Frame Server 中启用 MJPEG 解压缩,则必须添加 EnableDshowRedirection 注册表项。
传感器组生成
当 OEM 使用类型 1 和类型 2 相机生成系统以提供 RGB 和 IR 流以支持 Windows Hello 时,OEM 必须声明这两个相机是合成传感器组的一部分。
为此,要在每个相机的设备接口属性下创建的扩展 INF 中声明 FSSensorGroupId 和 FSSensorGroupName 标签。
但是,如果未提供扩展 INF,ODM 可能会使用相同的 MSOS 描述符发布 FSSensorGroupId 和 FSSensorGroupName 值。 收件箱 Windows 10 USB 视频类驱动程序将自动获取其有效负载名称以“UVC-”为前缀的任何 MSOS 描述符,并将标记迁移到设备接口属性存储(删除“UVC-”前缀)。
因此,发布以下内容的类型 1 和类型 2 相机将允许 OS 将相机合成为多设备传感器组,以便与 Windows Hello 配合使用:
UVC-FSSensorGroupId
UVC-FSSensorGroupName
每个标记的有效负载必须是 Unicode 字符串。 UVC-FSSensorGroupId 有效负载必须是以下格式的 GUID 字符串:
{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}
GUID 的值在类型 1 和类型 2 相机之间必须相同,并且两个相机都必须添加到相同的物理机箱中。 对于内置相机,物理底盘是计算机本身。 对于外部相机,类型 1 和类型 2 相机模块必须内置到连接到计算机的同一物理设备中。
传感器组的自定义设备接口类别
从 19H1 开始,Windows 提供 IHV/OEM 指定的扩展机制,允许将合成传感器组发布到任何自定义或预定义类别。 传感器组的生成由 IHV/OEM 在自定义 INF 中提供传感器组 ID 密钥来定义。
FSSensorGroupId: {Custom GUID}
FSSensorGroupName: <用于传感器组的友好名称>
除了 INF 中的两个上述 AddReg 条目外,还为自定义类别定义了一个新的 AddReg 条目:
FSSensorGroupCategoryList: {GUID};{GUID};...;{GUID}
使用分号 (;) 分隔的 GUID 列表定义多个类别。
声明匹配 FSSensorGroupId 的每个设备都必须声明相同的 FSSensorGroupCategoryList。 如果列表不匹配,则忽略所有列表,并且传感器组默认发布到KSCATEGORY_SENSOR_GROUP,就好像未定义任何自定义类别一样。
相机旋转
查看 相机设备方向
UVC 控制缓存
请参阅 UVC 控制缓存
BOS 和 MS OS 2.0 描述符
UVC 兼容的相机可以通过固件中的平台功能 BOS 描述符,使用 Microsoft OS 2.0 描述符指定 Windows 特定的设备配置值。 请参阅 MS OS 2.0 描述符上的文档,了解如何指定将设备配置传达给 OS 的有效 BOS 描述符。
Microsoft OS 2.0 描述符集标头
| Offset | 领域 | 大小(字节) | DESCRIPTION | 
|---|---|---|---|
| 0 | wLength | 2 | 此标头的长度(以字节为单位)必须为 10。 | 
| 2 | wDescriptorType | 2 | MSOS20_SET_HEADER_DESCRIPTOR | 
| 4 | dwWindowsVersion | 4 | Windows 版本。 | 
| 8 | wTotalLength | 2 | 整个 MS OS 2.0 描述符集的大小,包括此标头的大小。 | 
Microsoft OS 2.0 注册表属性描述符
| Offset | 领域 | 大小(字节) | DESCRIPTION | 
|---|---|---|---|
| 0 | wLength | 2 | 此描述符的长度(以字节为单位) | 
| 2 | wDescriptorType | 2 | MS_OS_20_FEATURE_REG_PROPERTY | 
| 4 | wPropertyDataType | 2 | 0x04(REG_DWORD_LITTLE_ENDIAN) | 
| 6 | wPropertyNameLength | 2 | 属性名称的长度。 | 
| 8 | 属性名称 | 变量 | 注册表属性的名称。 | 
| 8+M | wPropertyDataLength | 2 | 属性数据的长度。 | 
| 10+M | PropertyData | 变量 | 属性数据 | 
在固件中指定有效的 MS OS 2.0 描述符时,USB 堆栈会将配置值复制到设备 HW 注册表项中,如下所示:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\<Device ID>\<Instance ID>\Device Parameters
UVC 驱动程序从设备 HW 注册表项读取配置值,并相应地在 OS 上配置设备。 例如,如果固件使用配置值将设备指定为传感器相机,那么 UVC 驱动程序会在该类别下注册该设备。
通过平台 BOS 描述符配置 UVC 设备是 Windows 10 版本 1703 中启用的机制,可帮助 UVC 设备供应商在没有 Windows OS 上的 INF 文件的情况下配置设备。
仍支持通过自定义 INF 配置 UVC 设备,并且优先于基于 BOS 描述符的机制。 通过 INF 指定设备属性时,无需添加前缀“UVC-”。 只有通过 BOS 描述符指定的设备属性以及特定于接口实例的设备属性才需要此前缀。 如果设备需要用户模式插件(如 DMFT),则需要提供 INF 来安装 DMFT。 无法使用固件对其进行配置。
当前通过 BOS 描述符支持的配置值
| 配置名称 | 类型 | DESCRIPTION | 
|---|---|---|
| 传感器摄像头模式 | REG_DWORD | 在特定类别下注册相机。 | 
| UVC-FSSensorGroupID,UVC-FSSensorGroupName | REG_SZ | 使用相同的 UVC-FSSensorGroupID 对相机进行分组 | 
| UVC-EnableDependentStillPinCapture | REG_DWORD | 启用静态捕捉方法 2/3 | 
| UVC-EnablePlatformDmft | REG_DWORD | 启用平台 DMFT | 
当 UVC 驱动程序看到前缀为“UVC-”的注册表值时,它会使用不带前缀的相同值填充设备的类别接口实例注册表项。 驱动程序针对固件指定的任何变量执行此作,而不仅仅是上面列出的变量。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceClasses\{e5323777-f976-4f5b-9b55-b94699c46e44}\<Device Symbolic Link>\Device Parameters
为了使 OS 能够使用 BOS 平台设备功能和 MS OS 2.0 描述符,设备描述符必须指定 bcdUSB 版本为 0x0210 或更高。
复合设备示例
本部分为具有两个相机功能的示例复合设备提供了 BOS 描述符和 MS OS 2.0 描述符。 一个功能是 UVC 彩色相机,第二个功能是 UVC IR 相机。
示例描述符如下所示:
在 KSCATEGORY_VIDEO_CAMERA 下注册彩色相机功能
在 KSCATEGORY_SENSOR_CAMERA 下注册 IR 相机功能
启用彩色相机的静态图像捕获功能
将颜色和 IR 相机功能关联为组
设备枚举后,USB 堆栈将从设备检索 BOS 描述符。 在 BOS 描述符之后是平台特定的设备功能。
#include <usbspec.h>
const BYTE USBVideoBOSDescriptor[0x21] =
{
    /* BOS Descriptor */
    0x05,                       // Descriptor size
    USB_BOS_DESCRIPTOR_TYPE,    // Device descriptor type BOS
    0x21, 0x00,                 // Length 0x21 (33) this and all sub descriptors
    0x01,                       // Number of device capability descriptors
    /* Platform Device Capability Descriptor */
    0x1C,                                   // 28 bytes bLength
    USB_DEVICE_CAPABILITY_DESCRIPTOR_TYPE,  // Platform Descriptor type
    USB_DEVICE_CAPABILITY_PLATFORM,         // bDevCapabilityType PLATFORM
    0,                                      // bReserved
    0xDF, 0x60, 0xDD, 0xD8,                 // PlatformCapabilityUUID
    0x89, 0x45,                             // MS OS2.0 Descriptor
    0xC7, 0x4C,                             // D8DD60DF-4589-4CC7-9CD2-659D9E648A9F
    0x9C, 0xD2, 0x65, 0x9D, 0x9E, 0x64, 0x8A, 0x9F,
                                            // CapabilityData
    0x00, 0x00, 0x00, 0x0A,                 // dwWindowsVersion for Windows 10 and later
    0xC8, 0x02,                             // wLength 0x2C8 (712)
    0x01,                                   // bMS_VendorCode - any value. e.g. 0x01
    0x00                                    // bAltEnumCmd 0
};
BOS 平台功能描述符指定:
MS OS 2.0 描述符平台功能 GUID
供应商控制代码 bMS_VendorCode(在此处设置为 1,供应商可以首选任何值)用于检索 MS OS 2.0 描述符。
此 BOS 描述符适用于 OS 版本 Windows 10 及更高版本。
看到 BOS 描述符后,USB 堆栈将发出供应商特定的控制请求来检索 MS OS 2.0 描述符。
用于检索 MS OS 2.0 供应商特定描述符的控制请求的格式:
| bmRequestType | BRequest | wValue | WIndex | wLength | 数据 | 
|---|---|---|---|---|---|
| 1100 0000B | bMS_VendorCode | 0x00 | 0x07 | 长度 | 返回的 MS OS 2.0 描述符集 blob | 
bmRequestType
数据传输方向 - 设备到主机
类型 – 供应商
收件人 - 设备
bRequest
在描述符集信息结构中返回的 bMS_VendorCode 值。
wValue
设置为0x00。
wIndex
0x7 用于 MS_OS_20_DESCRIPTOR_INDEX。
wLength
MS OS 2.0 描述符集的长度,如 BOS 描述符中返回。 本示例中0x25C (604)。
设备应返回 MS OS 2.0 描述符,如 USBVideoMSOS20DescriptorSet 中指定的描述符。
USBVideoMSOS20DescriptorSet 描述颜色和 IR 函数。 它指定以下 MS OS 2.0 描述符值:
设置标头
配置子集标头
彩色相机函数子集标头
传感器组 ID 的注册表值功能描述符
传感器组名称的注册表值功能描述符
用于启用静止映像捕获的注册表值功能描述符
用于启用平台 DMFT 的注册表值功能描述符
IR 相机函数子集标头
传感器组 ID 的注册表值功能描述符
传感器组名称的注册表值功能描述符
注册表值功能描述符,用于将相机注册为传感器相机
固件将为供应商请求提供处理程序,该请求将返回本部分开头所述的虚构设备的以下 MS OS 2.0 描述符。
UCHAR USBVideoMSOS20DescriptorSet[0x2C8] =
{
    /* Microsoft OS 2.0 Descriptor Set Header */
    0x0A, 0x00,             // wLength of MSOS20_SET_HEADER_DESCRIPTOR
    0x00, 0x00,             // wDescriptorType == MSOS20_SET_HEADER_DESCRIPTOR
    0x00, 0x00, 0x00, 0x0A, // dwWindowsVersion – 0x10000000 for Windows 10
    0xC8, 0x02,             // wTotalLength - Total length 0x2C8 (712)
    /* Microsoft OS 2.0 Configuration Subset Header */
    0x08, 0x00,             // wLength of MSOS20_SUBSET_HEADER_CONFIGURATION
    0x01, 0x00,             // wDescriptorType == MSOS20_SUBSET_HEADER_CONFIGURATION
    0x00,                   // bConfigurationValue set to the first configuration
    0x00,                   // bReserved set to 0.
    0xBE, 0x02,             // wTotalLength - Total length 0x2BE (702)
    /****************Color Camera Function******************/
    /* Microsoft OS 2.0 Function Subset Header */
    0x08, 0x00,             // wLength of MSOS20_SUBSET_HEADER_FUNCTION
    0x02, 0x00,             // wDescriptorType == MSOS20_SUBSET_HEADER_FUNCTION
    0x00,                   // bFirstInterface field of the first IAD
    0x00,                   // bReserved set to 0.
    0x6E, 0x01,             // wSubsetLength - Length 0x16E (366)
    /****************Register the Color Camera in a sensor group******************/
    /* Microsoft OS 2.0 Registry Value Feature Descriptor */
    0x80, 0x00,             // wLength 0x80 (128) in bytes of this descriptor
    0x04, 0x00,             // wDescriptorType – MSOS20_FEATURE_REG_PROPERTY
    0x01, 0x00,             // wPropertyDataType - REG_SZ
    0x28, 0x00,             // wPropertyNameLength – 0x28 (40) bytes
    'U', 0x00, 'V', 0x00,   // Property Name - "UVC-FSSensorGroupID"
    'C', 0x00, '-', 0x00,
    'F', 0x00, 'S', 0x00,
    'S', 0x00, 'e', 0x00,
    'n', 0x00, 's', 0x00,
    'o', 0x00, 'r', 0x00,
    'G', 0x00, 'r', 0x00,
    'o', 0x00, 'u', 0x00,
    'p', 0x00, 'I', 0x00,
    'D', 0x00, 0x00, 0x00,
    0x4E, 0x00,             // wPropertyDataLength – 0x4E (78) bytes
                            // FSSensorGroupID GUID in string format:
                            // "{20C94C5C-F402-4F1F-B324-0C1CF0257870}"
    '{', 0x00, '2', 0x00,   // This is just an example GUID.
    '0', 0x00, 'C', 0x00,   // You need to generate and use your
    '9', 0x00, '4', 0x00,   // own GUID for the sensor group ID
    'C', 0x00, '5', 0x00,
    'C', 0x00, '-', 0x00,
    'F', 0x00, '4', 0x00,
    '0', 0x00, '2', 0x00,
    '-', 0x00, '4', 0x00,
    'F', 0x00, '1', 0x00,
    'F', 0x00, '-', 0x00,
    'B', 0x00, '3', 0x00,
    '2', 0x00, '4', 0x00,
    '-', 0x00, '0', 0x00,
    'C', 0x00, '1', 0x00,
    'C', 0x00, 'F', 0x00,
    '0', 0x00, '2', 0x00,
    '5', 0x00, '7', 0x00,
    '8', 0x00, '7', 0x00,
    '0', 0x00, '}', 0x00,
    0x00, 0x00,
    /* Microsoft OS 2.0 Registry Value Feature Descriptor */
    0x56, 0x00,             // wLength 0x56 (86) in bytes of this descriptor
    0x04, 0x00,             // wDescriptorType – MSOS20_FEATURE_REG_PROPERTY
    0x01, 0x00,             // wPropertyDataType - REG_SZ
    0x2C, 0x00,             // wPropertyNameLength – 0x2C (44) bytes
    'U', 0x00, 'V', 0x00,   // Property Name - "UVC-FSSensorGroupName"
    'C', 0x00, '-', 0x00,
    'F', 0x00, 'S', 0x00,
    'S', 0x00, 'e', 0x00,
    'n', 0x00, 's', 0x00,
    'o', 0x00, 'r', 0x00,
    'G', 0x00, 'r', 0x00,
    'o', 0x00, 'u', 0x00,
    'p', 0x00, 'N', 0x00,
    'a', 0x00, 'm', 0x00,
    'e', 0x00, 0x00, 0x00,
    0x20, 0x00,             // wPropertyDataLength – 0x20 (32) bytes
                            // FSSensorGroupName "YourCameraGroup"
    'Y', 0x00, 'o', 0x00,
    'u', 0x00, 'r', 0x00,
    'C', 0x00, 'a', 0x00,
    'm', 0x00, 'e', 0x00,
    'r', 0x00, 'a', 0x00,
    'G', 0x00, 'r', 0x00,
    'o', 0x00, 'u', 0x00,
    'p', 0x00, 0x00, 0x00,
    /****************Enable Still Image Capture for Color Camera************/
    /* Microsoft OS 2.0 Registry Value Feature Descriptor */
    0x54, 0x00,             // wLength 0x54 (84) in bytes of this descriptor
    0x04, 0x00,             // wDescriptorType – MSOS20_FEATURE_REG_PROPERTY
    0x04, 0x00,             // wPropertyDataType - REG_DWORD
    0x46, 0x00,             // wPropertyNameLength – 0x46 (70) bytes
    'U', 0x00, 'V', 0x00,   // Property Name - "UVC-EnableDependentStillPinCapture"
    'C', 0x00, '-', 0x00,
    'E', 0x00, 'n', 0x00,
    'a', 0x00, 'b', 0x00,
    'l', 0x00, 'e', 0x00,
    'D', 0x00, 'e', 0x00,
    'p', 0x00, 'e', 0x00,
    'n', 0x00, 'd', 0x00,
    'e', 0x00, 'n', 0x00,
    't', 0x00, 'S', 0x00,
    't', 0x00, 'i', 0x00,
    'l', 0x00, 'l', 0x00,
    'P', 0x00, 'i', 0x00,
    'n', 0x00, 'C', 0x00,
    'a', 0x00, 'p', 0x00,
    't', 0x00, 'u', 0x00,
    'r', 0x00, 'e', 0x00,
    0x00, 0x00,
    0x04, 0x00,              // wPropertyDataLength – 4 bytes
    0x01, 0x00, 0x00, 0x00,   // Enable still pin capture using Method 2 or Method 3
    /****************Enable Platform DMFT for ROI-capable USB Camera************/
    /* Microsoft OS 2.0 Registry Value Feature Descriptor */
    0x3C, 0x00,             // wLength 0x3C (60) in bytes of this descriptor
    0x04, 0x00,             // wDescriptorType – MSOS20_FEATURE_REG_PROPERTY
    0x04, 0x00,             // wPropertyDataType - REG_DWORD
    0x2E, 0x00,             // wPropertyNameLength – 0x2E (46) bytes
    'U', 0x00, 'V', 0x00,   // Property Name - "UVC-EnablePlatformDmft"
    'C', 0x00, '-', 0x00,
    'E', 0x00, 'n', 0x00,
    'a', 0x00, 'b', 0x00,
    'l', 0x00, 'e', 0x00,
    'P', 0x00, 'l', 0x00,
    'a', 0x00, 't', 0x00,
    'f', 0x00, 'o', 0x00,
    'r', 0x00, 'm', 0x00,
    'D', 0x00, 'm', 0x00,
    'f', 0x00, 't', 0x00,
    0x00, 0x00,
    0x04, 0x00,              // wPropertyDataLength – 4 bytes
    0x01, 0x00, 0x00, 0x00,  // Enable Platform DMFT
    /****************IR Camera Function*********************************************/
    /* Microsoft OS 2.0 Function Subset Header */
    0x08, 0x00,             // wLength of MSOS20_SUBSET_HEADER_FUNCTION
    0x02, 0x00,             // wDescriptorType == MSOS20_SUBSET_HEADER_FUNCTION
    0x01,                   // bFirstInterface set of the second function
    0x00,                   // bReserved set to 0.
    0x48, 0x01,             // wSubsetLength - Length 0x148 (328)
    /********Register the IR Camera to the same sensor group as the Color Camera*****/
    /* Microsoft OS 2.0 Registry Value Feature Descriptor */
    0x80, 0x00,             // wLength 0x80 (128) in bytes of this descriptor
    0x04, 0x00,             // wDescriptorType – MSOS20_FEATURE_REG_PROPERTY
    0x01, 0x00,             // wPropertyDataType - REG_SZ
    0x28, 0x00,             // wPropertyNameLength – 0x28 (40) bytes
    'U', 0x00, 'V', 0x00,   // Property Name - "UVC-FSSensorGroupID"
    'C', 0x00, '-', 0x00,
    'F', 0x00, 'S', 0x00,
    'S', 0x00, 'e', 0x00,
    'n', 0x00, 's', 0x00,
    'o', 0x00, 'r', 0x00,
    'G', 0x00, 'r', 0x00,
    'o', 0x00, 'u', 0x00,
    'p', 0x00, 'I', 0x00,
    'D', 0x00, 0x00, 0x00,
    0x4E, 0x00,             // wPropertyDataLength – 78 bytes
                            // FSSensorGroupID GUID in string format:
                            // "{20C94C5C-F402-4F1F-B324-0C1CF0257870}"
    '{', 0x00, '2', 0x00,
    '0', 0x00, 'C', 0x00,
    '9', 0x00, '4', 0x00,
    'C', 0x00, '5', 0x00,
    'C', 0x00, '-', 0x00,
    'F', 0x00, '4', 0x00,
    '0', 0x00, '2', 0x00,
    '-', 0x00, '4', 0x00,
    'F', 0x00, '1', 0x00,
    'F', 0x00, '-', 0x00,
    'B', 0x00, '3', 0x00,
    '2', 0x00, '4', 0x00,
    '-', 0x00, '0', 0x00,
    'C', 0x00, '1', 0x00,
    'C', 0x00, 'F', 0x00,
    '0', 0x00, '2', 0x00,
    '5', 0x00, '7', 0x00,
    '8', 0x00, '7', 0x00,
    '0', 0x00, '}', 0x00,
    0x00, 0x00,
    /* Microsoft OS 2.0 Registry Value Feature Descriptor */
    0x56, 0x00,             // wLength 0x56 (86) in bytes of this descriptor
    0x04, 0x00,             // wDescriptorType – MSOS20_FEATURE_REG_PROPERTY
    0x01, 0x00,             // wPropertyDataType - REG_SZ
    0x2C, 0x00,             // wPropertyNameLength – 0x2C (44) bytes
    'U', 0x00, 'V', 0x00,   // Property Name - "UVC-FSSensorGroupName"
    'C', 0x00, '-', 0x00,
    'F', 0x00, 'S', 0x00,
    'S', 0x00, 'e', 0x00,
    'n', 0x00, 's', 0x00,
    'o', 0x00, 'r', 0x00,
    'G', 0x00, 'r', 0x00,
    'o', 0x00, 'u', 0x00,
    'p', 0x00, 'N', 0x00,
    'a', 0x00, 'm', 0x00,
    'e', 0x00, 0x00, 0x00,
    0x20, 0x00,             // wPropertyDataLength – 32 bytes
                            // FSSensorGroupName "YourCameraGroup"
    'Y', 0x00, 'o', 0x00,
    'u', 0x00, 'r', 0x00,
    'C', 0x00, 'a', 0x00,
    'm', 0x00, 'e', 0x00,
    'r', 0x00, 'a', 0x00,
    'G', 0x00, 'r', 0x00,
    'o', 0x00, 'u', 0x00,
    'p', 0x00, 0x00, 0x00,
    /****************Make IR camera visible to applications*********************/
    /* Microsoft OS 2.0 Registry Value Feature Descriptor */
    0x30, 0x00,             // wLength 0x30 (48) in bytes of this descriptor
    0x04, 0x00,             // wDescriptorType – MSOS20_FEATURE_REG_PROPERTY
    0x04, 0x00,             // wPropertyDataType - REG_DWORD
    0x22, 0x00,             // wPropertyNameLength – 0x22 (34) bytes
    'S', 0x00, 'e', 0x00,
    'n', 0x00, 's', 0x00,
    'o', 0x00, 'r', 0x00,
    'C', 0x00, 'a', 0x00,
    'm', 0x00, 'e', 0x00,
    'r', 0x00, 'a', 0x00,
    'M', 0x00, 'o', 0x00,
    'd', 0x00, 'e', 0x00,
    0x00, 0x00,
    0x04, 0x00,              // wPropertyDataLength – 4 bytes
    0x01, 0x00, 0x00, 0x00, // This exposes the camera to OS as an IR only camera
                            // i.e. KSCATEGORY_SENSOR_CAMERA
    /* Microsoft OS 2.0 Registry Value Feature Descriptor */
    0x3A, 0x00,             // wLength 0x3A (58) in bytes of this descriptor
    0x04, 0x00,             // wDescriptorType – MSOS20_FEATURE_REG_PROPERTY
    0x04, 0x00,             // wPropertyDataType - REG_DWORD
    0x2C, 0x00,             // wPropertyNameLength – 0x2C (44) bytes
    'S', 0x00, 'k', 0x00,
    'i', 0x00, 'p', 0x00,
    'C', 0x00, 'a', 0x00,
    'm', 0x00, 'e', 0x00,
    'r', 0x00, 'a', 0x00,
    'E', 0x00, 'n', 0x00,
    'u', 0x00, 'm', 0x00,
    'e', 0x00, 'r', 0x00,
    'a', 0x00, 't', 0x00,
    'i', 0x00, 'o', 0x00,
    'n', 0x00, 0x00, 0x00,
    0x04, 0x00,             // wPropertyDataLength – 4 bytes
    0x01, 0x00, 0x00, 0x00  // This exposes the camera to applications looking for IR only cameras
};