USB 视频类 (UVC) 相机实现指南

从 Windows 10 开始,为符合 USB 视频类规范 (版本 1.0 到 1.5) 的设备提供内置 USB 视频类 (UVC) 驱动程序。 此驱动程序支持彩色和传感器类型的相机。 本文档概述了如何通过收件箱驱动程序向应用程序公开符合 UVC 的相机的某些功能。

术语

关键字 说明
UVC USB 视频类
UVC 驱动程序 操作系统随附的 USBVideo.sys 驱动程序
IR 红外线
彩色相机 输出颜色流的相机 (例如 RGB 或 YUV 相机)
传感器相机 输出非颜色流的相机 (例如 IR 或深度相机)
BOS 二进制设备对象存储
MS OS 2.0 描述符 Microsoft 平台特定的 BOS 设备功能描述符

传感器相机

Windows 支持两类相机。 一个是彩色相机,另一个是非彩色传感器相机。 RGB 或 YUV 相机分类为彩色相机,非彩色相机(如灰度、IR 和深度相机)归类为传感器相机。 UVC 驱动程序支持这两种类型的相机。 我们建议相机固件指定一个值,根据该值,UVC 驱动程序将在一个或两个支持的类别下注册相机。

支持纯颜色格式类型的相机应在KSCATEGORY_VIDEO_CAMERA下注册。 支持 IR 或仅深度格式类型的相机应在 KSCATEGORY_SENSOR_CAMERA 下注册。 支持颜色和非颜色格式类型的相机应在KSCATEGORY_VIDEO_CAMERA和KSCATEGORY_SENSOR_CAMERA下注册。 此分类可帮助应用程序选择要使用的相机。

UVC 相机可以通过属性 SensorCameraModeSkipCameraEnumeration 在其 BOS MS OS 2.0 描述符 中指定其类别首选项,详见以下部分。

属性 SensorCameraMode 采用值 1 或 2。

值为 1 将在 KSCATEGORY_SENSOR_CAMERA 下注册设备。 除此之外,请将 SkipCameraEnumeration 的值指定为 1,以使相机可供仅查找传感器相机的应用程序使用。 仅公开传感器相机媒体类型的相机应使用此值。

对于 SensorCameraMode,值为 2 将在 KSCATEGORY_SENSOR_CAMERA & KSCATEGORY_VIDEO_CAMERA 下注册设备。 这使得相机可用于查找传感器和彩色相机的应用程序。 同时公开传感器相机和彩色相机媒体类型的相机应使用此值。

建议使用 BOS 描述符指定上述注册表值。 有关具有特定于平台的 MS OS 2.0 描述符的示例 BOS 描述符,请参阅下面的示例 复合设备 部分。

如果无法按上述方式更新设备固件,则可以使用自定义 INF,并通过指定 SensorCameraModeSkipCameraEnumeration 的值来指定相机需要注册为传感器相机,如下所示:

