共用方式為


USB 視訊類別(UVC)攝影機的實作指南

從 Windows 10 開始,會為符合 USB 視訊類別規格 (1.0 至 1.5 版) 的裝置提供收件匣 USB 視訊類別 (UVC) 驅動程式。 此驅動程式支援色彩和感應器類型的相機。 本檔概述如何透過收件匣驅動程式將符合 UVC 規範的相機的特定功能公開給應用程式。

術語

關鍵詞 說明
紫外線 USB 視訊類別
UVC 驅動器 作業系統隨附的 USBVideo.sys 驅動程式
IR 紅外線
彩色相機 輸出色彩串流的相機 (例如 RGB 或 YUV 相機)
感應相機 輸出非彩色資料流的攝影機(例如,紅外線或深度攝影機)
BOS 二進位裝置物件存放區
MS OS 2.0 描述符 Microsoft 平台特定 BOS 裝置功能描述元

感應式相機

Windows 支援兩類相機。 一種是彩色相機,另一種是非彩色傳感器相機。 RGB 或 YUV 相機分為彩色相機,灰階、紅外和深度相機等非彩色相機被歸類為感測器相機。 UVC 驅動程式支援這兩種類型的相機。 建議相機韌體指定值,UVC 驅動程式會根據該值在一或兩個支援的類別下註冊相機。

僅支援彩色格式類型的相機應在KSCATEGORY_VIDEO_CAMERA下註冊。 支援紅外線或僅深度格式類型的相機應在KSCATEGORY_SENSOR_CAMERA下註冊。 同時支援彩色和非彩色格式類型的相機應在KSCATEGORY_VIDEO_CAMERA和KSCATEGORY_SENSOR_CAMERA下註冊。 這種分類有助於應用程序選擇他們想要使用的相機。

UVC 相機可以透過屬性 SensorCameraModeSkipCameraEnumeration 來指定其類別喜好設定,其屬性會在下列各節 中詳細說明

屬性 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 的值,如下所示:

自訂 INF 檔案(以內建 UVC 驅動程式為基礎)必須包含下列 AddReg 項目:

SensorCameraMode:REG_DWORD:1 (註冊為感應器相機)

SkipCameraEnumeration:REG_DWORD:1(使其僅適用於紅外應用)

自定義 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 數據流

Windows 收件匣 USB 視訊類別 (UVC) 驅動程式支援以 YUV 格式擷取場景的相機,並透過 USB 傳輸圖元資料作為未壓縮的 YUV 或壓縮的 MJPEG 畫面。

下列格式類型的 GUID,應在串流視訊格式描述符中指定,如同 WDK ksmedia.h 標頭檔中所定義。

類型 說明
KSDATAFORMAT_SUBTYPE_L8_IR 未壓縮的 8 位元亮度平面。 此類型對應至 MFVideoFormat_L8
KSDATAFORMAT_SUBTYPE_L16_IR 未壓縮的 16 位元亮度平面。 此類型對應至 MFVideoFormat_L16
KSDATAFORMAT_SUBTYPE_MJPG_IR 壓縮的 MJPEG 幀。 Media Foundation 會將其轉換為 NV12 未壓縮的影格,並僅使用亮度平面。