基于收件箱 UVC 驱动程序) 的自定义 INF 文件 (必须包含以下 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 中指定 SensorCameraModeSkipCameraEnumeration 属性,则相机将注册为彩色相机,并且仅对彩色相机感知应用程序可见。

IR 流

(UVC) 驱动程序的 Windows 收件箱 USB 视频类支持以 YUV 格式捕获场景并通过 USB 以未压缩的 YUV 或压缩 MJPEG 帧的形式传输像素数据的相机。

应按照 WDK ksmedia.h 头文件中的定义,在流视频格式描述符中指定以下格式类型 GUID:

类型 说明
KSDATAFORMAT_SUBTYPE_L8_IR 未压缩的 8 位 luma 平面。 此类型映射到 MFVideoFormat_L8
KSDATAFORMAT_SUBTYPE_L16_IR 未压缩的 16 位 luma 平面。 此类型映射到 MFVideoFormat_L16
KSDATAFORMAT_SUBTYPE_MJPG_IR 压缩的 MJPEG 帧。 Media Foundation 将其转换为 NV12 未压缩的帧,并且仅使用 luma 平面。

在帧描述符的 guidFormat 字段中指定这些格式类型 GUID 时,媒体基础捕获管道会将流标记为 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:

类型 说明
KSDATAFORMAT_SUBTYPE_D16 16 位深度映射值。 此类型与 MFVideoFormat_D16相同。 这些值以毫米为单位。

在帧描述符的 guidFormat 成员中指定格式类型 GUID 时,媒体基础捕获管道会将流标记为深度流。 使用 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 驱动程序将利用此信息,并将这些相机功能公开为相关功能。 这使得 OS 相机堆栈将它们作为一组相关的相机公开给应用程序。

相机固件必须指定 UVC-FSSensorGroupID,它是带花括号的字符串形式的 GUID。 具有相同 UVC-FSSensorGroupID 的相机将组合在一起。

可以通过在固件中指定 UVC-FSSensorGroupName(Unicode 字符串)来为传感器组指定名称。

有关指定 UVC-FSSensorGroupID 和 UVC-FSSensorGroupName 的说明性示例 BOS,请参阅下面的示例复合设备部分。

如果无法如上所述更新设备固件,可以使用自定义 INF,并通过指定传感器组 ID 和名称来指定相机属于传感器组,如下所示。 基于收件箱 UVC 驱动程序的自定义 INF 文件 () 必须包含以下 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%

注意

DShow 捕获管道不支持传感器组。

方法 2 或方法 3 仍捕获支持

UVC 规范提供了一种机制来指定视频流接口是否支持方法 1/2/3 类型的静止图像捕获。 若要使 OS 利用设备的 2/3 方法静态图像捕获支持,通过 UVC 驱动程序,设备固件可以在 BOS 描述符中指定值。

要指定以启用方法 2/3 静止图像捕获的值是名为 UVC-EnableDependentStillPinCapture 的 DWORD。 使用 BOS 描述符指定其值。 下面的示例 复合设备 演示如何使用示例 BOS 描述符启用静态图像捕获。

如果无法按上述方式更新设备固件,则可以使用自定义 INF 来指定相机支持方法 2 或方法 3 仍捕获方法。

基于自定义 UVC 驱动程序或收件箱 UVC 驱动程序) 的自定义 INF 文件 (必须包含以下 AddReg 条目:

EnableDependentStillPinCapture: REG_DWORD: 0x0 (Disabled) to 0x1 (Enabled)

如果此项设置为 Enabled (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 的可选 DMFT 链。

从 Windows 11 版本 22H2 开始,Windows 相机管道支持具有最多四个 DMFT 的可选 DMFT 链。

这为 OEM 和 IHV 提供了更大的灵活性,以后处理相机流的形式提供增值。 例如,设备可以使用 PDMFT 以及 IHV DMFT 和 OEM DMFT。

下图演示了涉及 DMFT 链的体系结构。

DMFT 链。

捕获样本从相机驱动程序流到 DevProxy,然后通过 DMFT 链。 链中的每个 DMFT 都有机会处理示例。 如果 DMFT 不想处理示例,它可以充当传递,只需将示例传递到下一个 DMFT 即可。

对于 KsProperty 等控件,调用上游 – 链中的最后一个 DMFT 先获取调用,该调用可以在那里处理,也可以传递到链中的上一个 DMFT。

错误从 DMFT 传播到 DTM,然后传播到应用程序。 对于 IHV/OEM DMFT,如果任何 DMFT 无法实例化,这将是 DTM 的致命错误。

DMFT 的要求:

  • 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 链

相机设备可以选择使用使用内置 USBVideo.INF 部分的自定义 INF 文件在 DLL 中提供 DMFT COM 对象。

在自定义 中。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 个 CLSID,第一个 CLSID 最接近 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 的 USB 相机和 DMFT (的结果注册表项的屏幕截图,其中 GUID 为 {D671BE6C-FDB8-424F-81D7-03F5B1CE2CC7}) 。

注册表编辑器 DMFT 链。

  • IHV/OEM DMFT0 <-> IHV/OEM DMFT1

    • CameraDeviceMftCLSIDChain = %Dmft0.CLSID%,%Dmft1.CLSID%,

注意

CameraDeviceMftCLSIDChain 最多可以有 2 个 CLSID。

如果配置 CameraDeviceMftCLSIDChain,DTM 将跳过旧版 CameraDeviceMftCLSID 设置。

如果未配置 CameraDeviceMftCLSIDChain,并且配置了旧版 CameraDeviceMftCLSID, 如果) DevProxy <>><- 平台 DMFT – OEM/IHV DMFT) 启用其 USB 摄像头并受平台 DMFT 和平台 DMFT 支持,则链看起来类似于 ( (,或者如果平台 DMFT 不支持相机或平台 DMFT) DevProxy <-> OEM/IHV DMFT 禁用了平台 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 的 UVC 相机提供内置设备 MFT (PDMFT) 。 此 DMFT 允许 IHV 和 OEM 利用 Windows 提供的后处理算法。

平台 DMFT 支持的功能 Windows 版本
启用基于人脸的兴趣区域 (ROI) ,以便在支持 ROI 的 USB 摄像头中进行 3A 调整。 Windows 10 版本 1703

注意

如果相机不支持基于 UVC 1.5 的 ROI,则即使设备选择使用 PDMFT,PDMFT 也不会加载。

UVC 相机可以通过 BOS 描述符指定 EnablePlatformDmft 来选择使用平台 DMFT。

要指定以启用 Platform DMFT 的值是名为 UVC-EnablePlatformDmft 的 DWORD,并使用 BOS 描述符指定其值。 下面的示例 复合设备 部分演示如何使用示例 BOS 描述符启用平台 DMFT。

如果无法如上所述更新设备固件,可以使用自定义 INF 文件为设备启用平台 DMFT。

基于自定义 UVC 驱动程序或收件箱 UVC 驱动程序) 的自定义 INF 文件 (必须包含以下 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 相机。

  • 在具有单独 RGB 相机的传感器组中使用的仅限 IR 相机。

  • RGB+IR 摄像头,具有单独的 IR 和 RGB 引脚。

注意

如果相机固件不能满足上面详述的三个要求之一,ODM/OEM 必须使用扩展 INF 来声明相机配置文件 V2。

示例 Microsoft OS 描述符布局

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

  • Microsoft OS 扩展描述符规范 1.0

  • Microsoft OS 2.0 描述符规范

Microsoft OS 扩展描述符 1.0 规范

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

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

Microsoft OS 1.0 描述符标头部分

标头部分描述 (人脸身份验证配置文件) 的单个自定义属性。

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

Microsoft OS 1.0 描述符自定义属性部分

Offset 字段 大小(字节) 说明
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 属性数据的 4 个字节 (size 为 (DWORD) ) 。
50 bPropertyData 4 请参阅下面的数据架构 请参阅下面的数据架构。
有效负载架构

UVC-CPV2FaceAuth 数据有效负载是 32 位无符号整数。 高阶 16 位表示 RGB 引脚公开的媒体类型列表的从 0 开始的索引。 低序 16 位表示 IR 引脚公开的媒体类型列表的从 0 开始的索引。

例如,按从 RGB 引脚声明的顺序公开以下媒体类型的类型 3 相机:

  • 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 发布 CPV2FaceAuth,1280x720@30fps媒体类型,必须将有效负载设置为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 注册表项,如 UVC 设备的 DShow Bridge 实现指南中所述。

但是,如果设备供应商必须支持较旧版本的 Windows 和/或需要在帧服务器中启用 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}

类型 1 和 Type 2 相机之间的 GUID 值必须相同,并且两个相机必须添加到同一物理机箱中。 对于内置相机,物理机箱是计算机本身。 对于外部相机,类型 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 标准的相机可以使用 Microsoft OS 2.0 描述符在其固件中的平台功能 BOS 描述符中指定 Windows 特定的设备配置值。 请参阅 MS OS 2.0 描述符上的文档,了解如何指定将设备配置传达给 OS 的有效 BOS 描述符。

Microsoft OS 2.0 描述符集标头

Offset 字段 大小(字节) 说明
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 字段 大小(字节) 说明
0 wLength 2 此描述符的长度(以字节为单位)
2 wDescriptorType 2 MS_OS_20_FEATURE_REG_PROPERTY
4 wPropertyDataType 2 0x04 (REG_DWORD_LITTLE_ENDIAN)
6 wPropertyNameLength 2 属性名称的长度。
8 PropertyName 变量 注册表属性的名称。
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 等用户模式插件,则需要提供用于安装 DMFT 的 INF。 无法使用固件对其进行配置。

当前支持通过 BOS 描述符的配置值

配置名称 类型 说明
SensorCameraMode 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 描述符,设备描述符必须指定要0x0210或更高版本的 bcdUSB 版本。

示例复合设备

本部分为具有两个相机功能的示例复合设备提供 BOS 描述符和 MS OS 2.0 描述符。 一个函数是 UVC 彩色相机,第二个函数是 UVC IR 相机。

示例描述符如下所示:

  1. 在 KSCATEGORY_VIDEO_CAMERA 下注册彩色相机功能

  2. 在 KSCATEGORY_SENSOR_CAMERA 下注册 IR 相机功能

  3. 启用彩色相机功能静态图像捕获

  4. 将颜色和 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 平台功能描述符指定:

  1. MS OS 2.0 描述符平台功能 GUID

  2. 供应商控制代码bMS_VendorCode (此处设置为 1。检索 MS OS 2.0 描述符可能需要供应商) 的任何值。

  3. 此 BOS 描述符适用于操作系统版本Windows 10及更高版本。

看到 BOS 描述符后,USB 堆栈将发出特定于供应商的控制请求,以检索 MS OS 2.0 描述符。

用于检索 MS OS 2.0 供应商特定描述符的控制请求的格式:

bmRequestType BRequest wValue WIndex wLength 数据
1100 0000B bMS_VendorCode 0x00 0x07 Length 返回的 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 描述符值:

  1. 设置标头

  2. 配置子集标头

  3. 彩色相机函数子集标头

  4. 传感器组 ID 的注册表值功能描述符

  5. 传感器组名称的注册表值功能描述符

  6. 用于启用静态映像捕获的注册表值功能描述符

  7. 用于启用平台 DMFT 的注册表值功能描述符

  8. IR 相机函数子集标头

  9. 传感器组 ID 的注册表值功能描述符

  10. 传感器组名称的注册表值功能描述符

  11. 用于将相机注册为传感器相机的注册表值功能描述符

固件将具有供应商请求的处理程序,该处理程序将返回本部分开头所述的虚构设备的以下 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
};