當這些格式類型 GUID 在框架描述子的 guidFormat 欄位中指定時,媒體基礎擷取管線會將數據流標示為紅外線(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 畫面。 下列格式類型 GUID 應該在媒體串流視訊格式描述中指定,該描述元已定義於 WDK 的 ksmedia.h 標頭檔:

類型 說明
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 支援根據其容器識別碼將相機分組,以協助應用程式使用相關相機。 例如,位於相同實體裝置上的 IR 相機和彩色相機可以公開給 OS 作為相關相機。 這使得 Windows Hello 等應用程式在其案例中使用相關的相機。

相機功能之間的關係可以在韌體中相機的 BOS 描述符中指定。 UVC 驅動程式會利用這項資訊,並將這些相機功能顯示為相關功能。 這可讓作業系統相機堆疊將它們公開為相關的相機群組給應用程式。

相機韌體必須指定 UVC-FSSensorGroupID,這是字串形式的 GUID,並帶有大括弧。 具有相同 UVC-FSSensorGroupID 的相機將被分組在一起。

您可以在韌體中指定 UVC-FSSensorGroupName (Unicode 字串) 來為感應器群組命名。

請參閱下面的複合裝置範例一節,以取得指定 UVC-FSSensorGroupIDUVC-FSSensorGroupName 的說明性範例 BOS。

如果您無法如上所述更新裝置韌體,您可以使用自訂 INF,並指定感應器群組識別碼和名稱,以指定相機是感應器群組的一部分,如下所示。 自訂 INF 檔案(以收件匣 UVC 驅動程式為基礎)必須包含下列 AddReg 項目:

FSSensorGroupID: REG_SZ: “{您的感應器群組識別碼 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 靜態捕獲方法。

自訂 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 是 IHD 和 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。

  • 在未使用 Frame Server 的 64 位系統上,必須註冊 32 位和 64 位 DMFT。 鑑於 USB 相機可能會插入任意系統,針對「外部」(或非收件匣) USB 相機,USB 相機廠商應該同時提供 32 位和 64 位 DMFT。

設定 DMFT 鏈結

相機裝置可以選擇性地使用使用收件匣 USBVideo.INF 區段的自定義 INF 檔案,在 DLL 中提供 DMFT COM 物件。

在自定義 .INF 檔案的「介面 AddReg」區段中,通過新增下列登錄專案來指定 DMFT CLSIDs:

CameraDeviceMftCLSIDChain (REG_MULTI_SZ) %Dmft0.CLSID%,%Dmft。CLSID%、%Dmft2.CLSID%

如下列範例 INF 設定所示(以您用於 DMFT 的實際 CLSID 字串取代 %Dmft0.CLSID% 和 % Dmft1.CLSID%),Windows 10 版本 1703 中最多允許 2 個 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 和 DMFT 的 USB 相機結果登錄機碼結果的螢幕擷取畫面 (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,則鏈結會像這樣:(如果是 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 會針對 UVC 相機提供內建的設備 MFT,稱為平台 DMFT(PDMFT),並可選擇啟用。 此 DMFT 可讓 IHV 和 OEM 利用 Windows 提供的後置處理演算法。

Platform DMFT 支援的功能 Windows 版本
啟用基於臉部的興趣區域 (ROI),以便在具有 ROI 功能的 USB 攝影機中進行 3A 調整。 Windows 10 版本 1703

備註

如果相機不支援 UVC 1.5 型 ROI,則即使裝置選擇使用 PDMFT,PDMFT 也不會載入。

UVC 相機可以透過 BOS 描述符指定 EnablePlatformDmft,從而選擇使用平台 DMFT。

要指定以啟用平臺 DMFT 的值是名稱 UVC-EnablePlatformDmft 的 DWORD,並使用 BOS 描述元指定其值。 下列 複合裝置範例 區段說明如何使用範例 BOS 描述子來啟用 Platform 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 視訊類別驅動程式,而且任何廠商延伸模組都必須以 Device MFT 的形式實作。

對於許多 OEM/ODM,相機模組的偏好方法是在模組的韌體中實作大部分功能,也就是透過 Microsoft OS 描述元。

以下攝影機支援透過MSOS描述符(也稱為BOS描述符)發佈人臉驗證配置檔案:

  • 僅 RGB 相機,用於感測器組,並配備單獨的紅外線相機。

  • 僅紅外線相機,用於具有單獨 RGB 相機的感測器組。

  • 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 個位元組 (sizeof(DWORD))。
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 會導致發佈下列臉部驗證設定檔:

引腳0:(RES==1280,720;FRT==30,1;SUT==MJPG) // 第二媒體類型 (0x0001)
引腳1:(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 相機,高階 16 位必須設定為 0xFFFF,低階 16 位表示要使用的紅外媒體類型。

例如,對於具有以下媒體格式的 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 橋接器實作指引中所述。

不過,如果裝置廠商必須支援舊版 Windows 和/或需要在框架伺服器內啟用 MJPEG 解壓縮,則必須新增 EnableDshowRedirection 登錄專案。

感測器群組生成

當 OEM 使用類型 1 和類型 2 相機建置系統,以提供 Windows Hello 支援的 RGB 和 IR 資料流程時,OEM 必須將這兩個相機宣告為合成感應器群組的一部分。

這是藉由在每個相機的裝置介面屬性下建立的延伸模組 INF 中宣告 FSSensorGroupId 和 FSSensorGroupName 標籤來完成。

不過,如果未提供延伸模組 INF,ODM 可能會使用相同的 MSOS 描述元來發佈 FSSensorGroupId 和 FSSensorGroupName 值。 內建的 Windows 10 USB 視訊類別驅動程式將自動採用任何承載名稱以「UVC-」作為前置詞的 MSOS 描述元,並將標籤移轉至設備介面屬性存放區(移除「UVC-」前置詞)。

因此,發佈下列內容的類型 1 和類型 2 相機將允許作業系統將相機合成為多裝置感測器群組,以搭配 Windows Hello 使用:

UVC-FSSensorGroupId
UVC-FSSensorGroupName

每個標籤的承載必須是 Unicode 字串。 UVC-FSSensorGroupId 負載必須是下列格式的 GUID 字串:

{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}

類型 1 和類型 2 相機之間的 GUID 值必須相同,而且這兩個相機都必須新增至相同的實體機箱。 對於內置攝像頭,物理機箱就是計算機本身。 對於外部攝影機,Type 1 和 Type 2 攝影機模組必須內建於連接到電腦的相同實體裝置中。

感測器群組的自訂裝置介面類別

從 19H1 開始,Windows 會提供 IHV/OEM 指定的延伸模組機制,以允許將合成的感應器群組發佈至任何自定義或預先定義的類別。 感測器群組的生成由 IHV/OEM 在自定義 INF 中提供感測器群組 ID 金鑰來定義:

FSSensorGroupId:{自訂 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描述符上的文檔,瞭解如何指定將裝置配置傳送到作業系統的有效BOS描述符。

Microsoft OS 2.0 描述元集標頭

Offset 領域 大小 (位元組) 說明
0 wLength 2 此標頭的長度(以位元組為單位)必須為 10。
2 wDescriptorType 2 MSOS20_SET_HEADER_DESCRIPTOR
4 dwWindows版本 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 屬性名稱 變數 登錄屬性的名稱。
8+米 wPropertyData長度 2 屬性資料的長度。
10+米 PropertyData 變數 屬性數據

在韌體中指定有效的 MS OS 2.0 描述元時,USB 堆疊會將組態值複製到裝置硬體登錄機碼中,如下所示:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\<Device ID>\<Instance ID>\Device Parameters

UVC 驅動程式會從裝置硬體登錄機碼讀取組態值,並據以在 OS 上設定裝置。 例如,如果韌體指定要使用組態值註冊為感應器相機的裝置,則 UVC 驅動程式會在該類別下註冊裝置。

透過平臺 BOS 描述元設定 UVC 裝置是在 Windows 10 版本 1703 中啟用的機制,可協助 UVC 裝置廠商設定裝置,而不需要 Windows OS 上的 INF 檔案。

仍支援透過自訂 INF 設定 UVC 裝置,而且優先於 BOS 描述元型機制。 透過 INF 指定裝置屬性時,您不需要新增前置詞 「UVC-」。 只有由 BOS 描述子指定且針對每個介面實例的特定裝置屬性才需要此字首。 如果您的裝置需要 DMFT 等使用者模式外掛程式,則您必須提供 INF 來安裝 DMFT。 無法使用韌體進行設定。

目前透過 BOS 描述子支援的配置值

組態名稱 類型 說明
感測器相機模式 REG_DWORD 在特定類別下註冊相機。
UVC-FSSensorGroupID,UVC-FSSensorGroupName REG_SZ 將具有相同 UVC-FSSensorGroupID 的攝影機分組
UVC-EnableDependentStillPinCapture REG_DWORD 啟用靜態擷取方法 2/3
UVC-EnablePlatformDmft REG_DWORD 啟用 Platform 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 紅外相機。

範例描述元如下:

  1. 在KSCATEGORY_VIDEO_CAMERA下註冊彩色相機功能

  2. 在KSCATEGORY_SENSOR_CAMERA下註冊紅外線攝影機功能

  3. 啟用彩色相機功能靜態影像擷取

  4. 將彩色和紅外線相機功能作為一個組關聯

在裝置列舉時,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 B請求 wValue 溫德克斯 wLength 資料
1100 0000B bMS_VendorCode 0x00 0x07 長度 傳回的 MS OS 2.0 描述元集 blob

bm請求類型

  • 資料傳輸方向 – 裝置到主機

  • 類型 – 供應商

  • 收件者 - 裝置

b請求

描述元集合資訊結構中傳回的 bMS_VendorCode 值。

w值

設定為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. 感應器群組識別碼的登錄值功能描述元

  5. 感應器群組名稱的登錄值功能描述元

  6. 用於啟用靜止影像擷取的登錄值功能描述元

  7. 用於啟用 Platform DMFT 的登錄值功能描述元

  8. 紅外線攝像機功能子集標題

  9. 感應器群組識別碼的登錄值功能描述元

  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
};